[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37391] branches/soc-2011-pepper/source/ gameengine: BGE Animations:

Mitchell Stokes mogurijin at gmail.com
Sat Jun 11 02:14:48 CEST 2011


Revision: 37391
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37391
Author:   moguri
Date:     2011-06-11 00:14:47 +0000 (Sat, 11 Jun 2011)
Log Message:
-----------
BGE Animations:
  * Adding BL_Action::Play() and BL_Action::Stop()
  * Making BL_ActonManger reuse BL_Actions instead of recreating them all the time
  * Making the Property play type work for the Action actuator.

Modified Paths:
--------------
    branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp

Modified: branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Converter/BL_ActionActuator.cpp	2011-06-11 00:14:47 UTC (rev 37391)
@@ -150,6 +150,7 @@
 	bool bPositiveEvent = false;
 	KX_GameObject *obj = (KX_GameObject*)GetParent();
 	short play_mode = BL_Action::ACT_MODE_PLAY;
+	float start = m_startframe, end = m_endframe;
 
 	// Don't do anything if we're not "active"
 	if (!frame)
@@ -162,7 +163,14 @@
 		play_mode = BL_Action::ACT_MODE_LOOP;
 	else if (m_playtype == ACT_ACTION_PINGPONG)
 		play_mode = BL_Action::ACT_MODE_PING_PONG;
+	else if (m_playtype == ACT_ACTION_FROM_PROP)
+	{
+		CValue* prop = GetParent()->GetProperty(m_propname);
 
+		play_mode = BL_Action::ACT_MODE_PLAY;
+		start = end = prop->GetNumber();
+		m_is_going = false;
+	}
 
 	// Handle events
 	bNegativeEvent = m_negevent;
@@ -172,7 +180,7 @@
 	if (!m_is_going && bPositiveEvent)
 	{		
 		m_is_going = true;
-		obj->PlayAction(m_action->id.name+2, m_startframe, m_endframe, 0, m_blendin, play_mode);
+		obj->PlayAction(m_action->id.name+2, start, end, 0, m_blendin, play_mode);
 		if (m_end_reset)
 			obj->SetActionFrame(0, m_localtime);
 	}
@@ -202,9 +210,12 @@
 
 		newval->Release();
 	}
-
+	if (m_playtype == ACT_ACTION_FROM_PROP)
+	{
+		return true;
+	}
 	// Handle a finished animation
-	if (m_is_going && obj->IsActionDone(0))
+	else if (m_is_going && obj->IsActionDone(0))
 	{
 		return false;
 	}

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp	2011-06-11 00:14:47 UTC (rev 37391)
@@ -46,44 +46,24 @@
 #include "RNA_define.h"
 }
 
-BL_Action::BL_Action(class KX_GameObject* gameobj,
-					const char* name,
-					float start,
-					float end,
-					float blendin,
-					short play_mode,
-					short blend_mode,
-					float playback_speed)
+BL_Action::BL_Action(class KX_GameObject* gameobj)
 :
 	m_obj(gameobj),
-	m_startframe(start),
-	m_endframe(end),
-	m_blendin(blendin),
-	m_playmode(play_mode),
+	m_startframe(0.f),
+	m_endframe(0.f),
+	m_blendin(0.f),
+	m_playmode(0),
 	m_endtime(0.f),
-	m_localtime(start),
+	m_localtime(0.f),
 	m_blendframe(0.f),
 	m_blendstart(0.f),
-	m_speed(playback_speed),
+	m_speed(0.f),
 	m_pose(NULL),
 	m_blendpose(NULL),
 	m_sg_contr(NULL),
-	m_done(false)
+	m_done(true)
 {
-	m_starttime = KX_GetActiveEngine()->GetFrameTime();
-	m_action = (bAction*)KX_GetActiveScene()->GetLogicManager()->GetActionByName(name);
 
-	if (!m_action) printf("Failed to load action: %s\n", name);
-
-	if (m_obj->GetGameObjectType() != SCA_IObject::OBJ_ARMATURE)
-	{
-		// Create an SG_Controller
-		m_sg_contr = BL_CreateIPO(m_action, m_obj, KX_GetActiveScene()->GetSceneConverter());
-		m_obj->GetSGNode()->AddSGController(m_sg_contr);
-		m_sg_contr->SetObject(m_obj->GetSGNode());
-		InitIPO();
-	}
-
 }
 
 BL_Action::~BL_Action()
@@ -99,6 +79,54 @@
 	}
 }
 
