Commit: 4887f7b48cbd10faa01fa405748be93d8bee3896
Author: Antony Riakiotakis
Date:   Wed Dec 17 16:42:36 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB4887f7b48cbd10faa01fa405748be93d8bee3896

Fixes to facemaps:

* Test display code that displays the active facemap. Will not work on
subsurf modifier yet (crash)
* Fix loading of files with facemaps
* Facemap data now reside on polys instead of tessfaces.

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

M       source/blender/blenkernel/BKE_DerivedMesh.h
M       source/blender/blenkernel/intern/customdata.c
M       source/blender/blenloader/intern/writefile.c
M       source/blender/editors/object/object_fmap.c
M       source/blender/editors/space_view3d/drawobject.c
M       source/blender/gpu/intern/gpu_buffers.c

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

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h 
b/source/blender/blenkernel/BKE_DerivedMesh.h
index 8b801d7..9fd083a 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -187,7 +187,8 @@ struct DerivedMesh {
        DerivedMeshType type;
        float auto_bump_scale;
        DMDirtyFlag dirty;
-       int totmat; /* total materials. Will be valid only before object 
drawing. */
+       short totfmaps;
+       short totmat; /* total materials. Will be valid only before object 
drawing. */
        struct Material **mat; /* material array. Will be valid only before 
object drawing */
 
        /* use for converting to BMesh which doesn't store bevel weight and 
edge crease by default */
diff --git a/source/blender/blenkernel/intern/customdata.c 
b/source/blender/blenkernel/intern/customdata.c
index 17fdd3b..06c5e60 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1216,8 +1216,8 @@ static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
        {sizeof(float[4]), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
        /* 40: CD_TESSLOOPNORMAL */
        {sizeof(short[4][3]), "", 0, NULL, NULL, NULL, NULL, layerSwap_flnor, 
NULL},
-       /* 41: CD_MASK_FACEMAP */
-       {sizeof(int), "", 1, NULL, NULL, NULL, NULL, NULL, layerDefault_fmap, 
NULL},
+       /* 41: CD_FACEMAP */
+       {sizeof(int), "", 0, NULL, NULL, NULL, NULL, NULL, layerDefault_fmap, 
NULL},
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
diff --git a/source/blender/blenloader/intern/writefile.c 
b/source/blender/blenloader/intern/writefile.c
index 202cd40..b4fcbed 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1910,6 +1910,10 @@ static void write_customdata(WriteData *wd, ID *id, int 
count, CustomData *data,
                else if (layer->type == CD_GRID_PAINT_MASK) {
                        write_grid_paint_mask(wd, count, layer->data);
                }
+               else if (layer->type == CD_FACEMAP) {
+                       const int *layer_data = layer->data;
+                       writedata(wd, DATA, sizeof(*layer_data) * count, 
layer_data);
+               }
                else {
                        CustomData_file_write_info(layer->type, &structname, 
&structnum);
                        if (structnum) {
diff --git a/source/blender/editors/object/object_fmap.c 
b/source/blender/editors/object/object_fmap.c
index 046be79..ce76b9e 100644
--- a/source/blender/editors/object/object_fmap.c
+++ b/source/blender/editors/object/object_fmap.c
@@ -130,8 +130,8 @@ void ED_fmap_face_add(Object *ob, bFaceMap *fmap, int 
facenum)
                Mesh *me = ob->data;
                
                /* if there's is no facemap layer then create one */
-               if ((facemap = CustomData_get_layer(&me->fdata, CD_FACEMAP)) == 
NULL)
-                       facemap = CustomData_add_layer(&me->fdata, CD_FACEMAP, 
CD_DEFAULT, NULL, me->totface);
+               if ((facemap = CustomData_get_layer(&me->pdata, CD_FACEMAP)) == 
NULL)
+                       facemap = CustomData_add_layer(&me->pdata, CD_FACEMAP, 
CD_DEFAULT, NULL, me->totpoly);
 
                facemap[facenum] = fmap_nr;
        }
@@ -152,7 +152,7 @@ void ED_fmap_face_remove(Object *ob, bFaceMap *fmap, int 
facenum)
                Mesh *me = ob->data;
                
                /* if there's is no facemap layer then create one */
-               if ((facemap = CustomData_get_layer(&me->fdata, CD_FACEMAP)) == 
NULL)
+               if ((facemap = CustomData_get_layer(&me->pdata, CD_FACEMAP)) == 
NULL)
                        return;
                
                facemap[facenum] = -1;
@@ -219,11 +219,11 @@ static void object_fmap_swap_object_mode(Object *ob, int 
num1, int num2)
                Mesh *me = ob->data;
                
                if (me->mface) {
-                       int *map = CustomData_get_layer(&me->fdata, CD_FACEMAP);
+                       int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
                        int i;
                        
                        if (map) {
-                               for (i = 0; i < me->totface; i++) {
+                               for (i = 0; i < me->totpoly; i++) {
                                        if (map[i] == num1 && num1 != -1)
                                                map[i] = num2;
                                        if (map[i]== num2 && num2 != -1)
@@ -284,11 +284,11 @@ static void object_fmap_remove_object_mode(Object *ob, 
bFaceMap *fmap)
                Mesh *me = ob->data;
                
                if (me->mface) {
-                       int *map = CustomData_get_layer(&me->fdata, CD_FACEMAP);
+                       int *map = CustomData_get_layer(&me->pdata, CD_FACEMAP);
                        int i;
                        
                        if (map) {
-                               for (i = 0; i < me->totface; i++) {
+                               for (i = 0; i < me->totpoly; i++) {
                                        if (map[i] == fmap_nr)
                                                map[i] = -1;
                                }
@@ -332,7 +332,7 @@ void BKE_object_fmap_remove_all(Object *ob)
        /* remove all dverts */
        if (ob->type == OB_MESH) {
                Mesh *me = ob->data;
-               CustomData_free_layer(&me->fdata, CD_FACEMAP, me->totface, 0);
+               CustomData_free_layer(&me->pdata, CD_FACEMAP, me->totpoly, 0);
        }
        ob->actfmap = 0;
 }
diff --git a/source/blender/editors/space_view3d/drawobject.c 
b/source/blender/editors/space_view3d/drawobject.c
index 22ca908..7cdeee8 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -8190,30 +8190,36 @@ void draw_object_facemap(Scene *scene, struct Object 
*ob, int facemap)
        DerivedMesh *dm = NULL;
        
        dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
+       if (!dm || !CustomData_has_layer(&dm->polyData, CD_FACEMAP))
+               return;
+       
        DM_update_materials(dm, ob);
 
-       if (dm) {
-               glFrontFace((ob->transflag & OB_NEG_SCALE) ? GL_CW : GL_CCW);
-       }
+       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);
+       dm->totfmaps = BLI_listbase_count(&ob->fmaps);
+       
        GPU_facemap_setup(dm);
+
+       glPushAttrib(GL_ENABLE_BIT);
+       glEnable(GL_BLEND);
+       glDisable(GL_LIGHTING);
+       glColor4f(0.7, 1.0, 1.0, 0.5);
        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));
+               glDrawElements(GL_TRIANGLES, 
dm->drawObject->facemap_count[facemap], GL_UNSIGNED_INT, 
+                              (int *)NULL + 
dm->drawObject->facemap_start[facemap]);
        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);
+               glDrawElements(GL_TRIANGLES, 
dm->drawObject->facemap_count[facemap], GL_UNSIGNED_INT,
+                              (int *)dm->drawObject->facemapindices->pointer + 
dm->drawObject->facemap_start[facemap]);
+       glPopAttrib();
+
        GPU_buffer_unbind();
 
        glPolygonOffset(0.0, 0.0);
-       
-       if (dm) dm->release(dm);
+       dm->release(dm);
 }
 
 
diff --git a/source/blender/gpu/intern/gpu_buffers.c 
b/source/blender/gpu/intern/gpu_buffers.c
index 0740472..2cacca8 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -600,6 +600,10 @@ void GPU_drawobject_free(DerivedMesh *dm)
                MEM_freeN(gdo->triangle_to_mface);
        if (gdo->vert_points)
                MEM_freeN(gdo->vert_points);
+       if (gdo->facemap_count)
+               MEM_freeN(gdo->facemap_count);
+       if (gdo->facemap_start)
+               MEM_freeN(gdo->facemap_start);
 #ifdef USE_GPU_POINT_LINK
        MEM_freeN(gdo->vert_points_mem);
 #endif
@@ -610,6 +614,7 @@ void GPU_drawobject_free(DerivedMesh *dm)
        GPU_buffer_free(gdo->colors);
        GPU_buffer_free(gdo->edges);
        GPU_buffer_free(gdo->uvedges);
+       GPU_buffer_free(gdo->facemapindices);
 
        MEM_freeN(gdo);
        dm->drawObject = NULL;
@@ -1027,31 +1032,27 @@ 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))
 {
        GPUDrawObject *gdo = dm->drawObject;
-       int *facemap_iter, *facemap = DM_get_tessface_data_layer(dm, 
CD_FACEMAP);
+       int facemap;
+       int *facemap_po = CustomData_get_layer(&dm->polyData, CD_FACEMAP);
        unsigned int *varray = (unsigned int *)varray_;
        int i, totface, offset = 0;
-       MFace *f = dm->getTessFaceArray(dm);
+       MFace *f, *f_base = dm->getTessFaceArray(dm);
        int *facemap_offset;
+       int *orig_index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
        
        totface = dm->getNumTessFaces(dm);
 
-       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 = dm->totfmaps;
 
-       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;
+       f = f_base;
+       for (i = 0; i < totface; i++, f++) {
+               facemap = facemap_po[orig_index[i]];
+               if (facemap != -1)
+                       gdo->facemap_count[facemap] += (f->v4) ? 6 : 3;
        }
        
        for (i = 0; i < gdo->totfacemaps; i++) {
@@ -1059,22 +1060,27 @@ static void GPU_buffer_copy_facemap(DerivedMesh *dm, 
float *varray_, int *UNUSED
                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;
+       f = f_base;
+       for (i = 0; i < totface; i++, f++) {
+               int fmap_offset;
+               facemap = facemap_po[orig_index[i]];
+
+               if (facemap == -1)
+                       continue;
+               fmap_offset = gdo->facemap_start[facemap] + 
facemap_offset[facemap];
                
                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;
+               facemap_offset[facemap] += 3;
                
                if (f->v4) {
                        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;
+                       facemap_offset[facemap] += 3;
                }
        }
        
@@ -1352,

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to