Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2018-10-16 05:09:30 +0300
committerCampbell Barton <ideasman42@gmail.com>2018-10-16 05:12:00 +0300
commit1b65a95a08f362b79022642c300a66019cceda2b (patch)
tree8e190245246c3abda52b8e1a075a3fa25a467943 /source/blender/editors/space_view3d/drawobject.c
parentc5f4c69643cce39c37efe4074b7af66f18647f5a (diff)
Mesh: use mesh tessellation for face-map drawing
Also use batch instead of immediate mode.
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r--source/blender/editors/space_view3d/drawobject.c128
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
}