[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15311] branches/soc-2008-nicholasbishop/ source/blender: Fixed saving/loading of MDisps.
Nicholas Bishop
nicholasbishop at gmail.com
Sun Jun 22 21:43:52 CEST 2008
Revision: 15311
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15311
Author: nicholasbishop
Date: 2008-06-22 21:43:52 +0200 (Sun, 22 Jun 2008)
Log Message:
-----------
Fixed saving/loading of MDisps. This took longer than it should have because of a bug in SDNA, noted in the MDisps struct.
Undo/Redo should work correctly as well.
Modified Paths:
--------------
branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c
branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_meshdata_types.h
branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/BKE_multires.h 2008-06-22 19:43:52 UTC (rev 15311)
@@ -117,7 +117,7 @@
struct DerivedMesh *multires_dm_create_from_derived(struct MultiresModifierData*, struct DerivedMesh*, int, int);
-void multiresModifier_subdivide(void *mmd_v, void *ob_v);
+void multiresModifier_subdivide(struct MultiresModifierData *mmd, struct Mesh *me);
void multiresModifier_setLevel(void *mmd_v, void *ob_v);
void multires_displacer_init(MultiresDisplacer *d, struct DerivedMesh *dm,
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/customdata.c 2008-06-22 19:43:52 UTC (rev 15311)
@@ -365,8 +365,15 @@
MDisps *d = dest;
for(i = 0; i < count; ++i) {
- if(s[i].disps)
+ if(s[i].disps) {
d[i].disps = MEM_dupallocN(s[i].disps);
+ d[i].totdisp = s[i].totdisp;
+ }
+ else {
+ d[i].disps = NULL;
+ d[i].totdisp = 0;
+ }
+
}
}
@@ -379,6 +386,7 @@
if(d[i].disps)
MEM_freeN(d[i].disps);
d[i].disps = NULL;
+ d[i].totdisp = 0;
}
}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/blenkernel/intern/multires.c 2008-06-22 19:43:52 UTC (rev 15311)
@@ -1384,39 +1384,34 @@
calc_face_ts_mat(out, orco[f->v1], orco[f->v2], orco[f->v3], (f->v4 ? orco[f->v4] : NULL));
}
-void multiresModifier_subdivide(void *mmd_v, void *ob_v)
+void multiresModifier_subdivide(MultiresModifierData *mmd, Mesh *me)
{
- MultiresModifierData *mmd = mmd_v;
- Object *ob = ob_v;
- Mesh *me = get_mesh(ob);
+ MDisps *mdisps;
+ int i;
- if(me && mmd) {
- MDisps *mdisps;
- int i;
+ if(mmd->totlvl == multires_max_levels) {
+ // TODO
+ return;
+ }
- if(mmd->totlvl == multires_max_levels) {
- // TODO
- return;
- }
+ ++mmd->lvl;
+ ++mmd->totlvl;
- ++mmd->lvl;
- ++mmd->totlvl;
+ mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
+ if(!mdisps)
+ mdisps = CustomData_add_layer(&me->fdata, CD_MDISPS, CD_DEFAULT, NULL, me->totface);
- mdisps = CustomData_get_layer(&me->fdata, CD_MDISPS);
- if(!mdisps)
- mdisps = CustomData_add_layer(&me->fdata, CD_MDISPS, CD_DEFAULT, NULL, me->totface);
+ for(i = 0; i < me->totface; ++i) {
+ //const int totdisp = (me->mface[i].v4 ? multires_quad_tot[totlvl] : multires_tri_tot[totlvl]);
+ const int totdisp = multires_quad_tot[mmd->totlvl - 1];
+ float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps");
- for(i = 0; i < me->totface; ++i) {
- //const int totdisp = (me->mface[i].v4 ? multires_quad_tot[totlvl] : multires_tri_tot[totlvl]);
- const int totdisp = multires_quad_tot[mmd->totlvl - 1];
- float (*disps)[3] = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps");
-
- if(mdisps[i].disps) {
- /* TODO: Transfer old disps over to the new */
- MEM_freeN(mdisps[i].disps);
- }
- mdisps[i].disps = disps;
+ if(mdisps[i].disps) {
+ /* TODO: Transfer old disps over to the new */
+ MEM_freeN(mdisps[i].disps);
}
+ mdisps[i].disps = disps;
+ mdisps[i].totdisp = totdisp;
}
}
@@ -1629,13 +1624,10 @@
mdisps = dm->getFaceDataArray(dm, CD_MDISPS);
- if(MultiresDM_get_lvl(dm) != MultiresDM_get_totlvl(dm))
- return;
-
if(mdisps) {
MultiresDisplacer d;
- const int gridFaces = multires_side_tot[MultiresDM_get_totlvl(dm) - 2] - 1;
- const int edgeSize = multires_side_tot[MultiresDM_get_totlvl(dm) - 1] - 1;
+ const int gridFaces = multires_side_tot[MultiresDM_get_lvl(dm) - 2] - 1;
+ const int edgeSize = multires_side_tot[MultiresDM_get_lvl(dm) - 1] - 1;
ListBase *map = MultiresDM_get_vert_face_map(dm);
int S, x, y;
Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/readfile.c 2008-06-22 19:43:52 UTC (rev 15311)
@@ -2702,6 +2702,19 @@
}
}
+static void direct_link_mdisps(FileData *fd, int count, MDisps *mdisps)
+{
+ if(mdisps) {
+ int i;
+
+ for(i = 0; i < count; ++i) {
+ mdisps[i].disps = newdataadr(fd, mdisps[i].disps);
+ if(!mdisps[i].disps)
+ mdisps[i].totdisp = 0;
+ }
+ }
+}
+
static void direct_link_customdata(FileData *fd, CustomData *data, int count)
{
int i = 0;
@@ -2713,6 +2726,8 @@
if (CustomData_verify_versions(data, i)) {
layer->data = newdataadr(fd, layer->data);
+ if(layer->type == CD_MDISPS)
+ direct_link_mdisps(fd, count, layer->data);
i++;
}
}
Modified: branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/blenloader/intern/writefile.c 2008-06-22 19:43:52 UTC (rev 15311)
@@ -1105,7 +1105,7 @@
static void write_dverts(WriteData *wd, int count, MDeformVert *dvlist)
{
if (dvlist) {
- int i;
+ int i;
/* Write the dvert list */
writestruct(wd, DATA, "MDeformVert", count, dvlist);
@@ -1118,6 +1118,19 @@
}
}
+static void write_mdisps(WriteData *wd, int count, MDisps *mdlist)
+{
+ if(mdlist) {
+ int i;
+
+ writestruct(wd, DATA, "MDisps", count, mdlist);
+ for(i = 0; i < count; ++i) {
+ if(mdlist[i].disps)
+ writedata(wd, DATA, sizeof(float)*3*mdlist[i].totdisp, mdlist[i].disps);
+ }
+ }
+}
+
static void write_customdata(WriteData *wd, int count, CustomData *data, int partial_type, int partial_count)
{
int i;
@@ -1133,6 +1146,9 @@
/* layer types that allocate own memory need special handling */
write_dverts(wd, count, layer->data);
}
+ else if (layer->type == CD_MDISPS) {
+ write_mdisps(wd, count, layer->data);
+ }
else {
CustomData_file_write_info(layer->type, &structname, &structnum);
if (structnum) {
Modified: branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_meshdata_types.h 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/makesdna/DNA_meshdata_types.h 2008-06-22 19:43:52 UTC (rev 15311)
@@ -101,6 +101,9 @@
} OrigSpaceFace;
typedef struct MDisps {
+ /* Strange bug in SDNA: if disps pointer comes first, it fails to see totdisp */
+ int totdisp;
+ char pad[4];
float (*disps)[3];
} MDisps;
Modified: branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c 2008-06-22 19:34:18 UTC (rev 15310)
+++ branches/soc-2008-nicholasbishop/source/blender/src/buttons_editing.c 2008-06-22 19:43:52 UTC (rev 15311)
@@ -1657,6 +1657,17 @@
emd->vgroup = 0;
}
+static void multiresModifier_subdivide_button(void *mmd_v, void *ob_v)
+{
+ MultiresModifierData *mmd = mmd_v;
+ Mesh *me = get_mesh(ob_v);
+
+ if(mmd && me) {
+ multiresModifier_subdivide(mmd, me);
+ BIF_undo_push("Multires subdivide");
+ }
+}
+
static int modifier_is_fluid_particles(ModifierData *md) {
if(md->type == eModifierType_ParticleSystem) {
if(((ParticleSystemModifierData *)md)->psys->part->type == PART_FLUID)
@@ -2450,7 +2461,7 @@
uiBut *but;
but = uiDefBut(block,BUT,B_MODIFIER_RECALC,"Subdivide", lx,(cy-=19),buttonWidth,19,0,0,0,0,0,"Increase the resolution of displacements");
- uiButSetFunc(but, multiresModifier_subdivide, mmd, ob);
+ uiButSetFunc(but, multiresModifier_subdivide_button, mmd, ob);
but = uiDefButC(block,NUM,B_MODIFIER_RECALC,"Level: ",lx,(cy-=19),buttonWidth,19, &mmd->lvl, 1.0, mmd->totlvl, 0,0,"");
uiButSetFunc(but, multiresModifier_setLevel, mmd, ob);
More information about the Bf-blender-cvs
mailing list