[Bf-blender-cvs] [bc99082] wiggly-widgets: Add code that copies sorted per facemap vertex indices to a VBO buffer

Antony Riakiotakis noreply at git.blender.org
Tue Dec 16 19:36:15 CET 2014


Commit: bc99082e45c6248e510f1fafebe54df0771523c6
Author: Antony Riakiotakis
Date:   Tue Dec 16 19:35:57 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBbc99082e45c6248e510f1fafebe54df0771523c6

Add code that copies sorted per facemap vertex indices to a VBO buffer

===================================================================

M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/gpu/GPU_buffers.h
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 f8e1781..0f2c6e1 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -87,6 +87,7 @@
 #include "GPU_draw.h"
 #include "GPU_extensions.h"
 #include "GPU_select.h"
+#include "GPU_buffers.h"
 
 #include "ED_mesh.h"
 #include "ED_particle.h"
@@ -8192,7 +8193,9 @@ void draw_object_facemap(Scene *scene, struct Object *ob, int UNUSED(facemap))
 		glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
 	}
 	
+	GPU_facemap_setup(dm);
 	dm->drawFacesSolid(dm, NULL, 0, NULL);
+	GPU_buffer_unbind();
 	
 	if (dm) dm->release(dm);
 }
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index dad6ff8..69e1ddd 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -162,6 +162,7 @@ void GPU_texpaint_uv_setup(struct DerivedMesh *dm);
 void GPU_color_setup(struct DerivedMesh *dm, int colType);
 void GPU_edge_setup(struct DerivedMesh *dm); /* does not mix with other data */
 void GPU_uvedge_setup(struct DerivedMesh *dm);
+void GPU_facemap_setup(struct DerivedMesh *dm);
 int GPU_attrib_element_size(GPUAttrib data[], int numdata);
 void GPU_interleaved_attrib_setup(GPUBuffer *buffer, GPUAttrib data[], int numdata);
 
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index b1888da..ccd2c64 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -94,7 +94,7 @@ const GPUBufferTypeSettings gpu_buffer_type_settings[] = {
     {GPU_buffer_copy_uv_texpaint, GL_ARRAY_BUFFER_ARB, 4},
 	{GPU_buffer_copy_edge, GL_ELEMENT_ARRAY_BUFFER_ARB, 2},
 	{GPU_buffer_copy_uvedge, GL_ELEMENT_ARRAY_BUFFER_ARB, 4},
-	{GPU_buffer_copy_facemap, GL_ELEMENT_ARRAY_BUFFER_ARB, 4}
+	{GPU_buffer_copy_facemap, GL_ELEMENT_ARRAY_BUFFER_ARB, 3}
 };
 
 #define MAX_GPU_ATTRIB_DATA 32
@@ -1026,24 +1026,59 @@ static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(i
 
 static void GPU_buffer_copy_facemap(DerivedMesh *dm, float *varray_, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user))
 {
-	int *facemap = DM_get_tessface_data_layer(dm, CD_FACEMAP);
+	GPUDrawObject *gdo = dm->drawObject;
+	int *facemap_iter, *facemap = DM_get_tessface_data_layer(dm, CD_FACEMAP);
 	unsigned int *varray = (unsigned int *)varray_;
-	int i, totface;
+	int i, totface, offset = 0;
 	MFace *f = dm->getTessFaceArray(dm);
-
+	int *facemap_offset;
+	
 	totface = dm->getNumTessFaces(dm);
 
-	for (i = 0; i < totface; i++, facemap++, f++) {
-		varray[i * 2] = dm->drawObject->vert_points[f->v1].point_index;
-		varray[i * 2 + 1] = dm->drawObject->vert_points[f->v2].point_index;
-		varray[i * 2 + 2] = dm->drawObject->vert_points[f->v3].point_index;			
+	gdo->totfacemaps = 0;
+	
+	facemap_iter = facemap;
+	
+	/* pretty crappy to iterate so many times but it's only being done on creation */
+	for (i = 0; i < totface; i++, facemap_iter++, f++) {
+		gdo->totfacemaps = max_ii(*facemap_iter, gdo->totfacemaps);
+	}
+
+	gdo->totfacemaps++;
+	gdo->facemap_start = MEM_callocN(gdo->totfacemaps * sizeof(*gdo->facemap_start), "GDO_facemap_start");
+	gdo->facemap_count = MEM_callocN(gdo->totfacemaps * sizeof(*gdo->facemap_count), "GDO_facemap_count");
+	facemap_offset = MEM_callocN(gdo->totfacemaps * sizeof(*facemap_offset), "facemap_offset");
+	
+	facemap_iter = facemap;
+	for (i = 0; i < totface; i++, facemap_iter++, f++) {
+		gdo->facemap_count[*facemap_iter] += (f->v4) ? 6 : 3;
+	}
+	
+	for (i = 0; i < gdo->totfacemaps; i++) {
+		gdo->facemap_start[i] = offset;
+		offset += gdo->facemap_count[i];
+	}
+	
+	facemap_iter = facemap;
+	for (i = 0; i < totface; i++, facemap_iter++, f++) {
+		int fmap_offset = (gdo->facemap_start[*facemap_iter] + facemap_offset[*facemap_iter]) * 3;
+		
+		varray[fmap_offset] = gdo->vert_points[f->v1].point_index;
+		varray[fmap_offset + 1] = gdo->vert_points[f->v2].point_index;
+		varray[fmap_offset + 2] = gdo->vert_points[f->v3].point_index;
+		
+		facemap_offset[*facemap_iter] += 3;
 		
 		if (f->v4) {
-			varray[i * 2 + 3] = dm->drawObject->vert_points[f->v3].point_index;
-			varray[i * 2 + 4] = dm->drawObject->vert_points[f->v4].point_index;
-			varray[i * 2 + 5] = dm->drawObject->vert_points[f->v1].point_index;
+			varray[fmap_offset + 3] = dm->drawObject->vert_points[f->v3].point_index;
+			varray[fmap_offset + 4] = dm->drawObject->vert_points[f->v4].point_index;
+			varray[fmap_offset + 5] = dm->drawObject->vert_points[f->v1].point_index;
+
+			facemap_offset[*facemap_iter] += 3;
 		}
 	}
+	
+	MEM_freeN(facemap_offset);
 }
 
 /* get the GPUDrawObject buffer associated with a type */
@@ -1298,6 +1333,19 @@ void GPU_uvedge_setup(DerivedMesh *dm)
 	GLStates |= GPU_BUFFER_VERTEX_STATE;
 }
 
+void GPU_facemap_setup(DerivedMesh *dm)
+{
+	if (!gpu_buffer_setup_common(dm, GPU_BUFFER_FACEMAP))
+		return;
+
+	if (dm->drawObject->facemapindices->use_vbo) {
+		glBindBufferARB(GL_ARRAY_BUFFER_ARB, dm->drawObject->facemapindices->id);
+	}
+	
+	GLStates |= GPU_BUFFER_ELEMENT_STATE;
+}
+
+
 static int GPU_typesize(int type)
 {
 	switch (type) {




More information about the Bf-blender-cvs mailing list