Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2006-11-20 07:28:02 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2006-11-20 07:28:02 +0300
commite435fbc3c5a00e5b63c1cd2609ab6828187660d3 (patch)
tree3f1da9c51451dee55a203cd001d37f8774d2582f /source/blender/src
parent0a7c43c6e5fc7d5d75a4645eca1164cede2d03a6 (diff)
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are still used of course, but allocating, copying or freeing these arrays should be done through the CustomData API. Work in progress documentation on this is here: http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData Replaced TFace by MTFace: This is the same struct, except that it does not contain color, that now always stays separated in MCol. This was not a good design decision to begin with, and it is needed for adding multiple color layers later. Note that this does mean older Blender versions will not be able to read UV coordinates from the next release, due to an SDNA limitation. Removed DispListMesh: This now fully replaced by DerivedMesh. To provide access to arrays of vertices, edges and faces, like DispListMesh does. The semantics of the DerivedMesh.getVertArray() and similar functions were changed to return a pointer to an array if one exists, or otherwise allocate a temporary one. On releasing the DerivedMesh, this temporary array will be removed automatically. Removed ssDM and meshDM DerivedMesh backends: The ssDM backend was for DispListMesh, so that became obsolete automatically. The meshDM backend was replaced by the custom data backend, that now figures out which layers need to be modified, and only duplicates those. This changes code in many places, and overall removes 2514 lines of code. So, there's a good chance this might break some stuff, although I've been testing it for a few days now. The good news is, adding multiple color and uv layers should now become easy.
Diffstat (limited to 'source/blender/src')
-rw-r--r--source/blender/src/booleanops.c70
-rw-r--r--source/blender/src/buttons_editing.c66
-rw-r--r--source/blender/src/drawimage.c37
-rw-r--r--source/blender/src/drawmesh.c66
-rw-r--r--source/blender/src/drawobject.c71
-rw-r--r--source/blender/src/drawview.c2
-rw-r--r--source/blender/src/editdeform.c14
-rw-r--r--source/blender/src/editface.c335
-rw-r--r--source/blender/src/editmesh.c139
-rw-r--r--source/blender/src/editmesh_lib.c12
-rw-r--r--source/blender/src/editmesh_mods.c25
-rw-r--r--source/blender/src/editmesh_tools.c70
-rw-r--r--source/blender/src/editobject.c31
-rw-r--r--source/blender/src/editsima.c110
-rw-r--r--source/blender/src/editview.c5
-rw-r--r--source/blender/src/filesel.c5
-rw-r--r--source/blender/src/fluidsim.c59
-rw-r--r--source/blender/src/header_view3d.c18
-rw-r--r--source/blender/src/imagepaint.c2
-rw-r--r--source/blender/src/meshtools.c154
-rw-r--r--source/blender/src/multires.c98
-rw-r--r--source/blender/src/poseobject.c5
-rw-r--r--source/blender/src/sculptmode.c50
-rw-r--r--source/blender/src/space.c2
-rwxr-xr-xsource/blender/src/transform_conversions.c13
-rw-r--r--source/blender/src/unwrapper.c24
-rw-r--r--source/blender/src/verse_mesh.c46
-rw-r--r--source/blender/src/verse_object.c10
-rw-r--r--source/blender/src/vpaint.c137
29 files changed, 729 insertions, 947 deletions
diff --git a/source/blender/src/booleanops.c b/source/blender/src/booleanops.c
index 11a3577ec0d..2b412eedb77 100644
--- a/source/blender/src/booleanops.c
+++ b/source/blender/src/booleanops.c
@@ -35,6 +35,8 @@
#include "MEM_guardedalloc.h"
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
#include "BLI_ghash.h"
#include "DNA_material_types.h"
@@ -47,6 +49,7 @@
#include "BKE_booleanops.h"
#include "BKE_cdderivedmesh.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
@@ -62,13 +65,6 @@
#include <math.h>
-// TODO check to see how many of these includes are necessary
-
-#include "BLI_blenlib.h"
-#include "BLI_arithb.h"
-#include "BLI_linklist.h"
-#include "BLI_memarena.h"
-
/**
* Here's the vertex iterator structure used to walk through
* the blender vertex structure.
@@ -286,23 +282,17 @@ static Object *AddNewBlenderMesh(Base *base)
return ob_new;
}
-/* editmode function, will be replaced soon once custom face data arrives */
-void interp_uv_vcol(float *v1, float *v2, float *v3, float *v4, float *co,
- TFace *tf, TFace *outtf, int j);
-
-static void ConvertCSGTFace(
+static void InterpCSGFace(
DerivedMesh *dm, Mesh *orig_me, int index, int orig_index, int nr,
- TFace *tface, TFace *orig_tface, float mapmat[][4])
+ float mapmat[][4])
{
- float obco[3], *co[4], *orig_co[4];
+ float obco[3], *co[4], *orig_co[4], w[4][4];
MFace *mface, *orig_mface;
int j;
mface = CDDM_get_face(dm, index);
orig_mface = orig_me->mface + orig_index;
- *tface = *orig_tface;
-
// get the vertex coordinates from the original mesh
orig_co[0] = (orig_me->mvert + orig_mface->v1)->co;
orig_co[1] = (orig_me->mvert + orig_mface->v2)->co;
@@ -322,9 +312,10 @@ static void ConvertCSGTFace(
else
VecCopyf(obco, co[j]);
- interp_uv_vcol(orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco,
- orig_tface, tface, j);
+ InterpWeightsQ3Dfl(orig_co[0], orig_co[1], orig_co[2], orig_co[3], obco, w[j]);
}
+
+ CustomData_interp(&orig_me->fdata, &dm->faceData, &orig_index, NULL, (float*)w, 1, index);
}
/* Iterate over the CSG Output Descriptors and create a new DerivedMesh
@@ -348,14 +339,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
// create a new DerivedMesh
dm = CDDM_new(vertex_it->num_elements, 0, face_it->num_elements);
- // add tface layers
- if (me1->mcol)
- mcol_to_tface(me1, 1);
- if (me2->mcol)
- mcol_to_tface(me2, 1);
-
- if (me1->tface || me2->tface)
- DM_add_face_layer(dm, LAYERTYPE_TFACE, 0, NULL);
+ CustomData_merge(&me1->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, CD_DEFAULT,
+ face_it->num_elements);
+ CustomData_merge(&me2->fdata, &dm->faceData, CD_MASK_DERIVEDMESH, CD_DEFAULT,
+ face_it->num_elements);
// step through the vertex iterators:
for (i = 0; !vertex_it->Done(vertex_it->it); i++) {
@@ -383,8 +370,7 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
Object *orig_ob;
Material *orig_mat;
CSG_IFace csgface;
- MFace *mface, *orig_mface;
- TFace *tface, *orig_tface;
+ MFace *mface;
int orig_index, mat_nr;
// retrieve a csg face from the boolean module
@@ -395,8 +381,9 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
orig_me = (csgface.orig_face < me1->totface)? me1: me2;
orig_ob = (orig_me == me1)? ob1: ob2;
orig_index = (orig_me == me1)? csgface.orig_face: csgface.orig_face - me1->totface;
- orig_mface = orig_me->mface + orig_index;
- orig_mat= give_current_material(orig_ob, orig_mface->mat_nr+1);
+
+ // copy all face layers, including mface
+ CustomData_copy_data(&orig_me->fdata, &dm->faceData, orig_index, i, 1);
// set mface
mface = CDDM_get_face(dm, i);
@@ -404,9 +391,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
mface->v2 = csgface.vertex_index[1];
mface->v3 = csgface.vertex_index[2];
mface->v4 = (csgface.vertex_number == 4)? csgface.vertex_index[3]: 0;
- mface->flag = orig_mface->flag;
// set material, based on lookup in hash table
+ orig_mat= give_current_material(orig_ob, mface->mat_nr+1);
+
if (mat && orig_mat) {
if (!BLI_ghash_haskey(material_hash, orig_mat)) {
mat[*totmat] = orig_mat;
@@ -419,24 +407,10 @@ static DerivedMesh *ConvertCSGDescriptorsToDerivedMesh(
else
mface->mat_nr = 0;
- // set tface
- if (me1->tface || me2->tface) {
- tface = DM_get_face_data(dm, i, LAYERTYPE_TFACE);;
-
- if (orig_me->tface) {
- orig_tface = orig_me->tface + orig_index;
-
- ConvertCSGTFace(dm, orig_me, i, orig_index,
- csgface.vertex_number, tface, orig_tface,
- (orig_me == me2)? mapmat: NULL);
- }
- else
- default_tface(tface);
- }
- else
- tface = NULL;
+ InterpCSGFace(dm, orig_me, i, orig_index, csgface.vertex_number,
+ (orig_me == me2)? mapmat: NULL);
- test_index_face(mface, NULL, tface, csgface.vertex_number);
+ test_index_face(mface, &dm->faceData, i, csgface.vertex_number);
}
if (material_hash)
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 7441fccd5bf..4a319791773 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -78,6 +78,7 @@
#include "BKE_blender.h"
#include "BKE_brush.h"
#include "BKE_curve.h"
+#include "BKE_customdata.h"
#include "BKE_colortools.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -705,9 +706,9 @@ static void editing_panel_mesh_type(Object *ob, Mesh *me)
}
else uiDefBut(block, BUT, B_DELVERTCOL, "Delete", 80,50,84,19, 0, 0, 0, 0, 0, "Deletes vertex colors on active Mesh");
- if(me->tface) val= 1.0; else val= 0.0;
+ if(me->mtface) val= 1.0; else val= 0.0;
uiDefBut(block, LABEL, 0, "TexFace", 10,30,70,20, 0, val, 0, 0, 0, "");
- if(me->tface==NULL) {
+ if(me->mtface==NULL) {
uiDefBut(block, BUT, B_MAKE_TFACES, "Make", 80,30,84,19, 0, 0, 0, 0, 0, "Enables the active Mesh's faces for UV coordinate mapping");
}
else uiDefBut(block, BUT, B_DEL_TFACES, "Delete", 80,30,84,19, 0, 0, 0, 0, 0, "Deletes UV coordinates for active Mesh's faces");
@@ -3547,9 +3548,10 @@ void do_meshbuts(unsigned short event)
switch(event) {
case B_DELSTICKY:
-
- if(me->msticky) MEM_freeN(me->msticky);
- me->msticky= NULL;
+ if(me->msticky) {
+ CustomData_free_layer(&me->vdata, CD_MSTICKY, me->totvert);
+ me->msticky= NULL;
+ }
allqueue(REDRAWBUTSEDIT, 0);
break;
case B_MAKESTICKY:
@@ -3559,35 +3561,44 @@ void do_meshbuts(unsigned short event)
case B_MAKEVERTCOL:
if(G.obedit)
- EM_add_data_layer(&G.editMesh->fdata, LAYERTYPE_MCOL);
+ EM_add_data_layer(&G.editMesh->fdata, CD_MCOL);
else
- make_vertexcol();
+ make_vertexcol(1);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
break;
case B_DELVERTCOL:
- if(G.obedit)
- EM_free_data_layer(&G.editMesh->fdata, LAYERTYPE_MCOL);
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= NULL;
+ if(G.obedit) {
+ EM_free_data_layer(&G.editMesh->fdata, CD_MCOL);
+ }
+ else {
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
+ me->mcol= NULL;
+ }
G.f &= ~G_VERTEXPAINT;
- freedisplist(&(ob->disp));
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
break;
case B_MAKE_TFACES:
if(G.obedit)
- EM_add_data_layer(&G.editMesh->fdata, LAYERTYPE_TFACE);
+ EM_add_data_layer(&G.editMesh->fdata, CD_MTFACE);
else
make_tfaces(me);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
break;
case B_DEL_TFACES:
- if(G.obedit)
- EM_free_data_layer(&G.editMesh->fdata, LAYERTYPE_TFACE);
- if(me->tface) MEM_freeN(me->tface);
- me->tface= 0;
+ if(G.obedit) {
+ EM_free_data_layer(&G.editMesh->fdata, CD_MTFACE);
+ }
+ else {
+ CustomData_free_layer(&me->fdata, CD_MTFACE, me->totface);
+ me->mtface= NULL;
+ }
G.f &= ~G_FACESELECT;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIMAGE, 0);
@@ -4170,7 +4181,8 @@ void do_fpaintbuts(unsigned short event)
Mesh *me;
Object *ob;
bDeformGroup *defGroup;
- TFace *activetf, *tf;
+ MTFace *activetf, *tf;
+ MCol *activemcol;
int a;
SculptData *sd= &G.scene->sculptdata;
ID *id, *idtest;
@@ -4191,11 +4203,11 @@ void do_fpaintbuts(unsigned short event)
case B_COPY_TF_UV:
case B_COPY_TF_COL:
case B_COPY_TF_TEX:
- me = get_mesh(OBACT);
- activetf = get_active_tface();
+ me= get_mesh(OBACT);
+ activetf= get_active_tface(&activemcol);
if(me && activetf) {
- for (a=0, tf=me->tface; a < me->totface; a++, tf++) {
+ for (a=0, tf=me->mtface; a < me->totface; a++, tf++) {
if(tf!=activetf && (tf->flag & TF_SELECT)) {
if(event==B_COPY_TF_MODE) {
tf->mode= activetf->mode;
@@ -4217,8 +4229,8 @@ void do_fpaintbuts(unsigned short event)
if(activetf->mode & TF_TILES) tf->mode |= TF_TILES;
else tf->mode &= ~TF_TILES;
}
- else if(event==B_COPY_TF_COL)
- memcpy(tf->col, activetf->col, sizeof(tf->col));
+ else if(event==B_COPY_TF_COL && activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*4);
}
}
@@ -4246,7 +4258,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_HALO:
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD2;
allqueue(REDRAWBUTSEDIT, 0);
@@ -4254,7 +4266,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_BILLB:
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD;
allqueue(REDRAWBUTSEDIT, 0);
@@ -4614,12 +4626,12 @@ static void editing_panel_mesh_texface(void)
{
extern VPaint Gvp; /* from vpaint */
uiBlock *block;
- TFace *tf;
+ MTFace *tf;
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_texface", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Texture face", "Editing", 960, 0, 318, 204)==0) return;
- tf = get_active_tface();
+ tf = get_active_tface(NULL);
if(tf) {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, TF_TEX, B_REDR_3D_IMA, "Tex", 600,160,60,19, &tf->mode, 0, 0, 0, 0, "Render face with texture");
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 2a046a30be2..eef9bfbad08 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -241,7 +241,7 @@ void calc_image_view(SpaceImage *sima, char mode)
/* check for facelesect, and set active image */
void what_image(SpaceImage *sima)
{
- TFace *activetf;
+ MTFace *activetf;
Mesh *me;
if(sima->mode==SI_TEXTURE) {
@@ -268,9 +268,9 @@ void what_image(SpaceImage *sima)
sima->image= NULL;
me= get_mesh(OBACT);
- activetf = get_active_tface();
+ activetf = get_active_tface(NULL);
- if(me && me->tface && activetf && activetf->mode & TF_TEX) {
+ if(me && me->mtface && activetf && activetf->mode & TF_TEX) {
sima->image= activetf->tpage;
if(sima->flag & SI_EDITTILE);
@@ -290,7 +290,7 @@ void what_image(SpaceImage *sima)
/* called to assign images to UV faces */
void image_changed(SpaceImage *sima, int dotile)
{
- TFace *tface;
+ MTFace *tface;
Mesh *me;
int a;
@@ -310,9 +310,9 @@ void image_changed(SpaceImage *sima, int dotile)
}
me= get_mesh(OBACT);
- if(me && me->tface) {
+ if(me && me->mtface) {
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_SELECT) {
@@ -380,7 +380,7 @@ void uvco_to_areaco_noclip(float *vec, int *mval)
void draw_tfaces(void)
{
- TFace *tface,*activetface = NULL;
+ MTFace *tface,*activetface = NULL;
MFace *mface,*activemface = NULL;
Mesh *me;
int a;
@@ -390,7 +390,7 @@ void draw_tfaces(void)
if(G.f & G_FACESELECT) {
me= get_mesh(OBACT);
- if(me && me->tface) {
+ if(me && me->mtface) {
calc_image_view(G.sima, 'f'); /* float */
myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
glLoadIdentity();
@@ -398,15 +398,14 @@ void draw_tfaces(void)
/* draw shadow mesh */
if ((G.sima->flag & SI_DRAWSHADOW) && !(G.obedit==OBACT)) {
DerivedMesh *dm;
- int dmNeedsFree;
/* draw final mesh with modifiers applied */
- dm = mesh_get_derived_final(OBACT, &dmNeedsFree);
+ dm = mesh_get_derived_final(OBACT);
glColor3ub(112, 112, 112);
if (dm->drawUVEdges) dm->drawUVEdges(dm);
- if (dmNeedsFree) dm->release(dm);
+ dm->release(dm);
}
else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
/* draw mesh without modifiers applied */
@@ -420,7 +419,7 @@ void draw_tfaces(void)
dm->release(dm);
}
else {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
@@ -449,7 +448,7 @@ void draw_tfaces(void)
BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -474,7 +473,7 @@ void draw_tfaces(void)
}
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -561,7 +560,7 @@ void draw_tfaces(void)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -585,7 +584,7 @@ void draw_tfaces(void)
cpack(0xFF);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -608,7 +607,7 @@ void draw_tfaces(void)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
a= me->totface;
while(a--) {
@@ -762,7 +761,7 @@ static void image_editvertex_buts(uiBlock *block)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -834,7 +833,7 @@ static void image_editvertex_buts(uiBlock *block)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index a6e91169af2..2eae7b2ea5e 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -179,10 +179,10 @@ void clear_realtime_image_cache()
}
/* REMEMBER! Changes here must go into my_set_tpage() as well */
-int set_tpage(TFace *tface)
+int set_tpage(MTFace *tface)
{
static int alphamode= -1;
- static TFace *lasttface= 0;
+ static MTFace *lasttface= 0;
Image *ima;
unsigned int *rect=NULL, *bind;
int tpx=0, tpy=0, tilemode, tileXRep,tileYRep;
@@ -557,7 +557,7 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
for (i=0; i<me->totface; i++) {
MFace *mf = &me->mface[i];
- TFace *tf = &me->tface[i];
+ MTFace *tf = &me->mtface[i];
if (mf->v3) {
if (!(tf->flag&TF_HIDE)) {
@@ -657,8 +657,8 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
- if (me->tface) {
- TFace *tface = &me->tface[index];
+ if (me->mtface) {
+ MTFace *tface = &me->mtface[index];
if (!(tface->flag&TF_HIDE) && (tface->flag&TF_SELECT))
return 2; /* Don't set color */
else
@@ -800,19 +800,19 @@ static Material *give_current_material_or_def(Object *ob, int matnr)
return ma?ma:&defmaterial;
}
-static int set_draw_settings_cached(int clearcache, int textured, TFace *texface, int lit, Object *litob, int litmatnr, int doublesided)
+static int set_draw_settings_cached(int clearcache, int textured, MTFace *texface, int lit, Object *litob, int litmatnr, int doublesided)
{
static int c_textured;
static int c_lit;
static int c_doublesided;
- static TFace *c_texface;
+ static MTFace *c_texface;
static Object *c_litob;
static int c_litmatnr;
static int c_badtex;
if (clearcache) {
c_textured= c_lit= c_doublesided= -1;
- c_texface= (TFace*) -1;
+ c_texface= (MTFace*) -1;
c_litob= (Object*) -1;
c_litmatnr= -1;
c_badtex= 0;
@@ -879,7 +879,7 @@ static int g_draw_tface_mesh_islight = 0;
static int g_draw_tface_mesh_istex = 0;
static unsigned char g_draw_tface_mesh_obcol[4];
-static int draw_tface__set_draw(TFace *tface, int matnr)
+static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
{
if (tface && ((tface->flag&TF_HIDE) || (tface->mode&TF_INVISIBLE))) return 0;
@@ -889,23 +889,24 @@ static int draw_tface__set_draw(TFace *tface, int matnr)
} else if (tface && tface->mode&TF_OBCOL) {
glColor3ubv(g_draw_tface_mesh_obcol);
return 2; /* Don't set color */
- } else if (!tface) {
+ } else if (!mcol) {
Material *ma= give_current_material(g_draw_tface_mesh_ob, matnr+1);
if(ma) glColor3f(ma->r, ma->g, ma->b);
- else glColor3f(0.5, 0.5, 0.5);
- return 1; /* Set color from mcol if available */
+ else glColor3f(1.0, 1.0, 1.0);
+ return 2; /* Don't set color */
} else {
- return 1; /* Set color from tface */
+ return 1; /* Set color from mcol */
}
}
static int draw_tface_mapped__set_draw(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
- TFace *tface = (me->tface)? &me->tface[index]: NULL;
+ MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
+ MCol *mcol = (me->mcol)? &me->mcol[index]: NULL;
int matnr = me->mface[index].mat_nr;
- return draw_tface__set_draw(tface, matnr);
+ return draw_tface__set_draw(tface, mcol, matnr);
}
void draw_tface_mesh(Object *ob, Mesh *me, int dt)
@@ -915,11 +916,10 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
int a;
short istex, solidtex=0;
DerivedMesh *dm;
- int dmNeedsFree;
if(me==NULL) return;
- dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ dm = mesh_get_derived_final(ob);
glShadeModel(GL_SMOOTH);
@@ -951,7 +951,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
set_draw_settings_cached(1, 0, 0, 0, 0, 0, 0);
if(dt > OB_SOLID || g_draw_tface_mesh_islight==-1) {
- TFace *tface= me->tface;
+ MTFace *tface= me->mtface;
+ MCol *mcol= me->mcol;
MFace *mface= me->mface;
bProperty *prop = get_property(ob, "Text");
int editing= (G.f & (G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT)) && (ob==((G.scene->basact) ? (G.scene->basact->object) : 0));
@@ -962,9 +963,9 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
/* verse-blender doesn't support uv mapping of textures yet */
dm->drawFacesTex(dm, NULL);
}
- else if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)
+ else if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)
#else
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)
+ if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)
#endif
dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, (void*)me);
else
@@ -974,11 +975,11 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
totface = me->totface;
if (!editing && prop && tface) {
- int dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_deform(ob, &dmNeedsFree);
+ DerivedMesh *ddm = mesh_get_derived_deform(ob);
tface+= start;
- for (a=start; a<totface; a++, tface++) {
+ mcol+= start*4;
+ for (a=start; a<totface; a++, tface++, mcol+=4) {
MFace *mf= &mface[a];
int mode= tface->mode;
int matnr= mf->mat_nr;
@@ -995,10 +996,10 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
if (badtex)
continue;
- dm->getVertCo(dm, mf->v1, v1);
- dm->getVertCo(dm, mf->v2, v2);
- dm->getVertCo(dm, mf->v3, v3);
- if (mf->v4) dm->getVertCo(dm, mf->v4, v4);
+ ddm->getVertCo(ddm, mf->v1, v1);
+ ddm->getVertCo(ddm, mf->v2, v2);
+ ddm->getVertCo(ddm, mf->v3, v3);
+ if (mf->v4) ddm->getVertCo(ddm, mf->v4, v4);
// The BM_FONT handling code is duplicated in the gameengine
// Search for 'Frank van Beek' ;-)
@@ -1035,7 +1036,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
movex+= curpos;
if (tface->mode & TF_OBCOL) glColor3ubv(obcol);
- else cp= (char *)&(tface->col[0]);
+ else if (mcol) cp= (char *)mcol;
+ else glColor3ub(255, 255, 255);
glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
if (cp) glColor3ub(cp[3], cp[2], cp[1]);
@@ -1061,7 +1063,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
}
}
- if (dmNeedsFree) dm->release(dm);
+ ddm->release(ddm);
}
/* switch off textures */
@@ -1070,7 +1072,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
glShadeModel(GL_FLAT);
glDisable(GL_CULL_FACE);
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface) {
+ if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface) {
draw_tfaces3D(ob, me, dm);
}
@@ -1090,7 +1092,7 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
glFrontFace(GL_CCW);
- if(dt > OB_SOLID && !(ob==OBACT && (G.f & G_FACESELECT) && me && me->tface)) {
+ if(dt > OB_SOLID && !(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)) {
if(ob->flag & SELECT) {
BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
} else {
@@ -1098,6 +1100,8 @@ void draw_tface_mesh(Object *ob, Mesh *me, int dt)
}
dm->drawLooseEdges(dm);
}
+
+ dm->release(dm);
}
void init_realtime_GL(void)
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 457f3e7d32d..81abe00320e 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -1136,8 +1136,7 @@ static void mesh_foreachScreenVert__mapFunc(void *userData, int index, float *co
void mesh_foreachScreenVert(void (*func)(void *userData, EditVert *eve, int x, int y, int index), void *userData, int clipVerts)
{
struct { void (*func)(void *userData, EditVert *eve, int x, int y, int index); void *userData; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1149,9 +1148,7 @@ void mesh_foreachScreenVert(void (*func)(void *userData, EditVert *eve, int x, i
dm->foreachMappedVert(dm, mesh_foreachScreenVert__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0co, float *v1co)
@@ -1181,8 +1178,7 @@ static void mesh_foreachScreenEdge__mapFunc(void *userData, int index, float *v0
void mesh_foreachScreenEdge(void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index), void *userData, int clipVerts)
{
struct { void (*func)(void *userData, EditEdge *eed, int x0, int y0, int x1, int y1, int index); void *userData; int clipVerts; float pmat[4][4], vmat[4][4]; } data;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1194,9 +1190,7 @@ void mesh_foreachScreenEdge(void (*func)(void *userData, EditEdge *eed, int x0,
dm->foreachMappedEdge(dm, mesh_foreachScreenEdge__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *cent, float *no)
@@ -1214,8 +1208,7 @@ static void mesh_foreachScreenFace__mapFunc(void *userData, int index, float *ce
void mesh_foreachScreenFace(void (*func)(void *userData, EditFace *efa, int x, int y, int index), void *userData)
{
struct { void (*func)(void *userData, EditFace *efa, int x, int y, int index); void *userData; float pmat[4][4], vmat[4][4]; } data;
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
data.func = func;
data.userData = userData;
@@ -1226,9 +1219,7 @@ void mesh_foreachScreenFace(void (*func)(void *userData, EditFace *efa, int x, i
dm->foreachMappedFaceCenter(dm, mesh_foreachScreenFace__mapFunc, &data);
EM_free_index_arrays();
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
void nurbs_foreachScreenVert(void (*func)(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y), void *userData)
@@ -1591,7 +1582,7 @@ static void draw_em_fancy_edges(DerivedMesh *cageDM)
* draw some debug info about verse mesh (vertex indexes,
* face indexes, status of )
*/
-static draw_verse_debug(Object *ob, EditMesh *em)
+static void draw_verse_debug(Object *ob, EditMesh *em)
{
struct EditVert *eve=NULL;
struct EditFace *efa=NULL;
@@ -2066,7 +2057,7 @@ static void draw_mesh_fancy(Base *base, DerivedMesh *baseDM, DerivedMesh *dm, in
else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mcol) {
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
}
- else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->tface) {
+ else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mtface) {
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
}
else do_draw= 1;
@@ -2158,22 +2149,19 @@ static int draw_mesh_object(Base *base, int dt, int flag)
}
if(ob==G.obedit || drawlinked) {
- int cageNeedsFree, finalNeedsFree;
DerivedMesh *finalDM, *cageDM;
- if (G.obedit!=ob) {
+ if (G.obedit!=ob)
finalDM = cageDM = editmesh_get_derived_base();
- cageNeedsFree = 0;
- finalNeedsFree = 1;
- } else {
- cageDM = editmesh_get_derived_cage_and_final(&finalDM, &cageNeedsFree, &finalNeedsFree);
- }
+ else
+ cageDM = editmesh_get_derived_cage_and_final(&finalDM);
if(dt>OB_WIRE) init_gl_materials(ob, 0); // no transp in editmode, the fancy draw over goes bad then
draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt);
- if (cageNeedsFree) cageDM->release(cageDM);
- if (finalNeedsFree) finalDM->release(finalDM);
+ if (cageDM != finalDM)
+ cageDM->release(cageDM);
+ finalDM->release(finalDM);
}
else if(!G.obedit && G.scene->sculptdata.active_ob == ob && !modifiers_getVirtualModifierList(ob)) {
sculptmode_draw_mesh(NULL);
@@ -2182,17 +2170,16 @@ static int draw_mesh_object(Base *base, int dt, int flag)
/* don't create boundbox here with mesh_get_bb(), the derived system will make it, puts deformed bb's OK */
if(me->totface<=4 || boundbox_clip(ob->obmat, me->bb)) {
- int baseDMneedsFree, realDMneedsFree;
- DerivedMesh *baseDM = mesh_get_derived_deform(ob, &baseDMneedsFree);
- DerivedMesh *realDM = mesh_get_derived_final(ob, &realDMneedsFree);
+ DerivedMesh *baseDM = mesh_get_derived_deform(ob);
+ DerivedMesh *realDM = mesh_get_derived_final(ob);
if(dt==OB_SOLID) has_alpha= init_gl_materials(ob, (base->flag & OB_FROMDUPLI)==0);
if(baseDM && realDM) draw_mesh_fancy(base, baseDM, realDM, dt, flag);
if(me->totvert==0) retval= 1;
- if (baseDMneedsFree) baseDM->release(baseDM);
- if (realDMneedsFree) realDM->release(realDM);
+ baseDM->release(baseDM);
+ realDM->release(realDM);
}
}
@@ -4428,7 +4415,7 @@ static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmoot
{
Mesh *me = userData;
- if (!me->tface || !(me->tface[index].flag&TF_HIDE)) {
+ if (!me->mtface || !(me->mtface[index].flag&TF_HIDE)) {
set_framebuffer_index_color(index+1);
return 1;
} else {
@@ -4451,8 +4438,7 @@ static int bbs_mesh_wire__setDrawOpts(void *userData, int index)
static void bbs_mesh_solid(Object *ob)
{
- int dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree);
+ DerivedMesh *dm = mesh_get_derived_final(ob);
Mesh *me = (Mesh*)ob->data;
glColor3ub(0, 0, 0);
@@ -4460,7 +4446,7 @@ static void bbs_mesh_solid(Object *ob)
/* draw edges for seam marking in faceselect mode, but not when painting,
so that painting doesn't get interrupted on an edge */
- if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) && me->tface) {
+ if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) && me->mtface) {
struct { Mesh *me; EdgeHash *eh; int offset; } userData;
userData.me = me;
@@ -4474,8 +4460,7 @@ static void bbs_mesh_solid(Object *ob)
BLI_edgehash_free(userData.eh, NULL);
}
- if (dmNeedsFree)
- dm->release(dm);
+ dm->release(dm);
}
void draw_object_backbufsel(Object *ob)
@@ -4489,8 +4474,7 @@ void draw_object_backbufsel(Object *ob)
switch( ob->type) {
case OB_MESH:
if(ob==G.obedit) {
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
EM_init_index_arrays(1, 1, 1);
@@ -4507,9 +4491,7 @@ void draw_object_backbufsel(Object *ob)
bglPolygonOffset(0.0);
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
EM_free_index_arrays();
}
@@ -4531,14 +4513,13 @@ void draw_object_backbufsel(Object *ob)
void draw_object_instance(Object *ob, int dt, int outline)
{
DerivedMesh *dm=NULL, *edm=NULL;
- int needsfree= 1;
if(ob==NULL || ob->type!=OB_MESH) return;
if(G.obedit && ob->data==G.obedit->data)
edm= editmesh_get_derived_base();
else
- dm = mesh_get_derived_final(ob, &needsfree);
+ dm = mesh_get_derived_final(ob);
if(dt<=OB_WIRE) {
if(dm)
@@ -4571,6 +4552,6 @@ void draw_object_instance(Object *ob, int dt, int outline)
}
if(edm) edm->release(edm);
- if(dm && needsfree) dm->release(dm);
+ if(dm) dm->release(dm);
}
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index ea4e6349140..45392c6cc71 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -1567,7 +1567,7 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
/* check for defgroups */
if(evedef)
- dvert= CustomData_em_get(&em->vdata, evedef->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&em->vdata, evedef->data, CD_MDEFORMVERT);
if(tot==1 && dvert && dvert->totweight) {
bDeformGroup *dg;
int i, max=1, init=1;
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c
index cea223f98df..0f13a6f4cae 100644
--- a/source/blender/src/editdeform.c
+++ b/source/blender/src/editdeform.c
@@ -81,7 +81,7 @@ void sel_verts_defgroup (int select)
switch (ob->type){
case OB_MESH:
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && dvert->totweight){
for (i=0; i<dvert->totweight; i++){
@@ -223,7 +223,7 @@ void del_defgroup (Object *ob)
MDeformVert *dvert;
for (eve=em->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert)
for (i=0; i<dvert->totweight; i++)
@@ -267,7 +267,7 @@ void create_dverts(ID *id)
if( GS(id->name)==ID_ME) {
Mesh *me= (Mesh *)id;
- me->dvert= MEM_callocN(sizeof(MDeformVert)*me->totvert, "deformVert");
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, NULL, me->totvert);
}
else if( GS(id->name)==ID_LT) {
Lattice *lt= (Lattice *)id;
@@ -506,12 +506,12 @@ void assign_verts_defgroup (void)
switch (ob->type){
case OB_MESH:
- if (!CustomData_has_layer(&G.editMesh->vdata, LAYERTYPE_MDEFORMVERT))
- EM_add_data_layer(&G.editMesh->vdata, LAYERTYPE_MDEFORMVERT);
+ if (!CustomData_has_layer(&G.editMesh->vdata, CD_MDEFORMVERT))
+ EM_add_data_layer(&G.editMesh->vdata, CD_MDEFORMVERT);
/* Go through the list of editverts and assign them */
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && (eve->f & 1)){
done=0;
@@ -618,7 +618,7 @@ void remove_verts_defgroup (int allverts)
switch (ob->type){
case OB_MESH:
for (eve=G.editMesh->verts.first; eve; eve=eve->next){
- dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&G.editMesh->vdata, eve->data, CD_MDEFORMVERT);
if (dvert && dvert->dw && ((eve->f & 1) || allverts)){
for (i=0; i<dvert->totweight; i++){
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 49194f3fb67..c235da1437c 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -124,7 +124,7 @@
/* returns 0 if not found, otherwise 1 */
int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
{
- if (!me || !me->tface || me->totface==0)
+ if (!me || !me->mtface || me->totface==0)
return 0;
if (G.vd->flag & V3D_NEEDBACKBUFDRAW) {
@@ -179,7 +179,7 @@ static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
{
float min[3], max[3], *cursx;
int a;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
switch (G.vd->around)
@@ -188,7 +188,7 @@ static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
min[0]= min[1]= min[2]= 1e20f;
max[0]= max[1]= max[2]= -1e20f;
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -341,7 +341,7 @@ static void uv_calc_shift_project(float *target, float *shift, float rotmat[][4]
void calculate_uv_map(unsigned short mapmode)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
Object *ob;
float dx, dy, rotatematrix[4][4], radius= 1.0, min[3], cent[3], max[3];
@@ -359,7 +359,7 @@ void calculate_uv_map(unsigned short mapmode)
}
me= get_mesh(ob=OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
if(me->totface==0) return;
switch(mapmode) {
@@ -379,7 +379,7 @@ void calculate_uv_map(unsigned short mapmode)
uv_calc_center_vector(cent, ob, me);
uv_calc_map_matrix(rotatematrix, ob, upangledeg, sideangledeg, 1.0f);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -395,7 +395,7 @@ void calculate_uv_map(unsigned short mapmode)
dx= (max[0]-min[0]);
dy= (max[1]-min[1]);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -412,7 +412,7 @@ void calculate_uv_map(unsigned short mapmode)
cent[0] = cent[1] = cent[2] = 0.0;
Mat4CpyMat4(rotatematrix,ob->obmat);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -435,7 +435,7 @@ void calculate_uv_map(unsigned short mapmode)
case B_UVAUTO_STD2: fac = 0.5; break;
}
- tface= me->tface;
+ tface= me->mtface;
for(a=0; a<me->totface; a++, tface++)
if(tface->flag & TF_SELECT)
default_uv(tface->uv, fac);
@@ -453,7 +453,7 @@ void calculate_uv_map(unsigned short mapmode)
else
uv_calc_map_matrix(rotatematrix,ob,upangledeg,sideangledeg,radius);
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -491,7 +491,7 @@ void calculate_uv_map(unsigned short mapmode)
MVert *mv= me->mvert;
float cubesize = G.scene->toolsettings->uvcalc_cubesize;
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(tface->flag & TF_SELECT) {
@@ -536,7 +536,7 @@ void calculate_uv_map(unsigned short mapmode)
/* clipping and wrapping */
if(G.sima && G.sima->flag & SI_CLIP_UV) {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=0; a<me->totface; a++, mface++, tface++) {
if(!(tface->flag & TF_SELECT)) continue;
@@ -569,31 +569,41 @@ void calculate_uv_map(unsigned short mapmode)
allqueue(REDRAWIMAGE, 0);
}
-TFace *get_active_tface()
+MTFace *get_active_tface(MCol **mcol)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
int a;
if(OBACT==NULL || OBACT->type!=OB_MESH)
return NULL;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0)
+ if(me==0 || me->mtface==0)
return NULL;
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if(tf->flag & TF_ACTIVE)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if(tf->flag & TF_ACTIVE) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
+ }
+ }
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if(tf->flag & TF_SELECT)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if(tf->flag & TF_SELECT) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
+ }
+ }
- for(a=0, tf=me->tface; a < me->totface; a++, tf++)
- if((tf->flag & TF_HIDE)==0)
+ for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
+ if((tf->flag & TF_HIDE)==0) {
+ if(mcol) *mcol = (me->mcol)? &me->mcol[a]: NULL;
return tf;
-
+ }
+ }
+
+ if(mcol) *mcol = NULL;
return NULL;
}
@@ -616,16 +626,12 @@ void default_uv(float uv[][2], float size)
uv[3][0]= size;
uv[3][1]= size+dy;
-
-
}
-void default_tface(TFace *tface)
+void default_tface(MTFace *tface)
{
default_uv(tface->uv, 1.0);
- tface->col[0]= tface->col[1]= tface->col[2]= tface->col[3]= vpaint_get_current_col();
-
tface->mode= TF_TEX;
tface->mode= 0;
tface->flag= TF_SELECT;
@@ -635,32 +641,30 @@ void default_tface(TFace *tface)
void make_tfaces(Mesh *me)
{
- TFace *tface;
+ MTFace *tf;
int a;
-
- a= me->totface;
- if(a==0) return;
- tface= me->tface= MEM_callocN(a*sizeof(TFace), "tface");
- while(a--) {
- default_tface(tface);
- tface++;
- }
- if(me->mcol) {
- mcol_to_tface(me, 1);
- }
+
+ if(me->mtface)
+ return;
+
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, 0, 0, me->totface);
+
+ tf= me->mtface;
+ for (a=0; a<me->totface; a++, tf++)
+ default_tface(tf);
}
void reveal_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE) {
@@ -678,18 +682,18 @@ void reveal_tface()
void hide_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if(G.qual & LR_ALTKEY) {
reveal_tface();
return;
}
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -720,7 +724,7 @@ void select_linked_tfaces(int mode)
ob = OBACT;
me = get_mesh(ob);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if (mode==0 || mode==1) {
if (!(ob->lay & G.vd->lay))
@@ -736,13 +740,13 @@ void select_linked_tfaces(int mode)
void deselectall_tface()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a, sel;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
sel= 0;
while(a--) {
@@ -751,7 +755,7 @@ void deselectall_tface()
tface++;
}
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -770,13 +774,13 @@ void deselectall_tface()
void selectswap_tface(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
- tface= me->tface;
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->flag & TF_HIDE);
@@ -795,133 +799,143 @@ void selectswap_tface(void)
void rotate_uv_tface()
{
Mesh *me;
- TFace *tface;
- MFace *mface;
+ MFace *mf;
+ MCol *mcol;
+ MTFace *tf;
short mode;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
mode= pupmenu("Rotate %t|UV Co-ordinates %x1|Vertex Colors %x2");
-
- if(mode<1) return;
-
- tface= me->tface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(tface->flag & TF_SELECT) {
- if(mode==1) {
- float u1= tface->uv[0][0];
- float v1= tface->uv[0][1];
+
+ if (mode == 1 && me->mtface) {
+ tf= me->mtface;
+ mf= me->mface;
+ for(a=0; a<me->totface; a++, tf++, mf++) {
+ if(tf->flag & TF_SELECT) {
+ float u1= tf->uv[0][0];
+ float v1= tf->uv[0][1];
- tface->uv[0][0]= tface->uv[1][0];
- tface->uv[0][1]= tface->uv[1][1];
+ tf->uv[0][0]= tf->uv[1][0];
+ tf->uv[0][1]= tf->uv[1][1];
- tface->uv[1][0]= tface->uv[2][0];
- tface->uv[1][1]= tface->uv[2][1];
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
- if(mface->v4) {
- tface->uv[2][0]= tface->uv[3][0];
- tface->uv[2][1]= tface->uv[3][1];
+ if(mf->v4) {
+ tf->uv[2][0]= tf->uv[3][0];
+ tf->uv[2][1]= tf->uv[3][1];
- tface->uv[3][0]= u1;
- tface->uv[3][1]= v1;
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
}
else {
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
}
- else if(mode==2) {
- unsigned int tcol= tface->col[0];
+ }
+
+ BIF_undo_push("Rotate UV face");
+ object_uvs_changed(OBACT);
+ }
+ else if (mode == 2 && me->mcol) {
+ tf= me->mtface;
+ mcol= me->mcol;
+ mf= me->mface;
+ for(a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
+ if(tf->flag & TF_SELECT) {
+ MCol tmpcol= mcol[0];
- tface->col[0]= tface->col[1];
- tface->col[1]= tface->col[2];
+ mcol[0]= mcol[1];
+ mcol[1]= mcol[2];
- if(mface->v4) {
- tface->col[2]= tface->col[3];
- tface->col[3]= tcol;
- }
- else {
- tface->col[2]= tcol;
+ if(mf->v4) {
+ mcol[2]= mcol[3];
+ mcol[3]= tmpcol;
}
+ else
+ mcol[2]= tmpcol;
}
}
- tface++;
- mface++;
- }
-
- BIF_undo_push("Rotate UV face");
- object_uvs_changed(OBACT);
+ BIF_undo_push("Rotate color face");
+ object_uvs_changed(OBACT);
+ }
}
void mirror_uv_tface()
{
Mesh *me;
- TFace *tface;
- MFace *mface;
+ MFace *mf;
+ MTFace *tf;
+ MCol *mcol;
short mode;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
mode= pupmenu("Mirror %t|UV Co-ordinates %x1|Vertex Colors %x2");
- if(mode<1) return;
-
- tface= me->tface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(tface->flag & TF_SELECT) {
- if(mode==1) {
- float u1= tface->uv[0][0];
- float v1= tface->uv[0][1];
- if(mface->v4) {
- tface->uv[0][0]= tface->uv[3][0];
- tface->uv[0][1]= tface->uv[3][1];
+ if (mode==1 && me->mtface) {
+ mf= me->mface;
+ tf= me->mtface;
+
+ for (a=0; a<me->totface; a++, tf++, mf++) {
+ if(tf->flag & TF_SELECT) {
+ float u1= tf->uv[0][0];
+ float v1= tf->uv[0][1];
+ if(mf->v4) {
+ tf->uv[0][0]= tf->uv[3][0];
+ tf->uv[0][1]= tf->uv[3][1];
- tface->uv[3][0]= u1;
- tface->uv[3][1]= v1;
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
- u1= tface->uv[1][0];
- v1= tface->uv[1][1];
+ u1= tf->uv[1][0];
+ v1= tf->uv[1][1];
- tface->uv[1][0]= tface->uv[2][0];
- tface->uv[1][1]= tface->uv[2][1];
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
else {
- tface->uv[0][0]= tface->uv[2][0];
- tface->uv[0][1]= tface->uv[2][1];
- tface->uv[2][0]= u1;
- tface->uv[2][1]= v1;
+ tf->uv[0][0]= tf->uv[2][0];
+ tf->uv[0][1]= tf->uv[2][1];
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
}
}
- else if(mode==2) {
- unsigned int tcol= tface->col[0];
- if(mface->v4) {
- tface->col[0]= tface->col[3];
- tface->col[3]= tcol;
-
- tcol = tface->col[1];
- tface->col[1]= tface->col[2];
- tface->col[2]= tcol;
+ }
+ }
+ else if(mode==2 && me->mcol) {
+ mf= me->mface;
+ tf= me->mtface;
+ mcol= me->mcol;
+
+ for (a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
+ if(tf->flag & TF_SELECT) {
+ MCol tmpcol= mcol[0];
+
+ if(mf->v4) {
+ mcol[0]= mcol[3];
+ mcol[3]= tmpcol;
+
+ tmpcol = mcol[1];
+ mcol[1]= mcol[2];
+ mcol[2]= tmpcol;
}
else {
- tface->col[0]= tface->col[2];
- tface->col[2]= tcol;
+ mcol[0]= mcol[2];
+ mcol[2]= tmpcol;
}
}
}
- tface++;
- mface++;
}
BIF_undo_push("Mirror UV face");
@@ -934,7 +948,7 @@ void minmax_tface(float *min, float *max)
Object *ob;
Mesh *me;
MFace *mf;
- TFace *tf;
+ MTFace *tf;
MVert *mv;
int a;
float vec[3], bmat[3][3];
@@ -942,13 +956,13 @@ void minmax_tface(float *min, float *max)
ob = OBACT;
if (ob==0) return;
me= get_mesh(ob);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
Mat3CpyMat4(bmat, ob->obmat);
mv= me->mvert;
mf= me->mface;
- tf= me->tface;
+ tf= me->mtface;
for (a=me->totface; a>0; a--, mf++, tf++) {
if (tf->flag & TF_HIDE || !(tf->flag & TF_SELECT))
continue;
@@ -1027,13 +1041,13 @@ static int seam_shortest_path(Mesh *me, int source, int target)
float *cost;
MEdge *med;
int a, *nedges, *edges, *prevedge, mednum = -1, nedgeswap = 0;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
/* mark hidden edges as done, so we don't use them */
ehash = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if (!(tf->flag & TF_HIDE)) {
BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL);
BLI_edgehash_insert(ehash, mf->v2, mf->v3, NULL);
@@ -1190,13 +1204,13 @@ void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
void seam_mark_clear_tface(short mode)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
MEdge *med;
int a;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0 || me->totface==0) return;
+ if(me==0 || me->mtface==0 || me->totface==0) return;
if (mode == 0)
mode = pupmenu("Seams%t|Mark Border Seam %x1|Clear Seam %x2");
@@ -1207,7 +1221,7 @@ void seam_mark_clear_tface(short mode)
if (mode == 2) {
EdgeHash *ehash = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++)
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++)
if (!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT))
seam_edgehash_insert_face(ehash, mf);
@@ -1222,7 +1236,7 @@ void seam_mark_clear_tface(short mode)
EdgeHash *ehash1 = BLI_edgehash_new();
EdgeHash *ehash2 = BLI_edgehash_new();
- for (a=0, mf=me->mface, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if ((tf->flag & TF_HIDE) || !(tf->flag & TF_SELECT))
seam_edgehash_insert_face(ehash1, mf);
else
@@ -1251,7 +1265,7 @@ void face_select()
{
Object *ob;
Mesh *me;
- TFace *tface, *tsel;
+ MTFace *tface, *tsel;
MFace *msel;
short mval[2];
unsigned int a, index;
@@ -1271,13 +1285,13 @@ void face_select()
if (!facesel_face_pick(me, mval, &index, 1)) return;
- tsel= (((TFace*)me->tface)+index);
+ tsel= (((MTFace*)me->mtface)+index);
msel= (((MFace*)me->mface)+index);
if (tsel->flag & TF_HIDE) return;
/* clear flags */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
if (G.qual & LR_SHIFTKEY)
@@ -1307,7 +1321,7 @@ void face_select()
void face_borderselect()
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
rcti rect;
struct ImBuf *ibuf;
unsigned int *rt;
@@ -1315,7 +1329,7 @@ void face_borderselect()
char *selar;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
if(me->totface==0) return;
val= get_border(&rect, 3);
@@ -1347,7 +1361,7 @@ void face_borderselect()
rt++;
}
- tface= me->tface;
+ tface= me->mtface;
for(a=1; a<=me->totface; a++, tface++) {
if(selar[a]) {
if(tface->flag & TF_HIDE);
@@ -1454,7 +1468,7 @@ void set_faceselect() /* toggle */
}
else if (me && (ob->lay & G.vd->lay)) {
G.f |= G_FACESELECT;
- if(me->tface==NULL)
+ if(me->mtface==NULL)
make_tfaces(me);
setcursor_space(SPACE_VIEW3D, CURSOR_FACESEL);
@@ -1537,7 +1551,7 @@ static void texpaint_project(Object *ob, double *model, double *proj, GLint *vie
pco[1]= (float)winy;
}
-static int texpaint_projected_verts(Object *ob, MFace *mf, TFace *tf, MVert *mv, float *v1, float *v2, float *v3, float *v4)
+static int texpaint_projected_verts(Object *ob, MFace *mf, MTFace *tf, MVert *mv, float *v1, float *v2, float *v3, float *v4)
{
double model[16], proj[16];
GLint view[4];
@@ -1565,10 +1579,10 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
{
float v1[2], v2[2], v3[2], v4[2], p[2], w[3];
float absw, minabsw;
- int nvert, dmNeedsFree;
- DerivedMesh *dm = mesh_get_derived_final(ob, &dmNeedsFree);
- int *index = dm->getFaceDataArray(dm, LAYERTYPE_ORIGINDEX);
- TFace *tface = dm->getFaceDataArray(dm, LAYERTYPE_TFACE), *tf;
+ int nvert;
+ DerivedMesh *dm = mesh_get_derived_final(ob);
+ int *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE), *tf;
int numfaces = dm->getNumFaces(dm), a;
MFace mf;
MVert mv[4];
@@ -1628,8 +1642,7 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
}
}
- if (dmNeedsFree)
- dm->release(dm);
+ dm->release(dm);
}
/* Selects all faces which have the same uv-texture as the active face
@@ -1642,7 +1655,7 @@ void get_same_uv(void)
{
Object *ob;
Mesh *me;
- TFace *tface;
+ MTFace *tface;
short a, foundtex=0;
Image *ima;
char uvname[160];
@@ -1656,7 +1669,7 @@ void get_same_uv(void)
/* Search for the active face with a UV-Texture */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
if(tface->flag & TF_ACTIVE){
@@ -1676,7 +1689,7 @@ void get_same_uv(void)
}
/* select everything with the same texture */
- tface = me->tface;
+ tface = me->mtface;
a = me->totface;
while (a--) {
ima=tface->tpage;
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index 820c6ca0f73..e66c42d902a 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -558,16 +558,18 @@ void free_editMesh(EditMesh *em)
if(em->faces.first) free_facelist(&em->faces);
if(em->selected.first) BLI_freelistN(&(em->selected));
- CustomData_free(&em->vdata);
- CustomData_free(&em->fdata);
+ CustomData_free(&em->vdata, 0);
+ CustomData_free(&em->fdata, 0);
if(em->derivedFinal) {
if (em->derivedFinal!=em->derivedCage) {
+ em->derivedFinal->needsFree= 1;
em->derivedFinal->release(em->derivedFinal);
}
em->derivedFinal= NULL;
}
if(em->derivedCage) {
+ em->derivedCage->needsFree= 1;
em->derivedCage->release(em->derivedCage);
em->derivedCage= NULL;
}
@@ -781,7 +783,7 @@ void make_editMesh()
Mesh *me= G.obedit->data;
EditMesh *em= G.editMesh;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
MVert *mvert;
MSelect *mselect;
KeyBlock *actkey;
@@ -789,7 +791,6 @@ void make_editMesh()
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
- CustomData mvdata, mfdata;
int tot, a, eekadoodle= 0;
#ifdef WITH_VERSE
@@ -822,11 +823,7 @@ void make_editMesh()
}
/* make editverts */
- CustomData_init(&mvdata, 0, me->totvert, SUB_ELEMS_VERT);
- if(me->dvert)
- CustomData_add_layer(&mvdata, LAYERTYPE_MDEFORMVERT, LAYERFLAG_NOFREE, me->dvert);
- CustomData_from_template(&mvdata, &em->vdata, 0, 0);
-
+ CustomData_copy(&me->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
mvert= me->mvert;
evlist= (EditVert **)MEM_mallocN(tot*sizeof(void *),"evlist");
@@ -849,11 +846,9 @@ void make_editMesh()
*/
eve->keyindex = a;
- CustomData_to_em_block(&mvdata, &em->vdata, a, &eve->data);
+ CustomData_to_em_block(&me->vdata, &em->vdata, a, &eve->data);
}
- CustomData_free(&mvdata);
-
if(actkey && actkey->totelem!=me->totvert);
else {
MEdge *medge= me->medge;
@@ -875,18 +870,11 @@ void make_editMesh()
}
}
- /* fill a CustomData, this is only temporary until Mesh get its own */
- CustomData_init(&mfdata, 0, me->totface, SUB_ELEMS_FACE);
- if(me->mcol)
- CustomData_add_layer(&mfdata, LAYERTYPE_MCOL, LAYERFLAG_NOFREE, me->mcol);
- if(me->tface)
- CustomData_add_layer(&mfdata, LAYERTYPE_TFACE, LAYERFLAG_NOFREE, me->tface);
-
- CustomData_from_template(&mfdata, &em->fdata, 0, 0);
-
+ CustomData_copy(&me->fdata, &em->fdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+
/* make faces */
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=0; a<me->totface; a++, mface++) {
eve1= evlist[mface->v1];
@@ -898,7 +886,7 @@ void make_editMesh()
efa= addfacelist(eve1, eve2, eve3, eve4, NULL, NULL);
if(efa) {
- CustomData_to_em_block(&mfdata, &em->fdata, a, &efa->data);
+ CustomData_to_em_block(&me->fdata, &em->fdata, a, &efa->data);
efa->mat_nr= mface->mat_nr;
efa->flag= mface->flag & ~ME_HIDE;
@@ -910,7 +898,7 @@ void make_editMesh()
}
if(mface->flag & ME_HIDE) efa->h= 1;
}
- else if((tface = CustomData_get(&mfdata, a, LAYERTYPE_TFACE))) {
+ else if((tface = CustomData_get(&me->fdata, a, CD_MTFACE))) {
if(tface->flag & TF_HIDE)
efa->h= 1;
else if(tface->flag & TF_SELECT)
@@ -918,10 +906,8 @@ void make_editMesh()
}
}
- if(me->tface) tface++;
+ if(me->mtface) tface++;
}
-
- CustomData_free(&mfdata);
}
if(eekadoodle)
@@ -968,16 +954,14 @@ void load_editMesh(void)
MVert *mvert, *oldverts;
MEdge *medge;
MFace *mface;
- MSticky *ms;
MSelect *mselect;
- TFace *tf;
+ MTFace *tf;
EditVert *eve;
EditFace *efa;
EditEdge *eed;
EditSelection *ese;
float *fp, *newkey, *oldkey, nor[3];
int i, a, ototvert, totedge=0;
- CustomData mvdata, mfdata;
#ifdef WITH_VERSE
if(em->vnode) {
@@ -1014,41 +998,33 @@ void load_editMesh(void)
if(G.totface==0) mface= NULL;
else mface= MEM_callocN(G.totface*sizeof(MFace), "loadeditMesh face");
- /* free vertex and face data */
- if (me->dvert) {
- free_dverts(me->dvert, me->totvert);
- me->dvert= NULL;
- }
- if(me->tface) {
- MEM_freeN(me->tface);
- me->tface = NULL;
- }
- if(me->mcol) {
- MEM_freeN(me->mcol);
- me->mcol = NULL;
- }
-
/* lets save the old verts just in case we are actually working on
* a key ... we now do processing of the keys at the end */
- oldverts = me->mvert;
+ oldverts= me->mvert;
ototvert= me->totvert;
- /* put new data in Mesh */
- me->mvert= mvert;
- me->totvert= G.totvert;
+ for (i=0; i<me->vdata.totlayer; i++)
+ if (me->vdata.layers[i].type == CD_MVERT)
+ me->vdata.layers[i].flag |= CD_FLAG_NOFREE;
- if(me->medge) MEM_freeN(me->medge);
- me->medge= medge;
- me->totedge= totedge;
-
- if(me->mface) MEM_freeN(me->mface);
+ /* free custom data */
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
- me->mface= mface;
+ /* add new custom data */
+ me->totvert= G.totvert;
+ me->totedge= totedge;
me->totface= G.totface;
- /* vertex and face data */
- CustomData_from_template(&em->vdata, &mvdata, LAYERFLAG_NOFREE, me->totvert);
- CustomData_from_template(&em->fdata, &mfdata, LAYERFLAG_NOFREE, me->totface);
+ CustomData_copy(&em->vdata, &me->vdata, CD_MASK_MESH, CD_CALLOC, me->totvert);
+ CustomData_copy(&em->fdata, &me->fdata, CD_MASK_MESH, CD_CALLOC, me->totface);
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, mvert, me->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, medge, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, mface, me->totface);
+
+ mesh_update_customdata_pointers(me);
/* the vertices, use ->tmp.l as counter */
eve= em->verts.first;
@@ -1065,7 +1041,7 @@ void load_editMesh(void)
/* note: it used to remove me->dvert when it was not in use, cancelled
that... annoying when you have a fresh vgroup */
- CustomData_from_em_block(&em->vdata, &mvdata, eve->data, a);
+ CustomData_from_em_block(&em->vdata, &me->vdata, eve->data, a);
eve->tmp.l = a++; /* counter */
@@ -1084,10 +1060,6 @@ void load_editMesh(void)
mvert++;
}
- /* from CustomData to dvert in Mesh */
- me->dvert = CustomData_get(&mvdata, 0, LAYERTYPE_MDEFORMVERT);
- CustomData_free(&mvdata);
-
/* the edges */
a= 0;
eed= em->edges.first;
@@ -1160,11 +1132,10 @@ void load_editMesh(void)
efa->e4->f2= 2;
}
- CustomData_from_em_block(&em->fdata, &mfdata, efa->data, i);
+ CustomData_from_em_block(&em->fdata, &me->fdata, efa->data, i);
/* no index '0' at location 3 or 4 */
- test_index_face(mface, CustomData_get(&mfdata, i, LAYERTYPE_MCOL),
- CustomData_get(&mfdata, i, LAYERTYPE_TFACE), efa->v4?4:3);
+ test_index_face(mface, &me->fdata, i, efa->v4?4:3);
#ifdef WITH_VERSE
if(efa->vface) {
@@ -1179,10 +1150,10 @@ void load_editMesh(void)
/* sync hide and select flags with faceselect mode */
if(G.f & G_FACESELECT) {
- if(CustomData_has_layer(&mfdata, LAYERTYPE_TFACE) && (me->totface > 0)) {
+ if(me->mtface && (me->totface > 0)) {
efa= em->faces.first;
for(a=0, efa=em->faces.first; efa; a++, efa=efa->next) {
- tf = CustomData_get(&mfdata, a, LAYERTYPE_TFACE);
+ tf = &me->mtface[a];
if(efa->h) tf->flag |= TF_HIDE;
else tf->flag &= ~TF_HIDE;
@@ -1192,10 +1163,6 @@ void load_editMesh(void)
}
}
- /* from CustomData to tface and mcol in Mesh */
- me->tface = CustomData_get(&mfdata, 0, LAYERTYPE_TFACE);
- me->mcol = CustomData_get(&mfdata, 0, LAYERTYPE_MCOL);
- CustomData_free(&mfdata);
/* patch hook indices and vertex parents */
{
@@ -1364,17 +1331,6 @@ void load_editMesh(void)
}
}
- /* sticky */
- if(me->msticky) {
- if (ototvert<me->totvert) {
- ms= MEM_callocN(me->totvert*sizeof(MSticky), "msticky");
- memcpy(ms, me->msticky, ototvert*sizeof(MSticky));
- MEM_freeN(me->msticky);
- me->msticky= ms;
- error("Sticky was too small");
- }
- }
-
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
@@ -1872,8 +1828,8 @@ static void free_undoMesh(void *umv)
if(um->faces) MEM_freeN(um->faces);
if(um->selected) MEM_freeN(um->selected);
if(um->retopo_paint_data) retopo_free_paint_data(um->retopo_paint_data);
- CustomData_free(&um->vdata);
- CustomData_free(&um->fdata);
+ CustomData_free(&um->vdata, um->totvert);
+ CustomData_free(&um->fdata, um->totface);
MEM_freeN(um);
}
@@ -1906,8 +1862,8 @@ static void *editMesh_to_undoMesh(void)
if(um->totface) efac= um->faces= MEM_callocN(um->totface*sizeof(EditFaceC), "allfacesC");
if(um->totsel) esec= um->selected= MEM_callocN(um->totsel*sizeof(EditSelectionC), "allselections");
- if(um->totvert) CustomData_from_template(&em->vdata, &um->vdata, 0, um->totvert);
- if(um->totface) CustomData_from_template(&em->fdata, &um->fdata, 0, um->totface);
+ if(um->totvert) CustomData_copy(&em->vdata, &um->vdata, CD_MASK_EDITMESH, CD_CALLOC, um->totvert);
+ if(um->totface) CustomData_copy(&em->fdata, &um->fdata, CD_MASK_EDITMESH, CD_CALLOC, um->totface);
/* now copy vertices */
a = 0;
@@ -2006,9 +1962,13 @@ static void undoMesh_to_editMesh(void *umv)
G.editMesh->vnode = vnode;
#endif
+ CustomData_free(&em->vdata, 0);
+ CustomData_free(&em->fdata, 0);
+
+ CustomData_copy(&um->vdata, &em->vdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+ CustomData_copy(&um->fdata, &em->fdata, CD_MASK_EDITMESH, CD_CALLOC, 0);
+
/* now copy vertices */
- CustomData_free(&em->vdata);
- CustomData_from_template(&um->vdata, &em->vdata, 0, 0);
if(um->totvert) evar= MEM_mallocN(um->totvert*sizeof(EditVert *), "vertex ar");
for(a=0, evec= um->verts; a<um->totvert; a++, evec++) {
@@ -2036,9 +1996,6 @@ static void undoMesh_to_editMesh(void *umv)
}
/* copy faces */
- CustomData_free(&em->fdata);
- CustomData_from_template(&um->fdata, &em->fdata, 0, 0);
-
for(a=0, efac= um->faces; a<um->totface; a++, efac++) {
if(efac->v4 != -1)
efa= addfacelist(evar[efac->v1], evar[efac->v2], evar[efac->v3], evar[efac->v4], NULL, NULL);
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index d40ab35a4db..6e9fc7260f6 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -798,11 +798,11 @@ void EM_add_data_layer(CustomData *data, int type)
return;
olddata= *data;
- olddata.layers= MEM_dupallocN(olddata.layers);
- CustomData_add_layer(data, type, 0, NULL);
+ olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
+ CustomData_add_layer(data, type, 0, NULL, 0);
update_data_blocks(&olddata, data);
- MEM_freeN(olddata.layers);
+ if (olddata.layers) MEM_freeN(olddata.layers);
}
void EM_free_data_layer(CustomData *data, int type)
@@ -813,11 +813,11 @@ void EM_free_data_layer(CustomData *data, int type)
return;
olddata= *data;
- olddata.layers= MEM_dupallocN(olddata.layers);
- CustomData_free_layer(data, type);
+ olddata.layers= (olddata.layers)? MEM_dupallocN(olddata.layers): NULL;
+ CustomData_free_layer(data, type, 0);
update_data_blocks(&olddata, data);
- MEM_freeN(olddata.layers);
+ if (olddata.layers) MEM_freeN(olddata.layers);
}
/* ******** EXTRUDE ********* */
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 95a0e85a20d..f0b1aa7ebd6 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -625,8 +625,7 @@ static void draw_dm_mapped_face_center(DerivedMesh *dm, EditFace *efa)
static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
{
- int dmNeedsFree;
- DerivedMesh *dm = editmesh_get_derived_cage(&dmNeedsFree);
+ DerivedMesh *dm = editmesh_get_derived_cage();
glDrawBuffer(GL_FRONT);
@@ -714,9 +713,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
/* signal that frontbuf differs from back */
curarea->win_swap= WIN_FRONT_OK;
- if (dmNeedsFree) {
- dm->release(dm);
- }
+ dm->release(dm);
}
@@ -825,18 +822,18 @@ int facegroup_select(short mode)
}
}
} else if (mode==2) { /* same image */
- TFace *tf, *base_tf;
+ MTFace *tf, *base_tf;
- base_tf = (TFace*)CustomData_em_get(&em->fdata, base_efa->data,
- LAYERTYPE_TFACE);
+ base_tf = (MTFace*)CustomData_em_get(&em->fdata, base_efa->data,
+ CD_MTFACE);
if(!base_tf)
return selcount;
for(efa= em->faces.first; efa; efa= efa->next) {
if (!(efa->f & SELECT) && !efa->h) {
- tf = (TFace*)CustomData_em_get(&em->fdata, efa->data,
- LAYERTYPE_TFACE);
+ tf = (MTFace*)CustomData_em_get(&em->fdata, efa->data,
+ CD_MTFACE);
if(base_tf->tpage == tf->tpage) {
EM_select_face(efa, 1);
@@ -1172,14 +1169,14 @@ int vertgroup_select(short mode)
short i, j; /* weight index */
base_dvert= CustomData_em_get(&em->vdata, base_eve->data,
- LAYERTYPE_MDEFORMVERT);
+ CD_MDEFORMVERT);
if (!base_dvert || base_dvert->totweight == 0)
return selcount;
for(eve= em->verts.first; eve; eve= eve->next) {
dvert= CustomData_em_get(&em->vdata, eve->data,
- LAYERTYPE_MDEFORMVERT);
+ CD_MDEFORMVERT);
if (dvert && !(eve->f & SELECT) && !eve->h && dvert->totweight) {
/* do the extra check for selection in the following if, so were not
@@ -2903,7 +2900,7 @@ static void editmesh_calc_selvert_center(float cent_r[3])
}
}
-static int tface_is_selected(TFace *tf)
+static int tface_is_selected(MTFace *tf)
{
return (!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT));
}
@@ -2921,7 +2918,7 @@ void faceselect_align_view_to_selected(View3D *v3d, Mesh *me, int axis)
norm[0]= norm[1]= norm[2]= 0.0;
for (i=0; i<me->totface; i++) {
MFace *mf= ((MFace*) me->mface) + i;
- TFace *tf= ((TFace*) me->tface) + i;
+ MTFace *tf= ((MTFace*) me->mtface) + i;
if (tface_is_selected(tf)) {
float *v1, *v2, *v3, fno[3];
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index e0f01d0695d..9ab2bf30874 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -1277,40 +1277,6 @@ static void flipvertarray(EditVert** arr, short size)
}
}
-void interp_uv_vcol(float *v1, float *v2, float *v3, float *v4, float *co, TFace *tf, TFace *outtf, int j)
-{
- char *cp0, *cp1, *cp2, *cp3, *col;
- float *uv, w[4];
- int i, fac;
-
- col = (char*)&outtf->col[j];
- uv = (float*)outtf->uv[j];
-
- InterpWeightsQ3Dfl(v1, v2, v3, v4, co, w);
-
- uv[0]= w[0]*tf->uv[0][0] + w[1]*tf->uv[1][0] + w[2]*tf->uv[2][0];
- uv[1]= w[0]*tf->uv[0][1] + w[1]*tf->uv[1][1] + w[2]*tf->uv[2][1];
-
- if (v4) {
- uv[0] += w[3]*tf->uv[3][0];
- uv[1] += w[3]*tf->uv[3][1];
- }
-
- cp0= (char*)&(tf->col[0]);
- cp1= (char*)&(tf->col[1]);
- cp2= (char*)&(tf->col[2]);
- cp3= (char*)&(tf->col[3]);
-
- for(i=0; i < 4; i++) {
- if (v4)
- fac= (int)(w[0]*cp0[i] + w[1]*cp1[i] + w[2]*cp2[i] + w[3]*cp3[i]);
- else
- fac= (int)(w[0]*cp0[i] + w[1]*cp1[i] + w[2]*cp2[i]);
-
- col[i]= CLAMPIS(fac, 0, 255);
- }
-}
-
static void facecopy(EditFace *source, EditFace *target)
{
EditMesh *em= G.editMesh;
@@ -3245,10 +3211,10 @@ static int compareFaceUV(EditFace *f1, EditFace *f2)
{
EditVert **faceVert1, **faceVert2, *faceVerts1[5], *faceVerts2[5];
int i1, i2;
- TFace *tf1, *tf2;
+ MTFace *tf1, *tf2;
- tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_TFACE);
- tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_TFACE);
+ tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, CD_MTFACE);
+ tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, CD_MTFACE);
if(tf1 == NULL || tf2 == NULL) return 1;
else if(tf1->tpage == NULL && tf2->tpage == NULL)
@@ -3283,16 +3249,10 @@ static int compareFaceCol(EditFace *f1, EditFace *f2)
{
EditVert **faceVert1, **faceVert2, *faceVerts1[5], *faceVerts2[5];
int i1, i2;
- TFace *tf1, *tf2;
unsigned int *col1, *col2;
- tf1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_TFACE);
- tf2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_TFACE);
-
- if(tf1) col1 = tf1->col;
- else col1 = CustomData_em_get(&G.editMesh->fdata, f1->data, LAYERTYPE_MCOL);
- if(tf2) col2 = tf2->col;
- else col2 = CustomData_em_get(&G.editMesh->fdata, f2->data, LAYERTYPE_MCOL);
+ col1 = CustomData_em_get(&G.editMesh->fdata, f1->data, CD_MCOL);
+ col2 = CustomData_em_get(&G.editMesh->fdata, f2->data, CD_MCOL);
if(!col1 || !col2) return 1;
@@ -5876,7 +5836,7 @@ static void append_weldedUV(EditFace *efa, EditVert *eve, int tfindex, ListBase
wUV *curwvert, *newwvert;
wUVNode *newnode;
int found;
- TFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ MTFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
found = 0;
@@ -5922,7 +5882,7 @@ static void append_weldedUVEdge(EditFace *efa, EditEdge *eed, ListBase *uvedges)
{
wUVEdge *curwedge, *newwedge;
int v1tfindex, v2tfindex, found;
- TFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ MTFace *tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
found = 0;
@@ -6003,7 +5963,7 @@ static void collapse_edgeuvs(void)
int curtag, balanced, collectionfound, vcount;
float avg[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE))
+ if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
return;
uvverts.first = uvverts.last = uvedges.first = uvedges.last = allcollections.first = allcollections.last = NULL;
@@ -6101,11 +6061,11 @@ static void collapse_edgeuvs(void)
static void collapseuvs(void)
{
EditFace *efa;
- TFace *tf;
+ MTFace *tf;
int uvcount;
float uvav[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE))
+ if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
return;
uvcount = 0;
@@ -6113,7 +6073,7 @@ static void collapseuvs(void)
uvav[1] = 0;
for(efa = G.editMesh->faces.first; efa; efa=efa->next){
- tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
if(efa->v1->f1){
uvav[0] += tf->uv[0][0];
@@ -6142,7 +6102,7 @@ static void collapseuvs(void)
uvav[1] /= uvcount;
for(efa = G.editMesh->faces.first; efa; efa=efa->next){
- tf = CustomData_em_get(&G.editMesh->fdata, efa->data, LAYERTYPE_TFACE);
+ tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
if(efa->v1->f1){
tf->uv[0][0] = uvav[0];
@@ -6213,7 +6173,7 @@ int collapseEdges(void)
VECCOPY(((EditEdge*)curredge->eed)->v2->co,avgcount);
}
- if (CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)) {
+ if (CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)) {
/*uv collapse*/
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eed=G.editMesh->edges.first; eed; eed=eed->next) eed->f1 = 0;
@@ -6259,7 +6219,7 @@ int merge_firstlast(int first, int uvmerge)
}
}
- if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)){
+ if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)){
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=G.editMesh->verts.first; eve; eve=eve->next){
@@ -6282,7 +6242,7 @@ int merge_target(int target, int uvmerge)
if(target) snap_sel_to_curs();
else snap_to_center();
- if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, LAYERTYPE_TFACE)){
+ if(uvmerge && CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)){
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eve=G.editMesh->verts.first; eve; eve=eve->next){
if(eve->f&SELECT) eve->f1 = 1;
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 4195efc000c..4d6162d5483 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -371,7 +371,7 @@ static int return_editmesh_vgroup(char *name, float *cent)
/* find the vertices */
for(eve= em->verts.first; eve; eve= eve->next) {
- dvert= CustomData_em_get(&em->vdata, eve->data, LAYERTYPE_MDEFORMVERT);
+ dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
if(dvert) {
for(i=0; i<dvert->totweight; i++){
@@ -2139,14 +2139,14 @@ void special_editmenu(void)
}
else if(G.f & G_FACESELECT) {
Mesh *me= get_mesh(ob);
- TFace *tface;
+ MTFace *tface;
int a;
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5| TwoSide%x6|Clr Tex%x7| Shared%x8| Light%x9| Invisible%x10| Collision%x11| TwoSide%x12");
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++) {
if(tface->flag & SELECT) {
switch(nr) {
case 1:
@@ -2186,17 +2186,14 @@ void special_editmenu(void)
else if(G.f & G_VERTEXPAINT) {
Mesh *me= get_mesh(ob);
- if(me==0 || (me->mcol==NULL && me->tface==NULL) ) return;
+ if(me==0 || (me->mcol==NULL && me->mtface==NULL) ) return;
nr= pupmenu("Specials%t|Shared VertexCol%x1");
if(nr==1) {
- if(me->tface) tface_to_mcol(me);
-
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
do_shared_vertexcol(me);
- if(me->tface) mcol_to_tface(me, 1);
BIF_undo_push("Shared VertexCol");
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
@@ -2489,7 +2486,7 @@ static void curvetomesh(Object *ob)
void convertmenu(void)
{
- Base *base, *basen, *basact, *basedel=NULL;
+ Base *base, *basen=NULL, *basact, *basedel=NULL;
Object *obact, *ob, *ob1;
Curve *cu;
Nurb *nu;
@@ -2548,7 +2545,6 @@ void convertmenu(void)
if(ob->flag & OB_DONE);
else if(ob->type==OB_MESH && ob->modifiers.first) { /* converting a mesh with no modifiers causes a segfault */
DerivedMesh *dm;
- int needsfree=0;
basedel = base;
@@ -2574,12 +2570,12 @@ void convertmenu(void)
G.totmesh++;
/* make new mesh data from the original copy */
- dm= mesh_get_derived_final(ob1, &needsfree);
+ dm= mesh_get_derived_final(ob1);
/* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
DM_to_mesh(dm, ob1->data);
- if(needsfree) dm->release(dm);
+ dm->release(dm);
object_free_modifiers(ob1); /* after derivedmesh calls! */
/* If the original object is active then make this object active */
@@ -3263,13 +3259,15 @@ void copy_attr_tface(short event)
/* Face Select Mode */
Object *ob= OBACT;
Mesh *me= get_mesh(ob);
- TFace *tface;
- TFace *activetf= get_active_tface();
+ MTFace *tface;
+ MCol *activemcol;
+ MTFace *activetf= get_active_tface(&activemcol);
int a;
if(activetf==NULL) return;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ tface= me->mtface;
+ for(a=0; a<me->totface; a++, tface++) {
if(tface->flag & SELECT) {
switch(event) {
case 1:
@@ -3280,7 +3278,8 @@ void copy_attr_tface(short event)
case 2:
memcpy(tface->uv, activetf->uv, sizeof(tface->uv)); break;
case 3:
- memcpy(tface->col, activetf->col, sizeof(tface->col)); break;
+ if(activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*3); break;
case 4:
tface->mode = activetf->mode; break;
case 5:
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index 2a7df196bf0..46cdcad75db 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -102,7 +102,7 @@
/* local prototypes */
void clever_numbuts_sima(void);
-void sel_uvco_inside_radius(short , TFace *, int , float *, float *, short);
+void sel_uvco_inside_radius(short , MTFace *, int , float *, float *, short);
void uvedit_selectionCB(short , Object *, short *, float ); /* used in edit.c*/
void object_uvs_changed(Object *ob)
@@ -128,7 +128,7 @@ int is_uv_tface_editing_allowed_silent(void)
if(G.sima->mode!=SI_TEXTURE) return 0;
if(!(G.f & G_FACESELECT)) return 0;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return 0;
+ if(me==0 || me->mtface==0) return 0;
return 1;
}
@@ -169,7 +169,7 @@ void clever_numbuts_sima(void)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -213,7 +213,7 @@ void clever_numbuts_sima(void)
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
- TFace *tf= &((TFace*) me->tface)[i];
+ MTFace *tf= &((MTFace*) me->mtface)[i];
if (!(tf->flag & TF_SELECT))
continue;
@@ -243,13 +243,13 @@ void clever_numbuts_sima(void)
void be_square_tface_uv(Mesh *me)
{
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
/* if 1 vertex selected: doit (with the selected vertex) */
mface= (MFace*)me->mface;
- tface= (TFace*)me->tface;
+ tface= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(mface->v4) {
if(tface->flag & TF_SELECT) {
@@ -349,7 +349,7 @@ void mirrormenu_tface_uv(void)
void weld_align_tface_uv(char tool)
{
MFace *mface;
- TFace *tface;
+ MTFace *tface;
Mesh *me;
float min[2], max[2], cent[2];
int a;
@@ -364,7 +364,7 @@ void weld_align_tface_uv(char tool)
cent[1]= (min[1]+max[1])/2.0;
if(tool == 'x' || tool == 'w') {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -381,7 +381,7 @@ void weld_align_tface_uv(char tool)
}
if(tool == 'y' || tool == 'w') {
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -421,14 +421,14 @@ void weld_align_menu_tface_uv(void)
void select_swap_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a, sel=0;
if( is_uv_tface_editing_allowed()==0 ) return;
me= get_mesh(OBACT);
- for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++) {
if(tface->flag & TF_SELECT) {
if(tface->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
sel= 1;
@@ -438,7 +438,7 @@ void select_swap_tface_uv(void)
}
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mface->v4) {
if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
@@ -472,10 +472,10 @@ static int msel_hit(float *limit, unsigned int *hitarray, unsigned int vertexid,
return 0;
}
-static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
+static void find_nearest_tface(MTFace **nearesttf, MFace **nearestmf)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, i, nverts, mindist, dist, fcenter[2], uval[2];
short mval[2];
@@ -488,7 +488,7 @@ static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
me= get_mesh(OBACT);
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
@@ -514,7 +514,7 @@ static void find_nearest_tface(TFace **nearesttf, MFace **nearestmf)
}
}
-static int nearest_uv_between(TFace *tf, int nverts, int id, short *mval, int *uval)
+static int nearest_uv_between(MTFace *tf, int nverts, int id, short *mval, int *uval)
{
float m[3], v1[3], v2[3], c1, c2;
int id1, id2;
@@ -541,10 +541,10 @@ static int nearest_uv_between(TFace *tf, int nverts, int id, short *mval, int *u
return (c1*c2 >= 0.0f);
}
-static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *nearestuv)
+static void find_nearest_uv(MTFace **nearesttf, unsigned int *nearestv, int *nearestuv)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, i, nverts, mindist, dist, uval[2];
short mval[2];
@@ -556,7 +556,7 @@ static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *near
me= get_mesh(OBACT);
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
@@ -592,7 +592,7 @@ static void find_nearest_uv(TFace **nearesttf, unsigned int *nearestv, int *near
void mouse_select_sima(void)
{
Mesh *me;
- TFace *tf, *nearesttf;
+ MTFace *tf, *nearesttf;
MFace *mf, *nearestmf=NULL;
int a, selectsticky, sticky, actface, nearestuv, i;
unsigned int hitv[4], nearestv;
@@ -670,7 +670,7 @@ void mouse_select_sima(void)
/* (de)select sticky uv nodes */
if(sticky || actface) {
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
/* deselect */
if(selectsticky==0) {
for(a=me->totface; a>0; a--, tf++, mf++) {
@@ -714,7 +714,7 @@ void mouse_select_sima(void)
/* select face and deselect other faces */
if(actface) {
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
if(nearesttf && tf!=nearesttf)
@@ -726,7 +726,7 @@ void mouse_select_sima(void)
/* deselect uvs, and select sticky uvs */
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_SELECT) {
if(!actface) tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
@@ -757,7 +757,7 @@ void mouse_select_sima(void)
void borderselect_sima(short whichuvs)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
rcti rect;
rctf rectf;
@@ -778,7 +778,7 @@ void borderselect_sima(short whichuvs)
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -839,7 +839,7 @@ void borderselect_sima(short whichuvs)
* Just for readability...
*/
-void sel_uvco_inside_radius(short sel, TFace *tface, int index, float *offset, float *ell, short select_mask)
+void sel_uvco_inside_radius(short sel, MTFace *tface, int index, float *offset, float *ell, short select_mask)
{
// normalized ellipse: ell[0] = scaleX,
// [1] = scaleY
@@ -884,7 +884,7 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
float offset[2];
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
int i;
float ellipse[2]; // we need to deal with ellipses, as
@@ -900,7 +900,7 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
areamouseco_to_ipoco(G.v2d, mval, &offset[0], &offset[1]);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
if (selecting) {
for(i = 0; i < me->totface; i++) {
@@ -973,7 +973,7 @@ void mouseco_to_curtile(void)
void hide_tface_uv(int swap)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -982,7 +982,7 @@ void hide_tface_uv(int swap)
if(swap) {
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if((tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) {
if(!mface->v4)
@@ -994,7 +994,7 @@ void hide_tface_uv(int swap)
}
} else {
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
tface->flag &= ~TF_SELECT;
@@ -1012,7 +1012,7 @@ void hide_tface_uv(int swap)
void reveal_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1020,7 +1020,7 @@ void reveal_tface_uv(void)
me= get_mesh(OBACT);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++)
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++)
if(!(tface->flag & TF_HIDE))
if(!(tface->flag & TF_SELECT))
tface->flag |= (TF_SELECT|TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
@@ -1033,7 +1033,7 @@ void reveal_tface_uv(void)
void stitch_uv_tface(int mode)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
int a, vtot;
float newuv[2], limit[2];
UvMapVert *vlist, *iterv, *v;
@@ -1058,7 +1058,7 @@ void stitch_uv_tface(int mode)
limit[0]= limit[1]= limit[0]/256.0;
me= get_mesh(OBACT);
- tf= me->tface;
+ tf= me->mtface;
vmap= make_uv_vert_map(me->mface, tf, me->totface, me->totvert, 1, limit);
if(vmap == NULL)
@@ -1142,7 +1142,7 @@ void select_linked_tface_uv(int mode)
{
Mesh *me;
MFace *mf;
- TFace *tf, *nearesttf=NULL;
+ MTFace *tf, *nearesttf=NULL;
UvVertMap *vmap;
UvMapVert *vlist, *iterv, *startv;
unsigned int *stack, stacksize= 0, nearestv;
@@ -1166,7 +1166,7 @@ void select_linked_tface_uv(int mode)
}
get_connected_limit_tface_uv(limit);
- vmap= make_uv_vert_map(me->mface, me->tface, me->totface, me->totvert, 1, limit);
+ vmap= make_uv_vert_map(me->mface, me->mtface, me->totface, me->totvert, 1, limit);
if(vmap == NULL)
return;
@@ -1174,7 +1174,7 @@ void select_linked_tface_uv(int mode)
flag= MEM_callocN(sizeof(*flag)*me->totface, "UvLinkFlag");
if (mode == 2) {
- tf= me->tface;
+ tf= me->mtface;
for(a=0; a<me->totface; a++, tf++)
if(!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT))
if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) {
@@ -1184,7 +1184,7 @@ void select_linked_tface_uv(int mode)
}
}
else {
- tf= me->tface;
+ tf= me->mtface;
for(a=0; a<me->totface; a++, tf++)
if(tf == nearesttf) {
stack[stacksize]= a;
@@ -1198,7 +1198,7 @@ void select_linked_tface_uv(int mode)
stacksize--;
a= stack[stacksize];
mf= me->mface+a;
- tf= me->tface+a;
+ tf= me->mtface+a;
nverts= mf->v4? 4: 3;
@@ -1226,7 +1226,7 @@ void select_linked_tface_uv(int mode)
}
if(mode==0 || mode==2) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
else
@@ -1234,7 +1234,7 @@ void select_linked_tface_uv(int mode)
}
else if(mode==1) {
mf= me->mface;
- for(a=0, tf=me->tface; a<me->totface; a++, tf++, mf++) {
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
if(flag[a]) {
if (mf->v4) {
if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
@@ -1246,12 +1246,12 @@ void select_linked_tface_uv(int mode)
}
if (a<me->totface) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
else {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(flag[a])
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
}
@@ -1268,7 +1268,7 @@ void select_linked_tface_uv(int mode)
void unlink_selection(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1276,7 +1276,7 @@ void unlink_selection(void)
me= get_mesh(OBACT);
mface= me->mface;
- for(a=me->totface, tface= me->tface; a>0; a--, tface++, mface++) {
+ for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mface->v4) {
if(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4))
@@ -1318,7 +1318,7 @@ void toggle_uv_select(int mode)
void pin_tface_uv(int mode)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1326,7 +1326,7 @@ void pin_tface_uv(int mode)
me= get_mesh(OBACT);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
if(mode ==1){
@@ -1353,7 +1353,7 @@ void pin_tface_uv(int mode)
void select_pinned_tface_uv(void)
{
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
int a;
@@ -1361,7 +1361,7 @@ void select_pinned_tface_uv(void)
me= get_mesh(OBACT);
mface= me->mface;
- tface= me->tface;
+ tface= me->mtface;
for(a=me->totface; a>0; a--, tface++, mface++) {
if(tface->flag & TF_SELECT) {
@@ -1382,7 +1382,7 @@ void select_pinned_tface_uv(void)
int minmax_tface_uv(float *min, float *max)
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, sel;
@@ -1393,7 +1393,7 @@ int minmax_tface_uv(float *min, float *max)
sel= 0;
mf= (MFace*)me->mface;
- tf= (TFace*)me->tface;
+ tf= (MTFace*)me->mtface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(tf->flag & TF_HIDE);
else if(tf->flag & TF_SELECT) {
@@ -1547,7 +1547,7 @@ static void load_image_filesel(char *str) /* called from fileselect */
static void image_replace(Image *old, Image *new)
{
- TFace *tface;
+ MTFace *tface;
Mesh *me;
int a, rep=0;
@@ -1560,8 +1560,8 @@ static void image_replace(Image *old, Image *new)
me= G.main->mesh.first;
while(me) {
- if(me->tface) {
- tface= me->tface;
+ if(me->mtface) {
+ tface= me->mtface;
a= me->totface;
while(a--) {
if(tface->tpage==old) {
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index 2fa409b18f2..69e833442c1 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -52,6 +52,7 @@
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -162,7 +163,7 @@ void EM_backbuf_checkAndSelectFaces(EditMesh *em, int select)
void EM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
{
- TFace *tface = me->tface;
+ MTFace *tface = me->mtface;
int a;
if (tface) {
@@ -538,7 +539,7 @@ static void do_lasso_select_facemode(short mcords[][2], short moves, short selec
rcti rect;
me= get_mesh(OBACT);
- if(me==NULL || me->tface==NULL) return;
+ if(me==NULL || me->mtface==NULL) return;
if(me->totface==0) return;
em_vertoffs= me->totface+1; /* max index array */
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index 0e76083c08e..7c646a94031 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -64,6 +64,7 @@
#include "DNA_ipo_types.h"
#include "DNA_material_types.h"
#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_texture_types.h"
#include "DNA_space_types.h"
@@ -1709,13 +1710,13 @@ static void replace_image(ID *oldblock, ID *newblock) {
}
for (me= G.main->mesh.first; me; me= me->id.next) {
- TFace *tfaces= me->tface;
+ MTFace *tfaces= me->mtface;
if (tfaces) {
int i;
for (i=0; i<me->totface; i++) {
- TFace *tf= &tfaces[i];
+ MTFace *tf= &tfaces[i];
if (tf->tpage == oldima) {
/* not change_id_link, tpage's aren't owners :(
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index 712548387b3..c1ec6eaee33 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -60,6 +60,7 @@
#include "BLI_arithb.h"
#include "MTC_matrixops.h"
+#include "BKE_customdata.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_global.h"
@@ -217,54 +218,52 @@ FluidsimSettings *fluidsimSettingsNew(struct Object *srcob)
}
/* duplicate struct, analogous to free */
+static Mesh *fluidsimCopyMesh(Mesh *me)
+{
+ Mesh *dup = MEM_dupallocN(me);
+
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+ CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+
+ return dup;
+}
+
FluidsimSettings* fluidsimSettingsCopy(FluidsimSettings *fss)
{
FluidsimSettings *dupfss;
- Mesh *dupFsMesh = NULL;
if(!fss) return NULL;
dupfss = MEM_dupallocN(fss);
- dupFsMesh = fss->meshSurface;
- if(dupFsMesh) {
- dupfss->meshSurface = MEM_dupallocN(dupFsMesh);
- if(dupFsMesh->mvert) dupfss->meshSurface->mvert = MEM_dupallocN(dupFsMesh->mvert);
- if(dupFsMesh->medge) dupfss->meshSurface->medge = MEM_dupallocN(dupFsMesh->medge);
- if(dupFsMesh->mface) dupfss->meshSurface->mface = MEM_dupallocN(dupFsMesh->mface);
- }
-
- dupFsMesh = fss->meshBB;
- if(dupFsMesh) {
- dupfss->meshBB = MEM_dupallocN(dupFsMesh);
- if(dupFsMesh->mvert) dupfss->meshBB->mvert = MEM_dupallocN(dupFsMesh->mvert);
- if(dupFsMesh->medge) dupfss->meshBB->medge = MEM_dupallocN(dupFsMesh->medge);
- if(dupFsMesh->mface) dupfss->meshBB->mface = MEM_dupallocN(dupFsMesh->mface);
- }
+ if(fss->meshSurface)
+ dupfss->meshSurface = fluidsimCopyMesh(fss->meshSurface);
+ if(fss->meshBB)
+ dupfss->meshBB = fluidsimCopyMesh(fss->meshBB);
if(fss->meshSurfNormals) dupfss->meshSurfNormals = MEM_dupallocN(fss->meshSurfNormals);
return dupfss;
}
-
/* free struct */
+static void fluidsimFreeMesh(Mesh *me)
+{
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+
+ MEM_freeN(me);
+}
+
void fluidsimSettingsFree(FluidsimSettings *fss)
{
- Mesh *freeFsMesh = fss->meshSurface;
- if(freeFsMesh) {
- if(freeFsMesh->mvert){ MEM_freeN(freeFsMesh->mvert); freeFsMesh->mvert=NULL; }
- if(freeFsMesh->medge){ MEM_freeN(freeFsMesh->medge); freeFsMesh->medge=NULL; }
- if(freeFsMesh->mface){ MEM_freeN(freeFsMesh->mface); freeFsMesh->mface=NULL; }
- MEM_freeN(freeFsMesh);
+ if(fss->meshSurface) {
+ fluidsimFreeMesh(fss->meshSurface);
fss->meshSurface = NULL;
}
-
- freeFsMesh = fss->meshBB;
- if(freeFsMesh) { // same as before...
- if(freeFsMesh->mvert){ MEM_freeN(freeFsMesh->mvert); freeFsMesh->mvert=NULL; }
- if(freeFsMesh->medge){ MEM_freeN(freeFsMesh->medge); freeFsMesh->medge=NULL; }
- if(freeFsMesh->mface){ MEM_freeN(freeFsMesh->mface); freeFsMesh->mface=NULL; }
- MEM_freeN(freeFsMesh);
+ if(fss->meshBB) {
+ fluidsimFreeMesh(fss->meshBB);
fss->meshBB = NULL;
}
diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c
index 18bd611ba4e..b282e861ec7 100644
--- a/source/blender/src/header_view3d.c
+++ b/source/blender/src/header_view3d.c
@@ -302,7 +302,7 @@ static void do_view3d_view_alignviewmenu(void *arg, int event)
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
- if (me->tface) {
+ if (me->mtface) {
faceselect_align_view_to_selected(v3d, me, event);
addqueue(v3d->area->win, REDRAW, 1);
}
@@ -3971,7 +3971,7 @@ uiBlock *view3d_sculptmenu(void *arg_unused_so_why_have_it/*?*/)
static void do_view3d_facesel_propertiesmenu(void *arg, int event)
{
- TFace *tf = get_active_tface();
+ MTFace *tf = get_active_tface(NULL);
if (tf) {
switch(event) {
@@ -4028,7 +4028,7 @@ static void do_view3d_facesel_propertiesmenu(void *arg, int event)
static uiBlock *view3d_facesel_propertiesmenu(void *arg_unused)
{
- TFace *tf = get_active_tface();
+ MTFace *tf = get_active_tface(NULL);
uiBlock *block;
short yco = 20, menuwidth = 120;
@@ -4129,7 +4129,8 @@ static void do_view3d_faceselmenu(void *arg, int event)
/* code copied from buttons.c :(
would be nice if it was split up into functions */
Mesh *me;
- TFace *tf, *activetf;
+ MTFace *tf, *activetf;
+ MCol *activemcol;
int a;
switch(event) {
@@ -4137,10 +4138,10 @@ static void do_view3d_faceselmenu(void *arg, int event)
case 1: /* copy UVs */
case 2: /* copy vertex colors */
me= get_mesh(OBACT);
- activetf = get_active_tface();
+ activetf = get_active_tface(&activemcol);
if (me && activetf) {
- for (a=0, tf=me->tface; a < me->totface; a++, tf++) {
+ for (a=0, tf=me->mtface; a < me->totface; a++, tf++) {
if(tf!=activetf && (tf->flag & TF_SELECT)) {
if(event==0) {
tf->mode= activetf->mode;
@@ -4153,8 +4154,9 @@ static void do_view3d_faceselmenu(void *arg, int event)
if(activetf->mode & TF_TILES) tf->mode |= TF_TILES;
else tf->mode &= ~TF_TILES;
- } else if(event==2)
- memcpy(tf->col, activetf->col, sizeof(tf->col));
+ }
+ else if(event==2 && activemcol)
+ memcpy(&me->mcol[a], activemcol, sizeof(MCol)*4);
}
}
diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c
index a6b5f1654ef..0cb8c2feb66 100644
--- a/source/blender/src/imagepaint.c
+++ b/source/blender/src/imagepaint.c
@@ -546,7 +546,7 @@ static void imapaint_paint_stroke(ImagePaintState *s, BrushPainter *painter, sho
/* pick face and image */
if (facesel_face_pick(s->me, mval, &newfaceindex, 0)) {
- newimage = (Image*)((s->me->tface+newfaceindex)->tpage);
+ newimage = (Image*)((s->me->mtface+newfaceindex)->tpage);
texpaint_pick_uv(s->ob, s->me, newfaceindex, mval, newuv);
}
else
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index 91ad9e1a5fb..e8fd8d947c9 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -66,6 +66,7 @@ void sort_faces(void);
#include "BLI_arithb.h"
#include "BKE_depsgraph.h"
+#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
@@ -99,27 +100,6 @@ void sort_faces(void);
/* * ********************** no editmode!!! *********** */
-
-/** tests whether selected mesh objects have tfaces */
-static int testSelected_TfaceMesh(void)
-{
- Base *base;
- Mesh *me;
-
- base = FIRSTBASE;
- while (base) {
- if TESTBASE(base) {
- if(base->object->type==OB_MESH) {
- me= base->object->data;
- if (me->tface)
- return 1;
- }
- }
- base= base->next;
- }
- return 0;
-}
-
/* join selected meshes into the active mesh, context sensitive
return 0 if no join is made (error) and 1 of the join is done */
int join_mesh(void)
@@ -131,14 +111,13 @@ int join_mesh(void)
MVert *mvert, *mvertmain;
MEdge *medge = NULL, *medgemain;
MFace *mface = NULL, *mfacemain;
- TFace *tface = NULL, *tfacemain;
- unsigned int *mcol=NULL, *mcolmain;
float imat[4][4], cmat[4][4];
int a, b, totcol, totedge=0, totvert=0, totface=0, ok=0, vertofs, map[MAXMAT];
- int i, j, index, haskey=0, hasdefgroup=0;
+ int i, j, index, haskey=0, edgeofs, faceofs;
bDeformGroup *dg, *odg;
- MDeformVert *dvert, *dvertmain;
-
+ MDeformVert *dvert;
+ CustomData vdata, edata, fdata;
+
if(G.obedit) return 0;
ob= OBACT;
@@ -225,8 +204,6 @@ int join_mesh(void)
// Join this object's vertex groups to the base one's
for (dg=base->object->defbase.first; dg; dg=dg->next){
- hasdefgroup= 1;
-
/* See if this group exists in the object */
for (odg=ob->defbase.first; odg; odg=odg->next){
if (!strcmp(odg->name, dg->name)){
@@ -266,32 +243,22 @@ int join_mesh(void)
}
me= ob->data;
- mvert= mvertmain= MEM_mallocN(totvert*sizeof(MVert), "joinmesh vert");
- if(totedge) medge= medgemain= MEM_callocN(totedge*sizeof(MEdge), "joinmesh edge");
- else medgemain= NULL;
+ memset(&vdata, 0, sizeof(vdata));
+ memset(&edata, 0, sizeof(edata));
+ memset(&fdata, 0, sizeof(fdata));
- if (totface) mface= mfacemain= MEM_mallocN(totface*sizeof(MFace), "joinmesh face");
- else mfacemain= NULL;
-
- if(me->mcol) mcol= mcolmain= MEM_callocN(totface*4*sizeof(int), "joinmesh mcol");
- else mcolmain= NULL;
+ mvertmain= mvert= CustomData_add_layer(&vdata, CD_MVERT, 0, NULL, totvert);
+ medgemain= medge= CustomData_add_layer(&edata, CD_MEDGE, 0, NULL, totedge);
+ mfacemain= mface= CustomData_add_layer(&fdata, CD_MFACE, 0, NULL, totface);
- /* if active object doesn't have Tfaces, but one in the selection does,
- make TFaces for active, so we don't lose texture information in the
- join process */
- if(me->tface || testSelected_TfaceMesh()) tface= tfacemain= MEM_callocN(totface*4*sizeof(TFace), "joinmesh4");
- else tfacemain= NULL;
- if(me->dvert || hasdefgroup)
- dvert= dvertmain= MEM_callocN(totvert*sizeof(MDeformVert), "joinmesh5");
- else dvert=dvertmain= NULL;
-
- vertofs= 0;
-
/* inverse transorm all selected meshes in this object */
Mat4Invert(imat, ob->obmat);
+ vertofs= 0;
+ edgeofs= 0;
+ faceofs= 0;
base= FIRSTBASE;
while(base) {
nextb= base->next;
@@ -301,13 +268,13 @@ int join_mesh(void)
me= base->object->data;
if(me->totvert) {
+ CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&me->vdata, &vdata, 0, vertofs, me->totvert);
- memcpy(mvert, me->mvert, me->totvert*sizeof(MVert));
-
- copy_dverts(dvert, me->dvert, me->totvert);
+ dvert= CustomData_get(&vdata, vertofs, CD_MDEFORMVERT);
/* NEW VERSION */
- if (dvertmain){
+ if (dvert){
for (i=0; i<me->totvert; i++){
for (j=0; j<dvert[i].totweight; j++){
// Find the old vertex group
@@ -323,7 +290,6 @@ int join_mesh(void)
}
}
}
- dvert+=me->totvert;
}
if(base->object != ob) {
@@ -337,11 +303,6 @@ int join_mesh(void)
}
}
else mvert+= me->totvert;
-
- if(mcolmain) {
- if(me->mcol) memcpy(mcol, me->mcol, me->totface*4*4);
- mcol+= 4*me->totface;
- }
}
if(me->totface) {
@@ -359,50 +320,37 @@ int join_mesh(void)
}
}
- memcpy(mface, me->mface, me->totface*sizeof(MFace));
-
- a= me->totface;
- while(a--) {
+ CustomData_merge(&me->fdata, &fdata, CD_MASK_MESH, CD_DEFAULT, totface);
+ CustomData_copy_data(&me->fdata, &fdata, 0, vertofs, me->totface);
+
+ for(a=0; a<me->totface; a++, mface++) {
mface->v1+= vertofs;
mface->v2+= vertofs;
mface->v3+= vertofs;
if(mface->v4) mface->v4+= vertofs;
mface->mat_nr= map[(int)mface->mat_nr];
-
- mface++;
}
-
- if(tfacemain) {
- if(me->tface) {
- memcpy(tface, me->tface, me->totface*sizeof(TFace));
- tface+= me->totface;
- }
- else {
- for(a=0; a<me->totface; a++, tface++) {
- default_tface(tface);
- }
- }
- }
-
+
+ faceofs += me->totface;
}
if(me->totedge) {
- memcpy(medge, me->medge, me->totedge*sizeof(MEdge));
-
- a= me->totedge;
- while(a--) {
+ CustomData_merge(&me->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+ CustomData_copy_data(&me->edata, &edata, 0, vertofs, me->totedge);
+
+ for(a=0; a<me->totedge; a++, medge++) {
medge->v1+= vertofs;
medge->v2+= vertofs;
- medge++;
}
+
+ edgeofs += me->totedge;
}
- vertofs+= me->totvert;
+ vertofs += me->totvert;
- if(base->object!=ob) {
+ if(base->object!=ob)
free_and_unlink_base(base);
- }
}
}
base= nextb;
@@ -410,28 +358,20 @@ int join_mesh(void)
me= ob->data;
- if(me->mvert) MEM_freeN(me->mvert);
- me->mvert= mvertmain;
-
- if(me->medge) MEM_freeN(me->medge);
- me->medge= medgemain;
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
- if(me->mface) MEM_freeN(me->mface);
- me->mface= mfacemain;
-
- if(me->dvert) free_dverts(me->dvert, me->totvert);
- me->dvert = dvertmain;
-
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= (MCol *)mcolmain;
-
- if(me->tface) MEM_freeN(me->tface);
- me->tface= tfacemain;
-
me->totvert= totvert;
me->totedge= totedge;
me->totface= totface;
+ me->vdata= vdata;
+ me->edata= edata;
+ me->fdata= fdata;
+
+ mesh_update_customdata_pointers(me);
+
/* old material array */
for(a=1; a<=ob->totcol; a++) {
ma= ob->mat[a-1];
@@ -586,7 +526,7 @@ void sort_faces(void)
{
Object *ob= OBACT;
Mesh *me;
-
+ CustomDataLayer *layer;
int i, *index;
if(ob==0) return;
@@ -606,13 +546,13 @@ void sort_faces(void)
mfacebase = me->mface;
/* sort index list instead of faces itself
- and apply this permutation to the face list plus
- to the texture faces */
+ and apply this permutation to all face layers */
qsort(index, me->totface, sizeof(int), verg_mface);
- permutate(mfacebase, me->totface, sizeof(MFace), index);
- if (me->tface)
- permutate(me->tface, me->totface, sizeof(TFace), index);
+ for(i = 0; i < me->fdata.totlayer; i++) {
+ layer = &me->fdata.layers[i];
+ permutate(layer->data, me->totface, CustomData_sizeof(layer->type), index);
+ }
MEM_freeN(index);
diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c
index b3bbd0f2972..ab5532b1ee3 100644
--- a/source/blender/src/multires.c
+++ b/source/blender/src/multires.c
@@ -43,6 +43,7 @@
#include "DNA_scene_types.h"
#include "DNA_vec_types.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
@@ -303,9 +304,8 @@ void convert_to_multires_col(MultiresCol *mrc, MCol *mcol)
mrc->g= mcol->g;
mrc->b= mcol->b;
}
-void convert_to_multires_uvcol(MultiresCol *mrc, TFace *t, const unsigned char j)
+void convert_to_multires_uv(MultiresCol *mrc, MTFace *t, const unsigned char j)
{
- convert_to_multires_col(mrc, (MCol*)(&t->col[j]));
mrc->u= t->uv[j][0];
mrc->v= t->uv[j][1];
}
@@ -335,11 +335,10 @@ void convert_from_multires_col(MultiresCol *mrc, MCol *mcol)
mcol->g= clamp_component(mrc->g);
mcol->b= clamp_component(mrc->b);
}
-void texcolface_to_tface(MultiresTexColFace *f, TFace *t)
+void texcolface_to_tface(MultiresTexColFace *f, MTFace *t)
{
unsigned i;
for(i=0; i<4; ++i) {
- convert_from_multires_col(&f->col[i], (MCol*)(&t->col[i]));
t->uv[i][0]= f->col[i].u;
t->uv[i][1]= f->col[i].v;
}
@@ -416,27 +415,21 @@ void multires_load_cols(Mesh *me)
MultiresLevel *lvl= BLI_findlink(&me->mr->levels,me->mr->current-1), *cur;
unsigned i,j;
- if(!me->mcol && !me->tface) return;
+ if(!me->mcol && !me->mtface) return;
/* Add texcol data */
for(cur= me->mr->levels.first; cur; cur= cur->next)
if(!cur->texcolfaces)
cur->texcolfaces= MEM_callocN(sizeof(MultiresTexColFace)*cur->totface,"TexColFaces");
- if(me->mcol) {
- me->mr->use_col= 1;
- for(i=0; i<me->totface; ++i)
- for(j=0; j<4; ++j)
- convert_to_multires_col(&lvl->texcolfaces[i].col[j],&me->mcol[i*4+j]);
- }
+ me->mr->use_col= (me->mcol != NULL);
+ me->mr->use_tex= (me->mtface != NULL);
- if(me->tface) {
- me->mr->use_tex= 1;
- for(i=0; i<me->totface; ++i) {
- MultiresTexColFace *f= &lvl->texcolfaces[i];
- TFace *t= &me->tface[i];
- for(j=0; j<4; ++j)
- convert_to_multires_uvcol(&f->col[j],t,j);
+ for(i=0; i<me->totface; ++i) {
+ MultiresTexColFace *f= &lvl->texcolfaces[i];
+
+ if(me->mtface) {
+ MTFace *t= &me->mtface[i];
f->tex_page= t->tpage;
f->tex_transp= t->transp;
@@ -444,6 +437,13 @@ void multires_load_cols(Mesh *me)
f->tex_tile= t->tile;
f->tex_unwrap= t->unwrap;
}
+
+ for(j=0; j<4; ++j) {
+ if(me->mcol)
+ convert_to_multires_col(&f->col[j],&me->mcol[i*4+j]);
+ if(me->mtface)
+ convert_to_multires_uv(&f->col[j],&me->mtface[i],j);
+ }
}
/* Update higher levels */
@@ -686,9 +686,9 @@ void check_colors(Mesh *me)
}
/* Check if texfaces have been deleted or added */
- if(me->mr->use_tex && !me->tface)
+ if(me->mr->use_tex && !me->mtface)
me->mr->use_tex= 0;
- else if(!me->mr->use_tex && me->tface) {
+ else if(!me->mr->use_tex && me->mtface) {
me->mr->use_tex= 1;
multires_load_cols(me);
}
@@ -911,18 +911,21 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
int i,sm= G.f & G_SCULPTMODE;
if(sm) set_sculptmode();
- if(me->mvert) MEM_freeN(me->mvert);
- if(me->mface) MEM_freeN(me->mface);
- if(me->medge) MEM_freeN(me->medge);
- free_dverts(me->dvert, me->totvert);
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+ CustomData_free_layer(&me->vdata, CD_MDEFORMVERT, me->totvert);
+ CustomData_free_layer(&me->fdata, CD_MTFACE, me->totface);
+ CustomData_free_layer(&me->fdata, CD_MCOL, me->totface);
+ mesh_update_customdata_pointers(me);
me->totvert= lvl->totvert;
me->totface= lvl->totface;
me->totedge= lvl->totedge;
- me->mvert= MEM_callocN(sizeof(MVert)*me->totvert, "multires dlm mverts");
- me->mface= MEM_callocN(sizeof(MFace)*me->totface, "multires dlm mfaces");
- me->medge= MEM_callocN(sizeof(MEdge)*me->totedge, "multires dlm medges");
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, NULL, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
/* Vertices/Edges/Faces */
for(i=0; i<lvl->totvert; ++i)
@@ -941,7 +944,7 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
/* Vertex groups */
if(me->mr->dverts && lvl==me->mr->levels.first) {
- me->dvert= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "MDeformVert");
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, NULL, me->totvert);
copy_dverts(me->dvert, me->mr->dverts, lvl->totvert);
} else if(me->mr->dverts) {
MultiresLevel *dlvl, *lvl1= me->mr->levels.first;
@@ -987,21 +990,20 @@ void multires_level_to_mesh(Object *ob, Mesh *me)
MEM_freeN(lvl_dverts[i]);
}
- me->dvert= lvl_dverts[dlvl_ndx-1];
+ me->dvert= CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 0, lvl_dverts[dlvl_ndx-1], me->totvert);
MEM_freeN(lvl_dverts);
}
if(me->mr->use_tex) {
- if(me->tface) MEM_freeN(me->tface);
- me->tface= MEM_callocN(sizeof(TFace)*me->totface, "multires dlm tface");
+ me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, 0, NULL, me->totface);
for(i=0; i<lvl->totface; ++i)
- texcolface_to_tface(&lvl->texcolfaces[i],&me->tface[i]);
+ texcolface_to_tface(&lvl->texcolfaces[i],&me->mtface[i]);
- } else if(me->mr->use_col) {
- if(me->mcol) MEM_freeN(me->mcol);
- me->mcol= MEM_callocN(sizeof(MCol)*me->totface*4, "multires dlm mcol");
+ }
+ if(me->mr->use_col) {
+ me->mcol= CustomData_add_layer(&me->fdata, CD_MCOL, 0, NULL, me->totface);
for(i=0; i<lvl->totface; ++i)
multirestexcol_to_mcol(&lvl->texcolfaces[i], &me->mcol[i*4]);
@@ -1027,22 +1029,14 @@ void multires_update_colors(Mesh *me)
if(me->mr->use_col || me->mr->use_tex) {
/* Calc initial deltas */
cr_deltas= MEM_callocN(sizeof(MultiresCol)*lvl->totface*4,"initial color/uv deltas");
- if(me->mr->use_tex) {
- for(i=0; i<lvl->totface; ++i) {
- for(j=0; j<4; ++j) {
- MultiresCol col;
- convert_to_multires_uvcol(&col,&me->tface[i],j);
- cr_deltas[i*4+j].a= col.a - lvl->texcolfaces[i].col[j].a;
- cr_deltas[i*4+j].r= col.r - lvl->texcolfaces[i].col[j].r;
- cr_deltas[i*4+j].g= col.g - lvl->texcolfaces[i].col[j].g;
- cr_deltas[i*4+j].b= col.b - lvl->texcolfaces[i].col[j].b;
- cr_deltas[i*4+j].u= col.u - lvl->texcolfaces[i].col[j].u;
- cr_deltas[i*4+j].v= col.v - lvl->texcolfaces[i].col[j].v;
+
+ for(i=0; i<lvl->totface; ++i) {
+ for(j=0; j<4; ++j) {
+ if(me->mr->use_tex) {
+ cr_deltas[i*4+j].u= me->mtface[i].uv[j][0] - lvl->texcolfaces[i].col[j].u;
+ cr_deltas[i*4+j].v= me->mtface[i].uv[j][1] - lvl->texcolfaces[i].col[j].v;
}
- }
- } else if(me->mr->use_col) {
- for(i=0; i<lvl->totface; ++i) {
- for(j=0; j<4; ++j) {
+ if(me->mr->use_col) {
cr_deltas[i*4+j].a= me->mcol[i*4+j].a - lvl->texcolfaces[i].col[j].a;
cr_deltas[i*4+j].r= me->mcol[i*4+j].r - lvl->texcolfaces[i].col[j].r;
cr_deltas[i*4+j].g= me->mcol[i*4+j].g - lvl->texcolfaces[i].col[j].g;
@@ -1055,8 +1049,8 @@ void multires_update_colors(Mesh *me)
for(i=0; i<lvl->totface; ++i) {
for(j=0; j<4; ++j) {
if(me->mr->use_tex)
- convert_to_multires_uvcol(&lvl->texcolfaces[i].col[j],&me->tface[i],j);
- else
+ convert_to_multires_uv(&lvl->texcolfaces[i].col[j],&me->mtface[i],j);
+ if(me->mr->use_col)
convert_to_multires_col(&lvl->texcolfaces[i].col[j],&me->mcol[i*4+j]);
}
}
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 432c7d9d4f0..9f9c1999a6f 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -752,11 +752,10 @@ void pose_adds_vgroups(Object *meshobj)
bPoseChannel *pchan;
Bone *bone;
bDeformGroup *dg, *curdef;
- int DMneedsFree;
if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) return;
- dm = mesh_get_derived_final(meshobj, &DMneedsFree);
+ dm = mesh_get_derived_final(meshobj);
map.meshobj= meshobj;
@@ -808,7 +807,7 @@ void pose_adds_vgroups(Object *meshobj)
}
}
- if (DMneedsFree) dm->release(dm);
+ dm->release(dm);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c
index b1f3bf520f2..d32d661ef37 100644
--- a/source/blender/src/sculptmode.c
+++ b/source/blender/src/sculptmode.c
@@ -53,6 +53,7 @@
#include "DNA_view3d_types.h"
#include "DNA_userdef_types.h"
+#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
@@ -340,8 +341,9 @@ void sculptmode_undo_update(SculptUndoStep *newcur)
/* Verts */
if(newcur->verts) {
- MEM_freeN(me->mvert);
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
me->mvert= MEM_dupallocN(newcur->verts);
+ CustomData_add_layer(&me->vdata, CD_MVERT, 0, me->mvert, newcur->totvert);
}
/* Check if faces/edges have been modified between oldcur and newcur */
@@ -363,10 +365,14 @@ void sculptmode_undo_update(SculptUndoStep *newcur)
if(do_fe)
for(sus= newcur; sus; sus= sus->prev) {
if(sus->edges || sus->faces) {
- MEM_freeN(me->mface);
- MEM_freeN(me->medge);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+
me->medge= MEM_dupallocN(sus->edges);
me->mface= MEM_dupallocN(sus->faces);
+ CustomData_add_layer(&me->edata, CD_MEDGE, 0, me->medge, sus->totedge);
+ CustomData_add_layer(&me->fdata, CD_MFACE, 0, me->mface, sus->totface);
+
me->totvert= sus->totvert;
me->totedge= sus->totedge;
me->totface= sus->totface;
@@ -1705,7 +1711,7 @@ void sculptmode_revert_pmv(Mesh *me)
{
if(me->pv) {
unsigned i;
- MVert *nve;
+ MVert *nve, *old_verts;
Object *ob= G.scene->sculptdata.active_ob;
/* Temporarily exit sculptmode */
@@ -1713,21 +1719,25 @@ void sculptmode_revert_pmv(Mesh *me)
/* Reorder vertices */
nve= me->mvert;
- me->mvert= MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
- me->totvert= me->pv->totvert;
- for(i=0; i<me->totvert; ++i)
- me->mvert[i]= nve[me->pv->vert_map[i]];
- MEM_freeN(nve);
+ old_verts = MEM_mallocN(sizeof(MVert)*me->pv->totvert,"PMV revert verts");
+ for(i=0; i<me->pv->totvert; ++i)
+ old_verts[i]= nve[me->pv->vert_map[i]];
- /* Restore edges and faces */
- MEM_freeN(me->mface);
- MEM_freeN(me->medge);
- me->totface= me->pv->totface;
+ /* Restore verts, edges and faces */
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->totvert);
+ CustomData_free_layer(&me->edata, CD_MEDGE, me->totedge);
+ CustomData_free_layer(&me->fdata, CD_MFACE, me->totface);
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, old_verts, me->pv->totvert);
+ me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, 0, me->pv->old_edges, me->pv->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, 0, me->pv->old_faces, me->pv->totface);
+
+ me->totvert= me->pv->totvert;
me->totedge= me->pv->totedge;
- me->mface= me->pv->old_faces;
- me->medge= me->pv->old_edges;
- me->pv->old_faces= NULL;
+ me->totface= me->pv->totface;
+
me->pv->old_edges= NULL;
+ me->pv->old_faces= NULL;
/* Free maps */
MEM_freeN(me->pv->edge_map);
@@ -1851,8 +1861,8 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
++ndx_show;
}
}
- MEM_freeN(me->mvert);
- me->mvert= nve;
+ CustomData_free_layer(&me->vdata, CD_MVERT, me->pv->totvert);
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, 0, nve, me->totvert);
/* Create new face array */
me->pv->old_faces= me->mface;
@@ -1879,11 +1889,12 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
cr_f->v2= me->pv->vert_map[pr_f->v2];
cr_f->v3= me->pv->vert_map[pr_f->v3];
cr_f->v4= pr_f->v4 ? me->pv->vert_map[pr_f->v4] : 0;
- test_index_face(cr_f,NULL,NULL,pr_f->v4?4:3);
+ test_index_face(cr_f,NULL,0,pr_f->v4?4:3);
++face_ndx_show;
}
}
me->totface= face_cnt_show;
+ CustomData_set_layer(&me->fdata, CD_MFACE, me->mface);
/* Create new edge array */
me->pv->old_edges= me->medge;
@@ -1903,6 +1914,7 @@ void sculptmode_do_pmv(Object *ob, rcti *hb_2d, int mode)
else me->pv->edge_map[i]= -1;
}
me->totedge= edge_cnt_show;
+ CustomData_set_layer(&me->edata, CD_MEDGE, me->medge);
set_sculpt_object(ob);
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index 078c6f6a886..b43e90feb51 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -559,7 +559,7 @@ static void align_view_to_selected(View3D *v3d)
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
- if (me->tface) {
+ if (me->mtface) {
faceselect_align_view_to_selected(v3d, me, axis);
addqueue(v3d->area->win, REDRAW, 1);
}
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index e1c9726b6cf..d24e1277cef 100755
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -1473,7 +1473,6 @@ static float *get_crazy_mapped_editverts(void)
DerivedMesh *dm;
ModifierData *md;
float *vertexcos;
- int needsFree;
int i;
for( i = 0, md=G.obedit->modifiers.first; md; ++i, md=md->next ) {
@@ -1485,16 +1484,16 @@ static float *get_crazy_mapped_editverts(void)
/* this call disables subsurf and enables the underlying modifier to deform, apparently */
modifiers_setOnCage(G.obedit, md);
/* make it all over */
- makeDispListMesh(G.obedit);
+ makeDerivedMesh(G.obedit);
}
/* now get the cage */
- dm= editmesh_get_derived_cage(&needsFree);
+ dm= editmesh_get_derived_cage();
vertexcos= MEM_mallocN(3*sizeof(float)*G.totvert, "vertexcos map");
dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
- if (needsFree) dm->release(dm);
+ dm->release(dm);
if(md) {
/* set back the flag, no new cage needs to be built, transform does it */
@@ -1776,8 +1775,8 @@ static void createTransUVs(TransInfo *t)
TransData *td = NULL;
TransData2D *td2d = NULL;
Mesh *me;
- TFace *tf;
MFace *mf;
+ MTFace *tf;
int a, count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
@@ -1785,7 +1784,7 @@ static void createTransUVs(TransInfo *t)
me= get_mesh(OBACT);
/* count */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && tf->flag & TF_SELECT) {
@@ -1812,7 +1811,7 @@ static void createTransUVs(TransInfo *t)
td= t->data;
td2d= t->data2d;
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=me->totface; a>0; a--, tf++, mf++) {
if(mf->v3 && tf->flag & TF_SELECT) {
diff --git a/source/blender/src/unwrapper.c b/source/blender/src/unwrapper.c
index 851486de323..b0716b81b91 100644
--- a/source/blender/src/unwrapper.c
+++ b/source/blender/src/unwrapper.c
@@ -82,7 +82,7 @@ static void hash_add_face(EdgeHash *ehash, MFace *mf)
void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
{
- TFace *tf;
+ MTFace *tf;
MFace *mf;
int a, doit=1, mark=0;
char *linkflag;
@@ -105,7 +105,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
}
else {
/* fill array by selection */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=0; a<me->totface; a++, tf++, mf++) {
if(tf->flag & TF_HIDE);
@@ -120,7 +120,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
doit= 0;
/* expand selection */
- tf= me->tface;
+ tf= me->mtface;
mf= me->mface;
for(a=0; a<me->totface; a++, tf++, mf++) {
if(tf->flag & TF_HIDE)
@@ -161,24 +161,24 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
BLI_edgehash_free(seamhash, NULL);
if(mode==0 || mode==2) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag |= TF_SELECT;
else
tf->flag &= ~TF_SELECT;
}
else if(mode==1) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a] && (tf->flag & TF_SELECT))
break;
if (a<me->totface) {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag &= ~TF_SELECT;
}
else {
- for(a=0, tf=me->tface; a<me->totface; a++, tf++)
+ for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
if(linkflag[a])
tf->flag |= TF_SELECT;
}
@@ -195,7 +195,7 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short sel)
{
int a;
- TFace *tf;
+ MTFace *tf;
MFace *mf;
MVert *mv;
MEdge *medge;
@@ -205,7 +205,7 @@ ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short
mv= me->mvert;
mf= me->mface;
- tf= me->tface;
+ tf= me->mtface;
for (a=0; a<me->totface; a++, mf++, tf++) {
ParamKey key, vkeys[4];
ParamBool pin[4], select[4];
@@ -282,7 +282,7 @@ void unwrap_lscm(short seamcut)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
handle = construct_param_handle(me, 0, fillholes, seamcut == 0);
@@ -315,7 +315,7 @@ void minimize_stretch_tface_uv(void)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me = get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
handle = construct_param_handle(me, 1, fillholes, 1);
@@ -409,7 +409,7 @@ void unwrap_lscm_live_begin(void)
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
me= get_mesh(OBACT);
- if(me==0 || me->tface==0) return;
+ if(me==0 || me->mtface==0) return;
liveHandle = construct_param_handle(me, 0, fillholes, 1);
diff --git a/source/blender/src/verse_mesh.c b/source/blender/src/verse_mesh.c
index 1445c5471d1..8a752150540 100644
--- a/source/blender/src/verse_mesh.c
+++ b/source/blender/src/verse_mesh.c
@@ -41,11 +41,12 @@
#include "BLI_edgehash.h"
#include "BLI_editVert.h"
+#include "BKE_customdata.h"
+#include "BKE_depsgraph.h"
#include "BKE_global.h"
-#include "BKE_verse.h"
#include "BKE_mesh.h"
-#include "BKE_depsgraph.h"
#include "BKE_utildefines.h"
+#include "BKE_verse.h"
#include "BIF_verse.h"
#include "BIF_editmesh.h"
@@ -1414,34 +1415,11 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
vert_vlayer = find_verse_layer_type((VGeomData*)vnode->data, VERTEX_LAYER);
face_vlayer = find_verse_layer_type((VGeomData*)vnode->data, POLYGON_LAYER);
- if(me->mvert) {
- MEM_freeN(me->mvert);
- me->mvert = NULL;
- }
- if(me->mface) {
- MEM_freeN(me->mface);
- me->mface = NULL;
- }
- if(me->tface) {
- MEM_freeN(me->tface);
- me->tface = NULL;
- }
- if(me->medge) {
- MEM_freeN(me->medge);
- me->medge = NULL;
- }
- if(me->dvert) {
- MEM_freeN(me->dvert);
- me->dvert = NULL;
- }
- if(me->mcol) {
- MEM_freeN(me->mcol);
- me->mcol = NULL;
- }
- if(me->msticky) {
- MEM_freeN(me->msticky);
- me->msticky = NULL;
- }
+ CustomData_free(&me->vdata, me->totvert);
+ CustomData_free(&me->edata, me->totedge);
+ CustomData_free(&me->fdata, me->totface);
+ mesh_update_customdata_pointers(me);
+
if(me->mselect) {
MEM_freeN(me->mselect);
me->mselect = NULL;
@@ -1451,8 +1429,8 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
me->totface = face_vlayer->dl.da.count;
me->totselect = 0;
- mvert = me->mvert = (MVert*)MEM_mallocN(sizeof(MVert)*me->totvert, "mesh_from_verse vert");
- mface = me->mface = (MFace*)MEM_mallocN(sizeof(MFace)*me->totface, "mesh_from_verse face");
+ mvert = me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, 0, NULL, me->totvert);
+ mface = me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, 0, NULL, me->totface);
index = 0;
vvert = vert_vlayer->dl.lb.first;
@@ -1495,7 +1473,7 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
mface->edcode = 0;
/* index 0 isn't allowed at location 3 or 4 */
- test_index_face(mface, NULL, NULL, vface->vvert3?4:3);
+ test_index_face(mface, NULL, 0, vface->vvert3?4:3);
/* printf("\t mface: %d, %d, %d, %d\n", mface->v1, mface->v2, mface->v3, mface->v4);*/
vface = vface->next;
@@ -1506,7 +1484,7 @@ void create_meshdata_from_geom_node(Mesh *me, VNode *vnode)
if(me->totedge) {
EdgeHashIterator *i;
- MEdge *medge = me->medge = (MEdge *)MEM_mallocN(sizeof(MEdge)*me->totedge, "mesh_from_verse edge");
+ MEdge *medge = me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, 0, NULL, me->totedge);
for(i = BLI_edgehashIterator_new(edges); !BLI_edgehashIterator_isDone(i); BLI_edgehashIterator_step(i), ++medge) {
BLI_edgehashIterator_getKey(i, (int*)&medge->v1, (int*)&medge->v2);
diff --git a/source/blender/src/verse_object.c b/source/blender/src/verse_object.c
index 1b7e2a5157e..6f6113b75dc 100644
--- a/source/blender/src/verse_object.c
+++ b/source/blender/src/verse_object.c
@@ -414,7 +414,7 @@ void b_verse_unsubscribe(VNode *vnode)
}
/* reinitialize object derived mesh */
- makeDispListMesh(ob);
+ makeDerivedMesh(ob);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else if(vnode->type==V_NT_BITMAP) {
@@ -445,7 +445,7 @@ void post_link_set(VLink *vlink)
me = (Mesh*)((VGeomData*)target->data)->mesh;
if(ob && me && ob->data!=me) {
ob->data = me;
- makeDispListMesh(ob);
+ makeDerivedMesh(ob);
}
}
@@ -573,11 +573,13 @@ void post_object_free_constraint(VNode *vnode)
struct Object *ob = (Object*)((VObjectData*)vnode->data)->object;
if(ob) {
if(ob->derivedFinal) {
- ((DerivedMesh*)ob->derivedFinal)->release((DerivedMesh*)ob->derivedFinal);
+ ob->derivedFinal->needsFree = 1;
+ ob->derivedFinal->release((DerivedMesh*)ob->derivedFinal);
ob->derivedFinal = NULL;
}
if(ob->derivedDeform) {
- ((DerivedMesh*)ob->derivedDeform)->release((DerivedMesh*)ob->derivedDeform);
+ ob->derivedDeform->needsFree = 1;
+ ob->derivedDeform->release((DerivedMesh*)ob->derivedDeform);
ob->derivedDeform = NULL;
}
}
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 508b8c48d14..13fadc195fe 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -64,6 +64,7 @@
#include "BKE_armature.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_customdata.h"
#include "BKE_depsgraph.h"
#include "BKE_deform.h"
#include "BKE_displist.h"
@@ -154,7 +155,7 @@ void do_shared_vertexcol(Mesh *me)
/* if no mcol: do not do */
/* if tface: only the involved faces, otherwise all */
MFace *mface;
- TFace *tface;
+ MTFace *tface;
int a;
short *scolmain, *scol;
char *mcol;
@@ -163,7 +164,7 @@ void do_shared_vertexcol(Mesh *me)
scolmain= MEM_callocN(4*sizeof(short)*me->totvert, "colmain");
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
@@ -193,7 +194,7 @@ void do_shared_vertexcol(Mesh *me)
scol+= 4;
}
- tface= me->tface;
+ tface= me->mtface;
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
@@ -215,16 +216,11 @@ void do_shared_vertexcol(Mesh *me)
MEM_freeN(scolmain);
}
-void make_vertexcol() /* single ob */
+void make_vertexcol(int shade) /* single ob */
{
Object *ob;
Mesh *me;
- /*
- * Always copies from shadedisplist to mcol.
- * When there are tfaces, it copies the colors and frees mcol
- */
-
if(G.obedit) {
error("Unable to perform function in Edit Mode");
return;
@@ -235,18 +231,21 @@ void make_vertexcol() /* single ob */
me= get_mesh(ob);
if(me==0) return;
- if(me->mcol) MEM_freeN(me->mcol);
- shadeMeshMCol(ob, me);
-
- if(me->tface) mcol_to_tface(me, 1);
-
+ /* copies from shadedisplist to mcol */
+ if(me->mcol == NULL)
+ me->mcol = CustomData_add_layer(&me->fdata, CD_MCOL, 0, NULL, me->totface);
+
+ if(shade)
+ shadeMeshMCol(ob, me);
+ else
+ memset(me->mcol, 255, sizeof(MCol)*me->totface);
+
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
}
-
void copy_vpaint_undo(unsigned int *mcol, int tot)
{
if(vpaintundobuf) MEM_freeN(vpaintundobuf);
@@ -272,11 +271,8 @@ void vpaint_undo()
ob= OBACT;
me= get_mesh(ob);
- if(me==0 || me->totface==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
- if(me->tface) tface_to_mcol(me);
- else if(me->mcol==0) return;
-
a= MIN2(me->totface, totvpaintundo);
from= vpaintundobuf;
to= (unsigned int *)me->mcol;
@@ -290,7 +286,6 @@ void vpaint_undo()
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
- if(me->tface) mcol_to_tface(me, 1);
}
void clear_vpaint()
@@ -306,10 +301,7 @@ void clear_vpaint()
me= get_mesh(ob);
if(!ob || ob->id.lib) return;
- if(me==0 || me->totface==0) return;
-
- if(me->tface) tface_to_mcol(me);
- if(me->mcol==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
paintcol= vpaint_get_current_col();
@@ -324,33 +316,33 @@ void clear_vpaint()
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
- if(me->tface) mcol_to_tface(me, 1);
}
void clear_vpaint_selectedfaces()
{
Mesh *me;
- TFace *tf;
+ MTFace *tf;
Object *ob;
- unsigned int paintcol;
+ unsigned int paintcol, *mcol;
int i;
ob= OBACT;
-
me= get_mesh(ob);
- tf = me->tface;
- if (!tf) return; /* should not happen, but you never know */
+ if(me==0 || me->mtface==0 || me->totface==0) return;
- if(me==0 || me->totface==0) return;
+ if(!me->mcol)
+ make_vertexcol(0);
paintcol= vpaint_get_current_col();
- for (i = 0; i < me->totface; i++) {
- if (tf[i].flag & TF_SELECT) {
- tf[i].col[0] = paintcol;
- tf[i].col[1] = paintcol;
- tf[i].col[2] = paintcol;
- tf[i].col[3] = paintcol;
+ tf = me->mtface;
+ mcol = (unsigned int*)me->mcol;
+ for (i = 0; i < me->totface; i++, tf++, mcol+=4) {
+ if (tf->flag & TF_SELECT) {
+ mcol[0] = paintcol;
+ mcol[1] = paintcol;
+ mcol[2] = paintcol;
+ mcol[3] = paintcol;
}
}
@@ -366,7 +358,7 @@ void clear_wpaint_selectedfaces()
extern float editbutvweight;
float paintweight= editbutvweight;
Mesh *me;
- TFace *tface;
+ MTFace *tface;
MFace *mface;
Object *ob;
int index, vgroup;
@@ -377,10 +369,10 @@ void clear_wpaint_selectedfaces()
ob= OBACT;
me= ob->data;
- if(me==0 || me->totface==0 || me->dvert==0 || !me->tface) return;
+ if(me==0 || me->totface==0 || me->dvert==0 || !me->mtface) return;
if(indexar==NULL) init_vertexpaint();
- for(index=0, tface=me->tface; index<me->totface; index++, tface++) {
+ for(index=0, tface=me->mtface; index<me->totface; index++, tface++) {
if((tface->flag & TF_SELECT)==0)
indexar[index]= 0;
else
@@ -480,10 +472,7 @@ void vpaint_dogamma()
ob= OBACT;
me= get_mesh(ob);
- if(me==0 || me->totface==0) return;
-
- if(me->tface) tface_to_mcol(me);
- else if(me->mcol==0) return;
+ if(me==0 || me->mcol==0 || me->totface==0) return;
copy_vpaint_undo((unsigned int *)me->mcol, me->totface);
@@ -511,8 +500,6 @@ void vpaint_dogamma()
cp+= 4;
}
allqueue(REDRAWVIEW3D, 0);
-
- if(me->tface) mcol_to_tface(me, 1);
}
/* used for both 3d view and image window */
@@ -874,7 +861,6 @@ void wpaint_undo (void)
{
Object *ob= OBACT;
Mesh *me;
- MDeformVert *swapbuf;
me = get_mesh(ob);
if (!me) return;
@@ -888,19 +874,9 @@ void wpaint_undo (void)
if (totwpaintundo != me->totvert)
return;
- swapbuf= me->dvert;
-
- /* copy undobuf to mesh */
- me->dvert= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "deformVert");
- copy_dverts(me->dvert, wpaintundobuf, totwpaintundo);
-
- /* copy previous mesh to undo */
- free_dverts(wpaintundobuf, me->totvert);
- wpaintundobuf= MEM_mallocN(sizeof(MDeformVert)*me->totvert, "wpaintundo");
- copy_dverts(wpaintundobuf, swapbuf, totwpaintundo);
-
- /* now free previous mesh dverts */
- free_dverts(swapbuf, me->totvert);
+ /* simply swap pointers, and update the pointer in CustomData too */
+ SWAP(MDeformVert*, me->dvert, wpaintundobuf);
+ CustomData_set_layer(&me->vdata, CD_MDEFORMVERT, me->dvert);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
DAG_object_flush_update(G.scene, modifiers_isDeformedByArmature(ob), OB_RECALC_DATA);
@@ -1074,9 +1050,8 @@ static void sample_wpaint(int mode)
MDeformWeight *dw;
extern float editbutvweight;
float w1, w2, w3, w4, co[3], fac;
- int needsFree;
- dm = mesh_get_derived_final(ob, &needsFree);
+ dm = mesh_get_derived_final(ob);
if(dm->getVertCo==NULL) {
notice("Not supported yet");
}
@@ -1120,9 +1095,8 @@ static void sample_wpaint(int mode)
if(dw) editbutvweight= dw->weight; else editbutvweight= 0.0f;
}
}
- if (needsFree)
- dm->release(dm);
}
+ dm->release(dm);
}
}
@@ -1169,7 +1143,7 @@ void weight_paint(void)
Object *ob;
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
float mat[4][4], imat[4][4], paintweight, *vertexcosnos;
int index, totindex, alpha, totw;
int vgroup_mirror= -1;
@@ -1240,7 +1214,6 @@ void weight_paint(void)
getmouseco_areawin(mvalo);
- if(me->tface) tface_to_mcol(me);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
copy_wpaint_undo(me->dvert, me->totvert);
@@ -1307,11 +1280,11 @@ void weight_paint(void)
}
}
- if((G.f & G_FACESELECT) && me->tface) {
+ if((G.f & G_FACESELECT) && me->mtface) {
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totface) {
- tface= ((TFace *)me->tface) + (indexar[index]-1);
+ tface= ((MTFace *)me->mtface) + (indexar[index]-1);
if((tface->flag & TF_SELECT)==0) {
indexar[index]= 0;
@@ -1426,10 +1399,6 @@ void weight_paint(void)
}
}
- if(me->tface) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
if(vertexcosnos)
MEM_freeN(vertexcosnos);
@@ -1445,7 +1414,7 @@ void vertex_paint()
Object *ob;
Mesh *me;
MFace *mface;
- TFace *tface;
+ MTFace *tface;
float mat[4][4], imat[4][4], *vertexcosnos;
unsigned int paintcol=0, *mcol, *mcolorig, fcol1, fcol2;
int index, alpha, totindex;
@@ -1463,9 +1432,9 @@ void vertex_paint()
if(me==NULL || me->totface==0) return;
if(ob->lay & G.vd->lay); else error("Active object is not in this layer");
- if(me->tface==NULL && me->mcol==NULL) make_vertexcol();
+ if(me->mtface==NULL && me->mcol==NULL) make_vertexcol(1);
- if(me->tface==NULL && me->mcol==NULL) return;
+ if(me->mtface==NULL && me->mcol==NULL) return;
/* painting on subsurfs should give correct points too, this returns me->totvert amount */
vertexcosnos= mesh_get_mapped_verts_nors(ob);
@@ -1485,7 +1454,6 @@ void vertex_paint()
getmouseco_areawin(mvalo);
- if(me->tface) tface_to_mcol(me);
copy_vpaint_undo( (unsigned int *)me->mcol, me->totface);
getmouseco_areawin(mval);
@@ -1526,15 +1494,13 @@ void vertex_paint()
}
}
}
- if((G.f & G_FACESELECT) && me->tface) {
+ if((G.f & G_FACESELECT) && me->mtface) {
for(index=0; index<totindex; index++) {
if(indexar[index] && indexar[index]<=me->totface) {
+ tface= ((MTFace *)me->mtface) + (indexar[index]-1);
- tface= ((TFace *)me->tface) + (indexar[index]-1);
-
- if((tface->flag & TF_SELECT)==0) {
+ if((tface->flag & TF_SELECT)==0)
indexar[index]= 0;
- }
}
}
}
@@ -1578,9 +1544,6 @@ void vertex_paint()
MTC_Mat4SwapMat4(G.vd->persmat, mat);
do_shared_vertexcol(me);
- if(me->tface) {
- mcol_to_tface(me, 0);
- }
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
scrarea_do_windraw(curarea);
@@ -1600,10 +1563,6 @@ void vertex_paint()
else BIF_wait_for_statechange();
}
- if(me->tface) {
- MEM_freeN(me->mcol);
- me->mcol= 0;
- }
if(vertexcosnos)
MEM_freeN(vertexcosnos);
@@ -1688,7 +1647,7 @@ void set_vpaint(void) /* toggle */
return;
}
- if(me && me->tface==NULL && me->mcol==NULL) make_vertexcol();
+ if(me && me->mcol==NULL) make_vertexcol(1);
if(G.f & G_VERTEXPAINT){
G.f &= ~G_VERTEXPAINT;