Working on stuff
This commit is contained in:
parent
14b43239b5
commit
7287f4b619
@ -16,8 +16,8 @@ namespace ZL {
|
|||||||
|
|
||||||
VertexID generateEdgeID(const VertexID& id1, const VertexID& id2);
|
VertexID generateEdgeID(const VertexID& id1, const VertexID& id2);
|
||||||
|
|
||||||
//constexpr static int MAX_LOD_LEVELS = 6;
|
constexpr static int MAX_LOD_LEVELS = 6;
|
||||||
constexpr static int MAX_LOD_LEVELS = 1;
|
//constexpr static int MAX_LOD_LEVELS = 3;
|
||||||
|
|
||||||
struct Triangle
|
struct Triangle
|
||||||
{
|
{
|
||||||
|
|||||||
@ -77,7 +77,7 @@ namespace ZL {
|
|||||||
planetRenderStruct.data.PositionData[0+1] = planetRenderStruct.data.PositionData[6 * 3+1];
|
planetRenderStruct.data.PositionData[0+1] = planetRenderStruct.data.PositionData[6 * 3+1];
|
||||||
planetRenderStruct.data.PositionData[0+2] = planetRenderStruct.data.PositionData[6 * 3+2];
|
planetRenderStruct.data.PositionData[0+2] = planetRenderStruct.data.PositionData[6 * 3+2];
|
||||||
*/
|
*/
|
||||||
planetRenderStruct.data.PositionData.resize(3);
|
//planetRenderStruct.data.PositionData.resize(3);
|
||||||
/*planetRenderStruct.data.NormalData[0] = Vector3f{1.0,1.0,1.0}.normalized();
|
/*planetRenderStruct.data.NormalData[0] = Vector3f{1.0,1.0,1.0}.normalized();
|
||||||
planetRenderStruct.data.NormalData[1] = Vector3f{ 1.0,1.0,1.0 }.normalized();
|
planetRenderStruct.data.NormalData[1] = Vector3f{ 1.0,1.0,1.0 }.normalized();
|
||||||
planetRenderStruct.data.NormalData[2] = Vector3f{ 1.0,1.0,1.0 }.normalized();*/
|
planetRenderStruct.data.NormalData[2] = Vector3f{ 1.0,1.0,1.0 }.normalized();*/
|
||||||
@ -155,7 +155,10 @@ namespace ZL {
|
|||||||
planetRenderYellowStruct.data.TexCoordData.push_back(fullMesh.TexCoordData[i * 3 + j]);
|
planetRenderYellowStruct.data.TexCoordData.push_back(fullMesh.TexCoordData[i * 3 + j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
planetRenderYellowStruct.RefreshVBO();
|
if (planetRenderYellowStruct.data.PositionData.size() > 0)
|
||||||
|
{
|
||||||
|
planetRenderYellowStruct.RefreshVBO();
|
||||||
|
}
|
||||||
|
|
||||||
// --- ОБНОВЛЯЕМ КАМНИ (через новую структуру StoneGroup) ---
|
// --- ОБНОВЛЯЕМ КАМНИ (через новую структуру StoneGroup) ---
|
||||||
if (triangleIndicesToDraw.size() > 0)
|
if (triangleIndicesToDraw.size() > 0)
|
||||||
@ -173,7 +176,7 @@ namespace ZL {
|
|||||||
|
|
||||||
void PlanetObject::bakeStoneTexture(Renderer& renderer) {
|
void PlanetObject::bakeStoneTexture(Renderer& renderer) {
|
||||||
glViewport(0, 0, 512, 512);
|
glViewport(0, 0, 512, 512);
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(224 / 255.f, 201 / 255.f, 167 / 255.f, 1.0f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
|
||||||
@ -213,6 +216,7 @@ namespace ZL {
|
|||||||
float minY = min(rA.v[1], min(rB.v[1], rC.v[1]));
|
float minY = min(rA.v[1], min(rB.v[1], rC.v[1]));
|
||||||
float maxY = max(rA.v[1], max(rB.v[1], rC.v[1]));
|
float maxY = max(rA.v[1], max(rB.v[1], rC.v[1]));
|
||||||
|
|
||||||
|
|
||||||
// Находим центр и размеры
|
// Находим центр и размеры
|
||||||
float width = maxX - minX;
|
float width = maxX - minX;
|
||||||
float height = maxY - minY;
|
float height = maxY - minY;
|
||||||
@ -238,15 +242,15 @@ namespace ZL {
|
|||||||
// Применяем вращение
|
// Применяем вращение
|
||||||
renderer.RotateMatrix(mr);
|
renderer.RotateMatrix(mr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Извлекаем нормаль треугольника (это 3-й столбец нашей матрицы вращения)
|
// Извлекаем нормаль треугольника (это 3-й столбец нашей матрицы вращения)
|
||||||
Vector3f planeNormal = { mr.m[2], mr.m[5], mr.m[8] };
|
Vector3f planeNormal = { mr.m[2], mr.m[5], mr.m[8] };
|
||||||
//Vector3f planeNormal = { 0,0,1 };
|
//Vector3f planeNormal = { 0,0,1 };
|
||||||
|
|
||||||
|
|
||||||
renderer.RenderUniform3fv("uPlanePoint", &tr.data[0].v[0]);
|
renderer.RenderUniform3fv("uPlanePoint", &tr.data[0].v[0]);
|
||||||
renderer.RenderUniform3fv("uPlaneNormal", &planeNormal.v[0]);
|
renderer.RenderUniform3fv("uPlaneNormal", &planeNormal.v[0]);
|
||||||
renderer.RenderUniform1f("uMaxHeight", 8000.f); // Соответствует BASE_SCALE + perturbation
|
renderer.RenderUniform1f("uMaxHeight", StoneParams::BASE_SCALE * 1.1f); // Соответствует BASE_SCALE + perturbation
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -301,7 +305,7 @@ namespace ZL {
|
|||||||
|
|
||||||
drawPlanet(renderer);
|
drawPlanet(renderer);
|
||||||
//drawYellowZone(renderer);
|
//drawYellowZone(renderer);
|
||||||
//drawStones(renderer);
|
drawStones(renderer);
|
||||||
|
|
||||||
//drawAtmosphere(renderer);
|
//drawAtmosphere(renderer);
|
||||||
}
|
}
|
||||||
@ -380,9 +384,9 @@ namespace ZL {
|
|||||||
renderer.RenderUniformMatrix3fv("uTangentMatrix", false, &mr.m[0]);
|
renderer.RenderUniformMatrix3fv("uTangentMatrix", false, &mr.m[0]);
|
||||||
|
|
||||||
// Не забудьте масштаб эффекта (глубина камней)
|
// Не забудьте масштаб эффекта (глубина камней)
|
||||||
//renderer.RenderUniform1f("uHeightScale", 0.08f);
|
renderer.RenderUniform1f("uHeightScale", 0.03f);
|
||||||
//renderer.RenderUniform1f("uHeightScale", -0.01f);
|
//renderer.RenderUniform1f("uHeightScale", -0.01f);
|
||||||
renderer.RenderUniform1f("uHeightScale", 0.0f + x / 1000.f);
|
//renderer.RenderUniform1f("uHeightScale", 0.0f + x / 1000.f);
|
||||||
//renderer.RenderUniform1f("uHeightScale", 0.0f);
|
//renderer.RenderUniform1f("uHeightScale", 0.0f);
|
||||||
glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID());
|
glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID());
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,20 @@
|
|||||||
|
|
||||||
namespace ZL {
|
namespace ZL {
|
||||||
|
|
||||||
|
|
||||||
|
// --- ÊÎÍÑÒÀÍÒÛ ÏÀÐÀÌÅÒÐÎÂ (êàê âû ïðîñèëè) ---
|
||||||
|
const float StoneParams::BASE_SCALE = 17.0f; // Îáùèé ðàçìåð êàìíÿ
|
||||||
|
//const float StoneParams::BASE_SCALE = 5000.0f; // Îáùèé ðàçìåð êàìíÿ
|
||||||
|
//const float StoneParams::MIN_AXIS_SCALE = 1.0f; // Ìèíèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
//const float StoneParams::MAX_AXIS_SCALE = 1.0f; // Ìàêñèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
//const float StoneParams::MIN_PERTURBATION = 0.0f; // Ìèíèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
//const float StoneParams::MAX_PERTURBATION = 0.0f; // Ìàêñèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
const float StoneParams::MIN_AXIS_SCALE = 0.5f; // Ìèíèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
const float StoneParams::MAX_AXIS_SCALE = 1.5f; // Ìàêñèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
const float StoneParams::MIN_PERTURBATION = 0.05f; // Ìèíèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
const float StoneParams::MAX_PERTURBATION = 0.25f; // Ìàêñèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
const int StoneParams::STONES_PER_TRIANGLE = 100;
|
||||||
|
|
||||||
// Âñïîìîãàòåëüíàÿ ôóíêöèÿ äëÿ ïîëó÷åíèÿ ñëó÷àéíîãî ÷èñëà â äèàïàçîíå [min, max]
|
// Âñïîìîãàòåëüíàÿ ôóíêöèÿ äëÿ ïîëó÷åíèÿ ñëó÷àéíîãî ÷èñëà â äèàïàçîíå [min, max]
|
||||||
float getRandomFloat(std::mt19937& gen, float min, float max) {
|
float getRandomFloat(std::mt19937& gen, float min, float max) {
|
||||||
std::uniform_real_distribution<> distrib(min, max);
|
std::uniform_real_distribution<> distrib(min, max);
|
||||||
@ -44,18 +58,6 @@ namespace ZL {
|
|||||||
|
|
||||||
VertexDataStruct CreateBaseConvexPolyhedron(uint64_t seed) {
|
VertexDataStruct CreateBaseConvexPolyhedron(uint64_t seed) {
|
||||||
|
|
||||||
// --- ÊÎÍÑÒÀÍÒÛ ÏÀÐÀÌÅÒÐÎÂ (êàê âû ïðîñèëè) ---
|
|
||||||
//const float BASE_SCALE = 15.0f; // Îáùèé ðàçìåð êàìíÿ
|
|
||||||
const float BASE_SCALE = 5000.0f; // Îáùèé ðàçìåð êàìíÿ
|
|
||||||
const float MIN_AXIS_SCALE = 1.0f; // Ìèíèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
|
||||||
const float MAX_AXIS_SCALE = 1.0f; // Ìàêñèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
|
||||||
const float MIN_PERTURBATION = 0.0f; // Ìèíèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
|
||||||
const float MAX_PERTURBATION = 0.0f; // Ìàêñèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
|
||||||
/*const float MIN_AXIS_SCALE = 0.5f; // Ìèíèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
|
||||||
const float MAX_AXIS_SCALE = 1.5f; // Ìàêñèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
|
||||||
const float MIN_PERTURBATION = 0.05f; // Ìèíèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
|
||||||
const float MAX_PERTURBATION = 0.25f; // Ìàêñèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
|
||||||
*/
|
|
||||||
// const size_t SUBDIVISION_LEVEL = 1; // Óðîâåíü ïîäðàçäåëåíèÿ (äëÿ áîëåå êðóãëîãî êàìíÿ, ïîêà îïóñòèì)
|
// const size_t SUBDIVISION_LEVEL = 1; // Óðîâåíü ïîäðàçäåëåíèÿ (äëÿ áîëåå êðóãëîãî êàìíÿ, ïîêà îïóñòèì)
|
||||||
|
|
||||||
std::mt19937 engine(static_cast<unsigned int>(seed));
|
std::mt19937 engine(static_cast<unsigned int>(seed));
|
||||||
@ -84,10 +86,10 @@ namespace ZL {
|
|||||||
|
|
||||||
// 1. Íîðìàëèçàöèÿ è Âîçìóùåíèå (Perturbation)
|
// 1. Íîðìàëèçàöèÿ è Âîçìóùåíèå (Perturbation)
|
||||||
for (Vector3f& v : initialVertices) {
|
for (Vector3f& v : initialVertices) {
|
||||||
v = v.normalized() * BASE_SCALE; // Íîðìàëèçàöèÿ ê ñôåðå ðàäèóñà BASE_SCALE
|
v = v.normalized() * StoneParams::BASE_SCALE; // Íîðìàëèçàöèÿ ê ñôåðå ðàäèóñà BASE_SCALE
|
||||||
|
|
||||||
// Ðàäèàëüíîå âîçìóùåíèå:
|
// Ðàäèàëüíîå âîçìóùåíèå:
|
||||||
float perturbation = getRandomFloat(engine, MIN_PERTURBATION, MAX_PERTURBATION);
|
float perturbation = getRandomFloat(engine, StoneParams::MIN_PERTURBATION, StoneParams::MAX_PERTURBATION);
|
||||||
v = v * (1.0f + perturbation);
|
v = v * (1.0f + perturbation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,9 +97,9 @@ namespace ZL {
|
|||||||
|
|
||||||
// Ñëó÷àéíûå ìàñøòàáû ïî îñÿì
|
// Ñëó÷àéíûå ìàñøòàáû ïî îñÿì
|
||||||
Vector3f scaleFactors = {
|
Vector3f scaleFactors = {
|
||||||
getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE),
|
getRandomFloat(engine, StoneParams::MIN_AXIS_SCALE, StoneParams::MAX_AXIS_SCALE),
|
||||||
getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE),
|
getRandomFloat(engine, StoneParams::MIN_AXIS_SCALE, StoneParams::MAX_AXIS_SCALE),
|
||||||
getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE)
|
getRandomFloat(engine, StoneParams::MIN_AXIS_SCALE, StoneParams::MAX_AXIS_SCALE)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Ïðèìåíÿåì ìàñøòàáèðîâàíèå
|
// Ïðèìåíÿåì ìàñøòàáèðîâàíèå
|
||||||
@ -207,8 +209,7 @@ namespace ZL {
|
|||||||
|
|
||||||
StoneGroup CreateStoneGroupData(uint64_t globalSeed, const LodLevel& planetLodLevel) {
|
StoneGroup CreateStoneGroupData(uint64_t globalSeed, const LodLevel& planetLodLevel) {
|
||||||
StoneGroup group;
|
StoneGroup group;
|
||||||
const int STONES_PER_TRIANGLE = 1;
|
|
||||||
|
|
||||||
// Ðåçåðâèðóåì ìåñòî ïîä âñå òðåóãîëüíèêè òåêóùåãî LOD
|
// Ðåçåðâèðóåì ìåñòî ïîä âñå òðåóãîëüíèêè òåêóùåãî LOD
|
||||||
group.allInstances.resize(planetLodLevel.triangles.size());
|
group.allInstances.resize(planetLodLevel.triangles.size());
|
||||||
|
|
||||||
@ -216,13 +217,13 @@ namespace ZL {
|
|||||||
const Triangle& tri = planetLodLevel.triangles[tIdx];
|
const Triangle& tri = planetLodLevel.triangles[tIdx];
|
||||||
std::mt19937 engine(static_cast<unsigned int>(globalSeed));
|
std::mt19937 engine(static_cast<unsigned int>(globalSeed));
|
||||||
|
|
||||||
for (int i = 0; i < STONES_PER_TRIANGLE; ++i) {
|
for (int i = 0; i < StoneParams::STONES_PER_TRIANGLE; ++i) {
|
||||||
StoneInstance instance;
|
StoneInstance instance;
|
||||||
instance.seed = globalSeed;// + tIdx * 1000 + i; // Óíèêàëüíûé ñèä äëÿ êàæäîãî êàìíÿ
|
instance.seed = globalSeed;// + tIdx * 1000 + i; // Óíèêàëüíûé ñèä äëÿ êàæäîãî êàìíÿ
|
||||||
|
|
||||||
//instance.position = GetRandomPointOnTriangle(tri, engine);
|
instance.position = GetRandomPointOnTriangle(tri, engine);
|
||||||
|
|
||||||
instance.position = Vector3f(5000.0f, 5000.0f, 5000.0f);
|
//instance.position = Vector3f(5000.0f, 5000.0f, 5000.0f);
|
||||||
// Ãåíåðèðóåì ñëó÷àéíûå ïàðàìåòðû îäèí ðàç
|
// Ãåíåðèðóåì ñëó÷àéíûå ïàðàìåòðû îäèí ðàç
|
||||||
instance.scale = {
|
instance.scale = {
|
||||||
getRandomFloat(engine, 0.5f, 1.5f),
|
getRandomFloat(engine, 0.5f, 1.5f),
|
||||||
|
|||||||
@ -5,6 +5,17 @@
|
|||||||
|
|
||||||
namespace ZL {
|
namespace ZL {
|
||||||
|
|
||||||
|
struct StoneParams
|
||||||
|
{
|
||||||
|
static const float BASE_SCALE; // Îáùèé ðàçìåð êàìíÿ
|
||||||
|
static const float MIN_AXIS_SCALE; // Ìèíèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
static const float MAX_AXIS_SCALE; // Ìàêñèìàëüíîå ðàñòÿæåíèå/ñæàòèå ïî îñè
|
||||||
|
static const float MIN_PERTURBATION; // Ìèíèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
static const float MAX_PERTURBATION; // Ìàêñèìàëüíîå ðàäèàëüíîå âîçìóùåíèå âåðøèíû
|
||||||
|
static const int STONES_PER_TRIANGLE;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
struct StoneInstance {
|
struct StoneInstance {
|
||||||
uint64_t seed;
|
uint64_t seed;
|
||||||
Vector3f position;
|
Vector3f position;
|
||||||
|
|||||||
@ -15,7 +15,7 @@ void main()
|
|||||||
float diff = 1.0;
|
float diff = 1.0;
|
||||||
|
|
||||||
// RGB - цвет камня с учетом света, A - нормализованная высота
|
// RGB - цвет камня с учетом света, A - нормализованная высота
|
||||||
//gl_FragColor = vec4(stoneColor.rgb * diff, vHeight);
|
gl_FragColor = vec4(stoneColor.rgb * diff, vHeight);
|
||||||
gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight);
|
//gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight);
|
||||||
//gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
|
//gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
varying vec2 TexCoord;
|
/*varying vec2 TexCoord;
|
||||||
varying vec3 vViewDirTangent;
|
varying vec3 vViewDirTangent;
|
||||||
|
|
||||||
uniform sampler2D Texture; // Нам нужен только Alpha канал (высота)
|
uniform sampler2D Texture; // Нам нужен только Alpha канал (высота)
|
||||||
@ -28,9 +28,9 @@ void main() {
|
|||||||
|
|
||||||
// 3. Подмешиваем карту высот, чтобы видеть "объемы"
|
// 3. Подмешиваем карту высот, чтобы видеть "объемы"
|
||||||
gl_FragColor = vec4(finalColor * height, 1.0);
|
gl_FragColor = vec4(finalColor * height, 1.0);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
varying vec2 TexCoord;
|
varying vec2 TexCoord;
|
||||||
varying vec3 vViewDirTangent;
|
varying vec3 vViewDirTangent;
|
||||||
|
|
||||||
@ -45,11 +45,13 @@ void main() {
|
|||||||
|
|
||||||
// Смещение. Знак минус используется, если мы хотим "вдавить" камни
|
// Смещение. Знак минус используется, если мы хотим "вдавить" камни
|
||||||
// Деление на viewDir.z помогает избежать сильных искажений под углом
|
// Деление на viewDir.z помогает избежать сильных искажений под углом
|
||||||
vec2 p = viewDir.xy * (height * uHeightScale) / viewDir.z;
|
//vec2 p = viewDir.xy * (height * uHeightScale) / viewDir.z;
|
||||||
|
vec2 p = vec2(viewDir.x, -viewDir.y) * (height * uHeightScale);
|
||||||
|
//vec2 p = vec2(0,0);
|
||||||
vec2 finalTexCoord = TexCoord + p;
|
vec2 finalTexCoord = TexCoord + p;
|
||||||
|
|
||||||
gl_FragColor = texture2D(Texture, finalTexCoord);
|
gl_FragColor = texture2D(Texture, finalTexCoord);
|
||||||
}*/
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
varying vec2 TexCoord;
|
varying vec2 TexCoord;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user