Working on stuff

This commit is contained in:
Vladislav Khorev 2025-12-28 20:11:17 +03:00
parent 14b43239b5
commit 7287f4b619
6 changed files with 58 additions and 40 deletions

View File

@ -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
{

View File

@ -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]);
}
}
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;
@ -239,14 +243,14 @@ 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());

View File

@ -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<unsigned int>(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,7 +209,6 @@ 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<unsigned int>(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),

View File

@ -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;

View File

@ -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);
}

View File

@ -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;