[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32611] trunk/blender/source/blender: [ #24267] Hook fails after Solidify

Campbell Barton ideasman42 at gmail.com
Wed Oct 20 11:18:55 CEST 2010


Revision: 32611
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32611
Author:   campbellbarton
Date:     2010-10-20 11:18:55 +0200 (Wed, 20 Oct 2010)

Log Message:
-----------
[#24267] Hook fails after Solidify
Solidify modifier wasn't assigning origindex values.

- BLI_math.h array functions: range_vni(), mul_vn_fl(), mul_vn_vn_fl(), add_vn_vn(), fill_vni().
- define 'AT' as __FILE__ ":" STRINGIFY(__LINE__), useful for quick debug prints.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_utildefines.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenlib/BLI_math_vector.h
    trunk/blender/source/blender/blenlib/intern/math_vector.c
    trunk/blender/source/blender/editors/render/render_opengl.c
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: trunk/blender/source/blender/blenkernel/BKE_utildefines.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/blenkernel/BKE_utildefines.h	2010-10-20 09:18:55 UTC (rev 32611)
@@ -44,6 +44,8 @@
 #define STRINGIFY_ARG(x) #x
 #define STRINGIFY(x) STRINGIFY_ARG(x)
 
+/* useful for debugging */
+#define AT __FILE__ ":" STRINGIFY(__LINE__)
 
 
 #ifdef __GNUC__

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2010-10-20 09:18:55 UTC (rev 32611)
@@ -1840,17 +1840,13 @@
 				/* constructive modifiers need to have an origindex
 				 * otherwise they wont have anywhere to copy the data from */
 				if(needMapping) {
-					int *index, i;
 					DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 					DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 					DM_add_face_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 
-					index = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
-					for(i=0; i<dm->numVertData; i++) *index++= i;
-					index = DM_get_edge_data_layer(dm, CD_ORIGINDEX);
-					for(i=0; i<dm->numEdgeData; i++) *index++= i;
-					index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
-					for(i=0; i<dm->numFaceData; i++) *index++= i;
+					range_vni(DM_get_vert_data_layer(dm, CD_ORIGINDEX), dm->numVertData, 0);
+					range_vni(DM_get_edge_data_layer(dm, CD_ORIGINDEX), dm->numEdgeData, 0);
+					range_vni(DM_get_face_data_layer(dm, CD_ORIGINDEX), dm->numFaceData, 0);
 				}
 			}
 

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-10-20 09:18:55 UTC (rev 32611)
@@ -1686,6 +1686,8 @@
 	return dm;
 }
 
+/* note, the CD_ORIGINDEX layers are all 0, so if there is a direct
+ * relationship betwen mesh data this needs to be set by the caller. */
 DerivedMesh *CDDM_from_template(DerivedMesh *source,
 								int numVerts, int numEdges, int numFaces)
 {

Modified: trunk/blender/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_vector.h	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/blenlib/BLI_math_vector.h	2010-10-20 09:18:55 UTC (rev 32611)
@@ -165,6 +165,14 @@
 
 void minmax_v3v3_v3(float min[3], float max[3], const float vec[3]);
 
+/***************************** Array Functions *******************************/
+/* attempted to follow fixed length vertex functions. names could be improved*/
+void range_vni(int *array, const int size, const int start);
+void mul_vn_fl(float *array, int size, const float f);
+void mul_vn_vn_fl(float *array_tar, const float *array_src, int size, const float f);
+void add_vn_vn(float *array_tar, const float *array_src, const int size);
+void fill_vni(int *array_tar, const int size, const int val);
+
 #ifdef __cplusplus
 }
 #endif

Modified: trunk/blender/source/blender/blenlib/intern/math_vector.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector.c	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/blenlib/intern/math_vector.c	2010-10-20 09:18:55 UTC (rev 32611)
@@ -354,3 +354,43 @@
 	if(max[2]<vec[2]) max[2]= vec[2];
 }
 
