[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