feat: add cgal and viewport smooth normals

This commit is contained in:
parker
2025-07-31 18:19:14 +01:00
parent afd3559a4d
commit 2bdada366b
5 changed files with 112 additions and 9 deletions

View File

@@ -3,7 +3,9 @@
#include "Engine/Operator/AttributeHandle.h"
#include "Engine/Types.h"
#include <memory>
#include <oneapi/tbb/task_group.h>
#include <stdexcept>
#include "icecream.hpp"
using namespace enzo;
geo::Geometry::Geometry()
@@ -13,6 +15,58 @@ geo::Geometry::Geometry()
addIntAttribute(ga::AttrOwner::PRIMITIVE, "vertexCount");
}
enzo::geo::HeMesh geo::Geometry::computeHalfEdgeMesh()
{
HeMesh heMesh;
std::shared_ptr<enzo::ga::Attribute> PAttr = getAttribByName(enzo::ga::AttrOwner::POINT, "P");
enzo::ga::AttributeHandleVector3 PAttrHandle = enzo::ga::AttributeHandleVector3(PAttr);
auto pointPositions = PAttrHandle.getAllValues();
std::shared_ptr<enzo::ga::Attribute> pointAttr = getAttribByName(enzo::ga::AttrOwner::VERTEX, "point");
enzo::ga::AttributeHandleInt pointAttrHandle = enzo::ga::AttributeHandleInt(pointAttr);
auto vertexPointIndices = pointAttrHandle.getAllValues();
std::shared_ptr<enzo::ga::Attribute> vertexCountAttr = getAttribByName(enzo::ga::AttrOwner::PRIMITIVE, "vertexCount");
enzo::ga::AttributeHandleInt vertexCountHandle = enzo::ga::AttributeHandleInt(vertexCountAttr);
auto vertexCounts = vertexCountHandle.getAllValues();
int vertexIndex = 0;
std::vector<geo::vertexDescriptor> createdPoints;
createdPoints.reserve(pointPositions.size());
std::vector<geo::vertexDescriptor> facePoints;
facePoints.reserve(16);
for(auto pointPos : pointPositions)
{
enzo::geo::vertexDescriptor point = heMesh.add_vertex(geo::Point(pointPos.x(), pointPos.y(), pointPos.z()));
createdPoints.push_back(point);
}
// iterate through each prim
for(int primIndx=0; primIndx<vertexCounts.size(); ++primIndx)
{
facePoints.clear();
// represents how many vertices are in a primitive
auto vertexCount = vertexCounts[primIndx];
// create primtive vertices
for(int i=0; i<vertexCount; ++i)
{
auto pointIndex = vertexPointIndices.at(vertexIndex);
facePoints.push_back(createdPoints[pointIndex]);
++vertexIndex;
}
heMesh.add_face(facePoints);
}
return heMesh;
}
ga::AttributeHandle<int> geo::Geometry::addIntAttribute(ga::AttributeOwner owner, std::string name)
{
auto newAttribute = std::make_shared<ga::Attribute>(name, ga::AttrType::intT);

View File

@@ -1,10 +1,23 @@
#pragma once
#include "Engine/Operator/Attribute.h"
#include "Engine/Types.h"
#include <CGAL/Surface_mesh/Surface_mesh.h>
#include <CGAL/Simple_cartesian.h>
#include <variant>
namespace enzo::geo
{
using Kernel = CGAL::Simple_cartesian<double>;
using Point = Kernel::Point_3;
using Vector = Kernel::Vector_3;
using HeMesh = CGAL::Surface_mesh<Point>;
using vertexDescriptor = HeMesh::Vertex_index;
using faceDescriptor = HeMesh::Face_index;
using V_index = HeMesh::Vertex_index;
using F_index = HeMesh::Face_index;
class Geometry
{
public:
@@ -12,6 +25,8 @@ public:
ga::AttributeHandle<int> addIntAttribute(ga::AttributeOwner owner, std::string name);
ga::AttributeHandle<bt::Vector3> addVector3Attribute(ga::AttributeOwner owner, std::string name);
std::shared_ptr<ga::Attribute> getAttribByName(ga::AttributeOwner owner, std::string name);
std::vector<bt::Vector3> derivePointNormals();
HeMesh computeHalfEdgeMesh();
private:
using attribVector = std::vector<std::shared_ptr<ga::Attribute>>;
attribVector& getAttributeStore(ga::AttributeOwner& owner);