Working on adding Eigen

This commit is contained in:
Vladislav Khorev committed 2026-01-03 19:52:44 +03:00
1 parent c553780b6e
commit 9bfe2bef89
16 files changed
+402 -503

No files matched your search

+9 -10
View File
@@ -169,7 +169,7 @@ namespace ZL {
std::vector<int> PlanetData::getTrianglesUnderCameraNew2(const Vector3f& viewerPosition) {
const LodLevel& finalLod = planetMeshLods[currentLod];
Vector3f shipLocal = viewerPosition - PLANET_CENTER_OFFSET;
float currentDist = shipLocal.length();
float currentDist = shipLocal.norm();
Vector3f targetDir = shipLocal.normalized();
// Æåëàåìûé ðàäèóñ ïîêðûòèÿ íà ïîâåðõíîñòè ïëàíåòû (â ìåòðàõ/åäèíèöàõ äâèæêà)
@@ -318,9 +318,9 @@ namespace ZL {
// Èñïîëüçóåì îäèí øóì äëÿ âûáîðà ìåæäó ðîçîâûì è æåëòûì
Vector3f dir = t.data[i].normalized();
float blendFactor = colorPerlin.noise(
dir.v[0] * colorFrequency,
dir.v[1] * colorFrequency,
dir.v[2] * colorFrequency
dir(0) * colorFrequency,
dir(1) * colorFrequency,
dir(2) * colorFrequency
);
// Ïðèâîäèì øóì èç äèàïàçîíà [-1, 1] â [0, 1]
@@ -328,9 +328,8 @@ namespace ZL {
// Ëèíåéíàÿ èíòåðïîëÿöèÿ ìåæäó äâóìÿ öâåòàìè
Vector3f finalColor;
finalColor.v[0] = colorPinkish.v[0] + blendFactor * (colorYellowish.v[0] - colorPinkish.v[0]);
finalColor.v[1] = colorPinkish.v[1] + blendFactor * (colorYellowish.v[1] - colorPinkish.v[1]);
finalColor.v[2] = colorPinkish.v[2] + blendFactor * (colorYellowish.v[2] - colorPinkish.v[2]);
finalColor = colorPinkish + blendFactor * (colorYellowish - colorPinkish);
lod.vertexData.ColorData.push_back(finalColor);
}
@@ -368,9 +367,9 @@ namespace ZL {
// Ãåíåðèðóåì ID äëÿ áàçîâûõ âåðøèí (ìîæíî èñïîëüçîâàòü èõ êîîðäèíàòû)
for (int i = 0; i < 3; ++i) {
tri.ids[i] = std::to_string(tri.data[i].v[0]) + "_" +
std::to_string(tri.data[i].v[1]) + "_" +
std::to_string(tri.data[i].v[2]);
tri.ids[i] = std::to_string(tri.data[i](0)) + "_" +
std::to_string(tri.data[i](1)) + "_" +
std::to_string(tri.data[i](2));
}
geometry.push_back(tri);
}
+10 -1
View File
@@ -15,6 +15,15 @@ namespace ZL {
using VertexID = std::string;
using V2TMap = std::map<VertexID, std::vector<int>>;
struct Vector3fComparator {
bool operator()(const Eigen::Vector3f& a, const Eigen::Vector3f& b) const {
// Ëåêñèêîãðàôè÷åñêîå ñðàâíåíèå (x, çàòåì y, çàòåì z)
if (a.x() != b.x()) return a.x() < b.x();
if (a.y() != b.y()) return a.y() < b.y();
return a.z() < b.z();
}
};
VertexID generateEdgeID(const VertexID& id1, const VertexID& id2);
constexpr static int MAX_LOD_LEVELS = 6;
@@ -82,7 +91,7 @@ namespace ZL {
int currentLod; // Ëîãè÷åñêèé òåêóùèé óðîâåíü äåòàëèçàöèè
std::map<Vector3f, VertexID> initialVertexMap;
std::map<Vector3f, VertexID, Vector3fComparator> initialVertexMap;
// Âíóòðåííèå ìåòîäû ãåíåðàöèè
std::vector<Triangle> subdivideTriangles(const std::vector<Triangle>& inputTriangles, float noiseCoeff);
+15 -21
View File
@@ -31,19 +31,13 @@ namespace ZL {
Matrix3f rot;
// Столбец 0: Ось X
rot.m[0] = x_axis.v[0];
rot.m[3] = x_axis.v[1];
rot.m[6] = x_axis.v[2];
rot.col(0) = x_axis;
// Столбец 1: Ось Y
rot.m[1] = y_axis.v[0];
rot.m[4] = y_axis.v[1];
rot.m[7] = y_axis.v[2];
rot.col(1) = y_axis;
// Столбец 2: Ось Z
rot.m[2] = z_axis.v[0];
rot.m[5] = z_axis.v[1];
rot.m[8] = z_axis.v[2];
rot.col(2) = z_axis;
return rot;
}
@@ -135,10 +129,10 @@ namespace ZL {
Vector3f rC = MultMatrixVector(mr, tr.data[2]);
// 3. Вычисляем реальные границы треугольника после поворота
float minX = min(rA.v[0], min(rB.v[0], rC.v[0]));
float maxX = max(rA.v[0], max(rB.v[0], rC.v[0]));
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 minX = min(rA(0), min(rB(0), rC(0)));
float maxX = max(rA(0), max(rB(0), rC(0)));
float minY = min(rA(1), min(rB(1), rC(1)));
float maxY = max(rA(1), max(rB(1), rC(1)));
// Находим центр и размеры
@@ -165,10 +159,10 @@ namespace ZL {
// Извлекаем нормаль треугольника (это 3-й столбец нашей матрицы вращения)
Vector3f planeNormal = { mr.m[2], mr.m[5], mr.m[8] };
Vector3f planeNormal = mr.col(2);
renderer.RenderUniform3fv("uPlanePoint", &tr.data[0].v[0]);
renderer.RenderUniform3fv("uPlaneNormal", &planeNormal.v[0]);
renderer.RenderUniform3fv("uPlanePoint", tr.data[0].data());
renderer.RenderUniform3fv("uPlaneNormal", planeNormal.data());
renderer.RenderUniform1f("uMaxHeight", StoneParams::BASE_SCALE * 1.1f); // Соответствует BASE_SCALE + perturbation
@@ -267,7 +261,7 @@ namespace ZL {
Matrix3f mr = GetRotationForTriangle(tr); // Та же матрица, что и при запекании
// Позиция камеры (корабля) в мире
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
renderer.RenderUniform3fv("uViewPos", Environment::shipPosition.data());
//renderer.RenderUniform1f("uHeightScale", 0.08f);
renderer.RenderUniform1f("uHeightScale", 0.0f);
@@ -335,7 +329,7 @@ namespace ZL {
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
renderer.RenderUniform1f("uCurrentZFar", currentZFar);
renderer.RenderUniform3fv("uViewPos", &Environment::shipPosition.v[0]);
renderer.RenderUniform3fv("uViewPos", Environment::shipPosition.data());
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
@@ -399,9 +393,9 @@ namespace ZL {
Vector3f color = { 0.0, 0.5, 1.0 };
renderer.RenderUniform3fv("uColor", &color.v[0]);
renderer.RenderUniform3fv("uColor", color.data());
renderer.RenderUniformMatrix4fv("ModelViewMatrix", false, &viewMatrix.m[0]);
renderer.RenderUniformMatrix4fv("ModelViewMatrix", false, viewMatrix.data());
renderer.RenderUniform1f("uDistanceToPlanetSurface", dist);
+10 -10
View File
@@ -104,9 +104,9 @@ namespace ZL {
// Применяем масштабирование
for (Vector3f& v : initialVertices) {
v.v[0] *= scaleFactors.v[0];
v.v[1] *= scaleFactors.v[1];
v.v[2] *= scaleFactors.v[2];
v(0) *= scaleFactors(0);
v(1) *= scaleFactors(1);
v(2) *= scaleFactors(2);
}
/*
@@ -126,7 +126,7 @@ namespace ZL {
VertexDataStruct result;
// Карта для накопления нормалей по уникальным позициям вершин
// (Требует определенного оператора < для Vector3f в ZLMath.h, который у вас есть)
std::map<Vector3f, Vector3f> smoothNormalsMap;
std::map<Vector3f, Vector3f, Vector3fComparator> smoothNormalsMap;
// Предварительное заполнение карты нормалями
for (const auto& face : faces) {
@@ -178,18 +178,18 @@ namespace ZL {
Vector3f vAxisRaw = vRaw - (uAxis * uProjLen);
// Длина оси V
float vLen = vAxisRaw.length();
float vLen = vAxisRaw.norm();
// Нормализованная ось V
Vector3f vAxis = vAxisRaw.normalized();
// Координаты (u, v) для p1, p2, p3 относительно p1
Vector2f uv1 = { 0.0f, 0.0f };
Vector2f uv2 = { (p2 - p1).length(), 0.0f }; // p2-p1 вдоль оси U
Vector2f uv2 = { (p2 - p1).norm(), 0.0f }; // p2-p1 вдоль оси U
Vector2f uv3 = { uProjLen, vLen }; // p3-p1: u-компонента = uProjLen, v-компонента = vLen
// Находим максимальный размер, чтобы масштабировать в [0, 1]
float maxUV = max(uv2.v[0], max(uv3.v[0], uv3.v[1]));
float maxUV = max(uv2(0), max(uv3(0), uv3(1)));
if (maxUV > 0.000001f) {
// Масштабируем:
@@ -326,9 +326,9 @@ namespace ZL {
Vector3f p = baseStone.PositionData[j];
Vector3f n = baseStone.NormalData[j];
p.v[0] *= inst.scale.v[0] * scaleModifier;
p.v[1] *= inst.scale.v[1] * scaleModifier;
p.v[2] *= inst.scale.v[2] * scaleModifier;
p(0) *= inst.scale(0) * scaleModifier;
p(1) *= inst.scale(1) * scaleModifier;
p(2) *= inst.scale(2) * scaleModifier;
result.data.PositionData.push_back(MultMatrixVector(rotMat, p) + inst.position);
result.data.NormalData.push_back(MultMatrixVector(rotMat, n));
+1 -1
View File
@@ -20,7 +20,7 @@ namespace ZL {
uint64_t seed;
Vector3f position;
Vector3f scale;
Vector4f rotation;
Eigen::Quaternionf rotation;
};
struct StoneGroup {