Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h2
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c10
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c2
-rw-r--r--source/blender/blenlib/BLI_math_vector.h8
-rw-r--r--source/blender/blenlib/intern/math_vector.c40
-rw-r--r--source/blender/editors/render/render_opengl.c15
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c21
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;