[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16162] trunk/blender/source/blender: Added vec.reflect(mirror) method to Python Mathutils Vector type

Campbell Barton ideasman42 at gmail.com
Mon Aug 18 04:29:29 CEST 2008


Revision: 16162
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16162
Author:   campbellbarton
Date:     2008-08-18 04:29:25 +0200 (Mon, 18 Aug 2008)

Log Message:
-----------
Added vec.reflect(mirror) method to Python Mathutils Vector type
also made sensor and actuator text areas a bit bigger so full names can be read.

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/doc/Mathutils.py
    trunk/blender/source/blender/python/api2_2x/vector.c
    trunk/blender/source/blender/python/api2_2x/vector.h
    trunk/blender/source/blender/src/buttons_logic.c

Modified: trunk/blender/source/blender/python/api2_2x/doc/Mathutils.py
===================================================================
--- trunk/blender/source/blender/python/api2_2x/doc/Mathutils.py	2008-08-18 00:08:22 UTC (rev 16161)
+++ trunk/blender/source/blender/python/api2_2x/doc/Mathutils.py	2008-08-18 02:29:25 UTC (rev 16162)
@@ -521,6 +521,15 @@
     @return: Return a quaternion rotation from the vector and the track and up axis.
     """
 
+  def reflect(mirror):
+    """
+    Return the reflection vector from the mirror vector argument.
+    @type mirror: Vector object
+    @param mirror: This vector could be a normal from the reflecting surface.
+    @rtype: Vector object matching the size of this vector.
+    @return: The reflected vector.
+    """
+
 class Euler:
   """
   The Euler object

Modified: trunk/blender/source/blender/python/api2_2x/vector.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/vector.c	2008-08-18 00:08:22 UTC (rev 16161)
+++ trunk/blender/source/blender/python/api2_2x/vector.c	2008-08-18 02:29:25 UTC (rev 16162)
@@ -42,6 +42,7 @@
 char Vector_Resize4D_doc[] = "() - resize a vector to [x,y,z,w]";
 char Vector_toPoint_doc[] = "() - create a new Point Object from this vector";
 char Vector_ToTrackQuat_doc[] = "(track, up) - extract a quaternion from the vector and the track and up axis";
