Add skinning

This commit is contained in:
2026-03-05 14:19:46 +03:00
parent d57ac17b69
commit 65cf326f25
21 changed files with 1305 additions and 117 deletions

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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: