Add skinning
This commit is contained in:
@@ -32,10 +32,19 @@ LuaPlus::LuaObject engineCreateEntity(const char* classname)
|
||||
{
|
||||
Entity* entity = static_cast<Entity*>(g_game->Lua_CreateEntity(classname));
|
||||
SDL_assert_always(entity);
|
||||
|
||||
entity->Init();
|
||||
|
||||
return entity->GetLuaObject();
|
||||
}
|
||||
|
||||
LuaPlus::LuaObject engineGetEntityFromID(lua_Integer id)
|
||||
{
|
||||
LuaPlus::LuaObject lookup = GetLuaState().GetGlobal("g_entities");
|
||||
LuaPlus::LuaObject entityTable = lookup.GetByIndex(id);
|
||||
return entityTable;
|
||||
}
|
||||
|
||||
void engineAddEntityToWorld(LuaPlus::LuaObject& object)
|
||||
{
|
||||
LuaPlus::LuaObject cppclass = object["__object"];
|
||||
@@ -45,6 +54,92 @@ void engineAddEntityToWorld(LuaPlus::LuaObject& object)
|
||||
g_world->AddEntity(entity);
|
||||
}
|
||||
|
||||
int cameraGetPos(LuaPlus::LuaState* state)
|
||||
{
|
||||
glm::vec3 v = glm::vec3(0.0f);
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetPosition();
|
||||
|
||||
state->PushNumber(v.x);
|
||||
state->PushNumber(v.y);
|
||||
state->PushNumber(v.z);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
int cameraGetFront(LuaPlus::LuaState* state)
|
||||
{
|
||||
glm::vec3 v = glm::vec3(0.0f);
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetFront();
|
||||
|
||||
state->PushNumber(v.x);
|
||||
state->PushNumber(v.y);
|
||||
state->PushNumber(v.z);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
int cameraGetRight(LuaPlus::LuaState* state)
|
||||
{
|
||||
glm::vec3 v = glm::vec3(0.0f);
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetRight();
|
||||
|
||||
state->PushNumber(v.x);
|
||||
state->PushNumber(v.y);
|
||||
state->PushNumber(v.z);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
int cameraGetUp(LuaPlus::LuaState* state)
|
||||
{
|
||||
glm::vec3 v = glm::vec3(0.0f);
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetUp();
|
||||
|
||||
state->PushNumber(v.x);
|
||||
state->PushNumber(v.y);
|
||||
state->PushNumber(v.z);
|
||||
|
||||
return 3;
|
||||
}
|
||||
|
||||
int cameraGetYaw(LuaPlus::LuaState* state)
|
||||
{
|
||||
float v = 0.0f;
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetYaw();
|
||||
|
||||
state->PushNumber(v);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int cameraGetPitch(LuaPlus::LuaState* state)
|
||||
{
|
||||
float v = 0.0f;
|
||||
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (camera)
|
||||
v = camera->GetPitch();
|
||||
|
||||
state->PushNumber(v);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void registerEngine()
|
||||
{
|
||||
using namespace LuaPlus;
|
||||
@@ -55,10 +150,24 @@ void registerEngine()
|
||||
engineTable.RegisterDirect("warning", &engineWarning);
|
||||
engineTable.RegisterDirect("create_entity", &engineCreateEntity);
|
||||
engineTable.RegisterDirect("add_entity_to_world", &engineAddEntityToWorld);
|
||||
engineTable.RegisterDirect("get_entity_from_id", &engineGetEntityFromID);
|
||||
|
||||
LuaObject consoleTable = GetLuaState().GetGlobals().CreateTable("console");
|
||||
consoleTable.RegisterDirect("print", &consoleMsg);
|
||||
|
||||
LuaObject cameraTable = GetLuaState().GetGlobals().CreateTable("camera");
|
||||
cameraTable.Register("get_position", &cameraGetPos);
|
||||
cameraTable.Register("get_front", &cameraGetFront);
|
||||
cameraTable.Register("get_right", &cameraGetRight);
|
||||
cameraTable.Register("get_up", &cameraGetUp);
|
||||
cameraTable.Register("get_yaw", &cameraGetYaw);
|
||||
cameraTable.Register("get_pitch", &cameraGetPitch);
|
||||
|
||||
// action globals
|
||||
GetLuaState().DoString("ACTION_FIRE = 0");
|
||||
GetLuaState().DoString("ACTION_ALT_FIRE = 1");
|
||||
GetLuaState().DoString("ACTION_RELOAD = 2");
|
||||
|
||||
// animations globals
|
||||
GetLuaState().DoString("ANIM_PLAYBACK_NONE = 0");
|
||||
GetLuaState().DoString("ANIM_PLAYBACK_REPEAT = 1");
|
||||
@@ -231,6 +340,8 @@ void Game::LoadLevelXML(const char* mapname)
|
||||
entity->CreateTestBody();
|
||||
}
|
||||
|
||||
entity->Init();
|
||||
|
||||
//IEntityBase* entity = g_entityManager->CreateEntity(classname.as_string());
|
||||
g_world->AddEntity(entity);
|
||||
}
|
||||
|
||||
@@ -67,6 +67,7 @@ REGISTER_ENTITY(Entity);
|
||||
|
||||
Entity::Entity() :
|
||||
m_model(nullptr),
|
||||
m_skeleton(nullptr),
|
||||
m_shape(nullptr),
|
||||
m_rigidBody(nullptr),
|
||||
m_bodyDirty(false)
|
||||
@@ -99,7 +100,11 @@ Entity::~Entity()
|
||||
|
||||
void Entity::Update(float dt)
|
||||
{
|
||||
UpdateBody();
|
||||
if (m_skeleton)
|
||||
UpdateSkeleton(dt);
|
||||
|
||||
if (m_rigidBody)
|
||||
UpdateBody();
|
||||
|
||||
if ( m_onUpdateFunction.IsFunction())
|
||||
{
|
||||
@@ -112,12 +117,12 @@ void Entity::Render()
|
||||
{
|
||||
if (m_model)
|
||||
{
|
||||
m_model->Draw(GetWorldTransform());
|
||||
m_model->Draw(GetWorldTransform(), m_skeleton);
|
||||
|
||||
BoundingBox bbox = m_model->GetBoundingBox();
|
||||
/*BoundingBox bbox = m_boundingBox;
|
||||
bbox.TransformAABB(GetWorldTransform());
|
||||
|
||||
g_debugRender->DrawBoundingBox(bbox, glm::vec3(1.0f, 0.0f, 0.0f));
|
||||
g_debugRender->DrawBoundingBox(bbox, glm::vec3(1.0f, 0.0f, 0.0f));*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +153,17 @@ void Entity::SetName(const std::string& name)
|
||||
|
||||
void Entity::LoadModel(const char* filename)
|
||||
{
|
||||
if (m_skeleton) {
|
||||
delete m_skeleton;
|
||||
m_skeleton = nullptr;
|
||||
}
|
||||
|
||||
m_model = g_modelSystem->LoadModel(filename);
|
||||
if (m_model)
|
||||
m_boundingBox = m_model->GetBoundingBox();
|
||||
|
||||
if (m_model && m_model->GetNumAnimations())
|
||||
m_skeleton = m_model->CreateSkeletonInstance();
|
||||
}
|
||||
|
||||
void Entity::SetVisible(bool visible)
|
||||
@@ -160,6 +175,33 @@ bool Entity::GetVisible()
|
||||
return true;
|
||||
}
|
||||
|
||||
void Entity::UpdateSkeleton(float dt)
|
||||
{
|
||||
if (m_model && m_skeleton)
|
||||
{
|
||||
m_model->UpdateSkeletonInstance(m_skeleton, dt);
|
||||
|
||||
m_boundingBox = m_model->GetBoundingBox();
|
||||
|
||||
for (int i = 0; i < m_skeleton->m_jointMatrices.size(); i++)
|
||||
{
|
||||
m_boundingBox.m_min = glm::min(m_boundingBox.m_min, glm::vec3(m_skeleton->m_jointMatrices[i][3]));
|
||||
m_boundingBox.m_max = glm::max(m_boundingBox.m_max, glm::vec3(m_skeleton->m_jointMatrices[i][3]));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Entity::Init()
|
||||
{
|
||||
// call init
|
||||
if (m_onInitFunction.IsFunction())
|
||||
{
|
||||
LuaPlus::LuaFunctionVoid onInitFunction = m_onInitFunction;
|
||||
onInitFunction(m_luaObject);
|
||||
}
|
||||
}
|
||||
|
||||
void Entity::InitFromTable(LuaPlus::LuaObject& _object)
|
||||
{
|
||||
SDL_assert_always(!_object.IsNil() && "Invalid object passed");
|
||||
@@ -184,21 +226,31 @@ void Entity::InitFromTable(LuaPlus::LuaObject& _object)
|
||||
|
||||
// assign C++ object
|
||||
m_luaObject.SetLightUserdata("__object", this);
|
||||
|
||||
// call init
|
||||
if (m_onInitFunction.IsFunction())
|
||||
{
|
||||
LuaPlus::LuaFunctionVoid onInitFunction = m_onInitFunction;
|
||||
onInitFunction(m_luaObject);
|
||||
}
|
||||
}
|
||||
|
||||
void Entity::RegisterBaseFunctions()
|
||||
{
|
||||
m_luaObject.Register("load_model", *this, &Entity::Lua_LoadModel);
|
||||
m_luaObject.Register("update_transform", *this, &Entity::Lua_UpdateTransform);
|
||||
m_luaObject.Register("translate", *this, &Entity::Lua_Translate);
|
||||
m_luaObject.Register("set_position", *this, &Entity::Lua_SetPosition);
|
||||
m_luaObject.Register("get_position", *this, &Entity::Lua_GetPosition);
|
||||
m_luaObject.Register("set_rotation", *this, &Entity::Lua_SetRotation);
|
||||
m_luaObject.Register("get_classname", *this, &Entity::Lua_GetClassname);
|
||||
m_luaObject.Register("get_id", *this, &Entity::Lua_GetID);
|
||||
|
||||
// animation
|
||||
m_luaObject.Register("find_animation", *this, &Entity::Lua_FindAnimation);
|
||||
m_luaObject.Register("play_animation", *this, &Entity::Lua_PlayAnimation);
|
||||
m_luaObject.Register("get_current_animation", *this, &Entity::Lua_GetCurrentAnimation);
|
||||
m_luaObject.Register("get_current_animation_time", *this, &Entity::Lua_GetCurrentAnimationTime);
|
||||
m_luaObject.Register("get_animation_time", *this, &Entity::Lua_GetAnimationTime);
|
||||
|
||||
//int Lua_FindAnimation(LuaPlus::LuaState * state);
|
||||
//int Lua_PlayAnimation(LuaPlus::LuaState * state);
|
||||
//int Lua_GetCurrentAnimation(LuaPlus::LuaState * state);
|
||||
//int Lua_GetCurrentAnimationTime(LuaPlus::LuaState * state);
|
||||
//int Lua_GetAnimationTime(LuaPlus::LuaState * state);
|
||||
|
||||
// m_luaObject.RegisterDirect("load_model", &Entity_LoadModel);
|
||||
//m_luaObject.RegisterDirect("set_visible", &Entity_SetVisible);
|
||||
@@ -223,6 +275,13 @@ void Entity::Help_SetPosition(float x, float y, float z)
|
||||
m_position.z = z;
|
||||
}
|
||||
|
||||
void Entity::Help_SetRotation(float x, float y, float z)
|
||||
{
|
||||
m_rotation.x = x;
|
||||
m_rotation.y = y;
|
||||
m_rotation.z = z;
|
||||
}
|
||||
|
||||
int Entity::Lua_LoadModel(LuaPlus::LuaState* state)
|
||||
{
|
||||
LuaPlus::LuaStack stack(state);
|
||||
@@ -265,12 +324,104 @@ int Entity::Lua_SetPosition(LuaPlus::LuaState* state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetPosition(LuaPlus::LuaState* state)
|
||||
{
|
||||
state->PushNumber(m_position.x);
|
||||
state->PushNumber(m_position.y);
|
||||
state->PushNumber(m_position.z);
|
||||
return 3;
|
||||
}
|
||||
|
||||
int Entity::Lua_SetRotation(LuaPlus::LuaState* state)
|
||||
{
|
||||
LuaPlus::LuaStack stack(state);
|
||||
|
||||
float x = stack[2].GetNumber();
|
||||
float y = stack[3].GetNumber();
|
||||
float z = stack[4].GetNumber();
|
||||
|
||||
Help_SetRotation(x, y, z);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetClassname(LuaPlus::LuaState* state)
|
||||
{
|
||||
state->PushString(GetClassname());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetID(LuaPlus::LuaState* state)
|
||||
{
|
||||
state->PushInteger(GetID());
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Entity::Lua_UpdateTransform(LuaPlus::LuaState* state)
|
||||
{
|
||||
UpdateTransform();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Entity::Lua_FindAnimation(LuaPlus::LuaState* state)
|
||||
{
|
||||
LuaPlus::LuaStack stack(state);
|
||||
const char* name = stack[2].GetString();
|
||||
|
||||
if (m_model)
|
||||
state->PushInteger(m_model->FindAnimation(name));
|
||||
else
|
||||
state->PushInteger(INVALID_ANIMATION_HANDLE);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Entity::Lua_PlayAnimation(LuaPlus::LuaState* state)
|
||||
{
|
||||
LuaPlus::LuaStack stack(state);
|
||||
AnimationId_t id = stack[2].GetInteger();
|
||||
int mode = stack[3].GetInteger();
|
||||
|
||||
if (m_skeleton)
|
||||
m_skeleton->PlayAnimation(id, mode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetCurrentAnimation(LuaPlus::LuaState* state)
|
||||
{
|
||||
if (m_skeleton)
|
||||
state->PushInteger(m_skeleton->GetCurrentAnimation());
|
||||
else
|
||||
state->PushInteger(INVALID_ANIMATION_HANDLE);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetCurrentAnimationTime(LuaPlus::LuaState* state)
|
||||
{
|
||||
if (m_skeleton)
|
||||
state->PushNumber(m_skeleton->GetCurrentTime());
|
||||
else
|
||||
state->PushNumber(0.0f);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Entity::Lua_GetAnimationTime(LuaPlus::LuaState* state)
|
||||
{
|
||||
LuaPlus::LuaStack stack(state);
|
||||
AnimationId_t id = stack[2].GetInteger();
|
||||
|
||||
if (m_skeleton)
|
||||
state->PushNumber(m_skeleton->GetAnimationTime(id));
|
||||
else
|
||||
state->PushNumber(0.0f);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const LuaPlus::LuaObject& Entity::GetLuaObject()
|
||||
{
|
||||
return m_luaObject;
|
||||
@@ -503,7 +654,7 @@ void ActorBase::CreatePlayerBody()
|
||||
|
||||
m_rigidBody->setFriction(0.0f);
|
||||
m_rigidBody->setAnisotropicFriction(btVector3(0.0f, 0.0f, 0.0f));
|
||||
m_rigidBody->setDamping(0.1f, 0.0f);
|
||||
m_rigidBody->setDamping(0.0f, 0.0f);
|
||||
|
||||
m_rigidBody->setActivationState(DISABLE_DEACTIVATION);
|
||||
|
||||
@@ -541,6 +692,7 @@ void ActorBase::RegisterFunctions()
|
||||
m_luaObject.Register("update_camera_movement", *this, &ActorBase::Lua_UpdateCameraMovement);
|
||||
m_luaObject.Register("create_body", *this, &ActorBase::Lua_CreateBody);
|
||||
m_luaObject.Register("update_body_movement", *this, &ActorBase::Lua_UpdateBodyMovement);
|
||||
m_luaObject.Register("get_action", *this, &ActorBase::Lua_GetAction);
|
||||
|
||||
//m_luaObject.RegisterDirect("activate_camera", &ActorBase_ActivateCamera);
|
||||
//m_luaObject.RegisterDirect("update_camera_look", &ActorBase_UpdateCameraLook);
|
||||
@@ -583,6 +735,40 @@ int ActorBase::Lua_CreateBody(LuaPlus::LuaState* state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ActorBase::Lua_GetAction(LuaPlus::LuaState* state)
|
||||
{
|
||||
// uint32_t action = 0;
|
||||
|
||||
//float x, y;
|
||||
//SDL_MouseButtonFlags buttons = SDL_GetMouseState(&x, &y);
|
||||
|
||||
//if (buttons & SDL_BUTTON_MASK(SDL_BUTTON_LEFT))
|
||||
// state->PushInteger(0);
|
||||
//if (buttons & SDL_BUTTON_MASK(SDL_BUTTON_RIGHT))
|
||||
// state->PushInteger(1);
|
||||
//else
|
||||
// state->PushInteger(-1);
|
||||
|
||||
int action = GenAction();
|
||||
state->PushInteger(action);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ActorBase::GenAction()
|
||||
{
|
||||
int action = -1;
|
||||
|
||||
if (g_inputManager.GetMouse().IsKeyDown(EMouseButton_Left))
|
||||
action = 0;
|
||||
else if (g_inputManager.GetMouse().IsKeyDown(EMouseButton_Right))
|
||||
action = 1;
|
||||
else if (g_inputManager.GetKeyboard().IsKeyDown(SDLK_R))
|
||||
action = 2;
|
||||
|
||||
return action;
|
||||
}
|
||||
|
||||
uint32_t ActorBase::GenMovementDir()
|
||||
{
|
||||
uint32_t movementDir = EMovementDir_None;
|
||||
|
||||
@@ -77,6 +77,10 @@ public:
|
||||
void SetVisible(bool visible);
|
||||
bool GetVisible();
|
||||
|
||||
void UpdateSkeleton(float dt);
|
||||
|
||||
void Init();
|
||||
|
||||
// Game entity physics
|
||||
void CreateTestBody();
|
||||
void UpdateBody();
|
||||
@@ -91,11 +95,22 @@ public:
|
||||
// Game entity lua wrappers
|
||||
void Help_Translate(float x, float y, float z);
|
||||
void Help_SetPosition(float x, float y, float z);
|
||||
void Help_SetRotation(float x, float y, float z);
|
||||
|
||||
int Lua_LoadModel(LuaPlus::LuaState* state);
|
||||
int Lua_Translate(LuaPlus::LuaState* state);
|
||||
int Lua_SetPosition(LuaPlus::LuaState* state);
|
||||
int Lua_GetPosition(LuaPlus::LuaState* state);
|
||||
int Lua_SetRotation(LuaPlus::LuaState* state);
|
||||
int Lua_GetClassname(LuaPlus::LuaState* state);
|
||||
int Lua_GetID(LuaPlus::LuaState* state);
|
||||
int Lua_UpdateTransform(LuaPlus::LuaState* state);
|
||||
|
||||
int Lua_FindAnimation(LuaPlus::LuaState* state);
|
||||
int Lua_PlayAnimation(LuaPlus::LuaState* state);
|
||||
int Lua_GetCurrentAnimation(LuaPlus::LuaState* state);
|
||||
int Lua_GetCurrentAnimationTime(LuaPlus::LuaState* state);
|
||||
int Lua_GetAnimationTime(LuaPlus::LuaState* state);
|
||||
|
||||
const LuaPlus::LuaObject& GetLuaObject();
|
||||
|
||||
@@ -103,6 +118,7 @@ protected:
|
||||
std::string m_name;
|
||||
|
||||
Model* m_model;
|
||||
SkeletonInstance* m_skeleton;
|
||||
|
||||
LuaPlus::LuaObject m_luaObject;
|
||||
LuaPlus::LuaObject m_onInitFunction;
|
||||
@@ -149,8 +165,10 @@ public:
|
||||
int Lua_UpdateCameraLook(LuaPlus::LuaState* state);
|
||||
int Lua_ActivateCamera(LuaPlus::LuaState* state);
|
||||
int Lua_CreateBody(LuaPlus::LuaState* state);
|
||||
int Lua_GetAction(LuaPlus::LuaState* state);
|
||||
|
||||
private:
|
||||
int GenAction();
|
||||
uint32_t GenMovementDir();
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user