diff --git a/src/graphics/render/Emitter.cpp b/src/graphics/render/Emitter.cpp index 3418f09d..582410db 100644 --- a/src/graphics/render/Emitter.cpp +++ b/src/graphics/render/Emitter.cpp @@ -113,3 +113,11 @@ void Emitter::stop() { bool Emitter::isDead() const { return count == 0; } + +const EmitterOrigin& Emitter::getOrigin() const { + return origin; +} + +void Emitter::setOrigin(const EmitterOrigin& origin) { + this->origin = origin; +} diff --git a/src/graphics/render/Emitter.hpp b/src/graphics/render/Emitter.hpp index 24867edd..c1d6c168 100644 --- a/src/graphics/render/Emitter.hpp +++ b/src/graphics/render/Emitter.hpp @@ -81,4 +81,8 @@ public: /// @return true if the emitter has spawned all particles bool isDead() const; + + const EmitterOrigin& getOrigin() const; + + void setOrigin(const EmitterOrigin& origin); }; diff --git a/src/logic/scripting/lua/libs/libparticles.cpp b/src/logic/scripting/lua/libs/libparticles.cpp index 9b488d7a..bd769a15 100644 --- a/src/logic/scripting/lua/libs/libparticles.cpp +++ b/src/logic/scripting/lua/libs/libparticles.cpp @@ -46,8 +46,37 @@ static int l_stop(lua::State* L) { return 0; } +static int l_get_origin(lua::State* L) { + u64id_t id = lua::touinteger(L, 1); + if (auto emitter = renderer->particles->getEmitter(id)) { + const auto& origin = emitter->getOrigin(); + if (auto pos = std::get_if(&origin)) { + return lua::pushvec3(L, *pos); + } else if (auto entityid = std::get_if(&origin)) { + return lua::pushinteger(L, *entityid); + } + } + return 0; +} + +static int l_set_origin(lua::State* L) { + u64id_t id = lua::touinteger(L, 1); + if (auto emitter = renderer->particles->getEmitter(id)) { + EmitterOrigin origin; + if (lua::istable(L, 2)) { + emitter->setOrigin(lua::tovec3(L, 2)); + } else { + emitter->setOrigin(static_cast(lua::tointeger(L, 2))); + } + } + return 0; +} + + const luaL_Reg particleslib[] = { {"emit", lua::wrap}, {"stop", lua::wrap}, + {"get_origin", lua::wrap}, + {"set_origin", lua::wrap}, {NULL, NULL} };