[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44860] trunk/blender/source/blender: Add 'level' field to struct MDisps, companion to 'totdisp'.

Nicholas Bishop nicholasbishop at gmail.com
Wed Mar 14 04:10:30 CET 2012


Revision: 44860
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44860
Author:   nicholasbishop
Date:     2012-03-14 03:10:18 +0000 (Wed, 14 Mar 2012)
Log Message:
-----------
Add 'level' field to struct MDisps, companion to 'totdisp'.

Gets initialized when loading old files and updated at the same places
totdisp is updated. Saves having to do log+sqrt to extract level from
totdisp.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenkernel/intern/multires.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/makesdna/DNA_meshdata_types.h

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -485,10 +485,12 @@
 		if(s[i].disps) {
 			d[i].disps = MEM_dupallocN(s[i].disps);
 			d[i].totdisp = s[i].totdisp;
+			d[i].level = s[i].level;
 		}
 		else {
 			d[i].disps = NULL;
 			d[i].totdisp = 0;
+			d[i].level = 0;
 		}
 		
 	}
@@ -504,6 +506,7 @@
 			MEM_freeN(d[i].disps);
 		d[i].disps = NULL;
 		d[i].totdisp = 0;
+		d[i].level = 0;
 	}
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -1877,6 +1877,7 @@
 		
 			for (i=0; i<tot; i++, disps += side*side, ld++) {
 				ld->totdisp = side*side;
+				ld->level = (int)(logf(side - 1.0f) / M_LN2) + 1;
 			
 				if (ld->disps)
 					MEM_freeN(ld->disps);

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -320,6 +320,7 @@
 	if (mdisps) {
 		for (i = 0; i < me->totloop; i++, mdisps++) {
 			mdisps->totdisp = multires_grid_tot[lvl];
+			mdisps->level = lvl;
 		}
 	}
 }
@@ -338,6 +339,7 @@
 
 		mdisps[i].disps = disps;
 		mdisps[i].totdisp = totdisp;
+		mdisps[i].level = lvl;
 	}
 }
 
@@ -426,6 +428,7 @@
 					MEM_freeN(mdisp->disps);
 					mdisp->disps = disps;
 					mdisp->totdisp = totdisp;
+					mdisp->level = lvl;
 				}
 			}
 		}
@@ -999,6 +1002,7 @@
 			/* when adding new faces in edit mode, need to allocate disps */
 			if (!mdisp->disps) {
 				mdisp->totdisp = gridSize*gridSize;
+				mdisp->level = totlvl;
 				mdisp->disps = MEM_callocN(sizeof(float)*3*mdisp->totdisp, "disp in multires_set_space");
 			}
 
@@ -1224,6 +1228,7 @@
 	MEM_freeN(mdisp->disps);
 
 	mdisp->totdisp= newtotdisp;
+	mdisp->level= newlvl;
 	mdisp->disps= disps;
 }
 
@@ -1252,6 +1257,7 @@
 			for (j=0; j < mf->v4 ? 4 : 3; j++, k++) {
 				mdisps2[k].disps = MEM_callocN(sizeof(float)*3*totdisp, "multires disp in conversion");			
 				mdisps2[k].totdisp = totdisp;
+				mdisps2[k].level = mdisps[i].level;
 				memcpy(mdisps2[k].disps, mdisps[i].disps + totdisp*j, totdisp);
 			}
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -3751,6 +3751,15 @@
 		for(i = 0; i < count; ++i) {
 			mdisps[i].disps = newdataadr(fd, mdisps[i].disps);
 
+			if (mdisps[i].totdisp && !mdisps[i].level) {
+				/* this calculation is only correct for loop mdisps;
+				   if loading pre-BMesh face mdisps this will be
+				   overwritten with the correct value in
+				   bm_corners_to_loops() */
+				float gridsize = sqrtf(mdisps[i].totdisp);
+				mdisps[i].level = (int)(logf(gridsize - 1.0f) / M_LN2) + 1;
+			}
+
 			if( (fd->flags & FD_FLAGS_SWITCH_ENDIAN) && (mdisps[i].disps) ) {
 				/* DNA_struct_switch_endian doesn't do endian swap for (*disps)[] */
 				/* this does swap for data written at write_mdisps() - readfile.c */

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_interp.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -426,6 +426,7 @@
 		MDisps *md2 = CustomData_bmesh_get(&bm->ldata, BM_FACE_FIRST_LOOP(source)->head.data, CD_MDISPS);
 		
 		mdisps->totdisp = md2->totdisp;
+		mdisps->level = md2->level;
 		if (mdisps->totdisp) {
 			mdisps->disps = MEM_callocN(sizeof(float) * 3 * mdisps->totdisp,
 			                            "mdisp->disps in bmesh_loop_intern_mdisps");

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2012-03-14 03:10:18 UTC (rev 44860)
@@ -371,6 +371,7 @@
 					
 					lmd->disps = MEM_dupallocN(mdisps->disps);
 					lmd->totdisp = mdisps->totdisp;
+					lmd->level = mdisps->level;
 				}
 				
 				mdisps++;

Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2012-03-14 00:30:20 UTC (rev 44859)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2012-03-14 03:10:18 UTC (rev 44860)
@@ -164,7 +164,7 @@
 typedef struct MDisps {
 	/* Strange bug in SDNA: if disps pointer comes first, it fails to see totdisp */
 	int totdisp;
-	char pad[4];
+	int level;
 	float (*disps)[3];
 } MDisps;
 




More information about the Bf-blender-cvs mailing list