[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