[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14527] branches/apricot/source/blender: dupliGroup instance offset, so a library of objects can be stored on 1 layer without placing each groups members over the world 0 , 0, 0 point.

Campbell Barton ideasman42 at gmail.com
Wed Apr 23 13:38:11 CEST 2008


Revision: 14527
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14527
Author:   campbellbarton
Date:     2008-04-23 13:38:10 +0200 (Wed, 23 Apr 2008)

Log Message:
-----------
dupliGroup instance offset, so a library of objects can be stored on 1 layer without placing each groups members over the world 0,0,0 point.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/intern/anim.c
    branches/apricot/source/blender/makesdna/DNA_group_types.h
    branches/apricot/source/blender/python/api2_2x/Group.c
    branches/apricot/source/blender/python/api2_2x/doc/Group.py
    branches/apricot/source/blender/src/buttons_object.c

Modified: branches/apricot/source/blender/blenkernel/intern/anim.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/anim.c	2008-04-23 10:16:59 UTC (rev 14526)
+++ branches/apricot/source/blender/blenkernel/intern/anim.c	2008-04-23 11:38:10 UTC (rev 14527)
@@ -303,7 +303,7 @@
 	DupliObject *dob;
 	Group *group;
 	GroupObject *go;
-	float mat[4][4];
+	float mat[4][4], tmat[4][4];
 	
 	if(ob->dup_group==NULL) return;
 	group= ob->dup_group;
@@ -320,7 +320,15 @@
 		/* note, if you check on layer here, render goes wrong... it still deforms verts and uses parent imat */
 		if(go->ob!=ob) {
 			
-			Mat4MulMat4(mat, go->ob->obmat, ob->obmat);
+			/* Group Dupli Offset, should apply after everything else */
+			if (group->dupli_ofs[0] || group->dupli_ofs[1] || group->dupli_ofs[2]) {
+				Mat4CpyMat4(tmat, go->ob->obmat);
+				VecSubf(tmat[3], tmat[3], group->dupli_ofs);
+				Mat4MulMat4(mat, tmat, ob->obmat);
+			} else {
+				Mat4MulMat4(mat, go->ob->obmat, ob->obmat);
+			}
+			
 			dob= new_dupli_object(lb, go->ob, mat, ob->lay, 0, OB_DUPLIGROUP, animated);
 			dob->no_draw= (dob->origlay & group->layer)==0;
 			

Modified: branches/apricot/source/blender/makesdna/DNA_group_types.h
===================================================================
--- branches/apricot/source/blender/makesdna/DNA_group_types.h	2008-04-23 10:16:59 UTC (rev 14526)
+++ branches/apricot/source/blender/makesdna/DNA_group_types.h	2008-04-23 11:38:10 UTC (rev 14527)
@@ -54,7 +54,7 @@
 	 * the objects that show in the group can change depending
 	 * on the last used scene */
 	unsigned int layer;
-	int pad;
+	float dupli_ofs[3];
 } Group;
 
 

Modified: branches/apricot/source/blender/python/api2_2x/Group.c
===================================================================
--- branches/apricot/source/blender/python/api2_2x/Group.c	2008-04-23 10:16:59 UTC (rev 14526)
+++ branches/apricot/source/blender/python/api2_2x/Group.c	2008-04-23 11:38:10 UTC (rev 14527)
@@ -46,6 +46,8 @@
 #include "gen_utils.h"
 #include "gen_library.h"
 
+#include "vector.h"
+
 /* checks for the group being removed */
 #define GROUP_DEL_CHECK_PY(bpy_group) if (!(bpy_group->group)) return ( EXPP_ReturnPyObjError( PyExc_RuntimeError, "Group has been removed" ) )
 #define GROUP_DEL_CHECK_INT(bpy_group) if (!(bpy_group->group)) return ( EXPP_ReturnIntError( PyExc_RuntimeError, "Group has been removed" ) )
@@ -200,8 +202,33 @@
 	return 0;
 }
 
+static PyObject *Group_getDupliOfs( BPy_Group * self )
+{
+	GROUP_DEL_CHECK_PY(self);
+	return newVectorObject( self->group->dupli_ofs, 3, Py_WRAP );
+}
 
+static int Group_setDupliOfs( BPy_Group * self, PyObject * value )
+{	
+	VectorObject *bpy_vec;
+	GROUP_DEL_CHECK_INT(self);
+	if (!VectorObject_Check(value))
+		return ( EXPP_ReturnIntError( PyExc_TypeError,
+			"expected a vector" ) );
+	
+	bpy_vec = (VectorObject *)value;
+	
+	if (bpy_vec->size != 3)
+		return ( EXPP_ReturnIntError( PyExc_ValueError,
+			"can only assign a 3D vector" ) );
+	
+	self->group->dupli_ofs[0] = bpy_vec->vec[0];
+	self->group->dupli_ofs[1] = bpy_vec->vec[1];
+	self->group->dupli_ofs[2] = bpy_vec->vec[2];
+	return 0;
+}
 
