Working on adding Eigen
This commit is contained in:
1 parent
c553780b6e
commit
9bfe2bef89
16 files changed
+402
-503
No files matched your search
@@ -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
@@ -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
@@ -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
@@ -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));
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace ZL {
|
||||
uint64_t seed;
|
||||
Vector3f position;
|
||||
Vector3f scale;
|
||||
Vector4f rotation;
|
||||
Eigen::Quaternionf rotation;
|
||||
};
|
||||
|
||||
struct StoneGroup {
|
||||
|
||||
Reference in new issue
Block a user