Finally somehow planet is done

This commit is contained in:
Vladislav Khorev committed 2025-12-31 23:02:13 +03:00
1 parent 592e008914
commit 2b40c13c9d
9 files changed
+315 -330

No files matched your search

+32 -69
View File
@@ -7,19 +7,13 @@
namespace ZL {
Matrix3f GetRotationForTriangle(const Triangle& tri) {
// Для треугольника №0:
// tri.data[0] = {0, 20000, 0} (A)
// tri.data[1] = {0, 0, 20000} (B)
// tri.data[2] = {20000, 0, 0} (C)
Vector3f vA = tri.data[0];
Vector3f vB = tri.data[1];
Vector3f vC = tri.data[2];
// 1. Вычисляем ось X (горизонталь).
// Нам нужна грань BC: от (0, 0, 20000) до (20000, 0, 0)
Vector3f x_axis = (vC - vB).normalized();
@@ -67,28 +61,24 @@ namespace ZL {
// Берем максимальный LOD для начальной отрисовки
int lodIndex = planetData.getMaxLodIndex();
planetRenderStruct.data = planetData.getLodLevel(lodIndex).vertexData;
//planetRenderStruct.data.PositionData.resize(9);
planetRenderStruct.RefreshVBO();
planetRenderStructCut.data = planetData.getLodLevelNoDist(lodIndex).vertexData;
planetRenderStructCut.data.PositionData.resize(3);
planetRenderStructCut.RefreshVBO();
//sandTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/sand2.png", ""));
sandTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/sand2.png", ""));
stoneTexture = std::make_unique<Texture>(CreateTextureDataFromPng("./resources/rock.png", ""));
// Атмосфера
planetAtmosphereRenderStruct.data = planetData.getAtmosphereLod().vertexData;
planetAtmosphereRenderStruct.RefreshVBO();
if (planetAtmosphereRenderStruct.data.PositionData.size() > 0)
{
planetAtmosphereRenderStruct.RefreshVBO();
}
planetStones = CreateStoneGroupData(778, planetData.getLodLevel(lodIndex));
planetStones.inflate({ 0/*,1,2,3,4,5,6,7*/ });
planetStonesToBakeRenderStruct.AssignFrom(planetStones.mesh);
planetStonesToBakeRenderStruct.RefreshVBO();
stonesToRender = planetStones.inflate(planetStones.allInstances.size());
}
void PlanetObject::prepareDrawData() {
@@ -99,33 +89,14 @@ namespace ZL {
void PlanetObject::update(float deltaTimeMs) {
// 1. Получаем базовые треугольники под камерой
auto lr = planetData.getTrianglesUnderCamera(Environment::shipPosition);
auto lr = planetData.getTrianglesUnderCameraNew(Environment::shipPosition);
int currentLod = planetData.getCurrentLodIndex();
// Временный вектор для сбора новых индексов
std::vector<int> newIndices;
std::set<int> used;
// Рекурсивно (или итеративно, как у тебя) собираем индексы видимых зон
for (int i : lr) {
if (used.insert(i).second) newIndices.push_back(i);
auto neighbors = planetData.findNeighbors(i, currentLod);
for (int n : neighbors) {
if (used.insert(n).second) newIndices.push_back(n);
auto neighbors2 = planetData.findNeighbors(n, currentLod);
for (int n2 : neighbors2) {
if (used.insert(n2).second) newIndices.push_back(n2);
auto neighbors3 = planetData.findNeighbors(n, currentLod);
for (int n3 : neighbors3) {
if (used.insert(n3).second) newIndices.push_back(n3);
}
}
}
}
newIndices = lr;
// 2. Сортируем новый список, чтобы порядок не влиял на сравнение
std::sort(newIndices.begin(), newIndices.end());
@@ -134,7 +105,7 @@ namespace ZL {
if (newIndices != triangleIndicesToDraw) {
// Обновляем список индексов (используем move для эффективности)
triangleIndicesToDraw = std::move(newIndices);
/*
// --- ОБНОВЛЯЕМ ЖЕЛТУЮ ЗОНУ (только когда изменился состав треугольников) ---
const auto& fullMesh = planetData.getLodLevel(currentLod).vertexData;
planetRenderYellowStruct.data.PositionData.clear();
@@ -150,15 +121,7 @@ namespace ZL {
if (planetRenderYellowStruct.data.PositionData.size() > 0)
{
planetRenderYellowStruct.RefreshVBO();
}
// --- ОБНОВЛЯЕМ КАМНИ (через новую структуру StoneGroup) ---
if (triangleIndicesToDraw.size() > 0)
{
planetStones.inflate(triangleIndicesToDraw);
// Используем AssignFrom, он внутри сам вызывает RefreshVBO
planetStonesRenderStruct.AssignFrom(planetStones.mesh);
}
}*/
}
}
@@ -166,7 +129,7 @@ namespace ZL {
void PlanetObject::bakeStoneTexture(Renderer& renderer) {
glViewport(0, 0, 512, 512);
glClearColor(224 / 255.f, 201 / 255.f, 167 / 255.f, 1.0f);
glClearColor(0,0,0, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -188,7 +151,7 @@ namespace ZL {
Triangle tr = planetData.getLodLevelNoDist(planetData.getCurrentLodIndex()).triangles[0];
Triangle tr = planetData.getLodLevel(planetData.getCurrentLodIndex()).triangles[0];
// 1. Получаем матрицу вращения (оси в столбцах)
Matrix3f mr = GetRotationForTriangle(tr);
@@ -213,8 +176,8 @@ namespace ZL {
float centerX = (minX + maxX) * 0.5f;
float centerY = (minY + maxY) * 0.5f;
width = width * 0.995;
height = height * 0.995;
//width = width * 0.995;
//height = height * 0.995;
renderer.PushProjectionMatrix(
centerX - width*0.5, centerX + width * 0.5,
@@ -237,21 +200,16 @@ namespace ZL {
renderer.RenderUniform3fv("uPlaneNormal", &planeNormal.v[0]);
renderer.RenderUniform1f("uMaxHeight", StoneParams::BASE_SCALE * 1.1f); // Соответствует BASE_SCALE + perturbation
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, sandTexture->getTexID());
renderer.PushMatrix();
renderer.DrawVertexRenderStruct(planetRenderStructCut);
renderer.PopMatrix();
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); // Отсекаем задние грани
if (planetStonesToBakeRenderStruct.data.PositionData.size() > 0)
if (stonesToRender[0].data.PositionData.size() > 0)
{
glBindTexture(GL_TEXTURE_2D, stoneTexture->getTexID());
renderer.DrawVertexRenderStruct(planetStonesToBakeRenderStruct);
renderer.DrawVertexRenderStruct(stonesToRender[0]);
CheckGlError();
}
glDisable(GL_CULL_FACE); // Не забываем выключить, чтобы не сломать остальной рендер
@@ -342,8 +300,8 @@ namespace ZL {
// Позиция камеры (корабля) в мире
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
//renderer.RenderUniform1f("uHeightScale", 0.03f);
renderer.RenderUniform1f("uHeightScale", 0.0f);
renderer.RenderUniform1f("uHeightScale", 0.03f);
//renderer.RenderUniform1f("uHeightScale", 0.0f);
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
renderer.RenderUniform1f("uCurrentZFar", currentZFar);
@@ -371,6 +329,7 @@ namespace ZL {
}
void PlanetObject::drawStones(Renderer& renderer)
{
static const std::string defaultShaderName2 = "planetStone";
@@ -403,7 +362,7 @@ namespace ZL {
renderer.RotateMatrix(Environment::inverseShipMatrix);
renderer.TranslateMatrix(-Environment::shipPosition);
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
renderer.RenderUniform1f("uCurrentZFar", currentZFar);
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
@@ -412,13 +371,16 @@ namespace ZL {
glCullFace(GL_BACK);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, stoneTexture->getTexID());
if (planetStonesRenderStruct.data.PositionData.size() > 0)
for (int i : triangleIndicesToDraw)
{
glBindTexture(GL_TEXTURE_2D, stoneTexture->getTexID());
renderer.DrawVertexRenderStruct(planetStonesRenderStruct);
CheckGlError();
if (stonesToRender[i].data.PositionData.size() > 0)
{
renderer.DrawVertexRenderStruct(stonesToRender[i]);
}
}
CheckGlError();
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
@@ -436,6 +398,7 @@ namespace ZL {
void PlanetObject::drawYellowZone(Renderer& renderer)
{
/*
static const std::string defaultShaderName = "planetLand";
static const std::string vPositionName = "vPosition";
@@ -503,7 +466,7 @@ namespace ZL {
renderer.shaderManager.PopShader();
CheckGlError();
}
}*/
}
void PlanetObject::drawAtmosphere(Renderer& renderer) {