[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10836] trunk/blender/source/blender: == Multires ==
Nicholas Bishop
nicholasbishop at gmail.com
Fri Jun 1 04:21:13 CEST 2007
Revision: 10836
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=10836
Author: nicholasbishop
Date: 2007-06-01 04:21:11 +0200 (Fri, 01 Jun 2007)
Log Message:
-----------
== Multires ==
* Moved the multires vertex data from struct MultiresLevel to struct Multires. There's no longer any reason to store data seperately for each level; it was just taking up extra memory.
* Incremented the subversion to 2 and adjusted do_versions to correctly load older files.
* Refactored the multires update process (which handles propagating changes to other levels)
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_blender.h
trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
trunk/blender/source/blender/blenkernel/intern/mesh.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/blenloader/intern/writefile.c
trunk/blender/source/blender/include/multires.h
trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
trunk/blender/source/blender/src/multires-firstlevel.c
trunk/blender/source/blender/src/multires.c
Modified: trunk/blender/source/blender/blenkernel/BKE_blender.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_blender.h 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/BKE_blender.h 2007-06-01 02:21:11 UTC (rev 10836)
@@ -44,7 +44,7 @@
struct MemFile;
#define BLENDER_VERSION 244
-#define BLENDER_SUBVERSION 1
+#define BLENDER_SUBVERSION 2
#define BLENDER_MINVERSION 240
#define BLENDER_MINSUBVERSION 0
Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -2272,7 +2272,7 @@
lvl= multires_level_n(me->mr, BLI_countlist(&me->mr->levels));
vert_copy= MEM_callocN(sizeof(float)*3*lvl->totvert, "multires vert_copy");
for(i=0; i<lvl->totvert; ++i)
- VecCopyf(&vert_copy[i*3], lvl->verts[i].co);
+ VecCopyf(&vert_copy[i*3], me->mr->verts[i].co);
/* Goto the pin level for multires */
me->mr->newlvl= me->mr->pinlvl;
Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -504,7 +504,7 @@
if(me->mr) {
lvl = multires_level_n(me->mr, me->mr->pinlvl);
vcos = MEM_callocN(sizeof(*vcos)*lvl->totvert, "orco mr mesh");
- mvert = lvl->verts;
+ mvert = me->mr->verts;
totvert = lvl->totvert;
}
else {
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -2554,6 +2554,8 @@
mesh->mr->edge_flags= MEM_callocN(sizeof(short)*lvl->totedge, "Multires Edge Flags");
if(!mesh->mr->edge_creases)
mesh->mr->edge_creases= MEM_callocN(sizeof(char)*lvl->totedge, "Multires Edge Creases");
+
+ mesh->mr->verts = newdataadr(fd, mesh->mr->verts);
for(; lvl; lvl= lvl->next) {
lvl->verts= newdataadr(fd, lvl->verts);
@@ -6469,6 +6471,25 @@
for(sce= main->scene.first; sce; sce= sce->id.next)
sce->r.mode |= R_SSS;
}
+ if(main->versionfile != 244 || main->subversionfile < 2) {
+ /* Copy over old per-level multires vertex data
+ into a single vertex array in struct Multires */
+ Mesh *me;
+ for(me = main->mesh.first; me; me=me->id.next) {
+ if(me->mr) {
+ MultiresLevel *lvl = me->mr->levels.last;
+ if(lvl) {
+ me->mr->verts = lvl->verts;
+ lvl->verts = NULL;
+ /* Don't need the other vert arrays */
+ for(lvl = lvl->prev; lvl; lvl = lvl->prev) {
+ MEM_freeN(lvl->verts);
+ lvl->verts = NULL;
+ }
+ }
+ }
+ }
+ }
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -1156,13 +1156,17 @@
writedata(wd, DATA, sizeof(short)*lvl->totedge, mesh->mr->edge_flags);
writedata(wd, DATA, sizeof(char)*lvl->totedge, mesh->mr->edge_creases);
}
+
for(; lvl; lvl= lvl->next) {
writestruct(wd, DATA, "MultiresLevel", 1, lvl);
- writestruct(wd, DATA, "MVert", lvl->totvert, lvl->verts);
writestruct(wd, DATA, "MultiresFace", lvl->totface, lvl->faces);
writestruct(wd, DATA, "MultiresEdge", lvl->totedge, lvl->edges);
writestruct(wd, DATA, "MultiresColFace", lvl->totface, lvl->colfaces);
}
+
+ lvl= mesh->mr->levels.last;
+ if(lvl)
+ writestruct(wd, DATA, "MVert", lvl->totvert, mesh->mr->verts);
}
/* PMV data */
Modified: trunk/blender/source/blender/include/multires.h
===================================================================
--- trunk/blender/source/blender/include/multires.h 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/include/multires.h 2007-06-01 02:21:11 UTC (rev 10836)
@@ -31,6 +31,7 @@
#define MULTIRES_H
struct CustomData;
+struct EditMesh;
struct Object;
struct MDeformVert;
struct Mesh;
@@ -65,6 +66,7 @@
/* multires-firstlevel.c */
/* Generic */
+void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
void multires_update_customdata(struct MultiresLevel *lvl1, struct CustomData *src,
struct CustomData *dst, const int type);
void multires_customdata_to_mesh(struct Mesh *me, struct EditMesh *em, struct MultiresLevel *lvl,
Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h 2007-06-01 02:21:11 UTC (rev 10836)
@@ -109,7 +109,6 @@
typedef struct MultiresLevel {
struct MultiresLevel *next, *prev;
- MVert *verts;
MultiresFace *faces;
MultiresColFace *colfaces;
MultiresEdge *edges;
@@ -118,10 +117,15 @@
struct MultiresMapNode *map_mem;
unsigned int totvert, totface, totedge, pad;
+
+ /* Kept for compatibility with older files */
+ MVert *verts;
} MultiresLevel;
typedef struct Multires {
ListBase levels;
+ MVert *verts;
+
unsigned char level_count, current, newlvl, edgelvl, pinlvl, renderlvl;
unsigned char use_col, pad;
Modified: trunk/blender/source/blender/src/multires-firstlevel.c
===================================================================
--- trunk/blender/source/blender/src/multires-firstlevel.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/src/multires-firstlevel.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -55,6 +55,8 @@
MDeformVert *subdivide_dverts(MDeformVert *src, MultiresLevel *lvl);
MTFace *subdivide_mtfaces(MTFace *src, MultiresLevel *lvl);
+void multires_update_edge_flags(Mesh *me, EditMesh *em);
+void eed_to_medge_flag(EditEdge *eed, short *flag, char *crease);
/*********** Generic ***********/
@@ -221,6 +223,41 @@
mr->fdata= cdf;
}
+/* Update all special first-level data, if the first-level is active */
+void multires_update_first_level(Mesh *me, EditMesh *em)
+{
+ if(me && me->mr && me->mr->current == 1) {
+ multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
+ &me->mr->vdata, CD_MDEFORMVERT);
+ multires_update_customdata(me->mr->levels.first, em ? &em->fdata : &me->fdata,
+ &me->mr->fdata, CD_MTFACE);
+ multires_update_edge_flags(me, em);
+ }
+}
+
+/*********** Multires.edge_flags ***********/
+void multires_update_edge_flags(Mesh *me, EditMesh *em)
+{
+ MultiresLevel *lvl= me->mr->levels.first;
+ EditEdge *eed= NULL;
+ int i;
+
+ if(em) eed= em->edges.first;
+ for(i=0; i<lvl->totedge; ++i) {
+ if(em) {
+ me->mr->edge_flags[i]= 0;
+ eed_to_medge_flag(eed, &me->mr->edge_flags[i], &me->mr->edge_creases[i]);
+ eed= eed->next;
+ }
+ else {
+ me->mr->edge_flags[i]= me->medge[i].flag;
+ me->mr->edge_creases[i]= me->medge[i].crease;
+ }
+ }
+}
+
+
+
/*********** Multires.vdata ***********/
/* MDeformVert */
Modified: trunk/blender/source/blender/src/multires.c
===================================================================
--- trunk/blender/source/blender/src/multires.c 2007-06-01 00:40:52 UTC (rev 10835)
+++ trunk/blender/source/blender/src/multires.c 2007-06-01 02:21:11 UTC (rev 10836)
@@ -484,13 +484,14 @@
tmp.v3= efa->v3->tmp.l;
tmp.v4= 0;
if(efa->v4) tmp.v4= efa->v4->tmp.l;
- tmp.flag= efa->flag;
- if(efa->f & 1) tmp.flag |= ME_FACE_SEL;
- else f->flag &= ~ME_FACE_SEL;
- if(efa->h) tmp.flag |= ME_HIDE;
test_index_face(&tmp, NULL, 0, efa->v4?4:3);
for(j=0; j<4; ++j) f->v[j]= (&tmp.v1)[j];
- f->flag= tmp.flag;
+
+ /* Flags */
+ f->flag= efa->flag;
+ if(efa->f & 1) f->flag |= ME_FACE_SEL;
+ else f->flag &= ~ME_FACE_SEL;
+ if(efa->h) f->flag |= ME_HIDE;
f->mat_nr= efa->mat_nr;
} else {
f->v[0]= m->v1;
@@ -575,12 +576,12 @@
/* Load vertices and vdata (MDeformVerts) */
lvl->totvert= em ? BLI_countlist(&em->verts) : me->totvert;
- lvl->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
+ me->mr->verts= MEM_callocN(sizeof(MVert)*lvl->totvert,"multires verts");
multires_update_customdata(me->mr->levels.first, em ? &em->vdata : &me->vdata,
&me->mr->vdata, CD_MDEFORMVERT);
if(em) eve= em->verts.first;
for(i=0; i<lvl->totvert; ++i) {
- multires_get_vert(&lvl->verts[i], eve, &me->mvert[i], i);
+ multires_get_vert(&me->mr->verts[i], eve, &me->mvert[i], i);
if(em) eve= eve->next;
}
@@ -636,7 +637,6 @@
MultiresLevel *lvl= MEM_dupallocN(orig);
lvl->next= lvl->prev= NULL;
- lvl->verts= MEM_dupallocN(orig->verts);
lvl->faces= MEM_dupallocN(orig->faces);
lvl->colfaces= MEM_dupallocN(orig->colfaces);
lvl->edges= MEM_dupallocN(orig->edges);
@@ -658,6 +658,8 @@
for(lvl= orig->levels.first; lvl; lvl= lvl->next)
BLI_addtail(&mr->levels, multires_level_copy(lvl));
+
+ mr->verts= MEM_dupallocN(orig->verts);
lvl= mr->levels.first;
if(lvl) {
@@ -690,6 +692,8 @@
lvl= lvl->next;
}
+ MEM_freeN(mr->verts);
+
BLI_freelistN(&mr->levels);
MEM_freeN(mr);
@@ -700,7 +704,6 @@
void multires_free_level(MultiresLevel *lvl)
{
if(lvl) {
- if(lvl->verts) MEM_freeN(lvl->verts);
if(lvl->faces) MEM_freeN(lvl->faces);
if(lvl->edges) MEM_freeN(lvl->edges);
if(lvl->colfaces) MEM_freeN(lvl->colfaces);
@@ -844,6 +847,7 @@
Mesh *me= me_v;
MultiresLevel *lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
MultiApplyData data;
+ MVert *oldverts= NULL;
multires_check_state();
@@ -859,15 +863,16 @@
/* Create vertices
=============== */
lvl->totvert= lvl->prev->totvert + lvl->prev->totedge + lvl->prev->totface;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list