add rigidbody.set/get_gravity_scale

This commit is contained in:
MihailRis 2024-07-09 02:24:00 +03:00
parent cb37d3b00c
commit b4cf00a8f1
4 changed files with 19 additions and 3 deletions

View File

@ -144,6 +144,20 @@ static int l_rigidbody_set_size(lua::State* L) {
return 0;
}
static int l_rigidbody_get_gravity_scale(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
return lua::pushnumber(L, entity->getRigidbody().hitbox.gravityScale);
}
return 0;
}
static int l_rigidbody_set_gravity_scale(lua::State* L) {
if (auto entity = get_entity(L, 1)) {
entity->getRigidbody().hitbox.gravityScale = lua::tonumber(L, 2);
}
return 0;
}
static int index_range_check(const rigging::Rig& rig, lua::Integer index) {
if (static_cast<size_t>(index) >= rig.pose.matrices.size()) {
throw std::runtime_error("index out of range [0, " +
@ -222,5 +236,7 @@ const luaL_Reg rigidbodylib [] = {
{"set_vel", lua::wrap<l_rigidbody_set_vel>},
{"get_size", lua::wrap<l_rigidbody_get_size>},
{"set_size", lua::wrap<l_rigidbody_set_size>},
{"get_gravity_scale", lua::wrap<l_rigidbody_get_gravity_scale>},
{"set_gravity_scale", lua::wrap<l_rigidbody_set_gravity_scale>},
{NULL, NULL}
};

View File

@ -97,7 +97,7 @@ void Player::updateInput(PlayerInput& input, float delta) {
hitbox->linearDamping = PLAYER_GROUND_DAMPING;
hitbox->verticalDamping = flight;
hitbox->gravityMultiplier = flight ? 0.0f : 1.0f;
hitbox->gravityScale = flight ? 0.0f : 1.0f;
if (flight){
hitbox->linearDamping = PLAYER_AIR_DAMPING;
if (input.jump){

View File

@ -43,7 +43,7 @@ struct Hitbox {
float linearDamping;
bool verticalDamping = false;
bool grounded = false;
float gravityMultiplier = 1.0f;
float gravityScale = 1.0f;
Hitbox(glm::vec3 position, glm::vec3 halfsize);
};

View File

@ -32,7 +32,7 @@ void PhysicsSolver::step(
const glm::vec3& half = hitbox->halfsize;
glm::vec3& pos = hitbox->position;
glm::vec3& vel = hitbox->velocity;
float gravityScale = hitbox->gravityMultiplier;
float gravityScale = hitbox->gravityScale;
bool prevGrounded = hitbox->grounded;
hitbox->grounded = false;