diff --git a/PlanetData.h b/PlanetData.h index 553bd3c..0884974 100644 --- a/PlanetData.h +++ b/PlanetData.h @@ -16,8 +16,8 @@ namespace ZL { VertexID generateEdgeID(const VertexID& id1, const VertexID& id2); - //constexpr static int MAX_LOD_LEVELS = 6; - constexpr static int MAX_LOD_LEVELS = 1; + constexpr static int MAX_LOD_LEVELS = 6; + //constexpr static int MAX_LOD_LEVELS = 3; struct Triangle { diff --git a/PlanetObject.cpp b/PlanetObject.cpp index cb8c067..a7f9382 100644 --- a/PlanetObject.cpp +++ b/PlanetObject.cpp @@ -77,7 +77,7 @@ namespace ZL { 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.resize(3); + //planetRenderStruct.data.PositionData.resize(3); /*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[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.RefreshVBO(); + if (planetRenderYellowStruct.data.PositionData.size() > 0) + { + planetRenderYellowStruct.RefreshVBO(); + } // --- ОБНОВЛЯЕМ КАМНИ (через новую структуру StoneGroup) --- if (triangleIndicesToDraw.size() > 0) @@ -173,7 +176,7 @@ namespace ZL { void PlanetObject::bakeStoneTexture(Renderer& renderer) { 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); @@ -213,6 +216,7 @@ namespace ZL { 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 width = maxX - minX; float height = maxY - minY; @@ -238,15 +242,15 @@ namespace ZL { // Применяем вращение renderer.RotateMatrix(mr); - // Извлекаем нормаль треугольника (это 3-й столбец нашей матрицы вращения) Vector3f planeNormal = { mr.m[2], mr.m[5], mr.m[8] }; //Vector3f planeNormal = { 0,0,1 }; + renderer.RenderUniform3fv("uPlanePoint", &tr.data[0].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); //drawYellowZone(renderer); - //drawStones(renderer); + drawStones(renderer); //drawAtmosphere(renderer); } @@ -380,9 +384,9 @@ namespace ZL { 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.0f + x / 1000.f); + //renderer.RenderUniform1f("uHeightScale", 0.0f + x / 1000.f); //renderer.RenderUniform1f("uHeightScale", 0.0f); glBindTexture(GL_TEXTURE_2D, stoneMapFB->getTextureID()); diff --git a/StoneObject.cpp b/StoneObject.cpp index da19d53..4b226b8 100644 --- a/StoneObject.cpp +++ b/StoneObject.cpp @@ -9,6 +9,20 @@ 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] float getRandomFloat(std::mt19937& gen, float min, float max) { std::uniform_real_distribution<> distrib(min, max); @@ -44,18 +58,6 @@ namespace ZL { 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; // ( , ) std::mt19937 engine(static_cast(seed)); @@ -84,10 +86,10 @@ namespace ZL { // 1. (Perturbation) 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); } @@ -95,9 +97,9 @@ namespace ZL { // Vector3f scaleFactors = { - getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE), - getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE), - getRandomFloat(engine, MIN_AXIS_SCALE, MAX_AXIS_SCALE) + getRandomFloat(engine, StoneParams::MIN_AXIS_SCALE, StoneParams::MAX_AXIS_SCALE), + getRandomFloat(engine, StoneParams::MIN_AXIS_SCALE, StoneParams::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 group; - const int STONES_PER_TRIANGLE = 1; - + // LOD group.allInstances.resize(planetLodLevel.triangles.size()); @@ -216,13 +217,13 @@ namespace ZL { const Triangle& tri = planetLodLevel.triangles[tIdx]; std::mt19937 engine(static_cast(globalSeed)); - for (int i = 0; i < STONES_PER_TRIANGLE; ++i) { + for (int i = 0; i < StoneParams::STONES_PER_TRIANGLE; ++i) { StoneInstance instance; 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 = { getRandomFloat(engine, 0.5f, 1.5f), diff --git a/StoneObject.h b/StoneObject.h index ebc35ce..0fd4db3 100644 --- a/StoneObject.h +++ b/StoneObject.h @@ -5,6 +5,17 @@ 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 { uint64_t seed; Vector3f position; diff --git a/shaders/defaultColor_bake_desktop.fragment b/shaders/defaultColor_bake_desktop.fragment index e570a30..44c5bb2 100644 --- a/shaders/defaultColor_bake_desktop.fragment +++ b/shaders/defaultColor_bake_desktop.fragment @@ -15,7 +15,7 @@ void main() float diff = 1.0; // RGB - цвет камня с учетом света, A - нормализованная высота - //gl_FragColor = vec4(stoneColor.rgb * diff, vHeight); - gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight); + gl_FragColor = vec4(stoneColor.rgb * diff, vHeight); + //gl_FragColor = vec4(vHeight, vHeight, vHeight, vHeight); //gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0); } \ No newline at end of file diff --git a/shaders/defaultColor_fog_stones_desktop.fragment b/shaders/defaultColor_fog_stones_desktop.fragment index 2dd372c..ffb31f5 100644 --- a/shaders/defaultColor_fog_stones_desktop.fragment +++ b/shaders/defaultColor_fog_stones_desktop.fragment @@ -1,4 +1,4 @@ -varying vec2 TexCoord; +/*varying vec2 TexCoord; varying vec3 vViewDirTangent; uniform sampler2D Texture; // Нам нужен только Alpha канал (высота) @@ -28,9 +28,9 @@ void main() { // 3. Подмешиваем карту высот, чтобы видеть "объемы" gl_FragColor = vec4(finalColor * height, 1.0); -} +}*/ + -/* varying vec2 TexCoord; varying vec3 vViewDirTangent; @@ -45,11 +45,13 @@ void main() { // Смещение. Знак минус используется, если мы хотим "вдавить" камни // Деление на 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; gl_FragColor = texture2D(Texture, finalTexCoord); -}*/ +} /* varying vec2 TexCoord;