This commit is contained in:
2026-03-08 16:50:54 +03:00
parent 406f685de2
commit f2277227cc
12 changed files with 176 additions and 13 deletions

View File

@@ -184,6 +184,45 @@ void ActorBase::CreatePlayerBody(float radius, float height, float mass, float f
}
void ActorBase::CreatePlayerBodyBox(float x, float y, float z, float mass, float friction, float damping)
{
m_shape = new btBoxShape(btVector3(x, y, z));
m_mass = mass;
btVector3 local_inertia(0.0f, 0.0f, 0.0f);
if (m_mass > 0.f) {
m_shape->calculateLocalInertia(m_mass, local_inertia);
}
btRigidBody::btRigidBodyConstructionInfo rigid_body_ci(m_mass, nullptr, m_shape, local_inertia);
m_rigidBody = new btRigidBody(rigid_body_ci);
m_rigidBody->setUserPointer(this);
m_rigidBody->setMotionState(&m_ph_motion_state);
m_ph_motion_state.setBody(m_rigidBody);
// I'm sure that position is valid
btTransform xform;
xform.setIdentity();
xform.setOrigin(glmVectorToBt(m_position));
m_rigidBody->setWorldTransform(xform);
// ACTOR STUFF
m_rigidBody->setAngularFactor(btVector3(0.0f, 0.0f, 0.0f));
m_rigidBody->setFriction(friction);
m_rigidBody->setAnisotropicFriction(btVector3(0.0f, 0.0f, 0.0f));
m_rigidBody->setDamping(damping, 0.0f);
m_rigidBody->setActivationState(DISABLE_DEACTIVATION);
// #TODO: body filter and mask
g_PhysicsWorld->GetWorld()->addRigidBody(m_rigidBody);
m_bodyDirty = true;
}
void ActorBase::CreatePlayerBody_Old()
{
@@ -288,6 +327,7 @@ void ActorBase::RegisterFunctions()
m_luaObject.Register("update_camera_movement", *this, &ActorBase::Lua_UpdateCameraMovement);
m_luaObject.Register("create_player_body", *this, &ActorBase::Lua_CreatePlayerBody);
m_luaObject.Register("create_player_body_old", *this, &ActorBase::Lua_CreatePlayerBodyOld);
m_luaObject.Register("create_player_body_box", *this, &ActorBase::Lua_CreatePlayerBodyBox);
m_luaObject.Register("update_body_movement", *this, &ActorBase::Lua_UpdateBodyMovement);
m_luaObject.Register("get_action", *this, &ActorBase::Lua_GetAction);
m_luaObject.Register("get_movement", *this, &ActorBase::Lua_GetMovement);
@@ -350,6 +390,21 @@ int ActorBase::Lua_CreatePlayerBodyOld(LuaPlus::LuaState* state)
return 0;
}
int ActorBase::Lua_CreatePlayerBodyBox(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
float x = (float)stack[2].GetNumber();
float y = (float)stack[3].GetNumber();
float z = (float)stack[4].GetNumber();
float mass = (float)stack[5].GetNumber();
float friction = (float)stack[6].GetNumber();
float damping = (float)stack[7].GetNumber();
CreatePlayerBodyBox(x, y, z, mass, friction, damping);
return 0;
}
int ActorBase::Lua_GetAction(LuaPlus::LuaState* state)
{
int action = GenAction();

View File

@@ -33,6 +33,7 @@ public:
void ActivateCamera();
void CreatePlayerBody(float radius, float height, float mass, float friction, float damping);
void CreatePlayerBodyBox(float x, float y, float z, float mass, float friction, float damping);
void CreatePlayerBody_Old();
bool OnGround();
@@ -49,6 +50,7 @@ public:
int Lua_ActivateCamera(LuaPlus::LuaState* state);
int Lua_CreatePlayerBody(LuaPlus::LuaState* state);
int Lua_CreatePlayerBodyOld(LuaPlus::LuaState* state);
int Lua_CreatePlayerBodyBox(LuaPlus::LuaState* state);
int Lua_GetAction(LuaPlus::LuaState* state);
int Lua_GetMovement(LuaPlus::LuaState* state);
int Lua_OnGround(LuaPlus::LuaState* state);

View File

@@ -15,6 +15,7 @@
#include "scenemanager.h"
#include "game_world_objects.h"
#include "actor_base.h"
#include "physics/physicsworld.h"
#include <pugixml.hpp>
@@ -236,6 +237,15 @@ void registerEngine()
REGISTER_CONSTANT(EMovementDir_Right);
REGISTER_CONSTANT(EMovementDir_Jump);
// Physics
REGISTER_CONSTANT(PhysicsFilter_None);
REGISTER_CONSTANT(PhysicsFilter_Player);
REGISTER_CONSTANT(PhysicsFilter_Triggers);
REGISTER_CONSTANT(PhysicsFilter_Usable);
REGISTER_CONSTANT(PhysicsFilter_NPC);
REGISTER_CONSTANT(PhysicsFilter_Obstacle);
REGISTER_CONSTANT(kPhysicsFilter_AllAux);
#undef REGISTER_CONSTANT
}

