[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