fixed interpolating breaking stuff

This commit is contained in:
Yggdrasil75
2026-03-02 14:01:00 -05:00
parent 4f0dba5eb4
commit 14158fae83
2 changed files with 39 additions and 23 deletions

View File

@@ -307,6 +307,8 @@ public:
if (p.noiseDisplacement < minNoise) minNoise = p.noiseDisplacement; if (p.noiseDisplacement < minNoise) minNoise = p.noiseDisplacement;
if (p.noiseDisplacement > maxNoise) maxNoise = p.noiseDisplacement; if (p.noiseDisplacement > maxNoise) maxNoise = p.noiseDisplacement;
} }
int snf = 0;
int inf = 0;
for (auto& p : sim.config.surfaceNodes) { for (auto& p : sim.config.surfaceNodes) {
v3 color = p.originColor; v3 color = p.originColor;
@@ -332,7 +334,7 @@ public:
} }
if (!sim.grid.setColor(p.currentPos, color)) { if (!sim.grid.setColor(p.currentPos, color)) {
std::cout << "node failed to set" << std::endl; snf++;
} }
// sim.grid.update(p.currentPos, p.currentPos, p, true, color, sim.config.voxelSize, true, -2, false, 0.0f, 0.0f, 0.0f); // sim.grid.update(p.currentPos, p.currentPos, p, true, color, sim.config.voxelSize, true, -2, false, 0.0f, 0.0f, 0.0f);
} }
@@ -360,10 +362,12 @@ public:
} }
if (!sim.grid.setColor(p.currentPos, color)) { if (!sim.grid.setColor(p.currentPos, color)) {
std::cout << "node failed to set" << std::endl; inf++;
} }
// sim.grid.update(p.currentPos, p.currentPos, p, true, color, sim.config.voxelSize, true, -2, false, 0.0f, 0.0f, 0.0f); // sim.grid.update(p.currentPos, p.currentPos, p, true, color, sim.config.voxelSize, true, -2, false, 0.0f, 0.0f, 0.0f);
} }
// std::cout << snf << " original nodes failed to set" << std::endl;
// std::cout << inf << " interpolated nodes failed to set" << std::endl;
} }
void generateDebugMap(DebugMapMode mode) { void generateDebugMap(DebugMapMode mode) {
@@ -551,6 +555,7 @@ public:
void interpolateSurface() { void interpolateSurface() {
sim.interpolateSurface(); sim.interpolateSurface();
applyDebugColorMode();
} }
void fillPlanet() { void fillPlanet() {

View File

@@ -721,24 +721,21 @@ public:
void interpolateSurface() { void interpolateSurface() {
TIME_FUNCTION; TIME_FUNCTION;
config.interpolatedNodes.clear();
std::set<std::tuple<int, int, int>> uniqueTriangles; std::set<std::tuple<int, int, int>> uniqueTriangles;
for (int i = 0; i < config.surfaceNodes.size(); i++) { for (int i = 0; i < config.surfaceNodes.size(); i++) {
Particle& p1 = config.surfaceNodes[i]; Particle& p1 = config.surfaceNodes[i];
for (int j : p1.nearNeighbors) { for (int j : p1.nearNeighbors) {
if (j >= i) continue; if (j >= i) continue;
Particle& p2 = config.surfaceNodes[j]; Particle& p2 = config.surfaceNodes[j];
for (int k : p2.nearNeighbors) { for (int k : p2.nearNeighbors) {
if (k <= j) continue; if (k <= j) continue;
bool isNeighbor = false; bool isNeighbor = false;
for(int n : config.surfaceNodes[k].nearNeighbors) { for(int n : config.surfaceNodes[k].nearNeighbors) {
if(n == i) { isNeighbor = true; break; } if(n == i) { isNeighbor = true; break; }
} }
if (isNeighbor) { if (isNeighbor) {
uniqueTriangles.insert({i, j, k}); uniqueTriangles.insert({i, j, k});
} }
@@ -749,8 +746,7 @@ public:
std::cout << "Identified " << uniqueTriangles.size() << " surface triangles. Filling..." << std::endl; std::cout << "Identified " << uniqueTriangles.size() << " surface triangles. Filling..." << std::endl;
size_t counter = 0; size_t counter = 0;
float halfVoxel = config.voxelSize * 0.5f;
for (const auto& tri : uniqueTriangles) { for (const auto& tri : uniqueTriangles) {
int idx1 = std::get<0>(tri); int idx1 = std::get<0>(tri);
int idx2 = std::get<1>(tri); int idx2 = std::get<1>(tri);
@@ -776,9 +772,34 @@ public:
if (w1 > 0.99f || w2 > 0.99f || w3 > 0.99f) continue; if (w1 > 0.99f || w2 > 0.99f || w3 > 0.99f) continue;
// Calculate position
v3 interpNormal = (p1.originalPos.normalized() * w1 + p2.originalPos.normalized() * w2 + p3.originalPos.normalized() * w3);
interpNormal.normalize();
float r1 = p1.currentPos.norm();
float r2 = p2.currentPos.norm();
float r3 = p3.currentPos.norm();
float interpRadius = (r1 * w1) + (r2 * w2) + (r3 * w3);
v3 smoothPos = interpNormal * interpRadius;
// Snapping logic
v3 targetPos;
targetPos.x() = std::round(smoothPos.x() / config.voxelSize) * config.voxelSize;
targetPos.y() = std::round(smoothPos.y() / config.voxelSize) * config.voxelSize;
targetPos.z() = std::round(smoothPos.z() / config.voxelSize) * config.voxelSize;
// FIX: Check if this spot is already occupied!
// We use half voxelSize as tolerance to ensure we catch the occupant
if (grid.find(targetPos, config.voxelSize * 0.1f) != nullptr) {
continue;
}
Particle newPt; Particle newPt;
newPt.surface = true; newPt.surface = true;
newPt.currentPos = targetPos;
// Assign properties based on dominant weight
if (w1 > w2 && w1 > w3) { if (w1 > w2 && w1 > w3) {
newPt.plateID = p1.plateID; newPt.plateID = p1.plateID;
newPt.originColor = p1.originColor; newPt.originColor = p1.originColor;
@@ -790,26 +811,16 @@ public:
newPt.originColor = p3.originColor; newPt.originColor = p3.originColor;
} }
v3 interpNormal = (p1.originalPos.normalized() * w1 + p2.originalPos.normalized() * w2 + p3.originalPos.normalized() * w3);
interpNormal.normalize();
float r1 = p1.currentPos.norm();
float r2 = p2.currentPos.norm();
float r3 = p3.currentPos.norm();
float interpRadius = (r1 * w1) + (r2 * w2) + (r3 * w3);
v3 smoothPos = interpNormal * interpRadius;
newPt.currentPos.x() = std::round(smoothPos.x() / config.voxelSize) * config.voxelSize;
newPt.currentPos.y() = std::round(smoothPos.y() / config.voxelSize) * config.voxelSize;
newPt.currentPos.z() = std::round(smoothPos.z() / config.voxelSize) * config.voxelSize;
newPt.originalPos = interpNormal * config.radius; newPt.originalPos = interpNormal * config.radius;
newPt.noisePos = p1.noisePos * w1 + p2.noisePos * w2 + p3.noisePos * w3; newPt.noisePos = p1.noisePos * w1 + p2.noisePos * w2 + p3.noisePos * w3;
newPt.tectonicPos = p1.tectonicPos * w1 + p2.tectonicPos * w2 + p3.tectonicPos * w3; newPt.tectonicPos = p1.tectonicPos * w1 + p2.tectonicPos * w2 + p3.tectonicPos * w3;
// Insert into Grid
grid.set(newPt, newPt.currentPos, true, newPt.originColor, config.voxelSize, true, 1, 2, false, 0.0f, 0.0f, 0.0f); grid.set(newPt, newPt.currentPos, true, newPt.originColor, config.voxelSize, true, 1, 2, false, 0.0f, 0.0f, 0.0f);
// FIX: Save to interpolatedNodes so we don't lose the data reference
config.interpolatedNodes.push_back(newPt);
counter++; counter++;
} }
} }