diff options
-rw-r--r-- | source/blender/blenkernel/BKE_blender.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_multires.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/multires.c | 171 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 84 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 6 |
5 files changed, 184 insertions, 84 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index 7bbcb63a7f5..08503a3d00c 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -43,7 +43,7 @@ struct bContext; struct ReportList; #define BLENDER_VERSION 250 -#define BLENDER_SUBVERSION 8 +#define BLENDER_SUBVERSION 9 #define BLENDER_MINVERSION 250 #define BLENDER_MINSUBVERSION 0 diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h index ff320bc7d25..2f372f80957 100644 --- a/source/blender/blenkernel/BKE_multires.h +++ b/source/blender/blenkernel/BKE_multires.h @@ -54,8 +54,9 @@ int multiresModifier_reshape(struct MultiresModifierData *mmd, struct Object *ds void multires_stitch_grids(struct Object *); /* Related to the old multires */ -void multires_load_old(struct DerivedMesh *, struct Multires *); -void multires_free(struct Multires*); +void multires_free(struct Multires *mr); +void multires_load_old(struct Object *ob, struct Mesh *me); +void multires_load_old_250(struct Mesh *); #endif diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c index 20ba360a231..bf02bd89f72 100644 --- a/source/blender/blenkernel/intern/multires.c +++ b/source/blender/blenkernel/intern/multires.c @@ -614,12 +614,16 @@ static void multiresModifier_update(DerivedMesh *dm) } } +static void multires_dm_mark_as_modified(struct DerivedMesh *dm) +{ + CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm; + ccgdm->multires.modified = 1; +} + void multires_mark_as_modified(struct Object *ob) { - if(ob && ob->derivedFinal) { - CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)ob->derivedFinal; - ccgdm->multires.modified = 1; - } + if(ob && ob->derivedFinal) + multires_dm_mark_as_modified(ob->derivedFinal); } void multires_force_update(Object *ob) @@ -702,35 +706,99 @@ struct DerivedMesh *multires_dm_create_from_derived(MultiresModifierData *mmd, i /**** Old Multires code **** ***************************/ -#if 0 -static void mdisp_copy_grid(float (*new)[3], int newstride, float (*old)[3], int oldstride, int xoff, int yoff, int xsize, int ysize) +/* Adapted from sculptmode.c */ +static void old_mdisps_bilinear(float out[3], float (*disps)[3], int st, float u, float v) { - int x, y; + int x, y, x2, y2; + const int st_max = st - 1; + float urat, vrat, uopp; + float d[4][3], d2[2][3]; + + if(u < 0) + u = 0; + else if(u >= st) + u = st_max; + if(v < 0) + v = 0; + else if(v >= st) + v = st_max; + + x = floor(u); + y = floor(v); + x2 = x + 1; + y2 = y + 1; + + if(x2 >= st) x2 = st_max; + if(y2 >= st) y2 = st_max; + + urat = u - x; + vrat = v - y; + uopp = 1 - urat; - for(y = 0; y < ysize; ++y) - for(x = 0; x < xsize; ++x) - copy_v3_v3(disps[x + y*side], mdisp->disps[(x + xoffs) + (y + yoffs)*oldside]); + mul_v3_v3fl(d[0], disps[y * st + x], uopp); + mul_v3_v3fl(d[1], disps[y * st + x2], urat); + mul_v3_v3fl(d[2], disps[y2 * st + x], uopp); + mul_v3_v3fl(d[3], disps[y2 * st + x2], urat); + add_v3_v3v3(d2[0], d[0], d[1]); + add_v3_v3v3(d2[1], d[2], d[3]); + mul_v3_fl(d2[0], 1 - vrat); + mul_v3_fl(d2[1], vrat); + + add_v3_v3v3(out, d2[0], d2[1]); } -static void mdisps_convert(MFace *mface, MDisps *mdisp, int lvl) +static void old_mdisps_rotate(int S, int newside, int oldside, int x, int y, float *u, float *v) { - int side = multires_side_tot[lvl]; + float offset = oldside*0.5f - 0.5f; + + if(S == 1) { *u= offset + x; *v = offset - y; } + if(S == 2) { *u= offset + y; *v = offset + x; } + if(S == 3) { *u= offset - x; *v = offset + y; } + if(S == 0) { *u= offset - y; *v = offset - x; } +} + +static void old_mdisps_convert(MFace *mface, MDisps *mdisp) +{ + int newlvl = log(sqrt(mdisp->totdisp)-1)/log(2); + int oldlvl = newlvl+1; + int oldside = multires_side_tot[oldlvl]; + int newside = multires_side_tot[newlvl]; int nvert = (mface->v4)? 4: 3; - int totdisp = multires_grid_tot[lvl]*nvert; - int x, y; - float (*disps)[3]; + int newtotdisp = multires_grid_tot[newlvl]*nvert; + int x, y, S; + float (*disps)[3], (*out)[3], u, v; + + disps = MEM_callocN(sizeof(float) * 3 * newtotdisp, "multires disps"); + + out = disps; + for(S = 0; S < nvert; S++) { + for(y = 0; y < newside; ++y) { + for(x = 0; x < newside; ++x, ++out) { + old_mdisps_rotate(S, newside, oldside, x, y, &u, &v); + old_mdisps_bilinear(*out, mdisp->disps, oldside, u, v); + } + } + } - disps = MEM_callocN(sizeof(float) * 3 * totdisp, "multires disps"); + MEM_freeN(mdisp->disps); + mdisp->totdisp= newtotdisp; + mdisp->disps= disps; +} +void multires_load_old_250(Mesh *me) +{ + MDisps *mdisps; + int a; -static const int multires_max_levels = 13; -static const int multires_grid_tot[] = {1, 4, 9, 25, 81, 289, 1089, 4225, 16641, 66049, 263169, 1050625, 4198401, 16785409}; -static const int multires_side_tot[] = {1, 2, 3, 5, 9, 17, 33, 65, 129, 257, 513, 1025, 2049, 4097}; + mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS); + if(mdisps) { + for(a=0; a<me->totface; a++) + old_mdisps_convert(&me->mface[a], &mdisps[a]); + } } -#endif /* Does not actually free lvl itself */ static void multires_free_level(MultiresLevel *lvl) @@ -770,6 +838,7 @@ void multires_free(Multires *mr) } } +#if 0 static void create_old_vert_face_map(ListBase **map, IndexNode **mem, const MultiresFace *mface, const int totvert, const int totface) { @@ -893,12 +962,11 @@ static void multires_load_old_faces(ListBase **fmap, ListBase **emap, MultiresLe } /* Loads a multires object stored in the old Multires struct into the new format */ -void multires_load_old(DerivedMesh *dm, Multires *mr) +static void multires_load_old_dm(DerivedMesh *dm, Multires *mr, int totlvl) { MultiresLevel *lvl, *lvl1; MVert *vsrc, *vdst; int src, dst; - int totlvl = 2; // XXX MultiresDM_get_totlvl(dm); int st = multires_side_tot[totlvl - 1] - 1; int extedgelen = multires_side_tot[totlvl] - 2; int *vvmap; // inorder for dst, map to src @@ -1056,4 +1124,63 @@ void multires_load_old(DerivedMesh *dm, Multires *mr) MEM_freeN(vvmap); } +#endif + +void multires_load_old(Object *ob, Mesh *me) +{ + /* XXX not implemented */ +#if 0 + MultiresLevel *lvl; + ModifierData *md; + MultiresModifierData *mmd; + DerivedMesh *dm, *orig; + int i; + + /* Load original level into the mesh */ + lvl = me->mr->levels.first; + CustomData_free_layers(&me->vdata, CD_MVERT, lvl->totvert); + CustomData_free_layers(&me->edata, CD_MEDGE, lvl->totedge); + CustomData_free_layers(&me->fdata, CD_MFACE, lvl->totface); + me->totvert = lvl->totvert; + me->totedge = lvl->totedge; + me->totface = lvl->totface; + me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert); + me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge); + me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface); + memcpy(me->mvert, me->mr->verts, sizeof(MVert) * me->totvert); + for(i = 0; i < me->totedge; ++i) { + me->medge[i].v1 = lvl->edges[i].v[0]; + me->medge[i].v2 = lvl->edges[i].v[1]; + } + for(i = 0; i < me->totface; ++i) { + me->mface[i].v1 = lvl->faces[i].v[0]; + me->mface[i].v2 = lvl->faces[i].v[1]; + me->mface[i].v3 = lvl->faces[i].v[2]; + me->mface[i].v4 = lvl->faces[i].v[3]; + } + + /* Add a multires modifier to the object */ + md = ob->modifiers.first; + while(md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform) + md = md->next; + mmd = (MultiresModifierData*)modifier_new(eModifierType_Multires); + BLI_insertlinkbefore(&ob->modifiers, md, mmd); + + for(i = 0; i < me->mr->level_count - 1; ++i) + multiresModifier_subdivide(mmd, ob, 1, 0); + + mmd->lvl = mmd->totlvl; + orig = CDDM_from_mesh(me, NULL); + dm = multires_dm_create_from_derived(mmd, 0, orig, ob, 0, 0); + + multires_load_old_dm(dm, me->mr, mmd->totlvl); + + multires_dm_mark_as_modified(dm); + dm->release(dm); + orig->release(orig); +#endif + + /* Remove the old multires */ + multires_free(me->mr); +} diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 3ab557fe058..039f8c60201 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -9633,7 +9633,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) ToolSettings *ts; //PTCacheID *pid; //ListBase pidlist; - int /*i, */a; + int a; for(ob = main->object.first; ob; ob = ob->id.next) { //BKE_ptcache_ids_from_object(&pidlist, ob); @@ -9650,62 +9650,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main) void *olddata = ob->data; ob->data = me; - if(me && me->id.lib==NULL && me->mr) { /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */ - // XXX -#if 0 - MultiresLevel *lvl; - ModifierData *md; - MultiresModifierData *mmd; - DerivedMesh *dm, *orig; - - /* Load original level into the mesh */ - lvl = me->mr->levels.first; - CustomData_free_layers(&me->vdata, CD_MVERT, lvl->totvert); - CustomData_free_layers(&me->edata, CD_MEDGE, lvl->totedge); - CustomData_free_layers(&me->fdata, CD_MFACE, lvl->totface); - me->totvert = lvl->totvert; - me->totedge = lvl->totedge; - me->totface = lvl->totface; - me->mvert = CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert); - me->medge = CustomData_add_layer(&me->edata, CD_MEDGE, CD_CALLOC, NULL, me->totedge); - me->mface = CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, me->totface); - memcpy(me->mvert, me->mr->verts, sizeof(MVert) * me->totvert); - for(i = 0; i < me->totedge; ++i) { - me->medge[i].v1 = lvl->edges[i].v[0]; - me->medge[i].v2 = lvl->edges[i].v[1]; - } - for(i = 0; i < me->totface; ++i) { - me->mface[i].v1 = lvl->faces[i].v[0]; - me->mface[i].v2 = lvl->faces[i].v[1]; - me->mface[i].v3 = lvl->faces[i].v[2]; - me->mface[i].v4 = lvl->faces[i].v[3]; - } - - /* Add a multires modifier to the object */ - md = ob->modifiers.first; - while(md && modifierType_getInfo(md->type)->type == eModifierTypeType_OnlyDeform) - md = md->next; - mmd = (MultiresModifierData*)modifier_new(eModifierType_Multires); - BLI_insertlinkbefore(&ob->modifiers, md, mmd); - - for(i = 0; i < me->mr->level_count - 1; ++i) - multiresModifier_subdivide(mmd, ob, 1, 0); - - mmd->lvl = mmd->totlvl; - orig = CDDM_from_mesh(me, NULL); - dm = multires_dm_create_from_derived(mmd, 0, orig, ob, 0, 0); - - multires_load_old(dm, me->mr); - - MultiresDM_mark_as_modified(dm); - dm->release(dm); - orig->release(orig); - - /* Remove the old multires */ - multires_free(me->mr); -#endif - me->mr = NULL; - } + if(me && me->id.lib==NULL && me->mr) /* XXX - library meshes crash on loading most yoFrankie levels, the multires pointer gets invalid - Campbell */ + multires_load_old(ob, me); ob->data = olddata; } @@ -10177,13 +10123,33 @@ static void do_versions(FileData *fd, Library *lib, Main *main) } } - /* put 2.50 compatibility code here until next subversion bump */ + if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 9)) { - Scene *sce= main->scene.first; + Scene *sce; + Mesh *me; + Object *ob; for(sce=main->scene.first; sce; sce=sce->id.next) if(!sce->toolsettings->particle.selectmode) sce->toolsettings->particle.selectmode= SCE_SELECT_PATH; + + for(me=main->mesh.first; me; me=me->id.next) + multires_load_old_250(me); + + for(ob=main->object.first; ob; ob=ob->id.next) { + MultiresModifierData *mmd = (MultiresModifierData *)modifiers_findByType(ob, eModifierType_Multires); + + if(mmd) { + mmd->totlvl--; + mmd->lvl--; + mmd->sculptlvl= mmd->lvl; + mmd->renderlvl= mmd->lvl; + } + } + } + + /* put 2.50 compatibility code here until next subversion bump */ + { } /* WATCH IT!!!: pointers from libdata have not been converted yet here! */ diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index a0fa0efec0a..a1e70c011fe 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -188,6 +188,12 @@ int ED_object_modifier_remove(ReportList *reports, Scene *scene, Object *ob, Mod else if(md->type == eModifierType_Smoke) { ob->dt = OB_TEXTURE; } + else if(md->type == eModifierType_Multires) { + Mesh *me= ob->data; + + CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); + CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface); + } BLI_remlink(&ob->modifiers, md); modifier_free(md); |