[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35967] branches/bmesh/blender/source/ blender: =bmesh=
Joseph Eagar
joeedh at gmail.com
Sun Apr 3 02:25:02 CEST 2011
Revision: 35967
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35967
Author: joeedh
Date: 2011-04-03 00:25:01 +0000 (Sun, 03 Apr 2011)
Log Message:
-----------
=bmesh=
Implemented the solidify modifier (but
not the editmode tool, yet).
Modified Paths:
--------------
branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/bvhutils.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -581,6 +581,7 @@
if(tree != NULL)
{
/* XXX, for snap only, em & dm are assumed to be aligned, since dm is the em's cage */
+#if 0 //BMESH_TODO
EditMesh *em= data->em_evil;
if(em) {
EditFace *efa= em->faces.first;
@@ -596,6 +597,9 @@
BLI_bvhtree_insert(tree, i, co[0], face[i].v4 ? 4 : 3);
}
}
+#else
+ if (0) {
+#endif
}
else {
for(i = 0; i < numFaces; i++) {
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -1221,6 +1221,7 @@
}
data->totsize = offset;
+ customData_update_typemap(data);
}
int CustomData_get_layer_index(const CustomData *data, int type)
@@ -1666,10 +1667,10 @@
if (i != j)
data->layers[j] = data->layers[i];
-
- if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY)
+
+ if ((layer->flag & CD_FLAG_TEMPORARY) == CD_FLAG_TEMPORARY) {
customData_free_layer__internal(layer, totelem);
- else
+ } else
j++;
}
Modified: branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/shrinkwrap.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -599,7 +599,9 @@
}
//free memory
- if(ss_mesh)
+ if(ss_mesh) {
+ ss_mesh->needsFree = 1;
ss_mesh->release(ss_mesh);
+ }
}
Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_multires.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -82,7 +82,7 @@
if(mmd->totlvl) {
if(!CustomData_get_layer(&me->ldata, CD_MDISPS)) {
/* multires always needs a displacement layer */
- CustomData_add_layer(&me->fdata, CD_MDISPS, CD_CALLOC, NULL, me->totface);
+ CustomData_add_layer(&me->ldata, CD_MDISPS, CD_CALLOC, NULL, me->totloop);
}
}
Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_ngoninterp.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -90,11 +90,16 @@
int *origv = NULL, *origf = NULL, *of, *ov;
BLI_array_declare(origv);
BLI_array_declare(origf);
+ DerivedMesh *copy = NULL;
int i;
if (nmd->resolution <= 0)
return dm;
+ if (!CDDM_Check(dm)) {
+ dm = copy = CDDM_copy(dm, 0);
+ }
+
CDDM_recalc_tesselation(dm, 0);
mf = dm->getTessFaceArray(dm);
@@ -291,6 +296,12 @@
dummy->needsFree = 1;
dummy->release(dummy);
+ if (copy) {
+ copy->needsFree = 1;
+ copy->release(dm);
+ copy = copy;
+ }
+
return cddm;
}
Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c 2011-04-02 21:51:05 UTC (rev 35966)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c 2011-04-03 00:25:01 UTC (rev 35967)
@@ -40,6 +40,8 @@
#include "BLI_math.h"
#include "BLI_edgehash.h"
#include "BLI_utildefines.h"
+#include "BLI_array.h"
+#include "BLI_smallhash.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_mesh.h"
@@ -59,7 +61,8 @@
static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
{
int i, numVerts, numEdges, numFaces;
- MFace *mface, *mf;
+ MPoly *mpoly, *mp;
+ MLoop *mloop, *ml;
MVert *mvert, *mv;
float (*face_nors)[3];
@@ -69,9 +72,10 @@
numVerts = dm->getNumVerts(dm);
numEdges = dm->getNumEdges(dm);
numFaces = dm->getNumFaces(dm);
- mface = dm->getTessFaceArray(dm);
+ mpoly = CDDM_get_polys(dm);
mvert = dm->getVertArray(dm);
-
+ mloop = CDDM_get_loops(dm);
+
/* we don't want to overwrite any referenced layers */
/*
@@ -80,14 +84,14 @@
cddm->mvert = mv;
*/
- face_nors = CustomData_get_layer(&dm->faceData, CD_NORMAL);
+ face_nors = CustomData_get_layer(&dm->polyData, CD_NORMAL);
if(!face_nors) {
calc_face_nors = 1;
- face_nors = CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_CALLOC, NULL, numFaces);
+ face_nors = CustomData_add_layer(&dm->polyData, CD_NORMAL, CD_CALLOC, NULL, numFaces);
}
mv = mvert;
- mf = mface;
+ mp = mpoly;
{
EdgeHash *edge_hash = BLI_edgehash_new();
@@ -110,27 +114,19 @@
edge_ref->f2=i; \
}
- for(i = 0; i < numFaces; i++, mf++) {
+ for(i = 0; i < numFaces; i++, mp++) {
+ int j;
+
f_no = face_nors[i];
+ if(calc_face_nors)
+ mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, f_no);
- if(mf->v4) {
- if(calc_face_nors)
- normal_quad_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co, mv[mf->v4].co);
-
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2);
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3);
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v4);
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v4, mf->v1);
- } else {
- if(calc_face_nors)
- normal_tri_v3(f_no, mv[mf->v1].co, mv[mf->v2].co, mv[mf->v3].co);
-
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v1, mf->v2);
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v2, mf->v3);
- NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(mf->v3, mf->v1);
+ ml = mloop + mp->loopstart;
+ for (j=0; j<mp->totloop; j++) {
+ NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml[j].v, ml[(j+1)%mp->totloop].v);
}
}
-
+
for(edge_iter = BLI_edgehashIterator_new(edge_hash); !BLI_edgehashIterator_isDone(edge_iter); BLI_edgehashIterator_step(edge_iter)) {
/* Get the edge vert indices, and edge value (the face indices that use it)*/
BLI_edgehashIterator_getKey(edge_iter, (int*)&ed_v1, (int*)&ed_v2);
@@ -196,7 +192,6 @@
return dataMask;
}
-
static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
DerivedMesh *dm,
int UNUSED(useRenderParams),
@@ -206,20 +201,22 @@
DerivedMesh *result, *copy;
const SolidifyModifierData *smd = (SolidifyModifierData*) md;
- MFace *mf, *mface, *orig_mface;
+ MVert *mv, *mvert, *orig_mvert;
MEdge *ed, *medge, *orig_medge;
- MVert *mv, *mvert, *orig_mvert;
-
+ MLoop *ml, *mloop, *orig_mloop;
+ MPoly *mp, *mpoly, *orig_mpoly;
const int numVerts = dm->getNumVerts(dm);
const int numEdges = dm->getNumEdges(dm);
const int numFaces = dm->getNumFaces(dm);
-
+ int numLoops=0, newLoops=0, newFaces=0, newEdges=0;
+ int j;
+
/* use for edges */
int *new_vert_arr= NULL;
- int newFaces = 0;
-
+ BLI_array_declare(new_vert_arr);
int *new_edge_arr= NULL;
- int newEdges = 0;
+ BLI_array_declare(new_edge_arr);
+ int *old_vert_arr = MEM_callocN(sizeof(int)*numVerts, "old_vert_arr in solidify");
int *edge_users= NULL;
char *edge_order= NULL;
@@ -236,11 +233,22 @@
if (defgrp_index >= 0)
dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+
+ if (!CDDM_Check(dm)) {
+ DerivedMesh *dm2 = CDDM_copy(dm, 0);
+ dm->needsFree = 1;
+ dm->release(dm);
+ dm = dm2;
+ }
+
+ numLoops = dm->numLoopData;
+ newLoops = 0;
+
+ orig_mvert = CDDM_get_verts(dm);
+ orig_medge = CDDM_get_edges(dm);
+ orig_mloop = CDDM_get_loops(dm);
+ orig_mpoly = CDDM_get_polys(dm);
- orig_mface = dm->getTessFaceArray(dm);
- orig_medge = dm->getEdgeArray(dm);
- orig_mvert = dm->getVertArray(dm);
-
if(smd->flag & MOD_SOLIDIFY_RIM) {
EdgeHash *edgehash = BLI_edgehash_new();
EdgeHashIterator *ehi;
@@ -272,28 +280,20 @@
edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges");
edge_order= MEM_mallocN(sizeof(char) * numEdges, "solid_mod eorder");
memset(edge_users, INVALID_UNUSED, sizeof(int) * numEdges);
-
- for(i=0, mf=orig_mface; i<numFaces; i++, mf++) {
- if(mf->v4) {
- ADD_EDGE_USER(mf->v1, mf->v2, 0);
- ADD_EDGE_USER(mf->v2, mf->v3, 1);
- ADD_EDGE_USER(mf->v3, mf->v4, 2);
- ADD_EDGE_USER(mf->v4, mf->v1, 3);
- }
- else {
- ADD_EDGE_USER(mf->v1, mf->v2, 0);
- ADD_EDGE_USER(mf->v2, mf->v3, 1);
- ADD_EDGE_USER(mf->v3, mf->v1, 2);
- }
+
+ for (i=0, mp=orig_mpoly; i<numFaces; i++, mp++) {
+ MLoop *ml;
+
+ for (ml=orig_mloop + mp->loopstart, j=0; j<mp->totloop; ml++, j++) {
+ MLoop *ml2 = orig_mloop + mp->loopstart + (j+1)%mp->totloop;
+ ADD_EDGE_USER(ml->v, ml2->v, j);
+ }
}
#undef ADD_EDGE_USER
#undef INVALID_UNUSED
#undef INVALID_PAIR
-
- new_edge_arr= MEM_callocN(sizeof(int) * numEdges, "solid_mod arr");
-
ehi= BLI_edgehashIterator_new(edgehash);
for(; !BLI_edgehashIterator_isDone(ehi); BLI_edgehashIterator_step(ehi)) {
eidx= GET_INT_FROM_POINTER(BLI_edgehashIterator_getValue(ehi));
@@ -301,18 +301,17 @@
BLI_edgehashIterator_getKey(ehi, &v1, &v2);
orig_mvert[v1].flag |= ME_VERT_TMP_TAG;
orig_mvert[v2].flag |= ME_VERT_TMP_TAG;
- new_edge_arr[newFaces]= eidx;
+ BLI_array_append(new_edge_arr, eidx);
newFaces++;
+ newLoops += 4;
}
}
BLI_edgehashIterator_free(ehi);
-
-
- new_vert_arr= MEM_callocN(sizeof(int) * numVerts, "solid_mod new_varr");
for(i=0, mv=orig_mvert; i<numVerts; i++, mv++) {
if(mv->flag & ME_VERT_TMP_TAG) {
- new_vert_arr[newEdges] = i;
+ old_vert_arr[i] = BLI_array_count(new_vert_arr);
+ BLI_array_append(new_vert_arr, i);
newEdges++;
mv->flag &= ~ME_VERT_TMP_TAG;
@@ -327,40 +326,49 @@
dm_calc_normal(dm, vert_nors);
}
- result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces, 0, 0);
+ result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, 0, (numLoops*2) + newLoops, (numFaces * 2) + newFaces);
- mface = result->getTessFaceArray(result);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list