[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42114] trunk/blender/source/blender: patch: [#29382] Arbitrary Length Array Function Additions and Modifications

Campbell Barton ideasman42 at gmail.com
Thu Nov 24 05:12:32 CET 2011


Revision: 42114
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42114
Author:   campbellbarton
Date:     2011-11-24 04:12:16 +0000 (Thu, 24 Nov 2011)
Log Message:
-----------
patch: [#29382] Arbitrary Length Array Function Additions and Modifications
from Andrew Hale (trumanblending), with some edits to use these in mathutils.Vector added.

Added Functions:
- dot_vn_vn - Dot product of two arrays
- normalize_vn_vn - Normalize an array and store the result in a second array
- normalize_vn - Normalize an array inplace

Renamed Functions:
Some functions have been renamed to make them consistent with the naming conventions used by fixed length array functions.
- fill_vni to fill_vn_i
- fill_vn to fill_vn_fl

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenlib/BLI_math_vector.h
    trunk/blender/source/blender/blenlib/intern/math_vector.c
    trunk/blender/source/blender/editors/space_logic/logic_window.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c
    trunk/blender/source/blender/python/mathutils/mathutils_Vector.c

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -2129,9 +2129,9 @@
 					DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 					DM_add_face_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL);
 
-					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);
+					range_vn_i(DM_get_vert_data_layer(dm, CD_ORIGINDEX), dm->numVertData, 0);
+					range_vn_i(DM_get_edge_data_layer(dm, CD_ORIGINDEX), dm->numEdgeData, 0);
+					range_vn_i(DM_get_face_data_layer(dm, CD_ORIGINDEX), dm->numFaceData, 0);
 				}
 			}
 

Modified: trunk/blender/source/blender/blenlib/BLI_math_vector.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_vector.h	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/blenlib/BLI_math_vector.h	2011-11-24 04:12:16 UTC (rev 42114)
@@ -194,17 +194,20 @@
 
 /***************************** Array Functions *******************************/
 /* attempted to follow fixed length vertex functions. names could be improved*/
-void range_vni(int *array, const int size, const int start);
+double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int size);
+float normalize_vn_vn(float *array_tar, const float *array_src, const int size);
+float normalize_vn(float *array_tar, const int size);
+void range_vn_i(int *array_tar, const int size, const int start);
 void negate_vn(float *array_tar, const int size);
 void negate_vn_vn(float *array_tar, const float *array_src, const int size);
-void mul_vn_fl(float *array, const int size, const float f);
+void mul_vn_fl(float *array_tar, const int size, const float f);
 void mul_vn_vn_fl(float *array_tar, const float *array_src, const int size, const float f);
 void add_vn_vn(float *array_tar, const float *array_src, const int size);
 void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
 void sub_vn_vn(float *array_tar, const float *array_src, const int size);
 void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size);
-void fill_vni(int *array_tar, const int size, const int val);
-void fill_vn(float *array_tar, const int size, const float val);
+void fill_vn_i(int *array_tar, const int size, const int val);
+void fill_vn_fl(float *array_tar, const int size, const float val);
 
 #ifdef __cplusplus
 }

Modified: trunk/blender/source/blender/blenlib/intern/math_vector.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_vector.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/blenlib/intern/math_vector.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -378,8 +378,38 @@
 
 /***************************** Array Functions *******************************/
 
