forked from bartvdbraak/blender
BGE : addObject in python without reference object.
Making the reference argument optional for the addObject function. ``` scene.addObject("Cube") ``` This allows to keep the rotation, scale and position of the original object. To avoid layer problems with lights if the reference arguments is None, the new object have the same layer than the active layers in scene. Reviewers: lordloki, moguri, hg1, sybren Reviewed By: hg1, sybren Subscribers: agoose77 Projects: #game_engine Differential Revision: https://developer.blender.org/D1222
This commit is contained in:
parent
3524676036
commit
5efbd2a407
@ -143,9 +143,9 @@ base class --- :class:`PyObjectPlus`
|
|||||||
|
|
||||||
:arg object: The (name of the) object to add.
|
:arg object: The (name of the) object to add.
|
||||||
:type object: :class:`KX_GameObject` or string
|
:type object: :class:`KX_GameObject` or string
|
||||||
:arg reference: The (name of the) object which position, orientation, and scale to copy.
|
:arg reference: The (name of the) object which position, orientation, and scale to copy (optional), if the object to add is a light and there is not reference the light's layer will be the same that the active layer in the blender scene.
|
||||||
:type reference: :class:`KX_GameObject` or string
|
:type reference: :class:`KX_GameObject` or string
|
||||||
:arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever.
|
:arg time: The lifetime of the added object, in frames. A time of 0 means the object will last forever (optional).
|
||||||
:type time: integer
|
:type time: integer
|
||||||
:return: The newly added object.
|
:return: The newly added object.
|
||||||
:rtype: :class:`KX_GameObject`
|
:rtype: :class:`KX_GameObject`
|
||||||
|
@ -914,7 +914,7 @@ public:
|
|||||||
* Change the layer of the object (when it is added in another layer
|
* Change the layer of the object (when it is added in another layer
|
||||||
* than the original layer)
|
* than the original layer)
|
||||||
*/
|
*/
|
||||||
void
|
virtual void
|
||||||
SetLayer(
|
SetLayer(
|
||||||
int l
|
int l
|
||||||
);
|
);
|
||||||
|
@ -108,6 +108,7 @@ void KX_LightObject::UpdateScene(KX_Scene *kxscene)
|
|||||||
|
|
||||||
void KX_LightObject::SetLayer(int layer)
|
void KX_LightObject::SetLayer(int layer)
|
||||||
{
|
{
|
||||||
|
KX_GameObject::SetLayer(layer);
|
||||||
m_lightobj->m_layer = layer;
|
m_lightobj->m_layer = layer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ public:
|
|||||||
RAS_ILightObject* GetLightData() { return m_lightobj;}
|
RAS_ILightObject* GetLightData() { return m_lightobj;}
|
||||||
|
|
||||||
void UpdateScene(class KX_Scene *kxscene);
|
void UpdateScene(class KX_Scene *kxscene);
|
||||||
void SetLayer(int layer);
|
virtual void SetLayer(int layer);
|
||||||
|
|
||||||
virtual int GetGameObjectType() { return OBJ_LIGHT; }
|
virtual int GetGameObjectType() { return OBJ_LIGHT; }
|
||||||
|
|
||||||
|
@ -835,12 +835,6 @@ void KX_Scene::DupliGroupRecurse(CValue* obj, int level)
|
|||||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||||
// add the object in the layer of the parent
|
// add the object in the layer of the parent
|
||||||
(*git)->SetLayer(groupobj->GetLayer());
|
(*git)->SetLayer(groupobj->GetLayer());
|
||||||
// If the object was a light, we need to update it's RAS_LightObject as well
|
|
||||||
if ((*git)->GetGameObjectType()==SCA_IObject::OBJ_LIGHT)
|
|
||||||
{
|
|
||||||
KX_LightObject* lightobj = static_cast<KX_LightObject*>(*git);
|
|
||||||
lightobj->SetLayer(groupobj->GetLayer());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// replicate crosslinks etc. between logic bricks
|
// replicate crosslinks etc. between logic bricks
|
||||||
@ -916,18 +910,20 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
|
|||||||
replica->GetSGNode()->AddChild(childreplicanode);
|
replica->GetSGNode()->AddChild(childreplicanode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this stage all the objects in the hierarchy have been duplicated,
|
if (referenceobj) {
|
||||||
// we can update the scenegraph, we need it for the duplication of logic
|
// At this stage all the objects in the hierarchy have been duplicated,
|
||||||
MT_Point3 newpos = referenceobj->NodeGetWorldPosition();
|
// we can update the scenegraph, we need it for the duplication of logic
|
||||||
replica->NodeSetLocalPosition(newpos);
|
MT_Point3 newpos = referenceobj->NodeGetWorldPosition();
|
||||||
|
replica->NodeSetLocalPosition(newpos);
|
||||||
|
|
||||||
MT_Matrix3x3 newori = referenceobj->NodeGetWorldOrientation();
|
MT_Matrix3x3 newori = referenceobj->NodeGetWorldOrientation();
|
||||||
replica->NodeSetLocalOrientation(newori);
|
replica->NodeSetLocalOrientation(newori);
|
||||||
|
|
||||||
// get the rootnode's scale
|
// get the rootnode's scale
|
||||||
MT_Vector3 newscale = referenceobj->GetSGNode()->GetRootSGParent()->GetLocalScale();
|
MT_Vector3 newscale = referenceobj->GetSGNode()->GetRootSGParent()->GetLocalScale();
|
||||||
// set the replica's relative scale with the rootnode's scale
|
// set the replica's relative scale with the rootnode's scale
|
||||||
replica->NodeSetRelativeScale(newscale);
|
replica->NodeSetRelativeScale(newscale);
|
||||||
|
}
|
||||||
|
|
||||||
replica->GetSGNode()->UpdateWorldData(0);
|
replica->GetSGNode()->UpdateWorldData(0);
|
||||||
replica->GetSGNode()->SetBBox(originalobj->GetSGNode()->BBox());
|
replica->GetSGNode()->SetBBox(originalobj->GetSGNode()->BBox());
|
||||||
@ -947,13 +943,13 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
|
|||||||
{
|
{
|
||||||
// this will also relink the actuators in the hierarchy
|
// this will also relink the actuators in the hierarchy
|
||||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||||
// add the object in the layer of the reference object
|
if (referenceobj) {
|
||||||
(*git)->SetLayer(referenceobj->GetLayer());
|
// add the object in the layer of the reference object
|
||||||
// If the object was a light, we need to update it's RAS_LightObject as well
|
(*git)->SetLayer(referenceobj->GetLayer());
|
||||||
if ((*git)->GetGameObjectType()==SCA_IObject::OBJ_LIGHT)
|
}
|
||||||
{
|
else {
|
||||||
KX_LightObject* lightobj = static_cast<KX_LightObject*>(*git);
|
// We don't know what layer set, so we set all visible layers in the blender scene.
|
||||||
lightobj->SetLayer(referenceobj->GetLayer());
|
(*git)->SetLayer(m_blenderScene->lay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2503,23 +2499,23 @@ KX_PYMETHODDEF_DOC(KX_Scene, addObject,
|
|||||||
"addObject(object, other, time=0)\n"
|
"addObject(object, other, time=0)\n"
|
||||||
"Returns the added object.\n")
|
"Returns the added object.\n")
|
||||||
{
|
{
|
||||||
PyObject *pyob, *pyreference;
|
PyObject *pyob, *pyreference = Py_None;
|
||||||
KX_GameObject *ob, *reference;
|
KX_GameObject *ob, *reference;
|
||||||
|
|
||||||
int time = 0;
|
int time = 0;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "OO|i:addObject", &pyob, &pyreference, &time))
|
if (!PyArg_ParseTuple(args, "O|Oi:addObject", &pyob, &pyreference, &time))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if ( !ConvertPythonToGameObject(pyob, &ob, false, "scene.addObject(object, reference, time): KX_Scene (first argument)") ||
|
if (!ConvertPythonToGameObject(pyob, &ob, false, "scene.addObject(object, reference, time): KX_Scene (first argument)") ||
|
||||||
!ConvertPythonToGameObject(pyreference, &reference, false, "scene.addObject(object, reference, time): KX_Scene (second argument)") )
|
!ConvertPythonToGameObject(pyreference, &reference, true, "scene.addObject(object, reference, time): KX_Scene (second argument)"))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!m_inactivelist->SearchValue(ob)) {
|
if (!m_inactivelist->SearchValue(ob)) {
|
||||||
PyErr_Format(PyExc_ValueError, "scene.addObject(object, reference, time): KX_Scene (first argument): object must be in an inactive layer");
|
PyErr_Format(PyExc_ValueError, "scene.addObject(object, reference, time): KX_Scene (first argument): object must be in an inactive layer");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
SCA_IObject* replica = AddReplicaObject((SCA_IObject*)ob, reference, time);
|
SCA_IObject *replica = AddReplicaObject((SCA_IObject*)ob, reference, time);
|
||||||
|
|
||||||
// release here because AddReplicaObject AddRef's
|
// release here because AddReplicaObject AddRef's
|
||||||
// the object is added to the scene so we don't want python to own a reference
|
// the object is added to the scene so we don't want python to own a reference
|
||||||
|
Loading…
Reference in New Issue
Block a user