add entity library
This commit is contained in:
parent
eacbc1b9d0
commit
8e931d8f53
@ -1,5 +1,8 @@
|
|||||||
function on_hud_open()
|
function on_hud_open()
|
||||||
input.add_callback("player.drop", function ()
|
input.add_callback("player.drop", function ()
|
||||||
entity.test()
|
local pid = hud.get_player()
|
||||||
|
local pvel = {player.get_vel(pid)}
|
||||||
|
local eid = entity.test()
|
||||||
|
entity.set_vel(eid, pvel)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -8,19 +8,43 @@
|
|||||||
#include "../../../window/Camera.hpp"
|
#include "../../../window/Camera.hpp"
|
||||||
#include "../../../frontend/hud.hpp"
|
#include "../../../frontend/hud.hpp"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
namespace scripting {
|
namespace scripting {
|
||||||
extern Hud* hud;
|
extern Hud* hud;
|
||||||
}
|
}
|
||||||
using namespace scripting;
|
using namespace scripting;
|
||||||
|
|
||||||
|
static std::optional<Entity> get_entity(lua::State* L, int idx) {
|
||||||
|
auto id = lua::tointeger(L, idx);
|
||||||
|
auto level = controller->getLevel();
|
||||||
|
return level->entities->get(id);
|
||||||
|
}
|
||||||
|
|
||||||
static int l_test(lua::State* L) {
|
static int l_test(lua::State* L) {
|
||||||
auto level = controller->getLevel();
|
auto level = controller->getLevel();
|
||||||
auto player = hud->getPlayer();
|
auto player = hud->getPlayer();
|
||||||
level->entities->drop(player->camera->position, player->camera->front*8.0f+glm::vec3(0, 2, 0)+player->hitbox->velocity);
|
auto id = level->entities->drop(player->camera->position);
|
||||||
return 0;
|
return lua::pushinteger(L, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_get_vel(lua::State* L) {
|
||||||
|
if (auto entity = get_entity(L, 1)) {
|
||||||
|
return lua::pushvec3_arr(L, entity->getHitbox().velocity);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int l_set_vel(lua::State* L) {
|
||||||
|
if (auto entity = get_entity(L, 1)) {
|
||||||
|
entity->getHitbox().velocity = lua::tovec3(L, 2);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const luaL_Reg entitylib [] = {
|
const luaL_Reg entitylib [] = {
|
||||||
{"test", lua::wrap<l_test>},
|
{"test", lua::wrap<l_test>},
|
||||||
|
{"get_vel", lua::wrap<l_get_vel>},
|
||||||
|
{"set_vel", lua::wrap<l_set_vel>},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -379,6 +379,16 @@ namespace lua {
|
|||||||
pop(L);
|
pop(L);
|
||||||
return glm::vec4(x, y, z, w);
|
return glm::vec4(x, y, z, w);
|
||||||
}
|
}
|
||||||
|
inline glm::vec3 tovec3_stack(lua::State* L, int idx) {
|
||||||
|
return glm::vec3(
|
||||||
|
tonumber(L, idx), tonumber(L, idx+1), tonumber(L, idx+2)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
inline glm::vec4 tovec4_stack(lua::State* L, int idx) {
|
||||||
|
return glm::vec4(
|
||||||
|
tonumber(L, idx), tonumber(L, idx+1), tonumber(L, idx+2), tonumber(L, idx+3)
|
||||||
|
);
|
||||||
|
}
|
||||||
inline glm::mat4 tomat4(lua::State* L, int idx) {
|
inline glm::mat4 tomat4(lua::State* L, int idx) {
|
||||||
pushvalue(L, idx);
|
pushvalue(L, idx);
|
||||||
if (!istable(L, idx) || objlen(L, idx) < 16) {
|
if (!istable(L, idx) || objlen(L, idx) < 16) {
|
||||||
|
|||||||
@ -20,16 +20,16 @@ void Transform::refresh() {
|
|||||||
Entities::Entities(Level* level) : level(level) {
|
Entities::Entities(Level* level) : level(level) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entities::drop(glm::vec3 pos, glm::vec3 vel) {
|
entityid_t Entities::drop(glm::vec3 pos) {
|
||||||
auto entity = registry.create();
|
auto entity = registry.create();
|
||||||
glm::vec3 size(1);
|
glm::vec3 size(1);
|
||||||
registry.emplace<EntityId>(entity, static_cast<entityid_t>(1));
|
auto id = nextID++;
|
||||||
|
registry.emplace<EntityId>(entity, static_cast<entityid_t>(id));
|
||||||
registry.emplace<Transform>(entity, pos, size/4.0f, glm::mat3(1.0f));
|
registry.emplace<Transform>(entity, pos, size/4.0f, glm::mat3(1.0f));
|
||||||
registry.emplace<Hitbox>(entity, pos,
|
registry.emplace<Hitbox>(entity, pos,
|
||||||
glm::vec3(size.x*0.2f, size.y*0.5f, size.z*0.2f));
|
glm::vec3(size.x*0.2f, size.y*0.5f, size.z*0.2f));
|
||||||
|
entities[id] = entity;
|
||||||
auto& hitbox = registry.get<Hitbox>(entity);
|
return id;
|
||||||
hitbox.velocity = vel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entities::updatePhysics(float delta){
|
void Entities::updatePhysics(float delta){
|
||||||
|
|||||||
@ -2,7 +2,9 @@
|
|||||||
#define OBJECTS_ENTITIES_HPP_
|
#define OBJECTS_ENTITIES_HPP_
|
||||||
|
|
||||||
#include "../typedefs.hpp"
|
#include "../typedefs.hpp"
|
||||||
|
#include "../physics/Hitbox.hpp"
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <entt/entity/registry.hpp>
|
#include <entt/entity/registry.hpp>
|
||||||
@ -28,9 +30,9 @@ class Rig;
|
|||||||
|
|
||||||
class Entity {
|
class Entity {
|
||||||
entt::registry& registry;
|
entt::registry& registry;
|
||||||
entt::entity entity;
|
const entt::entity entity;
|
||||||
public:
|
public:
|
||||||
Entity(entt::registry& registry, entt::entity entity)
|
Entity(entt::registry& registry, const entt::entity entity)
|
||||||
: registry(registry), entity(entity) {}
|
: registry(registry), entity(entity) {}
|
||||||
|
|
||||||
bool isValid() const {
|
bool isValid() const {
|
||||||
@ -41,6 +43,10 @@ public:
|
|||||||
return registry.get<Transform>(entity);
|
return registry.get<Transform>(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Hitbox& getHitbox() const {
|
||||||
|
return registry.get<Hitbox>(entity);
|
||||||
|
}
|
||||||
|
|
||||||
entityid_t getUID() const {
|
entityid_t getUID() const {
|
||||||
return registry.get<EntityId>(entity).uid;
|
return registry.get<EntityId>(entity).uid;
|
||||||
}
|
}
|
||||||
@ -50,12 +56,21 @@ class Entities {
|
|||||||
entt::registry registry;
|
entt::registry registry;
|
||||||
Level* level;
|
Level* level;
|
||||||
std::unordered_map<entityid_t, entt::entity> entities;
|
std::unordered_map<entityid_t, entt::entity> entities;
|
||||||
|
entityid_t nextID = 1;
|
||||||
public:
|
public:
|
||||||
Entities(Level* level);
|
Entities(Level* level);
|
||||||
void updatePhysics(float delta);
|
void updatePhysics(float delta);
|
||||||
void render(Assets* assets, ModelBatch& batch, Frustum& frustum);
|
void render(Assets* assets, ModelBatch& batch, Frustum& frustum);
|
||||||
|
|
||||||
void drop(glm::vec3 pos, glm::vec3 vel);
|
entityid_t drop(glm::vec3 pos);
|
||||||
|
|
||||||
|
std::optional<Entity> get(entityid_t id) {
|
||||||
|
const auto& found = entities.find(id);
|
||||||
|
if (found != entities.end()) {
|
||||||
|
return Entity(registry, found->second);
|
||||||
|
}
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // OBJECTS_ENTITIES_HPP_
|
#endif // OBJECTS_ENTITIES_HPP_
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user