diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2011-05-27 12:45:48 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2011-05-27 12:45:48 +0400 |
commit | bd5f78d1a0bf4e04800395952e9a26ba868cc31a (patch) | |
tree | 16dd3b6df4dbb919b599f8b38b5cdf2f16e467c6 /source/gameengine/Ketsji | |
parent | 93e992c5d980ce2186c025dbf6f4900b1ad78557 (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.cpp | 198 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_Action.h | 98 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_ActionManager.cpp | 80 | ||||
-rw-r--r-- | source/gameengine/Ketsji/BL_ActionManager.h | 64 | ||||
-rw-r--r-- | source/gameengine/Ketsji/CMakeLists.txt | 21 | ||||
-rw-r--r-- | source/gameengine/Ketsji/SConscript | 4 |
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 |