diff -rupN trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp blender-group-ref/blender/source/gameengine/Ketsji/KX_GameObject.cpp --- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2012-05-04 17:51:31.018319366 +0200 +++ blender-group-ref/blender/source/gameengine/Ketsji/KX_GameObject.cpp 2012-05-04 18:40:06.934492388 +0200 @@ -110,7 +110,9 @@ KX_GameObject::KX_GameObject( m_pHitObject(NULL), m_pObstacleSimulation(NULL), m_actionManager(NULL), - m_isDeformable(false) + m_isDeformable(false), + m_pDupliGroupObject(NULL), + m_pInstanceObjects(NULL) #ifdef WITH_PYTHON , m_attr_dict(NULL) #endif @@ -229,6 +231,35 @@ KX_IPhysicsController* KX_GameObject::Ge return m_pPhysicsController1; } +KX_GameObject* KX_GameObject::GetDupliGroupObject() +{ + if(m_pDupliGroupObject) + m_pDupliGroupObject->AddRef(); + + return m_pDupliGroupObject; +} + +CListValue* KX_GameObject::GetInstanceObjects() +{ + if(m_pInstanceObjects) + m_pInstanceObjects->AddRef(); + + return m_pInstanceObjects; +} + +void KX_GameObject::AddInstanceObjects(KX_GameObject* obj) +{ + if(!m_pInstanceObjects) + m_pInstanceObjects = new CListValue(); + + m_pInstanceObjects->Add(obj); +} + +void KX_GameObject::SetDupliGroupObject(KX_GameObject* obj) +{ + m_pDupliGroupObject = obj; +} + KX_GameObject* KX_GameObject::GetParent() { KX_GameObject* result = NULL; @@ -1630,6 +1661,8 @@ PyMethodDef KX_GameObject::Methods[] = { PyAttributeDef KX_GameObject::Attributes[] = { KX_PYATTRIBUTE_RO_FUNCTION("name", KX_GameObject, pyattr_get_name), KX_PYATTRIBUTE_RO_FUNCTION("parent", KX_GameObject, pyattr_get_parent), + KX_PYATTRIBUTE_RO_FUNCTION("members", KX_GameObject, pyattr_get_instance_objects), + KX_PYATTRIBUTE_RO_FUNCTION("group", KX_GameObject, pyattr_get_dupli_group_object), KX_PYATTRIBUTE_RO_FUNCTION("life", KX_GameObject, pyattr_get_life), KX_PYATTRIBUTE_RW_FUNCTION("mass", KX_GameObject, pyattr_get_mass, pyattr_set_mass), KX_PYATTRIBUTE_RW_FUNCTION("linVelocityMin", KX_GameObject, pyattr_get_lin_vel_min, pyattr_set_lin_vel_min), @@ -1923,6 +1956,28 @@ PyObject* KX_GameObject::pyattr_get_pare } Py_RETURN_NONE; } + +PyObject* KX_GameObject::pyattr_get_instance_objects(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_GameObject* self= static_cast(self_v); + CListValue* instances = self->GetInstanceObjects(); + if (instances) { + instances->Release(); + return instances->GetProxy(); + } + Py_RETURN_NONE; +} + +PyObject* KX_GameObject::pyattr_get_dupli_group_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_GameObject* self= static_cast(self_v); + KX_GameObject* pivot = self->GetDupliGroupObject(); + if (pivot) { + pivot->Release(); + return pivot->GetProxy(); + } + Py_RETURN_NONE; +} PyObject* KX_GameObject::pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { diff -rupN trunk/blender/source/gameengine/Ketsji/KX_GameObject.h blender-group-ref/blender/source/gameengine/Ketsji/KX_GameObject.h --- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h 2012-05-04 17:51:31.046319367 +0200 +++ blender-group-ref/blender/source/gameengine/Ketsji/KX_GameObject.h 2012-05-04 18:09:42.722372202 +0200 @@ -116,6 +116,8 @@ protected: KX_ObstacleSimulation* m_pObstacleSimulation; + CListValue* m_pInstanceObjects; + KX_GameObject* m_pDupliGroupObject; // The action manager is used to play/stop/update actions BL_ActionManager* m_actionManager; @@ -208,6 +210,26 @@ public: void RemoveParent(KX_Scene *scene); /********************************* + * group reference API + *********************************/ + + KX_GameObject* + GetDupliGroupObject( + ); + + CListValue* + GetInstanceObjects( + ); + + void + SetDupliGroupObject(KX_GameObject* + ); + + void + AddInstanceObjects(KX_GameObject* + ); + + /********************************* * Animation API *********************************/ @@ -905,6 +927,8 @@ public: KX_PYMETHOD_NOARGS(KX_GameObject,GetReactionForce); + KX_PYMETHOD_NOARGS(KX_GameObject,GetInstanceObjects); + KX_PYMETHOD_NOARGS(KX_GameObject,GetDupliGroupObject); KX_PYMETHOD_NOARGS(KX_GameObject,GetVisible); KX_PYMETHOD_VARARGS(KX_GameObject,SetVisible); @@ -949,6 +973,9 @@ public: static PyObject* pyattr_get_name(void* self_v, const KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_parent(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_dupli_group_object(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_instance_objects(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_life(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef); static int pyattr_set_mass(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); diff -rupN trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp blender-group-ref/blender/source/gameengine/Ketsji/KX_Scene.cpp --- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp 2012-05-04 17:51:30.874319360 +0200 +++ blender-group-ref/blender/source/gameengine/Ketsji/KX_Scene.cpp 2012-05-04 18:10:23.938374195 +0200 @@ -769,6 +769,13 @@ void KX_Scene::DupliGroupRecurse(CValue* // we can now add the graphic controller to the physic engine replica->ActivateGraphicController(true); + // set references for dupli-group + // groupobj holds a list of all objects, that belongs to this group + groupobj->AddInstanceObjects(replica); + + // every object gets the reference to its dupli-group object + replica->SetDupliGroupObject(groupobj); + // done with replica replica->Release(); }