[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