[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38166] branches/soc-2011-cucumber/source/ gameengine/Ketsji: Adding a worldScale attribute to KX_GameObject.

Daniel Stokes kupomail at gmail.com
Wed Jul 6 21:31:05 CEST 2011


Revision: 38166
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38166
Author:   kupoman
Date:     2011-07-06 19:31:05 +0000 (Wed, 06 Jul 2011)
Log Message:
-----------
Adding a worldScale attribute to KX_GameObject. This attribute scales the object independently of its parent's scale.

Modified Paths:
--------------
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.h

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp	2011-07-06 19:00:40 UTC (rev 38165)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.cpp	2011-07-06 19:31:05 UTC (rev 38166)
@@ -1064,6 +1064,36 @@
 	}
 }
 
+void KX_GameObject::NodeSetWorldScale(const MT_Vector3& scale)
+{
+	if (!GetSGNode())
+		return;
+	SG_Node* parent = GetSGNode()->GetSGParent();
+	if (parent != NULL)
+	{
+		// Make sure the objects have some scale
+		MT_Vector3 p_scale = parent->GetWorldScaling();
+		if (fabs(p_scale[0]) < FLT_EPSILON || 
+			fabs(p_scale[1]) < FLT_EPSILON || 
+			fabs(p_scale[2]) < FLT_EPSILON)
+		{ 
+			return; 
+		}
+
+		MT_Vector3 *local = new MT_Vector3(scale);
+
+		p_scale[0] = 1/p_scale[0];
+		p_scale[1] = 1/p_scale[1];
+		p_scale[2] = 1/p_scale[2];
+
+		NodeSetLocalScale(scale * p_scale);
+	}
+	else
+	{
+		NodeSetLocalScale(scale);
+	}
+}
+
 void KX_GameObject::NodeSetWorldPosition(const MT_Point3& trans)
 {
 	if (!GetSGNode())
@@ -1525,7 +1555,7 @@
 	KX_PYATTRIBUTE_RW_FUNCTION("localPosition",	KX_GameObject, pyattr_get_localPosition,	pyattr_set_localPosition),
 	KX_PYATTRIBUTE_RW_FUNCTION("worldPosition",	KX_GameObject, pyattr_get_worldPosition,    pyattr_set_worldPosition),
 	KX_PYATTRIBUTE_RW_FUNCTION("localScale",	KX_GameObject, pyattr_get_localScaling,	pyattr_set_localScaling),
-	KX_PYATTRIBUTE_RO_FUNCTION("worldScale",	KX_GameObject, pyattr_get_worldScaling),
+	KX_PYATTRIBUTE_RW_FUNCTION("worldScale",	KX_GameObject, pyattr_get_worldScaling, pyattr_set_worldScaling),
 	KX_PYATTRIBUTE_RW_FUNCTION("linearVelocity", KX_GameObject, pyattr_get_localLinearVelocity, pyattr_set_worldLinearVelocity),
 	KX_PYATTRIBUTE_RW_FUNCTION("localLinearVelocity", KX_GameObject, pyattr_get_localLinearVelocity, pyattr_set_localLinearVelocity),
 	KX_PYATTRIBUTE_RW_FUNCTION("worldLinearVelocity", KX_GameObject, pyattr_get_worldLinearVelocity, pyattr_set_worldLinearVelocity),
@@ -2017,6 +2047,18 @@
 #endif
 }
 
+int KX_GameObject::pyattr_set_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_GameObject* self= static_cast<KX_GameObject*>(self_v);
+	MT_Vector3 scale;
+	if (!PyVecTo(value, scale))
+		return PY_SET_ATTR_FAIL;
+
+	self->NodeSetWorldScale(scale);
+	self->NodeUpdateGS(0.f);
+	return PY_SET_ATTR_SUCCESS;
+}
+
 PyObject* KX_GameObject::pyattr_get_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
 {
 #ifdef USE_MATHUTILS

Modified: branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.h	2011-07-06 19:00:40 UTC (rev 38165)
+++ branches/soc-2011-cucumber/source/gameengine/Ketsji/KX_GameObject.h	2011-07-06 19:31:05 UTC (rev 38166)
@@ -404,6 +404,7 @@
 	void	NodeSetGlobalOrientation(const MT_Matrix3x3& rot	);
 
 	void	NodeSetLocalScale(	const MT_Vector3& scale	);
+	void	NodeSetWorldScale(	const MT_Vector3& scale );
 
 	void	NodeSetRelativeScale(	const MT_Vector3& scale	);
 
@@ -881,6 +882,7 @@
 	static PyObject*	pyattr_get_localOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 	static int			pyattr_set_localOrientation(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
 	static PyObject*	pyattr_get_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
+	static int			pyattr_set_worldScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
 	static PyObject*	pyattr_get_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
 	static int			pyattr_set_localScaling(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value);
 	static PyObject*	pyattr_get_worldLinearVelocity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);




More information about the Bf-blender-cvs mailing list