Big big update

This commit is contained in:
2026-03-07 17:25:11 +03:00
parent 95daf12fc5
commit 79898c42d6
22 changed files with 423 additions and 47 deletions

View File

@@ -100,6 +100,10 @@ void ActorBase::UpdateBodyMovement(float dt)
m_rigidBody->setLinearVelocity(btVector3(airvel.x(), currentvel.y(), airvel.z()));
}
if (m_noclip && movementDir == EMouseButton_None) {
m_rigidBody->setLinearVelocity(btVector3(0.0f, 0.0f, 0.0f));
}
/*if (glm::length(velocity) > 0.1f && OnGround() && !(movementDir & EMovementDir_Jump))
m_rigidBody->setLinearVelocity(glmVectorToBt(velocity));
@@ -387,6 +391,8 @@ int ActorBase::GenAction()
action = 1;
else if (g_inputManager.GetKeyboard().IsKeyDown(SDLK_R))
action = 2;
else if (g_inputManager.GetKeyboard().IsKeyDown(SDLK_E))
action = 3;
return action;
}

View File

@@ -127,6 +127,19 @@ LuaPlus::LuaObject engineGetEntityFromID(lua_Integer id)
return entityTable;
}
LuaPlus::LuaObject engineFindEntityByName(const char* name)
{
Entity* entity = (Entity*)g_game->FindEntityByName(name);
if (!entity)
{
LuaPlus::LuaObject table;
table.AssignNil(GetLuaState());
return table;
}
return entity->GetLuaObject();
}
void engineAddEntityToWorld(LuaPlus::LuaObject& object)
{
LuaPlus::LuaObject cppclass = object["__object"];
@@ -184,6 +197,7 @@ void registerEngine()
engineTable.RegisterDirect("create_entity", &engineCreateEntity);
engineTable.RegisterDirect("add_entity_to_world", &engineAddEntityToWorld);
engineTable.RegisterDirect("get_entity_from_id", &engineGetEntityFromID);
engineTable.RegisterDirect("find_entity_by_name", &engineFindEntityByName);
engineTable.RegisterDirect("play_sound", &enginePlaySound);
engineTable.RegisterDirect("play_sound_3d", &enginePlaySound3D);
engineTable.RegisterDirect("get_delta", &engineGetDelta);
@@ -469,11 +483,15 @@ void Game::Init()
{
initializeLua();
initializeEntitiesTable();
luaCallFunction("sv_game_init");
}
void Game::InitForNewMap(const char* mapname)
{
LoadLevelXML(mapname);
luaCallFunction("sv_on_game_start");
}
void Game::LoadLevelXML(const char* mapname)
@@ -519,6 +537,9 @@ void Game::LoadLevelXML(const char* mapname)
// Create entity and expose it to the engine
Entity* entity = static_cast<Entity*>(Lua_CreateEntity(classname.as_string()));
if (!entityname.empty())
entity->SetName(entityname.as_string());
pugi::xml_node position = entitynode.child("Position");
if (position)
{
@@ -603,7 +624,7 @@ IEntityBase* Game::Lua_CreateEntity(const char* classname)
// create an table
LuaObject entityTable = GetLuaState().CreateTable();
entityTable.SetString("m_name", entityname);
entityTable.SetString("__private_name", entityname);
entityTable.SetInteger("m_id", entity->GetID());
// assign prototype
@@ -640,6 +661,22 @@ LuaPrototype* Game::Lua_FindPrototype(const char* classname)
return nullptr;
}
IEntityBase* Game::FindEntityByName(const char* name)
{
if (!g_world)
return nullptr;
int numEntities = g_world->GetNumEntities();
for (int i = 0; i < numEntities; i++)
{
Entity* entity = dynamic_cast<Entity*>(g_world->GetEntity(i));
if (entity && entity->GetName() == name)
return entity;
}
return nullptr;
}
void Game::Shutdown()
{
}

View File

@@ -16,6 +16,8 @@ public:
LuaPrototype* Lua_FindPrototype(const char* classname);
IEntityBase* FindEntityByName(const char* name);
void Shutdown();
void Render2D();

View File

@@ -1,5 +1,6 @@
#include <string>
#include "core.h"
#include "log.h"
#include "game_lua_help.h"
class LuaStateWrapper
@@ -84,6 +85,20 @@ void luaDoString(const char* str)
}
}
void luaCallFunction(const char* name)
{
LuaPlus::LuaObject onGameStart = GetLuaState().GetGlobal(name);
if (onGameStart.IsFunction())
{
LuaPlus::LuaFunctionVoid function = onGameStart;
function();
}
else
{
Msg("missing function '%s'", name);
}
}
glm::mat4 getMatrixFromLua(LuaPlus::LuaObject& matrix)
{
glm::mat4 return_matrix = glm::identity<glm::mat4>();

View File

@@ -11,6 +11,7 @@ LuaPlus::LuaState& GetLuaState();
void luaLoadScript(const char* filename);
void luaDoString(const char* str);
void luaCallFunction(const char* name);
glm::mat4 getMatrixFromLua(LuaPlus::LuaObject& matrix);

View File

@@ -1,5 +1,6 @@
#include "core.h"
#include "inputmanager.h"
#include "log.h"
#include "debugrender.h"
#include "game_object.h"
#include <SDL3/SDL.h>
@@ -185,6 +186,8 @@ void Entity::InitFromTable(LuaPlus::LuaObject& _object)
// register entity functions
RegisterFunctions();
m_luaObject.SetString("m_name", m_name.c_str());
// assign C++ object
m_luaObject.SetLightUserdata("__object", this);
}
@@ -210,11 +213,15 @@ void Entity::RegisterBaseFunctions()
m_luaObject.Register("get_classname", *this, &Entity::Lua_GetClassname);
m_luaObject.Register("get_id", *this, &Entity::Lua_GetID);
m_luaObject.Register("mark_for_delete", *this, &Entity::Lua_MarkForDelete);
m_luaObject.Register("set_name", *this, &Entity::Lua_SetName);
m_luaObject.Register("get_name", *this, &Entity::Lua_GetName);
// physics
m_luaObject.Register("set_velocity", *this, &Entity::Lua_SetVelocity);
m_luaObject.Register("get_velocity", *this, &Entity::Lua_GetVelocity);
m_luaObject.Register("has_rigid_body", *this, &Entity::Lua_HasRigidBody);
m_luaObject.Register("create_box_body", *this, &Entity::Lua_CreateBoxBody);
m_luaObject.Register("create_sphere_body", *this, &Entity::Lua_CreateSphereBody);
// animation
m_luaObject.Register("find_animation", *this, &Entity::Lua_FindAnimation);
@@ -357,20 +364,9 @@ int Entity::Lua_SetRotationFromVectors(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
glm::vec3 front(
stack[2].GetNumber(),
stack[3].GetNumber(),
stack[4].GetNumber());
glm::vec3 right(
stack[5].GetNumber(),
stack[6].GetNumber(),
stack[7].GetNumber());
glm::vec3 up(
stack[8].GetNumber(),
stack[9].GetNumber(),
stack[10].GetNumber());
glm::vec3 front = glm::vec3(stack[2].GetNumber(), stack[3].GetNumber(), stack[4].GetNumber());
glm::vec3 right = glm::vec3(stack[5].GetNumber(), stack[6].GetNumber(), stack[7].GetNumber());
glm::vec3 up = glm::vec3(stack[8].GetNumber(), stack[9].GetNumber(), stack[10].GetNumber());
Help_SetRotationFromVectors(front, right, up);
@@ -403,6 +399,22 @@ int Entity::Lua_MarkForDelete(LuaPlus::LuaState* state)
return 0;
}
int Entity::Lua_SetName(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
const char* name = stack[2].GetString();
SetName(name);
return 0;
}
int Entity::Lua_GetName(LuaPlus::LuaState* state)
{
state->PushString(m_name.c_str());
return 1;
}
int Entity::Lua_SetVelocity(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
@@ -437,6 +449,44 @@ int Entity::Lua_HasRigidBody(LuaPlus::LuaState* state)
return 1;
}
int Entity::Lua_CreateBoxBody(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
glm::vec3 size;
size.x = stack[2].GetNumber();
size.y = stack[3].GetNumber();
size.z = stack[4].GetNumber();
float mass = stack[5].GetNumber();
float friction = stack[6].GetNumber();
float damping = stack[7].GetNumber();
bool is_trigger = stack[8].GetBoolean();
bool use_parameters = stack[9].GetBoolean();
CreateBoxBody(size, mass, friction, damping, is_trigger, use_parameters);
return 0;
}
int Entity::Lua_CreateSphereBody(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
float radius = stack[2].GetNumber();
float mass = stack[3].GetNumber();
float friction = stack[4].GetNumber();
float damping = stack[5].GetNumber();
bool is_trigger = stack[6].GetBoolean();
bool use_parameters = stack[7].GetBoolean();
CreateSphereBody(radius, mass, friction, damping, is_trigger, use_parameters);
return 0;
}
int Entity::Lua_FindAnimation(LuaPlus::LuaState* state)
{
LuaPlus::LuaStack stack(state);
@@ -444,7 +494,7 @@ int Entity::Lua_FindAnimation(LuaPlus::LuaState* state)
if (!stack[2].IsString())
{
Core::Warning("load_model: first argument is not an string");
Core::Warning("find_animation: first argument is not an string");
return 0;
}
@@ -525,7 +575,59 @@ void Entity::CreateTestBody()
{
m_shape = new btBoxShape(btVector3(0.2f, 0.2f, 0.2f));
m_mass = 80.0f;
CreateBodyPrivate(80.0f, 0.0, 0.0f, false, false);
//m_mass = 80.0f;
//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);
//// #TODO: body filter and mask
//g_PhysicsWorld->GetWorld()->addRigidBody(m_rigidBody);
//m_bodyDirty = true;
}
void Entity::CreateBoxBody(const glm::vec3& size, float mass, float friction, float damping, bool is_trigger, bool use_parameters)
{
m_shape = (btCollisionShape*)new btBoxShape(glmVectorToBt(size));
CreateBodyPrivate(mass, friction, damping, is_trigger, use_parameters);
}
void Entity::CreateSphereBody(float radius, float mass, float friction, float damping, bool is_trigger, bool use_parameters)
{
m_shape = (btCollisionShape*)new btSphereShape(radius);
CreateBodyPrivate(mass, friction, damping, is_trigger, use_parameters);
}
void Entity::CreateBodyPrivate(float mass, float friction, float damping, bool is_trigger, bool use_parameters)
{
SDL_assert_always(m_shape);
m_mass = mass;
if (is_trigger && m_mass > 0.f)
{
Msg("WARNING! Entity '%s' trying to create body with mass %f and trigger flag, setting to zero.", m_name.c_str(), mass);
m_mass = 0.0f;
}
btVector3 local_inertia(0.0f, 0.0f, 0.0f);
if (m_mass > 0.f) {
m_shape->calculateLocalInertia(m_mass, local_inertia);
@@ -544,6 +646,26 @@ void Entity::CreateTestBody()
xform.setOrigin(glmVectorToBt(m_position));
m_rigidBody->setWorldTransform(xform);
// body parameters
if (use_parameters)
{
m_rigidBody->setFriction(friction);
m_rigidBody->setAnisotropicFriction(btVector3(0.0f, 0.0f, 0.0f));
m_rigidBody->setDamping(damping, 0.0f);
}
int bodyCollisionFlags = m_rigidBody->getCollisionFlags();
if (is_trigger)
bodyCollisionFlags |= btRigidBody::CF_NO_CONTACT_RESPONSE;
else
bodyCollisionFlags &= ~btRigidBody::CF_NO_CONTACT_RESPONSE;
m_rigidBody->setCollisionFlags(bodyCollisionFlags);
if (is_trigger)
m_rigidBody->setCustomDebugColor(btVector3(1.0f, 0.5f, 0.0f));
// #TODO: body filter and mask
g_PhysicsWorld->GetWorld()->addRigidBody(m_rigidBody);
@@ -637,3 +759,24 @@ void WeaponBase::Fire(const glm::vec3& direction, float damage)
// ActorBase* entity = (ActorBase*)stack[1].GetByName("__object").GetLightUserdata();
// entity->ActivateCamera();
//}
REGISTER_ENTITY(TriggerBase);
TriggerBase::TriggerBase()
{
}
TriggerBase::~TriggerBase()
{
}
void TriggerBase::Render()
{
if (m_rigidBody && g_debugEntityDraw)
{
BoundingBox bbox;
bbox.m_min = btVectorToGlm(m_rigidBody->getBroadphaseHandle()->m_aabbMin);
bbox.m_max = btVectorToGlm(m_rigidBody->getBroadphaseHandle()->m_aabbMax);
g_debugRender->DrawBoundingBox(bbox, glm::vec3(1.0f, 0.5f, 0.0f));
}
}

View File

@@ -84,6 +84,11 @@ public:
// Game entity physics
void CreateTestBody();
void CreateBoxBody(const glm::vec3& size, float mass, float friction, float damping, bool is_trigger, bool use_parameters);
void CreateSphereBody(float radius, float mass, float friction, float damping, bool is_trigger, bool use_parameters);
void CreateBodyPrivate(float mass, float friction, float damping, bool is_trigger, bool use_parameters);
void UpdateBody();
void UpdateBodyDirty();
@@ -112,10 +117,14 @@ public:
int Lua_GetID(LuaPlus::LuaState* state);
int Lua_UpdateTransform(LuaPlus::LuaState* state);
int Lua_MarkForDelete(LuaPlus::LuaState* state);
int Lua_SetName(LuaPlus::LuaState* state);
int Lua_GetName(LuaPlus::LuaState* state);
int Lua_SetVelocity(LuaPlus::LuaState* state);
int Lua_GetVelocity(LuaPlus::LuaState* state);
int Lua_HasRigidBody(LuaPlus::LuaState* state);
int Lua_CreateBoxBody(LuaPlus::LuaState* state);
int Lua_CreateSphereBody(LuaPlus::LuaState* state);
int Lua_FindAnimation(LuaPlus::LuaState* state);
int Lua_PlayAnimation(LuaPlus::LuaState* state);
@@ -157,4 +166,13 @@ public:
void Fire(const glm::vec3& direction, float damage);
};
class TriggerBase : public Entity
{
public:
TriggerBase();
~TriggerBase();
virtual void Render();
};
#endif // !GAME_OBJECT_H

View File

@@ -9,7 +9,8 @@ REGISTER_ENTITY(Light);
Light::Light()
{
m_dlight = nullptr;
//m_dlight = nullptr;
m_dlight = DLightManager::GetInstance()->AllocLight();
}
Light::~Light()
@@ -25,13 +26,23 @@ void Light::Render()
if (g_debugDrawLights)
{
g_debugRender->DrawAxis(m_dlight->position);
g_debugRender->DrawSphere(m_dlight->position, m_dlight->radius, m_dlight->color);
}
}
void Light::RegisterFunctions()
{
m_luaObject.Register("set_color", *this, &Light::Lua_SetColor);
m_luaObject.Register("get_color", *this, &Light::Lua_GetColor);
m_luaObject.Register("set_radius", *this, &Light::Lua_SetRadius);
m_luaObject.Register("get_radius", *this, &Light::Lua_GetRadius);
}
void Light::InitFromXML(const pugi::xml_node& node)
{
m_dlight = DLightManager::GetInstance()->AllocLight();
//m_dlight = DLightManager::GetInstance()->AllocLight();
SDL_assert_always(m_dlight);
m_dlight->position = m_position;
@@ -48,4 +59,46 @@ void Light::InitFromXML(const pugi::xml_node& node)
{
m_dlight->radius = radius.attribute("value").as_float();
}
}
}
int Light::Lua_SetColor(LuaPlus::LuaState* state)
{
SDL_assert_always(m_dlight);
LuaPlus::LuaStack stack(state);
m_dlight->color.r = stack[2].GetFloat();
m_dlight->color.g = stack[3].GetFloat();
m_dlight->color.b = stack[4].GetFloat();
return 0;
}
int Light::Lua_GetColor(LuaPlus::LuaState* state)
{
SDL_assert_always(m_dlight);
state->PushNumber(m_dlight->color.r);
state->PushNumber(m_dlight->color.g);
state->PushNumber(m_dlight->color.b);
return 3;
}
int Light::Lua_SetRadius(LuaPlus::LuaState* state)
{
SDL_assert_always(m_dlight);
LuaPlus::LuaStack stack(state);
m_dlight->radius = stack[2].GetFloat();
return 0;
}
int Light::Lua_GetRadius(LuaPlus::LuaState* state)
{
SDL_assert_always(m_dlight);
state->PushNumber(m_dlight->radius);
return 1;
}

View File

@@ -16,9 +16,16 @@ public:
~Light();
void Render() override;
void RegisterFunctions() override;
void InitFromXML(const pugi::xml_node& node);
private:
int Lua_SetColor(LuaPlus::LuaState* state);
int Lua_GetColor(LuaPlus::LuaState* state);
int Lua_SetRadius(LuaPlus::LuaState* state);
int Lua_GetRadius(LuaPlus::LuaState* state);
private:
DLight* m_dlight;
};