+
 /*****************************************************************************/
 /* PythonTypeObject callback function prototypes			 */
 /*****************************************************************************/
@@ -251,6 +278,10 @@
 	 (getter)Group_getObjects, (setter)Group_setObjects,
 	 "objects in this group",
 	 NULL},
+	{"dupliOffset",
+	 (getter)Group_getDupliOfs, (setter)Group_setDupliOfs,
+	 "offset to use when instancing this group as a DupliGroup",
+	NULL},
 	{NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
 };
 

Modified: branches/apricot/source/blender/python/api2_2x/doc/Group.py
===================================================================
--- branches/apricot/source/blender/python/api2_2x/doc/Group.py	2008-04-23 10:16:59 UTC (rev 14526)
+++ branches/apricot/source/blender/python/api2_2x/doc/Group.py	2008-04-23 11:38:10 UTC (rev 14527)
@@ -105,6 +105,8 @@
 		This object gives access to Groups in Blender.
 	@ivar layers: Layer bitmask for this group.
 	@type layers: int
+	@ivar dupliOffset: Object offset when instanced as a dupligroup
+	@type dupliOffset: vector
 	@ivar objects: Objects that this group uses.
 		This is a sequence with-list like access so use list(grp.objects) if you need to use a list (where grp is a group).
 		The groups objects can be set by assigning a list or iterator of objects to the groups objects.

Modified: branches/apricot/source/blender/src/buttons_object.c
===================================================================
--- branches/apricot/source/blender/src/buttons_object.c	2008-04-23 10:16:59 UTC (rev 14526)
+++ branches/apricot/source/blender/src/buttons_object.c	2008-04-23 11:38:10 UTC (rev 14527)
@@ -2607,17 +2607,31 @@
 	/* all groups */
 	for(group= G.main->group.first; group; group= group->id.next) {
 		if(object_in_group(ob, group)) {
-			xco= 160;
+			xco= 130;
 			
-			uiBlockBeginAlign(block);
-			but = uiDefBut(block, TEX, B_IDNAME, "GR:",	10, 120-yco, 150, 20, group->id.name+2, 0.0, 21.0, 0, 0, "Displays Group name. Click to change.");
-			uiButSetFunc(but, test_idbutton_cb, group->id.name, NULL);
-			
 			if(group->id.lib) {
-				but= uiDefIconBut(block, BUT, B_NOP, ICON_PARLIB, 160, 120-yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Make Group local");
+				uiBlockBeginAlign(block);
+				uiSetButLock(GET_INT_FROM_POINTER(group->id.lib), ERROR_LIBDATA_MESSAGE); /* We cant actually use this button */
+				uiDefBut(block, TEX, B_IDNAME, "GR:",	10, 120-yco, 100, 20, group->id.name+2, 0.0, 21.0, 0, 0, "Displays Group name. Click to change.");
+				uiClearButLock();
+				
+				but= uiDefIconBut(block, BUT, B_NOP, ICON_PARLIB, 110, 120-yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Make Group local");
 				uiButSetFunc(but, group_local, group, NULL);
-				xco= 180;
+				uiBlockEndAlign(block);
+			} else {
+				but = uiDefBut(block, TEX, B_IDNAME, "GR:",	10, 120-yco, 120, 20, group->id.name+2, 0.0, 21.0, 0, 0, "Displays Group name. Click to change.");
+				uiButSetFunc(but, test_idbutton_cb, group->id.name, NULL);
 			}
+			
+			uiSetButLock(GET_INT_FROM_POINTER(group->id.lib), ERROR_LIBDATA_MESSAGE);
+			uiBlockBeginAlign(block);
+			uiDefButF(block, NUM, REDRAWALL, "X:",			xco+5, 120-yco, 50, 20, &group->dupli_ofs[0], -100000, 100000, 100, 0, "Offset to use when instacing the group");
+			uiDefButF(block, NUM, REDRAWALL, "Y:",			xco+55, 120-yco, 50, 20, &group->dupli_ofs[1], -100000, 100000, 100, 0, "Offset to use when instacing the group");
+			uiDefButF(block, NUM, REDRAWALL, "Z:",			xco+105, 120-yco, 50, 20, &group->dupli_ofs[2], -100000, 100000, 100, 0, "Offset to use when instacing the group");
+			uiBlockEndAlign(block);
+			uiClearButLock();
+			
+			xco = 290;
 			but = uiDefIconBut(block, BUT, B_NOP, VICON_X, xco, 120-yco, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Remove Group membership");
 			uiButSetFunc(but, group_ob_rem, group, ob);
 			





More information about the Bf-blender-cvs mailing list