+char Vector_reflect_doc[] = "(mirror) - return a vector reflected on the mirror normal";
 char Vector_copy_doc[] = "() - return a copy of the vector";
 /*-----------------------METHOD DEFINITIONS ----------------------*/
 struct PyMethodDef Vector_methods[] = {
@@ -53,6 +54,7 @@
 	{"resize4D", (PyCFunction) Vector_Resize4D, METH_NOARGS, Vector_Resize2D_doc},
 	{"toPoint", (PyCFunction) Vector_toPoint, METH_NOARGS, Vector_toPoint_doc},
 	{"toTrackQuat", ( PyCFunction ) Vector_ToTrackQuat, METH_VARARGS, Vector_ToTrackQuat_doc},
+	{"reflect", ( PyCFunction ) Vector_reflect, METH_O, Vector_reflect_doc},
 	{"copy", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
 	{"__copy__", (PyCFunction) Vector_copy, METH_NOARGS, Vector_copy_doc},
 	{NULL, NULL, 0, NULL}
@@ -273,8 +275,56 @@
 	return newQuaternionObject(quat, Py_NEW);
 }
 
+/*----------------------------Vector.reflect(mirror) ----------------------
+  return a reflected vector on the mirror normal
+  ((2 * DotVecs(vec, mirror)) * mirror) - vec
+  using arithb.c would be nice here */
+PyObject *Vector_reflect( VectorObject * self, PyObject * value )
+{
+	VectorObject *mirrvec;
+	float mirror[3];
+	float vec[3];
+	float reflect[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+	float dot2;
+	
+	/* for normalizing */
+	int i;
+	float norm = 0.0f;
+	
+	if (!VectorObject_Check(value)) 
+		return EXPP_ReturnPyObjError( PyExc_TypeError, "expected a vector argument" );
+	
+	mirrvec = (VectorObject *)value;
+	
+	mirror[0] = mirrvec->vec[0];
+	mirror[1] = mirrvec->vec[1];
+	if (mirrvec->size > 2)	mirror[2] = mirrvec->vec[2];
+	else					mirror[2] = 0.0;
+	
+	/* normalize, whos idea was it not to use arithb.c? :-/ */
+	for(i = 0; i < 3; i++) {
+		norm += mirror[i] * mirror[i];
+	}
+	norm = (float) sqrt(norm);
+	for(i = 0; i < 3; i++) {
+		mirror[i] /= norm;
+	}
+	/* done */
+	
+	vec[0] = self->vec[0];
+	vec[1] = self->vec[1];
+	if (self->size > 2)		vec[2] = self->vec[2];
+	else					vec[2] = 0.0;
+	
+	dot2 = 2 * vec[0]*mirror[0]+vec[1]*mirror[1]+vec[2]*mirror[2];
+	
+	reflect[0] = (dot2 * mirror[0]) - vec[0];
+	reflect[1] = (dot2 * mirror[1]) - vec[1];
+	reflect[2] = (dot2 * mirror[2]) - vec[2];
+	
+	return newVectorObject(reflect, self->size, Py_NEW);
+}
 
-
 /*----------------------------Vector.copy() --------------------------------------
   return a copy of the vector */
 PyObject *Vector_copy(VectorObject * self)

Modified: trunk/blender/source/blender/python/api2_2x/vector.h
===================================================================
--- trunk/blender/source/blender/python/api2_2x/vector.h	2008-08-18 00:08:22 UTC (rev 16161)
+++ trunk/blender/source/blender/python/api2_2x/vector.h	2008-08-18 02:29:25 UTC (rev 16162)
@@ -52,6 +52,7 @@
 PyObject *Vector_Resize4D( VectorObject * self );
 PyObject *Vector_toPoint( VectorObject * self );
 PyObject *Vector_ToTrackQuat( VectorObject * self, PyObject * args );
+PyObject *Vector_reflect( VectorObject * self, PyObject * value );
 PyObject *Vector_copy( VectorObject * self );
 PyObject *newVectorObject(float *vec, int size, int type);
 

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2008-08-18 00:08:22 UTC (rev 16161)
+++ trunk/blender/source/blender/src/buttons_logic.c	2008-08-18 02:29:25 UTC (rev 16162)
@@ -3349,8 +3349,8 @@
 					ycoo= yco;
 					if(sens->flag & SENS_SHOW)
 					{
-						uiDefButS(block, MENU, B_CHANGE_SENS, sensor_pup(),	(short)(xco+22), yco, 100, 19, &sens->type, 0, 0, 0, 0, "Sensor type");
-						but= uiDefBut(block, TEX, 1, "", (short)(xco+122), yco, (short)(width-144), 19, sens->name, 0, 31, 0, 0, "Sensor name");
+						uiDefButS(block, MENU, B_CHANGE_SENS, sensor_pup(),	(short)(xco+22), yco, 80, 19, &sens->type, 0, 0, 0, 0, "Sensor type");
+						but= uiDefBut(block, TEX, 1, "", (short)(xco+102), yco, (short)(width-124), 19, sens->name, 0, 31, 0, 0, "Sensor name");
 						uiButSetFunc(but, make_unique_prop_names_cb, sens->name, (void*) 0);
 
 						sens->otype= sens->type;
@@ -3360,9 +3360,9 @@
 					else {
 						set_col_sensor(sens->type, 1);
 						glRecti(xco+22, yco, xco+width-22,yco+19);
-						but= uiDefBut(block, LABEL, 0, sensor_name(sens->type),	(short)(xco+22), yco, 100, 19, sens, 0, 0, 0, 0, "");
+						but= uiDefBut(block, LABEL, 0, sensor_name(sens->type),	(short)(xco+22), yco, 80, 19, sens, 0, 0, 0, 0, "");
 						uiButSetFunc(but, sca_move_sensor, sens, NULL);
-						but= uiDefBut(block, LABEL, 0, sens->name, (short)(xco+122), yco, (short)(width-144), 19, sens, 0, 31, 0, 0, "");
+						but= uiDefBut(block, LABEL, 0, sens->name, (short)(xco+102), yco, (short)(width-124), 19, sens, 0, 31, 0, 0, "");
 						uiButSetFunc(but, sca_move_sensor, sens, NULL);
 					}
 
@@ -3419,8 +3419,8 @@
 
 					if(act->flag & ACT_SHOW) {
 						act->otype= act->type;
-						uiDefButS(block, MENU, B_CHANGE_ACT, actuator_pup(ob),	(short)(xco+22), yco, 100, 19, &act->type, 0, 0, 0, 0, "Actuator type");
-						but= uiDefBut(block, TEX, 1, "", (short)(xco+122), yco, (short)(width-144), 19, act->name, 0, 31, 0, 0, "Actuator name");
+						uiDefButS(block, MENU, B_CHANGE_ACT, actuator_pup(ob),	(short)(xco+22), yco, 90, 19, &act->type, 0, 0, 0, 0, "Actuator type");
+						but= uiDefBut(block, TEX, 1, "", (short)(xco+112), yco, (short)(width-134), 19, act->name, 0, 31, 0, 0, "Actuator name");
 						uiButSetFunc(but, make_unique_prop_names_cb, act->name, (void*) 0);
 
 						ycoo= yco;
@@ -3430,9 +3430,9 @@
 					else {
 						set_col_actuator(act->type, 1);
 						glRecti((short)(xco+22), yco, (short)(xco+width-22),(short)(yco+19));
-						but= uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 100, 19, act, 0, 0, 0, 0, "Actuator type");
+						but= uiDefBut(block, LABEL, 0, actuator_name(act->type), (short)(xco+22), yco, 90, 19, act, 0, 0, 0, 0, "Actuator type");
 						uiButSetFunc(but, sca_move_actuator, act, NULL);
-						but= uiDefBut(block, LABEL, 0, act->name, (short)(xco+122), yco, (short)(width-144), 19, act, 0, 0, 0, 0, "Actuator name");
+						but= uiDefBut(block, LABEL, 0, act->name, (short)(xco+112), yco, (short)(width-134), 19, act, 0, 0, 0, 0, "Actuator name");
 						uiButSetFunc(but, sca_move_actuator, act, NULL);
 						ycoo= yco;
 					}





More information about the Bf-blender-cvs mailing list