Drawing speedup:
We really don't need to iterate all edges of the mesh every frame to search for loose edges, this calculation can be cached when filling the edge index buffer.
This commit is contained in:
parent
5ca3f3d811
commit
fbff0e68a4
Notes:
blender-bot
2023-02-14 10:09:24 +01:00
Referenced by issue #45117, Dark dupliface objects in viewport
|
@ -432,33 +432,8 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
|
|||
|
||||
static void cdDM_drawLooseEdges(DerivedMesh *dm)
|
||||
{
|
||||
CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
|
||||
MEdge *medge = cddm->medge;
|
||||
int i;
|
||||
|
||||
int prevstart = 0;
|
||||
int prevdraw = 1;
|
||||
int draw = 1;
|
||||
|
||||
GPU_edge_setup(dm);
|
||||
for (i = 0; i < dm->numEdgeData; i++, medge++) {
|
||||
if (medge->flag & ME_LOOSEEDGE) {
|
||||
draw = 1;
|
||||
}
|
||||
else {
|
||||
draw = 0;
|
||||
}
|
||||
if (prevdraw != draw) {
|
||||
if (prevdraw > 0 && (i - prevstart) > 0) {
|
||||
GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
|
||||
}
|
||||
prevstart = i;
|
||||
}
|
||||
prevdraw = draw;
|
||||
}
|
||||
if (prevdraw > 0 && (i - prevstart) > 0) {
|
||||
GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
|
||||
}
|
||||
GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, dm->drawObject->tot_loose_edge * 2);
|
||||
GPU_buffer_unbind();
|
||||
}
|
||||
|
||||
|
|
|
@ -113,6 +113,9 @@ typedef struct GPUDrawObject {
|
|||
/* caches of the original DerivedMesh values */
|
||||
int totvert;
|
||||
int totedge;
|
||||
|
||||
int loose_edge_offset;
|
||||
int tot_loose_edge;
|
||||
} GPUDrawObject;
|
||||
|
||||
/* used for GLSL materials */
|
||||
|
|
|
@ -942,15 +942,31 @@ static void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray_, int *UNUSED(in
|
|||
{
|
||||
MEdge *medge;
|
||||
unsigned int *varray = (unsigned int *)varray_;
|
||||
int i, totedge;
|
||||
int i, totedge, iloose, inorm;
|
||||
|
||||
medge = dm->getEdgeArray(dm);
|
||||
totedge = dm->getNumEdges(dm);
|
||||
|
||||
inorm = 0;
|
||||
iloose = totedge - 1;
|
||||
|
||||
for (i = 0; i < totedge; i++, medge++) {
|
||||
varray[i * 2] = dm->drawObject->vert_points[medge->v1].point_index;
|
||||
varray[i * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
|
||||
if (medge->flag & ME_LOOSEEDGE) {
|
||||
varray[iloose * 2] = dm->drawObject->vert_points[medge->v1].point_index;
|
||||
varray[iloose * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
|
||||
iloose--;
|
||||
}
|
||||
else {
|
||||
varray[inorm * 2] = dm->drawObject->vert_points[medge->v1].point_index;
|
||||
varray[inorm * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
|
||||
inorm++;
|
||||
}
|
||||
}
|
||||
|
||||
iloose++;
|
||||
dm->drawObject->tot_loose_edge = totedge - iloose;
|
||||
dm->drawObject->loose_edge_offset = iloose;
|
||||
|
||||
}
|
||||
|
||||
static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user))
|
||||
|
|
Loading…
Reference in New Issue