minor change to resolution slider, added backface culling and normal preprocessing
This commit is contained in:
@@ -37,7 +37,7 @@ struct defaults {
|
|||||||
float lodDropoff = 0.1;
|
float lodDropoff = 0.1;
|
||||||
PNoise2 noise = PNoise2(42);
|
PNoise2 noise = PNoise2(42);
|
||||||
|
|
||||||
int meshResolution = 128;
|
int meshResolution = 16;
|
||||||
float meshIsoLevel = 0.4f;
|
float meshIsoLevel = 0.4f;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -190,8 +190,8 @@ void livePreview(Octree<int>& grid, defaults& config, const Camera& cam) {
|
|||||||
|
|
||||||
if (meshNeedsUpdate) {
|
if (meshNeedsUpdate) {
|
||||||
scene.clear();
|
scene.clear();
|
||||||
std::shared_ptr<Mesh> planetMesh = grid.generateMesh(1, config.meshIsoLevel, config.meshResolution);
|
std::shared_ptr<Mesh> planetMesh = grid.generateMesh(1, config.meshIsoLevel, pow(config.meshResolution, 2));
|
||||||
std::shared_ptr<Mesh> starMesh = grid.generateMesh(2, config.meshIsoLevel, config.meshResolution / 4);
|
std::shared_ptr<Mesh> starMesh = grid.generateMesh(2, config.meshIsoLevel, config.meshResolution);
|
||||||
|
|
||||||
scene.addMesh(planetMesh);
|
scene.addMesh(planetMesh);
|
||||||
scene.addMesh(starMesh);
|
scene.addMesh(starMesh);
|
||||||
@@ -506,7 +506,7 @@ int main() {
|
|||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
ImGui::Text("Marching Cubes Config");
|
ImGui::Text("Marching Cubes Config");
|
||||||
if (ImGui::SliderInt("Mesh Resolution", &config.meshResolution, 16, 128)) {
|
if (ImGui::SliderInt("Mesh Resolution", &config.meshResolution, 1, 64)) {
|
||||||
meshNeedsUpdate = true;
|
meshNeedsUpdate = true;
|
||||||
}
|
}
|
||||||
if (ImGui::SliderFloat("Iso Level", &config.meshIsoLevel, 0.01f, 1.0f)) {
|
if (ImGui::SliderFloat("Iso Level", &config.meshIsoLevel, 0.01f, 1.0f)) {
|
||||||
|
|||||||
@@ -39,14 +39,19 @@ private:
|
|||||||
std::vector<std::vector<int>> _polys;
|
std::vector<std::vector<int>> _polys;
|
||||||
std::vector<Color> _colors;
|
std::vector<Color> _colors;
|
||||||
mutable std::vector<Eigen::Vector3i> _tris;
|
mutable std::vector<Eigen::Vector3i> _tris;
|
||||||
|
mutable std::vector<Vector3f> _triNormals;
|
||||||
mutable bool _needs_triangulation = true;
|
mutable bool _needs_triangulation = true;
|
||||||
|
mutable bool _needs_norm_calc = true;
|
||||||
|
|
||||||
inline static float edgeFunction(const Vector2f& a, const Vector2f& b, const Vector2f& c) {
|
inline static float edgeFunction(const Vector2f& a, const Vector2f& b, const Vector2f& c) {
|
||||||
return (c.x() - a.x()) * (b.y() - a.y()) - (c.y() - a.y()) * (b.x() - a.x());
|
return (c.x() - a.x()) * (b.y() - a.y()) - (c.y() - a.y()) * (b.x() - a.x());
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
Mesh(int id, const std::vector<Vector3f>& verts, const std::vector<std::vector<int>>& polys, const std::vector<Color>& colors)
|
Mesh(int id, const std::vector<Vector3f>& verts, const std::vector<std::vector<int>>& polys, const std::vector<Color>& colors)
|
||||||
: id(id), _vertices(verts), _polys(polys), _colors(colors) {}
|
: id(id), _vertices(verts), _polys(polys), _colors(colors) {
|
||||||
|
_needs_triangulation = true;
|
||||||
|
_needs_norm_calc = true;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Vector3f> vertices() {
|
std::vector<Vector3f> vertices() {
|
||||||
return _vertices;
|
return _vertices;
|
||||||
@@ -56,11 +61,13 @@ public:
|
|||||||
if (verts.size() != _colors.size()) {
|
if (verts.size() != _colors.size()) {
|
||||||
if (_colors.size() == 1) {
|
if (_colors.size() == 1) {
|
||||||
_vertices = verts;
|
_vertices = verts;
|
||||||
|
_needs_norm_calc = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
_vertices = verts;
|
_vertices = verts;
|
||||||
|
_needs_norm_calc = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,6 +79,7 @@ public:
|
|||||||
void triangulate() {
|
void triangulate() {
|
||||||
if (!_needs_triangulation) return;
|
if (!_needs_triangulation) return;
|
||||||
std::vector<Eigen::Vector3i> newPols;
|
std::vector<Eigen::Vector3i> newPols;
|
||||||
|
newPols.reserve(_polys.size() * 2);
|
||||||
for (auto& pol : _polys) {
|
for (auto& pol : _polys) {
|
||||||
if (pol.size() > 3) {
|
if (pol.size() > 3) {
|
||||||
auto v0 = pol[0];
|
auto v0 = pol[0];
|
||||||
@@ -84,7 +92,33 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
_tris = newPols;
|
_tris = newPols;
|
||||||
|
|
||||||
|
_polys.clear();
|
||||||
|
_polys.shrink_to_fit();
|
||||||
|
|
||||||
_needs_triangulation = false;
|
_needs_triangulation = false;
|
||||||
|
_needs_norm_calc = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calculateNormals() {
|
||||||
|
if (!_needs_norm_calc) return;
|
||||||
|
|
||||||
|
_triNormals.clear();
|
||||||
|
_triNormals.reserve(_tris.size());
|
||||||
|
|
||||||
|
for (const auto& tri : _tris) {
|
||||||
|
Vector3f v0 = _vertices[tri.x()];
|
||||||
|
Vector3f v1 = _vertices[tri.y()];
|
||||||
|
Vector3f v2 = _vertices[tri.z()];
|
||||||
|
|
||||||
|
Vector3f edge1 = v1 - v0;
|
||||||
|
Vector3f edge2 = v2 - v0;
|
||||||
|
|
||||||
|
// Normalized cross product gives the face normal
|
||||||
|
Vector3f normal = edge1.cross(edge2).normalized();
|
||||||
|
_triNormals.push_back(normal);
|
||||||
|
}
|
||||||
|
_needs_norm_calc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Color> colors() {
|
std::vector<Color> colors() {
|
||||||
@@ -101,8 +135,10 @@ public:
|
|||||||
|
|
||||||
std::vector<Triangle2D> project_2d(Camera cam, int height, int width, float near, float far) {
|
std::vector<Triangle2D> project_2d(Camera cam, int height, int width, float near, float far) {
|
||||||
triangulate();
|
triangulate();
|
||||||
|
calculateNormals();
|
||||||
|
|
||||||
std::vector<Triangle2D> renderList;
|
std::vector<Triangle2D> renderList;
|
||||||
|
renderList.reserve(_tris.size());
|
||||||
|
|
||||||
Vector3f forward = cam.forward();
|
Vector3f forward = cam.forward();
|
||||||
Vector3f right = cam.right();
|
Vector3f right = cam.right();
|
||||||
@@ -160,7 +196,19 @@ public:
|
|||||||
validVerts[i] = true;
|
validVerts[i] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& triIdx : _tris) {
|
Vector3f camPos = cam.origin;
|
||||||
|
size_t triCount = _tris.size();
|
||||||
|
|
||||||
|
for (size_t t = 0; t < triCount; ++t) {
|
||||||
|
const auto& triIdx = _tris[t];
|
||||||
|
|
||||||
|
Vector3f p0 = _vertices[triIdx.x()];
|
||||||
|
Vector3f viewDir = (p0 - camPos).normalized();
|
||||||
|
|
||||||
|
if (viewDir.dot(_triNormals[t]) >= 0.0f) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int i0 = triIdx.x();
|
int i0 = triIdx.x();
|
||||||
int i1 = triIdx.y();
|
int i1 = triIdx.y();
|
||||||
int i2 = triIdx.z();
|
int i2 = triIdx.z();
|
||||||
@@ -250,7 +298,9 @@ public:
|
|||||||
os << "Structure:\n";
|
os << "Structure:\n";
|
||||||
os << " Total Vertices : " << _vertices.size() << "\n";
|
os << " Total Vertices : " << _vertices.size() << "\n";
|
||||||
os << " Total Tris : " << _tris.size() << "\n";
|
os << " Total Tris : " << _tris.size() << "\n";
|
||||||
os << " Total Polys : " << _polys.size() << "\n";
|
os << " Tri Normals : " << _triNormals.size() << "\n";
|
||||||
|
if (_needs_triangulation) os << " Total Polys : " << _polys.size() << "\n";
|
||||||
|
else os << " Polys (Cleared) : " << 0 << "\n";
|
||||||
os << " colors : " << _colors.size() << "\n";
|
os << " colors : " << _colors.size() << "\n";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -267,10 +317,12 @@ public:
|
|||||||
|
|
||||||
void addMesh(std::shared_ptr<Mesh> mesh) {
|
void addMesh(std::shared_ptr<Mesh> mesh) {
|
||||||
_meshes.push_back(mesh);
|
_meshes.push_back(mesh);
|
||||||
|
updateStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
_meshes.clear();
|
_meshes.clear();
|
||||||
|
updateStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
frame render(Camera cam, int height, int width, float near, float far, frame::colormap colorformat = frame::colormap::RGB) {
|
frame render(Camera cam, int height, int width, float near, float far, frame::colormap colorformat = frame::colormap::RGB) {
|
||||||
|
|||||||
Reference in New Issue
Block a user