-void range_vni(int *array_tar, const int size, const int start)
+double dot_vn_vn(const float *array_src_a, const float *array_src_b, const int size)
 {
+	double d= 0.0f;
+	const float *array_pt_a= array_src_a + (size-1);
+	const float *array_pt_b= array_src_b + (size-1);
+	int i= size;
+	while(i--) { d += *(array_pt_a--) * *(array_pt_b--); }
+	return d;
+}
+
+float normalize_vn_vn(float *array_tar, const float *array_src, const int size)
+{
+	double d= dot_vn_vn(array_tar, array_src, size);
+	float d_sqrt;
+	if (d > 1.0e-35) {
+		d_sqrt= (float)sqrt(d);
+		mul_vn_vn_fl(array_tar, array_src, size, 1.0f/d_sqrt);
+	}
+	else {
+		fill_vn_fl(array_tar, size, 0.0f);
+		d_sqrt= 0.0f;
+	}
+	return d_sqrt;
+}
+
+float normalize_vn(float *array_tar, const int size)
+{
+	return normalize_vn_vn(array_tar, array_tar, size);
+}
+
+void range_vn_i(int *array_tar, const int size, const int start)
+{
 	int *array_pt= array_tar + (size-1);
 	int j= start + (size-1);
 	int i= size;
@@ -450,14 +480,14 @@
 	while(i--) { *(tar--) = *(src_a--) - *(src_b--); }
 }
 
-void fill_vni(int *array_tar, const int size, const int val)
+void fill_vn_i(int *array_tar, const int size, const int val)
 {
 	int *tar= array_tar + (size-1);
 	int i= size;
 	while(i--) { *(tar--) = val; }
 }
 
-void fill_vn(float *array_tar, const int size, const float val)
+void fill_vn_fl(float *array_tar, const int size, const float val)
 {
 	float *tar= array_tar + (size-1);
 	int i= size;

Modified: trunk/blender/source/blender/editors/space_logic/logic_window.c
===================================================================
--- trunk/blender/source/blender/editors/space_logic/logic_window.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/editors/space_logic/logic_window.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -3701,7 +3701,7 @@
 {
 	Object *ob = (Object *)ptr->id.data;
 	PointerRNA settings_ptr;
-	uiLayout *row, *sub, *col;
+	uiLayout *row, *sub;
 
 	RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -1193,7 +1193,7 @@
 		memcpy(values, bb->vec, sizeof(bb->vec));
 	}
 	else {
-		fill_vn(values, sizeof(bb->vec)/sizeof(float), 0.0f);
+		fill_vn_fl(values, sizeof(bb->vec)/sizeof(float), 0.0f);
 	}
 
 }