+
+/***************************** Array Functions *******************************/
+
+void range_vni(int *array_tar, const int size, const int start)
+{
+	int *array_pt= array_tar + (size-1);
+	int j= start + (size-1);
+	int i= size;
+	while(i--) { *(array_pt--) = j--; }
+}
+
+void mul_vn_fl(float *array_tar, const int size, const float f)
+{
+	float *array_pt= array_tar + (size-1);
+	int i= size;
+	while(i--) { *(array_pt--) *= f; }
+}
+
+void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f)
+{
+	float *tar= array_tar + (size-1);
+	const float *src= array_src + (size-1);
+	int i= size;
+	while(i--) { *(tar--) = *(src--) * f; }
+}
+
+void add_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+	float *tar= array_tar + (size-1);
+	const float *src= array_src + (size-1);
+	int i= size;
+	while(i--) { *(tar--) += *(src--); }
+}
+
+void fill_vni(int *array_tar, const int size, const int val)
+{
+	int *tar= array_tar + (size-1);
+	int i= size;
+	while(i--) { *(tar--) = val; }
+}

Modified: trunk/blender/source/blender/editors/render/render_opengl.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_opengl.c	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/editors/render/render_opengl.c	2010-10-20 09:18:55 UTC (rev 32611)
@@ -157,8 +157,7 @@
 			float winmat_jitter[4][4];
 			float *accum_buffer= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum1");
 			float *accum_tmp= MEM_mallocN(sizex * sizey * sizeof(float) * 4, "accum2");
-			int j, i;
-			float *from, *to;
+			int j;
 
 			/* first sample buffer, also initializes 'rv3d->persmat' */
 			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat);
@@ -171,19 +170,11 @@
 
 				ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter);
 				glReadPixels(0, 0, sizex, sizey, GL_RGBA, GL_FLOAT, accum_tmp);
-				
-				i= (sizex*sizey * 4) - 1;
-				from= accum_tmp;
-				to= accum_buffer;
-				do {*to++ += *from++; } while (i--);
+				add_vn_vn(accum_buffer, accum_tmp, sizex*sizey*sizeof(float));
 			}
 
-			from= accum_buffer;
-			to= rr->rectf;
+			mul_vn_vn_fl(rr->rectf, accum_buffer, sizex*sizey*sizeof(float), 1.0/SAMPLES);
 
-			i= (sizex * sizey * 4) - 1;
-			do { *to++= *from++ * (1.0/SAMPLES); } while (i--);
-			
 			MEM_freeN(accum_buffer);
 			MEM_freeN(accum_tmp);
 		}

Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2010-10-20 04:12:01 UTC (rev 32610)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2010-10-20 09:18:55 UTC (rev 32611)
@@ -196,7 +196,7 @@
 						int UNUSED(useRenderParams),
 						int UNUSED(isFinalCalc))
 {
-	int i;
+	int i, *index;
 	DerivedMesh *result;
 	SolidifyModifierData *smd = (SolidifyModifierData*) md;
 
@@ -321,7 +321,7 @@
 		dm_calc_normal(dm, vert_nors);
 	}
 
-	result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces);
+	result = CDDM_from_template(dm, numVerts * 2, (numEdges * 2) + newEdges, (numFaces * 2) + newFaces);	
 
 	mface = result->getFaceArray(result);
 	medge = result->getEdgeArray(result);
@@ -336,6 +336,23 @@
 	DM_copy_vert_data(dm, result, 0, 0, numVerts);
 	DM_copy_vert_data(dm, result, 0, numVerts, numVerts);
 
+	/* CDDM_from_template() gives zero'd ORIGINDEX data, we can know ahead of time what the
+	 * indicies will be however it would be better if we could check if the're needed. */
+	index= DM_get_vert_data_layer(result, CD_ORIGINDEX);
+	range_vni(index, numVerts, 0);
+	memcpy(index+numVerts, index, numVerts * sizeof(int));
+
+	index= DM_get_edge_data_layer(result, CD_ORIGINDEX);
+	range_vni(index, numEdges, 0);
+	memcpy(index+numEdges, index, numEdges * sizeof(int));
+	fill_vni(index+numEdges*2, newEdges, ORIGINDEX_NONE);
+
+	index= DM_get_face_data_layer(result, CD_ORIGINDEX);
+	range_vni(index, numFaces, 0);
+	memcpy(index+numFaces, index, numFaces * sizeof(int));
+	fill_vni(index+numFaces*2, newFaces, ORIGINDEX_NONE);
+	/* done setting origindex values */
+
 	{
 		static int corner_indices[4] = {2, 1, 0, 3};
 		int is_quad;





More information about the Bf-blender-cvs mailing list