Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitchell Stokes <mogurijin@gmail.com>2011-05-27 12:45:48 +0400
committerMitchell Stokes <mogurijin@gmail.com>2011-05-27 12:45:48 +0400
commitbd5f78d1a0bf4e04800395952e9a26ba868cc31a (patch)
tree16dd3b6df4dbb919b599f8b38b5cdf2f16e467c6 /source/gameengine/Ketsji
parent93e992c5d980ce2186c025dbf6f4900b1ad78557 (diff)
Moving BL_Action and BL_ActionManager to Ketsji to avoid linking issues with gcc
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r--source/gameengine/Ketsji/BL_Action.cpp198
-rw-r--r--source/gameengine/Ketsji/BL_Action.h98
-rw-r--r--source/gameengine/Ketsji/BL_ActionManager.cpp80
-rw-r--r--source/gameengine/Ketsji/BL_ActionManager.h64
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt21
-rw-r--r--source/gameengine/Ketsji/SConscript4
6 files changed, 455 insertions, 10 deletions
diff --git a/source/gameengine/Ketsji/BL_Action.cpp b/source/gameengine/Ketsji/BL_Action.cpp
new file mode 100644
index 00000000000..dcd0c1402e1
--- /dev/null
+++ b/source/gameengine/Ketsji/BL_Action.cpp
@@ -0,0 +1,198 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BL_Action.h"
+#include "BL_ArmatureObject.h"
+#include "KX_GameObject.h"
+
+// These three are for getting the action from the logic manager
+#include "KX_Scene.h"
+#include "KX_PythonInit.h"
+#include "SCA_LogicManager.h"
+
+extern "C" {
+#include "BKE_animsys.h"
+#include "BKE_action.h"
+#include "RNA_access.h"
+#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)
+:
+ m_obj(gameobj),
+ m_startframe(start),
+ m_endframe(end),
+ m_blendin(blendin),
+ m_playmode(play_mode),
+ m_endtime(0.f),
+ m_localtime(start),
+ m_blendframe(0.f),
+ m_blendstart(0.f),
+ m_pose(NULL),
+ m_blendpose(NULL),
+ m_done(false)
+{
+ m_starttime = KX_GetActiveEngine()->GetFrameTime();
+ m_action = (bAction*)KX_GetActiveScene()->GetLogicManager()->GetActionByName(name);
+
+ if (!m_action) printf("Failed to load action: %s\n", name);
+}
+
+BL_Action::~BL_Action()
+{
+ if (m_pose)
+ game_free_pose(m_pose);
+ if (m_blendpose)
+ game_free_pose(m_blendpose);
+}
+
+void BL_Action::SetLocalTime(float curtime)
+{
+ float dt = (curtime-m_starttime)*KX_KetsjiEngine::GetAnimFrameRate();
+
+ if (m_endframe < m_startframe)
+ dt = -dt;
+
+ m_localtime = m_startframe + dt;
+}
+
+void BL_Action::Update(float curtime)
+{
+ curtime -= KX_KetsjiEngine::GetSuspendedDelta();
+
+ SetLocalTime(curtime);
+
+ // Handle wrap around
+ if (m_localtime < m_startframe || m_localtime > m_endframe)
+ {
+ switch(m_playmode)
+ {
+ case ACT_MODE_PLAY:
+ // Clamp
+ m_localtime = m_endframe;
+ m_done = true;
+ break;
+ case ACT_MODE_LOOP:
+ // Put the time back to the beginning
+ m_localtime = m_startframe;
+ m_starttime = curtime;
+ break;
+ case ACT_MODE_PING_PONG:
+ // Swap the start and end frames
+ float temp = m_startframe;
+ m_startframe = m_endframe;
+ m_endframe = temp;
+
+ m_starttime = curtime;
+
+ break;
+ }
+ }
+
+ if (m_obj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
+ {
+ bPose* prev_pose = NULL;
+ BL_ArmatureObject *obj = (BL_ArmatureObject*)m_obj;
+ obj->GetPose(&m_pose);
+
+ // Save the old pose if we need to do some layer blending
+ if (m_blendmode != ACT_BLEND_NONE)
+ obj->GetMRDPose(&prev_pose);
+
+ // Extract the pose from the action
+ {
+ struct PointerRNA id_ptr;
+ Object *arm = obj->GetArmatureObject();
+ bPose *temp = arm->pose;
+
+ arm->pose = m_pose;
+ RNA_id_pointer_create((ID*)arm, &id_ptr);
+ animsys_evaluate_action(&id_ptr, m_action, NULL, m_localtime);
+
+ arm->pose = temp;
+ }
+
+ // Handle blending between layers
+ switch(m_blendmode)
+ {
+ case ACT_BLEND_MIX:
+ game_blend_poses(m_pose, prev_pose, 0.5f);
+ break;
+ case ACT_BLEND_NONE:
+ default:
+ break;
+ }
+
+ // Handle blending between actions
+ if (m_blendin && m_blendframe<m_blendin)
+ {
+ if (!m_blendpose)
+ {
+ obj->GetMRDPose(&m_blendpose);
+ m_blendstart = curtime;
+ }
+
+ // Calculate weight
+ float weight = 1.f - (m_blendframe/m_blendin);
+ game_blend_poses(m_pose, m_blendpose, weight);
+
+ // Bump the blend frame
+ m_blendframe = (curtime - m_blendstart)*KX_KetsjiEngine::GetAnimFrameRate();
+
+ // Clamp
+ if (m_blendframe>m_blendin)
+ m_blendframe = m_blendin;
+ }
+ else
+ {
+ if (m_blendpose)
+ {
+ game_free_pose(m_blendpose);
+ m_blendpose = NULL;
+ }
+ }
+
+ obj->SetPose(m_pose);
+
+ obj->SetActiveAction(NULL, 0, curtime);
+
+ if (prev_pose)
+ game_free_pose(prev_pose);
+ }
+ else
+ {
+ printf("Only armature actions are currently supported\n");
+ }
+}
diff --git a/source/gameengine/Ketsji/BL_Action.h b/source/gameengine/Ketsji/BL_Action.h
new file mode 100644
index 00000000000..3d977f3984a
--- /dev/null
+++ b/source/gameengine/Ketsji/BL_Action.h
@@ -0,0 +1,98 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef __BL_ACTION
+#define __BL_ACTION
+
+#ifdef WITH_CXX_GUARDEDALLOC
+#include "MEM_guardedalloc.h"
+#endif
+
+
+class BL_Action
+{
+private:
+ struct bAction* m_action;
+ struct bPose* m_pose;
+ struct bPose* m_blendpose;
+ struct PointerRNA *m_ptrrna;
+ class KX_GameObject* m_obj;
+
+ float m_startframe;
+ float m_endframe;
+ float m_starttime;
+ float m_endtime;
+ float m_localtime;
+
+ float m_blendin;
+ float m_blendframe;
+ float m_blendstart;
+
+ short m_playmode;
+ short m_blendmode;
+
+ bool m_done;
+
+ void SetLocalTime(float curtime);
+public:
+ BL_Action(class KX_GameObject* gameobj,
+ const char* name,
+ float start,
+ float end,
+ float blendin,
+ short play_mode,
+ short blend_mode);
+ ~BL_Action();
+
+ bool IsDone() {return m_done;}
+ void Update(float curtime);
+
+ enum
+ {
+ ACT_MODE_PLAY = 0,
+ ACT_MODE_LOOP,
+ ACT_MODE_PING_PONG,
+ ACT_MODE_MAX,
+ };
+
+ enum
+ {
+ ACT_BLEND_NONE = 0,
+ ACT_BLEND_MIX,
+ ACT_BLEND_MAX,
+ };
+
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_Action"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+};
+
+#endif //BL_ACTION
+
diff --git a/source/gameengine/Ketsji/BL_ActionManager.cpp b/source/gameengine/Ketsji/BL_ActionManager.cpp
new file mode 100644
index 00000000000..359a7389b51
--- /dev/null
+++ b/source/gameengine/Ketsji/BL_ActionManager.cpp
@@ -0,0 +1,80 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BL_ActionManager.h"
+
+BL_ActionManager::BL_ActionManager()
+{
+ for (int i=0; i<MAX_ACTION_LAYERS; ++i)
+ m_layers[i] = 0;
+}
+
+BL_ActionManager::~BL_ActionManager()
+{
+ for (int i=0; i<MAX_ACTION_LAYERS; ++i)
+ if (m_layers[i])
+ StopAction(i);
+}
+
+void BL_ActionManager::PlayAction(class KX_GameObject* gameobj,
+ const char* name,
+ float start,
+ float end,
+ short layer,
+ float blendin,
+ short play_mode,
+ short blend_mode)
+{
+ // Remove a currently running action on this layer if there is one
+ if (m_layers[layer])
+ StopAction(layer);
+
+ // Create a new action
+ m_layers[layer] = new BL_Action(gameobj, name, start, end, blendin, play_mode, blend_mode);
+}
+
+void BL_ActionManager::StopAction(short layer)
+{
+ delete m_layers[layer];
+ m_layers[layer] = 0;
+}
+
+void BL_ActionManager::Update(float curtime)
+{
+ for (int i=0; i<MAX_ACTION_LAYERS; ++i)
+ {
+ if (m_layers[i])
+ {
+ if (m_layers[i]->IsDone())
+ StopAction(i);
+ else
+ m_layers[i]->Update(curtime);
+ }
+ }
+}
diff --git a/source/gameengine/Ketsji/BL_ActionManager.h b/source/gameengine/Ketsji/BL_ActionManager.h
new file mode 100644
index 00000000000..409d6c24e30
--- /dev/null
+++ b/source/gameengine/Ketsji/BL_ActionManager.h
@@ -0,0 +1,64 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef __BL_ACTIONMANAGER
+#define __BL_ACTIONMANAGER
+
+#include "BL_Action.h"
+
+#define MAX_ACTION_LAYERS 4
+
+class BL_ActionManager
+{
+private:
+ BL_Action* m_layers[MAX_ACTION_LAYERS];
+
+public:
+ BL_ActionManager();
+ ~BL_ActionManager();
+
+ void PlayAction(class KX_GameObject* gameobj,
+ const char* name,
+ float start,
+ float end,
+ short layer=0,
+ float blendin=0.f,
+ short play_mode=0,
+ short blend_mode=0);
+
+ void StopAction(short layer);
+ void Update(float);
+#ifdef WITH_CXX_GUARDEDALLOC
+public:
+ void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:BL_ActionManager"); }
+ void operator delete( void *mem ) { MEM_freeN(mem); }
+#endif
+};
+
+#endif //BL_ACTIONMANAGER
+
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 0bfe1fd0266..1e61359d329 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -29,25 +29,26 @@ set(INC
../../../intern/string
../../../intern/guardedalloc
../../../intern/container
- ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
+ ../../../source/gameengine/Rasterizer/RAS_OpenGLRasterizer
../../../source/gameengine/Converter
../../../source/gameengine/BlenderRoutines
../../../source/blender/imbuf
../../../intern/moto/include
- ../../../source/gameengine/Ketsji
+ ../../../source/gameengine/Ketsji
../../../source/blender/blenlib
../../../source/blender/blenfont
../../../source/blender/blenkernel
../../../source/blender/python
../../../source/blender/python/generic
- ../../../source/blender
- ../../../source/blender/makesdna
- ../../../source/gameengine/Rasterizer
+ ../../../source/blender
+ ../../../source/blender/makesdna
+ ../../../source/blender/makesrna
+ ../../../source/gameengine/Rasterizer
../../../source/gameengine/GameLogic
- ../../../source/gameengine/Expressions
+ ../../../source/gameengine/Expressions
../../../source/gameengine/Ketsji/KXNetwork
../../../source/gameengine/Network
- ../../../source/gameengine/SceneGraph
+ ../../../source/gameengine/SceneGraph
../../../source/gameengine/Physics/common
../../../source/gameengine/Network/LoopBackNetwork
../../../intern/audaspace/intern
@@ -57,6 +58,8 @@ set(INC
)
set(SRC
+ BL_Action.cpp
+ BL_ActionManager.cpp
BL_BlenderShader.cpp
BL_Material.cpp
BL_Shader.cpp
@@ -126,6 +129,8 @@ set(SRC
KX_WorldInfo.cpp
KX_WorldIpoController.cpp
+ BL_Action.h
+ BL_ActionManager.h
KX_ArmatureSensor.h
KX_BlenderMaterial.h
KX_BulletPhysicsController.h
@@ -207,7 +212,7 @@ set(SRC
add_definitions(-DGLEW_STATIC)
if(WITH_SDL)
- set(INC ${INC} ${SDL_INCLUDE_DIR})
+ set(INC ${INC} ${SDL_INCLUDE_DIR})
else()
add_definitions(-DDISABLE_SDL)
endif()
diff --git a/source/gameengine/Ketsji/SConscript b/source/gameengine/Ketsji/SConscript
index 08642262724..da6361952e0 100644
--- a/source/gameengine/Ketsji/SConscript
+++ b/source/gameengine/Ketsji/SConscript
@@ -14,7 +14,7 @@ incs += ' #intern/audaspace/intern #source/gameengine/Converter'
incs += ' #source/gameengine/BlenderRoutines #source/blender/imbuf #intern/moto/include'
incs += ' #source/gameengine/Ketsji #source/gameengine/Ketsji/KXNetwork #source/blender/blenlib #source/blender/blenfont'
incs += ' #source/blender/blenkernel #source/blender #source/blender/editors/include'
-incs += ' #source/blender/makesdna #source/blender/python #source/gameengine/Rasterizer'
+incs += ' #source/blender/makesdna #source/blender/makesrna #source/blender/python #source/gameengine/Rasterizer'
incs += ' #source/gameengine/GameLogic #source/gameengine/Expressions #source/gameengine/Network'
incs += ' #source/gameengine/SceneGraph #source/gameengine/Physics/common'
incs += ' #source/gameengine/Physics/Dummy'
@@ -34,7 +34,7 @@ if env['WITH_BF_PYTHON']:
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
-
+
if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
if env['BF_DEBUG']:
defs.append('_DEBUG') # for Python