feat: render split lines

This commit is contained in:
parker
2025-08-04 12:16:19 +01:00
parent 551ccfd3a8
commit c685e4b9bd
3 changed files with 33 additions and 13 deletions

View File

@@ -50,8 +50,9 @@ void GLMesh::initBuffers()
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glGenBuffers(1, &indexBuffer); glGenBuffers(1, &faceIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glGenBuffers(1, &lineIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faceIndexBuffer);
} }
@@ -119,8 +120,8 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry)
void GLMesh::setIndexBuffer(std::vector<int> pointIndices, std::vector<int> primVertexCounts) void GLMesh::setIndexBuffer(std::vector<int> pointIndices, std::vector<int> primVertexCounts)
{ {
bind(); bind();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); faceIndexData.clear();
indexData.clear(); lineIndexData.clear();
unsigned int startVert = 0; unsigned int startVert = 0;
@@ -130,18 +131,31 @@ void GLMesh::setIndexBuffer(std::vector<int> pointIndices, std::vector<int> prim
int primVertexCount = primVertexCounts[primNum]; int primVertexCount = primVertexCounts[primNum];
for(size_t i=1; i<primVertexCount-1; ++i) if(primVertexCount>=3)
{ {
indexData.push_back(startVert); for(size_t i=1; i<primVertexCount-1; ++i)
indexData.push_back(startVert+i); {
indexData.push_back(startVert+i+1); faceIndexData.push_back(startVert);
faceIndexData.push_back(startVert+i);
faceIndexData.push_back(startVert+i+1);
}
}
if(primVertexCount==2)
{
IC(startVert, startVert+1);
lineIndexData.push_back(startVert);
lineIndexData.push_back(startVert+1);
} }
startVert += primVertexCount; startVert += primVertexCount;
} }
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData.size()*sizeof(GLint), indexData.data(), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faceIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, faceIndexData.size()*sizeof(GLint), faceIndexData.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, lineIndexData.size()*sizeof(GLint), lineIndexData.data(), GL_STATIC_DRAW);
unbind(); unbind();
} }
@@ -163,5 +177,9 @@ void GLMesh::draw()
// wireframe // wireframe
// glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); // glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glDrawElements(GL_TRIANGLES, indexData.size(), GL_UNSIGNED_INT, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, faceIndexBuffer);
glDrawElements(GL_TRIANGLES, faceIndexData.size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineIndexBuffer);
glDrawElements(GL_LINES, lineIndexData.size(), GL_UNSIGNED_INT, 0);
} }

View File

@@ -18,11 +18,13 @@ public:
GLMesh(); GLMesh();
GLuint vao; GLuint vao;
GLuint vertexBuffer; GLuint vertexBuffer;
GLuint indexBuffer; GLuint faceIndexBuffer;
GLuint lineIndexBuffer;
// std::vector<GLfloat> vertexPosData; // std::vector<GLfloat> vertexPosData;
std::vector<Vertex> vertices; std::vector<Vertex> vertices;
std::vector<GLint> indexData; std::vector<GLint> faceIndexData;
std::vector<GLint> lineIndexData;
void init(); void init();
void initBuffers(); void initBuffers();

View File

@@ -78,7 +78,7 @@ void GopGeometryImport::cookOp(enzo::op::Context context)
const bt::Vector3 pointPos = {std::stod(result[1]), std::stod(result[2]), std::stod(result[3])}; const bt::Vector3 pointPos = {std::stod(result[1]), std::stod(result[2]), std::stod(result[3])};
PAttrHandle.addValue(pointPos); PAttrHandle.addValue(pointPos);
} }
else if(firstChar=='f') else if(firstChar=='f' || firstChar=='l')
{ {
std::vector<std::string> result; std::vector<std::string> result;
boost::split(result, line, isspace); boost::split(result, line, isspace);