[Bf-blender-cvs] [4887f7b] wiggly-widgets: Fixes to facemaps:
Antony Riakiotakis
noreply at git.blender.org
Wed Dec 17 16:42:57 CET 2014
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. @@
More information about the Bf-blender-cvs
mailing list