[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16385] trunk/blender/source: BGE set visible actuator, option to set visibility recursively to make managing visibility for collections of objects a lot easier .

Campbell Barton ideasman42 at gmail.com
Fri Sep 5 18:22:14 CEST 2008


Revision: 16385
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16385
Author:   campbellbarton
Date:     2008-09-05 18:22:14 +0200 (Fri, 05 Sep 2008)

Log Message:
-----------
BGE set visible actuator, option to set visibility recursively to make managing visibility for collections of objects a lot easier.
BGE Python api's ob.setVisible() also takes an optional recursive arg thats off by default

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_actuator_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h

Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2008-09-05 16:22:14 UTC (rev 16385)
@@ -193,7 +193,8 @@
 } bGameActuator;
 
 typedef struct bVisibilityActuator {
-	/** bit 0: Is this object visible? */
+	/** bit 0: Is this object visible? 
+	 ** bit 1: Apply recursively  */
 	int flag;
 } bVisibilityActuator;
 
@@ -448,6 +449,7 @@
 /* visibilityact->flag */
 /* Set means the object will become invisible */
 #define ACT_VISIBILITY_INVISIBLE       (1 << 0)
+#define ACT_VISIBILITY_RECURSIVE       (1 << 1)
 
 /* twodfilter->type */
 #define ACT_2DFILTER_ENABLED			-2

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/blender/src/buttons_logic.c	2008-09-05 16:22:14 UTC (rev 16385)
@@ -2350,7 +2350,7 @@
 		
 		visAct = act->data;
 
-		str= "Visibility %t|Visible %x0|Invisible %x1";
+		str= "Visibility %t|Visible %x0|Invisible %x1|Visible Recursive %x2|Invisible Recursive %x3";
 
 		uiDefButI(block, MENU, B_REDR, str,
 			  xco + 10, yco - 24, width - 20, 19, &visAct->flag,

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-09-05 16:22:14 UTC (rev 16385)
@@ -962,10 +962,9 @@
 			bVisibilityActuator *vis_act = (bVisibilityActuator *) bact->data;
 			KX_VisibilityActuator * tmp_vis_act = NULL;
 			bool v = ((vis_act->flag & ACT_VISIBILITY_INVISIBLE) != 0);
+			bool recursive = ((vis_act->flag & ACT_VISIBILITY_RECURSIVE) != 0);
 
-			tmp_vis_act = 
-				new KX_VisibilityActuator(gameobj,
-							  !v);
+			tmp_vis_act = new KX_VisibilityActuator(gameobj, !v, recursive);
 			
 			baseact = tmp_vis_act;
 		}

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2008-09-05 16:22:14 UTC (rev 16385)
@@ -364,15 +364,36 @@
 	for (size_t i=0;i<m_meshes.size();i++)
 		m_meshes[i]->AddMeshUser(this);
 	
-	UpdateBuckets();
+	UpdateBuckets(false);
 }
 
-void KX_GameObject::UpdateBuckets()
+static void UpdateBuckets_recursive(SG_Node* node)
 {
+	NodeList& children = node->GetSGChildren();
+
+	for (NodeList::iterator childit = children.begin();!(childit==children.end());++childit)
+	{
+		SG_Node* childnode = (*childit);
+		KX_GameObject *clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject());
+		if (clientgameobj != NULL) // This is a GameObject
+			clientgameobj->UpdateBuckets(0);
+		
+		// if the childobj is NULL then this may be an inverse parent link
+		// so a non recursive search should still look down this node.
+		UpdateBuckets_recursive(childnode);
+	}
+}
+
+void KX_GameObject::UpdateBuckets( bool recursive )
+{
 	double* fl = GetOpenGLMatrix();
 
 	for (size_t i=0;i<m_meshes.size();i++)
 		m_meshes[i]->UpdateBuckets(this, fl, m_bUseObjectColor, m_objectColor, m_bVisible, m_bCulled);
+	
+	if (recursive) {
+		UpdateBuckets_recursive(m_pSGNode);
+	}
 }
 
 void KX_GameObject::RemoveMeshes()
@@ -502,12 +523,33 @@
 	return m_bVisible;
 }
 
+static void setVisible_recursive(SG_Node* node, bool v)
+{
+	NodeList& children = node->GetSGChildren();
+
+	for (NodeList::iterator childit = children.begin();!(childit==children.end());++childit)
+	{
+		SG_Node* childnode = (*childit);
+		KX_GameObject *clientgameobj = static_cast<KX_GameObject*>( (*childit)->GetSGClientObject());
+		if (clientgameobj != NULL) // This is a GameObject
+			clientgameobj->SetVisible(v, 0);
+		
+		// if the childobj is NULL then this may be an inverse parent link
+		// so a non recursive search should still look down this node.
+		setVisible_recursive(childnode, v);
+	}
+}
+
+
 void
 KX_GameObject::SetVisible(
-	bool v
+	bool v,
+	bool recursive
 	)
 {
 	m_bVisible = v;
+	if (recursive)
+		setVisible_recursive(m_pSGNode, v);
 }
 
 bool
@@ -880,7 +922,7 @@
 	{"getOrientation", (PyCFunction) KX_GameObject::sPyGetOrientation, METH_NOARGS},
 	{"setOrientation", (PyCFunction) KX_GameObject::sPySetOrientation, METH_O},
 	{"getVisible",(PyCFunction) KX_GameObject::sPyGetVisible, METH_NOARGS},
