diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-10-20 13:18:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-10-20 13:18:55 +0400 |
commit | a044486d7d8faf3acc32d7c1d6dbf505c03e3631 (patch) | |
tree | b329a5de607c5aff7ae60e202347a0eefb025d5d | |
parent | c2aa5d6dc01dbc42ef9815bdbe8917b6164bf840 (diff) |
[#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.
-rw-r--r-- | source/blender/blenkernel/BKE_utildefines.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 2 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_math_vector.h | 8 | ||||
-rw-r--r-- | source/blender/blenlib/intern/math_vector.c | 40 | ||||
-rw-r--r-- | source/blender/editors/render/render_opengl.c | 15 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_solidify.c | 21 |
7 files changed, 77 insertions, 21 deletions
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h index 8359bfdb01b..83dcde26233 100644 --- a/source/blender/blenkernel/BKE_utildefines.h +++ b/source/blender/blenkernel/BKE_utildefines.h @@ -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__ diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 2e8922dec1b..c213a5a4ce2 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1840,17 +1840,13 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos /* 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); } } diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index eb895d62f17..20987e15c4d 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1686,6 +1686,8 @@ DerivedMesh *CDDM_copy(DerivedMesh *source) 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) { diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index 5c17ac6b639..93d463e17ea 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -165,6 +165,14 @@ MINLINE void normal_float_to_short_v3(short r[3], const float n[3]); 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 diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c index e3cb5b37470..35476a8aba9 100644 --- a/source/blender/blenlib/intern/math_vector.c +++ b/source/blender/blenlib/intern/math_vector.c @@ -354,3 +354,43 @@ void minmax_v3v3_v3(float min[3], float max[3], const float vec[3]) 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; } +} diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 825a6fc7043..ef56a596855 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -157,8 +157,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender) 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 @@ static void screen_opengl_render_apply(OGLRender *oglrender) 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); } diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c index 6abe1262c0b..b54f8fdf190 100644 --- a/source/blender/modifiers/intern/MOD_solidify.c +++ b/source/blender/modifiers/intern/MOD_solidify.c @@ -196,7 +196,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, int UNUSED(useRenderParams), int UNUSED(isFinalCalc)) { - int i; + int i, *index; DerivedMesh *result; SolidifyModifierData *smd = (SolidifyModifierData*) md; @@ -321,7 +321,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, 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 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, 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; |