+void BL_Action::Play(const char* name,
+					float start,
+					float end,
+					float blendin,
+					short play_mode,
+					short blend_mode,
+					float playback_speed)
+{
+	bAction* prev_action = m_action;
+
+	// First try to load the action
+	m_action = (bAction*)KX_GetActiveScene()->GetLogicManager()->GetActionByName(name);
+	if (!m_action)
+	{
+		printf("Failed to load action: %s\n", name);
+		m_done = true;
+		return;
+	}
+
+	//if (m_obj->GetGameObjectType() != SCA_IObject::OBJ_ARMATURE)
+	if (prev_action != m_action)
+	{
+		// Create an SG_Controller
+		m_sg_contr = BL_CreateIPO(m_action, m_obj, KX_GetActiveScene()->GetSceneConverter());
+		m_obj->GetSGNode()->AddSGController(m_sg_contr);
+		m_sg_contr->SetObject(m_obj->GetSGNode());
+		InitIPO();
+	}
+
+	// Now that we have an action, we have something we can play
+	m_starttime = KX_GetActiveEngine()->GetFrameTime();
+	m_startframe = m_localtime = start;
+	m_endframe = end;
+	m_blendin = blendin;
+	m_playmode = play_mode;
+	m_endtime = 0.f;
+	m_blendframe = 0.f;
+	m_blendstart = 0.f;
+	m_speed = playback_speed;
+	
+	m_done = false;
+}
+
+void BL_Action::Stop()
+{
+	m_done = true;
+}
+
 void BL_Action::InitIPO()
 {
 		// Initialize the IPO

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h	2011-06-11 00:14:47 UTC (rev 37391)
@@ -64,16 +64,17 @@
 	void InitIPO();
 	void SetLocalTime(float curtime);
 public:
-	BL_Action(class KX_GameObject* gameobj,
-			const char* name,
+	BL_Action(class KX_GameObject* gameobj);
+	~BL_Action();
+
+	void Play(const char* name,
 			float start,
 			float end,
 			float blendin,
 			short play_mode,
 			short blend_mode,
 			float playback_speed);
-	~BL_Action();
-
+	void Stop();
 	bool IsDone() {return m_done;}
 	void Update(float curtime);
 

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp	2011-06-11 00:14:47 UTC (rev 37391)
@@ -29,17 +29,17 @@
 
 #include "BL_ActionManager.h"
 
-BL_ActionManager::BL_ActionManager()
+BL_ActionManager::BL_ActionManager(class KX_GameObject *obj)
 {
 	for (int i=0; i<MAX_ACTION_LAYERS; ++i)
-		m_layers[i] = 0;
+		m_layers[i] = new BL_Action(obj);
 }
 
 BL_ActionManager::~BL_ActionManager()
 {
 	for (int i=0; i<MAX_ACTION_LAYERS; ++i)
 		if (m_layers[i])
-			StopAction(i);
+			delete m_layers[i];
 }
 
 float BL_ActionManager::GetActionFrame(short layer)
@@ -56,8 +56,7 @@
 		m_layers[layer]->SetFrame(frame);
 }
 
-void BL_ActionManager::PlayAction(class KX_GameObject* gameobj,
-								const char* name,
+void BL_ActionManager::PlayAction(const char* name,
 								float start,
 								float end,
 								short layer,
@@ -71,13 +70,12 @@
 		StopAction(layer);
 
 	// Create a new action
-	m_layers[layer] = new BL_Action(gameobj, name, start, end, blendin, play_mode, blend_mode, playback_speed);
+	m_layers[layer]->Play(name, start, end, blendin, play_mode, blend_mode, playback_speed);
 }
 
 void BL_ActionManager::StopAction(short layer)
 {
-	delete m_layers[layer];
-	m_layers[layer] = 0;
+	m_layers[layer]->Stop();
 }
 
 bool BL_ActionManager::IsActionDone(short layer)
@@ -92,12 +90,9 @@
 {
 	for (int i=0; i<MAX_ACTION_LAYERS; ++i)
 	{
-		if (m_layers[i])
+		if (!m_layers[i]->IsDone())
 		{
-			if (m_layers[i]->IsDone())
-				StopAction(i);
-			else
-				m_layers[i]->Update(curtime);
+			m_layers[i]->Update(curtime);
 		}
 	}
 }

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h	2011-06-11 00:14:47 UTC (rev 37391)
@@ -39,11 +39,10 @@
 	BL_Action* m_layers[MAX_ACTION_LAYERS];
 
 public:
-	BL_ActionManager();
+	BL_ActionManager(class KX_GameObject* obj);
 	~BL_ActionManager();
 
-	void PlayAction(class KX_GameObject* gameobj,
-					const char* name,
+	void PlayAction(const char* name,
 					float start,
 					float end,
 					short layer=0,

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp	2011-06-10 22:01:35 UTC (rev 37390)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp	2011-06-11 00:14:47 UTC (rev 37391)
@@ -124,7 +124,7 @@
 		KX_NormalParentRelation::New();
 	m_pSGNode->SetParentRelation(parent_relation);
 
-	m_actionManager = new BL_ActionManager();
+	m_actionManager = new BL_ActionManager(this);
 };
 
 
@@ -361,7 +361,7 @@
 								short blend_mode,
 								float playback_speed)
 {
-	m_actionManager->PlayAction(this, name, start, end, layer, blendin, play_mode, blend_mode, playback_speed);
+	m_actionManager->PlayAction(name, start, end, layer, blendin, play_mode, blend_mode, playback_speed);
 }
 
 void KX_GameObject::StopAction(short layer)
@@ -398,7 +398,7 @@
 	m_pSGNode = NULL;
 	m_pClient_info = new KX_ClientObjectInfo(*m_pClient_info);
 	m_pClient_info->m_gameobject = this;
-	m_actionManager = new BL_ActionManager();
+	m_actionManager = new BL_ActionManager(this);
 	m_state = 0;
 
 #ifdef WITH_PYTHON




More information about the Bf-blender-cvs mailing list