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);
                        


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to