View File

@@ -223,6 +223,10 @@ void Entity::RegisterBaseFunctions()
m_luaObject.Register("create_box_body", *this, &Entity::Lua_CreateBoxBody);
m_luaObject.Register("create_sphere_body", *this, &Entity::Lua_CreateSphereBody);
m_luaObject.Register("ForceBodyTransformUpdate", *this, &Entity::Lua_ForceBodyTransformUpdate);
m_luaObject.Register("set_body_filter_group", *this, &Entity::Lua_SetBodyFilterGroup);
m_luaObject.Register("set_body_filter_mask", *this, &Entity::Lua_SetBodyFilterMask);
m_luaObject.Register("get_body_filter_group", *this, &Entity::Lua_GetBodyFilterGroup);
m_luaObject.Register("get_body_filter_mask", *this, &Entity::Lua_GetBodyFilterMask);
// animation
m_luaObject.Register("find_animation", *this, &Entity::Lua_FindAnimation);
@@ -495,6 +499,43 @@ int Entity::Lua_ForceBodyTransformUpdate(LuaPlus::LuaState* state)
return 0;
}
int Entity::Lua_SetBodyFilterGroup(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
SetBodyFilterGroup((PhysicsFilter)stack[2].GetInteger());
return 0;
}
int Entity::Lua_SetBodyFilterMask(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
SetBodyFilterMask(stack[2].GetInteger());
return 0;
}
int Entity::Lua_GetBodyFilterGroup(LuaPlus::LuaState* state)
{
if (m_rigidBody)
state->PushInteger(m_rigidBody->getBroadphaseHandle()->m_collisionFilterGroup);
else
state->PushInteger(-1);
return 1;
}
int Entity::Lua_GetBodyFilterMask(LuaPlus::LuaState* state)
{
if (m_rigidBody)
state->PushInteger(m_rigidBody->getBroadphaseHandle()->m_collisionFilterMask);
else
state->PushInteger(-1);
return 1;
}
int Entity::Lua_FindAnimation(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
@@ -712,6 +753,22 @@ void Entity::ForceUpdateBodyTranslation()
m_rigidBody->setWorldTransform(xform);
}
void Entity::SetBodyFilterGroup(PhysicsFilter group)
{
if (!m_rigidBody)
return;
m_rigidBody->getBroadphaseHandle()->m_collisionFilterGroup = group;
}
void Entity::SetBodyFilterMask(int mask)
{
if (!m_rigidBody)
return;
m_rigidBody->getBroadphaseHandle()->m_collisionFilterMask = mask;
}
REGISTER_ENTITY(WeaponBase);
WeaponBase::WeaponBase()

View File

@@ -93,6 +93,9 @@ public:
void UpdateBodyDirty();
void ForceUpdateBodyTranslation();
void SetBodyFilterGroup(PhysicsFilter group);
void SetBodyFilterMask(int mask);
// Game entity lua bindings
void InitFromTable(LuaPlus::LuaObject& _object);
@@ -127,6 +130,10 @@ public:
int Lua_CreateBoxBody(LuaPlus::LuaState* state);
int Lua_CreateSphereBody(LuaPlus::LuaState* state);
int Lua_ForceBodyTransformUpdate(LuaPlus::LuaState* state);
int Lua_SetBodyFilterGroup(LuaPlus::LuaState* state);
int Lua_SetBodyFilterMask(LuaPlus::LuaState* state);
int Lua_GetBodyFilterGroup(LuaPlus::LuaState* state);
int Lua_GetBodyFilterMask(LuaPlus::LuaState* state);
int Lua_FindAnimation(LuaPlus::LuaState* state);
int Lua_PlayAnimation(LuaPlus::LuaState* state);