diff --git a/data/shaders/lit_generic.vs b/data/shaders/lit_generic.vs index 3b68ea8..38c363b 100644 --- a/data/shaders/lit_generic.vs +++ b/data/shaders/lit_generic.vs @@ -43,6 +43,7 @@ vec3 CalcPhongLighting( vec3 worldPos, vec3 normal, vec3 lightPos ) { void main() { v_position = vec3( u_modelMatrix * vec4(a_position, 1.0) ); v_normal = vec3( mat3(u_modelMatrix) * a_normal ); + v_normal = normalize(v_normal); v_texcoord = a_texcoord; v_finalColor = CalcPhongLighting( v_position, v_normal, u_ligthPosition ); diff --git a/data/shaders/lit_generic_skin.vs b/data/shaders/lit_generic_skin.vs index 4fbac89..4df3887 100644 --- a/data/shaders/lit_generic_skin.vs +++ b/data/shaders/lit_generic_skin.vs @@ -55,6 +55,7 @@ void main() { v_position = vec3( u_modelMatrix * vec4( v_position, 1.0 ) ); v_normal = vec3( mat3(u_modelMatrix) * a_normal ); + v_normal = normalize(v_normal); v_texcoord = a_texcoord; v_finalColor = CalcPhongLighting( v_position, v_normal, u_ligthPosition ); diff --git a/docs/lua help.txt b/docs/lua help.txt index 9923bca..8664838 100644 --- a/docs/lua help.txt +++ b/docs/lua help.txt @@ -14,6 +14,15 @@ EMovementDir_Left = 8 EMovementDir_Right = 16 EMovementDir_Jump = 32 +PhysicsFilter_None = 64 +PhysicsFilter_Player = 128 +PhysicsFilter_Triggers = 256 +PhysicsFilter_Usable = 512 +PhysicsFilter_NPC = 1024 +PhysicsFilter_Obstacle = 2048 +kPhysicsFilter_AllAux = PhysicsFilter_Player | PhysicsFilter_Triggers | PhysicsFilter_Usable + + engine.error(string message) engine.warning(string message) engine.create_entity(string classname) -- return an table to the new entity @@ -88,6 +97,10 @@ has_rigid_body() -- return boolean create_box_body(float sizex, float sizey, float sizez, float mass, float friction, float damping, bool is_trigger, bool use_parameters) create_sphere_body(float radius, float mass, float friction, float damping, bool is_trigger, bool use_parameters) ForceBodyTransformUpdate() -- hack for forcing entity world transform to the rigid body +set_body_filter_group(integer group) -- set an physics group to the body +set_body_filter_mask(integer mask) -- set an physics group to the body +get_body_filter_group() -- return an current body group +get_body_filter_mask() -- return an current body mask find_animation(string name) -- find an animation in the model @@ -103,12 +116,13 @@ ActorBase methods: activate_camera() update_camera_look() update_camera_movement(float nubmer) -create_player_body() update_body_movement(float nubmer) get_action() -- return a current action mode (ACTION_FIRE, ACTION_ALT_FIRE, ACTION_RELOAD, ACTION_USE) get_movement() -- return a current movement mode (EMovementDir_None, ...) on_ground() -- return boolean is_noclip() -- return boolean +create_player_body(float radius, float height, float mass, float friction, float damping) +create_player_body_box(float x, float y, float z, float mass, float friction, float damping) Light methods: diff --git a/src/engine/physics/physicsworld.h b/src/engine/physics/physicsworld.h index 3669a70..0bb57b8 100644 --- a/src/engine/physics/physicsworld.h +++ b/src/engine/physics/physicsworld.h @@ -10,6 +10,18 @@ struct StaticMeshVertex; class RigidBody; class IEntityBase; +enum PhysicsFilter +{ + PhysicsFilter_None = 1 << 6, + PhysicsFilter_Player = 1 << 7, + PhysicsFilter_Triggers = 1 << 8, + PhysicsFilter_Usable = 1 << 9, + PhysicsFilter_NPC = 1 << 10, + PhysicsFilter_Obstacle = 1 << 11, +}; + +const int kPhysicsFilter_AllAux = PhysicsFilter_Player | PhysicsFilter_Triggers | PhysicsFilter_Usable; + struct SceneCollisionModel { btCollisionObject* object; diff --git a/src/engine/physics/rigidbody.h b/src/engine/physics/rigidbody.h index 5060fbf..cbbb555 100644 --- a/src/engine/physics/rigidbody.h +++ b/src/engine/physics/rigidbody.h @@ -2,22 +2,12 @@ #define RIGIDBODYCOMPONENT_H #include "engine/physics/bullet_private.h" +#include "engine/physics/physicsworld.h" class PhysicsManager; class PhysicsWorld; class ShapeComponent; -enum PhysicsFilter -{ - PhysicsFilter_None = 1 << 6, - PhysicsFilter_Player = 1 << 7, - PhysicsFilter_Triggers = 1 << 8, - PhysicsFilter_Usable = 1 << 9, - PhysicsFilter_NPC = 1 << 9, - PhysicsFilter_Obstacle = 1 << 9, -}; - -const int kPhysicsFilter_AllAux = PhysicsFilter_Player | PhysicsFilter_Triggers | PhysicsFilter_Usable; //! Rigid body class RigidBody diff --git a/src/game/actor_base.cpp b/src/game/actor_base.cpp index c7546e1..c83f6ce 100644 --- a/src/game/actor_base.cpp +++ b/src/game/actor_base.cpp @@ -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(); diff --git a/src/game/actor_base.h b/src/game/actor_base.h index 143d6a4..f5f0e23 100644 --- a/src/game/actor_base.h +++ b/src/game/actor_base.h @@ -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); diff --git a/src/game/game.cpp b/src/game/game.cpp index d4f21bd..91ae147 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -15,6 +15,7 @@ #include "scenemanager.h" #include "game_world_objects.h" #include "actor_base.h" +#include "physics/physicsworld.h" #include @@ -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 } diff --git a/src/game/game_object.cpp b/src/game/game_object.cpp index 85a7375..af60999 100644 --- a/src/game/game_object.cpp +++ b/src/game/game_object.cpp @@ -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() diff --git a/src/game/game_object.h b/src/game/game_object.h index 99229cb..1f47a98 100644 --- a/src/game/game_object.h +++ b/src/game/game_object.h @@ -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); diff --git a/src/render/model.cpp b/src/render/model.cpp index 57edfad..819a5e2 100644 --- a/src/render/model.cpp +++ b/src/render/model.cpp @@ -617,7 +617,17 @@ void Model::Draw(const glm::mat4& model, SkeletonInstance* instance /*= nullptr* glm::vec3 pos = model[3]; - Shader* shader = instance ? g_unlitSkinnedShader : g_unlitShader; + Shader* shader = g_unlitSkinnedShader; //instance ? g_unlitSkinnedShader : g_unlitShader; + + static glm::mat4 s_identityBones[128]; + static bool ready = false; + if (!ready) + { + for (int i = 0; i < 128; i++) + s_identityBones[i] = glm::mat4(1.0f); + + ready = true; + } DLight* light = nullptr; @@ -704,6 +714,8 @@ void Model::Draw(const glm::mat4& model, SkeletonInstance* instance /*= nullptr* if (instance) g_shaderSystem->SetUniformMatrix(shader, UNIFORM_BONE_MATRICES, instance->m_finalMatrices.data(), instance->m_finalMatrices.size()); + else + g_shaderSystem->SetUniformMatrix(shader, UNIFORM_BONE_MATRICES, s_identityBones, 128); if (m_data.ib) g_renderDevice->DrawElements(PT_TRIANGLES, m_data.ibcount, 0, NULL); diff --git a/src/sound/soundsystem.cpp b/src/sound/soundsystem.cpp index 9d5e184..2140f1b 100644 --- a/src/sound/soundsystem.cpp +++ b/src/sound/soundsystem.cpp @@ -114,6 +114,8 @@ void SoundSystem::Stop(SoundHandle handle) assert(handle <= -1 || handle <= m_dwSoundsNum); ma_sound_stop(&m_sounds[handle]); + ma_sound_seek_to_pcm_frame(&m_sounds[handle], 0); // <-- If you also want to restart from the start. + ma_sound_reset_stop_time_and_fade(&m_sounds[handle]); } bool SoundSystem::IsPlaying(SoundHandle handle)