Modified: trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c
===================================================================
--- trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/python/mathutils/mathutils_Matrix.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -1223,7 +1223,7 @@
 );
 static PyObject *Matrix_zero(MatrixObject *self)
 {
-	fill_vn(self->contigPtr, self->row_size * self->col_size, 0.0f);
+	fill_vn_fl(self->contigPtr, self->row_size * self->col_size, 0.0f);
 
 	if (BaseMath_WriteCallback(self) == -1)
 		return NULL;

Modified: trunk/blender/source/blender/python/mathutils/mathutils_Vector.c
===================================================================
--- trunk/blender/source/blender/python/mathutils/mathutils_Vector.c	2011-11-24 03:12:37 UTC (rev 42113)
+++ trunk/blender/source/blender/python/mathutils/mathutils_Vector.c	2011-11-24 04:12:16 UTC (rev 42114)
@@ -95,7 +95,7 @@
 );
 static PyObject *Vector_zero(VectorObject *self)
 {
-	fill_vn(self->vec, self->size, 0.0f);
+	fill_vn_fl(self->vec, self->size, 0.0f);
 
 	if (BaseMath_WriteCallback(self) == -1)
 		return NULL;
@@ -116,19 +116,10 @@
 );
 static PyObject *Vector_normalize(VectorObject *self)
 {
-	int i;
-	float norm = 0.0f;
-
 	if (BaseMath_ReadCallback(self) == -1)
 		return NULL;
 
-	for (i = 0; i < self->size; i++) {
-		norm += self->vec[i] * self->vec[i];
-	}
-	norm = (float) sqrt(norm);
-	for (i = 0; i < self->size; i++) {
-		self->vec[i] /= norm;
-	}
+	normalize_vn(self->vec, self->size);
 
 	(void)BaseMath_WriteCallback(self);
 	Py_RETURN_NONE;
@@ -571,8 +562,6 @@
 static PyObject *Vector_dot(VectorObject *self, PyObject *value)
 {
 	float tvec[MAX_DIMENSIONS];
-	double dot = 0.0;
-	int x;
 
 	if (BaseMath_ReadCallback(self) == -1)
 		return NULL;
@@ -580,11 +569,7 @@
 	if (mathutils_array_parse(tvec, self->size, self->size, value, "Vector.dot(other), invalid 'other' arg") == -1)
 		return NULL;
 
-	for (x = 0; x < self->size; x++) {
-		dot += (double)(self->vec[x] * tvec[x]);
-	}
-
-	return PyFloat_FromDouble(dot);
+	return PyFloat_FromDouble(dot_vn_vn(self->vec, tvec, self->size));
 }
 
 PyDoc_STRVAR(Vector_angle_doc,
@@ -1145,9 +1130,6 @@
 
 	/* make sure v1 is always the vector */
 	if (vec1 && vec2) {
-		int i;
-		double dot = 0.0f;
-
 		if (vec1->size != vec2->size) {
 			PyErr_SetString(PyExc_ValueError,
 			                "Vector multiplication: "
@@ -1156,10 +1138,7 @@
 		}
 
 		/*dot product*/
-		for (i = 0; i < vec1->size; i++) {
-			dot += (double)(vec1->vec[i] * vec2->vec[i]);
-		}
-		return PyFloat_FromDouble(dot);
+		return PyFloat_FromDouble(dot_vn_vn(vec1->vec, vec2->vec, vec1->size));
 	}
 	else if (vec1) {
 		if (MatrixObject_Check(v2)) {
@@ -1644,7 +1623,6 @@
 static int Vector_setLength(VectorObject *self, PyObject *value)
 {
 	double dot = 0.0f, param;
-	int i;
 
 	if (BaseMath_ReadCallback(self) == -1)
 		return -1;
@@ -1661,13 +1639,11 @@
 		return -1;
 	}
 	if (param == 0.0) {
-		fill_vn(self->vec, self->size, 0.0f);
+		fill_vn_fl(self->vec, self->size, 0.0f);
 		return 0;
 	}
 
-	for (i = 0; i < self->size; i++) {
-		dot += (double)(self->vec[i] * self->vec[i]);
-	}
+	dot= dot_vn_vn(self->vec, self->vec, self->size);
 
 	if (!dot) /* cant sqrt zero */
 		return 0;
@@ -1679,9 +1655,7 @@
 
 	dot= dot/param;
 
-	for (i = 0; i < self->size; i++) {
-		self->vec[i]= self->vec[i] / (float)dot;
-	}
+	mul_vn_fl(self->vec, self->size, 1.0/dot);
 
 	(void)BaseMath_WriteCallback(self); /* checked already */
 
@@ -1691,16 +1665,10 @@
 /* vector.length_squared */
 static PyObject *Vector_getLengthSquared(VectorObject *self, void *UNUSED(closure))
 {
-	double dot = 0.0f;
-	int i;
-
 	if (BaseMath_ReadCallback(self) == -1)
 		return NULL;
 
-	for (i = 0; i < self->size; i++) {
-		dot += (double)(self->vec[i] * self->vec[i]);
-	}
-	return PyFloat_FromDouble(dot);
+	return PyFloat_FromDouble(dot_vn_vn(self->vec, self->vec, self->size));
 }
 
 /* Get a new Vector according to the provided swizzle. This function has little
@@ -2432,7 +2400,7 @@
 				memcpy(self->vec, vec, size * sizeof(float));
 			}
 			else { /* new empty */
-				fill_vn(self->vec, size, 0.0f);
+				fill_vn_fl(self->vec, size, 0.0f);
 				if (size == 4) { /* do the homogenous thing */
 					self->vec[3] = 1.0f;
 				}




More information about the Bf-blender-cvs mailing list