diff --git a/doc/en/scripting/builtins/libgfx-skeletons.md b/doc/en/scripting/builtins/libgfx-skeletons.md new file mode 100644 index 00000000..4146b4be --- /dev/null +++ b/doc/en/scripting/builtins/libgfx-skeletons.md @@ -0,0 +1,48 @@ +# gfx.skeletons library + +A library for working with named skeletons, such as 'hand', +used to control the hand and the carried item displayed in first-person view. +The set of functions is similar to the skeleton component of entities. + +The first argument to the function is the name of the skeleton. + +```lua +-- Returns an object wrapper over the skeleton +local skeleton = gfx.skeletons.get(name: str) + +-- Returns the index of the bone by name or nil +skeleton:index(name: str) -> int + +-- Returns the name of the model assigned to the bone with the specified index +skeleton:get_model(index: int) -> str + +-- Reassigns the model of the bone with the specified index +-- Resets to the original if you do not specify a name +skeleton:set_model(index: int, name: str) + +-- Returns the transformation matrix of the bone with the specified index +skeleton:get_matrix(index: int) -> mat4 + +-- Sets the transformation matrix of the bone with the specified index +skeleton:set_matrix(index: int, matrix: mat4) + +-- Returns the texture by key (dynamically assigned textures - '$name') +skeleton:get_texture(key: str) -> str + +-- Assigns a texture by key +skeleton:set_texture(key: str, value: str) + +-- Checks the visibility status of a bone by index +-- or the entire skeleton if index is not specified +skeleton:is_visible([optional] index: int) -> bool + +-- Sets the visibility status of a bone by index +-- or the entire skeleton if index is not specified +skeleton:set_visible([optional] index: int, status: bool) + +-- Returns the color of the entity +skeleton:get_color() -> vec3 + +-- Sets the color of the entity +skeleton:set_color(color: vec3) +``` diff --git a/doc/ru/scripting/builtins/libgfx-skeletons.md b/doc/ru/scripting/builtins/libgfx-skeletons.md new file mode 100644 index 00000000..0e80b8f9 --- /dev/null +++ b/doc/ru/scripting/builtins/libgfx-skeletons.md @@ -0,0 +1,49 @@ +# Библиотека gfx.skeletons + +Библиотека для работы с именованными скелетами, такими как 'hand', +использующийся для управления, отображаемыми при виде от первого лица, +рукой и переносимым предметом. Набор функций аналогичен компоненту skeleton +у сущностей. + +Первым аргументом в функции передаётся имя скелета. + +```lua +-- Возвращает объектную обёртку над скелетом +local skeleton = gfx.skeletons.get(name: str) + +-- Возвращает индекс кости по имени или nil +skeleton:index(name: str) -> int + +-- Возвращает имя модели, назначенной на кость с указанным индексом +skeleton:get_model(index: int) -> str + +-- Переназначает модель кости с указанным индексом +-- Сбрасывает до изначальной, если не указывать имя +skeleton:set_model(index: int, name: str) + +-- Возвращает матрицу трансформации кости с указанным индексом +skeleton:get_matrix(index: int) -> mat4 + +-- Устанавливает матрицу трансформации кости с указанным индексом +skeleton:set_matrix(index: int, matrix: mat4) + +-- Возвращает текстуру по ключу (динамически назначаемые текстуры - '$имя') +skeleton:get_texture(key: str) -> str + +-- Назначает текстуру по ключу +skeleton:set_texture(key: str, value: str) + +-- Проверяет статус видимости кости по индесу +-- или всего скелета, если индекс не указан +skeleton:is_visible([опционально] index: int) -> bool + +-- Устанавливает статус видимости кости по индексу +-- или всего скелета, если индекс не указан +skeleton:set_visible([опционально] index: int, status: bool) + +-- Возвращает цвет сущности +skeleton:get_color() -> vec3 + +-- Устанавливает цвет сущности +skeleton:set_color(color: vec3) +``` diff --git a/res/scripts/hud.lua b/res/scripts/hud.lua index 9111c794..e189d098 100644 --- a/res/scripts/hud.lua +++ b/res/scripts/hud.lua @@ -83,8 +83,6 @@ function on_hud_open() configure_SSAO() end -local prev_rotation = mat4.idt() - function update_hand() local skeleton = gfx.skeletons local pid = hud.get_player() diff --git a/res/scripts/hud_classes.lua b/res/scripts/hud_classes.lua index dc373c6e..f8a28944 100644 --- a/res/scripts/hud_classes.lua +++ b/res/scripts/hud_classes.lua @@ -12,7 +12,27 @@ local Text3D = {__index={ update_settings=function(self, t) return gfx.text3d.update_settings(self.id, t) end, }} +local Skeleton = {__index={ + index=function(self, s) return gfx.skeletons.index(self.name, s) end, + get_model=function(self, i) return gfx.skeletons.get_model(self.name, i) end, + set_model=function(self, i, s) return gfx.skeletons.set_model(self.name, i, s) end, + get_matrix=function(self, i) return gfx.skeletons.get_matrix(self.name, i) end, + set_matrix=function(self, i, m) return gfx.skeletons.set_matrix(self.name, i, m) end, + get_texture=function(self, i) return gfx.skeletons.get_texture(self.name, i) end, + set_texture=function(self, i, s) return gfx.skeletons.set_texture(self.name, i, s) end, + is_visible=function(self, i) return gfx.skeletons.is_visible(self.name, i) end, + set_visible=function(self, i, b) return gfx.skeletons.set_visible(self.name, i, b) end, + get_color=function(self, i) return gfx.skeletons.get_color(self.name, i) end, + set_color=function(self, i, c) return gfx.skeletons.set_color(self.name, i, c) end, +}} + gfx.text3d.new = function(pos, text, preset, extension) local id = gfx.text3d.show(pos, text, preset, extension) return setmetatable({id=id}, Text3D) end + +gfx.skeletons.get = function(name) + if gfx.skeletons.exists(name) then + return setmetatable({name=name}, Skeleton) + end +end diff --git a/src/logic/scripting/lua/libs/lib__skeleton.cpp b/src/logic/scripting/lua/libs/lib__skeleton.cpp index ff4a0eba..7272548c 100644 --- a/src/logic/scripting/lua/libs/lib__skeleton.cpp +++ b/src/logic/scripting/lua/libs/lib__skeleton.cpp @@ -150,6 +150,10 @@ static int l_set_interpolated(lua::State* L) { return 0; } +static int l_exists(lua::State* L) { + return lua::pushboolean(L, get_skeleton(L)); +} + const luaL_Reg skeletonlib[] = { {"get_model", lua::wrap}, {"set_model", lua::wrap}, @@ -164,5 +168,6 @@ const luaL_Reg skeletonlib[] = { {"set_color", lua::wrap}, {"is_interpolated", lua::wrap}, {"set_interpolated", lua::wrap}, + {"exists", lua::wrap}, {NULL, NULL} };