-	{"setVisible",(PyCFunction) KX_GameObject::sPySetVisible, METH_O},
+	{"setVisible",(PyCFunction) KX_GameObject::sPySetVisible, METH_VARARGS},
 	{"getState",(PyCFunction) KX_GameObject::sPyGetState, METH_NOARGS},
 	{"setState",(PyCFunction) KX_GameObject::sPySetState, METH_O},
 	{"alignAxisToVect",(PyCFunction) KX_GameObject::sPyAlignAxisToVect, METH_VARARGS},
@@ -1036,8 +1078,8 @@
 		int val = PyInt_AsLong(value);
 		if (attr == "visible")
 		{
-			SetVisible(val != 0);
-			UpdateBuckets();
+			SetVisible(val != 0, false);
+			UpdateBuckets(false);
 			return 0;
 		}
 	}
@@ -1198,17 +1240,14 @@
 	return NULL;
 }
 
-PyObject* KX_GameObject::PySetVisible(PyObject* self, PyObject* value)
+PyObject* KX_GameObject::PySetVisible(PyObject* self, PyObject* args)
 {
-	int visible = PyInt_AsLong(value);
-	
-	if (visible==-1 && PyErr_Occurred()) {
-		PyErr_SetString(PyExc_TypeError, "expected 0 or 1");
+	int visible, recursive = 0;
+	if (!PyArg_ParseTuple(args,"i|i",&visible, &recursive))
 		return NULL;
-	}
 	
-	SetVisible(visible != 0);
-	UpdateBuckets();
+	SetVisible(visible ? true:false, recursive ? true:false);
+	UpdateBuckets(recursive ? true:false);
 	Py_RETURN_NONE;
 	
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2008-09-05 16:22:14 UTC (rev 16385)
@@ -566,6 +566,7 @@
 	 */
 		void						
 	UpdateBuckets(
+		bool recursive
 	);
 
 	/**
@@ -640,7 +641,8 @@
 	 */
 		void
 	SetVisible(
-		bool b
+		bool b,
+		bool recursive
 	);
 
 	/**
@@ -762,7 +764,7 @@
 	KX_PYMETHOD_NOARGS(KX_GameObject,GetOrientation);
 	KX_PYMETHOD_O(KX_GameObject,SetOrientation);
 	KX_PYMETHOD_NOARGS(KX_GameObject,GetVisible);
-	KX_PYMETHOD_O(KX_GameObject,SetVisible);
+	KX_PYMETHOD_VARARGS(KX_GameObject,SetVisible);
 	KX_PYMETHOD_NOARGS(KX_GameObject,GetState);
 	KX_PYMETHOD_O(KX_GameObject,SetState);
 	KX_PYMETHOD_VARARGS(KX_GameObject,AlignAxisToVect);

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2008-09-05 16:22:14 UTC (rev 16385)
@@ -1235,7 +1235,7 @@
 			}
 
 			gameobj->SetCulled(!visible);
-			gameobj->UpdateBuckets();
+			gameobj->UpdateBuckets(false);
 		}
 	}
 	if (node->Left())
@@ -1253,7 +1253,7 @@
 	// Shadow lamp layers
 	if(layer && !(gameobj->GetLayer() & layer)) {
 		gameobj->SetCulled(true);
-		gameobj->UpdateBuckets();
+		gameobj->UpdateBuckets(false);
 		return;
 	}
 
@@ -1300,10 +1300,10 @@
 		// Visibility/ non-visibility are marked
 		// elsewhere now.
 		gameobj->SetCulled(false);
-		gameobj->UpdateBuckets();
+		gameobj->UpdateBuckets(false);
 	} else {
 		gameobj->SetCulled(true);
-		gameobj->UpdateBuckets();
+		gameobj->UpdateBuckets(false);
 	}
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.cpp	2008-09-05 16:22:14 UTC (rev 16385)
@@ -38,10 +38,12 @@
 KX_VisibilityActuator::KX_VisibilityActuator(
 	SCA_IObject* gameobj,
 	bool visible,
+	bool recursive,
 	PyTypeObject* T
 	) 
 	: SCA_IActuator(gameobj,T),
-	  m_visible(visible)
+	  m_visible(visible),
+	  m_recursive(recursive)
 {
 	// intentionally empty
 }
@@ -75,8 +77,8 @@
 
 	KX_GameObject *obj = (KX_GameObject*) GetParent();
 	
-	obj->SetVisible(m_visible);
-	obj->UpdateBuckets();
+	obj->SetVisible(m_visible, m_recursive);
+	obj->UpdateBuckets(m_recursive);
 
 	return true;
 }

Modified: trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h	2008-09-05 15:08:01 UTC (rev 16384)
+++ trunk/blender/source/gameengine/Ketsji/KX_VisibilityActuator.h	2008-09-05 16:22:14 UTC (rev 16385)
@@ -39,12 +39,14 @@
 
 	/** Make visible? */
 	bool m_visible;
+	bool m_recursive;
 
  public:
 	
 	KX_VisibilityActuator(
 		SCA_IObject* gameobj,
 		bool visible,
+		bool recursive,
 		PyTypeObject* T=&Type
 		);
 





More information about the Bf-blender-cvs mailing list