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);
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to