diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-10-16 05:09:30 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-10-16 05:12:00 +0300 |
commit | 1b65a95a08f362b79022642c300a66019cceda2b (patch) | |
tree | 8e190245246c3abda52b8e1a075a3fa25a467943 /source/blender | |
parent | c5f4c69643cce39c37efe4074b7af66f18647f5a (diff) |
Mesh: use mesh tessellation for face-map drawing
Also use batch instead of immediate mode.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 128 |
1 files changed, 60 insertions, 68 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index acb995b65b8..a3897ad89f2 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -460,93 +460,85 @@ void ED_draw_object_facemap( glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW); -#if 0 - DM_update_materials(dm, ob); - - /* add polygon offset so we draw above the original surface */ - glPolygonOffset(1.0, 1.0); - - GPU_facemap_setup(dm); - - glColor4fv(col); - - gpuPushAttrib(GL_ENABLE_BIT); - GPU_blend(true); - glDisable(GL_LIGHTING); - - /* always draw using backface culling */ - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - - if (dm->drawObject->facemapindices) { - glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT, - (int *)NULL + dm->drawObject->facemap_start[facemap] * 3); - } - gpuPopAttrib(); - - GPU_buffers_unbind(); - - glPolygonOffset(0.0, 0.0); - -#else - /* Just to create the data to pass to immediate mode, grr! */ const int *facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP); if (facemap_data) { - GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - - immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); - immUniformColor4fv(col); - - /* XXX, alpha isn't working yet, not sure why. */ GPU_blend_set_func_separate(GPU_SRC_ALPHA, GPU_ONE_MINUS_SRC_ALPHA, GPU_ONE, GPU_ONE_MINUS_SRC_ALPHA); GPU_blend(true); - MVert *mvert; - - MPoly *mpoly; - int mpoly_len; + const MVert *mvert = me->mvert; + const MPoly *mpoly = me->mpoly; + const MLoop *mloop = me->mloop; - MLoop *mloop; - int mloop_len; - - mvert = me->mvert; - mpoly = me->mpoly; - mloop = me->mloop; - - mpoly_len = me->totpoly; - mloop_len = me->totloop; + int mpoly_len = me->totpoly; + int mloop_len = me->totloop; facemap_data = CustomData_get_layer(&me->pdata, CD_FACEMAP); /* use gawain immediate mode fore now */ const int looptris_len = poly_to_tri_count(mpoly_len, mloop_len); - immBeginAtMost(GPU_PRIM_TRIS, looptris_len * 3); + const int vbo_len_capacity = looptris_len * 3; + int vbo_len_used = 0; + + GPUVertFormat format_pos = { 0 }; + const uint pos_id = GPU_vertformat_attr_add(&format_pos, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); + + GPUVertBuf *vbo_pos = GPU_vertbuf_create_with_format(&format_pos); + GPU_vertbuf_data_alloc(vbo_pos, vbo_len_capacity); - MPoly *mp; + GPUVertBufRaw pos_step; + GPU_vertbuf_attr_get_raw_data(vbo_pos, pos_id, &pos_step); + + const MPoly *mp; int i; - for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) { - if (facemap_data[i] == facemap) { - /* Weak, fan-fill, use until we have derived-mesh replaced. */ - const MLoop *ml_start = &mloop[mp->loopstart]; - const MLoop *ml_a = ml_start + 1; - const MLoop *ml_b = ml_start + 2; - for (int j = 2; j < mp->totloop; j++) { - immVertex3fv(pos, mvert[ml_start->v].co); - immVertex3fv(pos, mvert[ml_a->v].co); - immVertex3fv(pos, mvert[ml_b->v].co); - - ml_a++; - ml_b++; + if (me->runtime.looptris.array) { + MLoopTri *mlt = me->runtime.looptris.array; + for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) { + if (facemap_data[i] == facemap) { + for (int j = 2; j < mp->totloop; j++) { + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[0]].v].co); + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[1]].v].co); + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[mloop[mlt->tri[2]].v].co); + vbo_len_used += 3; + mlt++; + } + } + else { + mlt += mp->totloop - 2; + } + } + } + else { + /* No tessellation data, fan-fill. */ + for (mp = mpoly, i = 0; i < mpoly_len; i++, mp++) { + if (facemap_data[i] == facemap) { + const MLoop *ml_start = &mloop[mp->loopstart]; + const MLoop *ml_a = ml_start + 1; + const MLoop *ml_b = ml_start + 2; + for (int j = 2; j < mp->totloop; j++) { + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_start->v].co); + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_a->v].co); + copy_v3_v3(GPU_vertbuf_raw_step(&pos_step), mvert[ml_b->v].co); + vbo_len_used += 3; + + ml_a++; + ml_b++; + } } } } - immEnd(); - immUnbindProgram(); + if (vbo_len_capacity != vbo_len_used) { + GPU_vertbuf_data_resize(vbo_pos, vbo_len_used); + } + + GPUBatch *draw_batch = GPU_batch_create(GPU_PRIM_TRIS, vbo_pos, NULL); + GPU_batch_program_set_builtin(draw_batch, GPU_SHADER_3D_UNIFORM_COLOR); + GPU_batch_uniform_4fv(draw_batch, "color", col); + GPU_batch_draw(draw_batch); + GPU_batch_discard(draw_batch); + GPU_vertbuf_discard(vbo_pos); GPU_blend(false); } -#endif } |