[Bf-blender-cvs] [00fe49d] wiggly-widgets: Code that will draw a transparent overlay of a facemap over the mesh (crashes atm).
Antony Riakiotakis
noreply at git.blender.org
Tue Dec 16 20:14:27 CET 2014
Commit: 00fe49de83192eeab23851ce5bebfff28b65f8af
Author: Antony Riakiotakis
Date: Tue Dec 16 20:14:10 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB00fe49de83192eeab23851ce5bebfff28b65f8af
Code that will draw a transparent overlay of a facemap over the mesh
(crashes atm).
===================================================================
M source/blender/editors/space_view3d/drawobject.c
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 0f2c6e1..22ca908 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -4011,8 +4011,11 @@ static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3
}
draw_mesh_fancy(scene, ar, v3d, rv3d, base, dt, ob_wire_col, dflag);
-
+
GPU_end_object_materials();
+
+ if (ob->fmaps.first)
+ draw_object_facemap(scene, ob, ob->actfmap - 1);
if (me->totvert == 0) retval = true;
}
@@ -8182,7 +8185,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r
if (dm) dm->release(dm);
}
-void draw_object_facemap(Scene *scene, struct Object *ob, int UNUSED(facemap))
+void draw_object_facemap(Scene *scene, struct Object *ob, int facemap)
{
DerivedMesh *dm = NULL;
@@ -8193,9 +8196,22 @@ void draw_object_facemap(Scene *scene, struct Object *ob, int UNUSED(facemap))
glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
}
+ /* add polygon offset so we draw above the original surface */
+ glPolygonOffset(1.0, 1.0);
+
+ glEnable(GL_BLEND);
+ glColor4f(0.0, 1.0, 1.0, 0.2);
GPU_facemap_setup(dm);
- dm->drawFacesSolid(dm, NULL, 0, NULL);
+ if (dm->drawObject->facemapindices->use_vbo)
+ glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT,
+ (GLubyte *)NULL + dm->drawObject->facemap_start[facemap] * 3 * sizeof(float));
+ else
+ glDrawElements(GL_TRIANGLES, dm->drawObject->facemap_count[facemap] * 3, GL_UNSIGNED_INT,
+ (GLubyte *)dm->drawObject->facemapindices->pointer + dm->drawObject->facemap_start[facemap] * 3 * sizeof(float));
+ glDisable(GL_BLEND);
GPU_buffer_unbind();
+
+ glPolygonOffset(0.0, 0.0);
if (dm) dm->release(dm);
}
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index ccd2c64..d4b5289 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1337,7 +1337,20 @@ void GPU_facemap_setup(DerivedMesh *dm)
{
if (!gpu_buffer_setup_common(dm, GPU_BUFFER_FACEMAP))
return;
+
+ if (!gpu_buffer_setup_common(dm, GPU_BUFFER_VERTEX))
+ return;
+ glEnableClientState(GL_VERTEX_ARRAY);
+ if (dm->drawObject->points->use_vbo) {
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, dm->drawObject->points->id);
+ glVertexPointer(3, GL_FLOAT, 0, 0);
+ }
+ else {
+ glVertexPointer(3, GL_FLOAT, 0, dm->drawObject->points->pointer);
+ }
+
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
if (dm->drawObject->facemapindices->use_vbo) {
glBindBufferARB(GL_ARRAY_BUFFER_ARB, dm->drawObject->facemapindices->id);
}
More information about the Bf-blender-cvs
mailing list