Commit: 91ed7c270c3ed2525fed9d2d67950fc964a9b64a
Author: Antony Riakiotakis
Date:   Mon Dec 15 17:08:10 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB91ed7c270c3ed2525fed9d2d67950fc964a9b64a

Placeholder GPU functions to get GPU facemap index buffer. API should
allow a widget to draw a specific facemap bound to a mesh quickly.

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

M       source/blender/blenkernel/intern/customdata.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/editors/space_view3d/view3d_intern.h
M       source/blender/gpu/GPU_buffers.h
M       source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/intern/customdata.c 
b/source/blender/blenkernel/intern/customdata.c
index 0343529..17fdd3b 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1238,33 +1238,33 @@ static const char *LAYERTYPENAMES[CD_NUMTYPES] = {
 
 
 const CustomDataMask CD_MASK_BAREMESH =
-    CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MLOOP | 
CD_MASK_MPOLY | CD_MASK_BWEIGHT;
+    CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE | CD_MASK_MLOOP | 
CD_MASK_MPOLY | CD_MASK_BWEIGHT | CD_MASK_FACEMAP;
 const CustomDataMask CD_MASK_MESH =
     CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE |
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MCOL |
     CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP |
     CD_MASK_MTEXPOLY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP;
 const CustomDataMask CD_MASK_EDITMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV |
     CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR |
     CD_MASK_MDISPS | CD_MASK_SHAPEKEY | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FACEMAP;
 const CustomDataMask CD_MASK_DERIVEDMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | 
CD_MASK_PREVIEW_MLOOPCOL |
     CD_MASK_PROP_STR | CD_MASK_ORIGSPACE | CD_MASK_ORIGSPACE_MLOOP | 
CD_MASK_ORCO | CD_MASK_TANGENT |
     CD_MASK_PREVIEW_MCOL | CD_MASK_SHAPEKEY | CD_MASK_RECAST |
-    CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE;
+    CD_MASK_ORIGINDEX | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP;
 const CustomDataMask CD_MASK_BMESH =
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | 
CD_MASK_PROP_INT |
     CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | 
CD_MASK_MDISPS |
     CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN | CD_MASK_FREESTYLE_EDGE | 
CD_MASK_FREESTYLE_FACE | CD_MASK_FACEMAP;
 const CustomDataMask CD_MASK_FACECORNERS =  /* XXX Not used anywhere! */
     CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
     CD_MASK_MLOOPCOL | CD_MASK_NORMAL | CD_MASK_MLOOPTANGENT;
@@ -1279,7 +1279,7 @@ const CustomDataMask CD_MASK_EVERYTHING =
     /* BMESH ONLY END */
     CD_MASK_PAINT_MASK | CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN |
     CD_MASK_FREESTYLE_EDGE | CD_MASK_FREESTYLE_FACE |
-    CD_MASK_MLOOPTANGENT | CD_MASK_TESSLOOPNORMAL;
+    CD_MASK_MLOOPTANGENT | CD_MASK_TESSLOOPNORMAL | CD_MASK_FACEMAP;
 
 static const LayerTypeInfo *layerType_getInfo(int type)
 {
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index a63b166..f8e1781 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -8181,6 +8181,23 @@ 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))
+{
+       DerivedMesh *dm = NULL;
+       
+       dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+       DM_update_materials(dm, ob);
+
+       if (dm) {
+               glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
+       }
+       
+       dm->drawFacesSolid(dm, NULL, 0, NULL);
+       
+       if (dm) dm->release(dm);
+}
+
+
 void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, 
Object *ob, const char dt, int outline)
 {
        if (ob == NULL)
diff --git a/source/blender/editors/space_view3d/view3d_intern.h 
b/source/blender/editors/space_view3d/view3d_intern.h
index d3a9f5c..fbc701a 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -136,6 +136,7 @@ void draw_motion_paths_cleanup(View3D *v3d);
 void draw_object(Scene *scene, struct ARegion *ar, View3D *v3d, Base *base, 
const short dflag);
 bool draw_glsl_material(Scene *scene, struct Object *ob, View3D *v3d, const 
char dt);
 void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, 
struct Object *ob, const char dt, int outline);
+void draw_object_facemap(Scene *scene, struct Object *ob, int UNUSED_facemap);
 void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, 
struct Object *ob);
 void drawaxes(float size, char drawtype);
 
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index e9b600a..308d4cf 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -90,6 +90,7 @@ typedef struct GPUDrawObject {
        GPUBuffer *colors;
        GPUBuffer *edges;
        GPUBuffer *uvedges;
+       GPUBuffer *facemapindices;
 
        /* for each triangle, the original MFace index */
        int *triangle_to_mface;
@@ -115,6 +116,10 @@ typedef struct GPUDrawObject {
        /* caches of the original DerivedMesh values */
        int totvert;
        int totedge;
+
+       int totfacemaps;    /* total facemaps */
+       int *facemap_start; /* beginning of facemap */
+       int *facemap_count; /* elements per facemap */
 } GPUDrawObject;
 
 /* used for GLSL materials */
diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index 8ac629d..4a979c8 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -942,6 +942,8 @@ static void GPU_buffer_copy_edge(DerivedMesh *dm, float 
*varray_, int *UNUSED(in
 
        medge = dm->getEdgeArray(dm);
        totedge = dm->getNumEdges(dm);
+       
+       /* two passes, one to count number of faces per facemap, one to 
actually copy the data */
 
        for (i = 0; i < totedge; i++, medge++) {
                varray[i * 2] = 
dm->drawObject->vert_points[medge->v1].point_index;
@@ -983,6 +985,29 @@ 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);
+       unsigned int *varray = (unsigned int *)varray_;
+       int i, totface;
+       MFace *f = dm->getTessFaceArray(dm);
+
+       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;                     
+               
+               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;
+               }
+       }
+}
+
+
 typedef enum {
        GPU_BUFFER_VERTEX = 0,
        GPU_BUFFER_NORMAL,
@@ -991,6 +1016,7 @@ typedef enum {
        GPU_BUFFER_UV_TEXPAINT,
        GPU_BUFFER_EDGE,
        GPU_BUFFER_UVEDGE,
+       GPU_BUFFER_FACEMAP,
 } GPUBufferType;
 
 typedef struct {
@@ -1006,7 +1032,8 @@ const GPUBufferTypeSettings gpu_buffer_type_settings[] = {
        {GPU_buffer_copy_uv, GL_ARRAY_BUFFER_ARB, 2},
     {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_uvedge, GL_ELEMENT_ARRAY_BUFFER_ARB, 4},
+       {GPU_buffer_copy_facemap, GL_ELEMENT_ARRAY_BUFFER_ARB, 2}
 };
 
 /* get the GPUDrawObject buffer associated with a type */
@@ -1027,6 +1054,8 @@ static GPUBuffer 
**gpu_drawobject_buffer_from_type(GPUDrawObject *gdo, GPUBuffer
                        return &gdo->edges;
                case GPU_BUFFER_UVEDGE:
                        return &gdo->uvedges;
+               case GPU_BUFFER_FACEMAP:
+                       return &gdo->facemapindices;
                default:
                        return NULL;
        }
@@ -1055,6 +1084,8 @@ static int gpu_buffer_size_from_type(DerivedMesh *dm, 
GPUBufferType type)
                         * less so here we can over allocate and assume all
                         * tris. */
                        return sizeof(float) * 4 * 
dm->drawObject->tot_triangle_point;
+               case GPU_BUFFER_FACEMAP:
+                       return sizeof(int) * 3 * 
dm->drawObject->tot_triangle_point;
                default:
                        return -1;
        }

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

Reply via email to