From 80f60c6e74a14eb87083f0c38fefd5456477672d Mon Sep 17 00:00:00 2001 From: JustAPotota <43710172+JustAPotota@users.noreply.github.com> Date: Sat, 6 Jul 2024 21:42:03 -0500 Subject: [PATCH 01/45] Fix password input events returning masked text --- druid/extended/input.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/druid/extended/input.lua b/druid/extended/input.lua index f08ac6b..5422c16 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -267,6 +267,7 @@ function Input.set_text(self, input_text) self.is_empty = #value == 0 and #marked_value == 0 local final_text = value .. marked_value + local real_text = self.value .. self.marked_value self.text:set_to(final_text) -- measure it @@ -274,12 +275,12 @@ function Input.set_text(self, input_text) self.marked_text_width = self.text:get_text_size(marked_value) self.total_width = self.text_width + self.marked_text_width - self.on_input_text:trigger(self:get_context(), final_text) + self.on_input_text:trigger(self:get_context(), real_text) if #final_text == 0 then - self.on_input_empty:trigger(self:get_context(), final_text) + self.on_input_empty:trigger(self:get_context(), real_text) end if self.max_length and #final_text == self.max_length then - self.on_input_full:trigger(self:get_context(), final_text) + self.on_input_full:trigger(self:get_context(), real_text) end end end From 63c2e8ea930d1a004e48f849542c595788fc8e3e Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 20:42:11 +0300 Subject: [PATCH 02/45] Fix new_ annotations --- druid/annotations.lua | 82 ++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 2d4d340..46c76b3 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -6,7 +6,7 @@ local druid = {} --- Create a new Druid instance for creating GUI components. ---@param context table The Druid context. Usually, this is the self of the gui_script. It is passed into all Druid callbacks. ----@param style table The Druid style table to override style parameters for this Druid instance. +---@param style? table The Druid style table to override style parameters for this Druid instance. ---@return druid_instance The Druid instance @{DruidInstance}. function druid.new(context, style) end @@ -307,6 +307,7 @@ function druid__checkbox_group.init(self, nodes, callback, click_nodes) end ---@param is_instant boolean If instant state change function druid__checkbox_group.set_state(self, indexes, is_instant) end +---@alias Grid druid.static_grid|druid.dynamic_grid ---@class druid.data_list : druid.base_component ---@field grid druid.static_grid|druid.dynamic_grid The Druid Grid component @@ -1445,40 +1446,40 @@ function druid_instance.new(self, component, ...) end --- Create @{BackHandler} component ---@param self druid_instance ----@param callback callback On back button +---@param callback function On back button ---@param params any Callback argument ---@return druid.back_handler @{BackHandler} component function druid_instance.new_back_handler(self, callback, params) end --- Create @{Blocker} component ---@param self druid_instance ----@param node node Gui node +---@param node node|string Gui node (or node id) ---@return druid.blocker @{Blocker} component function druid_instance.new_blocker(self, node) end --- Create @{Button} component ---@param self druid_instance ----@param node node GUI node +---@param node node|string GUI node (or node id) ---@param callback function Button callback ----@param params table Button callback params ----@param anim_node node Button anim node (node, if not provided) +---@param params? table Button callback params +---@param anim_node? node|string Button anim node (node, if not provided) ---@return druid.button @{Button} component function druid_instance.new_button(self, node, callback, params, anim_node) end --- Create @{Checkbox} component ---@param self druid_instance ----@param node node Gui node +---@param node node|string Gui node (or node id) ---@param callback function Checkbox callback ----@param click_node node Trigger node, by default equals to node ----@param initial_state boolean The initial state of checkbox, default - false +---@param click_node? node Trigger node, by default equals to node +---@param initial_state? boolean The initial state of checkbox, default - false ---@return druid.checkbox @{Checkbox} component function druid_instance.new_checkbox(self, node, callback, click_node, initial_state) end --- Create @{CheckboxGroup} component ---@param self druid_instance ----@param nodes node[] Array of gui node +---@param nodes (node | string)[] Array of gui node (or node id) ---@param callback function Checkbox callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes? (node | string)[] Array of trigger nodes (or node id), by default equals to nodes ---@return druid.checkbox_group @{CheckboxGroup} component function druid_instance.new_checkbox_group(self, nodes, callback, click_nodes) end @@ -1492,14 +1493,14 @@ function druid_instance.new_data_list(self, druid_scroll, druid_grid, create_fun --- Create @{Drag} component ---@param self druid_instance ----@param node node GUI node to detect dragging +---@param node node|string GUI node (or node id) to detect dragging ---@param on_drag_callback function Callback for on_drag_event(self, dx, dy) ---@return druid.drag @{Drag} component function druid_instance.new_drag(self, node, on_drag_callback) end --- Create @{DynamicGrid} component ---@param self druid_instance ----@param parent node The gui node parent, where items will be placed +---@param parent node|string The gui node (or node id) parent, where items will be placed ---@return druid.dynamic_grid @{DynamicGrid} component function druid_instance.new_dynamic_grid(self, parent) end @@ -1507,53 +1508,54 @@ function druid_instance.new_dynamic_grid(self, parent) end ---@param self druid_instance ---@param keys_array string|string[] Keys for trigger action. Should contains one action key and any amount of modificator keys ---@param callback function Button callback ----@param params value Button callback params +---@param params? value Button callback params ---@return druid.hotkey @{Hotkey} component function druid_instance.new_hotkey(self, keys_array, callback, params) end --- Create @{Hover} component ---@param self druid_instance ----@param node node Gui node +---@param node node|string Gui node (or node id) ---@param on_hover_callback function Hover callback ---@return druid.hover @{Hover} component function druid_instance.new_hover(self, node, on_hover_callback) end --- Create @{Input} component ---@param self druid_instance ----@param click_node node Button node to enabled input component ----@param text_node node Text node what will be changed on user input ----@param keyboard_type number Gui keyboard type for input field +---@param click_node node|string Button node (or node id) to enabled input component +---@param text_node node|string|druid.text Text node what will be changed on user input +---@param keyboard_type? number Gui keyboard type for input field ---@return druid.input @{Input} component function druid_instance.new_input(self, click_node, text_node, keyboard_type) end --- Create @{LangText} component ---@param self druid_instance ----@param node node The text node ----@param locale_id string Default locale id ----@param no_adjust bool If true, will not correct text size +---@param node node|string The text node (or node id) +---@param locale_id? string Default locale id +---@param no_adjust? bool If true, will not correct text size ---@return druid.lang_text @{LangText} component function druid_instance.new_lang_text(self, node, locale_id, no_adjust) end --- Create @{Layout} component ---@param self druid_instance ----@param node string|node Layout node +---@param node string|node Layout node (or node id) ---@param mode string The layout mode +---@param on_size_changed_callback? function The callback on window resize ---@return druid.layout @{Layout} component -function druid_instance.new_layout(self, node, mode) end +function druid_instance.new_layout(self, node, mode, on_size_changed_callback) end --- Create @{Progress} component ---@param self druid_instance ---@param node string|node Progress bar fill node or node name ---@param key string Progress bar direction: const.SIDE.X or const.SIDE.Y ----@param init_value number Initial value of progress bar +---@param init_value? number Initial value of progress bar ---@return druid.progress @{Progress} component function druid_instance.new_progress(self, node, key, init_value) end --- Create @{RadioGroup} component ---@param self druid_instance ----@param nodes node[] Array of gui node +---@param nodes (node | string)[] Array of gui node (or node id) ---@param callback function Radio callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes? (node | string)[] Array of trigger nodes (or node id), by default equals to nodes ---@return druid.radio_group @{RadioGroup} component function druid_instance.new_radio_group(self, nodes, callback, click_nodes) end @@ -1567,48 +1569,48 @@ function druid_instance.new_rich_text(self, template, nodes) end --- Create @{Scroll} component ---@param self druid_instance ----@param view_node node GUI view scroll node ----@param content_node node GUI content scroll node +---@param view_node node|string GUI view scroll node (or node id) +---@param content_node node|string GUI content scroll node (or node id) ---@return druid.scroll @{Scroll} component function druid_instance.new_scroll(self, view_node, content_node) end --- Create @{Slider} component ---@param self druid_instance ----@param node node Gui pin node +---@param node node|string Gui pin node (or node id) ---@param end_pos vector3 The end position of slider ----@param callback function On slider change callback +---@param callback? function On slider change callback ---@return druid.slider @{Slider} component function druid_instance.new_slider(self, node, end_pos, callback) end --- Create @{StaticGrid} component ---@param self druid_instance ----@param parent node The gui node parent, where items will be placed ----@param element node Element prefab. Need to get it size ----@param in_row number How many nodes in row can be placed +---@param parent node|string The gui node (or node id) parent, where items will be placed +---@param element node|string Element prefab (or prefab id). Need to get it size +---@param in_row? number How many nodes in row can be placed ---@return druid.static_grid @{StaticGrid} component function druid_instance.new_static_grid(self, parent, element, in_row) end --- Create @{Swipe} component ---@param self druid_instance ----@param node node Gui node +---@param node node|string Gui node (or node id) ---@param on_swipe_callback function Swipe callback for on_swipe_end event ---@return druid.swipe @{Swipe} component function druid_instance.new_swipe(self, node, on_swipe_callback) end --- Create @{Text} component ---@param self druid_instance ----@param node node Gui text node ----@param value string Initial text. Default value is node text from GUI scene. ----@param no_adjust bool If true, text will be not auto-adjust size +---@param node node|string Gui text node (or node id) +---@param value? string Initial text. Default value is node text from GUI scene. +---@param no_adjust? bool If true, text will be not auto-adjust size ---@return druid.text @{Text} component function druid_instance.new_text(self, node, value, no_adjust) end --- Create @{Timer} component ---@param self druid_instance ----@param node node Gui text node +---@param node node|string Gui text node (or node id) ---@param seconds_from number Start timer value in seconds ----@param seconds_to number End timer value in seconds ----@param callback function Function on timer end +---@param seconds_to? number End timer value in seconds +---@param callback? function Function on timer end ---@return druid.timer @{Timer} component function druid_instance.new_timer(self, node, seconds_from, seconds_to, callback) end From 8a3cff17ab50e702dbc952ba04877e93a32e299f Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 20:59:55 +0300 Subject: [PATCH 03/45] Fix "node" type annotation to lowercase --- druid/annotations.lua | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 46c76b3..840d23c 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -171,7 +171,7 @@ function druid__blocker.set_enabled(self, state) end ---@field anim_node node Button animation node. ---@field click_zone node Additional button click area, defined by another GUI Node ---@field hover druid.hover The @{Hover}: Button Hover component ----@field node Node Button trigger node +---@field node node Button trigger node ---@field node_id hash The GUI node id from button node ---@field on_click druid.event The @{DruidEvent}: Event on successful release action over button. ---@field on_click_outside druid.event The @{DruidEvent}: Event calls if click event was outside of button. @@ -191,10 +191,10 @@ function druid__button.get_key_trigger(self) end --- The @{Button} constructor ---@param self druid.button @{Button} ----@param node string|Node Node name or GUI Node itself +---@param node string|node Node name or GUI Node itself ---@param callback function On click button callback ---@param custom_args any Button events custom arguments ----@param anim_node string|Node Node to animate instead of trigger node. +---@param anim_node string|node Node to animate instead of trigger node. function druid__button.init(self, node, callback, custom_args, anim_node) end --- Get button enabled state. @@ -331,7 +331,7 @@ function druid__data_list.get_created_components(self) end --- Return all currenly created nodes in DataList ---@param self druid.data_list @{DataList} ----@return Node[] List of created nodes +---@return node[] List of created nodes function druid__data_list.get_created_nodes(self) end --- Return current data from DataList component @@ -757,7 +757,7 @@ local druid__layout = {} --- Set node for layout node to fit inside it. --- Pass nil to reset ---@param self druid.layout @{Layout} ----@param node Node +---@param node node ---@return druid.layout @{Layout} function druid__layout.fit_into_node(self, node) end @@ -1149,7 +1149,7 @@ function druid__slider.set(self, value, is_silent) end --- Set input zone for slider. --- User can touch any place of node, pin instantly will move at this position and node drag will start. This function require the Defold version 1.3.0+ ---@param self druid.slider @{Slider} ----@param input_node Node +---@param input_node node ---@return druid.slider @{Slider} function druid__slider.set_input_node(self, input_node) end @@ -1232,7 +1232,7 @@ function druid__static_grid.get_size(self) end --- The @{StaticGrid} constructor ---@param self druid.static_grid @{StaticGrid} ----@param parent string|Node The GUI Node container, where grid's items will be placed +---@param parent string|node The GUI Node container, where grid's items will be placed ---@param element node Element prefab. Need to get it size ---@param in_row number How many nodes in row can be placed function druid__static_grid.init(self, parent, element, in_row) end @@ -1243,7 +1243,7 @@ function druid__static_grid.init(self, parent, element, in_row) end ---@param index number The grid node index to remove ---@param shift_policy number How shift nodes, if required. See const.SHIFT ---@param is_instant boolean If true, update node positions instantly ----@return Node The deleted gui node from grid +---@return node The deleted gui node from grid function druid__static_grid.remove(self, index, shift_policy, is_instant) end --- Set grid anchor. @@ -1737,7 +1737,7 @@ function helper.get_scene_scale(node, include_passed_node_scale) end function helper.get_screen_aspect_koef() end --- Get text metric from GUI node. ----@param text_node Node +---@param text_node node ---@return GUITextMetrics function helper.get_text_metrics_from_node(text_node) end @@ -1817,7 +1817,7 @@ function helper.table_to_string(t) end ---@field lines table ---@class druid.rich_text.word ----@field node Node +---@field node node ---@field relative_scale number ---@field color vector4 ---@field position vector3 @@ -1843,7 +1843,7 @@ function helper.table_to_string(t) end ---@field height number ---@class druid.rich_text.settings ----@field parent Node +---@field parent node ---@field size number ---@field fonts table ---@field color vector4 @@ -1853,8 +1853,8 @@ function helper.table_to_string(t) end ---@field image_pixel_grid_snap boolean ---@field combine_words boolean ---@field default_animation string ----@field node_prefab Node ----@field text_prefab Node +---@field node_prefab node +---@field text_prefab node ---@class GUITextMetrics ---@field width number From c4a4221841806d02ac2e46d1458341f29d2798d7 Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 21:12:26 +0300 Subject: [PATCH 04/45] Fix Grid methods annotations --- druid/annotations.lua | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 840d23c..dc4758b 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -448,9 +448,9 @@ function druid__dynamic_grid._get_side_vector(self, side, is_forward) end --- Add new node to the grid ---@param self druid.dynamic_grid @{DynamicGrid} ---@param node node Gui node ----@param index number The node position. By default add as last node ----@param shift_policy number How shift nodes, if required. See const.SHIFT ----@param is_instant boolean If true, update node positions instantly +---@param index? number The node position. By default add as last node +---@param shift_policy? number How shift nodes, if required. See const.SHIFT +---@param is_instant? boolean If true, update node positions instantly function druid__dynamic_grid.add(self, node, index, shift_policy, is_instant) end --- Clear grid nodes array. @@ -484,7 +484,7 @@ function druid__dynamic_grid.get_offset(self) end ---@param self druid.dynamic_grid @{DynamicGrid} ---@param index number The grid element index ---@param node node The node to be placed ----@param origin_index number Index of nearby node +---@param origin_index? number Index of nearby node ---@return vector3 Node position function druid__dynamic_grid.get_pos(self, index, node, origin_index) end @@ -503,8 +503,8 @@ function druid__dynamic_grid.init(self, parent) end --- Note that gui node will be not deleted ---@param self druid.dynamic_grid @{DynamicGrid} ---@param index number The grid node index to remove ----@param shift_policy number How shift nodes, if required. See const.SHIFT ----@param is_instant boolean If true, update node positions instantly +---@param shift_policy? number How shift nodes, if required. See const.SHIFT +---@param is_instant? boolean If true, update node positions instantly ---@return node The deleted gui node from grid function druid__dynamic_grid.remove(self, index, shift_policy, is_instant) end @@ -1181,9 +1181,9 @@ local druid__static_grid = {} --- Add new item to the grid ---@param self druid.static_grid @{StaticGrid} ---@param item node Gui node ----@param index number The item position. By default add as last item ----@param shift_policy number How shift nodes, if required. See const.SHIFT ----@param is_instant boolean If true, update node positions instantly +---@param index? number The item position. By default add as last item +---@param shift_policy? number How shift nodes, if required. See const.SHIFT +---@param is_instant? boolean If true, update node positions instantly function druid__static_grid.add(self, item, index, shift_policy, is_instant) end --- Clear grid nodes array. @@ -1234,15 +1234,15 @@ function druid__static_grid.get_size(self) end ---@param self druid.static_grid @{StaticGrid} ---@param parent string|node The GUI Node container, where grid's items will be placed ---@param element node Element prefab. Need to get it size ----@param in_row number How many nodes in row can be placed +---@param in_row? number How many nodes in row can be placed function druid__static_grid.init(self, parent, element, in_row) end --- Remove the item from the grid. --- Note that gui node will be not deleted ---@param self druid.static_grid @{StaticGrid} ---@param index number The grid node index to remove ----@param shift_policy number How shift nodes, if required. See const.SHIFT ----@param is_instant boolean If true, update node positions instantly +---@param shift_policy? number How shift nodes, if required. See const.SHIFT +---@param is_instant? boolean If true, update node positions instantly ---@return node The deleted gui node from grid function druid__static_grid.remove(self, index, shift_policy, is_instant) end From 32aa7603861cbf1c4e062042bf2c71691435f1a8 Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 21:15:55 +0300 Subject: [PATCH 05/45] Fix "any" type annotation to lowercase --- druid/annotations.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index dc4758b..e2b93f3 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -536,18 +536,18 @@ function druid__event.is_exist(self) end --- Subscribe callback on event ---@param self druid.event @{DruidEvent} ---@param callback function Callback itself ----@param context Any Additional context as first param to callback call, usually it's self +---@param context any Additional context as first param to callback call, usually it's self function druid__event.subscribe(self, callback, context) end --- Trigger the event and call all subscribed callbacks ---@param self druid.event @{DruidEvent} ----@param ... Any All event params +---@param ... any All event params function druid__event.trigger(self, ...) end --- Unsubscribe callback on event ---@param self druid.event @{DruidEvent} ---@param callback function Callback itself ----@param context Any Additional context as first param to callback call +---@param context any Additional context as first param to callback call function druid__event.unsubscribe(self, callback, context) end From 2cef65ed4081e3ba13e300091a4d020ba60d7c4e Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 21:22:34 +0300 Subject: [PATCH 06/45] Fix scroll annotations --- druid/annotations.lua | 10 +++++----- druid/base/scroll.lua | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index e2b93f3..8ff350f 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1042,25 +1042,25 @@ function druid__scroll.is_node_in_view(self, node) end --- Start scroll to target point. ---@param self druid.scroll @{Scroll} ---@param point vector3 Target point ----@param is_instant bool Instant scroll flag +---@param is_instant? bool Instant scroll flag function druid__scroll.scroll_to(self, point, is_instant) end --- Scroll to item in scroll by point index. ---@param self druid.scroll @{Scroll} ---@param index number Point index ----@param skip_cb bool If true, skip the point callback +---@param skip_cb? bool If true, skip the point callback function druid__scroll.scroll_to_index(self, index, skip_cb) end --- Start scroll to target scroll percent ---@param self druid.scroll @{Scroll} ---@param percent vector3 target percent ----@param is_instant bool instant scroll flag +---@param is_instant? bool instant scroll flag function druid__scroll.scroll_to_percent(self, percent, is_instant) end --- Strict drag scroll area. --- Useful for restrict events outside stencil node ---@param self druid.drag ----@param node node Gui node +---@param node node|string Gui node (or node id) function druid__scroll.set_click_zone(self, node) end --- Set extra size for scroll stretching. @@ -1094,7 +1094,7 @@ function druid__scroll.set_points(self, points) end --- It will change content gui node size ---@param self druid.scroll @{Scroll} ---@param size vector3 The new size for content node ----@param offset vector3 Offset value to set, where content is starts +---@param offset? vector3 Offset value to set, where content is starts ---@return druid.scroll Current scroll instance function druid__scroll.set_size(self, size, offset) end diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index a7b510a..1b42953 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -325,7 +325,7 @@ end -- It will change content gui node size -- @tparam Scroll self @{Scroll} -- @tparam vector3 size The new size for content node --- @tparam vector3 offset Offset value to set, where content is starts +-- @tparam[opt] vector3 offset Offset value to set, where content is starts -- @treturn druid.scroll Current scroll instance function Scroll.set_size(self, size, offset) if offset then From f54347ef6c71be65f0ffa23524cb88bad2395613 Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 21:27:59 +0300 Subject: [PATCH 07/45] Fix Slider annotations --- druid/annotations.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 8ff350f..7d4737e 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1137,19 +1137,19 @@ local druid__slider = {} ---@param self druid.slider @{Slider} ---@param node node Gui pin node ---@param end_pos vector3 The end position of slider ----@param callback function On slider change callback +---@param callback? function On slider change callback function druid__slider.init(self, node, end_pos, callback) end --- Set value for slider ---@param self druid.slider @{Slider} ---@param value number Value from 0 to 1 ----@param is_silent bool Don't trigger event if true +---@param is_silent? bool Don't trigger event if true function druid__slider.set(self, value, is_silent) end --- Set input zone for slider. --- User can touch any place of node, pin instantly will move at this position and node drag will start. This function require the Defold version 1.3.0+ ---@param self druid.slider @{Slider} ----@param input_node node +---@param input_node node|string ---@return druid.slider @{Slider} function druid__slider.set_input_node(self, input_node) end From 15a24504378aee1064549e08ea880e9ed0856558 Mon Sep 17 00:00:00 2001 From: Mozok Evgen Date: Sat, 24 Aug 2024 21:35:48 +0300 Subject: [PATCH 08/45] Fix LangText annotations --- druid/annotations.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 7d4737e..330f748 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -711,21 +711,21 @@ local druid__lang_text = {} --- Format string with new text params on localized text ---@param self druid.lang_text @{LangText} ----@param a string Optional param to string.format ----@param b string Optional param to string.format ----@param c string Optional param to string.format ----@param d string Optional param to string.format ----@param e string Optional param to string.format ----@param f string Optional param to string.format ----@param g string Optional param to string.format +---@param a? string Optional param to string.format +---@param b? string Optional param to string.format +---@param c? string Optional param to string.format +---@param d? string Optional param to string.format +---@param e? string Optional param to string.format +---@param f? string Optional param to string.format +---@param g? string Optional param to string.format ---@return druid.lang_text Current instance function druid__lang_text.format(self, a, b, c, d, e, f, g) end --- The @{LangText} constructor ---@param self druid.lang_text @{LangText} ---@param node string|node Node name or GUI Text Node itself ----@param locale_id string Default locale id or text from node as default ----@param adjust_type string Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference +---@param locale_id? string Default locale id or text from node as default +---@param adjust_type? string Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference function druid__lang_text.init(self, node, locale_id, adjust_type) end --- Setup raw text to lang_text component @@ -737,13 +737,13 @@ function druid__lang_text.set_to(self, text) end --- Translate the text by locale_id ---@param self druid.lang_text @{LangText} ---@param locale_id string Locale id ----@param a string Optional param to string.format ----@param b string Optional param to string.format ----@param c string Optional param to string.format ----@param d string Optional param to string.format ----@param e string Optional param to string.format ----@param f string Optional param to string.format ----@param g string Optional param to string.format +---@param a? string Optional param to string.format +---@param b? string Optional param to string.format +---@param c? string Optional param to string.format +---@param d? string Optional param to string.format +---@param e? string Optional param to string.format +---@param f? string Optional param to string.format +---@param g? string Optional param to string.format ---@return druid.lang_text Current instance function druid__lang_text.translate(self, locale_id, a, b, c, d, e, f, g) end From 7f90ae99e6042ab3ef2d014a29b3baaff103d9ec Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 17:16:33 +0300 Subject: [PATCH 09/45] Update docs --- docs/modules/BackHandler.html | 3 +- docs/modules/Button.html | 11 +++-- docs/modules/Drag.html | 80 +++++++++++++++++++++++++++++++-- docs/modules/DruidInstance.html | 2 +- docs/modules/Hotkey.html | 35 +++++++++++++++ docs/modules/Input.html | 6 +-- docs/modules/Scroll.html | 27 ++++++++++- docs/modules/Text.html | 2 +- druid/annotations.lua | 4 +- 9 files changed, 148 insertions(+), 22 deletions(-) diff --git a/docs/modules/BackHandler.html b/docs/modules/BackHandler.html index 50d2bc5..df93b56 100644 --- a/docs/modules/BackHandler.html +++ b/docs/modules/BackHandler.html @@ -147,9 +147,8 @@ local back_handler = self.druid:new_back_handler(callback, [params])
  • params - any + any or nil - (optional)
diff --git a/docs/modules/Button.html b/docs/modules/Button.html index 2a0def6..0b8a8e9 100644 --- a/docs/modules/Button.html +++ b/docs/modules/Button.html @@ -97,7 +97,7 @@ print("Also the button component is passed in callback params") end -local custom_args = "any variable to pass inside callback" +local custom_args = "Any variable to pass inside callback" local button = self.druid:new_button("button_name", on_button_click, custom_args) @@ -153,7 +153,7 @@ local button = self.druid:new_button("button_name", on_button_click, c click_zone - Additional button click area, defined by another GUI Node + Additional button click area, defined by another GUI node hover @@ -433,7 +433,7 @@ button:set_enabled(true) Button
  • key - hash + hash or string The action_id of the input key
  • @@ -581,14 +581,13 @@ button:set_enabled(true) click_zone
    - Additional button click area, defined by another GUI Node + Additional button click area, defined by another GUI node
    • click_zone - node + node or nil - (optional)
    diff --git a/docs/modules/Drag.html b/docs/modules/Drag.html index b6ce635..e967282 100644 --- a/docs/modules/Drag.html +++ b/docs/modules/Drag.html @@ -129,6 +129,10 @@ Is component now touching + node + Drag node + + on_drag on drag progress callback(self, dx, dy, total_x, total_y) @@ -138,7 +142,7 @@ on_drag_start - Event on drag start callback(self) + Event on drag start callback(self, touch) on_touch_end @@ -149,6 +153,14 @@ Event on touch start callback(self) + screen_x + Current touch x screen position + + + screen_y + Current touch y screen position + + touch_start_pos Touch start position @@ -184,7 +196,7 @@ Drag
  • node - node + node GUI node to detect dragging
  • on_drag_callback @@ -241,7 +253,7 @@ Drag
  • node - node + node Gui node
  • @@ -392,6 +404,26 @@ +
    +
    + + node +
    +
    + Drag node + + +
      +
    • node + node + +
    • +
    + + + + +
    @@ -438,7 +470,7 @@ on_drag_start
    - Event on drag start callback(self) + Event on drag start callback(self, touch)
      @@ -492,6 +524,46 @@ +
    +
    + + screen_x +
    +
    + Current touch x screen position + + +
      +
    • screen_x + number + +
    • +
    + + + + + +
    +
    + + screen_y +
    +
    + Current touch y screen position + + +
      +
    • screen_y + number + +
    • +
    + + + + +
    diff --git a/docs/modules/DruidInstance.html b/docs/modules/DruidInstance.html index 2e0ae35..1811027 100644 --- a/docs/modules/DruidInstance.html +++ b/docs/modules/DruidInstance.html @@ -1211,7 +1211,7 @@ end Message from on_message
  • sender - hash + url Sender from on_message
  • diff --git a/docs/modules/Hotkey.html b/docs/modules/Hotkey.html index 3cd5a00..bf191fb 100644 --- a/docs/modules/Hotkey.html +++ b/docs/modules/Hotkey.html @@ -90,6 +90,10 @@ init(self, keys, callback, callback_argument) The Hotkey constructor + + set_repeat(self, is_enabled_repeated) + If true, the callback will be triggered on action.repeated +

    Tables

    @@ -192,6 +196,37 @@ + +
    + + set_repeat(self, is_enabled_repeated) +
    +
    + If true, the callback will be triggered on action.repeated + + +

    Parameters:

    +
      +
    • self + Hotkey + Hotkey +
    • +
    • is_enabled_repeated + bool + The flag value +
    • +
    + +

    Returns:

    +
      + + Hotkey + +
    + + + +

    Tables

    diff --git a/docs/modules/Input.html b/docs/modules/Input.html index 14e605b..0434ec0 100644 --- a/docs/modules/Input.html +++ b/docs/modules/Input.html @@ -477,9 +477,8 @@ @@ -578,9 +577,8 @@
    • max_length - number + number or nil - (optional)
    diff --git a/docs/modules/Scroll.html b/docs/modules/Scroll.html index 0c390a4..3cb1fac 100644 --- a/docs/modules/Scroll.html +++ b/docs/modules/Scroll.html @@ -177,6 +177,10 @@

    Fields

    + + + + @@ -817,6 +821,26 @@

    Fields

    +
    + + _is_inert +
    +
    + Flag, if scroll now moving by inertion + + +
      +
    • _is_inert + bool + +
    • +
    + + + + + +
    available_pos @@ -1027,9 +1051,8 @@
    • selected - number + number or nil - (optional)
    diff --git a/docs/modules/Text.html b/docs/modules/Text.html index 179c6cb..d4db3a6 100644 --- a/docs/modules/Text.html +++ b/docs/modules/Text.html @@ -544,7 +544,7 @@ Text
  • adjust_type - number or nil + string or nil See const.TEXT_ADJUST. If pass nil - use current adjust type
  • minimal_scale diff --git a/druid/annotations.lua b/druid/annotations.lua index efd981f..e6c25f9 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -390,12 +390,12 @@ function druid__data_list.set_data(self, data) end ---@field on_drag_start druid.event Event on drag start callback(self, touch) ---@field on_touch_end druid.event Event on touch end callback(self) ---@field on_touch_start druid.event Event on touch start callback(self) +---@field screen_x number Current touch x screen position +---@field screen_y number Current touch y screen position ---@field style druid.drag.style Component style params. ---@field touch_start_pos vector3 Touch start position ---@field x number Current touch x position ---@field y number Current touch y position ----@field screen_x number Current touch x screen position ----@field screen_y number Current touch y screen position local druid__drag = {} --- The @{Drag} constructor From 5f2ae1eb0daea470bb283c755a51ad9144cc0902 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 17:18:55 +0300 Subject: [PATCH 10/45] Add Defold annotations --- annotations/defold/b2d.body.lua | 275 +++++ annotations/defold/b2d.lua | 27 + annotations/defold/bit.lua | 104 ++ annotations/defold/buffer.lua | 107 ++ annotations/defold/builtins.lua | 32 + annotations/defold/camera.lua | 26 + annotations/defold/collectionfactory.lua | 86 ++ annotations/defold/collectionproxy.lua | 40 + annotations/defold/crash.lua | 117 ++ annotations/defold/factory.lua | 78 ++ annotations/defold/go.lua | 355 +++++++ annotations/defold/gui.lua | 1236 ++++++++++++++++++++++ annotations/defold/html5.lua | 37 + annotations/defold/http.lua | 49 + annotations/defold/image.lua | 78 ++ annotations/defold/json.lua | 41 + annotations/defold/label.lua | 28 + annotations/defold/liveupdate.lua | 155 +++ annotations/defold/model.lua | 92 ++ annotations/defold/msg.lua | 54 + annotations/defold/particlefx.lua | 85 ++ annotations/defold/physics.lua | 300 ++++++ annotations/defold/profiler.lua | 126 +++ annotations/defold/render.lua | 674 ++++++++++++ annotations/defold/resource.lua | 760 +++++++++++++ annotations/defold/socket.lua | 173 +++ annotations/defold/sound.lua | 160 +++ annotations/defold/sprite.lua | 62 ++ annotations/defold/sys.lua | 314 ++++++ annotations/defold/tilemap.lua | 90 ++ annotations/defold/timer.lua | 68 ++ annotations/defold/types.lua | 111 ++ annotations/defold/vmath.lua | 404 +++++++ annotations/defold/window.lua | 110 ++ annotations/defold/zlib.lua | 28 + 35 files changed, 6482 insertions(+) create mode 100644 annotations/defold/b2d.body.lua create mode 100644 annotations/defold/b2d.lua create mode 100644 annotations/defold/bit.lua create mode 100644 annotations/defold/buffer.lua create mode 100644 annotations/defold/builtins.lua create mode 100644 annotations/defold/camera.lua create mode 100644 annotations/defold/collectionfactory.lua create mode 100644 annotations/defold/collectionproxy.lua create mode 100644 annotations/defold/crash.lua create mode 100644 annotations/defold/factory.lua create mode 100644 annotations/defold/go.lua create mode 100644 annotations/defold/gui.lua create mode 100644 annotations/defold/html5.lua create mode 100644 annotations/defold/http.lua create mode 100644 annotations/defold/image.lua create mode 100644 annotations/defold/json.lua create mode 100644 annotations/defold/label.lua create mode 100644 annotations/defold/liveupdate.lua create mode 100644 annotations/defold/model.lua create mode 100644 annotations/defold/msg.lua create mode 100644 annotations/defold/particlefx.lua create mode 100644 annotations/defold/physics.lua create mode 100644 annotations/defold/profiler.lua create mode 100644 annotations/defold/render.lua create mode 100644 annotations/defold/resource.lua create mode 100644 annotations/defold/socket.lua create mode 100644 annotations/defold/sound.lua create mode 100644 annotations/defold/sprite.lua create mode 100644 annotations/defold/sys.lua create mode 100644 annotations/defold/tilemap.lua create mode 100644 annotations/defold/timer.lua create mode 100644 annotations/defold/types.lua create mode 100644 annotations/defold/vmath.lua create mode 100644 annotations/defold/window.lua create mode 100644 annotations/defold/zlib.lua diff --git a/annotations/defold/b2d.body.lua b/annotations/defold/b2d.body.lua new file mode 100644 index 0000000..b4e9b82 --- /dev/null +++ b/annotations/defold/b2d.body.lua @@ -0,0 +1,275 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Box2D b2Body documentation + + Functions for interacting with Box2D bodies. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.b2d.body +b2d.body = {} + +---Dynamic body +b2d.body.B2_DYNAMIC_BODY = nil + +---Kinematic body +b2d.body.B2_KINEMATIC_BODY = nil + +---Static (immovable) body +b2d.body.B2_STATIC_BODY = nil + +---Apply an angular impulse. +---@param body b2Body body +---@param impulse number impulse the angular impulse in units of kgmm/s +function b2d.body.apply_angular_impulse(body, impulse) end + +---Apply a force at a world point. If the force is not +---applied at the center of mass, it will generate a torque and +---affect the angular velocity. This wakes up the body. +---@param body b2Body body +---@param force vector3 the world force vector, usually in Newtons (N). +---@param point vector3 the world position of the point of application. +function b2d.body.apply_force(body, force, point) end + +---Apply a force to the center of mass. This wakes up the body. +---@param body b2Body body +---@param force vector3 the world force vector, usually in Newtons (N). +function b2d.body.apply_force_to_center(body, force) end + +---Apply an impulse at a point. This immediately modifies the velocity. +---It also modifies the angular velocity if the point of application +---is not at the center of mass. This wakes up the body. +---@param body b2Body body +---@param impulse vector3 the world impulse vector, usually in N-seconds or kg-m/s. +---@param point vector3 the world position of the point of application. +function b2d.body.apply_linear_impulse(body, impulse, point) end + +---Apply a torque. This affects the angular velocity +---without affecting the linear velocity of the center of mass. +---This wakes up the body. +---@param body b2Body body +---@param torque number torque about the z-axis (out of the screen), usually in N-m. +function b2d.body.apply_torque(body, torque) end + +---Print the body representation to the log output +---@param body b2Body body +function b2d.body.dump(body) end + +---Get the angular damping of the body. +---@param body b2Body body +---@return number damping the damping +function b2d.body.get_angular_damping(body) end + +---Get the angular velocity. +---@param body b2Body body +---@return number velocity the angular velocity in radians/second. +function b2d.body.get_angular_velocity(body) end + +---Set the angular velocity. +---@param body b2Body body +---@param omega number the new angular velocity in radians/second. +function b2d.body.get_angular_velocity(body, omega) end + +---Get the gravity scale of the body. +---@param body b2Body body +---@return number scale the scale +function b2d.body.get_gravity_scale(body) end + +---Get the rotational inertia of the body about the local origin. +---@param body b2Body body +---@return number inertia the rotational inertia, usually in kg-m^2. +function b2d.body.get_inertia(body) end + +---Get the linear damping of the body. +---@param body b2Body body +---@return number damping the damping +function b2d.body.get_linear_damping(body) end + +---Get the linear velocity of the center of mass. +---@param body b2Body body +---@return vector3 velocity the linear velocity of the center of mass. +function b2d.body.get_linear_velocity(body) end + +---Get the world velocity of a local point. +---@param body b2Body body +---@param world_point vector3 a point in local coordinates. +---@return vector3 velocity the world velocity of a point. +function b2d.body.get_linear_velocity_from_world_point(body, world_point) end + +---Get the world linear velocity of a world point attached to this body. +---@param body b2Body body +---@param world_point vector3 a point in world coordinates. +---@return vector3 velocity the world velocity of a point. +function b2d.body.get_linear_velocity_from_world_point(body, world_point) end + +---Get the local position of the center of mass. +---@param body b2Body body +---@return vector3 center Get the local position of the center of mass. +function b2d.body.get_local_center(body) end + +---Gets a local point relative to the body's origin given a world point. +---@param body b2Body body +---@param world_point vector3 a point in world coordinates. +---@return vector3 vector the corresponding local point relative to the body's origin. +function b2d.body.get_local_point(body, world_point) end + +---Gets a local vector given a world vector. +---@param body b2Body body +---@param world_vector vector3 a vector in world coordinates. +---@return vector3 vector the corresponding local vector. +function b2d.body.get_local_vector(body, world_vector) end + +---Get the total mass of the body. +---@param body b2Body body +---@return number mass the mass, usually in kilograms (kg). +function b2d.body.get_mass(body) end + +---Get the next body in the world's body list. +---@param body b2Body body +---@return b2Body body the next body +function b2d.body.get_next(body) end + +---Get the world body origin position. +---@param body b2Body body +---@return vector3 position the world position of the body's origin. +function b2d.body.get_position(body) end + +---Get the type of this body. +---@param body b2Body body +---@return b2BodyType type the body type +function b2d.body.get_type(body) end + +---Get the parent world of this body. +---@param body b2Body body +---@return b2World world +function b2d.body.get_world(body) end + +---Get the angle in radians. +---@param body b2Body body +---@return number angle the current world rotation angle in radians. +function b2d.body.get_world_center(body) end + +---Get the world position of the center of mass. +---@param body b2Body body +---@return vector3 center Get the world position of the center of mass. +function b2d.body.get_world_center(body) end + +---Get the world coordinates of a point given the local coordinates. +---@param body b2Body body +---@param local_vector vector3 localPoint a point on the body measured relative the the body's origin. +---@return vector3 vector the same point expressed in world coordinates. +function b2d.body.get_world_point(body, local_vector) end + +---Get the world coordinates of a vector given the local coordinates. +---@param body b2Body body +---@param local_vector vector3 a vector fixed in the body. +---@return vector3 vector the same vector expressed in world coordinates. +function b2d.body.get_world_vector(body, local_vector) end + +---Get the active state of the body. +---@param body b2Body body +---@return bool enabled is the body active +function b2d.body.is_active(body) end + +---Get the sleeping state of this body. +---@param body b2Body body +---@return bool enabled true if the body is awake, false if it's sleeping. +function b2d.body.is_awake(body) end + +---Is this body in bullet mode +---@param body b2Body body +---@return bool enabled true if the body is in bullet mode +function b2d.body.is_bullet(body) end + +---Does this body have fixed rotation? +---@param body b2Body body +---@return bool enabled is the rotation fixed +function b2d.body.is_fixed_rotation(body) end + +---Is this body allowed to sleep +---@param body b2Body body +---@return bool enabled true if the body is allowed to sleep +function b2d.body.is_sleeping_allowed(body) end + +---This resets the mass properties to the sum of the mass properties of the fixtures. +---This normally does not need to be called unless you called SetMassData to override +---@param body b2Body body +function b2d.body.reset_mass_data(body) end + +---Set the active state of the body. An inactive body is not +---simulated and cannot be collided with or woken up. +---If you pass a flag of true, all fixtures will be added to the +---broad-phase. +---If you pass a flag of false, all fixtures will be removed from +---the broad-phase and all contacts will be destroyed. +---Fixtures and joints are otherwise unaffected. You may continue +---to create/destroy fixtures and joints on inactive bodies. +---Fixtures on an inactive body are implicitly inactive and will +---not participate in collisions, ray-casts, or queries. +---Joints connected to an inactive body are implicitly inactive. +---An inactive body is still owned by a b2World object and remains +---in the body list. +---@param body b2Body body +---@param enable bool true if the body should be active +function b2d.body.set_active(body, enable) end + +---Set the angular damping of the body. +---@param body b2Body body +---@param damping number the damping +function b2d.body.set_angular_damping(body, damping) end + +---Set the sleep state of the body. A sleeping body has very low CPU cost. +---@param body b2Body body +---@param enable bool flag set to false to put body to sleep, true to wake it. +function b2d.body.set_awake(body, enable) end + +---Should this body be treated like a bullet for continuous collision detection? +---@param body b2Body body +---@param enable bool if true, the body will be in bullet mode +function b2d.body.set_bullet(body, enable) end + +---Set this body to have fixed rotation. This causes the mass to be reset. +---@param body b2Body body +---@param enable bool true if the rotation should be fixed +function b2d.body.set_fixed_rotation(body, enable) end + +---Set the gravity scale of the body. +---@param body b2Body body +---@param scale number the scale +function b2d.body.set_gravity_scale(body, scale) end + +---Set the linear damping of the body. +---@param body b2Body body +---@param damping number the damping +function b2d.body.set_linear_damping(body, damping) end + +---Set the linear velocity of the center of mass. +---@param body b2Body body +---@param velocity vector3 the new linear velocity of the center of mass. +function b2d.body.set_linear_velocity(body, velocity) end + +---You can disable sleeping on this body. If you disable sleeping, the body will be woken. +---@param body b2Body body +---@param enable bool if false, the body will never sleep, and consume more CPU +function b2d.body.set_sleeping_allowed(body, enable) end + +---Set the position of the body's origin and rotation. +---This breaks any contacts and wakes the other bodies. +---Manipulating a body's transform may cause non-physical behavior. +---@param body b2Body body +---@param position vector3 the world position of the body's local origin. +---@param angle number the world position of the body's local origin. +function b2d.body.set_transform(body, position, angle) end + +---Set the type of this body. This may alter the mass and velocity. +---@param body b2Body body +---@param type b2BodyType the body type +function b2d.body.set_type(body, type) end + +return b2d.body \ No newline at end of file diff --git a/annotations/defold/b2d.lua b/annotations/defold/b2d.lua new file mode 100644 index 0000000..45d5bdd --- /dev/null +++ b/annotations/defold/b2d.lua @@ -0,0 +1,27 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Box2D documentation + + Functions for interacting with Box2D. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.b2d +b2d = {} + +---Get the Box2D body from a collision object +---@param url string|hash|url the url to the game object collision component +---@return b2Body body the body if successful. Otherwise nil. +function b2d.get_body(url) end + +---Get the Box2D world from the current collection +---@return b2World world the world if successful. Otherwise nil. +function b2d.get_world() end + +return b2d \ No newline at end of file diff --git a/annotations/defold/bit.lua b/annotations/defold/bit.lua new file mode 100644 index 0000000..d11b857 --- /dev/null +++ b/annotations/defold/bit.lua @@ -0,0 +1,104 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Bitwise operations API documentation + + Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers. + Lua BitOp is Copyright © 2008-2012 Mike Pall. + Lua BitOp is free software, released under the MIT license (same license as the Lua core). + Lua BitOp is compatible with the built-in bitwise operations in LuaJIT 2.0 and is used + on platforms where Defold runs without LuaJIT. + For clarity the examples assume the definition of a helper function printx(). + This prints its argument as an unsigned 32 bit hexadecimal number on all platforms: + function printx(x) + print("0x"..bit.tohex(x)) + end +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.bit +bit = {} + +---Returns the bitwise arithmetic right-shift of its first argument by the number of bits given by the second argument. +---Arithmetic right-shift treats the most-significant bit as a sign bit and replicates it. +---Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). +---@param x number number +---@param n number number of bits +---@return number y bitwise arithmetic right-shifted number +function bit.arshift(x, n) end + +---Returns the bitwise and of all of its arguments. Note that more than two arguments are allowed. +---@param x1 number number +---@param ... number|nil number(s) +---@return number y bitwise and of the provided arguments +function bit.band(x1, ...) end + +---Returns the bitwise not of its argument. +---@param x number number +---@return number y bitwise not of number x +function bit.bnot(x) end + +---Returns the bitwise or of all of its arguments. Note that more than two arguments are allowed. +---@param x1 number number +---@param ... number|nil number(s) +---@return number y bitwise or of the provided arguments +function bit.bor(x1, ...) end + +---Swaps the bytes of its argument and returns it. This can be used to convert little-endian 32 bit numbers to big-endian 32 bit numbers or vice versa. +---@param x number number +---@return number y bitwise swapped number +function bit.bswap(x) end + +---Returns the bitwise xor of all of its arguments. Note that more than two arguments are allowed. +---@param x1 number number +---@param ... number|nil number(s) +---@return number y bitwise xor of the provided arguments +function bit.bxor(x1, ...) end + +---Returns the bitwise logical left-shift of its first argument by the number of bits given by the second argument. +---Logical shifts treat the first argument as an unsigned number and shift in 0-bits. +---Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). +---@param x number number +---@param n number number of bits +---@return number y bitwise logical left-shifted number +function bit.lshift(x, n) end + +---Returns the bitwise left rotation of its first argument by the number of bits given by the second argument. Bits shifted out on one side are shifted back in on the other side. +---Only the lower 5 bits of the rotate count are used (reduces to the range [0..31]). +---@param x number number +---@param n number number of bits +---@return number y bitwise left-rotated number +function bit.rol(x, n) end + +---Returns the bitwise right rotation of its first argument by the number of bits given by the second argument. Bits shifted out on one side are shifted back in on the other side. +---Only the lower 5 bits of the rotate count are used (reduces to the range [0..31]). +---@param x number number +---@param n number number of bits +---@return number y bitwise right-rotated number +function bit.ror(x, n) end + +---Returns the bitwise logical right-shift of its first argument by the number of bits given by the second argument. +---Logical shifts treat the first argument as an unsigned number and shift in 0-bits. +---Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). +---@param x number number +---@param n number number of bits +---@return number y bitwise logical right-shifted number +function bit.rshift(x, n) end + +---Normalizes a number to the numeric range for bit operations and returns it. This function is usually not needed since all bit operations already normalize all of their input arguments. +---@param x number number to normalize +---@return number y normalized number +function bit.tobit(x) end + +---Converts its first argument to a hex string. The number of hex digits is given by the absolute value of the optional second argument. Positive numbers between 1 and 8 generate lowercase hex digits. Negative numbers generate uppercase hex digits. Only the least-significant 4*|n| bits are used. The default is to generate 8 lowercase hex digits. +---@param x number number to convert +---@param n number number of hex digits to return +---@return string s hexadecimal string +function bit.tohex(x, n) end + +return bit \ No newline at end of file diff --git a/annotations/defold/buffer.lua b/annotations/defold/buffer.lua new file mode 100644 index 0000000..5bc4166 --- /dev/null +++ b/annotations/defold/buffer.lua @@ -0,0 +1,107 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Buffer API documentation + + Functions for manipulating buffers and streams +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.buffer +buffer = {} + +---Float, single precision, 4 bytes +buffer.VALUE_TYPE_FLOAT32 = nil + +---Signed integer, 2 bytes +buffer.VALUE_TYPE_INT16 = nil + +---Signed integer, 4 bytes +buffer.VALUE_TYPE_INT32 = nil + +---Signed integer, 8 bytes +buffer.VALUE_TYPE_INT64 = nil + +---Signed integer, 1 byte +buffer.VALUE_TYPE_INT8 = nil + +---Unsigned integer, 2 bytes +buffer.VALUE_TYPE_UINT16 = nil + +---Unsigned integer, 4 bytes +buffer.VALUE_TYPE_UINT32 = nil + +---Unsigned integer, 8 bytes +buffer.VALUE_TYPE_UINT64 = nil + +---Unsigned integer, 1 byte +buffer.VALUE_TYPE_UINT8 = nil + +---Copy all data streams from one buffer to another, element wise. +--- Each of the source streams must have a matching stream in the +---destination buffer. The streams must match in both type and size. +---The source and destination buffer can be the same. +---@param dst buffer_data the destination buffer +---@param dstoffset number the offset to start copying data to +---@param src buffer_data the source data buffer +---@param srcoffset number the offset to start copying data from +---@param count number the number of elements to copy +function buffer.copy_buffer(dst, dstoffset, src, srcoffset, count) end + +---Copy a specified amount of data from one stream to another. +--- The value type and size must match between source and destination streams. +---The source and destination streams can be the same. +---@param dst buffer_stream the destination stream +---@param dstoffset number the offset to start copying data to (measured in value type) +---@param src buffer_stream the source data stream +---@param srcoffset number the offset to start copying data from (measured in value type) +---@param count number the number of values to copy (measured in value type) +function buffer.copy_stream(dst, dstoffset, src, srcoffset, count) end + +---Create a new data buffer containing a specified set of streams. A data buffer +---can contain one or more streams with typed data. This is useful for managing +---compound data, for instance a vertex buffer could contain separate streams for +---vertex position, color, normal etc. +---@param element_count number The number of elements the buffer should hold +---@param declaration { name:hash|string, type:constant, count:number }[] A table where each entry (table) describes a stream +--- +---hash | string name: The name of the stream +---constant type: The data type of the stream +---number count: The number of values each element should hold +--- +---@return buffer_data buffer the new buffer +function buffer.create(element_count, declaration) end + +---Get a copy of all the bytes from a specified stream as a Lua string. +---@param buffer buffer_data the source buffer +---@param stream_name hash the name of the stream +---@return string data the buffer data as a Lua string +function buffer.get_bytes(buffer, stream_name) end + +---Get a named metadata entry from a buffer along with its type. +---@param buf buffer_data the buffer to get the metadata from +---@param metadata_name hash|string name of the metadata entry +---@return number[]|nil values table of metadata values or nil if the entry does not exist +---@return constant|nil value_type numeric type of values or nil +function buffer.get_metadata(buf, metadata_name) end + +---Get a specified stream from a buffer. +---@param buffer buffer_data the buffer to get the stream from +---@param stream_name hash|string the stream name +---@return buffer_stream stream the data stream +function buffer.get_stream(buffer, stream_name) end + +---Creates or updates a metadata array entry on a buffer. +--- The value type and count given when updating the entry should match those used when first creating it. +---@param buf buffer_data the buffer to set the metadata on +---@param metadata_name hash|string name of the metadata entry +---@param values number[] actual metadata, an array of numeric values +---@param value_type constant type of values when stored +function buffer.set_metadata(buf, metadata_name, values, value_type) end + +return buffer \ No newline at end of file diff --git a/annotations/defold/builtins.lua b/annotations/defold/builtins.lua new file mode 100644 index 0000000..5a182a5 --- /dev/null +++ b/annotations/defold/builtins.lua @@ -0,0 +1,32 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Built-ins API documentation + + Built-in scripting functions. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---All ids in the engine are represented as hashes, so a string needs to be hashed +---before it can be compared with an id. +---@param s string string to hash +---@return hash hash a hashed string +function hash(s) end + +---Returns a hexadecimal representation of a hash value. +---The returned string is always padded with leading zeros. +---@param h hash hash value to get hex string for +---@return string hex hex representation of the hash +function hash_to_hex(h) end + +---Pretty printing of Lua values. This function prints Lua values +---in a manner similar to +print()+, but will also recurse into tables +---and pretty print them. There is a limit to how deep the function +---will recurse. +---@param ... any value to print +function pprint(...) end \ No newline at end of file diff --git a/annotations/defold/camera.lua b/annotations/defold/camera.lua new file mode 100644 index 0000000..8cc9f9f --- /dev/null +++ b/annotations/defold/camera.lua @@ -0,0 +1,26 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Camera API documentation + + Messages to control camera components and camera focus. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.camera +camera = {} + +---makes camera active +---@param url string|hash|url url of camera component +function camera.acquire_focus(url) end + +---deactivate camera +---@param url string|hash|url url of camera component +function camera.release_focus(url) end + +return camera \ No newline at end of file diff --git a/annotations/defold/collectionfactory.lua b/annotations/defold/collectionfactory.lua new file mode 100644 index 0000000..d21caf8 --- /dev/null +++ b/annotations/defold/collectionfactory.lua @@ -0,0 +1,86 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Collection factory API documentation + + Functions for controlling collection factory components which are + used to dynamically spawn collections into the runtime. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.collectionfactory +collectionfactory = {} + +---loaded +collectionfactory.STATUS_LOADED = nil + +---loading +collectionfactory.STATUS_LOADING = nil + +---unloaded +collectionfactory.STATUS_UNLOADED = nil + +---The URL identifies the collectionfactory component that should do the spawning. +---Spawning is instant, but spawned game objects get their first update calls the following frame. The supplied parameters for position, rotation and scale +---will be applied to the whole collection when spawned. +---Script properties in the created game objects can be overridden through +---a properties-parameter table. The table should contain game object ids +---(hash) as keys and property tables as values to be used when initiating each +---spawned game object. +---See go.property for more information on script properties. +---The function returns a table that contains a key for each game object +---id (hash), as addressed if the collection file was top level, and the +---corresponding spawned instance id (hash) as value with a unique path +---prefix added to each instance. +--- Calling collectionfactory.create create on a collection factory that is marked as dynamic without having loaded resources +---using collectionfactory.load will synchronously load and create resources which may affect application performance. +---@param url string|hash|url the collection factory component to be used +---@param position vector3|nil position to assign to the newly spawned collection +---@param rotation quaternion|nil rotation to assign to the newly spawned collection +---@param properties table|nil table of script properties to propagate to any new game object instances +---@param scale number|nil uniform scaling to apply to the newly spawned collection (must be greater than 0). +---@return table ids a table mapping the id:s from the collection to the new instance id:s +function collectionfactory.create(url, position, rotation, properties, scale) end + +---This returns status of the collection factory. +---Calling this function when the factory is not marked as dynamic loading always returns COMP_COLLECTION_FACTORY_STATUS_LOADED. +---@param url string|hash|url|nil the collection factory component to get status from +---@return constant status status of the collection factory component +--- +---collectionfactory.STATUS_UNLOADED +---collectionfactory.STATUS_LOADING +---collectionfactory.STATUS_LOADED +--- +function collectionfactory.get_status(url) end + +---Resources loaded are referenced by the collection factory component until the existing (parent) collection is destroyed or collectionfactory.unload is called. +---Calling this function when the factory is not marked as dynamic loading does nothing. +---@param url string|hash|url|nil the collection factory component to load +---@param complete_function fun(self, url, result)|nil function to call when resources are loaded. +--- +---self +---object The current object. +---url +---url url of the collection factory component +---result +---boolean True if resource were loaded successfully +--- +function collectionfactory.load(url, complete_function) end + +---Changes the prototype for the collection factory. +---Setting the prototype to "nil" will revert back to the original prototype. +---@param url string|hash|url|nil the collection factory component +---@param prototype string|nil the path to the new prototype, or nil +function collectionfactory.set_prototype(url, prototype) end + +---This decreases the reference count for each resource loaded with collectionfactory.load. If reference is zero, the resource is destroyed. +---Calling this function when the factory is not marked as dynamic loading does nothing. +---@param url string|hash|url|nil the collection factory component to unload +function collectionfactory.unload(url) end + +return collectionfactory \ No newline at end of file diff --git a/annotations/defold/collectionproxy.lua b/annotations/defold/collectionproxy.lua new file mode 100644 index 0000000..f8a3101 --- /dev/null +++ b/annotations/defold/collectionproxy.lua @@ -0,0 +1,40 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Collection proxy API documentation + + Messages for controlling and interacting with collection proxies + which are used to dynamically load collections into the runtime. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.collectionproxy +collectionproxy = {} + +---return an indexed table of resources for a collection proxy. Each +---entry is a hexadecimal string that represents the data of the specific +---resource. This representation corresponds with the filename for each +---individual resource that is exported when you bundle an application with +---LiveUpdate functionality. +---@param collectionproxy url the collectionproxy to check for resources. +---@return string[] resources the resources +function collectionproxy.get_resources(collectionproxy) end + +---return an array of missing resources for a collection proxy. Each +---entry is a hexadecimal string that represents the data of the specific +---resource. This representation corresponds with the filename for each +---individual resource that is exported when you bundle an application with +---LiveUpdate functionality. It should be considered good practise to always +---check whether or not there are any missing resources in a collection proxy +---before attempting to load the collection proxy. +---@param collectionproxy url the collectionproxy to check for missing +---resources. +---@return string[] resources the missing resources +function collectionproxy.missing_resources(collectionproxy) end + +return collectionproxy \ No newline at end of file diff --git a/annotations/defold/crash.lua b/annotations/defold/crash.lua new file mode 100644 index 0000000..8534335 --- /dev/null +++ b/annotations/defold/crash.lua @@ -0,0 +1,117 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Crash API documentation + + Native crash logging functions and constants. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.crash +crash = {} + +---android build fingerprint +crash.SYSFIELD_ANDROID_BUILD_FINGERPRINT = nil + +---system device language as reported by sys.get_sys_info +crash.SYSFIELD_DEVICE_LANGUAGE = nil + +---device model as reported by sys.get_sys_info +crash.SYSFIELD_DEVICE_MODEL = nil + +---engine version as hash +crash.SYSFIELD_ENGINE_HASH = nil + +---engine version as release number +crash.SYSFIELD_ENGINE_VERSION = nil + +---system language as reported by sys.get_sys_info +crash.SYSFIELD_LANGUAGE = nil + +---device manufacturer as reported by sys.get_sys_info +crash.SYSFIELD_MANUFACTURER = nil + +---The max number of sysfields. +crash.SYSFIELD_MAX = nil + +---system name as reported by sys.get_sys_info +crash.SYSFIELD_SYSTEM_NAME = nil + +---system version as reported by sys.get_sys_info +crash.SYSFIELD_SYSTEM_VERSION = nil + +---system territory as reported by sys.get_sys_info +crash.SYSFIELD_TERRITORY = nil + +---The max number of user fields. +crash.USERFIELD_MAX = nil + +---The max size of a single user field. +crash.USERFIELD_SIZE = nil + +---A table is returned containing the addresses of the call stack. +---@param handle number crash dump handle +---@return table backtrace table containing the backtrace +function crash.get_backtrace(handle) end + +---The format of read text blob is platform specific +---and not guaranteed +---but can be useful for manual inspection. +---@param handle number crash dump handle +---@return string blob string with the platform specific data +function crash.get_extra_data(handle) end + +---The function returns a table containing entries with sub-tables that +---have fields 'name' and 'address' set for all loaded modules. +---@param handle number crash dump handle +---@return { name:string, address:string }[] modules module table +function crash.get_modules(handle) end + +---read signal number from a crash report +---@param handle number crash dump handle +---@return number signal signal number +function crash.get_signum(handle) end + +---reads a system field from a loaded crash dump +---@param handle number crash dump handle +---@param index number system field enum. Must be less than crash.SYSFIELD_MAX +---@return string|nil value value recorded in the crash dump, or nil if it didn't exist +function crash.get_sys_field(handle, index) end + +---reads user field from a loaded crash dump +---@param handle number crash dump handle +---@param index number user data slot index +---@return string value user data value recorded in the crash dump +function crash.get_user_field(handle, index) end + +---The crash dump will be removed from disk upon a successful +---load, so loading is one-shot. +---@return number|nil handle handle to the loaded dump, or nil if no dump was found +function crash.load_previous() end + +---releases a previously loaded crash dump +---@param handle number handle to loaded crash dump +function crash.release(handle) end + +---Crashes occuring before the path is set will be stored to a default engine location. +---@param path string file path to use +function crash.set_file_path(path) end + +---Store a user value that will get written to a crash dump when +---a crash occurs. This can be user id:s, breadcrumb data etc. +---There are 32 slots indexed from 0. Each slot stores at most 255 characters. +---@param index number slot index. 0-indexed +---@param value string string value to store +function crash.set_user_field(index, value) end + +---Performs the same steps as if a crash had just occured but +---allows the program to continue. +---The generated dump can be read by crash.load_previous +function crash.write_dump() end + +return crash \ No newline at end of file diff --git a/annotations/defold/factory.lua b/annotations/defold/factory.lua new file mode 100644 index 0000000..6a0bf8e --- /dev/null +++ b/annotations/defold/factory.lua @@ -0,0 +1,78 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Factory API documentation + + Functions for controlling factory components which are used to + dynamically spawn game objects into the runtime. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.factory +factory = {} + +---loaded +factory.STATUS_LOADED = nil + +---loading +factory.STATUS_LOADING = nil + +---unloaded +factory.STATUS_UNLOADED = nil + +---The URL identifies which factory should create the game object. +---If the game object is created inside of the frame (e.g. from an update callback), the game object will be created instantly, but none of its component will be updated in the same frame. +---Properties defined in scripts in the created game object can be overridden through the properties-parameter below. +---See go.property for more information on script properties. +--- Calling factory.create on a factory that is marked as dynamic without having loaded resources +---using factory.load will synchronously load and create resources which may affect application performance. +---@param url string|hash|url the factory that should create a game object. +---@param position vector3|nil the position of the new game object, the position of the game object calling factory.create() is used by default, or if the value is nil. +---@param rotation quaternion|nil the rotation of the new game object, the rotation of the game object calling factory.create() is used by default, or if the value is nil. +---@param properties table|nil the properties defined in a script attached to the new game object. +---@param scale number|vector3|nil the scale of the new game object (must be greater than 0), the scale of the game object containing the factory is used by default, or if the value is nil +---@return hash id the global id of the spawned game object +function factory.create(url, position, rotation, properties, scale) end + +---This returns status of the factory. +---Calling this function when the factory is not marked as dynamic loading always returns +---factory.STATUS_LOADED. +---@param url string|hash|url|nil the factory component to get status from +---@return constant status status of the factory component +--- +---factory.STATUS_UNLOADED +---factory.STATUS_LOADING +---factory.STATUS_LOADED +--- +function factory.get_status(url) end + +---Resources are referenced by the factory component until the existing (parent) collection is destroyed or factory.unload is called. +---Calling this function when the factory is not marked as dynamic loading does nothing. +---@param url string|hash|url|nil the factory component to load +---@param complete_function fun(self, url, result)|nil function to call when resources are loaded. +--- +---self +---object The current object. +---url +---url url of the factory component +---result +---boolean True if resources were loaded successfully +--- +function factory.load(url, complete_function) end + +---Changes the prototype for the factory. +---@param url string|hash|url|nil the factory component +---@param prototype string|nil the path to the new prototype, or nil +function factory.set_prototype(url, prototype) end + +---This decreases the reference count for each resource loaded with factory.load. If reference is zero, the resource is destroyed. +---Calling this function when the factory is not marked as dynamic loading does nothing. +---@param url string|hash|url|nil the factory component to unload +function factory.unload(url) end + +return factory \ No newline at end of file diff --git a/annotations/defold/go.lua b/annotations/defold/go.lua new file mode 100644 index 0000000..131c554 --- /dev/null +++ b/annotations/defold/go.lua @@ -0,0 +1,355 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Game object API documentation + + Functions, core hooks, messages and constants for manipulation of + game objects. The "go" namespace is accessible from game object script + files. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.go +go = {} + +---in-back +go.EASING_INBACK = nil + +---in-bounce +go.EASING_INBOUNCE = nil + +---in-circlic +go.EASING_INCIRC = nil + +---in-cubic +go.EASING_INCUBIC = nil + +---in-elastic +go.EASING_INELASTIC = nil + +---in-exponential +go.EASING_INEXPO = nil + +---in-out-back +go.EASING_INOUTBACK = nil + +---in-out-bounce +go.EASING_INOUTBOUNCE = nil + +---in-out-circlic +go.EASING_INOUTCIRC = nil + +---in-out-cubic +go.EASING_INOUTCUBIC = nil + +---in-out-elastic +go.EASING_INOUTELASTIC = nil + +---in-out-exponential +go.EASING_INOUTEXPO = nil + +---in-out-quadratic +go.EASING_INOUTQUAD = nil + +---in-out-quartic +go.EASING_INOUTQUART = nil + +---in-out-quintic +go.EASING_INOUTQUINT = nil + +---in-out-sine +go.EASING_INOUTSINE = nil + +---in-quadratic +go.EASING_INQUAD = nil + +---in-quartic +go.EASING_INQUART = nil + +---in-quintic +go.EASING_INQUINT = nil + +---in-sine +go.EASING_INSINE = nil + +---linear interpolation +go.EASING_LINEAR = nil + +---out-back +go.EASING_OUTBACK = nil + +---out-bounce +go.EASING_OUTBOUNCE = nil + +---out-circlic +go.EASING_OUTCIRC = nil + +---out-cubic +go.EASING_OUTCUBIC = nil + +---out-elastic +go.EASING_OUTELASTIC = nil + +---out-exponential +go.EASING_OUTEXPO = nil + +---out-in-back +go.EASING_OUTINBACK = nil + +---out-in-bounce +go.EASING_OUTINBOUNCE = nil + +---out-in-circlic +go.EASING_OUTINCIRC = nil + +---out-in-cubic +go.EASING_OUTINCUBIC = nil + +---out-in-elastic +go.EASING_OUTINELASTIC = nil + +---out-in-exponential +go.EASING_OUTINEXPO = nil + +---out-in-quadratic +go.EASING_OUTINQUAD = nil + +---out-in-quartic +go.EASING_OUTINQUART = nil + +---out-in-quintic +go.EASING_OUTINQUINT = nil + +---out-in-sine +go.EASING_OUTINSINE = nil + +---out-quadratic +go.EASING_OUTQUAD = nil + +---out-quartic +go.EASING_OUTQUART = nil + +---out-quintic +go.EASING_OUTQUINT = nil + +---out-sine +go.EASING_OUTSINE = nil + +---loop backward +go.PLAYBACK_LOOP_BACKWARD = nil + +---loop forward +go.PLAYBACK_LOOP_FORWARD = nil + +---ping pong loop +go.PLAYBACK_LOOP_PINGPONG = nil + +---no playback +go.PLAYBACK_NONE = nil + +---once backward +go.PLAYBACK_ONCE_BACKWARD = nil + +---once forward +go.PLAYBACK_ONCE_FORWARD = nil + +---once ping pong +go.PLAYBACK_ONCE_PINGPONG = nil + +---This is only supported for numerical properties. If the node property is already being +---animated, that animation will be canceled and replaced by the new one. +---If a complete_function (lua function) is specified, that function will be called when the animation has completed. +---By starting a new animation in that function, several animations can be sequenced together. See the examples for more information. +--- If you call go.animate() from a game object's final() function, +---any passed complete_function will be ignored and never called upon animation completion. +---See the properties guide for which properties can be animated and the animation guide for how +---them. +---@param url string|hash|url url of the game object or component having the property +---@param property string|hash id of the property to animate +---@param playback constant playback mode of the animation +--- +---go.PLAYBACK_ONCE_FORWARD +---go.PLAYBACK_ONCE_BACKWARD +---go.PLAYBACK_ONCE_PINGPONG +---go.PLAYBACK_LOOP_FORWARD +---go.PLAYBACK_LOOP_BACKWARD +---go.PLAYBACK_LOOP_PINGPONG +--- +---@param to number|vector3|vector4|quaternion target property value +---@param easing constant|vector4|vector3 easing to use during animation. Either specify a constant, see the animation guide for a complete list, or a vmath.vector with a curve +---@param duration number duration of the animation in seconds +---@param delay number|nil delay before the animation starts in seconds +---@param complete_function fun(self, url, property)|nil optional function to call when the animation has completed +--- +---self +--- +---object The current object. +--- +---url +--- +---url The game object or component instance for which the property is animated. +--- +---property +--- +---hash The id of the animated property. +--- +--- +function go.animate(url, property, playback, to, easing, duration, delay, complete_function) end + +---By calling this function, all or specified stored property animations of the game object or component will be canceled. +---See the properties guide for which properties can be animated and the animation guide for how to animate them. +---@param url string|hash|url url of the game object or component +---@param property string|hash|nil optional id of the property to cancel +function go.cancel_animations(url, property) end + +---Delete one or more game objects identified by id. Deletion is asynchronous meaning that +---the game object(s) are scheduled for deletion which will happen at the end of the current +---frame. Note that game objects scheduled for deletion will be counted against +---max_instances in "game.project" until they are actually removed. +--- Deleting a game object containing a particle FX component emitting particles will not immediately stop the particle FX from emitting particles. You need to manually stop the particle FX using particlefx.stop(). +--- Deleting a game object containing a sound component that is playing will not immediately stop the sound from playing. You need to manually stop the sound using sound.stop(). +---@param id string|hash|url|table|nil optional id or table of id's of the instance(s) to delete, the instance of the calling script is deleted by default +---@param recursive boolean|nil optional boolean, set to true to recursively delete child hiearchy in child to parent order +function go.delete(id, recursive) end + +---check if the specified game object exists +---@param url string|hash|url url of the game object to check +---@return bool exists true if the game object exists +function go.exists(url) end + +---gets a named property of the specified game object or component +---@param url string|hash|url url of the game object or component having the property +---@param property string|hash id of the property to retrieve +---@param options table|nil optional options table +---- index integer index into array property (1 based) +---- key hash name of internal property +---@return any value the value of the specified property +function go.get(url, property, options) end + +---Returns or constructs an instance identifier. The instance id is a hash +---of the absolute path to the instance. +---If path is specified, it can either be absolute or relative to the instance of the calling script. +---If path is not specified, the id of the game object instance the script is attached to will be returned. +---@param path string|nil path of the instance for which to return the id +---@return hash id instance id +function go.get_id(path) end + +---Get the parent for a game object instance. +---@param id string|hash|url|nil optional id of the game object instance to get parent for, defaults to the instance containing the calling script +---@return hash|nil parent_id parent instance or nil +function go.get_parent(id) end + +---The position is relative the parent (if any). Use go.get_world_position to retrieve the global world position. +---@param id string|hash|url|nil optional id of the game object instance to get the position for, by default the instance of the calling script +---@return vector3 position instance position +function go.get_position(id) end + +---The rotation is relative to the parent (if any). Use go.get_world_rotation to retrieve the global world rotation. +---@param id string|hash|url|nil optional id of the game object instance to get the rotation for, by default the instance of the calling script +---@return quaternion rotation instance rotation +function go.get_rotation(id) end + +---The scale is relative the parent (if any). Use go.get_world_scale to retrieve the global world 3D scale factor. +---@param id string|hash|url|nil optional id of the game object instance to get the scale for, by default the instance of the calling script +---@return vector3 scale instance scale factor +function go.get_scale(id) end + +---The uniform scale is relative the parent (if any). If the underlying scale vector is non-uniform the min element of the vector is returned as the uniform scale factor. +---@param id string|hash|url|nil optional id of the game object instance to get the uniform scale for, by default the instance of the calling script +---@return number scale uniform instance scale factor +function go.get_scale_uniform(id) end + +---The function will return the world position calculated at the end of the previous frame. +---Use go.get_position to retrieve the position relative to the parent. +---@param id string|hash|url|nil optional id of the game object instance to get the world position for, by default the instance of the calling script +---@return vector3 position instance world position +function go.get_world_position(id) end + +---The function will return the world rotation calculated at the end of the previous frame. +---Use go.get_rotation to retrieve the rotation relative to the parent. +---@param id string|hash|url|nil optional id of the game object instance to get the world rotation for, by default the instance of the calling script +---@return quaternion rotation instance world rotation +function go.get_world_rotation(id) end + +---The function will return the world 3D scale factor calculated at the end of the previous frame. +---Use go.get_scale to retrieve the 3D scale factor relative to the parent. +---This vector is derived by decomposing the transformation matrix and should be used with care. +---For most cases it should be fine to use go.get_world_scale_uniform instead. +---@param id string|hash|url|nil optional id of the game object instance to get the world scale for, by default the instance of the calling script +---@return vector3 scale instance world 3D scale factor +function go.get_world_scale(id) end + +---The function will return the world scale factor calculated at the end of the previous frame. +---Use go.get_scale_uniform to retrieve the scale factor relative to the parent. +---@param id string|hash|url|nil optional id of the game object instance to get the world scale for, by default the instance of the calling script +---@return number scale instance world scale factor +function go.get_world_scale_uniform(id) end + +---The function will return the world transform matrix calculated at the end of the previous frame. +---@param id string|hash|url|nil optional id of the game object instance to get the world transform for, by default the instance of the calling script +---@return matrix4 transform instance world transform +function go.get_world_transform(id) end + +---This function defines a property which can then be used in the script through the self-reference. +---The properties defined this way are automatically exposed in the editor in game objects and collections which use the script. +---Note that you can only use this function outside any callback-functions like init and update. +---@param name string the id of the property +---@param value number|hash|url|vector3|vector4|quaternion|resource_data|boolean default value of the property. In the case of a url, only the empty constructor msg.url() is allowed. In the case of a resource one of the resource constructors (eg resource.atlas(), resource.font() etc) is expected. +function go.property(name, value) end + +---sets a named property of the specified game object or component, or a material constant +---@param url string|hash|url url of the game object or component having the property +---@param property string|hash id of the property to set +---@param value any|table the value to set +---@param options table|nil optional options table +---- index integer index into array property (1 based) +---- key hash name of internal property +function go.set(url, property, value, options) end + +---Sets the parent for a game object instance. This means that the instance will exist in the geometrical space of its parent, +---like a basic transformation hierarchy or scene graph. If no parent is specified, the instance will be detached from any parent and exist in world +---space. +---This function will generate a set_parent message. It is not until the message has been processed that the change actually takes effect. This +---typically happens later in the same frame or the beginning of the next frame. Refer to the manual to learn how messages are processed by the +---engine. +---@param id string|hash|url|nil optional id of the game object instance to set parent for, defaults to the instance containing the calling script +---@param parent_id string|hash|url|nil optional id of the new parent game object, defaults to detaching game object from its parent +---@param keep_world_transform boolean|nil optional boolean, set to true to maintain the world transform when changing spaces. Defaults to false. +function go.set_parent(id, parent_id, keep_world_transform) end + +---The position is relative to the parent (if any). The global world position cannot be manually set. +---@param position vector3 position to set +---@param id string|hash|url|nil optional id of the game object instance to set the position for, by default the instance of the calling script +function go.set_position(position, id) end + +---The rotation is relative to the parent (if any). The global world rotation cannot be manually set. +---@param rotation quaternion rotation to set +---@param id string|hash|url|nil optional id of the game object instance to get the rotation for, by default the instance of the calling script +function go.set_rotation(rotation, id) end + +---The scale factor is relative to the parent (if any). The global world scale factor cannot be manually set. +--- Physics are currently not affected when setting scale from this function. +---@param scale number|vector3 vector or uniform scale factor, must be greater than 0 +---@param id string|hash|url|nil optional id of the game object instance to get the scale for, by default the instance of the calling script +function go.set_scale(scale, id) end + +--- The function uses world transformation calculated at the end of previous frame. +---@param position vector3 position which need to be converted +---@param url string|hash|url url of the game object which coordinate system convert to +---@return vector3 converted_postion converted position +function go.world_to_local_position(position, url) end + +--- The function uses world transformation calculated at the end of previous frame. +---@param transformation matrix4 transformation which need to be converted +---@param url string|hash|url url of the game object which coordinate system convert to +---@return matrix4 converted_transform converted transformation +function go.world_to_local_transform(transformation, url) end + + + +return go \ No newline at end of file diff --git a/annotations/defold/gui.lua b/annotations/defold/gui.lua new file mode 100644 index 0000000..d516b4e --- /dev/null +++ b/annotations/defold/gui.lua @@ -0,0 +1,1236 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + GUI API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.gui +gui = {} + +---Adjust mode is used when the screen resolution differs from the project settings. +---The fit mode ensures that the entire node is visible in the adjusted gui scene. +gui.ADJUST_FIT = nil + +---Adjust mode is used when the screen resolution differs from the project settings. +---The stretch mode ensures that the node is displayed as is in the adjusted gui scene, which might scale it non-uniformally. +gui.ADJUST_STRETCH = nil + +---Adjust mode is used when the screen resolution differs from the project settings. +---The zoom mode ensures that the node fills its entire area and might make the node exceed it. +gui.ADJUST_ZOOM = nil + +---bottom y-anchor +gui.ANCHOR_BOTTOM = nil + +---left x-anchor +gui.ANCHOR_LEFT = nil + +---no anchor +gui.ANCHOR_NONE = nil + +---right x-anchor +gui.ANCHOR_RIGHT = nil + +---top y-anchor +gui.ANCHOR_TOP = nil + +---additive blending +gui.BLEND_ADD = nil + +---additive alpha blending +gui.BLEND_ADD_ALPHA = nil + +---alpha blending +gui.BLEND_ALPHA = nil + +---multiply blending +gui.BLEND_MULT = nil + +---screen blending +gui.BLEND_SCREEN = nil + +---clipping mode none +gui.CLIPPING_MODE_NONE = nil + +---clipping mode stencil +gui.CLIPPING_MODE_STENCIL = nil + +---in-back +gui.EASING_INBACK = nil + +---in-bounce +gui.EASING_INBOUNCE = nil + +---in-circlic +gui.EASING_INCIRC = nil + +---in-cubic +gui.EASING_INCUBIC = nil + +---in-elastic +gui.EASING_INELASTIC = nil + +---in-exponential +gui.EASING_INEXPO = nil + +---in-out-back +gui.EASING_INOUTBACK = nil + +---in-out-bounce +gui.EASING_INOUTBOUNCE = nil + +---in-out-circlic +gui.EASING_INOUTCIRC = nil + +---in-out-cubic +gui.EASING_INOUTCUBIC = nil + +---in-out-elastic +gui.EASING_INOUTELASTIC = nil + +---in-out-exponential +gui.EASING_INOUTEXPO = nil + +---in-out-quadratic +gui.EASING_INOUTQUAD = nil + +---in-out-quartic +gui.EASING_INOUTQUART = nil + +---in-out-quintic +gui.EASING_INOUTQUINT = nil + +---in-out-sine +gui.EASING_INOUTSINE = nil + +---in-quadratic +gui.EASING_INQUAD = nil + +---in-quartic +gui.EASING_INQUART = nil + +---in-quintic +gui.EASING_INQUINT = nil + +---in-sine +gui.EASING_INSINE = nil + +---linear interpolation +gui.EASING_LINEAR = nil + +---out-back +gui.EASING_OUTBACK = nil + +---out-bounce +gui.EASING_OUTBOUNCE = nil + +---out-circlic +gui.EASING_OUTCIRC = nil + +---out-cubic +gui.EASING_OUTCUBIC = nil + +---out-elastic +gui.EASING_OUTELASTIC = nil + +---out-exponential +gui.EASING_OUTEXPO = nil + +---out-in-back +gui.EASING_OUTINBACK = nil + +---out-in-bounce +gui.EASING_OUTINBOUNCE = nil + +---out-in-circlic +gui.EASING_OUTINCIRC = nil + +---out-in-cubic +gui.EASING_OUTINCUBIC = nil + +---out-in-elastic +gui.EASING_OUTINELASTIC = nil + +---out-in-exponential +gui.EASING_OUTINEXPO = nil + +---out-in-quadratic +gui.EASING_OUTINQUAD = nil + +---out-in-quartic +gui.EASING_OUTINQUART = nil + +---out-in-quintic +gui.EASING_OUTINQUINT = nil + +---out-in-sine +gui.EASING_OUTINSINE = nil + +---out-quadratic +gui.EASING_OUTQUAD = nil + +---out-quartic +gui.EASING_OUTQUART = nil + +---out-quintic +gui.EASING_OUTQUINT = nil + +---out-sine +gui.EASING_OUTSINE = nil + +---default keyboard +gui.KEYBOARD_TYPE_DEFAULT = nil + +---email keyboard +gui.KEYBOARD_TYPE_EMAIL = nil + +---number input keyboard +gui.KEYBOARD_TYPE_NUMBER_PAD = nil + +---password keyboard +gui.KEYBOARD_TYPE_PASSWORD = nil + +---elliptical pie node bounds +gui.PIEBOUNDS_ELLIPSE = nil + +---rectangular pie node bounds +gui.PIEBOUNDS_RECTANGLE = nil + +---center pivot +gui.PIVOT_CENTER = nil + +---east pivot +gui.PIVOT_E = nil + +---north pivot +gui.PIVOT_N = nil + +---north-east pivot +gui.PIVOT_NE = nil + +---north-west pivot +gui.PIVOT_NW = nil + +---south pivot +gui.PIVOT_S = nil + +---south-east pivot +gui.PIVOT_SE = nil + +---south-west pivot +gui.PIVOT_SW = nil + +---west pivot +gui.PIVOT_W = nil + +---loop backward +gui.PLAYBACK_LOOP_BACKWARD = nil + +---loop forward +gui.PLAYBACK_LOOP_FORWARD = nil + +---ping pong loop +gui.PLAYBACK_LOOP_PINGPONG = nil + +---once backward +gui.PLAYBACK_ONCE_BACKWARD = nil + +---once forward +gui.PLAYBACK_ONCE_FORWARD = nil + +---once forward and then backward +gui.PLAYBACK_ONCE_PINGPONG = nil + +---color property +gui.PROP_COLOR = nil + +---euler property +gui.PROP_EULER = nil + +---fill_angle property +gui.PROP_FILL_ANGLE = nil + +---inner_radius property +gui.PROP_INNER_RADIUS = nil + +---outline color property +gui.PROP_OUTLINE = nil + +---position property +gui.PROP_POSITION = nil + +---rotation property +gui.PROP_ROTATION = nil + +---scale property +gui.PROP_SCALE = nil + +---shadow color property +gui.PROP_SHADOW = nil + +---size property +gui.PROP_SIZE = nil + +---slice9 property +gui.PROP_SLICE9 = nil + +---The provided data is not in the expected format or is in some other way +---incorrect, for instance the image data provided to gui.new_texture(). +gui.RESULT_DATA_ERROR = nil + +---The system is out of resources, for instance when trying to create a new +---texture using gui.new_texture(). +gui.RESULT_OUT_OF_RESOURCES = nil + +---The texture id already exists when trying to use gui.new_texture(). +gui.RESULT_TEXTURE_ALREADY_EXISTS = nil + +---The size of the node is determined by the currently assigned texture. +gui.SIZE_MODE_AUTO = nil + +---The size of the node is determined by the size set in the editor, the constructor or by gui.set_size() +gui.SIZE_MODE_MANUAL = nil + +---This starts an animation of a node property according to the specified parameters. +---If the node property is already being animated, that animation will be canceled and +---replaced by the new one. Note however that several different node properties +---can be animated simultaneously. Use gui.cancel_animation to stop the animation +---before it has completed. +---Composite properties of type vector3, vector4 or quaternion +---also expose their sub-components (x, y, z and w). +---You can address the components individually by suffixing the name with a dot '.' +---and the name of the component. +---For instance, "position.x" (the position x coordinate) or "color.w" +---(the color alpha value). +---If a complete_function (Lua function) is specified, that function will be called +---when the animation has completed. +---By starting a new animation in that function, several animations can be sequenced +---together. See the examples below for more information. +---@param node node node to animate +---@param property string|constant property to animate +--- +---"position" +---"rotation" +---"euler" +---"scale" +---"color" +---"outline" +---"shadow" +---"size" +---"fill_angle" (pie) +---"inner_radius" (pie) +---"slice9" (slice9) +--- +---The following property constants are defined equaling the corresponding property string names. +--- +---gui.PROP_POSITION +---gui.PROP_ROTATION +---gui.PROP_EULER +---gui.PROP_SCALE +---gui.PROP_COLOR +---gui.PROP_OUTLINE +---gui.PROP_SHADOW +---gui.PROP_SIZE +---gui.PROP_FILL_ANGLE +---gui.PROP_INNER_RADIUS +---gui.PROP_SLICE9 +--- +---@param to number|vector3|vector4|quaternion target property value +---@param easing constant|vector4|vector3 easing to use during animation. +--- Either specify one of the gui.EASING_* constants or provide a +--- vector with a custom curve. See the animation guide for more information. +---@param duration number duration of the animation in seconds. +---@param delay number|nil delay before the animation starts in seconds. +---@param complete_function fun(self, node)|nil function to call when the +--- animation has completed +---@param playback constant|nil playback mode +--- +---gui.PLAYBACK_ONCE_FORWARD +---gui.PLAYBACK_ONCE_BACKWARD +---gui.PLAYBACK_ONCE_PINGPONG +---gui.PLAYBACK_LOOP_FORWARD +---gui.PLAYBACK_LOOP_BACKWARD +---gui.PLAYBACK_LOOP_PINGPONG +--- +function gui.animate(node, property, to, easing, duration, delay, complete_function, playback) end + +---If an animation of the specified node is currently running (started by gui.animate), it will immediately be canceled. +---@param node node node that should have its animation canceled +---@param property string|constant property for which the animation should be canceled +--- +---"position" +---"rotation" +---"euler" +---"scale" +---"color" +---"outline" +---"shadow" +---"size" +---"fill_angle" (pie) +---"inner_radius" (pie) +---"slice9" (slice9) +--- +function gui.cancel_animation(node, property) end + +---Cancels any running flipbook animation on the specified node. +---@param node node node cancel flipbook animation for +function gui.cancel_flipbook(node) end + +---Make a clone instance of a node. The cloned node will be identical to the +---original node, except the id which is generated as the string "node" plus +---a sequential unsigned integer value. +---This function does not clone the supplied node's children nodes. +---Use gui.clone_tree for that purpose. +---@param node node node to clone +---@return node clone the cloned node +function gui.clone(node) end + +---Make a clone instance of a node and all its children. +---Use gui.clone to clone a node excluding its children. +---@param node node root node to clone +---@return table clones a table mapping node ids to the corresponding cloned nodes +function gui.clone_tree(node) end + +---Deletes the specified node. Any child nodes of the specified node will be +---recursively deleted. +---@param node node node to delete +function gui.delete_node(node) end + +---Delete a dynamically created texture. +---@param texture string|hash texture id +function gui.delete_texture(texture) end + +---Instead of using specific getters such as gui.get_position or gui.get_scale, +---you can use gui.get instead and supply the property as a string or a hash. +---While this function is similar to go.get, there are a few more restrictions +---when operating in the gui namespace. Most notably, only these propertie identifiers are supported: +---"position" +---"rotation" +---"euler" +---"scale" +---"color" +---"outline" +---"shadow" +---"size" +---"fill_angle" (pie) +---"inner_radius" (pie) +---"slice9" (slice9) +---The value returned will either be a vmath.vector4 or a single number, i.e getting the "position" +---property will return a vec4 while getting the "position.x" property will return a single value. +---@param node node node to get the property for +---@param property string|hash|constant the property to retrieve +function gui.get(node, property) end + +---Returns the adjust mode of a node. +---The adjust mode defines how the node will adjust itself to screen +---resolutions that differs from the one in the project settings. +---@param node node node from which to get the adjust mode (node) +---@return constant adjust_mode the current adjust mode +--- +---gui.ADJUST_FIT +---gui.ADJUST_ZOOM +---gui.ADJUST_STRETCH +--- +function gui.get_adjust_mode(node) end + +---gets the node alpha +---@param node node node from which to get alpha +function gui.get_alpha(node) end + +---Returns the blend mode of a node. +---Blend mode defines how the node will be blended with the background. +---@param node node node from which to get the blend mode +---@return constant blend_mode blend mode +--- +---gui.BLEND_ALPHA +---gui.BLEND_ADD +---gui.BLEND_ADD_ALPHA +---gui.BLEND_MULT +---gui.BLEND_SCREEN +--- +function gui.get_blend_mode(node) end + +---If node is set as an inverted clipping node, it will clip anything inside as opposed to outside. +---@param node node node from which to get the clipping inverted state +---@return boolean inverted true or false +function gui.get_clipping_inverted(node) end + +---Clipping mode defines how the node will clip it's children nodes +---@param node node node from which to get the clipping mode +---@return constant clipping_mode clipping mode +--- +--- gui.CLIPPING_MODE_NONE +--- gui.CLIPPING_MODE_STENCIL +--- +function gui.get_clipping_mode(node) end + +---If node is set as visible clipping node, it will be shown as well as clipping. Otherwise, it will only clip but not show visually. +---@param node node node from which to get the clipping visibility state +---@return boolean visible true or false +function gui.get_clipping_visible(node) end + +---Returns the color of the supplied node. The components +---of the returned vector4 contains the color channel values: +---Component +---Color value +---x +---Red value +---y +---Green value +---z +---Blue value +---w +---Alpha value +---@param node node node to get the color from +---@return vector4 color node color +function gui.get_color(node) end + +---Returns the rotation of the supplied node. +---The rotation is expressed in degree Euler angles. +---@param node node node to get the rotation from +---@return vector3 rotation node rotation +function gui.get_euler(node) end + +---Returns the sector angle of a pie node. +---@param node node node from which to get the fill angle +---@return number angle sector angle +function gui.get_fill_angle(node) end + +---Get node flipbook animation. +---@param node node node to get flipbook animation from +---@return hash animation animation id +function gui.get_flipbook(node) end + +---This is only useful nodes with flipbook animations. Gets the normalized cursor of the flipbook animation on a node. +---@param node node node to get the cursor for (node) +---@return number cursor cursor value +function gui.get_flipbook_cursor(node) end + +---This is only useful nodes with flipbook animations. Gets the playback rate of the flipbook animation on a node. +---@param node node node to set the cursor for +---@return number rate playback rate +function gui.get_flipbook_playback_rate(node) end + +---This is only useful for text nodes. The font must be mapped to the gui scene in the gui editor. +---@param node node node from which to get the font +---@return hash font font id +function gui.get_font(node) end + +---This is only useful for text nodes. The font must be mapped to the gui scene in the gui editor. +---@param font_name hash|string font of which to get the path hash +---@return hash hash path hash to resource +function gui.get_font_resource(font_name) end + +---Returns the scene height. +---@return number height scene height +function gui.get_height() end + +---Retrieves the id of the specified node. +---@param node node the node to retrieve the id from +---@return hash id the id of the node +function gui.get_id(node) end + +---Retrieve the index of the specified node among its siblings. +---The index defines the order in which a node appear in a GUI scene. +---Higher index means the node is drawn on top of lower indexed nodes. +---@param node node the node to retrieve the id from +---@return number index the index of the node +function gui.get_index(node) end + +---gets the node inherit alpha state +---@param node node node from which to get the inherit alpha state +function gui.get_inherit_alpha(node) end + +---Returns the inner radius of a pie node. +---The radius is defined along the x-axis. +---@param node node node from where to get the inner radius +---@return number radius inner radius +function gui.get_inner_radius(node) end + +---The layer must be mapped to the gui scene in the gui editor. +---@param node node node from which to get the layer +---@return hash layer layer id +function gui.get_layer(node) end + +---gets the scene current layout +---@return hash layout layout id +function gui.get_layout() end + +---Returns the leading value for a text node. +---@param node node node from where to get the leading +---@return number leading leading scaling value (default=1) +function gui.get_leading(node) end + +---Returns whether a text node is in line-break mode or not. +---This is only useful for text nodes. +---@param node node node from which to get the line-break for +---@return boolean line_break true or false +function gui.get_line_break(node) end + +---Returns the material of a node. +---The material must be mapped to the gui scene in the gui editor. +---@param node node node to get the material for +function gui.get_material(node) end + +---Retrieves the node with the specified id. +---@param id string|hash id of the node to retrieve +---@return node instance a new node instance +function gui.get_node(id) end + +---Returns the outer bounds mode for a pie node. +---@param node node node from where to get the outer bounds mode +---@return constant bounds_mode the outer bounds mode of the pie node: +--- +---gui.PIEBOUNDS_RECTANGLE +---gui.PIEBOUNDS_ELLIPSE +--- +function gui.get_outer_bounds(node) end + +---Returns the outline color of the supplied node. +---See gui.get_color for info how vectors encode color values. +---@param node node node to get the outline color from +---@return vector4 color outline color +function gui.get_outline(node) end + +---Returns the parent node of the specified node. +---If the supplied node does not have a parent, nil is returned. +---@param node node the node from which to retrieve its parent +---@return node|nil parent parent instance or nil +function gui.get_parent(node) end + +---Get the paricle fx for a gui node +---@param node node node to get particle fx for +---@return hash particlefx particle fx id +function gui.get_particlefx(node) end + +---Returns the number of generated vertices around the perimeter +---of a pie node. +---@param node node pie node +---@return number vertices vertex count +function gui.get_perimeter_vertices(node) end + +---The pivot specifies how the node is drawn and rotated from its position. +---@param node node node to get pivot from +---@return constant pivot pivot constant +--- +--- gui.PIVOT_CENTER +--- gui.PIVOT_N +--- gui.PIVOT_NE +--- gui.PIVOT_E +--- gui.PIVOT_SE +--- gui.PIVOT_S +--- gui.PIVOT_SW +--- gui.PIVOT_W +--- gui.PIVOT_NW +--- +function gui.get_pivot(node) end + +---Returns the position of the supplied node. +---@param node node node to get the position from +---@return vector3 position node position +function gui.get_position(node) end + +---Returns the rotation of the supplied node. +---The rotation is expressed as a quaternion +---@param node node node to get the rotation from +---@return quaternion rotation node rotation +function gui.get_rotation(node) end + +---Returns the scale of the supplied node. +---@param node node node to get the scale from +---@return vector3 scale node scale +function gui.get_scale(node) end + +---Returns the screen position of the supplied node. This function returns the +---calculated transformed position of the node, taking into account any parent node +---transforms. +---@param node node node to get the screen position from +---@return vector3 position node screen position +function gui.get_screen_position(node) end + +---Returns the shadow color of the supplied node. +---See gui.get_color for info how vectors encode color values. +---@param node node node to get the shadow color from +---@return vector4 color node shadow color +function gui.get_shadow(node) end + +---Returns the size of the supplied node. +---@param node node node to get the size from +---@return vector3 size node size +function gui.get_size(node) end + +---Returns the size of a node. +---The size mode defines how the node will adjust itself in size. Automatic +---size mode alters the node size based on the node's content. Automatic size +---mode works for Box nodes and Pie nodes which will both adjust their size +---to match the assigned image. Particle fx and Text nodes will ignore +---any size mode setting. +---@param node node node from which to get the size mode (node) +---@return constant size_mode the current size mode +--- +---gui.SIZE_MODE_MANUAL +---gui.SIZE_MODE_AUTO +--- +function gui.get_size_mode(node) end + +---Returns the slice9 configuration values for the node. +---@param node node node to manipulate +---@return vector4 values configuration values +function gui.get_slice9(node) end + +---Returns the text value of a text node. This is only useful for text nodes. +---@param node node node from which to get the text +---@return string text text value +function gui.get_text(node) end + +---Returns the texture of a node. +---This is currently only useful for box or pie nodes. +---The texture must be mapped to the gui scene in the gui editor. +---@param node node node to get texture from +---@return hash texture texture id +function gui.get_texture(node) end + +---Returns the tracking value of a text node. +---@param node node node from where to get the tracking +---@return number tracking tracking scaling number (default=0) +function gui.get_tracking(node) end + +---Get a node and all its children as a Lua table. +---@param node node root node to get node tree from +---@return table clones a table mapping node ids to the corresponding nodes +function gui.get_tree(node) end + +---Returns true if a node is visible and false if it's not. +---Invisible nodes are not rendered. +---@param node node node to query +---@return boolean visible whether the node is visible or not +function gui.get_visible(node) end + +---Returns the scene width. +---@return number width scene width +function gui.get_width() end + +---The x-anchor specifies how the node is moved when the game is run in a different resolution. +---@param node node node to get x-anchor from +---@return constant anchor anchor constant +--- +---gui.ANCHOR_NONE +---gui.ANCHOR_LEFT +---gui.ANCHOR_RIGHT +--- +function gui.get_xanchor(node) end + +---The y-anchor specifies how the node is moved when the game is run in a different resolution. +---@param node node node to get y-anchor from +---@return constant anchor anchor constant +--- +---gui.ANCHOR_NONE +---gui.ANCHOR_TOP +---gui.ANCHOR_BOTTOM +--- +function gui.get_yanchor(node) end + +---Hides the on-display touch keyboard on the device. +function gui.hide_keyboard() end + +---Returns true if a node is enabled and false if it's not. +---Disabled nodes are not rendered and animations acting on them are not evaluated. +---@param node node node to query +---@param recursive boolean|nil check hierarchy recursively +---@return boolean enabled whether the node is enabled or not +function gui.is_enabled(node, recursive) end + +---Alters the ordering of the two supplied nodes by moving the first node +---above the second. +---If the second argument is nil the first node is moved to the top. +---@param node node to move +---@param reference node|nil reference node above which the first node should be moved +function gui.move_above(node, reference) end + +---Alters the ordering of the two supplied nodes by moving the first node +---below the second. +---If the second argument is nil the first node is moved to the bottom. +---@param node node to move +---@param reference node|nil reference node below which the first node should be moved +function gui.move_below(node, reference) end + +---Dynamically create a new box node. +---@param pos vector3|vector4 node position +---@param size vector3 node size +---@return node node new box node +function gui.new_box_node(pos, size) end + +---Dynamically create a particle fx node. +---@param pos vector3|vector4 node position +---@param particlefx hash|string particle fx resource name +---@return node node new particle fx node +function gui.new_particlefx_node(pos, particlefx) end + +---Dynamically create a new pie node. +---@param pos vector3|vector4 node position +---@param size vector3 node size +---@return node node new pie node +function gui.new_pie_node(pos, size) end + +---Dynamically create a new text node. +---@param pos vector3|vector4 node position +---@param text string node text +---@return node node new text node +function gui.new_text_node(pos, text) end + +---Dynamically create a new texture. +---@param texture_id string|hash texture id +---@param width number texture width +---@param height number texture height +---@param type string|constant texture type +--- +---"rgb" - RGB +---"rgba" - RGBA +---"l" - LUMINANCE +--- +---@param buffer string texture data +---@param flip boolean flip texture vertically +---@return boolean success texture creation was successful +---@return number code one of the gui.RESULT_* codes if unsuccessful +function gui.new_texture(texture_id, width, height, type, buffer, flip) end + +---Tests whether a coordinate is within the bounding box of a +---node. +---@param node node node to be tested for picking +---@param x number x-coordinate (see on_input ) +---@param y number y-coordinate (see on_input ) +---@return boolean pickable pick result +function gui.pick_node(node, x, y) end + +---Play flipbook animation on a box or pie node. +---The current node texture must contain the animation. +---Use this function to set one-frame still images on the node. +---@param node node node to set animation for +---@param animation string|hash animation id +---@param complete_function fun(self, node)|nil optional function to call when the animation has completed +--- +---self +--- +---object The current object. +--- +---node +--- +---node The node that is animated. +--- +--- +---@param play_properties { offset:number|nil, playback_rate:number|nil }|nil optional table with properties +--- +---offset +---number The normalized initial value of the animation cursor when the animation starts playing +---playback_rate +---number The rate with which the animation will be played. Must be positive +--- +function gui.play_flipbook(node, animation, complete_function, play_properties) end + +---Plays the paricle fx for a gui node +---@param node node node to play particle fx for +---@param emitter_state_function fun(self, node, emitter, state)|nil optional callback function that will be called when an emitter attached to this particlefx changes state. +--- +---self +---object The current object +---node +---hash The particle fx node, or nil if the node was deleted +---emitter +---hash The id of the emitter +---state +---constant the new state of the emitter: +--- +--- +---particlefx.EMITTER_STATE_SLEEPING +---particlefx.EMITTER_STATE_PRESPAWN +---particlefx.EMITTER_STATE_SPAWNING +---particlefx.EMITTER_STATE_POSTSPAWN +--- +function gui.play_particlefx(node, emitter_state_function) end + +---Resets the input context of keyboard. This will clear marked text. +function gui.reset_keyboard() end + +---Resets the node material to the material assigned in the gui scene. +---@param node node node to reset the material for +function gui.reset_material(node) end + +---Resets all nodes in the current GUI scene to their initial state. +---The reset only applies to static node loaded from the scene. +---Nodes that are created dynamically from script are not affected. +function gui.reset_nodes() end + +---Convert the screen position to the local position of supplied node +---@param node node node used for getting local transformation matrix +---@param screen_position vector3 screen position +---@return vector3 local_position local position +function gui.screen_to_local(node, screen_position) end + +---Instead of using specific setteres such as gui.set_position or gui.set_scale, +---you can use gui.set instead and supply the property as a string or a hash. +---While this function is similar to go.get and go.set, there are a few more restrictions +---when operating in the gui namespace. Most notably, only these propertie identifiers are supported: +---"position" +---"rotation" +---"euler" +---"scale" +---"color" +---"outline" +---"shadow" +---"size" +---"fill_angle" (pie) +---"inner_radius" (pie) +---"slice9" (slice9) +---The value to set must either be a vmath.vector4, vmath.vector3, vmath.quat or a single number and depends on the property name you want to set. +---I.e when setting the "position" property, you need to use a vmath.vector4 and when setting a single component of the property, +---such as "position.x", you need to use a single value. +---Note: When setting the rotation using the "rotation" property, you need to pass in a vmath.quat. This behaviour is different than from the gui.set_rotation function, +---the intention is to move new functionality closer to go namespace so that migrating between gui and go is easier. To set the rotation using degrees instead, +---use the "euler" property instead. The rotation and euler properties are linked, changing one of them will change the backing data of the other. +---@param node node node to set the property for +---@param property string|hash|constant the property to set +---@param value number|vector4|vector3|quaternion the property to set +function gui.set(node, property, value) end + +---Sets the adjust mode on a node. +---The adjust mode defines how the node will adjust itself to screen +---resolutions that differs from the one in the project settings. +---@param node node node to set adjust mode for +---@param adjust_mode constant adjust mode to set +--- +---gui.ADJUST_FIT +---gui.ADJUST_ZOOM +---gui.ADJUST_STRETCH +--- +function gui.set_adjust_mode(node, adjust_mode) end + +---sets the node alpha +---@param node node node for which to set alpha +---@param alpha number 0..1 alpha color +function gui.set_alpha(node, alpha) end + +---Set the blend mode of a node. +---Blend mode defines how the node will be blended with the background. +---@param node node node to set blend mode for +---@param blend_mode constant blend mode to set +--- +---gui.BLEND_ALPHA +---gui.BLEND_ADD +---gui.BLEND_ADD_ALPHA +---gui.BLEND_MULT +---gui.BLEND_SCREEN +--- +function gui.set_blend_mode(node, blend_mode) end + +---If node is set as an inverted clipping node, it will clip anything inside as opposed to outside. +---@param node node node to set clipping inverted state for +---@param inverted boolean true or false +function gui.set_clipping_inverted(node, inverted) end + +---Clipping mode defines how the node will clip it's children nodes +---@param node node node to set clipping mode for +---@param clipping_mode constant clipping mode to set +--- +--- gui.CLIPPING_MODE_NONE +--- gui.CLIPPING_MODE_STENCIL +--- +function gui.set_clipping_mode(node, clipping_mode) end + +---If node is set as an visible clipping node, it will be shown as well as clipping. Otherwise, it will only clip but not show visually. +---@param node node node to set clipping visibility for +---@param visible boolean true or false +function gui.set_clipping_visible(node, visible) end + +---Sets the color of the supplied node. The components +---of the supplied vector3 or vector4 should contain the color channel values: +---Component +---Color value +---x +---Red value +---y +---Green value +---z +---Blue value +---w vector4 +---Alpha value +---@param node node node to set the color for +---@param color vector3|vector4 new color +function gui.set_color(node, color) end + +---Sets a node to the disabled or enabled state. +---Disabled nodes are not rendered and animations acting on them are not evaluated. +---@param node node node to be enabled/disabled +---@param enabled boolean whether the node should be enabled or not +function gui.set_enabled(node, enabled) end + +---Sets the rotation of the supplied node. +---The rotation is expressed in degree Euler angles. +---@param node node node to set the rotation for +---@param rotation vector3|vector4 new rotation +function gui.set_euler(node, rotation) end + +---Set the sector angle of a pie node. +---@param node node node to set the fill angle for +---@param angle number sector angle +function gui.set_fill_angle(node, angle) end + +---This is only useful nodes with flipbook animations. The cursor is normalized. +---@param node node node to set the cursor for +---@param cursor number cursor value +function gui.set_flipbook_cursor(node, cursor) end + +---This is only useful nodes with flipbook animations. Sets the playback rate of the flipbook animation on a node. Must be positive. +---@param node node node to set the cursor for +---@param playback_rate number playback rate +function gui.set_flipbook_playback_rate(node, playback_rate) end + +---This is only useful for text nodes. +---The font must be mapped to the gui scene in the gui editor. +---@param node node node for which to set the font +---@param font string|hash font id +function gui.set_font(node, font) end + +---Set the id of the specicied node to a new value. +---Nodes created with the gui.new_*_node() functions get +---an empty id. This function allows you to give dynamically +---created nodes an id. +--- No checking is done on the uniqueness of supplied ids. +---It is up to you to make sure you use unique ids. +---@param node node node to set the id for +---@param id string|hash id to set +function gui.set_id(node, id) end + +---sets the node inherit alpha state +---@param node node node from which to set the inherit alpha state +---@param inherit_alpha boolean true or false +function gui.set_inherit_alpha(node, inherit_alpha) end + +---Sets the inner radius of a pie node. +---The radius is defined along the x-axis. +---@param node node node to set the inner radius for +---@param radius number inner radius +function gui.set_inner_radius(node, radius) end + +---The layer must be mapped to the gui scene in the gui editor. +---@param node node node for which to set the layer +---@param layer string|hash layer id +function gui.set_layer(node, layer) end + +---Sets the leading value for a text node. This value is used to +---scale the line spacing of text. +---@param node node node for which to set the leading +---@param leading number a scaling value for the line spacing (default=1) +function gui.set_leading(node, leading) end + +---Sets the line-break mode on a text node. +---This is only useful for text nodes. +---@param node node node to set line-break for +---@param line_break boolean true or false +function gui.set_line_break(node, line_break) end + +---Set the material on a node. The material must be mapped to the gui scene in the gui editor, +---and assigning a material is supported for all node types. To set the default material that +---is assigned to the gui scene node, use gui.reset_material(node_id) instead. +---@param node node node to set material for +---@param material string|hash material id +function gui.set_material(node, material) end + +---Sets the outer bounds mode for a pie node. +---@param node node node for which to set the outer bounds mode +---@param bounds_mode constant the outer bounds mode of the pie node: +--- +---gui.PIEBOUNDS_RECTANGLE +---gui.PIEBOUNDS_ELLIPSE +--- +function gui.set_outer_bounds(node, bounds_mode) end + +---Sets the outline color of the supplied node. +---See gui.set_color for info how vectors encode color values. +---@param node node node to set the outline color for +---@param color vector3|vector4 new outline color +function gui.set_outline(node, color) end + +---Sets the parent node of the specified node. +---@param node node node for which to set its parent +---@param parent node|nil parent node to set +---@param keep_scene_transform boolean|nil optional flag to make the scene position being perserved +function gui.set_parent(node, parent, keep_scene_transform) end + +---Set the paricle fx for a gui node +---@param node node node to set particle fx for +---@param particlefx hash|string particle fx id +function gui.set_particlefx(node, particlefx) end + +---Sets the number of generated vertices around the perimeter of a pie node. +---@param node node pie node +---@param vertices number vertex count +function gui.set_perimeter_vertices(node, vertices) end + +---The pivot specifies how the node is drawn and rotated from its position. +---@param node node node to set pivot for +---@param pivot constant pivot constant +--- +--- gui.PIVOT_CENTER +--- gui.PIVOT_N +--- gui.PIVOT_NE +--- gui.PIVOT_E +--- gui.PIVOT_SE +--- gui.PIVOT_S +--- gui.PIVOT_SW +--- gui.PIVOT_W +--- gui.PIVOT_NW +--- +function gui.set_pivot(node, pivot) end + +---Sets the position of the supplied node. +---@param node node node to set the position for +---@param position vector3|vector4 new position +function gui.set_position(node, position) end + +---Set the order number for the current GUI scene. +---The number dictates the sorting of the "gui" render predicate, +---in other words in which order the scene will be rendered in relation +---to other currently rendered GUI scenes. +---The number must be in the range 0 to 15. +---@param order number rendering order (0-15) +function gui.set_render_order(order) end + +---Sets the rotation of the supplied node. +---The rotation is expressed as a quaternion +---@param node node node to set the rotation for +---@param rotation quaternion|vector4 new rotation +function gui.set_rotation(node, rotation) end + +---Sets the scaling of the supplied node. +---@param node node node to set the scale for +---@param scale vector3|vector4 new scale +function gui.set_scale(node, scale) end + +---Set the screen position to the supplied node +---@param node node node to set the screen position to +---@param screen_position vector3 screen position +function gui.set_screen_position(node, screen_position) end + +---Sets the shadow color of the supplied node. +---See gui.set_color for info how vectors encode color values. +---@param node node node to set the shadow color for +---@param color vector3|vector4 new shadow color +function gui.set_shadow(node, color) end + +---Sets the size of the supplied node. +--- You can only set size on nodes with size mode set to SIZE_MODE_MANUAL +---@param node node node to set the size for +---@param size vector3|vector4 new size +function gui.set_size(node, size) end + +---Sets the size mode of a node. +---The size mode defines how the node will adjust itself in size. Automatic +---size mode alters the node size based on the node's content. Automatic size +---mode works for Box nodes and Pie nodes which will both adjust their size +---to match the assigned image. Particle fx and Text nodes will ignore +---any size mode setting. +---@param node node node to set size mode for +---@param size_mode constant size mode to set +--- +---gui.SIZE_MODE_MANUAL +---gui.SIZE_MODE_AUTO +--- +function gui.set_size_mode(node, size_mode) end + +---Set the slice9 configuration values for the node. +---@param node node node to manipulate +---@param values vector4 new values +function gui.set_slice9(node, values) end + +---Set the text value of a text node. This is only useful for text nodes. +---@param node node node to set text for +---@param text string|number text to set +function gui.set_text(node, text) end + +---Set the texture on a box or pie node. The texture must be mapped to +---the gui scene in the gui editor. The function points out which texture +---the node should render from. If the texture is an atlas, further +---information is needed to select which image/animation in the atlas +---to render. In such cases, use gui.play_flipbook() in +---addition to this function. +---@param node node node to set texture for +---@param texture string|hash texture id +function gui.set_texture(node, texture) end + +---Set the texture buffer data for a dynamically created texture. +---@param texture string|hash texture id +---@param width number texture width +---@param height number texture height +---@param type string|constant texture type +--- +--- "rgb" - RGB +--- "rgba" - RGBA +--- "l" - LUMINANCE +--- +---@param buffer string texture data +---@param flip boolean flip texture vertically +---@return boolean success setting the data was successful +function gui.set_texture_data(texture, width, height, type, buffer, flip) end + +---Sets the tracking value of a text node. This value is used to +---adjust the vertical spacing of characters in the text. +---@param node node node for which to set the tracking +---@param tracking number a scaling number for the letter spacing (default=0) +function gui.set_tracking(node, tracking) end + +---Set if a node should be visible or not. Only visible nodes are rendered. +---@param node node node to be visible or not +---@param visible boolean whether the node should be visible or not +function gui.set_visible(node, visible) end + +---The x-anchor specifies how the node is moved when the game is run in a different resolution. +---@param node node node to set x-anchor for +---@param anchor constant anchor constant +--- +---gui.ANCHOR_NONE +---gui.ANCHOR_LEFT +---gui.ANCHOR_RIGHT +--- +function gui.set_xanchor(node, anchor) end + +---The y-anchor specifies how the node is moved when the game is run in a different resolution. +---@param node node node to set y-anchor for +---@param anchor constant anchor constant +--- +---gui.ANCHOR_NONE +---gui.ANCHOR_TOP +---gui.ANCHOR_BOTTOM +--- +function gui.set_yanchor(node, anchor) end + +---Shows the on-display touch keyboard. +---The specified type of keyboard is displayed if it is available on +---the device. +---This function is only available on iOS and Android. . +---@param type constant keyboard type +--- +---gui.KEYBOARD_TYPE_DEFAULT +---gui.KEYBOARD_TYPE_EMAIL +---gui.KEYBOARD_TYPE_NUMBER_PAD +---gui.KEYBOARD_TYPE_PASSWORD +--- +---@param autoclose boolean if the keyboard should automatically close when clicking outside +function gui.show_keyboard(type, autoclose) end + +---Stops the particle fx for a gui node +---@param node node node to stop particle fx for +---@param options { clear:boolean|nil }|nil options when stopping the particle fx. Supported options: +--- +---boolean clear: instantly clear spawned particles +--- +function gui.stop_particlefx(node, options) end + + + +return gui \ No newline at end of file diff --git a/annotations/defold/html5.lua b/annotations/defold/html5.lua new file mode 100644 index 0000000..bafc165 --- /dev/null +++ b/annotations/defold/html5.lua @@ -0,0 +1,37 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + HTML5 API documentation + + HTML5 platform specific functions. + The following functions are only available on HTML5 builds, the html5.* Lua namespace will not be available on other platforms. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.html5 +html5 = {} + +---Executes the supplied string as JavaScript inside the browser. +---A call to this function is blocking, the result is returned as-is, as a string. +---(Internally this will execute the string using the eval() JavaScript function.) +---@param code string Javascript code to run +---@return string result result as string +function html5.run(code) end + +---Set a JavaScript interaction listener callaback from lua that will be +---invoked when a user interacts with the web page by clicking, touching or typing. +---The callback can then call DOM restricted actions like requesting a pointer lock, +---or start playing sounds the first time the callback is invoked. +---@param callback fun(self)|nil The interaction callback. Pass an empty function or nil if you no longer wish to receive callbacks. +--- +---self +---object The calling script +--- +function html5.set_interaction_listener(callback) end + +return html5 \ No newline at end of file diff --git a/annotations/defold/http.lua b/annotations/defold/http.lua new file mode 100644 index 0000000..a4860a6 --- /dev/null +++ b/annotations/defold/http.lua @@ -0,0 +1,49 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + HTTP API documentation + + Functions for performing HTTP and HTTPS requests. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.http +http = {} + +---Perform a HTTP/HTTPS request. +--- If no timeout value is passed, the configuration value "network.http_timeout" is used. If that is not set, the timeout value is 0 (which blocks indefinitely). +---@param url string target url +---@param method string HTTP/HTTPS method, e.g. "GET", "PUT", "POST" etc. +---@param callback fun(self, id, response) response callback function +--- +---self +---object The script instance +---id +---hash Internal message identifier. Do not use! +---response +---table The response data. Contains the fields: +--- +--- +---number status: the status of the response +---string response: the response data (if not saved on disc) +---table headers: all the returned headers +---string path: the stored path (if saved to disc) +---string error: if any unforeseen errors occurred (e.g. file I/O) +--- +---@param headers table|nil optional table with custom headers +---@param post_data string|nil optional data to send +---@param options table|nil optional table with request parameters. Supported entries: +--- +---number timeout: timeout in seconds +---string path: path on disc where to download the file. Only overwrites the path if status is 200. Not available in HTML5 build +---boolean ignore_cache: don't return cached data if we get a 304. Not available in HTML5 build +---boolean chunked_transfer: use chunked transfer encoding for https requests larger than 16kb. Defaults to true. Not available in HTML5 build +--- +function http.request(url, method, callback, headers, post_data, options) end + +return http \ No newline at end of file diff --git a/annotations/defold/image.lua b/annotations/defold/image.lua new file mode 100644 index 0000000..74843f2 --- /dev/null +++ b/annotations/defold/image.lua @@ -0,0 +1,78 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Image API documentation + + Functions for creating image objects. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.image +image = {} + +---luminance image type +image.TYPE_LUMINANCE = nil + +---luminance image type +image.TYPE_LUMINANCE_ALPHA = nil + +---RGB image type +image.TYPE_RGB = nil + +---RGBA image type +image.TYPE_RGBA = nil + +---Load image (PNG or JPEG) from buffer. +---@param buffer string image data buffer +---@param options table|nil An optional table containing parameters for loading the image. Supported entries: +--- +---premultiply_alpha +---boolean True if alpha should be premultiplied into the color components. Defaults to false. +---flip_vertically +---boolean True if the image contents should be flipped vertically. Defaults to false. +--- +---@return { width:number, height:number, type:constant, buffer:string }|nil image object or nil if loading fails. The object is a table with the following fields: +--- +---number width: image width +---number height: image height +---constant type: image type +---image.TYPE_RGB +---image.TYPE_RGBA +---image.TYPE_LUMINANCE +---image.TYPE_LUMINANCE_ALPHA +--- +--- +---string buffer: the raw image data +--- +function image.load(buffer, options) end + +---Load image (PNG or JPEG) from a string buffer. +---@param buffer string image data buffer +---@param options table|nil An optional table containing parameters for loading the image. Supported entries: +--- +---premultiply_alpha +---boolean True if alpha should be premultiplied into the color components. Defaults to false. +---flip_vertically +---boolean True if the image contents should be flipped vertically. Defaults to false. +--- +---@return { width:number, height:number, type:constant, buffer:buffer_data }|nil image object or nil if loading fails. The object is a table with the following fields: +--- +---number width: image width +---number height: image height +---constant type: image type +---image.TYPE_RGB +---image.TYPE_RGBA +---image.TYPE_LUMINANCE +---image.TYPE_LUMINANCE_ALPHA +--- +--- +---buffer buffer: the script buffer that holds the decompressed image data. See buffer.create how to use the buffer. +--- +function image.load_buffer(buffer, options) end + +return image \ No newline at end of file diff --git a/annotations/defold/json.lua b/annotations/defold/json.lua new file mode 100644 index 0000000..50dba47 --- /dev/null +++ b/annotations/defold/json.lua @@ -0,0 +1,41 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + JSON API documentation + + Manipulation of JSON data strings. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.json +json = {} + +---Represents the null primitive from a json file +json.null = nil + +---Decode a string of JSON data into a Lua table. +---A Lua error is raised for syntax errors. +---@param json string json data +---@param options { decode_null_as_userdata:boolean|nil }|nil table with decode options +--- +---bool decode_null_as_userdata: wether to decode a JSON null value as json.null or nil (default is nil) +--- +---@return table data decoded json +function json.decode(json, options) end + +---Encode a lua table to a JSON string. +---A Lua error is raised for syntax errors. +---@param tbl table lua table to encode +---@param options { encode_empty_table_as_object:string }|nil table with encode options +--- +---string encode_empty_table_as_object: wether to encode an empty table as an JSON object or array (default is object) +--- +---@return string json encoded json +function json.encode(tbl, options) end + +return json \ No newline at end of file diff --git a/annotations/defold/label.lua b/annotations/defold/label.lua new file mode 100644 index 0000000..e042411 --- /dev/null +++ b/annotations/defold/label.lua @@ -0,0 +1,28 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Label API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.label +label = {} + +---Gets the text from a label component +---@param url string|hash|url the label to get the text from +---@return string metrics the label text +function label.get_text(url) end + +---Sets the text of a label component +--- This method uses the message passing that means the value will be set after dispatch messages step. +---More information is available in the Application Lifecycle manual. +---@param url string|hash|url the label that should have a constant set +---@param text string the text +function label.set_text(url, text) end + +return label \ No newline at end of file diff --git a/annotations/defold/liveupdate.lua b/annotations/defold/liveupdate.lua new file mode 100644 index 0000000..0b93064 --- /dev/null +++ b/annotations/defold/liveupdate.lua @@ -0,0 +1,155 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + LiveUpdate API documentation + + Functions and constants to access resources. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.liveupdate +liveupdate = {} + +---Mismatch between between expected bundled resources and actual bundled resources. The manifest expects a resource to be in the bundle, but it was not found in the bundle. This is typically the case when a non-excluded resource was modified between publishing the bundle and publishing the manifest. +liveupdate.LIVEUPDATE_BUNDLED_RESOURCE_MISMATCH = nil + +---Mismatch between running engine version and engine versions supported by manifest. +liveupdate.LIVEUPDATE_ENGINE_VERSION_MISMATCH = nil + +---Failed to parse manifest data buffer. The manifest was probably produced by a different engine version. +liveupdate.LIVEUPDATE_FORMAT_ERROR = nil + +---Argument was invalid +liveupdate.LIVEUPDATE_INVAL = nil + +---The handled resource is invalid. +liveupdate.LIVEUPDATE_INVALID_HEADER = nil + +---The header of the resource is invalid. +liveupdate.LIVEUPDATE_INVALID_RESOURCE = nil + +---I/O operation failed +liveupdate.LIVEUPDATE_IO_ERROR = nil + +---Memory wasn't allocated +liveupdate.LIVEUPDATE_MEM_ERROR = nil + +---LIVEUPDATE_OK +liveupdate.LIVEUPDATE_OK = nil + +---Mismatch between scheme used to load resources. Resources are loaded with a different scheme than from manifest, for example over HTTP or directly from file. This is typically the case when running the game directly from the editor instead of from a bundle. +liveupdate.LIVEUPDATE_SCHEME_MISMATCH = nil + +---Mismatch between manifest expected signature and actual signature. +liveupdate.LIVEUPDATE_SIGNATURE_MISMATCH = nil + +---Unspecified error +liveupdate.LIVEUPDATE_UNKNOWN = nil + +---Mismatch between manifest expected version and actual version. +liveupdate.LIVEUPDATE_VERSION_MISMATCH = nil + +---Adds a resource mount to the resource system. +---The mounts are persisted between sessions. +---After the mount succeeded, the resources are available to load. (i.e. no reboot required) +---@param name string Unique name of the mount +---@param uri string The uri of the mount, including the scheme. Currently supported schemes are 'zip' and 'archive'. +---@param priority integer Priority of mount. Larger priority takes prescedence +---@param callback function Callback after the asynchronous request completed +---@return number result The result of the request +function liveupdate.add_mount(name, uri, priority, callback) end + +---Return a reference to the Manifest that is currently loaded. +---@return number manifest_reference reference to the Manifest that is currently loaded +function liveupdate.get_current_manifest() end + +---Get an array of the current mounts +---This can be used to determine if a new mount is needed or not +---@return array mounts Array of mounts +function liveupdate.get_mounts() end + +---Is any liveupdate data mounted and currently in use? +---This can be used to determine if a new manifest or zip file should be downloaded. +---@return bool bool true if a liveupdate archive (any format) has been loaded +function liveupdate.is_using_liveupdate_data() end + +---Remove a mount the resource system. +---The remaining mounts are persisted between sessions. +---Removing a mount does not affect any loaded resources. +---@param name string Unique name of the mount +---@return number result The result of the call +function liveupdate.remove_mount(name) end + +---Stores a zip file and uses it for live update content. The contents of the +---zip file will be verified against the manifest to ensure file integrity. +---It is possible to opt out of the resource verification using an option passed +---to this function. +---The path is stored in the (internal) live update location. +---@param path string the path to the original file on disc +---@param callback fun(self, status) the callback function +---executed after the storage has completed +--- +---self +---object The current object. +---status +---constant the status of the store operation (See liveupdate.store_manifest) +--- +---@param options table|nil optional table with extra parameters. Supported entries: +--- +---boolean verify: if archive should be verified as well as stored (defaults to true) +--- +function liveupdate.store_archive(path, callback, options) end + +---Create a new manifest from a buffer. The created manifest is verified +---by ensuring that the manifest was signed using the bundled public/private +---key-pair during the bundle process and that the manifest supports the current +---running engine version. Once the manifest is verified it is stored on device. +---The next time the engine starts (or is rebooted) it will look for the stored +---manifest before loading resources. Storing a new manifest allows the +---developer to update the game, modify existing resources, or add new +---resources to the game through LiveUpdate. +---@param manifest_buffer string the binary data that represents the manifest +---@param callback fun(self, status) the callback function +---executed once the engine has attempted to store the manifest. +--- +---self +---object The current object. +---status +---constant the status of the store operation: +--- +--- +---liveupdate.LIVEUPDATE_OK +---liveupdate.LIVEUPDATE_INVALID_RESOURCE +---liveupdate.LIVEUPDATE_VERSION_MISMATCH +---liveupdate.LIVEUPDATE_ENGINE_VERSION_MISMATCH +---liveupdate.LIVEUPDATE_SIGNATURE_MISMATCH +---liveupdate.LIVEUPDATE_BUNDLED_RESOURCE_MISMATCH +---liveupdate.LIVEUPDATE_FORMAT_ERROR +--- +function liveupdate.store_manifest(manifest_buffer, callback) end + +---add a resource to the data archive and runtime index. The resource will be verified +---internally before being added to the data archive. +---@param manifest_reference number The manifest to check against. +---@param data string The resource data that should be stored. +---@param hexdigest string The expected hash for the resource, +---retrieved through collectionproxy.missing_resources. +---@param callback fun(self, hexdigest, status) The callback +---function that is executed once the engine has been attempted to store +---the resource. +--- +---self +---object The current object. +---hexdigest +---string The hexdigest of the resource. +---status +---boolean Whether or not the resource was successfully stored. +--- +function liveupdate.store_resource(manifest_reference, data, hexdigest, callback) end + +return liveupdate \ No newline at end of file diff --git a/annotations/defold/model.lua b/annotations/defold/model.lua new file mode 100644 index 0000000..d38bb9d --- /dev/null +++ b/annotations/defold/model.lua @@ -0,0 +1,92 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Model API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.model +model = {} + +---Cancels all animation on a model component. +---@param url string|hash|url the model for which to cancel the animation +function model.cancel(url) end + +---Gets the id of the game object that corresponds to a model skeleton bone. +---The returned game object can be used for parenting and transform queries. +---This function has complexity O(n), where n is the number of bones in the model skeleton. +---Game objects corresponding to a model skeleton bone can not be individually deleted. +---@param url string|hash|url the model to query +---@param bone_id string|hash id of the corresponding bone +---@return hash id id of the game object +function model.get_go(url, bone_id) end + +---Get the enabled state of a mesh +---@param url string|hash|url the model +---@param mesh_id string|hash|url the id of the mesh +---@return boolean enabled true if the mesh is visible, false otherwise +function model.get_mesh_enabled(url, mesh_id) end + +---Plays an animation on a model component with specified playback +---mode and parameters. +---An optional completion callback function can be provided that will be called when +---the animation has completed playing. If no function is provided, +---a model_animation_done message is sent to the script that started the animation. +--- The callback is not called (or message sent) if the animation is +---cancelled with model.cancel. The callback is called (or message sent) only for +---animations that play with the following playback modes: +---go.PLAYBACK_ONCE_FORWARD +---go.PLAYBACK_ONCE_BACKWARD +---go.PLAYBACK_ONCE_PINGPONG +---@param url string|hash|url the model for which to play the animation +---@param anim_id string|hash id of the animation to play +---@param playback constant playback mode of the animation +--- +---go.PLAYBACK_ONCE_FORWARD +---go.PLAYBACK_ONCE_BACKWARD +---go.PLAYBACK_ONCE_PINGPONG +---go.PLAYBACK_LOOP_FORWARD +---go.PLAYBACK_LOOP_BACKWARD +---go.PLAYBACK_LOOP_PINGPONG +--- +---@param play_properties { blend_duration:number|nil, offset:number|nil, playback_rate:number|nil}|nil optional table with properties +---Play properties table: +--- +---blend_duration +---number Duration of a linear blend between the current and new animation. +---offset +---number The normalized initial value of the animation cursor when the animation starts playing. +---playback_rate +---number The rate with which the animation will be played. Must be positive. +--- +---@param complete_function fun(self, message_id, message, sender)|nil function to call when the animation has completed. +--- +---self +---object The current object. +---message_id +---hash The name of the completion message, "model_animation_done". +---message +---table Information about the completion: +--- +--- +---hash animation_id - the animation that was completed. +---constant playback - the playback mode for the animation. +--- +--- +---sender +---url The invoker of the callback: the model component. +--- +function model.play_anim(url, anim_id, playback, play_properties, complete_function) end + +---Enable or disable visibility of a mesh +---@param url string|hash|url the model +---@param mesh_id string|hash|url the id of the mesh +---@param enabled boolean true if the mesh should be visible, false if it should be hideen +function model.set_mesh_enabled(url, mesh_id, enabled) end + +return model \ No newline at end of file diff --git a/annotations/defold/msg.lua b/annotations/defold/msg.lua new file mode 100644 index 0000000..a14c2fd --- /dev/null +++ b/annotations/defold/msg.lua @@ -0,0 +1,54 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Messaging API documentation + + Functions for passing messages and constructing URL objects. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.msg +msg = {} + +---Post a message to a receiving URL. The most common case is to send messages +---to a component. If the component part of the receiver is omitted, the message +---is broadcast to all components in the game object. +---The following receiver shorthands are available: +---"." the current game object +---"#" the current component +--- There is a 2 kilobyte limit to the message parameter table size. +---@param receiver string|url|hash The receiver must be a string in URL-format, a URL object or a hashed string. +---@param message_id string|hash The id must be a string or a hashed string. +---@param message table|nil a lua table with message parameters to send. +function msg.post(receiver, message_id, message) end + +---creates a new URL from separate arguments +---@param socket string|hash|nil socket of the URL +---@param path string|hash|nil path of the URL +---@param fragment string|hash|nil fragment of the URL +---@return url url a new URL +function msg.url(socket, path, fragment) end + +---The format of the string must be [socket:][path][#fragment], which is similar to a HTTP URL. +---When addressing instances: +---socket is the name of a valid world (a collection) +---path is the id of the instance, which can either be relative the instance of the calling script or global +---fragment would be the id of the desired component +---In addition, the following shorthands are available: +---"." the current game object +---"#" the current component +---@param urlstring string string to create the url from +---@return url url a new URL +function msg.url(urlstring) end + +---This is equivalent to msg.url(nil) or msg.url("#"), which creates an url to the current +---script component. +---@return url url a new URL +function msg.url() end + +return msg \ No newline at end of file diff --git a/annotations/defold/particlefx.lua b/annotations/defold/particlefx.lua new file mode 100644 index 0000000..7f59db8 --- /dev/null +++ b/annotations/defold/particlefx.lua @@ -0,0 +1,85 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Particle effects API documentation + + Functions for controlling particle effect component playback and + shader constants. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.particlefx +particlefx = {} + +---The emitter is not spawning any particles, but has particles that are still alive. +particlefx.EMITTER_STATE_POSTSPAWN = nil + +---The emitter will be in this state when it has been started but before spawning any particles. Normally the emitter is in this state for a short time, depending on if a start delay has been set for this emitter or not. +particlefx.EMITTER_STATE_PRESPAWN = nil + +---The emitter does not have any living particles and will not spawn any particles in this state. +particlefx.EMITTER_STATE_SLEEPING = nil + +---The emitter is spawning particles. +particlefx.EMITTER_STATE_SPAWNING = nil + +---Starts playing a particle FX component. +---Particle FX started this way need to be manually stopped through particlefx.stop(). +---Which particle FX to play is identified by the URL. +--- A particle FX will continue to emit particles even if the game object the particle FX component belonged to is deleted. You can call particlefx.stop() to stop it from emitting more particles. +---@param url string|hash|url the particle fx that should start playing. +---@param emitter_state_function fun(self, id, emitter, state)|nil optional callback function that will be called when an emitter attached to this particlefx changes state. +--- +---self +---object The current object +---id +---hash The id of the particle fx component +---emitter +---hash The id of the emitter +---state +---constant the new state of the emitter: +--- +--- +---particlefx.EMITTER_STATE_SLEEPING +---particlefx.EMITTER_STATE_PRESPAWN +---particlefx.EMITTER_STATE_SPAWNING +---particlefx.EMITTER_STATE_POSTSPAWN +--- +function particlefx.play(url, emitter_state_function) end + +---Resets a shader constant for a particle FX component emitter. +---The constant must be defined in the material assigned to the emitter. +---Resetting a constant through this function implies that the value defined in the material will be used. +---Which particle FX to reset a constant for is identified by the URL. +---@param url string|hash|url the particle FX that should have a constant reset +---@param emitter string|hash the id of the emitter +---@param constant string|hash the name of the constant +function particlefx.reset_constant(url, emitter, constant) end + +---Sets a shader constant for a particle FX component emitter. +---The constant must be defined in the material assigned to the emitter. +---Setting a constant through this function will override the value set for that constant in the material. +---The value will be overridden until particlefx.reset_constant is called. +---Which particle FX to set a constant for is identified by the URL. +---@param url string|hash|url the particle FX that should have a constant set +---@param emitter string|hash the id of the emitter +---@param constant string|hash the name of the constant +---@param value vector4 the value of the constant +function particlefx.set_constant(url, emitter, constant, value) end + +---Stops a particle FX component from playing. +---Stopping a particle FX does not remove already spawned particles. +---Which particle FX to stop is identified by the URL. +---@param url string|hash|url the particle fx that should stop playing +---@param options { clear:boolean|nil }|nil Options when stopping the particle fx. Supported options: +--- +---boolean clear: instantly clear spawned particles +--- +function particlefx.stop(url, options) end + +return particlefx \ No newline at end of file diff --git a/annotations/defold/physics.lua b/annotations/defold/physics.lua new file mode 100644 index 0000000..17f19b7 --- /dev/null +++ b/annotations/defold/physics.lua @@ -0,0 +1,300 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Collision object physics API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.physics +physics = {} + +---The following properties are available when connecting a joint of JOINT_TYPE_FIXED type: +physics.JOINT_TYPE_FIXED = nil + +---The following properties are available when connecting a joint of JOINT_TYPE_HINGE type: +physics.JOINT_TYPE_HINGE = nil + +---The following properties are available when connecting a joint of JOINT_TYPE_SLIDER type: +physics.JOINT_TYPE_SLIDER = nil + +---The following properties are available when connecting a joint of JOINT_TYPE_SPRING type: +physics.JOINT_TYPE_SPRING = nil + +---The following properties are available when connecting a joint of JOINT_TYPE_WELD type: +physics.JOINT_TYPE_WELD = nil + +---The following properties are available when connecting a joint of JOINT_TYPE_WHEEL type: +physics.JOINT_TYPE_WHEEL = nil + +physics.SHAPE_TYPE_SPHERE = nil + +physics.SHAPE_TYPE_BOX = nil + +physics.SHAPE_TYPE_CAPSULE = nil + +physics.SHAPE_TYPE_HULL = nil + +---Create a physics joint between two collision object components. +---Note: Currently only supported in 2D physics. +---@param joint_type number the joint type +---@param collisionobject_a string|hash|url first collision object +---@param joint_id string|hash id of the joint +---@param position_a vector3 local position where to attach the joint on the first collision object +---@param collisionobject_b string|hash|url second collision object +---@param position_b vector3 local position where to attach the joint on the second collision object +---@param properties table|nil optional joint specific properties table +---See each joint type for possible properties field. The one field that is accepted for all joint types is: +---- boolean collide_connected: Set this flag to true if the attached bodies should collide. +function physics.create_joint(joint_type, collisionobject_a, joint_id, position_a, collisionobject_b, position_b, properties) end + +---Destroy an already physics joint. The joint has to be created before a +---destroy can be issued. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url collision object where the joint exist +---@param joint_id string|hash id of the joint +function physics.destroy_joint(collisionobject, joint_id) end + +---Get the gravity in runtime. The gravity returned is not global, it will return +---the gravity for the collection that the function is called from. +---Note: For 2D physics the z component will always be zero. +---@return vector3 gravity gravity vector of collection +function physics.get_gravity() end + +---Returns the group name of a collision object as a hash. +---@param url string|hash|url the collision object to return the group of. +---@return hash group hash value of the group. +---local function check_is_enemy() +--- local group = physics.get_group("#collisionobject") +--- return group == hash("enemy") +---end +--- +function physics.get_group(url) end + +---Get a table for properties for a connected joint. The joint has to be created before +---properties can be retrieved. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url collision object where the joint exist +---@param joint_id string|hash id of the joint +---@return { collide_connected:boolean|nil } properties properties table. See the joint types for what fields are available, the only field available for all types is: +--- +---boolean collide_connected: Set this flag to true if the attached bodies should collide. +--- +function physics.get_joint_properties(collisionobject, joint_id) end + +---Get the reaction force for a joint. The joint has to be created before +---the reaction force can be calculated. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url collision object where the joint exist +---@param joint_id string|hash id of the joint +---@return vector3 force reaction force for the joint +function physics.get_joint_reaction_force(collisionobject, joint_id) end + +---Get the reaction torque for a joint. The joint has to be created before +---the reaction torque can be calculated. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url collision object where the joint exist +---@param joint_id string|hash id of the joint +---@return float torque the reaction torque on bodyB in N*m. +function physics.get_joint_reaction_torque(collisionobject, joint_id) end + +---Returns true if the specified group is set in the mask of a collision +---object, false otherwise. +---@param url string|hash|url the collision object to check the mask of. +---@param group string the name of the group to check for. +---@return boolean maskbit boolean value of the maskbit. 'true' if present, 'false' otherwise. +---local function is_invincible() +--- -- check if the collisionobject would collide with the "bullet" group +--- local invincible = physics.get_maskbit("#collisionobject", "bullet") +--- return invincible +---end +--- +function physics.get_maskbit(url, group) end + +---Gets collision shape data from a collision object +---@param url string|hash|url the collision object. +---@param shape string|hash the name of the shape to get data for. +---@return { type:number|nil, diameter:number|nil, dimensions:vector3|nil, height:number|nil } table A table containing meta data about the physics shape +--- +---type +---number The shape type. Supported values: +--- +--- +---physics.SHAPE_TYPE_SPHERE +---physics.SHAPE_TYPE_BOX +---physics.SHAPE_TYPE_CAPSULE Only supported for 3D physics +---physics.SHAPE_TYPE_HULL +--- +---The returned table contains different fields depending on which type the shape is. +---If the shape is a sphere: +--- +---diameter +---number the diameter of the sphere shape +--- +---If the shape is a box: +--- +---dimensions +---vector3 a vmath.vector3 of the box dimensions +--- +---If the shape is a capsule: +--- +---diameter +---number the diameter of the capsule poles +---height +---number the height of the capsule +--- +---local function get_shape_meta() +--- local sphere = physics.get_shape("#collisionobject", "my_sphere_shape") +--- -- returns a table with sphere.diameter +--- return sphere +---end +--- +function physics.get_shape(url, shape) end + +---Ray casts are used to test for intersections against collision objects in the physics world. +---Collision objects of types kinematic, dynamic and static are tested against. Trigger objects +---do not intersect with ray casts. +---Which collision objects to hit is filtered by their collision groups and can be configured +---through groups. +---@param from vector3 the world position of the start of the ray +---@param to vector3 the world position of the end of the ray +---@param groups table a lua table containing the hashed groups for which to test collisions against +---@param options { all:boolean|nil }|nil a lua table containing options for the raycast. +--- +---all +---boolean Set to true to return all ray cast hits. If false, it will only return the closest hit. +--- +---@return physics.raycast_response[]|physics.raycast_response|nil result It returns a list. If missed it returns nil. See ray_cast_response for details on the returned values. +function physics.raycast(from, to, groups, options) end + +---Ray casts are used to test for intersections against collision objects in the physics world. +---Collision objects of types kinematic, dynamic and static are tested against. Trigger objects +---do not intersect with ray casts. +---Which collision objects to hit is filtered by their collision groups and can be configured +---through groups. +---The actual ray cast will be performed during the physics-update. +---If an object is hit, the result will be reported via a ray_cast_response message. +---If there is no object hit, the result will be reported via a ray_cast_missed message. +---@param from vector3 the world position of the start of the ray +---@param to vector3 the world position of the end of the ray +---@param groups table a lua table containing the hashed groups for which to test collisions against +---@param request_id number|nil a number between [0,-255]. It will be sent back in the response for identification, 0 by default +function physics.raycast_async(from, to, groups, request_id) end + +---Set the gravity in runtime. The gravity change is not global, it will only affect +---the collection that the function is called from. +---Note: For 2D physics the z component of the gravity vector will be ignored. +---@param gravity vector3 the new gravity vector +function physics.set_gravity(gravity) end + +---Updates the group property of a collision object to the specified +---string value. The group name should exist i.e. have been used in +---a collision object in the editor. +---@param url string|hash|url the collision object affected. +---@param group string the new group name to be assigned. +---local function change_collision_group() +--- physics.set_group("#collisionobject", "enemy") +---end +--- +function physics.set_group(url, group) end + +---Flips the collision shapes horizontally for a collision object +---@param url string|hash|url the collision object that should flip its shapes +---@param flip boolean true if the collision object should flip its shapes, false if not +function physics.set_hflip(url, flip) end + +---Updates the properties for an already connected joint. The joint has to be created before +---properties can be changed. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url collision object where the joint exist +---@param joint_id string|hash id of the joint +---@param properties table joint specific properties table +---Note: The collide_connected field cannot be updated/changed after a connection has been made. +function physics.set_joint_properties(collisionobject, joint_id, properties) end + +---sets a physics world event listener. If a function is set, physics messages will no longer be sent. +---@param callback fun(self, event, data)|nil A callback that receives information about all the physics interactions in this physics world. +--- +---self +---object The calling script +---event +---constant The type of event. Can be one of these messages: +--- +--- +---contact_point_event +---collision_event +---trigger_event +---ray_cast_response +---ray_cast_missed +--- +--- +---data +---table The callback value data is a table that contains event-related data. See the documentation for details on the messages. +--- +function physics.set_listener(callback) end + +---Sets or clears the masking of a group (maskbit) in a collision object. +---@param url string|hash|url the collision object to change the mask of. +---@param group string the name of the group (maskbit) to modify in the mask. +---@param maskbit boolean boolean value of the new maskbit. 'true' to enable, 'false' to disable. +---local function make_invincible() +--- -- no longer collide with the "bullet" group +--- physics.set_maskbit("#collisionobject", "bullet", false) +---end +--- +function physics.set_maskbit(url, group, maskbit) end + +---Sets collision shape data for a collision object. Please note that updating data in 3D +---can be quite costly for box and capsules. Because of the physics engine, the cost +---comes from having to recreate the shape objects when certain shapes needs to be updated. +---@param url string|hash|url the collision object. +---@param shape string|hash the name of the shape to get data for. +---@param table { diameter:number|nil, dimensions:vector3|nil, height:number|nil } the shape data to update the shape with. +---See physics.get_shape for a detailed description of each field in the data table. +---local function set_shape_data() +--- -- set capsule shape data +--- local data = {} +--- data.diameter = 10 +--- data.height = 20 +--- physics.set_shape("#collisionobject", "my_capsule_shape", data) +--- +--- -- set sphere shape data +--- data = {} +--- data.diameter = 10 +--- physics.set_shape("#collisionobject", "my_sphere_shape", data) +--- +--- -- set box shape data +--- data = {} +--- data.dimensions = vmath.vector3(10, 10, 5) +--- physics.set_shape("#collisionobject", "my_box_shape", data) +---end +--- +function physics.set_shape(url, shape, table) end + +---Flips the collision shapes vertically for a collision object +---@param url string|hash|url the collision object that should flip its shapes +---@param flip boolean true if the collision object should flip its shapes, false if not +function physics.set_vflip(url, flip) end + +---The function recalculates the density of each shape based on the total area of all shapes and the specified mass, then updates the mass of the body accordingly. +---Note: Currently only supported in 2D physics. +---@param collisionobject string|hash|url the collision object whose mass needs to be updated. +---@param mass number the new mass value to set for the collision object. +function physics.update_mass(collisionobject, mass) end + +---Collision objects tend to fall asleep when inactive for a small period of time for +---efficiency reasons. This function wakes them up. +---@param url string|hash|url the collision object to wake. +---function on_input(self, action_id, action) +--- if action_id == hash("test") and action.pressed then +--- physics.wakeup("#collisionobject") +--- end +---end +--- +function physics.wakeup(url) end + +return physics \ No newline at end of file diff --git a/annotations/defold/profiler.lua b/annotations/defold/profiler.lua new file mode 100644 index 0000000..348fba5 --- /dev/null +++ b/annotations/defold/profiler.lua @@ -0,0 +1,126 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Profiler API documentation + + Functions for getting profiling data in runtime. + More detailed profiling and debugging information available in the manuals. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.profiler +profiler = {} + +---pause on current frame +profiler.MODE_PAUSE = nil + +---start recording +profiler.MODE_RECORD = nil + +---continously show latest frame +profiler.MODE_RUN = nil + +---pause at peak frame +profiler.MODE_SHOW_PEAK_FRAME = nil + +---show full profiler ui +profiler.VIEW_MODE_FULL = nil + +---show mimimal profiler ui +profiler.VIEW_MODE_MINIMIZED = nil + +---Creates and shows or hides and destroys the on-sceen profiler ui +---The profiler is a real-time tool that shows the numbers of milliseconds spent +---in each scope per frame as well as counters. The profiler is very useful for +---tracking down performance and resource problems. +---@param enabled boolean true to enable, false to disable +function profiler.enable_ui(enabled) end + +---Get the percent of CPU usage by the application, as reported by the OS. +--- This function is not available on HTML5. +---For some platforms ( Android, Linux and Windows), this information is only available +---by default in the debug version of the engine. It can be enabled in release version as well +---by checking track_cpu under profiler in the game.project file. +---(This means that the engine will sample the CPU usage in intervalls during execution even in release mode.) +---@return number percent of CPU used by the application +function profiler.get_cpu_usage() end + +---Get the amount of memory used (resident/working set) by the application in bytes, as reported by the OS. +--- This function is not available on HTML5. +---The values are gathered from internal OS functions which correspond to the following; +---OS +---Value +--- iOS MacOSAndroid Linux +---Resident memory +--- Windows +---Working set +--- HTML5 +--- Not available +---@return number bytes used by the application +function profiler.get_memory_usage() end + +---Send a text to the profiler +---@param text string the string to send to the profiler +function profiler.log_text(text) end + +---Get the number of recorded frames in the on-screen profiler ui recording buffer +---@return number frame_count the number of recorded frames, zero if on-screen profiler is disabled +function profiler.recorded_frame_count() end + +---Starts a profile scope. +---@param name string The name of the scope +function profiler.scope_begin(name) end + +---End the current profile scope. +function profiler.scope_end() end + +---Set the on-screen profile mode - run, pause, record or show peak frame +---@param mode constant the mode to set the ui profiler in +--- +---profiler.MODE_RUN This is default mode that continously shows the last frame +---profiler.MODE_PAUSE Pauses on the currently displayed frame +---profiler.MODE_SHOW_PEAK_FRAME Pauses on the currently displayed frame but shows a new frame if that frame is slower +---profiler.MODE_RECORD Records all incoming frames to the recording buffer +--- +---To stop recording, switch to a different mode such as MODE_PAUSE or MODE_RUN. +---You can also use the view_recorded_frame function to display a recorded frame. Doing so stops the recording as well. +---Every time you switch to recording mode the recording buffer is cleared. +---The recording buffer is also cleared when setting the MODE_SHOW_PEAK_FRAME mode. +function profiler.set_ui_mode(mode) end + +---Set the on-screen profile view mode - minimized or expanded +---@param mode constant the view mode to set the ui profiler in +--- +---profiler.VIEW_MODE_FULL The default mode which displays all the ui profiler details +---profiler.VIEW_MODE_MINIMIZED Minimized mode which only shows the top header (fps counters and ui profiler mode) +--- +function profiler.set_ui_view_mode(mode) end + +---Shows or hides the time the engine waits for vsync in the on-screen profiler +---Each frame the engine waits for vsync and depending on your vsync settings and how much time +---your game logic takes this time can dwarf the time in the game logic making it hard to +---see details in the on-screen profiler graph and lists. +---Also, by hiding this the FPS times in the header show the time spent each time excuding the +---time spent waiting for vsync. This shows you how long time your game is spending actively +---working each frame. +---This setting also effects the display of recorded frames but does not affect the actual +---recorded frames so it is possible to toggle this on and off when viewing recorded frames. +---By default the vsync wait times is displayed in the profiler. +---@param visible boolean true to include it in the display, false to hide it. +function profiler.set_ui_vsync_wait_visible(visible) end + +---Pauses and displays a frame from the recording buffer in the on-screen profiler ui +---The frame to show can either be an absolute frame or a relative frame to the current frame. +---@param frame_index table a table where you specify one of the following parameters: +--- +---distance The offset from the currently displayed frame (this is truncated between zero and the number of recorded frames) +---frame The frame index in the recording buffer (1 is first recorded frame) +--- +function profiler.view_recorded_frame(frame_index) end + +return profiler \ No newline at end of file diff --git a/annotations/defold/render.lua b/annotations/defold/render.lua new file mode 100644 index 0000000..b691d44 --- /dev/null +++ b/annotations/defold/render.lua @@ -0,0 +1,674 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Rendering API documentation + + Rendering functions, messages and constants. The "render" namespace is + accessible only from render scripts. + The rendering API was originally built on top of OpenGL ES 2.0, and it uses a subset of the + OpenGL computer graphics rendering API for rendering 2D and 3D computer + graphics. Our current target is OpenGLES 3.0 with fallbacks to 2.0 on some platforms. + It is possible to create materials and write shaders that + require features not in OpenGL ES 2.0, but those will not work cross platform. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.render +render = {} + +--- +render.BLEND_CONSTANT_ALPHA = nil + +--- +render.BLEND_CONSTANT_COLOR = nil + +--- +render.BLEND_DST_ALPHA = nil + +--- +render.BLEND_DST_COLOR = nil + +--- +render.BLEND_ONE = nil + +--- +render.BLEND_ONE_MINUS_CONSTANT_ALPHA = nil + +--- +render.BLEND_ONE_MINUS_CONSTANT_COLOR = nil + +--- +render.BLEND_ONE_MINUS_DST_ALPHA = nil + +--- +render.BLEND_ONE_MINUS_DST_COLOR = nil + +--- +render.BLEND_ONE_MINUS_SRC_ALPHA = nil + +--- +render.BLEND_ONE_MINUS_SRC_COLOR = nil + +--- +render.BLEND_SRC_ALPHA = nil + +--- +render.BLEND_SRC_ALPHA_SATURATE = nil + +--- +render.BLEND_SRC_COLOR = nil + +--- +render.BLEND_ZERO = nil + +--- +render.BUFFER_COLOR0_BIT = nil + +--- +render.BUFFER_COLOR1_BIT = nil + +--- +render.BUFFER_COLOR2_BIT = nil + +--- +render.BUFFER_COLOR3_BIT = nil + +--- +render.BUFFER_COLOR_BIT = nil + +--- +render.BUFFER_DEPTH_BIT = nil + +--- +render.BUFFER_STENCIL_BIT = nil + +--- +render.COMPARE_FUNC_ALWAYS = nil + +--- +render.COMPARE_FUNC_EQUAL = nil + +--- +render.COMPARE_FUNC_GEQUAL = nil + +--- +render.COMPARE_FUNC_GREATER = nil + +--- +render.COMPARE_FUNC_LEQUAL = nil + +--- +render.COMPARE_FUNC_LESS = nil + +--- +render.COMPARE_FUNC_NEVER = nil + +--- +render.COMPARE_FUNC_NOTEQUAL = nil + +--- +render.FACE_BACK = nil + +--- +render.FACE_FRONT = nil + +--- +render.FACE_FRONT_AND_BACK = nil + +--- +render.FILTER_LINEAR = nil + +--- +render.FILTER_NEAREST = nil + +--- +render.FORMAT_DEPTH = nil + +--- +render.FORMAT_LUMINANCE = nil + +---May be nil if the format isn't supported +render.FORMAT_R16F = nil + +---May be nil if the format isn't supported +render.FORMAT_R32F = nil + +---May be nil if the format isn't supported +render.FORMAT_RG16F = nil + +---May be nil if the format isn't supported +render.FORMAT_RG32F = nil + +--- +render.FORMAT_RGB = nil + +---May be nil if the format isn't supported +render.FORMAT_RGB16F = nil + +---May be nil if the format isn't supported +render.FORMAT_RGB32F = nil + +--- +render.FORMAT_RGBA = nil + +---May be nil if the format isn't supported +render.FORMAT_RGBA16F = nil + +---May be nil if the format isn't supported +render.FORMAT_RGBA32F = nil + +--- +render.FORMAT_STENCIL = nil + +--- +render.FRUSTUM_PLANES_ALL = nil + +--- +render.FRUSTUM_PLANES_SIDES = nil + +--- +render.RENDER_TARGET_DEFAULT = nil + +--- +render.STATE_BLEND = nil + +--- +render.STATE_CULL_FACE = nil + +--- +render.STATE_DEPTH_TEST = nil + +--- +render.STATE_POLYGON_OFFSET_FILL = nil + +--- +render.STATE_STENCIL_TEST = nil + +--- +render.STENCIL_OP_DECR = nil + +--- +render.STENCIL_OP_DECR_WRAP = nil + +--- +render.STENCIL_OP_INCR = nil + +--- +render.STENCIL_OP_INCR_WRAP = nil + +--- +render.STENCIL_OP_INVERT = nil + +--- +render.STENCIL_OP_KEEP = nil + +--- +render.STENCIL_OP_REPLACE = nil + +--- +render.STENCIL_OP_ZERO = nil + +--- +render.WRAP_CLAMP_TO_BORDER = nil + +--- +render.WRAP_CLAMP_TO_EDGE = nil + +--- +render.WRAP_MIRRORED_REPEAT = nil + +--- +render.WRAP_REPEAT = nil + +---Clear buffers in the currently enabled render target with specified value. If the render target has been created with multiple +---color attachments, all buffers will be cleared with the same value. +---@param buffers table table with keys specifying which buffers to clear and values set to clear values. Available keys are: +--- +---render.BUFFER_COLOR_BIT +---render.BUFFER_DEPTH_BIT +---render.BUFFER_STENCIL_BIT +--- +function render.clear(buffers) end + +---Constant buffers are used to set shader program variables and are optionally passed to the render.draw() function. +---The buffer's constant elements can be indexed like an ordinary Lua table, but you can't iterate over them with pairs() or ipairs(). +---@return constant_buffer buffer new constant buffer +function render.constant_buffer() end + +---Deletes a render target created by a render script. +---You cannot delete a render target resource. +---@param render_target render_target render target to delete +function render.delete_render_target(render_target) end + +---If a material is currently enabled, disable it. +---The name of the material must be specified in the ".render" resource set +---in the "game.project" setting. +function render.disable_material() end + +---Disables a render state. +---@param state constant state to disable +--- +---render.STATE_DEPTH_TEST +---render.STATE_STENCIL_TEST +---render.STATE_BLEND +---render.STATE_ALPHA_TEST ( not available on iOS and Android) +---render.STATE_CULL_FACE +---render.STATE_POLYGON_OFFSET_FILL +--- +function render.disable_state(state) end + +---Disables a texture that has previourly been enabled. +---@param binding number|string|hash texture binding, either by texture unit, string or hash that should be disabled +function render.disable_texture(binding) end + +---Draws all objects that match a specified predicate. An optional constant buffer can be +---provided to override the default constants. If no constants buffer is provided, a default +---system constants buffer is used containing constants as defined in materials and set through +---go.set (or particlefx.set_constant) on visual components. +---@param predicate render_predicate predicate to draw for +---@param options { frustum:matrix4|nil, frustum_planes:number|nil, constants:constant_buffer|nil }|nil optional table with properties: +--- +---frustum +---vmath.matrix4 A frustum matrix used to cull renderable items. (E.g. local frustum = proj * view). default=nil +---frustum_planes +---int Determines which sides of the frustum will be used. Default is render.FRUSTUM_PLANES_SIDES. +--- +--- +---render.FRUSTUM_PLANES_SIDES : The left, right, top and bottom sides of the frustum. +---render.FRUSTUM_PLANES_ALL : All 6 sides of the frustum. +--- +--- +---constants +---constant_buffer optional constants to use while rendering +--- +function render.draw(predicate, options) end + +---Draws all 3d debug graphics such as lines drawn with "draw_line" messages and physics visualization. +---@param options { frustum:matrix4|nil, frustum_planes:number|nil }|nil optional table with properties: +--- +---frustum +---vmath.matrix4 A frustum matrix used to cull renderable items. (E.g. local frustum = proj * view). May be nil. +---frustum_planes +---int Determines which sides of the frustum will be used. Default is render.FRUSTUM_PLANES_SIDES. +--- +--- +---render.FRUSTUM_PLANES_SIDES : The left, right, top and bottom sides of the frustum. +---render.FRUSTUM_PLANES_ALL : All sides of the frustum. +--- +function render.draw_debug3d(options) end + +---If another material was already enabled, it will be automatically disabled +---and the specified material is used instead. +---The name of the material must be specified in the ".render" resource set +---in the "game.project" setting. +---@param material_id string|hash material id to enable +function render.enable_material(material_id) end + +---Enables a particular render state. The state will be enabled until disabled. +---@param state constant state to enable +--- +---render.STATE_DEPTH_TEST +---render.STATE_STENCIL_TEST +---render.STATE_BLEND +---render.STATE_ALPHA_TEST ( not available on iOS and Android) +---render.STATE_CULL_FACE +---render.STATE_POLYGON_OFFSET_FILL +--- +function render.enable_state(state) end + +---Sets the specified texture handle for a render target attachment or a regular texture +---that should be used for rendering. The texture can be bound to either a texture unit +---or to a sampler name by a hash or a string. +---A texture can be bound to multiple units and sampler names at the same time, +---the actual binding will be applied to the shaders when a shader program is bound. +---When mixing binding using both units and sampler names, you might end up in situations +---where two different textures will be applied to the same bind location in the shader. +---In this case, the texture set to the named sampler will take precedence over the unit. +---Note that you can bind multiple sampler names to the same texture, in case you want to reuse +---the same texture for differnt use-cases. It is however recommended that you use the same name +---everywhere for the textures that should be shared across different materials. +---@param binding number|string|hash texture binding, either by texture unit, string or hash for the sampler name that the texture should be bound to +---@param handle_or_name resource_handle|string|hash render target or texture handle that should be bound, or a named resource in the "Render Resource" table in the currently assigned .render file +---@param buffer_type constant|nil optional buffer type from which to enable the texture. Note that this argument only applies to render targets. Defaults to render.BUFFER_COLOR_BIT. These values are supported: +--- +---render.BUFFER_COLOR_BIT +--- +---If The render target has been created as depth and/or stencil textures, these buffer types can be used: +--- +---render.BUFFER_DEPTH_BIT +---render.BUFFER_STENCIL_BIT +--- +---If the render target has been created with multiple color attachments, these buffer types can be used +---to enable those textures as well. Currently 4 color attachments are supported: +--- +---render.BUFFER_COLOR0_BIT +---render.BUFFER_COLOR1_BIT +---render.BUFFER_COLOR2_BIT +---render.BUFFER_COLOR3_BIT +--- +function render.enable_texture(binding, handle_or_name, buffer_type) end + +---Returns the logical window height that is set in the "game.project" settings. +---Note that the actual window pixel size can change, either by device constraints +---or user input. +---@return number height specified window height +function render.get_height() end + +---Returns the specified buffer height from a render target. +---@param render_target render_target render target from which to retrieve the buffer height +---@param buffer_type constant which type of buffer to retrieve the height from +--- +---render.BUFFER_COLOR_BIT +---render.BUFFER_DEPTH_BIT +---render.BUFFER_STENCIL_BIT +--- +---@return number height the height of the render target buffer texture +function render.get_render_target_height(render_target, buffer_type) end + +---Returns the specified buffer width from a render target. +---@param render_target render_target render target from which to retrieve the buffer width +---@param buffer_type constant which type of buffer to retrieve the width from +--- +---render.BUFFER_COLOR_BIT +---render.BUFFER_COLOR[x]_BIT (x: [0..3], if supported!) +---render.BUFFER_DEPTH_BIT +---render.BUFFER_STENCIL_BIT +--- +---@return number width the width of the render target buffer texture +function render.get_render_target_width(render_target, buffer_type) end + +---Returns the logical window width that is set in the "game.project" settings. +---Note that the actual window pixel size can change, either by device constraints +---or user input. +---@return number width specified window width (number) +function render.get_width() end + +---Returns the actual physical window height. +---Note that this value might differ from the logical height that is set in the +---"game.project" settings. +---@return number height actual window height +function render.get_window_height() end + +---Returns the actual physical window width. +---Note that this value might differ from the logical width that is set in the +---"game.project" settings. +---@return number width actual window width +function render.get_window_width() end + +---This function returns a new render predicate for objects with materials matching +---the provided material tags. The provided tags are combined into a bit mask +---for the predicate. If multiple tags are provided, the predicate matches materials +---with all tags ANDed together. +---The current limit to the number of tags that can be defined is 64. +---@param tags (string|hash)[] table of tags that the predicate should match. The tags can be of either hash or string type +---@return render_predicate predicate new predicate +function render.predicate(tags) end + +---Creates a new render target according to the supplied +---specification table. +---The table should contain keys specifying which buffers should be created +---with what parameters. Each buffer key should have a table value consisting +---of parameters. The following parameter keys are available: +---Key +---Values +---format +---render.FORMAT_LUMINANCErender.FORMAT_RGBrender.FORMAT_RGBArender.FORMAT_DEPTHrender.FORMAT_STENCILrender.FORMAT_RGBA32Frender.FORMAT_RGBA16F +---width +---number +---height +---number +---min_filter (optional) +---render.FILTER_LINEARrender.FILTER_NEAREST +---mag_filter (optional) +---render.FILTER_LINEARrender.FILTER_NEAREST +---u_wrap (optional) +---render.WRAP_CLAMP_TO_BORDERrender.WRAP_CLAMP_TO_EDGErender.WRAP_MIRRORED_REPEATrender.WRAP_REPEAT +---v_wrap (optional) +---render.WRAP_CLAMP_TO_BORDERrender.WRAP_CLAMP_TO_EDGErender.WRAP_MIRRORED_REPEATrender.WRAP_REPEAT +---flags (optional) +---render.TEXTURE_BIT (only applicable to depth and stencil buffers) +---The render target can be created to support multiple color attachments. Each attachment can have different format settings and texture filters, +---but attachments must be added in sequence, meaning you cannot create a render target at slot 0 and 3. +---Instead it has to be created with all four buffer types ranging from [0..3] (as denoted by render.BUFFER_COLORX_BIT where 'X' is the attachment you want to create). +---It is not guaranteed that the device running the script can support creating render targets with multiple color attachments. To check if the device can support multiple attachments, +---you can check if the render table contains any of the BUFFER_COLOR1_BIT, BUFFER_COLOR2_BIT or BUFFER_COLOR3_BIT constants: +---function init(self) +--- if render.BUFFER_COLOR1_BIT == nil then +--- -- this devices does not support multiple color attachments +--- end +---end +---@param name string render target name +---@param parameters table table of buffer parameters, see the description for available keys and values +---@return render_target render_target new render target +function render.render_target(name, parameters) end + +---Specifies the arithmetic used when computing pixel values that are written to the frame +---buffer. In RGBA mode, pixels can be drawn using a function that blends the source RGBA +---pixel values with the destination pixel values already in the frame buffer. +---Blending is initially disabled. +---source_factor specifies which method is used to scale the source color components. +---destination_factor specifies which method is used to scale the destination color +---components. +---Source color components are referred to as (Rs,Gs,Bs,As). +---Destination color components are referred to as (Rd,Gd,Bd,Ad). +---The color specified by setting the blendcolor is referred to as (Rc,Gc,Bc,Ac). +---The source scale factor is referred to as (sR,sG,sB,sA). +---The destination scale factor is referred to as (dR,dG,dB,dA). +---The color values have integer values between 0 and (kR,kG,kB,kA), where kc = 2mc - 1 and mc is the number of bitplanes for that color. I.e for 8 bit color depth, color values are between 0 and 255. +---Available factor constants and corresponding scale factors: +---Factor constant +---Scale factor (fR,fG,fB,fA) +---render.BLEND_ZERO +---(0,0,0,0) +---render.BLEND_ONE +---(1,1,1,1) +---render.BLEND_SRC_COLOR +---(Rs/kR,Gs/kG,Bs/kB,As/kA) +---render.BLEND_ONE_MINUS_SRC_COLOR +---(1,1,1,1) - (Rs/kR,Gs/kG,Bs/kB,As/kA) +---render.BLEND_DST_COLOR +---(Rd/kR,Gd/kG,Bd/kB,Ad/kA) +---render.BLEND_ONE_MINUS_DST_COLOR +---(1,1,1,1) - (Rd/kR,Gd/kG,Bd/kB,Ad/kA) +---render.BLEND_SRC_ALPHA +---(As/kA,As/kA,As/kA,As/kA) +---render.BLEND_ONE_MINUS_SRC_ALPHA +---(1,1,1,1) - (As/kA,As/kA,As/kA,As/kA) +---render.BLEND_DST_ALPHA +---(Ad/kA,Ad/kA,Ad/kA,Ad/kA) +---render.BLEND_ONE_MINUS_DST_ALPHA +---(1,1,1,1) - (Ad/kA,Ad/kA,Ad/kA,Ad/kA) +---render.BLEND_CONSTANT_COLOR +---(Rc,Gc,Bc,Ac) +---render.BLEND_ONE_MINUS_CONSTANT_COLOR +---(1,1,1,1) - (Rc,Gc,Bc,Ac) +---render.BLEND_CONSTANT_ALPHA +---(Ac,Ac,Ac,Ac) +---render.BLEND_ONE_MINUS_CONSTANT_ALPHA +---(1,1,1,1) - (Ac,Ac,Ac,Ac) +---render.BLEND_SRC_ALPHA_SATURATE +---(i,i,i,1) where i = min(As, kA - Ad) /kA +---The blended RGBA values of a pixel comes from the following equations: +---Rd = min(kR, Rs * sR + Rd * dR) +---Gd = min(kG, Gs * sG + Gd * dG) +---Bd = min(kB, Bs * sB + Bd * dB) +---Ad = min(kA, As * sA + Ad * dA) +---Blend function (render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA) is useful for +---drawing with transparency when the drawn objects are sorted from farthest to nearest. +---It is also useful for drawing antialiased points and lines in arbitrary order. +---@param source_factor constant source factor +---@param destination_factor constant destination factor +function render.set_blend_func(source_factor, destination_factor) end + +---Specifies whether the individual color components in the frame buffer is enabled for writing (true) or disabled (false). For example, if blue is false, nothing is written to the blue component of any pixel in any of the color buffers, regardless of the drawing operation attempted. Note that writing are either enabled or disabled for entire color components, not the individual bits of a component. +---The component masks are all initially true. +---@param red boolean red mask +---@param green boolean green mask +---@param blue boolean blue mask +---@param alpha boolean alpha mask +function render.set_color_mask(red, green, blue, alpha) end + +---Specifies whether front- or back-facing polygons can be culled +---when polygon culling is enabled. Polygon culling is initially disabled. +---If mode is render.FACE_FRONT_AND_BACK, no polygons are drawn, but other +---primitives such as points and lines are drawn. The initial value for +---face_type is render.FACE_BACK. +---@param face_type constant face type +--- +---render.FACE_FRONT +---render.FACE_BACK +---render.FACE_FRONT_AND_BACK +--- +function render.set_cull_face(face_type) end + +---Specifies the function that should be used to compare each incoming pixel +---depth value with the value present in the depth buffer. +---The comparison is performed only if depth testing is enabled and specifies +---the conditions under which a pixel will be drawn. +---Function constants: +---render.COMPARE_FUNC_NEVER (never passes) +---render.COMPARE_FUNC_LESS (passes if the incoming depth value is less than the stored value) +---render.COMPARE_FUNC_LEQUAL (passes if the incoming depth value is less than or equal to the stored value) +---render.COMPARE_FUNC_GREATER (passes if the incoming depth value is greater than the stored value) +---render.COMPARE_FUNC_GEQUAL (passes if the incoming depth value is greater than or equal to the stored value) +---render.COMPARE_FUNC_EQUAL (passes if the incoming depth value is equal to the stored value) +---render.COMPARE_FUNC_NOTEQUAL (passes if the incoming depth value is not equal to the stored value) +---render.COMPARE_FUNC_ALWAYS (always passes) +---The depth function is initially set to render.COMPARE_FUNC_LESS. +---@param func constant depth test function, see the description for available values +function render.set_depth_func(func) end + +---Specifies whether the depth buffer is enabled for writing. The supplied mask governs +---if depth buffer writing is enabled (true) or disabled (false). +---The mask is initially true. +---@param depth boolean depth mask +function render.set_depth_mask(depth) end + +---Sets the scale and units used to calculate depth values. +---If render.STATE_POLYGON_OFFSET_FILL is enabled, each fragment's depth value +---is offset from its interpolated value (depending on the depth value of the +---appropriate vertices). Polygon offset can be used when drawing decals, rendering +---hidden-line images etc. +---factor specifies a scale factor that is used to create a variable depth +---offset for each polygon. The initial value is 0. +---units is multiplied by an implementation-specific value to create a +---constant depth offset. The initial value is 0. +---The value of the offset is computed as factor × DZ + r × units +---DZ is a measurement of the depth slope of the polygon which is the change in z (depth) +---values divided by the change in either x or y coordinates, as you traverse a polygon. +---The depth values are in window coordinates, clamped to the range [0, 1]. +---r is the smallest value that is guaranteed to produce a resolvable difference. +---It's value is an implementation-specific constant. +---The offset is added before the depth test is performed and before the +---value is written into the depth buffer. +---@param factor number polygon offset factor +---@param units number polygon offset units +function render.set_polygon_offset(factor, units) end + +---Sets the projection matrix to use when rendering. +---@param matrix matrix4 projection matrix +function render.set_projection(matrix) end + +---Sets a render target. Subsequent draw operations will be to the +---render target until it is replaced by a subsequent call to set_render_target. +---This function supports render targets created by a render script, or a render target resource. +---@param render_target render_target render target to set. render.RENDER_TARGET_DEFAULT to set the default render target +---@param options { transient:number[]|nil }|nil optional table with behaviour parameters +--- +---transient +---table Transient frame buffer types are only valid while the render target is active, i.e becomes undefined when a new target is set by a subsequent call to set_render_target. +--- Default is all non-transient. Be aware that some hardware uses a combined depth stencil buffer and when this is the case both are considered non-transient if exclusively selected! +--- A buffer type defined that doesn't exist in the render target is silently ignored. +--- +--- +---render.BUFFER_COLOR_BIT +---render.BUFFER_DEPTH_BIT +---render.BUFFER_STENCIL_BIT +--- +function render.set_render_target(render_target, options) end + +---Sets the render target size for a render target created from +---either a render script, or from a render target resource. +---@param render_target render_target render target to set size for +---@param width number new render target width +---@param height number new render target height +function render.set_render_target_size(render_target, width, height) end + +---Stenciling is similar to depth-buffering as it enables and disables drawing on a +---per-pixel basis. First, GL drawing primitives are drawn into the stencil planes. +---Second, geometry and images are rendered but using the stencil planes to mask out +---where to draw. +---The stencil test discards a pixel based on the outcome of a comparison between the +---reference value ref and the corresponding value in the stencil buffer. +---func specifies the comparison function. See the table below for values. +---The initial value is render.COMPARE_FUNC_ALWAYS. +---ref specifies the reference value for the stencil test. The value is clamped to +---the range [0, 2n-1], where n is the number of bitplanes in the stencil buffer. +---The initial value is 0. +---mask is ANDed with both the reference value and the stored stencil value when the test +---is done. The initial value is all 1's. +---Function constant: +---render.COMPARE_FUNC_NEVER (never passes) +---render.COMPARE_FUNC_LESS (passes if (ref & mask) < (stencil & mask)) +---render.COMPARE_FUNC_LEQUAL (passes if (ref & mask) <= (stencil & mask)) +---render.COMPARE_FUNC_GREATER (passes if (ref & mask) > (stencil & mask)) +---render.COMPARE_FUNC_GEQUAL (passes if (ref & mask) >= (stencil & mask)) +---render.COMPARE_FUNC_EQUAL (passes if (ref & mask) = (stencil & mask)) +---render.COMPARE_FUNC_NOTEQUAL (passes if (ref & mask) != (stencil & mask)) +---render.COMPARE_FUNC_ALWAYS (always passes) +---@param func constant stencil test function, see the description for available values +---@param ref number reference value for the stencil test +---@param mask number mask that is ANDed with both the reference value and the stored stencil value when the test is done +function render.set_stencil_func(func, ref, mask) end + +---The stencil mask controls the writing of individual bits in the stencil buffer. +---The least significant n bits of the parameter mask, where n is the number of +---bits in the stencil buffer, specify the mask. +---Where a 1 bit appears in the mask, the corresponding +---bit in the stencil buffer can be written. Where a 0 bit appears in the mask, +---the corresponding bit in the stencil buffer is never written. +---The mask is initially all 1's. +---@param mask number stencil mask +function render.set_stencil_mask(mask) end + +---The stencil test discards a pixel based on the outcome of a comparison between the +---reference value ref and the corresponding value in the stencil buffer. +---To control the test, call render.set_stencil_func. +---This function takes three arguments that control what happens to the stored stencil +---value while stenciling is enabled. If the stencil test fails, no change is made to the +---pixel's color or depth buffers, and sfail specifies what happens to the stencil buffer +---contents. +---Operator constants: +---render.STENCIL_OP_KEEP (keeps the current value) +---render.STENCIL_OP_ZERO (sets the stencil buffer value to 0) +---render.STENCIL_OP_REPLACE (sets the stencil buffer value to ref, as specified by render.set_stencil_func) +---render.STENCIL_OP_INCR (increments the stencil buffer value and clamp to the maximum representable unsigned value) +---render.STENCIL_OP_INCR_WRAP (increments the stencil buffer value and wrap to zero when incrementing the maximum representable unsigned value) +---render.STENCIL_OP_DECR (decrements the current stencil buffer value and clamp to 0) +---render.STENCIL_OP_DECR_WRAP (decrements the current stencil buffer value and wrap to the maximum representable unsigned value when decrementing zero) +---render.STENCIL_OP_INVERT (bitwise inverts the current stencil buffer value) +---dppass and dpfail specify the stencil buffer actions depending on whether subsequent +---depth buffer tests succeed (dppass) or fail (dpfail). +---The initial value for all operators is render.STENCIL_OP_KEEP. +---@param sfail constant action to take when the stencil test fails +---@param dpfail constant the stencil action when the stencil test passes +---@param dppass constant the stencil action when both the stencil test and the depth test pass, or when the stencil test passes and either there is no depth buffer or depth testing is not enabled +function render.set_stencil_op(sfail, dpfail, dppass) end + +---Sets the view matrix to use when rendering. +---@param matrix matrix4 view matrix to set +function render.set_view(matrix) end + +---Set the render viewport to the specified rectangle. +---@param x number left corner +---@param y number bottom corner +---@param width number viewport width +---@param height number viewport height +function render.set_viewport(x, y, width, height) end + +return render \ No newline at end of file diff --git a/annotations/defold/resource.lua b/annotations/defold/resource.lua new file mode 100644 index 0000000..b812d2d --- /dev/null +++ b/annotations/defold/resource.lua @@ -0,0 +1,760 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Resource API documentation + + Functions and constants to access resources. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.resource +resource = {} + +---BASIS_UASTC compression type +resource.COMPRESSION_TYPE_BASIS_UASTC = nil + +---COMPRESSION_TYPE_DEFAULT compression type +resource.COMPRESSION_TYPE_DEFAULT = nil + +---luminance type texture format +resource.TEXTURE_FORMAT_LUMINANCE = nil + +---R16F type texture format +resource.TEXTURE_FORMAT_R16F = nil + +---R32F type texture format +resource.TEXTURE_FORMAT_R32F = nil + +---RG16F type texture format +resource.TEXTURE_FORMAT_RG16F = nil + +---RG32F type texture format +resource.TEXTURE_FORMAT_RG32F = nil + +---RGB type texture format +resource.TEXTURE_FORMAT_RGB = nil + +---RGB16F type texture format +resource.TEXTURE_FORMAT_RGB16F = nil + +---RGB32F type texture format +resource.TEXTURE_FORMAT_RGB32F = nil + +---RGBA type texture format +resource.TEXTURE_FORMAT_RGBA = nil + +---RGBA16F type texture format +resource.TEXTURE_FORMAT_RGBA16F = nil + +---RGBA32F type texture format +resource.TEXTURE_FORMAT_RGBA32F = nil + +---RGBA_ASTC_4x4 type texture format +resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 = nil + +---RGBA_BC3 type texture format +resource.TEXTURE_FORMAT_RGBA_BC3 = nil + +---RGBA_BC7 type texture format +resource.TEXTURE_FORMAT_RGBA_BC7 = nil + +---RGBA_ETC2 type texture format +resource.TEXTURE_FORMAT_RGBA_ETC2 = nil + +---RGBA_PVRTC_2BPPV1 type texture format +resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 = nil + +---RGBA_PVRTC_4BPPV1 type texture format +resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 = nil + +---RGB_BC1 type texture format +resource.TEXTURE_FORMAT_RGB_BC1 = nil + +---RGB_ETC1 type texture format +resource.TEXTURE_FORMAT_RGB_ETC1 = nil + +---RGB_PVRTC_2BPPV1 type texture format +resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 = nil + +---RGB_PVRTC_4BPPV1 type texture format +resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 = nil + +---RG_BC5 type texture format +resource.TEXTURE_FORMAT_RG_BC5 = nil + +---R_BC4 type texture format +resource.TEXTURE_FORMAT_R_BC4 = nil + +---2D texture type +resource.TEXTURE_TYPE_2D = nil + +---2D Array texture type +resource.TEXTURE_TYPE_2D_ARRAY = nil + +---Cube map texture type +resource.TEXTURE_TYPE_CUBE_MAP = nil + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.atlas(path) end + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.buffer(path) end + +---This function creates a new atlas resource that can be used in the same way as any atlas created during build time. +---The path used for creating the atlas must be unique, trying to create a resource at a path that is already +---registered will trigger an error. If the intention is to instead modify an existing atlas, use the resource.set_atlas +---function. Also note that the path to the new atlas resource must have a '.texturesetc' extension, +---meaning "/path/my_atlas" is not a valid path but "/path/my_atlas.texturesetc" is. +---When creating the atlas, at least one geometry and one animation is required, and an error will be +---raised if these requirements are not met. A reference to the resource will be held by the collection +---that created the resource and will automatically be released when that collection is destroyed. +---Note that releasing a resource essentially means decreasing the reference count of that resource, +---and not necessarily that it will be deleted. +---@param path string The path to the resource. +---@param table resource.atlas A table containing info about how to create the atlas. Supported entries: +--- +--- +--- +---texture +---string | hash the path to the texture resource, e.g "/main/my_texture.texturec" +--- +--- +--- +--- +---animations +---table a list of the animations in the atlas. Supports the following fields: +--- +--- +--- +--- +---id +---string the id of the animation, used in e.g sprite.play_animation +--- +--- +--- +--- +---width +---integer the width of the animation +--- +--- +--- +--- +---height +---integer the height of the animation +--- +--- +--- +--- +---frame_start +---integer index to the first geometry of the animation. Indices are lua based and must be in the range of 1 .. in atlas. +--- +--- +--- +--- +---frame_end +---integer index to the last geometry of the animation (non-inclusive). Indices are lua based and must be in the range of 1 .. in atlas. +--- +--- +--- +--- +---playback +---constant optional playback mode of the animation, the default value is go.PLAYBACK_ONCE_FORWARD +--- +--- +--- +--- +---fps +---integer optional fps of the animation, the default value is 30 +--- +--- +--- +--- +---flip_vertical +---boolean optional flip the animation vertically, the default value is false +--- +--- +--- +--- +---flip_horizontal +---boolean optional flip the animation horizontally, the default value is false +--- +--- +--- +--- +---geometries +---table A list of the geometries that should map to the texture data. Supports the following fields: +--- +--- +--- +--- +---id +---string The name of the geometry. Used when matching animations between multiple atlases +--- +--- +--- +--- +---vertices +---table a list of the vertices in texture space of the geometry in the form {px0, py0, px1, py1, ..., pxn, pyn} +--- +--- +--- +--- +---uvs +---table a list of the uv coordinates in texture space of the geometry in the form of {u0, v0, u1, v1, ..., un, vn} +--- +--- +--- +--- +---indices +---table a list of the indices of the geometry in the form {i0, i1, i2, ..., in}. Each tripe in the list represents a triangle. +--- +--- +--- +---@return hash path Returns the atlas resource path +function resource.create_atlas(path, table) end + +---This function creates a new buffer resource that can be used in the same way as any buffer created during build time. +---The function requires a valid buffer created from either buffer.create or another pre-existing buffer resource. +---By default, the new resource will take ownership of the buffer lua reference, meaning the buffer will not automatically be removed +---when the lua reference to the buffer is garbage collected. This behaviour can be overruled by specifying 'transfer_ownership = false' +---in the argument table. If the new buffer resource is created from a buffer object that is created by another resource, +---the buffer object will be copied and the new resource will effectively own a copy of the buffer instead. +---Note that the path to the new resource must have the '.bufferc' extension, "/path/my_buffer" is not a valid path but "/path/my_buffer.bufferc" is. +---The path must also be unique, attempting to create a buffer with the same name as an existing resource will raise an error. +---@param path string The path to the resource. +---@param table { buffer:buffer_data, transfer_ownership:boolean|nil }|nil A table containing info about how to create the buffer. Supported entries: +--- +--- +--- +---buffer +---buffer the buffer to bind to this resource +--- +--- +--- +--- +---transfer_ownership +---boolean optional flag to determine wether or not the resource should take over ownership of the buffer object (default true) +--- +--- +--- +---@return hash path Returns the buffer resource path +function resource.create_buffer(path, table) end + +---Creates a new texture resource that can be used in the same way as any texture created during build time. +---The path used for creating the texture must be unique, trying to create a resource at a path that is already +---registered will trigger an error. If the intention is to instead modify an existing texture, use the resource.set_texture +---function. Also note that the path to the new texture resource must have a '.texturec' extension, +---meaning "/path/my_texture" is not a valid path but "/path/my_texture.texturec" is. +---If the texture is created without a buffer, the pixel data will be blank. +---@param path string The path to the resource. +---@param table { type:number, width:number, height:number, format:number, max_mipmaps:number|nil, compression_type:number|nil} A table containing info about how to create the texture. Supported entries: +--- +---type +---number The texture type. Supported values: +--- +--- +---resource.TEXTURE_TYPE_2D +---resource.TEXTURE_TYPE_CUBE_MAP +--- +--- +---width +---number The width of the texture (in pixels). Must be larger than 0. +---height +---number The width of the texture (in pixels). Must be larger than 0. +---format +---number The texture format, note that some of these formats might not be supported by the running device. Supported values: +--- +--- +---resource.TEXTURE_FORMAT_LUMINANCE +---resource.TEXTURE_FORMAT_RGB +---resource.TEXTURE_FORMAT_RGBA +--- +---These constants might not be available on the device: +--- +---resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 +---resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 +---resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 +---resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 +---resource.TEXTURE_FORMAT_RGB_ETC1 +---resource.TEXTURE_FORMAT_RGBA_ETC2 +---resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 +---resource.TEXTURE_FORMAT_RGB_BC1 +---resource.TEXTURE_FORMAT_RGBA_BC3 +---resource.TEXTURE_FORMAT_R_BC4 +---resource.TEXTURE_FORMAT_RG_BC5 +---resource.TEXTURE_FORMAT_RGBA_BC7 +---resource.TEXTURE_FORMAT_RGB16F +---resource.TEXTURE_FORMAT_RGB32F +---resource.TEXTURE_FORMAT_RGBA16F +---resource.TEXTURE_FORMAT_RGBA32F +---resource.TEXTURE_FORMAT_R16F +---resource.TEXTURE_FORMAT_RG16F +---resource.TEXTURE_FORMAT_R32F +---resource.TEXTURE_FORMAT_RG32F +--- +---You can test if the device supports these values by checking if a specific enum is nil or not: +---if resource.TEXTURE_FORMAT_RGBA16F ~= nil then +--- -- it is safe to use this format +---end +--- +--- +--- +---max_mipmaps +---number optional max number of mipmaps. Defaults to zero, i.e no mipmap support +---compression_type +---number optional specify the compression type for the data in the buffer object that holds the texture data. Will only be used when a compressed buffer has been passed into the function. +---Creating an empty texture with no buffer data is not supported as a core feature. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: +--- +--- +---COMPRESSION_TYPE_DEFAULT +---COMPRESSION_TYPE_BASIS_UASTC +--- +---@param buffer buffer_data optional buffer of precreated pixel data +---@return hash path The path to the resource. +function resource.create_texture(path, table, buffer) end + +---Creates a new texture resource that can be used in the same way as any texture created during build time. +---The path used for creating the texture must be unique, trying to create a resource at a path that is already +---registered will trigger an error. If the intention is to instead modify an existing texture, use the resource.set_texture +---function. Also note that the path to the new texture resource must have a '.texturec' extension, +---meaning "/path/my_texture" is not a valid path but "/path/my_texture.texturec" is. +---If the texture is created without a buffer, the pixel data will be blank. +---The difference between the async version and resource.create_texture is that the texture data will be uploaded +---in a graphics worker thread. The function will return a resource immediately that contains a 1x1 blank texture which can be used +---immediately after the function call. When the new texture has been uploaded, the initial blank texture will be deleted and replaced with the +---new texture. Be careful when using the initial texture handle handle as it will not be valid after the upload has finished. +---@param path string The path to the resource. +---@param table { type:number, width:number, height:number, format:number, max_mipmaps:number|nil, compression_type:number|nil} +---A table containing info about how to create the texture. Supported entries: +---type +---number The texture type. Supported values: +--- +--- +---resource.TEXTURE_TYPE_2D +---resource.TEXTURE_TYPE_CUBE_MAP +--- +--- +---width +---number The width of the texture (in pixels). Must be larger than 0. +---height +---number The width of the texture (in pixels). Must be larger than 0. +---format +---number The texture format, note that some of these formats might not be supported by the running device. Supported values: +--- +--- +---resource.TEXTURE_FORMAT_LUMINANCE +---resource.TEXTURE_FORMAT_RGB +---resource.TEXTURE_FORMAT_RGBA +--- +---These constants might not be available on the device: +--- +---resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 +---resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 +---resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 +---resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 +---resource.TEXTURE_FORMAT_RGB_ETC1 +---resource.TEXTURE_FORMAT_RGBA_ETC2 +---resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 +---resource.TEXTURE_FORMAT_RGB_BC1 +---resource.TEXTURE_FORMAT_RGBA_BC3 +---resource.TEXTURE_FORMAT_R_BC4 +---resource.TEXTURE_FORMAT_RG_BC5 +---resource.TEXTURE_FORMAT_RGBA_BC7 +---resource.TEXTURE_FORMAT_RGB16F +---resource.TEXTURE_FORMAT_RGB32F +---resource.TEXTURE_FORMAT_RGBA16F +---resource.TEXTURE_FORMAT_RGBA32F +---resource.TEXTURE_FORMAT_R16F +---resource.TEXTURE_FORMAT_RG16F +---resource.TEXTURE_FORMAT_R32F +---resource.TEXTURE_FORMAT_RG32F +--- +---You can test if the device supports these values by checking if a specific enum is nil or not: +---if resource.TEXTURE_FORMAT_RGBA16F ~= nil then +--- -- it is safe to use this format +---end +--- +--- +--- +---max_mipmaps +---number optional max number of mipmaps. Defaults to zero, i.e no mipmap support +---compression_type +---number optional specify the compression type for the data in the buffer object that holds the texture data. Will only be used when a compressed buffer has been passed into the function. +---Creating an empty texture with no buffer data is not supported as a core feature. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: +--- +--- +---COMPRESSION_TYPE_DEFAULT +---COMPRESSION_TYPE_BASIS_UASTC +--- +---@param buffer buffer_data optional buffer of precreated pixel data +---@return hash path The path to the resource. +---@return resource_handle request_id The request id for the async request. +function resource.create_texture_async(path, table, buffer) end + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.font(path) end + +---Returns the atlas data for an atlas +---@param path hash|string The path to the atlas resource +---@return resource.atlas data A table with the following entries: +--- +---texture +---geometries +---animations +--- +---See resource.set_atlas for a detailed description of each field +function resource.get_atlas(path) end + +---gets the buffer from a resource +---@param path hash|string The path to the resource +---@return buffer_data buffer The resource buffer +function resource.get_buffer(path) end + +---Gets render target info from a render target resource path or a render target handle +---@param path hash|string|resource_handle The path to the resource or a render target handle +---@return { handle:resource_handle, attachments:{ handle:resource_handle, width:number, height:number, depth:number, mipmaps:number, type:number, buffer_type:number }[] } table A table containing info about the render target: +--- +---handle +---handle the opaque handle to the texture resource +---'attachments' +---table a table of attachments, where each attachment contains the following entries: +---handle +---handle the opaque handle to the texture resource +---width +---integer width of the texture +---height +---integer height of the texture +---depth +---integer depth of the texture (i.e 1 for a 2D texture and 6 for a cube map) +---mipmaps +---integer number of mipmaps of the texture +---type +---number The texture type. Supported values: +--- +--- +---resource.TEXTURE_TYPE_2D +---resource.TEXTURE_TYPE_CUBE_MAP +---resource.TEXTURE_TYPE_2D_ARRAY +--- +--- +---buffer_type +---number The attachment buffer type. Supported values: +--- +--- +---resource.BUFFER_TYPE_COLOR0 +---resource.BUFFER_TYPE_COLOR1 +---resource.BUFFER_TYPE_COLOR2 +---resource.BUFFER_TYPE_COLOR3 +---resource.BUFFER_TYPE_DEPTH +---resource.BUFFER_TYPE_STENCIL +--- +function resource.get_render_target_info(path) end + +---Gets the text metrics from a font +---@param url hash the font to get the (unscaled) metrics from +---@param text string text to measure +---@param options { width:number|nil, leading:number|nil, tracking:number|nil, line_break:boolean|nil}|nil A table containing parameters for the text. Supported entries: +--- +---width +---integer The width of the text field. Not used if line_break is false. +---leading +---number The leading (default 1.0) +---tracking +---number The tracking (default 0.0) +---line_break +---boolean If the calculation should consider line breaks (default false) +--- +---@return { width:number, height:number, max_ascent:number, max_descent:number } metrics a table with the following fields: +--- +---width +---height +---max_ascent +---max_descent +--- +function resource.get_text_metrics(url, text, options) end + +---Gets texture info from a texture resource path or a texture handle +---@param path hash|string|resource_handle The path to the resource or a texture handle +---@return { handle:resource_handle, width:number, height:number, depth:number, mipmaps:number, type:number } table A table containing info about the texture: +--- +---handle +---handle the opaque handle to the texture resource +---width +---integer width of the texture +---height +---integer height of the texture +---depth +---integer depth of the texture (i.e 1 for a 2D texture and 6 for a cube map) +---mipmaps +---integer number of mipmaps of the texture +---type +---number The texture type. Supported values: +--- +--- +---resource.TEXTURE_TYPE_2D +---resource.TEXTURE_TYPE_CUBE_MAP +---resource.TEXTURE_TYPE_2D_ARRAY +--- +function resource.get_texture_info(path) end + +---Loads the resource data for a specific resource. +---@param path string The path to the resource +---@return buffer_data buffer Returns the buffer stored on disc +function resource.load(path) end + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.material(path) end + +---Release a resource. +--- This is a potentially dangerous operation, releasing resources currently being used can cause unexpected behaviour. +---@param path hash|string The path to the resource. +function resource.release(path) end + +---Sets the resource data for a specific resource +---@param path string|hash The path to the resource +---@param buffer buffer_data The buffer of precreated data, suitable for the intended resource type +function resource.set(path, buffer) end + +---Sets the data for a specific atlas resource. Setting new atlas data is specified by passing in +---a texture path for the backing texture of the atlas, a list of geometries and a list of animations +---that map to the entries in the geometry list. The geometry entries are represented by three lists: +---vertices, uvs and indices that together represent triangles that are used in other parts of the +---engine to produce render objects from. +---Vertex and uv coordinates for the geometries are expected to be +---in pixel coordinates where 0,0 is the top left corner of the texture. +---There is no automatic padding or margin support when setting custom data, +---which could potentially cause filtering artifacts if used with a material sampler that has linear filtering. +---If that is an issue, you need to calculate padding and margins manually before passing in the geometry data to +---this function. +---@param path hash|string The path to the atlas resource +---@param table resource.atlas A table containing info about the atlas. Supported entries: +--- +--- +--- +---texture +---string | hash the path to the texture resource, e.g "/main/my_texture.texturec" +--- +--- +--- +--- +---animations +---table a list of the animations in the atlas. Supports the following fields: +--- +--- +--- +--- +---id +---string the id of the animation, used in e.g sprite.play_animation +--- +--- +--- +--- +---width +---integer the width of the animation +--- +--- +--- +--- +---height +---integer the height of the animation +--- +--- +--- +--- +---frame_start +---integer index to the first geometry of the animation. Indices are lua based and must be in the range of 1 .. in atlas. +--- +--- +--- +--- +---frame_end +---integer index to the last geometry of the animation (non-inclusive). Indices are lua based and must be in the range of 1 .. in atlas. +--- +--- +--- +--- +---playback +---constant optional playback mode of the animation, the default value is go.PLAYBACK_ONCE_FORWARD +--- +--- +--- +--- +---fps +---integer optional fps of the animation, the default value is 30 +--- +--- +--- +--- +---flip_vertical +---boolean optional flip the animation vertically, the default value is false +--- +--- +--- +--- +---flip_horizontal +---boolean optional flip the animation horizontally, the default value is false +--- +--- +--- +--- +---geometries +---table A list of the geometries that should map to the texture data. Supports the following fields: +--- +--- +--- +--- +---vertices +---table a list of the vertices in texture space of the geometry in the form {px0, py0, px1, py1, ..., pxn, pyn} +--- +--- +--- +--- +---uvs +---table a list of the uv coordinates in texture space of the geometry in the form of {u0, v0, u1, v1, ..., un, vn} +--- +--- +--- +--- +---indices +---table a list of the indices of the geometry in the form {i0, i1, i2, ..., in}. Each tripe in the list represents a triangle. +--- +--- +--- +function resource.set_atlas(path, table) end + +---Sets the buffer of a resource. By default, setting the resource buffer will either copy the data from the incoming buffer object +---to the buffer stored in the destination resource, or make a new buffer object if the sizes between the source buffer and the destination buffer +---stored in the resource differs. In some cases, e.g performance reasons, it might be beneficial to just set the buffer object on the resource without copying or cloning. +---To achieve this, set the transfer_ownership flag to true in the argument table. Transferring ownership from a lua buffer to a resource with this function +---works exactly the same as resource.create_buffer: the destination resource will take ownership of the buffer held by the lua reference, i.e the buffer will not automatically be removed +---when the lua reference to the buffer is garbage collected. +---Note: When setting a buffer with transfer_ownership = true, the currently bound buffer in the resource will be destroyed. +---@param path hash|string The path to the resource +---@param buffer buffer_data The resource buffer +---@param table { transfer_ownership: boolean|nil }|nil A table containing info about how to set the buffer. Supported entries: +--- +--- +--- +---transfer_ownership +---boolean optional flag to determine wether or not the resource should take over ownership of the buffer object (default false) +--- +--- +--- +function resource.set_buffer(path, buffer, table) end + +---Update internal sound resource (wavc/oggc) with new data +---@param path hash|string The path to the resource +---@param buffer string A lua string containing the binary sound data +function resource.set_sound(path, buffer) end + +---Sets the pixel data for a specific texture. +---@param path hash|string The path to the resource +---@param table { type:number, width:number, height:number, format:number, x:number|nil, y:number|nil, mipmap:number|nil, compression_type:number|nil} A table containing info about the texture. Supported entries: +--- +---type +---number The texture type. Supported values: +--- +--- +---resource.TEXTURE_TYPE_2D +---resource.TEXTURE_TYPE_CUBE_MAP +--- +--- +---width +---number The width of the texture (in pixels) +---height +---number The width of the texture (in pixels) +---format +---number The texture format, note that some of these formats are platform specific. Supported values: +--- +--- +---resource.TEXTURE_FORMAT_LUMINANCE +---resource.TEXTURE_FORMAT_RGB +---resource.TEXTURE_FORMAT_RGBA +--- +---These constants might not be available on the device: +---- resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 +---- resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 +---- resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 +---- resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 +---- resource.TEXTURE_FORMAT_RGB_ETC1 +---- resource.TEXTURE_FORMAT_RGBA_ETC2 +---- resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 +---- resource.TEXTURE_FORMAT_RGB_BC1 +---- resource.TEXTURE_FORMAT_RGBA_BC3 +---- resource.TEXTURE_FORMAT_R_BC4 +---- resource.TEXTURE_FORMAT_RG_BC5 +---- resource.TEXTURE_FORMAT_RGBA_BC7 +---- resource.TEXTURE_FORMAT_RGB16F +---- resource.TEXTURE_FORMAT_RGB32F +---- resource.TEXTURE_FORMAT_RGBA16F +---- resource.TEXTURE_FORMAT_RGBA32F +---- resource.TEXTURE_FORMAT_R16F +---- resource.TEXTURE_FORMAT_RG16F +---- resource.TEXTURE_FORMAT_R32F +---- resource.TEXTURE_FORMAT_RG32F +---You can test if the device supports these values by checking if a specific enum is nil or not: +---if resource.TEXTURE_FORMAT_RGBA16F ~= nil then +--- -- it is safe to use this format +---end +--- +--- +--- +---x +---number optional x offset of the texture (in pixels) +---y +---number optional y offset of the texture (in pixels) +---mipmap +---number optional mipmap to upload the data to +---compression_type +---number optional specify the compression type for the data in the buffer object that holds the texture data. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: +--- +--- +---COMPRESSION_TYPE_DEFAULT +---COMPRESSION_TYPE_BASIS_UASTC +--- +---@param buffer buffer_data The buffer of precreated pixel data +--- To update a cube map texture you need to pass in six times the amount of data via the buffer, since a cube map has six sides! +function resource.set_texture(path, table, buffer) end + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.texture(path) end + +---Constructor-like function with two purposes: +---Load the specified resource as part of loading the script +---Return a hash to the run-time version of the resource +--- This function can only be called within go.property function calls. +---@param path string|nil optional resource path string to the resource +---@return hash path a path hash to the binary version of the resource +function resource.tile_source(path) end + +return resource \ No newline at end of file diff --git a/annotations/defold/socket.lua b/annotations/defold/socket.lua new file mode 100644 index 0000000..73e15ec --- /dev/null +++ b/annotations/defold/socket.lua @@ -0,0 +1,173 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + LuaSocket API documentation + + LuaSocket is a Lua extension library that provides + support for the TCP and UDP transport layers. Defold provides the "socket" namespace in + runtime, which contain the core C functionality. Additional LuaSocket support modules for + SMTP, HTTP, FTP etc are not part of the core included, but can be easily added to a project + and used. + Note the included helper module "socket.lua" in "builtins/scripts/socket.lua". Require this + module to add some additional functions and shortcuts to the namespace: + require "builtins.scripts.socket" + LuaSocket is Copyright © 2004-2007 Diego Nehab. All rights reserved. + LuaSocket is free software, released under the MIT license (same license as the Lua core). +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.socket +socket = {} + +---This constant contains the maximum number of sockets that the select function can handle. +socket._SETSIZE = nil + +---This constant has a string describing the current LuaSocket version. +socket._VERSION = nil + +---This function is a shortcut that creates and returns a TCP client object connected to a remote +---address at a given port. Optionally, the user can also specify the local address and port to +---bind (locaddr and locport), or restrict the socket family to "inet" or "inet6". +---Without specifying family to connect, whether a tcp or tcp6 connection is created depends on +---your system configuration. +---@param address string the address to connect to. +---@param port number the port to connect to. +---@param locaddr string|nil optional local address to bind to. +---@param locport number|nil optional local port to bind to. +---@param family string|nil optional socket family to use, "inet" or "inet6". +---@return socket_client|nil tcp_client a new IPv6 TCP client object, or nil in case of error. +---@return string|nil error the error message, or nil if no error occurred. +function socket.connect(address, port, locaddr, locport, family) end + +---This function converts a host name to IPv4 or IPv6 address. +---The supplied address can be an IPv4 or IPv6 address or host name. +---The function returns a table with all information returned by the resolver: +---{ +--- [1] = { +--- family = family-name-1, +--- addr = address-1 +--- }, +--- ... +--- [n] = { +--- family = family-name-n, +--- addr = address-n +--- } +---} +---Here, family contains the string "inet" for IPv4 addresses, and "inet6" for IPv6 addresses. +---In case of error, the function returns nil followed by an error message. +---@param address string a hostname or an IPv4 or IPv6 address. +---@return table|nil resolved a table with all information returned by the resolver, or if an error occurs, nil. +---@return string|nil error the error message, or nil if no error occurred. +function socket.dns.getaddrinfo(address) end + +---Returns the standard host name for the machine as a string. +---@return string hostname the host name for the machine. +function socket.dns.gethostname() end + +---This function converts an address to host name. +---The supplied address can be an IPv4 or IPv6 address or host name. +---The function returns a table with all information returned by the resolver: +---{ +--- [1] = host-name-1, +--- ... +--- [n] = host-name-n, +---} +---@param address string a hostname or an IPv4 or IPv6 address. +---@return table|nil resolved a table with all information returned by the resolver, or if an error occurs, nil. +---@return string|nil error the error message, or nil if no error occurred. +function socket.dns.getnameinfo(address) end + +---This function converts from an IPv4 address to host name. +---The address can be an IPv4 address or a host name. +---@param address string an IPv4 address or host name. +---@return string|nil hostname the canonic host name of the given address, or nil in case of an error. +---@return table|string resolved a table with all information returned by the resolver, or if an error occurs, the error message string. +function socket.dns.tohostname(address) end + +---This function converts a host name to IPv4 address. +---The address can be an IP address or a host name. +---@param address string a hostname or an IP address. +---@return string|nil ip_address the first IP address found for the hostname, or nil in case of an error. +---@return table|string resolved a table with all information returned by the resolver, or if an error occurs, the error message string. +function socket.dns.toip(address) end + +---Returns the time in seconds, relative to the system epoch (Unix epoch time since January 1, 1970 (UTC) or Windows file time since January 1, 1601 (UTC)). +---You should use the values returned by this function for relative measurements only. +---@return number seconds the number of seconds elapsed. +function socket.gettime() end + +---This function creates and returns a clean try function that allows for cleanup before the exception is raised. +---The finalizer function will be called in protected mode (see protect). +---@param finalizer function a function that will be called before the try throws the exception. +---@return function try the customized try function. +function socket.newtry(finalizer) end + +---Converts a function that throws exceptions into a safe function. This function only catches exceptions thrown by try functions. It does not catch normal Lua errors. +--- Beware that if your function performs some illegal operation that raises an error, the protected function will catch the error and return it as a string. This is because try functions uses errors as the mechanism to throw exceptions. +---@param func function a function that calls a try function (or assert, or error) to throw exceptions. +---@return fun(function) safe_func an equivalent function that instead of throwing exceptions, returns nil followed by an error message. +function socket.protect(func) end + +---The function returns a list with the sockets ready for reading, a list with the sockets ready for writing and an error message. The error message is "timeout" if a timeout condition was met and nil otherwise. The returned tables are doubly keyed both by integers and also by the sockets themselves, to simplify the test if a specific socket has changed status. +---Recvt and sendt parameters can be empty tables or nil. Non-socket values (or values with non-numeric indices) in these arrays will be silently ignored. +---The returned tables are doubly keyed both by integers and also by the sockets themselves, to simplify the test if a specific socket has changed status. +--- This function can monitor a limited number of sockets, as defined by the constant socket._SETSIZE. This number may be as high as 1024 or as low as 64 by default, depending on the system. It is usually possible to change this at compile time. Invoking select with a larger number of sockets will raise an error. +--- A known bug in WinSock causes select to fail on non-blocking TCP sockets. The function may return a socket as writable even though the socket is not ready for sending. +--- Calling select with a server socket in the receive parameter before a call to accept does not guarantee accept will return immediately. Use the settimeout method or accept might block forever. +--- If you close a socket and pass it to select, it will be ignored. +---(Using select with non-socket objects: Any object that implements getfd and dirty can be used with select, allowing objects from other libraries to be used within a socket.select driven loop.) +---@param recvt table array with the sockets to test for characters available for reading. +---@param sendt table array with sockets that are watched to see if it is OK to immediately write on them. +---@param timeout number|nil the maximum amount of time (in seconds) to wait for a change in status. Nil, negative or omitted timeout value allows the function to block indefinitely. +---@return table sockets_r a list with the sockets ready for reading. +---@return table sockets_w a list with the sockets ready for writing. +---@return string|nil error an error message. "timeout" if a timeout condition was met, otherwise nil. +function socket.select(recvt, sendt, timeout) end + +---This function drops a number of arguments and returns the remaining. +---It is useful to avoid creation of dummy variables: +---D is the number of arguments to drop. Ret1 to retN are the arguments. +---The function returns retD+1 to retN. +---@param d number the number of arguments to drop. +---@param ret1 any|nil argument 1. +---@param ret2 any|nil argument 2. +---@param retN any|nil argument N. +---@return any|nil retD+1 argument D+1. +---@return any|nil retD+2 argument D+2. +---@return any|nil retN argument N. +function socket.skip(d, ret1, ret2, retN) end + +---Freezes the program execution during a given amount of time. +---@param time number the number of seconds to sleep for. +function socket.sleep(time) end + +---Creates and returns an IPv4 TCP master object. A master object can be transformed into a server object with the method listen (after a call to bind) or into a client object with the method connect. The only other method supported by a master object is the close method. +---@return socket_master|nil tcp_master a new IPv4 TCP master object, or nil in case of error. +---@return string|nil error the error message, or nil if no error occurred. +function socket.tcp() end + +---Creates and returns an IPv6 TCP master object. A master object can be transformed into a server object with the method listen (after a call to bind) or into a client object with the method connect. The only other method supported by a master object is the close method. +---Note: The TCP object returned will have the option "ipv6-v6only" set to true. +---@return socket_master|nil tcp_master a new IPv6 TCP master object, or nil in case of error. +---@return string|nil error the error message, or nil if no error occurred. +function socket.tcp6() end + +---Creates and returns an unconnected IPv4 UDP object. Unconnected objects support the sendto, receive, receivefrom, getoption, getsockname, setoption, settimeout, setpeername, setsockname, and close methods. The setpeername method is used to connect the object. +---@return socket_unconnected|nil udp_unconnected a new unconnected IPv4 UDP object, or nil in case of error. +---@return string|nil error the error message, or nil if no error occurred. +function socket.udp() end + +---Creates and returns an unconnected IPv6 UDP object. Unconnected objects support the sendto, receive, receivefrom, getoption, getsockname, setoption, settimeout, setpeername, setsockname, and close methods. The setpeername method is used to connect the object. +---Note: The UDP object returned will have the option "ipv6-v6only" set to true. +---@return socket_unconnected|nil udp_unconnected a new unconnected IPv6 UDP object, or nil in case of error. +---@return string|nil error the error message, or nil if no error occurred. +function socket.udp6() end + + + +return socket \ No newline at end of file diff --git a/annotations/defold/sound.lua b/annotations/defold/sound.lua new file mode 100644 index 0000000..2c201b8 --- /dev/null +++ b/annotations/defold/sound.lua @@ -0,0 +1,160 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Sound API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.sound +sound = {} + +---Get mixer group gain +--- Note that gain is in linear scale, between 0 and 1. +---To get the dB value from the gain, use the formula 20 * log(gain). +---Inversely, to find the linear value from a dB value, use the formula +---10db/20. +---@param group string|hash group name +---@return number gain gain in linear scale +function sound.get_group_gain(group) end + +---Get a mixer group name as a string. +--- This function is to be used for debugging and +---development tooling only. The function does a reverse hash lookup, which does not +---return a proper string value when the game is built in release mode. +---@param group string|hash group name +---@return string name group name +function sound.get_group_name(group) end + +---Get a table of all mixer group names (hashes). +---@return hash[] groups table of mixer group names +function sound.get_groups() end + +---Get peak value from mixer group. +--- Note that gain is in linear scale, between 0 and 1. +---To get the dB value from the gain, use the formula 20 * log(gain). +---Inversely, to find the linear value from a dB value, use the formula +---10db/20. +---Also note that the returned value might be an approximation and in particular +---the effective window might be larger than specified. +---@param group string|hash group name +---@param window number window length in seconds +---@return number peak_l peak value for left channel +---@return number peak_r peak value for right channel +function sound.get_peak(group, window) end + +---Get RMS (Root Mean Square) value from mixer group. This value is the +---square root of the mean (average) value of the squared function of +---the instantaneous values. +---For instance: for a sinewave signal with a peak gain of -1.94 dB (0.8 linear), +---the RMS is 0.8 × 1/sqrt(2) which is about 0.566. +--- Note the returned value might be an approximation and in particular +---the effective window might be larger than specified. +---@param group string|hash group name +---@param window number window length in seconds +---@return number rms_l RMS value for left channel +---@return number rms_r RMS value for right channel +function sound.get_rms(group, window) end + +---Checks if background music is playing, e.g. from iTunes. +--- On non mobile platforms, +---this function always return false. +--- On Android you can only get a correct reading +---of this state if your game is not playing any sounds itself. This is a limitation +---in the Android SDK. If your game is playing any sounds, even with a gain of zero, this +---function will return false. +---The best time to call this function is: +---In the init function of your main collection script before any sounds are triggered +---In a window listener callback when the window.WINDOW_EVENT_FOCUS_GAINED event is received +---Both those times will give you a correct reading of the state even when your application is +---swapped out and in while playing sounds and it works equally well on Android and iOS. +---@return boolean playing true if music is playing, otherwise false. +function sound.is_music_playing() end + +---Checks if a phone call is active. If there is an active phone call all +---other sounds will be muted until the phone call is finished. +--- On non mobile platforms, +---this function always return false. +---@return boolean call_active true if there is an active phone call, false otherwise. +function sound.is_phone_call_active() end + +---Pause all active voices +---@param url string|hash|url the sound that should pause +---@param pause bool true if the sound should pause +function sound.pause(url, pause) end + +---Make the sound component play its sound. Multiple voices are supported. The limit is set to 32 voices per sound component. +--- Note that gain is in linear scale, between 0 and 1. +---To get the dB value from the gain, use the formula 20 * log(gain). +---Inversely, to find the linear value from a dB value, use the formula +---10db/20. +--- A sound will continue to play even if the game object the sound component belonged to is deleted. You can call sound.stop() to stop the sound. +---@param url string|hash|url the sound that should play +---@param play_properties { delay:number|nil, gain:number|nil, pan:number|nil, speed:number|nil }|nil +---optional table with properties: +---delay +---number delay in seconds before the sound starts playing, default is 0. +---gain +---number sound gain between 0 and 1, default is 1. The final gain of the sound will be a combination of this gain, the group gain and the master gain. +---pan +---number sound pan between -1 and 1, default is 0. The final pan of the sound will be an addition of this pan and the sound pan. +---speed +---number sound speed where 1.0 is normal speed, 0.5 is half speed and 2.0 is double speed. The final speed of the sound will be a multiplication of this speed and the sound speed. +--- +---@param complete_function fun(self, message_id, message, sender)|nil function to call when the sound has finished playing or stopped manually via sound.stop. +--- +---self +---object The current object. +---message_id +---hash The name of the completion message, which can be either "sound_done" if the sound has finished playing, or "sound_stopped" if it was stopped manually. +---message +---table Information about the completion: +--- +--- +---number play_id - the sequential play identifier that was given by the sound.play function. +--- +--- +---sender +---url The invoker of the callback: the sound component. +--- +---@return number play_id The identifier for the sound voice +function sound.play(url, play_properties, complete_function) end + +---Set gain on all active playing voices of a sound. +--- Note that gain is in linear scale, between 0 and 1. +---To get the dB value from the gain, use the formula 20 * log(gain). +---Inversely, to find the linear value from a dB value, use the formula +---10db/20. +---@param url string|hash|url the sound to set the gain of +---@param gain number|nil sound gain between 0 and 1. The final gain of the sound will be a combination of this gain, the group gain and the master gain. +function sound.set_gain(url, gain) end + +---Set mixer group gain +--- Note that gain is in linear scale, between 0 and 1. +---To get the dB value from the gain, use the formula 20 * log(gain). +---Inversely, to find the linear value from a dB value, use the formula +---10db/20. +---@param group string|hash group name +---@param gain number gain in linear scale +function sound.set_group_gain(group, gain) end + +---Set panning on all active playing voices of a sound. +---The valid range is from -1.0 to 1.0, representing -45 degrees left, to +45 degrees right. +---@param url string|hash|url the sound to set the panning value to +---@param pan number|nil sound panning between -1.0 and 1.0 +function sound.set_pan(url, pan) end + +---Stop playing all active voices or just one voice if play_id provided +---@param url string|hash|url the sound component that should stop +---@param stop_properties { play_id:number }|nil +---optional table with properties: +---play_id +---number the sequential play identifier that should be stopped (was given by the sound.play() function) +--- +function sound.stop(url, stop_properties) end + +return sound \ No newline at end of file diff --git a/annotations/defold/sprite.lua b/annotations/defold/sprite.lua new file mode 100644 index 0000000..f0d8009 --- /dev/null +++ b/annotations/defold/sprite.lua @@ -0,0 +1,62 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Sprite API documentation +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.sprite +sprite = {} + +---Play an animation on a sprite component from its tile set +---An optional completion callback function can be provided that will be called when +---the animation has completed playing. If no function is provided, +---a animation_done message is sent to the script that started the animation. +---@param url string|hash|url the sprite that should play the animation +---@param id string|hash hashed id of the animation to play +---@param complete_function fun(self, message_id, message, sender)|nil function to call when the animation has completed. +--- +---self +---object The current object. +---message_id +---hash The name of the completion message, "animation_done". +---message +---table Information about the completion: +--- +--- +---number current_tile - the current tile of the sprite. +---hash id - id of the animation that was completed. +--- +--- +---sender +---url The invoker of the callback: the sprite component. +--- +---@param play_properties table|nil optional table with properties: +--- +---offset +---number the normalized initial value of the animation cursor when the animation starts playing. +---playback_rate +---number the rate with which the animation will be played. Must be positive. +--- +function sprite.play_flipbook(url, id, complete_function, play_properties) end + +---Sets horizontal flipping of the provided sprite's animations. +---The sprite is identified by its URL. +---If the currently playing animation is flipped by default, flipping it again will make it appear like the original texture. +---@param url string|hash|url the sprite that should flip its animations +---@param flip boolean true if the sprite should flip its animations, false if not +function sprite.set_hflip(url, flip) end + +---Sets vertical flipping of the provided sprite's animations. +---The sprite is identified by its URL. +---If the currently playing animation is flipped by default, flipping it again will make it appear like the original texture. +---@param url string|hash|url the sprite that should flip its animations +---@param flip boolean true if the sprite should flip its animations, false if not +function sprite.set_vflip(url, flip) end + +return sprite \ No newline at end of file diff --git a/annotations/defold/sys.lua b/annotations/defold/sys.lua new file mode 100644 index 0000000..f6dfed4 --- /dev/null +++ b/annotations/defold/sys.lua @@ -0,0 +1,314 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + System API documentation + + Functions and messages for using system resources, controlling the engine, + error handling and debugging. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.sys +sys = {} + +---network connected through other, non cellular, connection +sys.NETWORK_CONNECTED = nil + +---network connected through mobile cellular +sys.NETWORK_CONNECTED_CELLULAR = nil + +---no network connection found +sys.NETWORK_DISCONNECTED = nil + +---an asyncronous request is unable to read the resource +sys.REQUEST_STATUS_ERROR_IO_ERROR = nil + +---an asyncronous request is unable to locate the resource +sys.REQUEST_STATUS_ERROR_NOT_FOUND = nil + +---an asyncronous request has finished successfully +sys.REQUEST_STATUS_FINISHED = nil + +---deserializes buffer into a lua table +---@param buffer string buffer to deserialize from +---@return table table lua table with deserialized data +function sys.deserialize(buffer) end + +---Check if a path exists +---Good for checking if a file exists before loading a large file +---@param path string path to check +---@return bool result true if the path exists, false otherwise +function sys.exists(path) end + +---Terminates the game application and reports the specified code to the OS. +---@param code number exit code to report to the OS, 0 means clean exit +function sys.exit(code) end + +---Returns a table with application information for the requested app. +--- On iOS, the app_string is an url scheme for the app that is queried. Your +---game needs to list the schemes that are queried in an LSApplicationQueriesSchemes array +---in a custom "Info.plist". +--- On Android, the app_string is the package identifier for the app. +---@param app_string string platform specific string with application package or query, see above for details. +---@return { installed:boolean } app_info table with application information in the following fields: +--- +---installed +---boolean true if the application is installed, false otherwise. +--- +function sys.get_application_info(app_string) end + +---The path from which the application is run. +---@return string path path to application executable +function sys.get_application_path() end + +---Get integer config value from the game.project configuration file with optional default value +---@param key string key to get value for. The syntax is SECTION.KEY +---@param default_value integer|nil (optional) default value to return if the value does not exist +---@return integer value config value as an integer. default_value if the config key does not exist. 0 if no default value was supplied. +function sys.get_config_int(key, default_value) end + +---Get number config value from the game.project configuration file with optional default value +---@param key string key to get value for. The syntax is SECTION.KEY +---@param default_value number|nil (optional) default value to return if the value does not exist +---@return number value config value as an number. default_value if the config key does not exist. 0 if no default value was supplied. +function sys.get_config_number(key, default_value) end + +---Get string config value from the game.project configuration file with optional default value +---@param key string key to get value for. The syntax is SECTION.KEY +---@param default_value string|nil (optional) default value to return if the value does not exist +---@return string value config value as a string. default_value if the config key does not exist. nil if no default value was supplied. +function sys.get_config_string(key, default_value) end + +--- Returns the current network connectivity status +---on mobile platforms. +---On desktop, this function always return sys.NETWORK_CONNECTED. +---@return constant status network connectivity status: +--- +---sys.NETWORK_DISCONNECTED (no network connection is found) +---sys.NETWORK_CONNECTED_CELLULAR (connected through mobile cellular) +---sys.NETWORK_CONNECTED (otherwise, Wifi) +--- +function sys.get_connectivity() end + +---Returns a table with engine information. +---@return { version:string, version_sha1:string, is_debug:boolean } engine_info table with engine information in the following fields: +--- +---version +---string The current Defold engine version, i.e. "1.2.96" +---version_sha1 +---string The SHA1 for the current engine build, i.e. "0060183cce2e29dbd09c85ece83cbb72068ee050" +---is_debug +---boolean If the engine is a debug or release version +--- +function sys.get_engine_info() end + +---Create a path to the host device for unit testing +---Useful for saving logs etc during development +---@param filename string file to read from +---@return string host_path the path prefixed with the proper host mount +function sys.get_host_path(filename) end + +---Returns an array of tables with information on network interfaces. +---@return { name:string, address:string|nil, mac:string|nil, up:boolean, running:boolean } ifaddrs an array of tables. Each table entry contain the following fields: +--- +---name +---string Interface name +---address +---string IP address. might be nil if not available. +---mac +---string Hardware MAC address. might be nil if not available. +---up +---boolean true if the interface is up (available to transmit and receive data), false otherwise. +---running +---boolean true if the interface is running, false otherwise. +--- +function sys.get_ifaddrs() end + +---The save-file path is operating system specific and is typically located under the user's home directory. +---@param application_id string user defined id of the application, which helps define the location of the save-file +---@param file_name string file-name to get path for +---@return string path path to save-file +function sys.get_save_file(application_id, file_name) end + +---Returns a table with system information. +---@param options { ignore_secure:boolean|nil }|nil optional options table +---- ignore_secure boolean this flag ignores values might be secured by OS e.g. device_ident +---@return { device_model:string|nil, manufacturer:string|nil, system_name:string, system_version:string, api_version:string, language:string, device_language:string, territory:string, gmt_offset:number, device_ident:string|nil, user_agent:string|nil } sys_info table with system information in the following fields: +--- +---device_model +---string Only available on iOS and Android. +---manufacturer +---string Only available on iOS and Android. +---system_name +---string The system name: "Darwin", "Linux", "Windows", "HTML5", "Android" or "iPhone OS" +---system_version +---string The system OS version. +---api_version +---string The API version on the system. +---language +---string Two character ISO-639 format, i.e. "en". +---device_language +---string Two character ISO-639 format (i.e. "sr") and, if applicable, followed by a dash (-) and an ISO 15924 script code (i.e. "sr-Cyrl" or "sr-Latn"). Reflects the device preferred language. +---territory +---string Two character ISO-3166 format, i.e. "US". +---gmt_offset +---number The current offset from GMT (Greenwich Mean Time), in minutes. +---device_ident +---string This value secured by OS. "identifierForVendor" on iOS. "android_id" on Android. On Android, you need to add READ_PHONE_STATE permission to be able to get this data. We don't use this permission in Defold. +---user_agent +---string The HTTP user agent, i.e. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8" +--- +function sys.get_sys_info(options) end + +---If the file exists, it must have been created by sys.save to be loaded. +---@param filename string file to read from +---@return table loaded lua table, which is empty if the file could not be found +function sys.load(filename) end + +---The sys.load_buffer function will first try to load the resource +---from any of the mounted resource locations and return the data if +---any matching entries found. If not, the path will be tried +---as is from the primary disk on the device. +---In order for the engine to include custom resources in the build process, you need +---to specify them in the "custom_resources" key in your "game.project" settings file. +---You can specify single resource files or directories. If a directory is included +---in the resource list, all files and directories in that directory is recursively +---included: +---For example "main/data/,assets/level_data.json". +---@param path string the path to load the buffer from +---@return buffer_data buffer the buffer with data +function sys.load_buffer(path) end + +---The sys.load_buffer function will first try to load the resource +---from any of the mounted resource locations and return the data if +---any matching entries found. If not, the path will be tried +---as is from the primary disk on the device. +---In order for the engine to include custom resources in the build process, you need +---to specify them in the "custom_resources" key in your "game.project" settings file. +---You can specify single resource files or directories. If a directory is included +---in the resource list, all files and directories in that directory is recursively +---included: +---For example "main/data/,assets/level_data.json". +---Note that issuing multiple requests of the same resource will yield +---individual buffers per request. There is no implic caching of the buffers +---based on request path. +---@param path string the path to load the buffer from +---@param status_callback fun(self, request_id, result) A status callback that will be invoked when a request has been handled, or an error occured. The result is a table containing: +--- +---status +---number The status of the request, supported values are: +--- +--- +---resource.REQUEST_STATUS_FINISHED +---resource.REQUEST_STATUS_ERROR_IO_ERROR +---resource.REQUEST_STATUS_ERROR_NOT_FOUND +--- +--- +---buffer +---buffer If the request was successfull, this will contain the request payload in a buffer object, and nil otherwise. Make sure to check the status before doing anything with the buffer value! +--- +---@return resource_handle handle a handle to the request +function sys.load_buffer_async(path, status_callback) end + +---Loads a custom resource. Specify the full filename of the resource that you want +---to load. When loaded, the file data is returned as a string. +---If loading fails, the function returns nil plus the error message. +---In order for the engine to include custom resources in the build process, you need +---to specify them in the "custom_resources" key in your "game.project" settings file. +---You can specify single resource files or directories. If a directory is included +---in the resource list, all files and directories in that directory is recursively +---included: +---For example "main/data/,assets/level_data.json". +---@param filename string resource to load, full path +---@return string|nil data loaded data, or nil if the resource could not be loaded +---@return string|nil error the error message, or nil if no error occurred +function sys.load_resource(filename) end + +---Open URL in default application, typically a browser +---@param url string url to open +---@param attributes { target:string|nil, name:string|nil }|nil table with attributes +---target +---- string : Optional. Specifies the target attribute or the name of the window. The following values are supported: +---- _self - (default value) URL replaces the current page. +---- _blank - URL is loaded into a new window, or tab. +---- _parent - URL is loaded into the parent frame. +---- _top - URL replaces any framesets that may be loaded. +---- name - The name of the window (Note: the name does not specify the title of the new window). +---@return boolean success a boolean indicating if the url could be opened or not +function sys.open_url(url, attributes) end + +---Reboots the game engine with a specified set of arguments. +---Arguments will be translated into command line arguments. Calling reboot +---function is equivalent to starting the engine with the same arguments. +---On startup the engine reads configuration from "game.project" in the +---project root. +---@param arg1 string|nil argument 1 +---@param arg2 string|nil argument 2 +---@param arg3 string|nil argument 3 +---@param arg4 string|nil argument 4 +---@param arg5 string|nil argument 5 +---@param arg6 string|nil argument 6 +function sys.reboot(arg1, arg2, arg3, arg4, arg5, arg6) end + +---The table can later be loaded by sys.load. +---Use sys.get_save_file to obtain a valid location for the file. +---Internally, this function uses a workspace buffer sized output file sized 512kb. +---This size reflects the output file size which must not exceed this limit. +---Additionally, the total number of rows that any one table may contain is limited to 65536 +---(i.e. a 16 bit range). When tables are used to represent arrays, the values of +---keys are permitted to fall within a 32 bit range, supporting sparse arrays, however +---the limit on the total number of rows remains in effect. +---@param filename string file to write to +---@param table table lua table to save +---@return boolean success a boolean indicating if the table could be saved or not +function sys.save(filename, table) end + +---The buffer can later deserialized by sys.deserialize. +---This method has all the same limitations as sys.save. +---@param table table lua table to serialize +---@return string buffer serialized data buffer +function sys.serialize(table) end + +---Sets the host that is used to check for network connectivity against. +---@param host string hostname to check against +function sys.set_connectivity_host(host) end + +---Set the Lua error handler function. +---The error handler is a function which is called whenever a lua runtime error occurs. +---@param error_handler fun(source, message, traceback) the function to be called on error +--- +---source +---string The runtime context of the error. Currently, this is always "lua". +---message +---string The source file, line number and error message. +---traceback +---string The stack traceback. +--- +function sys.set_error_handler(error_handler) end + +---Set game update-frequency (frame cap). This option is equivalent to display.update_frequency in +---the "game.project" settings but set in run-time. If Vsync checked in "game.project", the rate will +---be clamped to a swap interval that matches any detected main monitor refresh rate. If Vsync is +---unchecked the engine will try to respect the rate in software using timers. There is no +---guarantee that the frame cap will be achieved depending on platform specifics and hardware settings. +---@param frequency number target frequency. 60 for 60 fps +function sys.set_update_frequency(frequency) end + +---Set the vsync swap interval. The interval with which to swap the front and back buffers +---in sync with vertical blanks (v-blank), the hardware event where the screen image is updated +---with data from the front buffer. A value of 1 swaps the buffers at every v-blank, a value of +---2 swaps the buffers every other v-blank and so on. A value of 0 disables waiting for v-blank +---before swapping the buffers. Default value is 1. +---When setting the swap interval to 0 and having vsync disabled in +---"game.project", the engine will try to respect the set frame cap value from +---"game.project" in software instead. +---This setting may be overridden by driver settings. +---@param swap_interval number target swap interval. +function sys.set_vsync_swap_interval(swap_interval) end + +return sys \ No newline at end of file diff --git a/annotations/defold/tilemap.lua b/annotations/defold/tilemap.lua new file mode 100644 index 0000000..79b3a19 --- /dev/null +++ b/annotations/defold/tilemap.lua @@ -0,0 +1,90 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Tilemap API documentation + + Functions and messages used to manipulate tile map components. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.tilemap +tilemap = {} + +---flip tile horizontally +tilemap.H_FLIP = nil + +---rotate tile 180 degrees clockwise +tilemap.ROTATE_180 = nil + +---rotate tile 270 degrees clockwise +tilemap.ROTATE_270 = nil + +---rotate tile 90 degrees clockwise +tilemap.ROTATE_90 = nil + +---flip tile vertically +tilemap.V_FLIP = nil + +---Get the bounds for a tile map. This function returns multiple values: +---The lower left corner index x and y coordinates (1-indexed), +---the tile map width and the tile map height. +---The resulting values take all tile map layers into account, meaning that +---the bounds are calculated as if all layers were collapsed into one. +---@param url string|hash|url the tile map +---@return number x x coordinate of the bottom left corner +---@return number y y coordinate of the bottom left corner +---@return number w number of columns (width) in the tile map +---@return number h number of rows (height) in the tile map +function tilemap.get_bounds(url) end + +---Get the tile set at the specified position in the tilemap. +---The position is identified by the tile index starting at origin +---with index 1, 1. (see tilemap.set_tile()) +---Which tile map and layer to query is identified by the URL and the +---layer name parameters. +---@param url string|hash|url the tile map +---@param layer string|hash name of the layer for the tile +---@param x number x-coordinate of the tile +---@param y number y-coordinate of the tile +---@return number tile index of the tile +function tilemap.get_tile(url, layer, x, y) end + +---Replace a tile in a tile map with a new tile. +---The coordinates of the tiles are indexed so that the "first" tile just +---above and to the right of origin has coordinates 1,1. +---Tiles to the left of and below origin are indexed 0, -1, -2 and so forth. +---+-------+-------+------+------+ +---| 0,3 | 1,3 | 2,3 | 3,3 | +---+-------+-------+------+------+ +---| 0,2 | 1,2 | 2,2 | 3,2 | +---+-------+-------+------+------+ +---| 0,1 | 1,1 | 2,1 | 3,1 | +---+-------O-------+------+------+ +---| 0,0 | 1,0 | 2,0 | 3,0 | +---+-------+-------+------+------+ +---The coordinates must be within the bounds of the tile map as it were created. +---That is, it is not possible to extend the size of a tile map by setting tiles outside the edges. +---To clear a tile, set the tile to number 0. Which tile map and layer to manipulate is identified by the URL and the layer name parameters. +---Transform bitmask is arithmetic sum of one or both FLIP constants (tilemap.H_FLIP, tilemap.V_FLIP) and/or one of ROTATION constants +---(tilemap.ROTATE_90, tilemap.ROTATE_180, tilemap.ROTATE_270). +---Flip always applies before rotation (clockwise). +---@param url string|hash|url the tile map +---@param layer string|hash name of the layer for the tile +---@param x number x-coordinate of the tile +---@param y number y-coordinate of the tile +---@param tile number index of new tile to set. 0 resets the cell +---@param transform_bitmask number|nil optional flip and/or rotation should be applied to the tile +function tilemap.set_tile(url, layer, x, y, tile, transform_bitmask) end + +---Sets the visibility of the tilemap layer +---@param url string|hash|url the tile map +---@param layer string|hash name of the layer for the tile +---@param visible boolean should the layer be visible +function tilemap.set_visible(url, layer, visible) end + +return tilemap \ No newline at end of file diff --git a/annotations/defold/timer.lua b/annotations/defold/timer.lua new file mode 100644 index 0000000..3921aac --- /dev/null +++ b/annotations/defold/timer.lua @@ -0,0 +1,68 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Timer API documentation + + Timers allow you to set a delay and a callback to be called when the timer completes. + The timers created with this API are updated with the collection timer where they + are created. If you pause or speed up the collection (using set_time_step) it will + also affect the new timer. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.timer +timer = {} + +---Indicates an invalid timer handle +timer.INVALID_TIMER_HANDLE = nil + +---You may cancel a timer from inside a timer callback. +---Cancelling a timer that is already executed or cancelled is safe. +---@param handle hash the timer handle returned by timer.delay() +---@return boolean true if the timer was active, false if the timer is already cancelled / complete +function timer.cancel(handle) end + +---Adds a timer and returns a unique handle. +---You may create more timers from inside a timer callback. +---Using a delay of 0 will result in a timer that triggers at the next frame just before +---script update functions. +---If you want a timer that triggers on each frame, set delay to 0.0f and repeat to true. +---Timers created within a script will automatically die when the script is deleted. +---@param delay number time interval in seconds +---@param repeating boolean true = repeat timer until cancel, false = one-shot timer +---@param callback fun(self, handle, time_elapsed) timer callback function +--- +---self +---object The current object +---handle +---number The handle of the timer +---time_elapsed +---number The elapsed time - on first trigger it is time since timer.delay call, otherwise time since last trigger +--- +---@return hash handle identifier for the create timer, returns timer.INVALID_TIMER_HANDLE if the timer can not be created +function timer.delay(delay, repeating, callback) end + +---Get information about timer. +---@param handle hash the timer handle returned by timer.delay() +---@return { time_remaining:number, delay:number, repeating:boolean }|nil data table or nil if timer is cancelled/completed. table with data in the following fields: +--- +---time_remaining +---number Time remaining until the next time a timer.delay() fires. +---delay +---number Time interval. +---repeating +---boolean true = repeat timer until cancel, false = one-shot timer. +--- +function timer.get_info(handle) end + +---Manual triggering a callback for a timer. +---@param handle hash the timer handle returned by timer.delay() +---@return boolean true if the timer was active, false if the timer is already cancelled / complete +function timer.trigger(handle) end + +return timer \ No newline at end of file diff --git a/annotations/defold/types.lua b/annotations/defold/types.lua new file mode 100644 index 0000000..0db72cb --- /dev/null +++ b/annotations/defold/types.lua @@ -0,0 +1,111 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Known classes and aliases used in the Defold API +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class matrix4 +---@field c0 vector4 +---@field c1 vector4 +---@field c2 vector4 +---@field c3 vector4 +---@field m00 number +---@field m01 number +---@field m02 number +---@field m03 number +---@field m10 number +---@field m11 number +---@field m12 number +---@field m13 number +---@field m20 number +---@field m21 number +---@field m22 number +---@field m23 number +---@field m30 number +---@field m31 number +---@field m32 number +---@field m33 number + +---@class physics.raycast_response +---@field fraction number +---@field group hash +---@field id hash +---@field normal vector3 +---@field position vector3 +---@field request_id number + +---@class resource.animation +---@field flip_horizontal boolean +---@field flip_vertical boolean +---@field fps integer +---@field frame_end integer +---@field frame_start integer +---@field height integer +---@field id string +---@field playback constant +---@field width integer + +---@class resource.atlas +---@field animations resource.animation[] +---@field geometries resource.geometry[] +---@field texture string|hash + +---@class resource.geometry +---@field id string +---@field indices number[] +---@field uvs number[] +---@field vertices number[] + +---@class socket.dns +socket.dns = {} + +---@class url +---@field fragment hash +---@field path hash +---@field socket hash + +---@class vector3 +---@field x number +---@field y number +---@field z number +---@operator add(vector3): vector3 +---@operator mul(number): vector3 +---@operator sub(vector3): vector3 +---@operator unm: vector3 + +---@class vector4 +---@field w number +---@field x number +---@field y number +---@field z number +---@operator add(vector4): vector4 +---@operator mul(number): vector4 +---@operator sub(vector4): vector4 +---@operator unm: vector4 + +---@alias array table +---@alias b2Body userdata +---@alias b2BodyType number +---@alias b2World userdata +---@alias bool boolean +---@alias buffer_data userdata +---@alias buffer_stream userdata +---@alias constant userdata +---@alias constant_buffer userdata +---@alias float number +---@alias hash userdata +---@alias node userdata +---@alias quaternion vector4 +---@alias render_predicate userdata +---@alias render_target userdata +---@alias resource_data userdata +---@alias resource_handle number|userdata +---@alias socket_client userdata +---@alias socket_master userdata +---@alias socket_unconnected userdata \ No newline at end of file diff --git a/annotations/defold/vmath.lua b/annotations/defold/vmath.lua new file mode 100644 index 0000000..1134fd4 --- /dev/null +++ b/annotations/defold/vmath.lua @@ -0,0 +1,404 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Vector math API documentation + + Functions for mathematical operations on vectors, matrices and quaternions. + The vector types (vmath.vector3 and vmath.vector4) supports addition and subtraction + with vectors of the same type. Vectors can be negated and multiplied (scaled) or divided by numbers. + The quaternion type (vmath.quat) supports multiplication with other quaternions. + The matrix type (vmath.matrix4) can be multiplied with numbers, other matrices + and vmath.vector4 values. + All types performs equality comparison by each component value. + The following components are available for the various types: + vector3 + x, y and z. Example: v.y + vector4 + x, y, z, and w. Example: v.w + quaternion + x, y, z, and w. Example: q.w + matrix4 + m00 to m33 where the first number is the row (starting from 0) and the second + number is the column. Columns can be accessed with c0 to c3, returning a vector4. + Example: m.m21 which is equal to m.c1.z + vector + indexed by number 1 to the vector length. Example: v[3] +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.vmath +vmath = {} + +---Calculates the conjugate of a quaternion. The result is a +---quaternion with the same magnitudes but with the sign of +---the imaginary (vector) parts changed: +---q* = [w, -v] +---@param q1 quaternion quaternion of which to calculate the conjugate +---@return quaternion q the conjugate +function vmath.conj(q1) end + +---Given two linearly independent vectors P and Q, the cross product, +---P × Q, is a vector that is perpendicular to both P and Q and +---therefore normal to the plane containing them. +---If the two vectors have the same direction (or have the exact +---opposite direction from one another, i.e. are not linearly independent) +---or if either one has zero length, then their cross product is zero. +---@param v1 vector3 first vector +---@param v2 vector3 second vector +---@return vector3 v a new vector representing the cross product +function vmath.cross(v1, v2) end + +---The returned value is a scalar defined as: +---P ⋅ Q = |P| |Q| cos θ +---where θ is the angle between the vectors P and Q. +---If the dot product is positive then the angle between the vectors is below 90 degrees. +---If the dot product is zero the vectors are perpendicular (at right-angles to each other). +---If the dot product is negative then the angle between the vectors is more than 90 degrees. +---@param v1 vector3|vector4 first vector +---@param v2 vector3|vector4 second vector +---@return number n dot product +function vmath.dot(v1, v2) end + +---The resulting matrix is the inverse of the supplied matrix. +--- For ortho-normal matrices, e.g. regular object transformation, +---use vmath.ortho_inv() instead. +---The specialized inverse for ortho-normalized matrices is much faster +---than the general inverse. +---@param m1 matrix4 matrix to invert +---@return matrix4 m inverse of the supplied matrix +function vmath.inv(m1) end + +---Returns the length of the supplied vector or quaternion. +---If you are comparing the lengths of vectors or quaternions, you should compare +---the length squared instead as it is slightly more efficient to calculate +---(it eliminates a square root calculation). +---@param v vector3|vector4|quaternion value of which to calculate the length +---@return number n length +function vmath.length(v) end + +---Returns the squared length of the supplied vector or quaternion. +---@param v vector3|vector4|quaternion value of which to calculate the squared length +---@return number n squared length +function vmath.length_sqr(v) end + +---Linearly interpolate between two quaternions. Linear +---interpolation of rotations are only useful for small +---rotations. For interpolations of arbitrary rotations, +---vmath.slerp yields much better results. +--- The function does not clamp t between 0 and 1. +---@param t number interpolation parameter, 0-1 +---@param q1 quaternion quaternion to lerp from +---@param q2 quaternion quaternion to lerp to +---@return quaternion q the lerped quaternion +function vmath.lerp(t, q1, q2) end + +---Linearly interpolate between two vectors. The function +---treats the vectors as positions and interpolates between +---the positions in a straight line. Lerp is useful to describe +---transitions from one place to another over time. +--- The function does not clamp t between 0 and 1. +---@param t number interpolation parameter, 0-1 +---@param v1 vector3|vector4 vector to lerp from +---@param v2 vector3|vector4 vector to lerp to +---@return vector3|vector4 v the lerped vector +function vmath.lerp(t, v1, v2) end + +---Linearly interpolate between two values. Lerp is useful +---to describe transitions from one value to another over time. +--- The function does not clamp t between 0 and 1. +---@param t number interpolation parameter, 0-1 +---@param n1 number number to lerp from +---@param n2 number number to lerp to +---@return number n the lerped number +function vmath.lerp(t, n1, n2) end + +---The resulting identity matrix describes a transform with +---no translation or rotation. +---@return matrix4 m identity matrix +function vmath.matrix4() end + +---Creates a new matrix with all components set to the +---corresponding values from the supplied matrix. I.e. +---the function creates a copy of the given matrix. +---@param m1 matrix4 existing matrix +---@return matrix4 m matrix which is a copy of the specified matrix +function vmath.matrix4(m1) end + +---The resulting matrix describes a rotation around the axis by the specified angle. +---@param v vector3 axis +---@param angle number angle in radians +---@return matrix4 m matrix represented by axis and angle +function vmath.matrix4_axis_angle(v, angle) end + +---The resulting matrix describes the same rotation as the quaternion, but does not have any translation (also like the quaternion). +---@param q quaternion quaternion to create matrix from +---@return matrix4 m matrix represented by quaternion +function vmath.matrix4_from_quat(q) end + +---Constructs a frustum matrix from the given values. The left, right, +---top and bottom coordinates of the view cone are expressed as distances +---from the center of the near clipping plane. The near and far coordinates +---are expressed as distances from the tip of the view frustum cone. +---@param left number coordinate for left clipping plane +---@param right number coordinate for right clipping plane +---@param bottom number coordinate for bottom clipping plane +---@param top number coordinate for top clipping plane +---@param near number coordinate for near clipping plane +---@param far number coordinate for far clipping plane +---@return matrix4 m matrix representing the frustum +function vmath.matrix4_frustum(left, right, bottom, top, near, far) end + +---The resulting matrix is created from the supplied look-at parameters. +---This is useful for constructing a view matrix for a camera or +---rendering in general. +---@param eye vector3 eye position +---@param look_at vector3 look-at position +---@param up vector3 up vector +---@return matrix4 m look-at matrix +function vmath.matrix4_look_at(eye, look_at, up) end + +---Creates an orthographic projection matrix. +---This is useful to construct a projection matrix for a camera or rendering in general. +---@param left number coordinate for left clipping plane +---@param right number coordinate for right clipping plane +---@param bottom number coordinate for bottom clipping plane +---@param top number coordinate for top clipping plane +---@param near number coordinate for near clipping plane +---@param far number coordinate for far clipping plane +---@return matrix4 m orthographic projection matrix +function vmath.matrix4_orthographic(left, right, bottom, top, near, far) end + +---Creates a perspective projection matrix. +---This is useful to construct a projection matrix for a camera or rendering in general. +---@param fov number angle of the full vertical field of view in radians +---@param aspect number aspect ratio +---@param near number coordinate for near clipping plane +---@param far number coordinate for far clipping plane +---@return matrix4 m perspective projection matrix +function vmath.matrix4_perspective(fov, aspect, near, far) end + +---The resulting matrix describes a rotation around the x-axis +---by the specified angle. +---@param angle number angle in radians around x-axis +---@return matrix4 m matrix from rotation around x-axis +function vmath.matrix4_rotation_x(angle) end + +---The resulting matrix describes a rotation around the y-axis +---by the specified angle. +---@param angle number angle in radians around y-axis +---@return matrix4 m matrix from rotation around y-axis +function vmath.matrix4_rotation_y(angle) end + +---The resulting matrix describes a rotation around the z-axis +---by the specified angle. +---@param angle number angle in radians around z-axis +---@return matrix4 m matrix from rotation around z-axis +function vmath.matrix4_rotation_z(angle) end + +---The resulting matrix describes a translation of a point +---in euclidean space. +---@param position vector3|vector4 position vector to create matrix from +---@return matrix4 m matrix from the supplied position vector +function vmath.matrix4_translation(position) end + +---Performs an element wise multiplication between two vectors of the same type +---The returned value is a vector defined as (e.g. for a vector3): +---v = vmath.mul_per_elem(a, b) = vmath.vector3(a.x * b.x, a.y * b.y, a.z * b.z) +---@param v1 vector3|vector4 first vector +---@param v2 vector3|vector4 second vector +---@return vector3|vector4 v multiplied vector +function vmath.mul_per_elem(v1, v2) end + +---Normalizes a vector, i.e. returns a new vector with the same +---direction as the input vector, but with length 1. +--- The length of the vector must be above 0, otherwise a +---division-by-zero will occur. +---@param v1 vector3|vector4|quaternion vector to normalize +---@return vector3|vector4|quaternion v new normalized vector +function vmath.normalize(v1) end + +---The resulting matrix is the inverse of the supplied matrix. +---The supplied matrix has to be an ortho-normal matrix, e.g. +---describe a regular object transformation. +--- For matrices that are not ortho-normal +---use the general inverse vmath.inv() instead. +---@param m1 matrix4 ortho-normalized matrix to invert +---@return matrix4 m inverse of the supplied matrix +function vmath.ortho_inv(m1) end + +---Calculates the extent the projection of the first vector onto the second. +---The returned value is a scalar p defined as: +---p = |P| cos θ / |Q| +---where θ is the angle between the vectors P and Q. +---@param v1 vector3 vector to be projected on the second +---@param v2 vector3 vector onto which the first will be projected, must not have zero length +---@return number n the projected extent of the first vector onto the second +function vmath.project(v1, v2) end + +---Creates a new identity quaternion. The identity +---quaternion is equal to: +---vmath.quat(0, 0, 0, 1) +---@return quaternion q new identity quaternion +function vmath.quat() end + +---Creates a new quaternion with the components set +---according to the supplied parameter values. +---@param x number x coordinate +---@param y number y coordinate +---@param z number z coordinate +---@param w number w coordinate +---@return quaternion q new quaternion +function vmath.quat(x, y, z, w) end + +---Creates a new quaternion with all components set to the +---corresponding values from the supplied quaternion. I.e. +---This function creates a copy of the given quaternion. +---@param q1 quaternion existing quaternion +---@return quaternion q new quaternion +function vmath.quat(q1) end + +---The resulting quaternion describes a rotation of angle +---radians around the axis described by the unit vector v. +---@param v vector3 axis +---@param angle number angle +---@return quaternion q quaternion representing the axis-angle rotation +function vmath.quat_axis_angle(v, angle) end + +---The resulting quaternion describes the rotation from the +---identity quaternion (no rotation) to the coordinate system +---as described by the given x, y and z base unit vectors. +---@param x vector3 x base vector +---@param y vector3 y base vector +---@param z vector3 z base vector +---@return quaternion q quaternion representing the rotation of the specified base vectors +function vmath.quat_basis(x, y, z) end + +---The resulting quaternion describes the rotation that, +---if applied to the first vector, would rotate the first +---vector to the second. The two vectors must be unit +---vectors (of length 1). +--- The result is undefined if the two vectors point in opposite directions +---@param v1 vector3 first unit vector, before rotation +---@param v2 vector3 second unit vector, after rotation +---@return quaternion q quaternion representing the rotation from first to second vector +function vmath.quat_from_to(v1, v2) end + +---The resulting quaternion describes a rotation of angle +---radians around the x-axis. +---@param angle number angle in radians around x-axis +---@return quaternion q quaternion representing the rotation around the x-axis +function vmath.quat_rotation_x(angle) end + +---The resulting quaternion describes a rotation of angle +---radians around the y-axis. +---@param angle number angle in radians around y-axis +---@return quaternion q quaternion representing the rotation around the y-axis +function vmath.quat_rotation_y(angle) end + +---The resulting quaternion describes a rotation of angle +---radians around the z-axis. +---@param angle number angle in radians around z-axis +---@return quaternion q quaternion representing the rotation around the z-axis +function vmath.quat_rotation_z(angle) end + +---Returns a new vector from the supplied vector that is +---rotated by the rotation described by the supplied +---quaternion. +---@param q quaternion quaternion +---@param v1 vector3 vector to rotate +---@return vector3 v the rotated vector +function vmath.rotate(q, v1) end + +---Slerp travels the torque-minimal path maintaining constant +---velocity, which means it travels along the straightest path along +---the rounded surface of a sphere. Slerp is useful for interpolation +---of rotations. +---Slerp travels the torque-minimal path, which means it travels +---along the straightest path the rounded surface of a sphere. +--- The function does not clamp t between 0 and 1. +---@param t number interpolation parameter, 0-1 +---@param q1 quaternion quaternion to slerp from +---@param q2 quaternion quaternion to slerp to +---@return quaternion q the slerped quaternion +function vmath.slerp(t, q1, q2) end + +---Spherically interpolates between two vectors. The difference to +---lerp is that slerp treats the vectors as directions instead of +---positions in space. +---The direction of the returned vector is interpolated by the angle +---and the magnitude is interpolated between the magnitudes of the +---from and to vectors. +--- Slerp is computationally more expensive than lerp. +---The function does not clamp t between 0 and 1. +---@param t number interpolation parameter, 0-1 +---@param v1 vector3|vector4 vector to slerp from +---@param v2 vector3|vector4 vector to slerp to +---@return vector3|vector4 v the slerped vector +function vmath.slerp(t, v1, v2) end + +---Creates a vector of arbitrary size. The vector is initialized +---with numeric values from a table. +--- The table values are converted to floating point +---values. If a value cannot be converted, a 0 is stored in that +---value position in the vector. +---@param t table table of numbers +---@return vector4|vector3 v new vector +function vmath.vector(t) end + +---Creates a new vector with all components set to the +---corresponding values from the supplied vector. I.e. +---This function creates a copy of the given vector. +---@param v1 vector3 existing vector +---@return vector3 v new vector +function vmath.vector3(v1) end + +---Creates a new vector with the components set to the +---supplied values. +---@param x number x coordinate +---@param y number y coordinate +---@param z number z coordinate +---@return vector3 v new vector +function vmath.vector3(x, y, z) end + +---Creates a new zero vector with all components set to 0. +---@return vector3 v new zero vector +function vmath.vector3() end + +---Creates a new vector with all components set to the +---supplied scalar value. +---@param n number scalar value to splat +---@return vector3 v new vector +function vmath.vector3(n) end + +---Creates a new vector with the components set to the +---supplied values. +---@param x number x coordinate +---@param y number y coordinate +---@param z number z coordinate +---@param w number w coordinate +---@return vector4 v new vector +function vmath.vector4(x, y, z, w) end + +---Creates a new vector with all components set to the +---supplied scalar value. +---@param n number scalar value to splat +---@return vector4 v new vector +function vmath.vector4(n) end + +---Creates a new zero vector with all components set to 0. +---@return vector4 v new zero vector +function vmath.vector4() end + +---Creates a new vector with all components set to the +---corresponding values from the supplied vector. I.e. +---This function creates a copy of the given vector. +---@param v1 vector4 existing vector +---@return vector4 v new vector +function vmath.vector4(v1) end + +return vmath \ No newline at end of file diff --git a/annotations/defold/window.lua b/annotations/defold/window.lua new file mode 100644 index 0000000..cbb69b0 --- /dev/null +++ b/annotations/defold/window.lua @@ -0,0 +1,110 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Window API documentation + + Functions and constants to access the window, window event listeners + and screen dimming. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.window +window = {} + +---Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. +window.DIMMING_OFF = nil + +---Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. +window.DIMMING_ON = nil + +---Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. +---This mode indicates that the dim mode can't be determined, or that the platform doesn't support dimming. +window.DIMMING_UNKNOWN = nil + +--- This event is sent to a window event listener when the game window or app screen is +---restored after being iconified. +window.WINDOW_EVENT_DEICONIFIED = nil + +---This event is sent to a window event listener when the game window or app screen has +---gained focus. +---This event is also sent at game startup and the engine gives focus to the game. +window.WINDOW_EVENT_FOCUS_GAINED = nil + +---This event is sent to a window event listener when the game window or app screen has lost focus. +window.WINDOW_EVENT_FOCUS_LOST = nil + +--- This event is sent to a window event listener when the game window or app screen is +---iconified (reduced to an application icon in a toolbar, application tray or similar). +window.WINDOW_EVENT_ICONFIED = nil + +---This event is sent to a window event listener when the game window or app screen is resized. +---The new size is passed along in the data field to the event listener. +window.WINDOW_EVENT_RESIZED = nil + +--- Returns the current dimming mode set on a mobile device. +---The dimming mode specifies whether or not a mobile device should dim the screen after a period without user interaction. +---On platforms that does not support dimming, window.DIMMING_UNKNOWN is always returned. +---@return constant mode The mode for screen dimming +--- +---window.DIMMING_UNKNOWN +---window.DIMMING_ON +---window.DIMMING_OFF +--- +function window.get_dim_mode() end + +---This returns the current lock state of the mouse cursor +---@return boolean state The lock state +function window.get_mouse_lock() end + +---This returns the current window size (width and height). +---@return number width The window width +---@return number height The window height +function window.get_size() end + +--- Sets the dimming mode on a mobile device. +---The dimming mode specifies whether or not a mobile device should dim the screen after a period without user interaction. The dimming mode will only affect the mobile device while the game is in focus on the device, but not when the game is running in the background. +---This function has no effect on platforms that does not support dimming. +---@param mode constant The mode for screen dimming +--- +---window.DIMMING_ON +---window.DIMMING_OFF +--- +function window.set_dim_mode(mode) end + +---Sets a window event listener. +---@param callback fun(self, event, data)|nil A callback which receives info about window events. Pass an empty function or nil if you no longer wish to receive callbacks. +--- +---self +---object The calling script +---event +---constant The type of event. Can be one of these: +--- +--- +---window.WINDOW_EVENT_FOCUS_LOST +---window.WINDOW_EVENT_FOCUS_GAINED +---window.WINDOW_EVENT_RESIZED +---window.WINDOW_EVENT_ICONIFIED +---window.WINDOW_EVENT_DEICONIFIED +--- +--- +---data +---table The callback value data is a table which currently holds these values +--- +--- +---number width: The width of a resize event. nil otherwise. +---number height: The height of a resize event. nil otherwise. +--- +function window.set_listener(callback) end + +---Set the locking state for current mouse cursor on a PC platform. +---This function locks or unlocks the mouse cursor to the center point of the window. While the cursor is locked, +---mouse position updates will still be sent to the scripts as usual. +---@param flag boolean The lock state for the mouse cursor +function window.set_mouse_lock(flag) end + +return window \ No newline at end of file diff --git a/annotations/defold/zlib.lua b/annotations/defold/zlib.lua new file mode 100644 index 0000000..268c7bc --- /dev/null +++ b/annotations/defold/zlib.lua @@ -0,0 +1,28 @@ +--[[ + Generated with github.com/astrochili/defold-annotations + Defold 1.8.0 + + Zlib compression API documentation + + Functions for compression and decompression of string buffers. +--]] + +---@diagnostic disable: lowercase-global +---@diagnostic disable: missing-return +---@diagnostic disable: duplicate-doc-param +---@diagnostic disable: duplicate-set-field + +---@class defold_api.zlib +zlib = {} + +---A lua error is raised is on error +---@param buf string buffer to deflate +---@return string buf deflated buffer +function zlib.deflate(buf) end + +---A lua error is raised is on error +---@param buf string buffer to inflate +---@return string buf inflated buffer +function zlib.inflate(buf) end + +return zlib \ No newline at end of file From 11ae63a9f68d37584ffd71140f97b5fe8363ddce Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 17:45:09 +0300 Subject: [PATCH 11/45] Update annotations --- .luacheckrc | 56 ------------ .vscode/settings.json | 17 ++++ docs/modules/Button.html | 22 ++--- docs/modules/Checkbox.html | 15 ++-- docs/modules/CheckboxGroup.html | 7 +- docs/modules/Drag.html | 12 ++- docs/modules/DruidInstance.html | 44 +++++----- docs/modules/DynamicGrid.html | 2 +- docs/modules/Hotkey.html | 3 +- docs/modules/Hover.html | 2 +- docs/modules/Input.html | 12 +-- docs/modules/LangText.html | 10 +-- docs/modules/PinKnob.html | 9 +- docs/modules/Progress.html | 19 ++-- docs/modules/RadioGroup.html | 9 +- docs/modules/RichText.html | 15 ++-- docs/modules/Scroll.html | 64 ++++++-------- docs/modules/Slider.html | 2 +- docs/modules/StaticGrid.html | 19 ++-- docs/modules/Swipe.html | 17 ++-- docs/modules/Text.html | 19 ++-- druid/annotations.lua | 127 ++++++++++++++------------- druid/base/button.lua | 10 +-- druid/base/drag.lua | 6 +- druid/base/hover.lua | 2 +- druid/base/scroll.lua | 28 +++--- druid/base/static_grid.lua | 6 +- druid/base/text.lua | 6 +- druid/custom/pin_knob/pin_knob.lua | 2 +- druid/custom/rich_text/rich_text.lua | 6 +- druid/extended/checkbox.lua | 6 +- druid/extended/checkbox_group.lua | 2 +- druid/extended/dynamic_grid.lua | 2 +- druid/extended/hotkey.lua | 2 +- druid/extended/input.lua | 8 +- druid/extended/lang_text.lua | 4 +- druid/extended/progress.lua | 6 +- druid/extended/radio_group.lua | 2 +- druid/extended/slider.lua | 2 +- druid/extended/swipe.lua | 8 +- druid/system/druid_instance.lua | 19 ++-- utils/annotations_manual.lua | 2 + 42 files changed, 275 insertions(+), 356 deletions(-) delete mode 100644 .luacheckrc create mode 100644 .vscode/settings.json diff --git a/.luacheckrc b/.luacheckrc deleted file mode 100644 index f9c6bc5..0000000 --- a/.luacheckrc +++ /dev/null @@ -1,56 +0,0 @@ -std = "max" -files['.luacheckrc'].global = false -unused_args = false - -max_code_line_length = 120 -max_comment_line_length = false - -globals = { - "sys", - "go", - "gui", - "label", - "render", - "crash", - "sprite", - "sound", - "tilemap", - "spine", - "particlefx", - "physics", - "factory", - "collectionfactory", - "iac", - "msg", - "vmath", - "url", - "http", - "image", - "json", - "zlib", - "iap", - "push", - "facebook", - "hash", - "hash_to_hex", - "pprint", - "init", - "final", - "update", - "on_input", - "on_message", - "on_reload", - "socket", - "table", - "debug", - "timer", - "window", - "buffer", - "resource", - "defos", - "html5", - "describe", - "before", - "after", - "it", -} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0f165ef --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "Lua.diagnostics.globals": [ + "init", + "final", + "update", + "on_message", + "on_input", + "describe", + "before", + "after", + "it" + ], + "Lua.workspace.ignoreDir": [ + ".vscode", + "test/*" + ] +} \ No newline at end of file diff --git a/docs/modules/Button.html b/docs/modules/Button.html index 0b8a8e9..a451bac 100644 --- a/docs/modules/Button.html +++ b/docs/modules/Button.html @@ -360,7 +360,7 @@ local button = self.druid:new_button("button_name", on_button_click, c Button
  • zone - node or nil + node, string or nil Gui node
  • @@ -508,19 +508,16 @@ button:set_enabled(true)

    Fields:

    • LONGTAP_TIME - number - Minimum time to trigger on_hold_callback - (default 0.4) + number or nil + Minimum time to trigger on_hold_callback. Default: 0.4
    • AUTOHOLD_TRIGGER - number - Maximum hold time to trigger button release while holding - (default 0.8) + number or nil + Maximum hold time to trigger button release while holding. Default: 0.8
    • DOUBLETAP_TIME - number - Time between double taps - (default 0.4) + number or nil + Time between double taps. Default: 0.4
    • on_click function @@ -565,9 +562,8 @@ button:set_enabled(true)
      • anim_node - node - - (default node) + node or nil + Default node
      diff --git a/docs/modules/Checkbox.html b/docs/modules/Checkbox.html index 8ac33c6..57e1d53 100644 --- a/docs/modules/Checkbox.html +++ b/docs/modules/Checkbox.html @@ -87,7 +87,7 @@
    - + @@ -158,7 +158,7 @@
    - init(self, node, callback[, click_node=node[, initial_state=false]]) + init(self, node, callback, click_node, initial_state)
    The Checkbox constructor @@ -179,14 +179,12 @@ Checkbox callback
  • click_node - node - Trigger node, by default equals to node - (default node) + node or nil + Trigger node, by default equals to node. Default: node
  • initial_state - boolean + boolean or nil The initial state of checkbox, default - false - (default false)
  • @@ -289,9 +287,8 @@
    • click_node - node + node or nil - (default node)
    diff --git a/docs/modules/CheckboxGroup.html b/docs/modules/CheckboxGroup.html index 8551324..3a3914b 100644 --- a/docs/modules/CheckboxGroup.html +++ b/docs/modules/CheckboxGroup.html @@ -86,7 +86,7 @@
    - + @@ -142,7 +142,7 @@
    - init(self, nodes, callback[, click_nodes=node]) + init(self, nodes, callback, click_nodes)
    The CheckboxGroup constructor @@ -163,9 +163,8 @@ Checkbox callback
  • click_nodes - node[] + node[] or nil Array of trigger nodes, by default equals to nodes - (default node)
  • diff --git a/docs/modules/Drag.html b/docs/modules/Drag.html index e967282..0b7c4c7 100644 --- a/docs/modules/Drag.html +++ b/docs/modules/Drag.html @@ -253,7 +253,7 @@ Drag
  • node - node + node, string or nil Gui node
  • @@ -305,14 +305,12 @@

    Fields:

    • DRAG_DEADZONE - number - Distance in pixels to start dragging - (default 10) + number or nil + Distance in pixels to start dragging. Default: 10
    • NO_USE_SCREEN_KOEF - boolean - If screen aspect ratio affects on drag values - (default false) + boolean or nil + If screen aspect ratio affects on drag values. Default: false
    diff --git a/docs/modules/DruidInstance.html b/docs/modules/DruidInstance.html index 1811027..71a1df5 100644 --- a/docs/modules/DruidInstance.html +++ b/docs/modules/DruidInstance.html @@ -162,7 +162,7 @@ end
    - + @@ -194,7 +194,7 @@ end - + @@ -202,7 +202,7 @@ end - + @@ -246,11 +246,11 @@ end - + - + @@ -415,7 +415,7 @@ end Button callback params
  • anim_node - node or nil + node, string or nil Button anim node (node, if not provided)
  • @@ -476,7 +476,7 @@ end
    - new_checkbox_group(self, nodes, callback[, click_nodes=node]) + new_checkbox_group(self, nodes, callback, click_nodes)
    Create CheckboxGroup component @@ -489,7 +489,7 @@ end
  • nodes - node[] + (node or string)[] Array of gui node
  • callback @@ -497,9 +497,8 @@ end Checkbox callback
  • click_nodes - node[] + (node, string)[] or nil Array of trigger nodes, by default equals to nodes - (default node)
  • @@ -712,7 +711,7 @@ end Button node to enabled input component
  • text_node - string or node + string, node or druid.text Text node what will be changed on user input
  • keyboard_type @@ -773,7 +772,7 @@ end
  • - new_layout(self, node, mode) + new_layout(self, node, mode, on_size_changed_callback)
    Create Layout component @@ -793,6 +792,10 @@ end string The layout mode +
  • on_size_changed_callback + function or nil + The callback on window resize +
  • Returns:

    @@ -847,7 +850,7 @@ end
    - new_radio_group(self, nodes, callback[, click_nodes=node]) + new_radio_group(self, nodes, callback, click_nodes)
    Create RadioGroup component @@ -860,7 +863,7 @@ end
  • nodes - node[] + (node or string)[] Array of gui node
  • callback @@ -868,9 +871,8 @@ end Radio callback
  • click_nodes - node[] + (node, string)[] or nil Array of trigger nodes, by default equals to nodes - (default node)
  • @@ -1249,7 +1251,7 @@ end
    - set_blacklist(self[, blacklist_components=nil]) + set_blacklist(self, blacklist_components)
    Set blacklist components for input processing. @@ -1264,9 +1266,8 @@ end DruidInstance
  • blacklist_components - table or BaseComponent + table, BaseComponent or nil The array of component to blacklist - (default nil)
  • @@ -1283,7 +1284,7 @@ end
    - set_whitelist(self[, whitelist_components=nil]) + set_whitelist(self, whitelist_components)
    Set whitelist components for input processing. @@ -1298,9 +1299,8 @@ end
  • whitelist_components - table or BaseComponent + table, BaseComponent or nil The array of component to whitelist - (default nil)
  • diff --git a/docs/modules/DynamicGrid.html b/docs/modules/DynamicGrid.html index 2f6677f..52d8458 100644 --- a/docs/modules/DynamicGrid.html +++ b/docs/modules/DynamicGrid.html @@ -420,7 +420,7 @@
      vector3 - Node position + node position
    diff --git a/docs/modules/Hotkey.html b/docs/modules/Hotkey.html index bf191fb..bb8c0da 100644 --- a/docs/modules/Hotkey.html +++ b/docs/modules/Hotkey.html @@ -289,9 +289,8 @@
    • click_node - node + node or nil - (default node)
    diff --git a/docs/modules/Hover.html b/docs/modules/Hover.html index 1623346..d47a662 100644 --- a/docs/modules/Hover.html +++ b/docs/modules/Hover.html @@ -259,7 +259,7 @@ Hover
  • zone - node + node, string or nil Gui node
  • diff --git a/docs/modules/Input.html b/docs/modules/Input.html index 0434ec0..b71cc85 100644 --- a/docs/modules/Input.html +++ b/docs/modules/Input.html @@ -422,23 +422,19 @@
    • IS_LONGTAP_ERASE boolean - Is long tap will erase current input data - (default false) + Is long tap will erase current input data. Default: false
    • MASK_DEFAULT_CHAR string - Default character mask for password input - (default *) + Default character mask for password input. Default: *]
    • IS_UNSELECT_ON_RESELECT boolean - If true, call unselect on select selected input - (default false) + If true, call unselect on select selected input. Default: false
    • NO_CONSUME_INPUT_WHILE_SELECTED boolean - If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured) - (default false) + If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false
    • on_select function diff --git a/docs/modules/LangText.html b/docs/modules/LangText.html index 2099832..0d02aba 100644 --- a/docs/modules/LangText.html +++ b/docs/modules/LangText.html @@ -93,7 +93,7 @@
    - + @@ -185,7 +185,7 @@
    - init(self, node[, locale_id=node_text[, adjust_type=downscale]]) + init(self, node, locale_id, adjust_type)
    The LangText constructor @@ -202,14 +202,12 @@ The node_id or gui.get_node(node_id)
  • locale_id - string + string or nil Default locale id or text from node as default - (default node_text)
  • adjust_type - string + string or nil Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference - (default downscale)
  • diff --git a/docs/modules/PinKnob.html b/docs/modules/PinKnob.html index 6e58444..d97d64e 100644 --- a/docs/modules/PinKnob.html +++ b/docs/modules/PinKnob.html @@ -91,7 +91,7 @@
    - +
    _is_inertFlag, if scroll now moving by inertion
    available_pos Available position for content node: (min_x, max_y, max_x, min_y) Return checkbox state
    init(self, node, callback[, click_node=node[, initial_state=false]])init(self, node, callback, click_node, initial_state) The Checkbox constructor
    Return checkbox group state
    init(self, nodes, callback[, click_nodes=node])init(self, nodes, callback, click_nodes) The CheckboxGroup constructor
    Create Checkbox component
    new_checkbox_group(self, nodes, callback[, click_nodes=node])new_checkbox_group(self, nodes, callback, click_nodes) Create CheckboxGroup component
    Create LangText component
    new_layout(self, node, mode)new_layout(self, node, mode, on_size_changed_callback) Create Layout component
    Create Progress component
    new_radio_group(self, nodes, callback[, click_nodes=node])new_radio_group(self, nodes, callback, click_nodes) Create RadioGroup component
    Remove created component from Druid instance.
    set_blacklist(self[, blacklist_components=nil])set_blacklist(self, blacklist_components) Set blacklist components for input processing.
    set_whitelist(self[, whitelist_components=nil])set_whitelist(self, whitelist_components) Set whitelist components for input processing.
    Format string with new text params on localized text
    init(self, node[, locale_id=node_text[, adjust_type=downscale]])init(self, node, locale_id, adjust_type) The LangText constructor
    Set current and min/max angles for component
    set_friction(self[, value=1])set_friction(self, value) Set current and min/max angles for component
    @@ -192,7 +192,7 @@
    - set_friction(self[, value=1]) + set_friction(self, value)
    Set current and min/max angles for component @@ -205,9 +205,8 @@ PinKnob
  • value - number - The spin speed multiplier - (default 1) + number or nil + The spin speed multiplier. Default: 1
  • diff --git a/docs/modules/Progress.html b/docs/modules/Progress.html index b72ba4f..cec8988 100644 --- a/docs/modules/Progress.html +++ b/docs/modules/Progress.html @@ -103,7 +103,7 @@ Return current progress bar value - init(self, node, key[, init_value=1]) + init(self, node, key, init_value) The Progress constructor @@ -234,7 +234,7 @@
    - init(self, node, key[, init_value=1]) + init(self, node, key, init_value)
    The Progress constructor @@ -255,9 +255,8 @@ Progress bar direction: const.SIDE.X or const.SIDE.Y
  • init_value - number - Initial value of progress bar - (default 1) + number or nil + Initial value of progress bar. Default: 1
  • @@ -401,14 +400,12 @@

    Fields:

    • SPEED - number - Progress bas fill rate. More -> faster - (default 5) + number or nil + Progress bas fill rate. More -> faster. Default: 5
    • MIN_DELTA - number - Minimum step to fill progress bar - (default 0.005) + number or nil + Minimum step to fill progress bar. Default: 0.005
    diff --git a/docs/modules/RadioGroup.html b/docs/modules/RadioGroup.html index 95b3e24..7445394 100644 --- a/docs/modules/RadioGroup.html +++ b/docs/modules/RadioGroup.html @@ -86,7 +86,7 @@ Return radio group state - init(self, nodes, callback[, click_nodes=node]) + init(self, nodes, callback, click_nodes) The RadioGroup constructor @@ -142,7 +142,7 @@
    - init(self, nodes, callback[, click_nodes=node]) + init(self, nodes, callback, click_nodes)
    The RadioGroup constructor @@ -163,9 +163,8 @@ Radio callback
  • click_nodes - node[] - Array of trigger nodes, by default equals to nodes - (default node) + node[] or nil + Array of trigger nodes, by default equals to nodes. Default - nodes
  • diff --git a/docs/modules/RichText.html b/docs/modules/RichText.html index 372c37e..990ce51 100644 --- a/docs/modules/RichText.html +++ b/docs/modules/RichText.html @@ -403,19 +403,16 @@ Words <nobr>inside tag</nobr> won't breakFields:
    • COLORS - table - Rich Text color aliases - (default {}) + table or nil + Rich Text color aliases. Default: {}
    • ADJUST_STEPS - number - Amount steps of attemps text adjust by height - (default 20) + number or nil + Amount steps of attemps text adjust by height. Default: 20
    • ADJUST_SCALE_DELTA - number - Scale step on each height adjust step - (default 0.02) + number or nil + Scale step on each height adjust step. Default: 0.02
    diff --git a/docs/modules/Scroll.html b/docs/modules/Scroll.html index 3cb1fac..6eefd06 100644 --- a/docs/modules/Scroll.html +++ b/docs/modules/Scroll.html @@ -529,7 +529,7 @@
  • node - node + node or string Gui node
  • @@ -687,7 +687,7 @@ The new size for content node
  • offset - vector3 + vector3 or nil Offset value to set, where content is starts
  • @@ -751,64 +751,52 @@

    Fields:

    • FRICT - number - Multiplier for free inertion - (default 0) + number or nil + Multiplier for free inertion. Default: 0
    • FRICT_HOLD - number - Multiplier for inertion, while touching - (default 0) + number or nil + Multiplier for inertion, while touching. Default: 0
    • INERT_THRESHOLD - number - Scroll speed to stop inertion - (default 3) + number or nil + Scroll speed to stop inertion. Default: 3
    • INERT_SPEED - number - Multiplier for inertion speed - (default 30) + number or nil + Multiplier for inertion speed. Default: 30
    • POINTS_DEADZONE - number - Speed to check points of interests in no_inertion mode - (default 20) + number or nil + Speed to check points of interests in no_inertion mode. Default: 20
    • BACK_SPEED - number - Scroll back returning lerp speed - (default 0.35) + number or nil + Scroll back returning lerp speed. Default: 35
    • ANIM_SPEED - number - Scroll gui.animation speed for scroll_to function - (default 0.2) + number or nil + Scroll gui.animation speed for scroll_to function. Default: 2
    • EXTRA_STRETCH_SIZE - number - extra size in pixels outside of scroll (stretch effect) - (default 0) + number or nil + extra size in pixels outside of scroll (stretch effect). Default: 0
    • SMALL_CONTENT_SCROLL - boolean - If true, content node with size less than view node size can be scrolled - (default false) + boolean or nil + If true, content node with size less than view node size can be scrolled. Default: false
    • WHEEL_SCROLL_SPEED - boolean - The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling - (default 0) + boolean or nil + The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling. Default: 0
    • WHEEL_SCROLL_INVERTED - boolean - If true, invert direction for touchpad and mouse wheel scroll - (default false) + boolean or nil + If true, invert direction for touchpad and mouse wheel scroll. Default: false
    • WHEEL_SCROLL_BY_INERTION - boolean - If true, wheel will add inertion to scroll. Direct set position otherwise. - (default false) + boolean or nil + If true, wheel will add inertion to scroll. Direct set position otherwise.. Default: false
    diff --git a/docs/modules/Slider.html b/docs/modules/Slider.html index 3fdf8fe..bc72643 100644 --- a/docs/modules/Slider.html +++ b/docs/modules/Slider.html @@ -225,7 +225,7 @@ Slider
  • input_node - node + node, string or nil
  • diff --git a/docs/modules/StaticGrid.html b/docs/modules/StaticGrid.html index e5591d3..4f2daee 100644 --- a/docs/modules/StaticGrid.html +++ b/docs/modules/StaticGrid.html @@ -138,7 +138,7 @@ Return grid content size - init(self, parent, element[, in_row=1]) + init(self, parent, element, in_row) The StaticGrid constructor @@ -496,7 +496,7 @@
    - init(self, parent, element[, in_row=1]) + init(self, parent, element, in_row)
    The StaticGrid constructor @@ -517,9 +517,8 @@ Element prefab. Need to get it size
  • in_row - number - How many nodes in row can be placed - (default 1) + number or nil + How many nodes in row can be placed. By default 1
  • @@ -672,14 +671,12 @@

    Fields:

    • IS_DYNAMIC_NODE_POSES - boolean - If true, always center grid content as grid pivot sets - (default false) + boolean or nil + If true, always center grid content as grid pivot sets. Default: false
    • IS_ALIGN_LAST_ROW - boolean - If true, always align last row of the grid as grid pivot sets - (default false) + boolean or nil + If true, always align last row of the grid as grid pivot sets. Default: false
    diff --git a/docs/modules/Swipe.html b/docs/modules/Swipe.html index 3b68b0d..da20bb1 100644 --- a/docs/modules/Swipe.html +++ b/docs/modules/Swipe.html @@ -169,7 +169,7 @@ Swipe
  • zone - node + node, string or nil Gui node
  • @@ -196,19 +196,16 @@

    Fields:

    • SWIPE_TIME - number - Maximum time for swipe trigger - (default 0.4) + number or nil + Maximum time for swipe trigger. Default: 0.4
    • SWIPE_THRESHOLD - number - Minimum distance for swipe trigger - (default 50) + number or nil + Minimum distance for swipe trigger. Default: 50
    • SWIPE_TRIGGER_ON_MOVE - boolean - If true, trigger on swipe moving, not only release action - (default false) + boolean or nil + If true, trigger on swipe moving, not only release action. Default: false
    diff --git a/docs/modules/Text.html b/docs/modules/Text.html index d4db3a6..eb925ac 100644 --- a/docs/modules/Text.html +++ b/docs/modules/Text.html @@ -109,7 +109,7 @@ Calculate text width with font with respect to trailing space - init(self, node, value[, adjust_type=downscale]) + init(self, node, value, adjust_type) The Text constructor @@ -284,7 +284,7 @@
    - init(self, node, value[, adjust_type=downscale]) + init(self, node, value, adjust_type)
    The Text constructor @@ -305,9 +305,8 @@ Initial text. Default value is node text from GUI scene.
  • adjust_type - string - Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference - (default downscale) + string or nil + Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale
  • @@ -612,14 +611,12 @@

    Fields:

    • TRIM_POSTFIX - string - The postfix for TRIM adjust type - (default ...) + string or nil + The postfix for TRIM adjust type. Default: ...
    • DEFAULT_ADJUST - string - The default adjust type for any text component - (default DOWNSCALE) + string or nil + The default adjust type for any text component. Default: DOWNSCALE
    diff --git a/druid/annotations.lua b/druid/annotations.lua index e6c25f9..7360eda 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -168,7 +168,7 @@ function druid__blocker.set_enabled(self, state) end ---@class druid.button : druid.base_component ----@field anim_node node Button animation node. +---@field anim_node node|nil Button animation node. ---@field click_zone node|nil Additional button click area, defined by another GUI node ---@field hover druid.hover The @{Hover}: Button Hover component ---@field node node Button trigger node @@ -213,7 +213,7 @@ function druid__button.set_check_function(self, check_function, failure_callback --- Set additional button click area. --- Useful to restrict click outside out stencil node or scrollable content. This functions calls automatically if you don't disable it in game.project: druid.no_stencil_check ---@param self druid.button @{Button} ----@param zone node|nil Gui node +---@param zone node|string|nil Gui node ---@return druid.button Current button instance function druid__button.set_click_zone(self, zone) end @@ -239,9 +239,9 @@ function druid__button.set_web_user_interaction(self, is_web_mode) end ---@class druid.button.style ----@field AUTOHOLD_TRIGGER number Maximum hold time to trigger button release while holding ----@field DOUBLETAP_TIME number Time between double taps ----@field LONGTAP_TIME number Minimum time to trigger on_hold_callback +---@field AUTOHOLD_TRIGGER number|nil Maximum hold time to trigger button release while holding. Default: 0.8 +---@field DOUBLETAP_TIME number|nil Time between double taps. Default: 0.4 +---@field LONGTAP_TIME number|nil Minimum time to trigger on_hold_callback. Default: 0.4 ---@field on_click function function(self, node) ---@field on_click_disabled function function(self, node) ---@field on_hover function function(self, node, hover_state) @@ -252,7 +252,7 @@ local druid__button__style = {} ---@class druid.checkbox : druid.base_component ---@field button druid.button Button component from click_node ----@field click_node node Button trigger node +---@field click_node node|nil Button trigger node ---@field node node Visual node ---@field on_change_state druid.event On change state callback(self, state) ---@field style druid.checkbox.style Component style params. @@ -267,8 +267,8 @@ function druid__checkbox.get_state(self) end ---@param self druid.checkbox @{Checkbox} ---@param node node Gui node ---@param callback function Checkbox callback ----@param click_node node Trigger node, by default equals to node ----@param initial_state boolean The initial state of checkbox, default - false +---@param click_node node|nil Trigger node, by default equals to node. Default: node +---@param initial_state boolean|nil The initial state of checkbox, default - false function druid__checkbox.init(self, node, callback, click_node, initial_state) end --- Set checkbox state @@ -298,7 +298,7 @@ function druid__checkbox_group.get_state(self) end ---@param self druid.checkbox_group @{CheckboxGroup} ---@param nodes node[] Array of gui node ---@param callback function Checkbox callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes node[]|nil Array of trigger nodes, by default equals to nodes function druid__checkbox_group.init(self, nodes, callback, click_nodes) end --- Set checkbox group state @@ -412,7 +412,7 @@ function druid__drag.is_enabled(self) end --- Strict drag click area. --- Useful for restrict events outside stencil node ---@param self druid.drag @{Drag} ----@param node node Gui node +---@param node node|string|nil Gui node function druid__drag.set_click_zone(self, node) end --- Set Drag input enabled or disabled @@ -422,8 +422,8 @@ function druid__drag.set_enabled(self, is_enabled) end ---@class druid.drag.style ----@field DRAG_DEADZONE number Distance in pixels to start dragging ----@field NO_USE_SCREEN_KOEF boolean If screen aspect ratio affects on drag values +---@field DRAG_DEADZONE number|nil Distance in pixels to start dragging. Default: 10 +---@field NO_USE_SCREEN_KOEF boolean|nil If screen aspect ratio affects on drag values. Default: false local druid__drag__style = {} @@ -487,7 +487,7 @@ function druid__dynamic_grid.get_offset(self) end ---@param index number The grid element index ---@param node node The node to be placed ---@param origin_index number|nil Index of nearby node ----@return vector3 Node position +---@return vector3 node position function druid__dynamic_grid.get_pos(self, index, node, origin_index) end --- Return grid content size @@ -555,7 +555,7 @@ function druid__event.unsubscribe(self, callback, context) end ---@class druid.hotkey : druid.base_component ---@field button druid.button Button component from click_node ----@field click_node node Button trigger node +---@field click_node node|nil Button trigger node ---@field node node Visual node ---@field on_change_state druid.event On change state callback(self, state) ---@field style druid.hotkey.style Component style params. @@ -618,7 +618,7 @@ function druid__hover.is_mouse_hovered(self) end --- Strict hover click area. --- Useful for no click events outside stencil node ---@param self druid.hover @{Hover} ----@param zone node Gui node +---@param zone node|string|nil Gui node function druid__hover.set_click_zone(self, zone) end --- Set enable state of hover component. @@ -702,10 +702,10 @@ function druid__input.unselect(self) end ---@class druid.input.style ----@field IS_LONGTAP_ERASE boolean Is long tap will erase current input data ----@field IS_UNSELECT_ON_RESELECT boolean If true, call unselect on select selected input ----@field MASK_DEFAULT_CHAR string Default character mask for password input ----@field NO_CONSUME_INPUT_WHILE_SELECTED boolean If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured) +---@field IS_LONGTAP_ERASE boolean Is long tap will erase current input data. Default: false +---@field IS_UNSELECT_ON_RESELECT boolean If true, call unselect on select selected input. Default: false +---@field MASK_DEFAULT_CHAR string Default character mask for password input. Default: *] +---@field NO_CONSUME_INPUT_WHILE_SELECTED boolean If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false ---@field button_style table Custom button style for input node ---@field on_input_wrong function (self, button_node) Callback on wrong user input ---@field on_select function (self, button_node) Callback on input field selecting @@ -734,8 +734,8 @@ function druid__lang_text.format(self, a, b, c, d, e, f, g) end --- The @{LangText} constructor ---@param self druid.lang_text @{LangText} ---@param node string|node The node_id or gui.get_node(node_id) ----@param locale_id string Default locale id or text from node as default ----@param adjust_type string Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference +---@param locale_id string|nil Default locale id or text from node as default +---@param adjust_type string|nil Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference function druid__lang_text.init(self, node, locale_id, adjust_type) end --- Setup raw text to lang_text component @@ -846,7 +846,7 @@ function druid__pin_knob.set_angle(self, cur_value, min, max) end --- Set current and min/max angles for component ---@param self druid.pin_knob @{PinKnob} ----@param value number The spin speed multiplier +---@param value number|nil The spin speed multiplier. Default: 1 ---@return druid.pin_knob @{PinKnob} function druid__pin_knob.set_friction(self, value) end @@ -878,7 +878,7 @@ function druid__progress.get(self) end ---@param self druid.progress @{Progress} ---@param node string|node Node name or GUI Node itself. ---@param key string Progress bar direction: const.SIDE.X or const.SIDE.Y ----@param init_value number Initial value of progress bar +---@param init_value number|nil Initial value of progress bar. Default: 1 function druid__progress.init(self, node, key, init_value) end --- Set progress bar max node size @@ -906,8 +906,8 @@ function druid__progress.to(self, to, callback) end ---@class druid.progress.style ----@field MIN_DELTA number Minimum step to fill progress bar ----@field SPEED number Progress bas fill rate. More -> faster +---@field MIN_DELTA number|nil Minimum step to fill progress bar. Default: 0.005 +---@field SPEED number|nil Progress bas fill rate. More -> faster. Default: 5 local druid__progress__style = {} @@ -925,7 +925,7 @@ function druid__radio_group.get_state(self) end ---@param self druid.radio_group @{RadioGroup} ---@param nodes node[] Array of gui node ---@param callback function Radio callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes node[]|nil Array of trigger nodes, by default equals to nodes. Default - nodes function druid__radio_group.init(self, nodes, callback, click_nodes) end --- Set radio group state @@ -1004,9 +1004,9 @@ function druid__rich_text.tagged(tag) end ---@class druid.rich_text.style ----@field ADJUST_SCALE_DELTA number Scale step on each height adjust step ----@field ADJUST_STEPS number Amount steps of attemps text adjust by height ----@field COLORS table Rich Text color aliases +---@field ADJUST_SCALE_DELTA number|nil Scale step on each height adjust step. Default: 0.02 +---@field ADJUST_STEPS number|nil Amount steps of attemps text adjust by height. Default: 20 +---@field COLORS table|nil Rich Text color aliases. Default: {} local druid__rich_text__style = {} @@ -1084,7 +1084,7 @@ function druid__scroll.scroll_to_percent(self, percent, is_instant) end --- Strict drag scroll area. --- Useful for restrict events outside stencil node ---@param self druid.drag ----@param node node Gui node +---@param node node|string Gui node function druid__scroll.set_click_zone(self, node) end --- Set extra size for scroll stretching. @@ -1118,7 +1118,7 @@ function druid__scroll.set_points(self, points) end --- It will change content gui node size ---@param self druid.scroll @{Scroll} ---@param size vector3 The new size for content node ----@param offset vector3 Offset value to set, where content is starts +---@param offset vector3|nil Offset value to set, where content is starts ---@return druid.scroll Current scroll instance function druid__scroll.set_size(self, size, offset) end @@ -1130,18 +1130,18 @@ function druid__scroll.set_vertical_scroll(self, state) end ---@class druid.scroll.style ----@field ANIM_SPEED number Scroll gui.animation speed for scroll_to function ----@field BACK_SPEED number Scroll back returning lerp speed ----@field EXTRA_STRETCH_SIZE number extra size in pixels outside of scroll (stretch effect) ----@field FRICT number Multiplier for free inertion ----@field FRICT_HOLD number Multiplier for inertion, while touching ----@field INERT_SPEED number Multiplier for inertion speed ----@field INERT_THRESHOLD number Scroll speed to stop inertion ----@field POINTS_DEADZONE number Speed to check points of interests in no_inertion mode ----@field SMALL_CONTENT_SCROLL boolean If true, content node with size less than view node size can be scrolled ----@field WHEEL_SCROLL_BY_INERTION boolean If true, wheel will add inertion to scroll. Direct set position otherwise. ----@field WHEEL_SCROLL_INVERTED boolean If true, invert direction for touchpad and mouse wheel scroll ----@field WHEEL_SCROLL_SPEED boolean The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling +---@field ANIM_SPEED number|nil Scroll gui.animation speed for scroll_to function. Default: 2 +---@field BACK_SPEED number|nil Scroll back returning lerp speed. Default: 35 +---@field EXTRA_STRETCH_SIZE number|nil extra size in pixels outside of scroll (stretch effect). Default: 0 +---@field FRICT number|nil Multiplier for free inertion. Default: 0 +---@field FRICT_HOLD number|nil Multiplier for inertion, while touching. Default: 0 +---@field INERT_SPEED number|nil Multiplier for inertion speed. Default: 30 +---@field INERT_THRESHOLD number|nil Scroll speed to stop inertion. Default: 3 +---@field POINTS_DEADZONE number|nil Speed to check points of interests in no_inertion mode. Default: 20 +---@field SMALL_CONTENT_SCROLL boolean|nil If true, content node with size less than view node size can be scrolled. Default: false +---@field WHEEL_SCROLL_BY_INERTION boolean|nil If true, wheel will add inertion to scroll. Direct set position otherwise.. Default: false +---@field WHEEL_SCROLL_INVERTED boolean|nil If true, invert direction for touchpad and mouse wheel scroll. Default: false +---@field WHEEL_SCROLL_SPEED boolean|nil The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling. Default: 0 local druid__scroll__style = {} @@ -1173,7 +1173,7 @@ function druid__slider.set(self, value, is_silent) end --- Set input zone for slider. --- User can touch any place of node, pin instantly will move at this position and node drag will start. This function require the Defold version 1.3.0+ ---@param self druid.slider @{Slider} ----@param input_node node +---@param input_node node|string|nil ---@return druid.slider @{Slider} function druid__slider.set_input_node(self, input_node) end @@ -1258,7 +1258,7 @@ function druid__static_grid.get_size(self) end ---@param self druid.static_grid @{StaticGrid} ---@param parent string|node The GUI Node container, where grid's items will be placed ---@param element node Element prefab. Need to get it size ----@param in_row number How many nodes in row can be placed +---@param in_row number|nil How many nodes in row can be placed. By default 1 function druid__static_grid.init(self, parent, element, in_row) end --- Remove the item from the grid. @@ -1291,8 +1291,8 @@ function druid__static_grid.set_position_function(self, callback) end ---@class druid.static_grid.style ----@field IS_ALIGN_LAST_ROW boolean If true, always align last row of the grid as grid pivot sets ----@field IS_DYNAMIC_NODE_POSES boolean If true, always center grid content as grid pivot sets +---@field IS_ALIGN_LAST_ROW boolean|nil If true, always align last row of the grid as grid pivot sets. Default: false +---@field IS_DYNAMIC_NODE_POSES boolean|nil If true, always center grid content as grid pivot sets. Default: false local druid__static_grid__style = {} @@ -1312,14 +1312,14 @@ function druid__swipe.init(self, node, on_swipe_callback) end --- Strict swipe click area. --- Useful for restrict events outside stencil node ---@param self druid.swipe @{Swipe} ----@param zone node Gui node +---@param zone node|string|nil Gui node function druid__swipe.set_click_zone(self, zone) end ---@class druid.swipe.style ----@field SWIPE_THRESHOLD number Minimum distance for swipe trigger ----@field SWIPE_TIME number Maximum time for swipe trigger ----@field SWIPE_TRIGGER_ON_MOVE boolean If true, trigger on swipe moving, not only release action +---@field SWIPE_THRESHOLD number|nil Minimum distance for swipe trigger. Default: 50 +---@field SWIPE_TIME number|nil Maximum time for swipe trigger. Default: 0.4 +---@field SWIPE_TRIGGER_ON_MOVE boolean|nil If true, trigger on swipe moving, not only release action. Default: false local druid__swipe__style = {} @@ -1357,7 +1357,7 @@ function druid__text.get_text_size(self, text) end ---@param self druid.text @{Text} ---@param node string|node Node name or GUI Text Node itself ---@param value string|nil Initial text. Default value is node text from GUI scene. ----@param adjust_type string Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference +---@param adjust_type string|nil Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale function druid__text.init(self, node, value, adjust_type) end --- Return true, if text with line break @@ -1417,8 +1417,8 @@ function druid__text.set_to(self, set_to) end ---@class druid.text.style ----@field DEFAULT_ADJUST string The default adjust type for any text component ----@field TRIM_POSTFIX string The postfix for TRIM adjust type +---@field DEFAULT_ADJUST string|nil The default adjust type for any text component. Default: DOWNSCALE +---@field TRIM_POSTFIX string|nil The postfix for TRIM adjust type. Default: ... local druid__text__style = {} @@ -1489,7 +1489,7 @@ function druid_instance.new_blocker(self, node) end ---@param node string|node The node_id or gui.get_node(node_id) ---@param callback function|nil Button callback ---@param params table|nil Button callback params ----@param anim_node node|nil Button anim node (node, if not provided) +---@param anim_node node|string|nil Button anim node (node, if not provided) ---@return druid.button @{Button} component function druid_instance.new_button(self, node, callback, params, anim_node) end @@ -1504,9 +1504,9 @@ function druid_instance.new_checkbox(self, node, callback, click_node, initial_s --- Create @{CheckboxGroup} component ---@param self druid_instance ----@param nodes node[] Array of gui node +---@param nodes (node|string)[] Array of gui node ---@param callback function Checkbox callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes (node|string)[]|nil Array of trigger nodes, by default equals to nodes ---@return druid.checkbox_group @{CheckboxGroup} component function druid_instance.new_checkbox_group(self, nodes, callback, click_nodes) end @@ -1549,7 +1549,7 @@ function druid_instance.new_hover(self, node, on_hover_callback) end --- Create @{Input} component ---@param self druid_instance ---@param click_node string|node Button node to enabled input component ----@param text_node string|node Text node what will be changed on user input +---@param text_node string|node|druid.text Text node what will be changed on user input ---@param keyboard_type number|nil Gui keyboard type for input field ---@return druid.input @{Input} component function druid_instance.new_input(self, click_node, text_node, keyboard_type) end @@ -1566,8 +1566,9 @@ function druid_instance.new_lang_text(self, node, locale_id, adjust_type) end ---@param self druid_instance ---@param node string|node The_node id or gui.get_node(node_id). ---@param mode string The layout mode +---@param on_size_changed_callback function|nil The callback on window resize ---@return druid.layout @{Layout} component -function druid_instance.new_layout(self, node, mode) end +function druid_instance.new_layout(self, node, mode, on_size_changed_callback) end --- Create @{Progress} component ---@param self druid_instance @@ -1579,9 +1580,9 @@ function druid_instance.new_progress(self, node, key, init_value) end --- Create @{RadioGroup} component ---@param self druid_instance ----@param nodes node[] Array of gui node +---@param nodes (node|string)[] Array of gui node ---@param callback function Radio callback ----@param click_nodes node[] Array of trigger nodes, by default equals to nodes +---@param click_nodes (node|string)[]|nil Array of trigger nodes, by default equals to nodes ---@return druid.radio_group @{RadioGroup} component function druid_instance.new_radio_group(self, nodes, callback, click_nodes) end @@ -1665,14 +1666,14 @@ function druid_instance.remove(self, component) end --- Set blacklist components for input processing. --- If blacklist is not empty and component contains in this list, component will be not processed on input step ---@param self druid_instance @{DruidInstance} ----@param blacklist_components table|druid.base_component The array of component to blacklist +---@param blacklist_components table|druid.base_component|nil The array of component to blacklist ---@return self @{DruidInstance} function druid_instance.set_blacklist(self, blacklist_components) end --- Set whitelist components for input processing. --- If whitelist is not empty and component not contains in this list, component will be not processed on input step ---@param self druid_instance ----@param whitelist_components table|druid.base_component The array of component to whitelist +---@param whitelist_components table|druid.base_component|nil The array of component to whitelist ---@return self @{DruidInstance} function druid_instance.set_whitelist(self, whitelist_components) end diff --git a/druid/base/button.lua b/druid/base/button.lua index 5bd10c4..73c58a6 100755 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -123,7 +123,7 @@ -- In default case equals to clickable node. -- -- Usecase: You have the big clickable panel, but want to animate only one small icon on it. --- @tfield[opt=node] node anim_node +-- @tfield node|nil anim_node Default node ---Custom args for any Button event. Setup in Button constructor -- @tfield any params @@ -258,9 +258,9 @@ end -- You can override this component styles params in Druid styles table -- or create your own style -- @table style --- @tfield[opt=0.4] number LONGTAP_TIME Minimum time to trigger on_hold_callback --- @tfield[opt=0.8] number AUTOHOLD_TRIGGER Maximum hold time to trigger button release while holding --- @tfield[opt=0.4] number DOUBLETAP_TIME Time between double taps +-- @tfield number|nil LONGTAP_TIME Minimum time to trigger on_hold_callback. Default: 0.4 +-- @tfield number|nil AUTOHOLD_TRIGGER Maximum hold time to trigger button release while holding. Default: 0.8 +-- @tfield number|nil DOUBLETAP_TIME Time between double taps. Default: 0.4 -- @tfield function on_click function(self, node) -- @tfield function on_click_disabled function(self, node) -- @tfield function on_hover function(self, node, hover_state) @@ -478,7 +478,7 @@ end -- -- This functions calls automatically if you don't disable it in game.project: druid.no_stencil_check -- @tparam Button self @{Button} --- @tparam node|nil zone Gui node +-- @tparam node|string|nil zone Gui node -- @treturn Button Current button instance -- @usage -- button:set_click_zone("stencil_node") diff --git a/druid/base/drag.lua b/druid/base/drag.lua index c2a5072..3cae2b9 100644 --- a/druid/base/drag.lua +++ b/druid/base/drag.lua @@ -175,8 +175,8 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=10] number DRAG_DEADZONE Distance in pixels to start dragging --- @tfield[opt=false] boolean NO_USE_SCREEN_KOEF If screen aspect ratio affects on drag values +-- @tfield number|nil DRAG_DEADZONE Distance in pixels to start dragging. Default: 10 +-- @tfield boolean|nil NO_USE_SCREEN_KOEF If screen aspect ratio affects on drag values. Default: false function Drag.on_style_change(self, style) self.style = {} self.style.DRAG_DEADZONE = style.DRAG_DEADZONE or 10 @@ -324,7 +324,7 @@ end --- Strict drag click area. Useful for -- restrict events outside stencil node -- @tparam Drag self @{Drag} --- @tparam node node Gui node +-- @tparam node|string|nil node Gui node function Drag.set_click_zone(self, node) self.click_zone = self:get_node(node) end diff --git a/druid/base/hover.lua b/druid/base/hover.lua index f2a2517..607181f 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -128,7 +128,7 @@ end --- Strict hover click area. Useful for -- no click events outside stencil node -- @tparam Hover self @{Hover} --- @tparam node zone Gui node +-- @tparam node|string|nil zone Gui node function Hover.set_click_zone(self, zone) self.click_zone = self:get_node(zone) end diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 7328429..c75956c 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -123,18 +123,18 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=0] number FRICT Multiplier for free inertion --- @tfield[opt=0] number FRICT_HOLD Multiplier for inertion, while touching --- @tfield[opt=3] number INERT_THRESHOLD Scroll speed to stop inertion --- @tfield[opt=30] number INERT_SPEED Multiplier for inertion speed --- @tfield[opt=20] number POINTS_DEADZONE Speed to check points of interests in no_inertion mode --- @tfield[opt=0.35] number BACK_SPEED Scroll back returning lerp speed --- @tfield[opt=0.2] number ANIM_SPEED Scroll gui.animation speed for scroll_to function --- @tfield[opt=0] number EXTRA_STRETCH_SIZE extra size in pixels outside of scroll (stretch effect) --- @tfield[opt=false] boolean SMALL_CONTENT_SCROLL If true, content node with size less than view node size can be scrolled --- @tfield[opt=0] boolean WHEEL_SCROLL_SPEED The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling --- @tfield[opt=false] boolean WHEEL_SCROLL_INVERTED If true, invert direction for touchpad and mouse wheel scroll --- @tfield[opt=false] boolean WHEEL_SCROLL_BY_INERTION If true, wheel will add inertion to scroll. Direct set position otherwise. +-- @tfield number|nil FRICT Multiplier for free inertion. Default: 0 +-- @tfield number|nil FRICT_HOLD Multiplier for inertion, while touching. Default: 0 +-- @tfield number|nil INERT_THRESHOLD Scroll speed to stop inertion. Default: 3 +-- @tfield number|nil INERT_SPEED Multiplier for inertion speed. Default: 30 +-- @tfield number|nil POINTS_DEADZONE Speed to check points of interests in no_inertion mode. Default: 20 +-- @tfield number|nil BACK_SPEED Scroll back returning lerp speed. Default: 35 +-- @tfield number|nil ANIM_SPEED Scroll gui.animation speed for scroll_to function. Default: 2 +-- @tfield number|nil EXTRA_STRETCH_SIZE extra size in pixels outside of scroll (stretch effect). Default: 0 +-- @tfield boolean|nil SMALL_CONTENT_SCROLL If true, content node with size less than view node size can be scrolled. Default: false +-- @tfield boolean|nil WHEEL_SCROLL_SPEED The scroll speed via mouse wheel scroll or touchpad. Set to 0 to disable wheel scrolling. Default: 0 +-- @tfield boolean|nil WHEEL_SCROLL_INVERTED If true, invert direction for touchpad and mouse wheel scroll. Default: false +-- @tfield boolean|nil WHEEL_SCROLL_BY_INERTION If true, wheel will add inertion to scroll. Direct set position otherwise.. Default: false function Scroll.on_style_change(self, style) self.style = {} self.style.EXTRA_STRETCH_SIZE = style.EXTRA_STRETCH_SIZE or 0 @@ -325,7 +325,7 @@ end -- It will change content gui node size -- @tparam Scroll self @{Scroll} -- @tparam vector3 size The new size for content node --- @tparam vector3 offset Offset value to set, where content is starts +-- @tparam vector3|nil offset Offset value to set, where content is starts -- @treturn druid.scroll Current scroll instance function Scroll.set_size(self, size, offset) if offset then @@ -493,7 +493,7 @@ end --- Strict drag scroll area. Useful for -- restrict events outside stencil node -- @tparam Drag self --- @tparam node node Gui node +-- @tparam node|string node Gui node function Scroll.set_click_zone(self, node) self.drag:set_click_zone(node) end diff --git a/druid/base/static_grid.lua b/druid/base/static_grid.lua index ee2903e..bfa48ad 100644 --- a/druid/base/static_grid.lua +++ b/druid/base/static_grid.lua @@ -102,8 +102,8 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=false] boolean IS_DYNAMIC_NODE_POSES If true, always center grid content as grid pivot sets --- @tfield[opt=false] boolean IS_ALIGN_LAST_ROW If true, always align last row of the grid as grid pivot sets +-- @tfield boolean|nil IS_DYNAMIC_NODE_POSES If true, always center grid content as grid pivot sets. Default: false +-- @tfield boolean|nil IS_ALIGN_LAST_ROW If true, always align last row of the grid as grid pivot sets. Default: false function StaticGrid.on_style_change(self, style) self.style = {} self.style.IS_DYNAMIC_NODE_POSES = style.IS_DYNAMIC_NODE_POSES or false @@ -115,7 +115,7 @@ end -- @tparam StaticGrid self @{StaticGrid} -- @tparam string|node parent The GUI Node container, where grid's items will be placed -- @tparam node element Element prefab. Need to get it size --- @tparam[opt=1] number in_row How many nodes in row can be placed +-- @tparam number|nil in_row How many nodes in row can be placed. By default 1 function StaticGrid.init(self, parent, element, in_row) self.parent = self:get_node(parent) self.nodes = {} diff --git a/druid/base/text.lua b/druid/base/text.lua index a34ffe7..28d3ed9 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -216,8 +216,8 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=...] string TRIM_POSTFIX The postfix for TRIM adjust type --- @tfield[opt=DOWNSCALE] string DEFAULT_ADJUST The default adjust type for any text component +-- @tfield string|nil TRIM_POSTFIX The postfix for TRIM adjust type. Default: ... +-- @tfield string|nil DEFAULT_ADJUST The default adjust type for any text component. Default: DOWNSCALE function Text.on_style_change(self, style) self.style = {} self.style.TRIM_POSTFIX = style.TRIM_POSTFIX or "..." @@ -229,7 +229,7 @@ end -- @tparam Text self @{Text} -- @tparam string|node node Node name or GUI Text Node itself -- @tparam string|nil value Initial text. Default value is node text from GUI scene. --- @tparam[opt=downscale] string adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference +-- @tparam string|nil adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale function Text.init(self, node, value, adjust_type) self.node = self:get_node(node) self.pos = gui.get_position(self.node) diff --git a/druid/custom/pin_knob/pin_knob.lua b/druid/custom/pin_knob/pin_knob.lua index 418f6be..868d4a3 100644 --- a/druid/custom/pin_knob/pin_knob.lua +++ b/druid/custom/pin_knob/pin_knob.lua @@ -87,7 +87,7 @@ end --- Set current and min/max angles for component -- @tparam PinKnob self @{PinKnob} --- @tparam[opt=1] number value The spin speed multiplier +-- @tparam number|nil value The spin speed multiplier. Default: 1 -- @treturn PinKnob @{PinKnob} function PinKnob.set_friction(self, value) self._friction = value or 1 diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 6f0b0cd..8b542db 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -138,9 +138,9 @@ end -- You can override this component styles params in Druid styles table -- or create your own style -- @table style --- @tfield[opt={}] table COLORS Rich Text color aliases --- @tfield[opt=20] number ADJUST_STEPS Amount steps of attemps text adjust by height --- @tfield[opt=0.02] number ADJUST_SCALE_DELTA Scale step on each height adjust step +-- @tfield table|nil COLORS Rich Text color aliases. Default: {} +-- @tfield number|nil ADJUST_STEPS Amount steps of attemps text adjust by height. Default: 20 +-- @tfield number|nil ADJUST_SCALE_DELTA Scale step on each height adjust step. Default: 0.02 function RichText.on_style_change(self, style) self.style = {} self.style.COLORS = style.COLORS or {} diff --git a/druid/extended/checkbox.lua b/druid/extended/checkbox.lua index 2c629e8..dd13921 100755 --- a/druid/extended/checkbox.lua +++ b/druid/extended/checkbox.lua @@ -14,7 +14,7 @@ -- @tfield node node --- Button trigger node --- @tfield[opt=node] node click_node +-- @tfield node|nil click_node --- Button component from click_node -- @tfield Button button @{Button} @@ -50,8 +50,8 @@ end -- @tparam Checkbox self @{Checkbox} -- @tparam node node Gui node -- @tparam function callback Checkbox callback --- @tparam[opt=node] node click_node Trigger node, by default equals to node --- @tparam[opt=false] boolean initial_state The initial state of checkbox, default - false +-- @tparam node|nil click_node Trigger node, by default equals to node. Default: node +-- @tparam boolean|nil initial_state The initial state of checkbox, default - false function Checkbox.init(self, node, callback, click_node, initial_state) self.druid = self:get_druid() self.node = self:get_node(node) diff --git a/druid/extended/checkbox_group.lua b/druid/extended/checkbox_group.lua index 2dd66ba..d59adc3 100644 --- a/druid/extended/checkbox_group.lua +++ b/druid/extended/checkbox_group.lua @@ -25,7 +25,7 @@ local CheckboxGroup = component.create("checkbox_group") -- @tparam CheckboxGroup self @{CheckboxGroup} -- @tparam node[] nodes Array of gui node -- @tparam function callback Checkbox callback --- @tparam[opt=node] node[] click_nodes Array of trigger nodes, by default equals to nodes +-- @tparam node[]|nil click_nodes Array of trigger nodes, by default equals to nodes function CheckboxGroup.init(self, nodes, callback, click_nodes) self.druid = self:get_druid() self.checkboxes = {} diff --git a/druid/extended/dynamic_grid.lua b/druid/extended/dynamic_grid.lua index 8a91af8..c4f0c76 100644 --- a/druid/extended/dynamic_grid.lua +++ b/druid/extended/dynamic_grid.lua @@ -101,7 +101,7 @@ end -- @tparam number index The grid element index -- @tparam node node The node to be placed -- @tparam number|nil origin_index Index of nearby node --- @treturn vector3 Node position +-- @treturn vector3 node position function DynamicGrid.get_pos(self, index, node, origin_index) local origin_node = self.nodes[origin_index] diff --git a/druid/extended/hotkey.lua b/druid/extended/hotkey.lua index 1e867a8..0076538 100644 --- a/druid/extended/hotkey.lua +++ b/druid/extended/hotkey.lua @@ -14,7 +14,7 @@ -- @tfield node node --- Button trigger node --- @tfield[opt=node] node click_node +-- @tfield node|nil click_node --- Button component from click_node -- @tfield Button button @{Button} diff --git a/druid/extended/input.lua b/druid/extended/input.lua index bed0a92..4426da9 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -87,10 +87,10 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=false] boolean IS_LONGTAP_ERASE Is long tap will erase current input data --- @tfield[opt=*] string MASK_DEFAULT_CHAR Default character mask for password input --- @tfield[opt=false] boolean IS_UNSELECT_ON_RESELECT If true, call unselect on select selected input --- @tfield[opt=false] boolean NO_CONSUME_INPUT_WHILE_SELECTED If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured) +-- @tfield boolean IS_LONGTAP_ERASE Is long tap will erase current input data. Default: false +-- @tfield string MASK_DEFAULT_CHAR Default character mask for password input. Default: *] +-- @tfield boolean IS_UNSELECT_ON_RESELECT If true, call unselect on select selected input. Default: false +-- @tfield boolean NO_CONSUME_INPUT_WHILE_SELECTED If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false -- @tfield function on_select (self, button_node) Callback on input field selecting -- @tfield function on_unselect (self, button_node) Callback on input field unselecting -- @tfield function on_input_wrong (self, button_node) Callback on wrong user input diff --git a/druid/extended/lang_text.lua b/druid/extended/lang_text.lua index 6e2a699..6d38f83 100755 --- a/druid/extended/lang_text.lua +++ b/druid/extended/lang_text.lua @@ -38,8 +38,8 @@ local LangText = component.create("lang_text") --- The @{LangText} constructor -- @tparam LangText self @{LangText} -- @tparam string|node node The node_id or gui.get_node(node_id) --- @tparam[opt=node_text] string locale_id Default locale id or text from node as default --- @tparam[opt=downscale] string adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference +-- @tparam string|nil locale_id Default locale id or text from node as default +-- @tparam string|nil adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference function LangText.init(self, node, locale_id, adjust_type) self.druid = self:get_druid() self.text = self.druid:new_text(node, locale_id, adjust_type) diff --git a/druid/extended/progress.lua b/druid/extended/progress.lua index b5fb749..2689057 100644 --- a/druid/extended/progress.lua +++ b/druid/extended/progress.lua @@ -101,8 +101,8 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=5] number SPEED Progress bas fill rate. More -> faster --- @tfield[opt=0.005] number MIN_DELTA Minimum step to fill progress bar +-- @tfield number|nil SPEED Progress bas fill rate. More -> faster. Default: 5 +-- @tfield number|nil MIN_DELTA Minimum step to fill progress bar. Default: 0.005 function Progress.on_style_change(self, style) self.style = {} self.style.SPEED = style.SPEED or 5 @@ -114,7 +114,7 @@ end -- @tparam Progress self @{Progress} -- @tparam string|node node Node name or GUI Node itself. -- @tparam string key Progress bar direction: const.SIDE.X or const.SIDE.Y --- @tparam[opt=1] number init_value Initial value of progress bar +-- @tparam number|nil init_value Initial value of progress bar. Default: 1 function Progress.init(self, node, key, init_value) assert(key == const.SIDE.X or const.SIDE.Y, "Progress bar key should be 'x' or 'y'") diff --git a/druid/extended/radio_group.lua b/druid/extended/radio_group.lua index 8321c3f..51dbe6b 100644 --- a/druid/extended/radio_group.lua +++ b/druid/extended/radio_group.lua @@ -34,7 +34,7 @@ end -- @tparam RadioGroup self @{RadioGroup} -- @tparam node[] nodes Array of gui node -- @tparam function callback Radio callback --- @tparam[opt=node] node[] click_nodes Array of trigger nodes, by default equals to nodes +-- @tparam node[]|nil click_nodes Array of trigger nodes, by default equals to nodes. Default - nodes function RadioGroup.init(self, nodes, callback, click_nodes) self.druid = self:get_druid() self.checkboxes = {} diff --git a/druid/extended/slider.lua b/druid/extended/slider.lua index 05e9453..37c4ab7 100644 --- a/druid/extended/slider.lua +++ b/druid/extended/slider.lua @@ -202,7 +202,7 @@ end -- move at this position and node drag will start. -- This function require the Defold version 1.3.0+ -- @tparam Slider self @{Slider} --- @tparam node input_node +-- @tparam node|string|nil input_node -- @treturn Slider @{Slider} function Slider.set_input_node(self, input_node) self._input_node = self:get_node(input_node) diff --git a/druid/extended/swipe.lua b/druid/extended/swipe.lua index 264805b..110d9f4 100644 --- a/druid/extended/swipe.lua +++ b/druid/extended/swipe.lua @@ -74,9 +74,9 @@ end -- You can override this component styles params in druid styles table -- or create your own style -- @table style --- @tfield[opt=0.4] number SWIPE_TIME Maximum time for swipe trigger --- @tfield[opt=50] number SWIPE_THRESHOLD Minimum distance for swipe trigger --- @tfield[opt=false] boolean SWIPE_TRIGGER_ON_MOVE If true, trigger on swipe moving, not only release action +-- @tfield number|nil SWIPE_TIME Maximum time for swipe trigger. Default: 0.4 +-- @tfield number|nil SWIPE_THRESHOLD Minimum distance for swipe trigger. Default: 50 +-- @tfield boolean|nil SWIPE_TRIGGER_ON_MOVE If true, trigger on swipe moving, not only release action. Default: false function Swipe.on_style_change(self, style) self.style = {} self.style.SWIPE_TIME = style.SWIPE_TIME or 0.4 @@ -150,7 +150,7 @@ end --- Strict swipe click area. Useful for -- restrict events outside stencil node -- @tparam Swipe self @{Swipe} --- @tparam node zone Gui node +-- @tparam node|string|nil zone Gui node function Swipe.set_click_zone(self, zone) self.click_zone = self:get_node(zone) end diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index 02f875d..15ad41b 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -473,7 +473,7 @@ end -- If whitelist is not empty and component not contains in this list, -- component will be not processed on input step -- @tparam DruidInstance self --- @tparam[opt=nil] table|BaseComponent whitelist_components The array of component to whitelist +-- @tparam table|BaseComponent|nil whitelist_components The array of component to whitelist -- @treturn self @{DruidInstance} function DruidInstance.set_whitelist(self, whitelist_components) if whitelist_components and whitelist_components.isInstanceOf then @@ -495,7 +495,7 @@ end -- If blacklist is not empty and component contains in this list, -- component will be not processed on input step -- @tparam DruidInstance self @{DruidInstance} --- @tparam[opt=nil] table|BaseComponent blacklist_components The array of component to blacklist +-- @tparam table|BaseComponent|nil blacklist_components The array of component to blacklist -- @treturn self @{DruidInstance} function DruidInstance.set_blacklist(self, blacklist_components) if blacklist_components and blacklist_components.isInstanceOf then @@ -557,7 +557,7 @@ end -- @tparam string|node node The node_id or gui.get_node(node_id) -- @tparam function|nil callback Button callback -- @tparam table|nil params Button callback params --- @tparam node|nil anim_node Button anim node (node, if not provided) +-- @tparam node|string|nil anim_node Button anim node (node, if not provided) -- @treturn Button @{Button} component function DruidInstance.new_button(self, node, callback, params, anim_node) return DruidInstance.new(self, button, node, callback, params, anim_node) @@ -705,7 +705,7 @@ end --- Create @{Input} component -- @tparam DruidInstance self -- @tparam string|node click_node Button node to enabled input component --- @tparam string|node text_node Text node what will be changed on user input +-- @tparam string|node|druid.text text_node Text node what will be changed on user input -- @tparam number|nil keyboard_type Gui keyboard type for input field -- @treturn Input @{Input} component function DruidInstance.new_input(self, click_node, text_node, keyboard_type) @@ -715,9 +715,9 @@ end --- Create @{CheckboxGroup} component -- @tparam DruidInstance self --- @tparam node[] nodes Array of gui node +-- @tparam (node|string)[] nodes Array of gui node -- @tparam function callback Checkbox callback --- @tparam[opt=node] node[] click_nodes Array of trigger nodes, by default equals to nodes +-- @tparam (node|string)[]|nil click_nodes Array of trigger nodes, by default equals to nodes -- @treturn CheckboxGroup @{CheckboxGroup} component function DruidInstance.new_checkbox_group(self, nodes, callback, click_nodes) return helper.require_component_message("checkbox_group") @@ -737,9 +737,9 @@ end --- Create @{RadioGroup} component -- @tparam DruidInstance self --- @tparam node[] nodes Array of gui node +-- @tparam (node|string)[] nodes Array of gui node -- @tparam function callback Radio callback --- @tparam[opt=node] node[] click_nodes Array of trigger nodes, by default equals to nodes +-- @tparam (node|string)[]|nil click_nodes Array of trigger nodes, by default equals to nodes -- @treturn RadioGroup @{RadioGroup} component function DruidInstance.new_radio_group(self, nodes, callback, click_nodes) return helper.require_component_message("radio_group") @@ -773,8 +773,9 @@ end -- @tparam DruidInstance self -- @tparam string|node node The_node id or gui.get_node(node_id). -- @tparam string mode The layout mode +-- @tparam function|nil on_size_changed_callback The callback on window resize -- @treturn Layout @{Layout} component -function DruidInstance.new_layout(self, node, mode) +function DruidInstance.new_layout(self, node, mode, on_size_changed_callback) return helper.require_component_message("layout") end diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index d87b665..7b637bf 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -1,3 +1,5 @@ +---@diagnostic disable: duplicate-doc-field + -- Manual Annotations -- ---@class druid.rich_text.metrics From 45718325a183bb505649b0fe012228c5fe33fe8a Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 17:48:46 +0300 Subject: [PATCH 12/45] Update luacheck --- .vscode/settings.json | 19 ++++++++++++++++--- druid/annotations.lua | 2 ++ druid/component.lua | 2 +- druid/custom/pin_knob/pin_knob.lua | 2 +- utils/annotations_manual.lua | 2 -- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0f165ef..770671b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,10 +8,23 @@ "describe", "before", "after", - "it" + "it", + "utf8" ], + "Lua.workspace.checkThirdParty": false, + "Lua.diagnostics.neededFileStatus": { + "undefined-field": "Any", + "assign-type-mismatch": "Any", + "missing-return": "Any", + "missing-fields": "Any", + "return-type-mismatch": "Any", + "lowercase-global": "Any" + }, "Lua.workspace.ignoreDir": [ ".vscode", - "test/*" - ] + "test/tests/*.lua", + "utils/annotations_manual.lua" + ], + "Lua.diagnostics.libraryFiles": "Enable", + "Lua.runtime.version": "Lua 5.1" } \ No newline at end of file diff --git a/druid/annotations.lua b/druid/annotations.lua index 7360eda..464d609 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1824,6 +1824,8 @@ function helper.step(current, target, step) end function helper.table_to_string(t) end +---@diagnostic disable: duplicate-doc-field + -- Manual Annotations -- ---@class druid.rich_text.metrics diff --git a/druid/component.lua b/druid/component.lua index ca6f89e..4b27700 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -25,7 +25,7 @@ local helper = require("druid.helper") local BaseComponent = class("druid.component") local INTERESTS = {} -- Cache interests per component class in runtime -local IS_AUTO_TEMPLATE = not (sys.get_config("druid.no_auto_template") == "1") +local IS_AUTO_TEMPLATE = not (sys.get_config_int("druid.no_auto_template", 0) == "1") -- Component Interests BaseComponent.ON_INPUT = const.ON_INPUT diff --git a/druid/custom/pin_knob/pin_knob.lua b/druid/custom/pin_knob/pin_knob.lua index 868d4a3..5a37681 100644 --- a/druid/custom/pin_knob/pin_knob.lua +++ b/druid/custom/pin_knob/pin_knob.lua @@ -30,7 +30,7 @@ local SCHEME = { local function update_visual(self) local rotation = vmath.vector3(0, 0, self.angle) - gui.set_rotation(self.node, rotation) + gui.set_euler(self.node, rotation) end diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index 7b637bf..d87b665 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -1,5 +1,3 @@ ----@diagnostic disable: duplicate-doc-field - -- Manual Annotations -- ---@class druid.rich_text.metrics From 678f542bdb954b7338c2af6a90c7b1c6331b1d0a Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 17:55:36 +0300 Subject: [PATCH 13/45] Fix #273 Update appmanifest --- example/game.appmanifest | 71 +++++++++++++++++++++------------------- game.project | 2 +- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/example/game.appmanifest b/example/game.appmanifest index 251e444..9fd8707 100644 --- a/example/game.appmanifest +++ b/example/game.appmanifest @@ -1,71 +1,76 @@ platforms: armv7-ios: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] arm64-ios: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] x86_64-ios: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] armv7-android: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] excludeJars: [] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] arm64-android: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] excludeJars: [] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] + arm64-osx: + context: + excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx, liveupdate] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, record_null, liveupdate_null] x86_64-osx: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] x86_64-linux: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] x86-win32: context: - excludeLibs: [libphysics, libLinearMath, libBulletDynamics, libBulletCollision, libBox2D, librecord, vpx, libprofilerext, libliveupdate] - excludeSymbols: [ProfilerExt] - libs: [libphysics_null.lib, librecord_null.lib, libprofilerext_null.lib, libliveupdate_null.lib] + excludeLibs: [libliveupdate, libphysics, libLinearMath, libBulletDynamics, libBulletCollision, libBox2D, libscript_box2d, librecord, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [libphysics_null.lib, libliveupdate_null.lib, librecord_null.lib] linkFlags: [] x86_64-win32: context: - excludeLibs: [libphysics, libLinearMath, libBulletDynamics, libBulletCollision, libBox2D, librecord, vpx, libprofilerext, libliveupdate] - excludeSymbols: [ProfilerExt] - libs: [libphysics_null.lib, librecord_null.lib, libprofilerext_null.lib, libliveupdate_null.lib] + excludeLibs: [libliveupdate, libphysics, libLinearMath, libBulletDynamics, libBulletCollision, libBox2D, libscript_box2d, librecord, vpx] + excludeSymbols: [ScriptBox2DExt] + libs: [libphysics_null.lib, libliveupdate_null.lib, librecord_null.lib] linkFlags: [] js-web: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] excludeJsLibs: [] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] wasm-web: context: - excludeLibs: [physics, LinearMath, BulletDynamics, BulletCollision, Box2D, record, vpx, profilerext, liveupdate] + excludeLibs: [liveupdate, physics, LinearMath, BulletDynamics, BulletCollision, Box2D, script_box2d, record, vpx] excludeJsLibs: [] - excludeSymbols: [ProfilerExt] - libs: [physics_null, record_null, profilerext_null, liveupdate_null] + excludeSymbols: [ScriptBox2DExt] + libs: [physics_null, liveupdate_null, record_null] linkFlags: [] diff --git a/game.project b/game.project index ef1cc91..cdedace 100644 --- a/game.project +++ b/game.project @@ -15,7 +15,7 @@ high_dpi = 1 title = druid version = 0.11.0 publisher = Insality -developer = Insality +developer = Maksim Tuprikov dependencies#0 = https://github.com/insalitygames/deftest/archive/master.zip dependencies#1 = https://github.com/britzl/monarch/archive/refs/tags/3.3.0.zip From cece44f2d11133a15fcd248e460d5f0c530e0d60 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 27 Aug 2024 18:13:15 +0300 Subject: [PATCH 14/45] Fix #264 Use pip or pip3 instead only pip3 --- druid/editor_scripts/run_python_script_on_gui.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/druid/editor_scripts/run_python_script_on_gui.sh b/druid/editor_scripts/run_python_script_on_gui.sh index f76c34d..5b0e2b9 100644 --- a/druid/editor_scripts/run_python_script_on_gui.sh +++ b/druid/editor_scripts/run_python_script_on_gui.sh @@ -5,11 +5,20 @@ echo "Run bash for $1" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -is_defree_installed=$(pip3 list --disable-pip-version-check | grep -E "deftree") +# Check if pip3 is installed +if command -v pip3 &> /dev/null; then + PIP_CMD="pip3" + PYTHON_CMD="python3" +else + PIP_CMD="pip" + PYTHON_CMD="python" +fi + +is_defree_installed=$($PIP_CMD list --disable-pip-version-check | grep -E "deftree") if [ -z "$is_defree_installed" ]; then echo "The python deftree is not installed. Please install it via" - echo "pip3 install deftree" + echo "$ $PIP_CMD install deftree" exit 0 fi -python3 $1 $2 +$PYTHON_CMD $1 $2 From 7e16dacbc27bacc9ef26d70b8796803813a89607 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 29 Aug 2024 09:27:34 +0300 Subject: [PATCH 15/45] Update helper to use gui.get to reduce memory footprint --- druid/base/text.lua | 2 +- druid/helper.lua | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/druid/base/text.lua b/druid/base/text.lua index 28d3ed9..689b20c 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -307,7 +307,7 @@ end --- Set text to text field -- @tparam Text self @{Text} --- @tparam string set_to Text for node +-- @tparam string|number|boolean set_to Text for node -- @treturn Text Current text instance function Text.set_to(self, set_to) set_to = set_to or "" diff --git a/druid/helper.lua b/druid/helper.lua index 1838174..9ed9420 100644 --- a/druid/helper.lua +++ b/druid/helper.lua @@ -10,12 +10,15 @@ local const = require("druid.const") local M = {} +local POSITION_X = hash("position.x") +local SCALE_X = hash("scale.x") +local SIZE_X = hash("size.x") local function get_text_width(text_node) if text_node then local text_metrics = M.get_text_metrics_from_node(text_node) - local text_scale = gui.get_scale(text_node).x + local text_scale = gui.get(text_node, SCALE_X) return text_metrics.width * text_scale end @@ -25,8 +28,7 @@ end local function get_icon_width(icon_node) if icon_node then - local icon_scale_x = gui.get_scale(icon_node).x - return gui.get_size(icon_node).x * icon_scale_x -- icon width + return gui.get(icon_node, SIZE_X) * gui.get(icon_node, SCALE_X) -- icon width end return 0 @@ -97,13 +99,12 @@ function M.centrate_nodes(margin, ...) for i = 1, count do local node = select(i, ...) local node_width = node_widths[i] - local pos = gui.get_position(node) pos_x = pos_x + node_width/2 -- made offset for single item local pivot_offset = M.get_pivot_offset(gui.get_pivot(node)) - pos.x = pos_x - width/2 + pivot_offset.x * node_width -- centrate node - gui.set_position(node, pos) + local new_pos_x = pos_x - width/2 + pivot_offset.x * node_width -- centrate node + gui.set(node, POSITION_X, new_pos_x) pos_x = pos_x + node_widths[i]/2 + margin -- add second part of offset end From ba1ab07e0d2e539eb2482a43e1e00b6bfdd905b4 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 29 Aug 2024 09:28:54 +0300 Subject: [PATCH 16/45] Update new component template, replace component name with M as module name --- druid/editor_scripts/component.lua_template | 8 ++++---- druid/editor_scripts/create_druid_component.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/druid/editor_scripts/component.lua_template b/druid/editor_scripts/component.lua_template index d50db11..457284f 100644 --- a/druid/editor_scripts/component.lua_template +++ b/druid/editor_scripts/component.lua_template @@ -9,7 +9,7 @@ local component = require("druid.component") ---@class {COMPONENT_TYPE}: druid.base_component{COMPONENT_ANNOTATIONS} ---@field druid druid_instance -local {COMPONENT_NAME} = component.create("{COMPONENT_TYPE}") +local M = component.create("{COMPONENT_TYPE}") local SCHEME = { {SCHEME_LIST} @@ -18,15 +18,15 @@ local SCHEME = { ---@param template string ---@param nodes table -function {COMPONENT_NAME}:init(template, nodes) +function M:init(template, nodes) self:set_template(template) self:set_nodes(nodes) self.druid = self:get_druid(){COMPONENT_DEFINE} end -function {COMPONENT_NAME}:on_remove() +function M:on_remove() end {COMPONENT_FUNCTIONS} -return {COMPONENT_NAME} +return M diff --git a/druid/editor_scripts/create_druid_component.py b/druid/editor_scripts/create_druid_component.py index 054bfa3..b88c1a1 100644 --- a/druid/editor_scripts/create_druid_component.py +++ b/druid/editor_scripts/create_druid_component.py @@ -32,7 +32,7 @@ def process_component(node_name, component_name): if node_name.startswith("button"): component_annotations += "\n---@field {0} druid.button".format(node_name) - component_functions += "\nfunction {1}:_on_{0}()\n\tprint(\"Click on {0}\")\nend\n\n".format(node_name, component_name) + component_functions += "\nfunction M:_on_{0}()\n\tprint(\"Click on {0}\")\nend\n\n".format(node_name) component_define += "\n\tself.{0} = self.druid:new_button(SCHEME.{1}, self._on_{0})".format(node_name, get_id(node_name)) if node_name.startswith("text"): @@ -66,7 +66,7 @@ def process_component(node_name, component_name): component_annotations += "\n---@field {0} druid.slider".format(node_name) component_define += "\n--TODO: Replace slider end position. It should be only vertical or horizontal" component_define += "\n\tself.{0} = self.druid:new_slider(SCHEME.{1}, vmath.vector3(100, 0, 0), self._on_{0}_change)".format(node_name, get_id(node_name)) - component_functions += "\nfunction {1}:_on_{0}_change(value)\n\tprint(\"Slider change:\", value)\nend\n\n".format(node_name, component_name) + component_functions += "\nfunction M:_on_{0}_change(value)\n\tprint(\"Slider change:\", value)\nend\n\n".format(node_name) if node_name.startswith("progress"): component_annotations += "\n---@field {0} druid.progress".format(node_name) @@ -75,7 +75,7 @@ def process_component(node_name, component_name): if node_name.startswith("timer"): component_annotations += "\n---@field {0} druid.timer".format(node_name) component_define += "\n\tself.{0} = self.druid:new_timer(SCHEME.{1}, 59, 0, self._on_{0}_end)".format(node_name, get_id(node_name)) - component_functions += "\nfunction {1}:_on_{0}_end()\n\tprint(\"Timer {0} trigger\")\nend\n\n".format(node_name, component_name) + component_functions += "\nfunction M:_on_{0}_end()\n\tprint(\"Timer {0} trigger\")\nend\n\n".format(node_name) def main(): From 0aeb0b3feae8cc0c17c6d88edb85034b534b4184 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 29 Aug 2024 09:51:09 +0300 Subject: [PATCH 17/45] Update event to remove middleclass, using defold-event as a base --- druid/event.lua | 163 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 121 insertions(+), 42 deletions(-) diff --git a/druid/event.lua b/druid/event.lua index 208620c..3ad2b9a 100644 --- a/druid/event.lua +++ b/druid/event.lua @@ -8,10 +8,16 @@ -- @module DruidEvent -- @alias druid.event -local class = require("druid.system.middleclass") +local M = {} +M.COUNTER = 0 -local DruidEvent = class("druid.event") +-- Forward declaration +local EVENT_METATABLE +-- Local versions +local pcall = pcall +local tinsert = table.insert +local tremove = table.remove --- DruidEvent constructor -- @tparam DruidEvent self @{DruidEvent} @@ -20,19 +26,44 @@ local DruidEvent = class("druid.event") -- local Event = require("druid.event") -- ... -- local event = Event(initial_callback) -function DruidEvent.initialize(self, initial_callback) - self._callbacks = nil -- initialize later +function M.create(callback, callback_context) + local instance = setmetatable({}, EVENT_METATABLE) - if initial_callback then - self:subscribe(initial_callback) + if callback then + instance:subscribe(callback, callback_context) end + + M.COUNTER = M.COUNTER + 1 + return instance +end + + +--- Check is event subscribed. +-- @tparam DruidEvent self @{DruidEvent} +-- @tparam function callback Callback itself +-- @tparam any|nil callback_context Additional context as first param to callback call +-- @treturn boolean, number|nil @Is event subscribed, return index of callback in event as second param +function M.is_subscribed(self, callback, callback_context) + if #self == 0 then + return false, nil + end + + for index = 1, #self do + local cb = self[index] + if cb[1] == callback and cb[2] == callback_context then + return true, index + end + end + + return false, nil end --- Subscribe callback on event -- @tparam DruidEvent self @{DruidEvent} -- @tparam function callback Callback itself --- @tparam any|nil context Additional context as first param to callback call, usually it's self +-- @tparam any|nil callback_context Additional context as first param to callback call, usually it's self +-- @treturn boolean True if callback was subscribed -- @usage -- local function on_long_callback(self) -- print("Long click!") @@ -40,41 +71,39 @@ end -- ... -- local button = self.druid:new_button("button", callback) -- button.on_long_click:subscribe(on_long_callback, self) -function DruidEvent.subscribe(self, callback, context) +function M.subscribe(self, callback, callback_context) assert(type(self) == "table", "You should subscribe to event with : syntax") - assert(type(callback) == "function", "Callback should be function") + assert(callback, "A function must be passed to subscribe to an event") - self._callbacks = self._callbacks or {} - table.insert(self._callbacks, { - callback = callback, - context = context - }) + if self:is_subscribed(callback, callback_context) then + return false + end - return callback + tinsert(self, { callback, callback_context }) + return true end --- Unsubscribe callback on event -- @tparam DruidEvent self @{DruidEvent} -- @tparam function callback Callback itself --- @tparam any|nil context Additional context as first param to callback call +-- @tparam any|nil callback_context Additional context as first param to callback call -- @usage -- local function on_long_callback(self) -- print("Long click!") -- end -- ... -- button.on_long_click:unsubscribe(on_long_callback, self) -function DruidEvent.unsubscribe(self, callback, context) - if not self._callbacks then - return +function M.unsubscribe(self, callback, callback_context) + assert(callback, "A function must be passed to subscribe to an event") + + local _, event_index = self:is_subscribed(callback, callback_context) + if not event_index then + return false end - for index, callback_info in ipairs(self._callbacks) do - if callback_info.callback == callback and callback_info.context == context then - table.remove(self._callbacks, index) - return - end - end + tremove(self, event_index --[[@as number]]) + return true end @@ -83,11 +112,18 @@ end -- @treturn boolean True if event have handlers -- @usage -- local is_long_click_handler_exists = button.on_long_click:is_exist() -function DruidEvent.is_exist(self) - if not self._callbacks then - return false - end - return #self._callbacks > 0 +function M.is_exist(self) + return #self > 0 +end + + +--- Return true, if event not have handler +--- @tparam DruidEvent self @{DruidEvent} +--- @treturn boolean True if event not have handlers +--- @usage +--- local is_long_click_handler_not_exists = button.on_long_click:is_empty() +function M:is_empty() + return #self == 0 end @@ -95,8 +131,10 @@ end -- @tparam DruidEvent self @{DruidEvent} -- @usage -- button.on_long_click:clear() -function DruidEvent.clear(self) - self._callbacks = nil +function M.clear(self) + for index = #self, 1, -1 do + self[index] = nil + end end @@ -108,19 +146,60 @@ end -- ... -- local event = Event() -- event:trigger("Param1", "Param2") -function DruidEvent.trigger(self, ...) - if not self._callbacks then - return false +function M.trigger(self, ...) + if #self == 0 then + return end - for _, callback_info in ipairs(self._callbacks) do - if callback_info.context then - callback_info.callback(callback_info.context, ...) - else - callback_info.callback(...) - end + local result = nil + + local call_callback = self.call_callback + for index = 1, #self do + result = call_callback(self, self[index], ...) end + + return result end -return DruidEvent +-- @tparam table callback Callback data {function, context} +-- @tparam any ... All event params +-- @treturn any Result of the callback +-- @local +function M:call_callback(callback, ...) + local event_callback = callback[1] + local event_callback_context = callback[2] + + -- Call callback + local ok, result_or_error + if event_callback_context then + ok, result_or_error = pcall(event_callback, event_callback_context, ...) + else + ok, result_or_error = pcall(event_callback, ...) + end + + -- Handle errors + if not ok then + local caller_info = debug.getinfo(2) + pprint("An error occurred during event processing", { + trigger = caller_info.short_src .. ":" .. caller_info.currentline, + error = result_or_error, + }) + pprint("Traceback", debug.traceback()) + return nil + end + + return result_or_error +end + +-- Construct event metatable +EVENT_METATABLE = { + __index = M, + __call = M.trigger, +} + +return setmetatable(M, { + __call = function(_, callback) + return M.create(callback) + end, +}) From 4a095a2a24ea0fd29507a64302f06dadb474b0d8 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 3 Sep 2024 21:48:43 +0300 Subject: [PATCH 18/45] Update README Button key trigger will not consume input Update scroll position while animate Add scroll:set_view_size Better static grid get_index function Rework Data List (only static grid) Update Default style Remove a component from parent if exists on druid:remove --- .github/workflows/ci-workflow.yml | 2 +- .gitignore | 4 + README.md | 24 ++-- docs_md/game_examples.md | 8 -- druid/annotations.lua | 4 +- druid/base/button.lua | 14 +- druid/base/hover.lua | 3 + druid/base/scroll.lua | 55 ++++++-- druid/base/static_grid.lua | 9 +- druid/component.lua | 11 +- druid/custom/rich_input/rich_input.lua | 3 +- druid/custom/rich_text/rich_text.lua | 3 +- druid/event.lua | 2 +- druid/extended/data_list.lua | 179 +++++-------------------- druid/styles/default/style.lua | 30 ++--- druid/system/druid_instance.lua | 23 ++-- settings_deployer | 20 +-- unit_test.txt => test/tests/test.ini | 0 18 files changed, 161 insertions(+), 233 deletions(-) delete mode 100644 docs_md/game_examples.md rename unit_test.txt => test/tests/test.ini (100%) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 65cd61a..0a039c3 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -17,7 +17,7 @@ jobs: - name: Build && Run run: | deployer_url="https://raw.githubusercontent.com/Insality/defold-deployer/1/deployer.sh" - curl -s ${deployer_url} | bash -s lbd --headless --settings ./unit_test.txt + curl -s ${deployer_url} | bash -s lbd --headless --settings ./test/test.ini - name: Upload test report run: bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8e0296c..690997a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,8 @@ Thumbs.db builtins dist deployer_version_settings.txt + .deployer_cache +bob*.jar +manifest.private.der +manifest.public.der \ No newline at end of file diff --git a/README.md b/README.md index 329ab66..84f0cb5 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ [![](media/druid_logo.png)](https://insality.github.io/druid/) -[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality) +[![GitHub release (latest by date)](https://img.shields.io/github/v/tag/insality/druid?style=for-the-badge&label=Release)](https://github.com/Insality/druid/tags) +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/insality/druid/ci-workflow.yml?branch=master&style=for-the-badge)](https://github.com/Insality/druid/actions) +[![codecov](https://img.shields.io/codecov/c/github/Insality/druid?style=for-the-badge)](https://codecov.io/gh/Insality/druid) -[![GitHub release (latest by date)](https://img.shields.io/github/v/release/insality/druid)](https://github.com/Insality/druid/releases) -[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/insality/druid/ci-workflow.yml?branch=master)](https://github.com/Insality/druid/actions) -[![codecov](https://codecov.io/gh/Insality/druid/branch/master/graph/badge.svg)](https://codecov.io/gh/Insality/druid) +[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality) **Druid** - powerful **Defold** component UI framework that empowers developers to create stunning and customizable GUIs by leveraging a wide range of embedded components or effortlessly designing their own game-specific components. @@ -23,11 +23,19 @@ To integrate the **Druid** extension into your own project, add this project as Here is a list of [all releases](https://github.com/Insality/druid/releases). -Size: **67.16 KB** -> The size metrics exlcude the extended components, which are including only on demand. +### Library Size + +> **Note:** The library size is calculated based on the build report per platform. The extended components are exlcuded, which are including only on demand. + +| Platform | Library Size | +| ---------------- | ------------- | +| HTML5 | **38.96 KB** | +| Desktop / Mobile | **65.97 KB** | + ### Input Bindings + **Druid** utilizes the `/builtins/input/all.input_binding` input bindings. For custom input bindings, refer to the Input Binding section in the **_[Advanced Setup](docs_md/advanced-setup.md#input-bindings)_**. @@ -173,8 +181,6 @@ Each example page provides a direct link to the corresponding example code, maki Or refer directly to the [**example folder**](https://github.com/Insality/druid/tree/develop/example) for code examples demonstrating how to use **Druid**. -If you want to see examples of GUIs created with Druid, please refer to the [game_examples.md](docs_md/game_examples.md) file. - ## Documentation To better understand **Druid**, read the following documentation: @@ -214,4 +220,4 @@ For a complete history of the development of **Druid**, please check the [change Your donation helps me stay engaged in creating valuable projects for **Defold**. If you appreciate what I'm doing, please consider supporting me! -[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality) +[![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality) \ No newline at end of file diff --git a/docs_md/game_examples.md b/docs_md/game_examples.md deleted file mode 100644 index 9735b3d..0000000 --- a/docs_md/game_examples.md +++ /dev/null @@ -1,8 +0,0 @@ -# Game Examples - -## Family Island - -## Sea Battle: Universe - -## Monkey Mart - diff --git a/druid/annotations.lua b/druid/annotations.lua index 464d609..44f95d8 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -588,6 +588,7 @@ local druid__hotkey__style = {} ---@class druid.hover : druid.base_component +---@field node node Hover node ---@field on_hover druid.event On hover callback(self, state, hover_instance) ---@field on_mouse_hover druid.event On mouse hover callback(self, state, hover_instance) local druid__hover = {} @@ -998,9 +999,10 @@ function druid__rich_text.init(self, template, nodes) end function druid__rich_text.set_text(self, text) end --- Get all words, which has a passed tag. +---@param self druid.rich_text @{RichText} ---@param tag string ---@return druid.rich_text.word[] words -function druid__rich_text.tagged(tag) end +function druid__rich_text.tagged(self, tag) end ---@class druid.rich_text.style diff --git a/druid/base/button.lua b/druid/base/button.lua index 73c58a6..f406801 100755 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -343,6 +343,7 @@ function Button.on_input(self, action_id, action) return false end + local is_consume = true local is_pick = true local is_key_trigger = (action_id == self.key_trigger) if not is_key_trigger then @@ -365,6 +366,7 @@ function Button.on_input(self, action_id, action) if is_key_trigger then self.hover:set_hover(not action.released) + is_consume = false end if action.pressed then @@ -380,19 +382,19 @@ function Button.on_input(self, action_id, action) on_button_click(self) end) end - return true + return is_consume end -- While hold button, repeat rate pick from input.repeat_interval if action.repeated then if self.on_repeated_click:is_exist() and self.can_action then on_button_repeated_click(self) - return true + return is_consume end end if action.released then - return on_button_release(self) + return on_button_release(self) and is_consume end if self.can_action and self.on_long_click:is_exist() then @@ -400,16 +402,16 @@ function Button.on_input(self, action_id, action) if self.style.AUTOHOLD_TRIGGER <= press_time then on_button_release(self) - return true + return is_consume end if press_time >= self.style.LONGTAP_TIME then on_button_hold(self, press_time) - return true + return is_consume end end - return not self.disabled + return not self.disabled and is_consume end diff --git a/druid/base/hover.lua b/druid/base/hover.lua index 607181f..bbb7a0c 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -5,6 +5,9 @@ -- @within BaseComponent -- @alias druid.hover +--- Hover node +-- @tfield node node + --- On hover callback(self, state, hover_instance) -- @tfield DruidEvent on_hover @{DruidEvent} diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index c75956c..4d22d9b 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -216,6 +216,12 @@ end function Scroll.update(self, dt) + if self.is_animate then + self.position.x = gui.get(self.content_node, "position.x") + self.position.y = gui.get(self.content_node, "position.y") + self.on_scroll:trigger(self:get_context(), self.position) + end + if self.drag.is_drag then self:_update_hand_scroll(dt) else @@ -255,12 +261,12 @@ function Scroll.scroll_to(self, point, is_instant) if is_instant then self.target_position = target - self:_set_scroll_position(target) + self:_set_scroll_position(target.x, target.y) else gui.animate(self.content_node, gui.PROP_POSITION, target, gui.EASING_OUTSINE, self.style.ANIM_SPEED, 0, function() self.is_animate = false self.target_position = target - self:_set_scroll_position(target) + self:_set_scroll_position(target.x, target.y) end) end @@ -305,6 +311,13 @@ function Scroll.scroll_to_percent(self, percent, is_instant) 0 ) + if not self.drag.can_x then + pos.x = self.position.x + end + if not self.drag.can_y then + pos.y = self.position.y + end + self:scroll_to(pos, is_instant) end @@ -338,6 +351,20 @@ function Scroll.set_size(self, size, offset) end +--- Set scroll view size. +-- @tparam Scroll self @{Scroll} +-- @tparam vector3 size The new size for view node +-- @treturn druid.scroll Current scroll instance +function Scroll.set_view_size(self, size) + gui.set_size(self.view_node, size) + self.view_size = size + self.view_border = helper.get_border(self.view_node) + self:_update_size() + + return self +end + + --- Enable or disable scroll inert. -- If disabled, scroll through points (if exist) -- If no points, just simple drag without inertion @@ -583,14 +610,14 @@ function Scroll._cancel_animate(self) end -function Scroll._set_scroll_position(self, position) +function Scroll._set_scroll_position(self, position_x, position_y) local available_extra = self.available_pos_extra - position.x = helper.clamp(position.x, available_extra.x, available_extra.z) - position.y = helper.clamp(position.y, available_extra.w, available_extra.y) + position_x = helper.clamp(position_x, available_extra.x, available_extra.z) + position_y = helper.clamp(position_y, available_extra.w, available_extra.y) - if self.position.x ~= position.x or self.position.y ~= position.y then - self.position.x = position.x - self.position.y = position.y + if self.position.x ~= position_x or self.position.y ~= position_y then + self.position.x = position_x + self.position.y = position_y gui.set_position(self.content_node, self.position) self.on_scroll:trigger(self:get_context(), self.position) @@ -692,7 +719,7 @@ function Scroll._update_free_scroll(self, dt) self:_check_soft_zone() if self.position.x ~= target.x or self.position.y ~= target.y then - self:_set_scroll_position(target) + self:_set_scroll_position(target.x, target.y) end end @@ -704,7 +731,7 @@ function Scroll._update_hand_scroll(self, dt) self.inertion.x = (self.inertion.x + dx) * self.style.FRICT_HOLD self.inertion.y = (self.inertion.y + dy) * self.style.FRICT_HOLD - self:_set_scroll_position(self.target_position) + self:_set_scroll_position(self.target_position.x, self.target_position.y) end @@ -746,14 +773,14 @@ function Scroll._update_size(self) content_border_extra.w = content_border_extra.w - stretch_size * sign_y if not self.style.SMALL_CONTENT_SCROLL then - self.drag.can_x = content_size.x > self.view_size.x - self.drag.can_y = content_size.y > self.view_size.y + self.drag.can_x = content_size.x > self.view_size.x and self._is_horizontal_scroll + self.drag.can_y = content_size.y > self.view_size.y and self._is_vertical_scroll end self.available_pos_extra = get_border_vector(self.view_border - content_border_extra, self._offset) self.available_size_extra = get_size_vector(self.available_pos_extra) - self:_set_scroll_position(self.position) + self:_set_scroll_position(self.position.x, self.position.y) self.target_position.x = self.position.x self.target_position.y = self.position.y end @@ -788,7 +815,7 @@ function Scroll._process_scroll_wheel(self, action_id, action) self.inertion.x = 0 end - self:_set_scroll_position(self.target_position) + self:_set_scroll_position(self.target_position.x, self.target_position.y) end return true diff --git a/druid/base/static_grid.lua b/druid/base/static_grid.lua index bfa48ad..02b3f2a 100644 --- a/druid/base/static_grid.lua +++ b/druid/base/static_grid.lua @@ -171,8 +171,12 @@ end -- @tparam vector3 pos The node position in the grid -- @treturn number The node index function StaticGrid.get_index(self, pos) - local col = pos.x / self.node_size.x + 1 - local row = -pos.y / self.node_size.y + -- Offset to left-top corner from node pivot + local node_offset_x = self.node_size.x * (-0.5 + self.node_pivot.x) + local node_offset_y = self.node_size.y * (0.5 - self.node_pivot.y) + + local col = (pos.x + node_offset_x) / self.node_size.x + 1 + local row = -(pos.y + node_offset_y) / self.node_size.y col = helper.round(col) row = helper.round(row) @@ -337,6 +341,7 @@ function StaticGrid.clear(self) self:_update() self.on_clear:trigger(self:get_context()) + self.on_change_items:trigger(self:get_context()) return self end diff --git a/druid/component.lua b/druid/component.lua index 4b27700..e5c438a 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -336,7 +336,7 @@ function BaseComponent.setup_component(self, druid_instance, context, style, ins self:set_template("") if self._meta.parent then - self._meta.parent:__add_children(self) + self._meta.parent:__add_child(self) end return self @@ -445,8 +445,8 @@ end -- @tparam BaseComponent self @{BaseComponent} -- @tparam component children The druid component instance -- @local -function BaseComponent.__add_children(self, children) - table.insert(self._meta.children, children) +function BaseComponent.__add_child(self, child) + table.insert(self._meta.children, child) end @@ -454,10 +454,11 @@ end -- @tparam BaseComponent self @{BaseComponent} -- @tparam component children The druid component instance -- @local -function BaseComponent.__remove_children(self, children) +function BaseComponent.__remove_child(self, child) for i = #self._meta.children, 1, -1 do - if self._meta.children[i] == children then + if self._meta.children[i] == child then table.remove(self._meta.children, i) + return true end end end diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index 68d3560..a1310d0 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -24,6 +24,7 @@ --- local component = require("druid.component") +local input = require("druid.extended.input") local RichInput = component.create("druid.rich_input") @@ -74,7 +75,7 @@ function RichInput.init(self, template, nodes) self.druid = self:get_druid() self.root = self:get_node(SCHEME.ROOT) - self.input = self.druid:new_input(self:get_node(SCHEME.BUTTON), self:get_node(SCHEME.INPUT)) + self.input = self.druid:new(input, self:get_node(SCHEME.BUTTON), self:get_node(SCHEME.INPUT)) self.cursor = self:get_node(SCHEME.CURSOR) self.input:set_text("") diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 8b542db..dd2d802 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -227,9 +227,10 @@ end --- Get all words, which has a passed tag. +-- @tparam RichText self @{RichText} -- @tparam string tag -- @treturn druid.rich_text.word[] words -function RichText:tagged(tag) +function RichText.tagged(self, tag) if not self._words then return end diff --git a/druid/event.lua b/druid/event.lua index 3ad2b9a..429f711 100644 --- a/druid/event.lua +++ b/druid/event.lua @@ -102,7 +102,7 @@ function M.unsubscribe(self, callback, callback_context) return false end - tremove(self, event_index --[[@as number]]) + tremove(self, event_index) return true end diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index f3e5be1..88abf81 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -15,12 +15,6 @@ --- The Druid Grid component -- @tfield StaticGrid|DynamicGrid grid @{StaticGrid}, @{DynamicGrid} ---- The current visual top data index --- @tfield number top_index - ---- The current visual last data index --- @tfield number last_index - --- The current progress of scroll posititon -- @tfield number scroll_progress @@ -49,13 +43,11 @@ local DataList = component.create("data_list") -- @tparam StaticGrid|DynamicGrid grid The @{StaticGrid} or @{DynamicGrid} instance for Data List component -- @tparam function create_function The create function callback(self, data, index, data_list). Function should return (node, [component]) function DataList.init(self, scroll, grid, create_function) - self.druid = self:get_druid() self.scroll = scroll self.grid = grid if self.grid.style then self.grid.style.IS_DYNAMIC_NODE_POSES = false end - self.scroll:bind_grid(grid) -- Current visual elements indexes self.top_index = 1 @@ -64,25 +56,21 @@ function DataList.init(self, scroll, grid, create_function) self._create_function = create_function self._data = {} - self._data_first_index = false - self._data_last_index = false - self._data_length = 0 self._data_visual = {} - self.scroll.on_scroll:subscribe(self._check_elements, self) + self.scroll.on_scroll:subscribe(self._refresh, self) self.on_scroll_progress_change = Event() self.on_element_add = Event() self.on_element_remove = Event() - - self:set_data() end --- Druid System on_remove function -- @tparam DataList self @{DataList} function DataList.on_remove(self) - self.scroll.on_scroll:unsubscribe(self._check_elements, self) + self:clear() + self.scroll.on_scroll:unsubscribe(self._refresh, self) end @@ -92,7 +80,7 @@ end -- @treturn druid.data_list Current DataList instance function DataList.set_data(self, data) self._data = data or {} - self:_update_data_info() + self.scroll:set_size(self.grid:get_size_for(#self._data)) self:_refresh() return self @@ -118,8 +106,7 @@ function DataList.add(self, data, index, shift_policy) shift_policy = shift_policy or const.SHIFT.RIGHT helper.insert_with_shift(self._data, data, index, shift_policy) - self:_update_data_info() - self:_check_elements() + self:_refresh() end @@ -129,10 +116,8 @@ end -- @tparam number shift_policy The constant from const.SHIFT.* -- @local function DataList.remove(self, index, shift_policy) - --self:_refresh() - helper.remove_with_shift(self._data, index, shift_policy) - self:_update_data_info() + self:_refresh() end @@ -145,7 +130,6 @@ function DataList.remove_by_data(self, data, shift_policy) local index = helper.contains(self._data, data) if index then helper.remove_with_shift(self._data, index, shift_policy) - self:_update_data_info() self:_refresh() end end @@ -155,32 +139,10 @@ end -- @tparam DataList self @{DataList} function DataList.clear(self) self._data = {} - self:_update_data_info() self:_refresh() end ---- Return first index from data. It not always equals to 1 --- @tparam DataList self @{DataList} -function DataList.get_first_index(self) - return self._data_first_index -end - - ---- Return last index from data --- @tparam DataList self @{DataList} -function DataList.get_last_index(self) - return self._data_last_index -end - - ---- Return amount of data --- @tparam DataList self @{DataList} -function DataList.get_length(self) - return self._data_length -end - - --- Return index for data value -- @tparam DataList self @{DataList} -- @tparam table data @@ -227,13 +189,8 @@ end -- @tparam DataList self @{DataList} -- @tparam number index function DataList.scroll_to_index(self, index) - local target = helper.clamp(index, self:get_first_index(), self:get_last_index()) - self.top_index = target - self:_refresh() - - if self._data_visual[target] then - self.scroll:scroll_to(gui.get_position(self._data_visual[target].node), true) - end + local pos = self.grid:get_pos(index) + self.scroll:scroll_to(pos) end @@ -247,11 +204,11 @@ function DataList._add_at(self, index) end local node, instance = self._create_function(self:get_context(), self._data[index], index, self) - self.grid:add(node, index, const.SHIFT.NO_SHIFT) self._data_visual[index] = { node = node, - component = instance + component = instance, } + self.grid:add(node, index, const.SHIFT.NO_SHIFT) self.on_element_add:trigger(self:get_context(), index, node, instance) end @@ -264,12 +221,14 @@ end function DataList._remove_at(self, index) self.grid:remove(index, const.SHIFT.NO_SHIFT) - local node = self._data_visual[index].node - gui.delete_node(node) + local visual_data = self._data_visual[index] + local node = visual_data.node + local instance = visual_data.component - local instance = self._data_visual[index].component + gui.delete_node(node) if instance then - self.druid:remove(instance) + --- We should remove instance from druid that spawned component + instance._meta.druid:remove(instance) end self._data_visual[index] = nil @@ -281,102 +240,32 @@ end -- @tparam DataList self @{DataList} -- @local function DataList._refresh(self) - for index, _ in pairs(self._data_visual) do - self:_remove_at(index) - end - self:_check_elements() -end + local start_pos = -self.scroll.position + local start_index = self.grid:get_index(start_pos) + start_index = math.max(1, start_index) + local pivot = helper.get_pivot_offset(gui.get_pivot(self.scroll.view_node)) + local offset_x = self.scroll.view_size.x * (0.5 - pivot.x) + local offset_y = self.scroll.view_size.y * (0.5 + pivot.y) + local end_pos = vmath.vector3(start_pos.x + offset_x, start_pos.y - offset_y, 0) + local end_index = self.grid:get_index(end_pos) + end_index = math.min(#self._data, end_index) ---- Check elements which should be created --- @tparam DataList self @{DataList} --- @local -function DataList._check_elements(self) + self.top_index = start_index + self.last_index = end_index + + -- Clear from non range elements for index, data in pairs(self._data_visual) do - if self.scroll:is_node_in_view(data.node) then - self.top_index = index - self.last_index = index + if index < start_index or index > end_index then + self:_remove_at(index) end end - self:_check_elements_from(self.top_index, -1) - self:_check_elements_from(self.top_index + 1, 1) - - for index, data in pairs(self._data_visual) do - self.top_index = math.min(self.top_index or index, index) - self.last_index = math.max(self.last_index or index, index) - end - - -- Progress report - local middle_index = (self.last_index + self.top_index) / 2 - local progress = (middle_index - self._data_first_index) / (self._data_last_index - self._data_first_index) - progress = helper.clamp(progress, 0, 1) - if self.last_index == self:get_last_index() then - progress = 1 - end - if self.top_index == self:get_first_index() then - progress = 0 - end - - if self.scroll_progress ~= progress then - self.scroll_progress = progress - self.on_scroll_progress_change:trigger(self:get_context(), progress) - end -end - - ---- Check elements which should be created. --- Start from index with step until element is outside of scroll view --- @tparam DataList self @{DataList} --- @tparam number index --- @tparam number step --- @local -function DataList._check_elements_from(self, index, step) - local is_outside = false - while not is_outside do - if not self._data[index] then - break - end - - if not self._data_visual[index] then + -- Add new elements + for index = start_index, end_index do + if not self._data_visual[index] and self._data[index] then self:_add_at(index) end - - if not self.scroll:is_node_in_view(self._data_visual[index].node) then - is_outside = true - - -- remove nexts: - -- We add one more element, which is not in view to - -- check what it's always outside to stop spawning - local remove_index = index + step - while self._data_visual[remove_index] do - self:_remove_at(remove_index) - remove_index = remove_index + step - end - end - - index = index + step - end -end - - ---- Update actual data params --- @tparam DataList self @{DataList} --- @local -function DataList._update_data_info(self) - self._data_first_index = false - self._data_last_index = false - self._data_length = 0 - - for index, data in pairs(self._data) do - self._data_first_index = math.min(self._data_first_index or index, index) - self._data_last_index = math.max(self._data_last_index or index, index) - self._data_length = self._data_length + 1 - end - - if self._data_length == 0 then - self._data_first_index = 0 - self._data_last_index = 0 end end diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 29921a6..7a61d0a 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -6,21 +6,11 @@ local settings = require("druid.system.settings") local M = {} -local function button_hover_scale(node, target, time) - gui.animate(node, "scale", target, gui.EASING_OUTSINE, time) -end - -local function button_tap_anim(node, tap_scale, start_scale) - gui.animate(node, gui.PROP_SCALE, tap_scale, gui.EASING_INSINE, 0.1, 0, function() - gui.animate(node, gui.PROP_SCALE, start_scale, gui.EASING_INSINE, 0.1) - end) -end - M["button"] = { - HOVER_SCALE = vmath.vector3(0.02, 0.02, 1), - HOVER_MOUSE_SCALE = vmath.vector3(0.01, 0.01, 1), - HOVER_TIME = 0.04, - SCALE_CHANGE = vmath.vector3(0.035, 0.035, 1), + HOVER_SCALE = vmath.vector3(0.08, 0.08, 1), + HOVER_MOUSE_SCALE = vmath.vector3(0.04, 0.04, 1), + HOVER_TIME = 0.05, + SCALE_CHANGE = vmath.vector3(0.12, 0.12, 1), BTN_SOUND = "click", BTN_SOUND_DISABLED = "click", DISABLED_COLOR = vmath.vector4(0, 0, 0, 1), @@ -33,19 +23,21 @@ M["button"] = { local scale_to = self.start_scale + M.button.HOVER_SCALE local target_scale = state and scale_to or self.start_scale - button_hover_scale(node, target_scale, M.button.HOVER_TIME) + gui.animate(node, "scale", target_scale, gui.EASING_OUTSINE, M.button.HOVER_TIME) end, on_mouse_hover = function(self, node, state) local scale_to = self.start_scale + M.button.HOVER_MOUSE_SCALE local target_scale = state and scale_to or self.start_scale - button_hover_scale(node, target_scale, M.button.HOVER_TIME) + gui.animate(node, "scale", target_scale, gui.EASING_OUTSINE, M.button.HOVER_TIME) end, on_click = function(self, node) local scale_to = self.start_scale + M.button.SCALE_CHANGE - button_tap_anim(node, scale_to, self.start_scale) + gui.set_scale(node, scale_to) + gui.animate(node, gui.PROP_SCALE, self.start_scale, gui.EASING_OUTBACK, 0.24) + settings.play_sound(M.button.BTN_SOUND) end, @@ -84,8 +76,8 @@ M["scroll"] = { INERT_SPEED = 30, -- koef. of inert speed EXTRA_STRETCH_SIZE = 100, -- extra size in pixels outside of scroll (stretch effect) POINTS_DEADZONE = 20, -- Speed to check points of interests in no_inertion mode - WHEEL_SCROLL_SPEED = 0, -- Amount of pixels to scroll by one wheel event (0 to disable) - WHEEL_SCROLL_INVERTED = false, -- Boolean to invert wheel scroll side + WHEEL_SCROLL_SPEED = 20, -- Amount of pixels to scroll by one wheel event (0 to disable) + WHEEL_SCROLL_INVERTED = true, -- Boolean to invert wheel scroll side WHEEL_SCROLL_BY_INERTION = false, -- If true, wheel will add inertion to scroll. Direct set position otherwise. SMALL_CONTENT_SCROLL = false, -- If true, content node with size less than view node size can be scrolled } diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index 15ad41b..6beeb16 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -193,10 +193,6 @@ end local function process_input(self, action_id, action, components) local is_input_consumed = false - if #components == 0 then - return false - end - for i = #components, 1, -1 do local component = components[i] local meta = component._meta @@ -293,23 +289,27 @@ end -- Component `on_remove` function will be invoked, if exist. -- @tparam DruidInstance self -- @tparam BaseComponent component Component instance +-- @treturn boolean True if component was removed function DruidInstance.remove(self, component) if self._is_late_remove_enabled then table.insert(self._late_remove, component) - return + return false end -- Recursive remove all children of component local children = component._meta.children for i = #children, 1, -1 do self:remove(children[i]) - local parent = children[i]:get_parent_component() - if parent then - parent:__remove_children(children[i]) - end children[i] = nil end + local parent = component:get_parent_component() + if parent then + parent:__remove_child(component) + end + + local is_removed = false + local all_components = self.components_all for i = #all_components, 1, -1 do if all_components[i] == component then @@ -317,6 +317,7 @@ function DruidInstance.remove(self, component) component:on_remove() end table.remove(all_components, i) + is_removed = true end end @@ -330,6 +331,8 @@ function DruidInstance.remove(self, component) end end end + + return is_removed end @@ -556,7 +559,7 @@ end -- @tparam DruidInstance self -- @tparam string|node node The node_id or gui.get_node(node_id) -- @tparam function|nil callback Button callback --- @tparam table|nil params Button callback params +-- @tparam any|nil params Button callback params -- @tparam node|string|nil anim_node Button anim node (node, if not provided) -- @treturn Button @{Button} component function DruidInstance.new_button(self, node, callback, params, anim_node) diff --git a/settings_deployer b/settings_deployer index 92e4328..07634c7 100644 --- a/settings_deployer +++ b/settings_deployer @@ -1,17 +1,17 @@ -#!/bin/bash - -# If true, it will check and download latest bob version. It will ignore bob_sha param -use_latest_bob=false - -# Set patch (last value after dot) game version value as total git commits count (1.2.0 -> 1.2.{commits_count}) -# You allow to get SHA commit from version via: git rev-list --all --reverse | sed -n {N}p -enable_incremental_version=true +# Path to bob folder. It will find and save new bob.jar files inside +bob_folder=./ # You can point bob version for project in format "filename:sha" -bob_sha="1.6.0:d9e9c49ab946c058f29a8b688c862d70f30e9c43" +bob_sha="181:fd1ad4c17bfdcd890ea7176f2672c35102384419" # Select Defold channel. Values: stable, beta, alpha bob_channel="stable" +# If true, it will check and download latest bob version. It will ignore bob_sha param +use_latest_bob=false + +# Select Defold build server +build_server="https://build.defold.com" + # Is need to build html report -is_build_html_report=true +is_build_html_report=true \ No newline at end of file diff --git a/unit_test.txt b/test/tests/test.ini similarity index 100% rename from unit_test.txt rename to test/tests/test.ini From f93d0c7d40d5358a3701734b3abb346053081d68 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 4 Sep 2024 01:58:20 +0300 Subject: [PATCH 19/45] Add hover on_mouse_hover callback in constructor Add ON_HOVER_CURSOR and ON_MOUSE_HOVER_CURSOR in hover component in styles --- .vscode/settings.json | 3 +- druid/base/hover.lua | 53 +++++++++++++++++++++++++++++++-- druid/base/text.lua | 8 ++++- druid/styles/default/style.lua | 4 +++ druid/system/druid_instance.lua | 5 ++-- 5 files changed, 67 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 770671b..8ba31a8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,8 @@ "before", "after", "it", - "utf8" + "utf8", + "defos" ], "Lua.workspace.checkThirdParty": false, "Lua.diagnostics.neededFileStatus": { diff --git a/druid/base/hover.lua b/druid/base/hover.lua index bbb7a0c..cd147f7 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -28,7 +28,8 @@ local Hover = component.create("hover") -- @tparam Hover self @{Hover} -- @tparam node node Gui node -- @tparam function on_hover_callback Hover callback -function Hover.init(self, node, on_hover_callback) +-- @tparam function on_mouse_hover On mouse hover callback +function Hover.init(self, node, on_hover_callback, on_mouse_hover) self.node = self:get_node(node) self._is_hovered = false @@ -37,7 +38,7 @@ function Hover.init(self, node, on_hover_callback) self._is_mobile = helper.is_mobile() self.on_hover = Event(on_hover_callback) - self.on_mouse_hover = Event() + self.on_mouse_hover = Event(on_mouse_hover) end @@ -51,6 +52,19 @@ function Hover.on_late_init(self) end +--- Component style params. +-- You can override this component styles params in druid styles table +-- or create your own style +-- @table style +-- @tfield[opt] string ON_HOVER_CURSOR Mouse hover style on node hover +-- @tfield[opt] string ON_MOUSE_HOVER_CURSOR Mouse hover style on node mouse hover +function Hover.on_style_change(self, style) + self.style = {} + self.style.ON_HOVER_CURSOR = style.ON_HOVER_CURSOR or nil + self.style.ON_MOUSE_HOVER_CURSOR = style.ON_MOUSE_HOVER_CURSOR or nil +end + + function Hover.on_input(self, action_id, action) if action_id ~= const.ACTION_TOUCH and action_id ~= nil then return false @@ -97,6 +111,10 @@ function Hover.set_hover(self, state) if self._is_hovered ~= state then self._is_hovered = state self.on_hover:trigger(self:get_context(), state, self) + + if defos and self.style.ON_HOVER_CURSOR then + self:_set_cursor(3, state and self.style.ON_HOVER_CURSOR or nil) + end end end @@ -116,6 +134,10 @@ function Hover.set_mouse_hover(self, state) if self._is_mouse_hovered ~= state then self._is_mouse_hovered = state self.on_mouse_hover:trigger(self:get_context(), state, self) + + if defos and self.style.ON_MOUSE_HOVER_CURSOR then + self:_set_cursor(2, state and self.style.ON_MOUSE_HOVER_CURSOR or nil) + end end end @@ -164,4 +186,31 @@ function Hover.is_enabled(self) end +-- Internal cursor stack +local cursor_stack = {} +function Hover:_set_cursor(priority, cursor) + if not defos then + return + end + + local uid = self:get_uid() + cursor_stack[uid] = cursor_stack[uid] or {} + cursor_stack[uid][priority] = cursor + + -- set cursor with high priority via pairs + local priority = nil + local cursor_to_set = nil + for _, stack in pairs(cursor_stack) do + for priority, _ in pairs(stack) do + if priority > (priority or 0) then + priority = priority + cursor_to_set = stack[priority] + end + end + end + + defos.set_cursor(cursor_to_set) +end + + return Hover diff --git a/druid/base/text.lua b/druid/base/text.lua index 689b20c..d831309 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -98,12 +98,18 @@ end --- Reset initial scale for text local function reset_default_scale(self) - self.scale = self.start_scale + self.scale.x = self.start_scale.x + self.scale.y = self.start_scale.y + self.scale.z = self.start_scale.z gui.set_scale(self.node, self.start_scale) gui.set_size(self.node, self.start_size) end +local function is_fit_info_area(self, metrics) + return metrics.width * self.scale.x <= self.text_area.x and + metrics.height * self.scale.y <= self.text_area.y +end --- Setup scale x, but can only be smaller, than start text scale local function update_text_area_size(self) reset_default_scale(self) diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 7a61d0a..336efa4 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -54,6 +54,10 @@ M["button"] = { end } +M["hover"] = { + ON_HOVER_CURSOR = nil, + ON_MOUSE_HOVER_CURSOR = nil, +} M["drag"] = { DRAG_DEADZONE = 10, -- Size in pixels of drag deadzone diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index 6beeb16..c27d114 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -590,9 +590,10 @@ end -- @tparam DruidInstance self -- @tparam string|node node The node_id or gui.get_node(node_id) -- @tparam function|nil on_hover_callback Hover callback +-- @tparam function|nil on_mouse_hover_callback Mouse hover callback -- @treturn Hover @{Hover} component -function DruidInstance.new_hover(self, node, on_hover_callback) - return DruidInstance.new(self, hover, node, on_hover_callback) +function DruidInstance.new_hover(self, node, on_hover_callback, on_mouse_hover_callback) + return DruidInstance.new(self, hover, node, on_hover_callback, on_mouse_hover_callback) end From 986a4695f6a70f653c31cc538ee2272d455ad318 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 7 Sep 2024 17:15:40 +0300 Subject: [PATCH 20/45] Update Rich Input with selection/arrows control. Add template and nodes to self:get_druid --- .vscode/settings.json | 3 +- docs_md/advanced-setup.md | 8 + druid/annotations.lua | 3 +- druid/base/text.lua | 145 +++++++++---- druid/component.lua | 16 +- druid/const.lua | 4 + druid/custom/pin_knob/pin_knob.lua | 4 +- druid/custom/rich_input/rich_input.lua | 219 ++++++++++++++++++-- druid/custom/rich_text/module/rt.lua | 3 + druid/custom/rich_text/module/rt_parse.lua | 4 + druid/custom/rich_text/rich_text.lua | 7 +- druid/editor_scripts/component.lua_template | 8 +- druid/extended/data_list.lua | 10 +- druid/extended/input.lua | 14 +- druid/extended/slider.lua | 6 + druid/styles/default/style.lua | 5 +- druid/templates/component.template.lua | 4 +- druid/templates/component_full.template.lua | 7 +- 18 files changed, 380 insertions(+), 90 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8ba31a8..125c6f0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,7 +10,8 @@ "after", "it", "utf8", - "defos" + "defos", + "clipboard" ], "Lua.workspace.checkThirdParty": false, "Lua.diagnostics.neededFileStatus": { diff --git a/docs_md/advanced-setup.md b/docs_md/advanced-setup.md index ac13ec9..b18369a 100644 --- a/docs_md/advanced-setup.md +++ b/docs_md/advanced-setup.md @@ -14,6 +14,10 @@ By default, **Druid** utilizes the `/builtins/input/all.input_binding` for input - Key trigger: `Back` -> `key_back` (for BackHandler component, Android back button, input component) - Key trigger: `Enter` -> `key_enter` (for Input component, optional) - Key trigger: `Esc` -> `key_esc` (for Input component, optional) +- Key trigger: `Left` -> `key_left` (for Rich Input component, optional) +- Key trigger: `Right` -> `key_right` (for Rich Input component, optional) +- Key trigger: `Shift` -> `key_lshift` (for Rich Input component, optional) +- Key trigger: `Ctrl` -> `key_lctrl` (for Rich Input component, optional) - Touch triggers: `Touch multi` -> `touch_multi` (for Scroll component) ![](../media/input_binding_2.png) @@ -37,6 +41,10 @@ input_key_backspace = key_backspace input_multitouch = touch_multi input_scroll_up = mouse_wheel_up input_scroll_down = mouse_wheel_down +input_key_left = key_left +input_key_right = key_right +input_key_lshift = key_lshift +input_key_lctrl = key_lctrl ``` diff --git a/druid/annotations.lua b/druid/annotations.lua index 44f95d8..a25439b 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -652,6 +652,7 @@ function druid__hover.set_mouse_hover(self, state) end ---@field on_input_text druid.event On input field text change callback(self, input_text) ---@field on_input_unselect druid.event On input field unselect callback(self, input_text) ---@field on_input_wrong druid.event On trying user input with not allowed character callback(self, params, button_instance) +---@field on_select_cursor_change druid.event On cursor position change callback(self, cursor_index, selection_start_index, selection_end_index) ---@field style druid.input.style Component style params. ---@field text druid.text Text component local druid__input = {} @@ -993,7 +994,7 @@ function druid__rich_text.init(self, template, nodes) end --- Set text for Rich Text ---@param self druid.rich_text @{RichText} ----@param text string The text to set +---@param text string|nil The text to set ---@return druid.rich_text.word[] words ---@return druid.rich_text.lines_metrics line_metrics function druid__rich_text.set_text(self, text) end diff --git a/druid/base/text.lua b/druid/base/text.lua index d831309..5d44c20 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -81,11 +81,10 @@ local const = require("druid.const") local helper = require("druid.helper") local utf8_lua = require("druid.system.utf8") local component = require("druid.component") -local utf8 = utf8 or utf8_lua +local utf8 = utf8 or utf8_lua --[[@as utf8]] local Text = component.create("text") - local function update_text_size(self) local size = vmath.vector3( self.start_size.x * (self.start_scale.x / self.scale.x), @@ -110,13 +109,12 @@ local function is_fit_info_area(self, metrics) return metrics.width * self.scale.x <= self.text_area.x and metrics.height * self.scale.y <= self.text_area.y end + + --- Setup scale x, but can only be smaller, than start text scale local function update_text_area_size(self) reset_default_scale(self) - local max_width = self.text_area.x - local max_height = self.text_area.y - local metrics = helper.get_text_metrics_from_node(self.node) if metrics.width == 0 then @@ -125,15 +123,56 @@ local function update_text_area_size(self) return end - local scale_modifier = max_width / metrics.width - scale_modifier = math.min(scale_modifier, self.start_scale.x) + local text_area_width = self.text_area.x + local text_area_height = self.text_area.y + -- Adjust by width + local scale_modifier = text_area_width / metrics.width + + -- Adjust by height if self:is_multiline() then - local scale_modifier_by_height = math.sqrt(max_height / metrics.height) - scale_modifier = math.min(self.start_scale.y, scale_modifier_by_height) + -- Approximate scale by height to start adjust scale + scale_modifier = math.sqrt(text_area_height / metrics.height) + if metrics.width * scale_modifier > text_area_width then + scale_modifier = text_area_width / metrics.width + end - if metrics.width * scale_modifier > max_width then - scale_modifier = math.min(max_width / metrics.width, self.start_scale.x) + -- #RMME + if self._minimal_scale then + scale_modifier = math.max(scale_modifier, self._minimal_scale) + end + -- Limit max scale by initial scale + scale_modifier = math.min(scale_modifier, self.start_scale.x) + -- #RMME + + local is_fit = is_fit_info_area(self, metrics) + local step = is_fit and self.style.ADJUST_SCALE_DELTA or -self.style.ADJUST_SCALE_DELTA + + for i = 1, self.style.ADJUST_STEPS do + -- Grow down to check if we fit + if step < 0 and is_fit then + break + end + -- Grow up to check if we still fit + if step > 0 and not is_fit then + break + end + + scale_modifier = scale_modifier + step + + if self._minimal_scale then + scale_modifier = math.max(scale_modifier, self._minimal_scale) + end + -- Limit max scale by initial scale + scale_modifier = math.min(scale_modifier, self.start_scale.x) + + self.scale.x = scale_modifier + self.scale.y = scale_modifier + self.scale.z = self.start_scale.z + gui.set_scale(self.node, self.scale) + update_text_size(self) + metrics = helper.get_text_metrics_from_node(self.node) + is_fit = is_fit_info_area(self, metrics) end end @@ -141,12 +180,16 @@ local function update_text_area_size(self) scale_modifier = math.max(scale_modifier, self._minimal_scale) end - local new_scale = vmath.vector3(scale_modifier, scale_modifier, self.start_scale.z) - gui.set_scale(self.node, new_scale) - self.scale = new_scale + -- Limit max scale by initial scale + scale_modifier = math.min(scale_modifier, self.start_scale.x) + + self.scale.x = scale_modifier + self.scale.y = scale_modifier + self.scale.z = self.start_scale.z + gui.set_scale(self.node, self.scale) update_text_size(self) - self.on_update_text_scale:trigger(self:get_context(), new_scale, metrics) + self.on_update_text_scale:trigger(self:get_context(), self.scale, metrics) end @@ -177,18 +220,6 @@ local function update_text_with_anchor_shift(self) end --- calculate space width with font -local function get_space_width(self, font) - if not self._space_width[font] then - local no_space = resource.get_text_metrics(font, "1").width - local with_space = resource.get_text_metrics(font, " 1").width - self._space_width[font] = with_space - no_space - end - - return self._space_width[font] -end - - local function update_adjust(self) if not self.adjust_type or self.adjust_type == const.TEXT_ADJUST.NO_ADJUST then reset_default_scale(self) @@ -224,18 +255,22 @@ end -- @table style -- @tfield string|nil TRIM_POSTFIX The postfix for TRIM adjust type. Default: ... -- @tfield string|nil DEFAULT_ADJUST The default adjust type for any text component. Default: DOWNSCALE +-- @tfield string|nil ADJUST_STEPS Amount of iterations for text adjust by height. Default: 20 +-- @tfield string|nil ADJUST_SCALE_DELTA Scale step on each height adjust step. Default: 0.02 function Text.on_style_change(self, style) self.style = {} self.style.TRIM_POSTFIX = style.TRIM_POSTFIX or "..." self.style.DEFAULT_ADJUST = style.DEFAULT_ADJUST or const.TEXT_ADJUST.DOWNSCALE + self.style.ADJUST_STEPS = style.ADJUST_STEPS or 20 + self.style.ADJUST_SCALE_DELTA = style.ADJUST_SCALE_DELTA or 0.02 end --- The @{Text} constructor -- @tparam Text self @{Text} -- @tparam string|node node Node name or GUI Text Node itself --- @tparam string|nil value Initial text. Default value is node text from GUI scene. --- @tparam string|nil adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale +-- @tparam string|nil value Initial text. Default value is node text from GUI scene. Default: nil +-- @tparam string|nil adjust_type Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: DOWNSCALE function Text.init(self, node, value, adjust_type) self.node = self:get_node(node) self.pos = gui.get_position(self.node) @@ -257,8 +292,6 @@ function Text.init(self, node, value, adjust_type) self.on_set_pivot = Event() self.on_update_text_scale = Event() - self._space_width = {} - self:set_to(value or gui.get_text(self.node)) return self end @@ -282,38 +315,66 @@ end --- Calculate text width with font with respect to trailing space -- @tparam Text self @{Text} --- @tparam string|nil text +-- @tparam string text|nil -- @treturn number Width -- @treturn number Height function Text.get_text_size(self, text) text = text or self.last_value local font_name = gui.get_font(self.node) local font = gui.get_font_resource(font_name) - local scale = gui.get_scale(self.node) + local scale = self.last_scale or gui.get_scale(self.node) local linebreak = gui.get_line_break(self.node) - local metrics = resource.get_text_metrics(font, text, { + local dot_width = resource.get_text_metrics(font, ".").width + + local metrics = resource.get_text_metrics(font, text .. ".", { line_break = linebreak, leading = 1, tracking = 0, width = self.start_size.x }) - local width = metrics.width - for i = #text, 1, -1 do - local c = string.sub(text, i, i) - if c ~= ' ' then + + local width = metrics.width - dot_width + return width * scale.x, metrics.height * scale.y +end + + +--- Get chars count by width +-- @tparam Text self @{Text} +-- @tparam number width +-- @treturn number Chars count +function Text.get_text_index_by_width(self, width) + local text = self.last_value + local font_name = gui.get_font(self.node) + local font = gui.get_font_resource(font_name) + local scale = self.last_scale or gui.get_scale(self.node) + + local text_index = 0 + local text_width = 0 + local text_length = utf8.len(text) + local dot_width = resource.get_text_metrics(font, ".").width + local previous_width = 0 + for i = 1, text_length do + local subtext = utf8.sub(text, 1, i) .. "." + local subtext_width = resource.get_text_metrics(font, subtext).width + subtext_width = subtext_width - dot_width + text_width = subtext_width * scale.x + local width_delta = text_width - previous_width + previous_width = text_width + + if (text_width - width_delta/2) < width then + text_index = i + else break end - - width = width + get_space_width(self, font) end - return width * scale.x, metrics.height * scale.y + return text_index end --- Set text to text field -- @tparam Text self @{Text} --- @tparam string|number|boolean set_to Text for node +-- @tparam string set_to Text for node -- @treturn Text Current text instance function Text.set_to(self, set_to) set_to = set_to or "" diff --git a/druid/component.lua b/druid/component.lua index e5c438a..0720ae7 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -205,10 +205,22 @@ end --- Get Druid instance for inner component creation. -- @tparam BaseComponent self @{BaseComponent} +-- @tparam string|nil template The template name +-- @tparam table|nil nodes The nodes table -- @treturn DruidInstance Druid instance with component context -function BaseComponent.get_druid(self) +function BaseComponent.get_druid(self, template, nodes) local context = { _context = self } - return setmetatable(context, { __index = self._meta.druid }) + local druid_instance = setmetatable(context, { __index = self._meta.druid }) + + if template then + self:set_template(template) + end + + if nodes then + self:set_nodes(nodes) + end + + return druid_instance end diff --git a/druid/const.lua b/druid/const.lua index c9adc29..6801e35 100755 --- a/druid/const.lua +++ b/druid/const.lua @@ -17,6 +17,10 @@ M.ACTION_MULTITOUCH = hash(sys.get_config_string("druid.input_multitouch", "touc M.ACTION_BACKSPACE = hash(sys.get_config_string("druid.input_key_backspace", "key_backspace")) M.ACTION_SCROLL_UP = hash(sys.get_config_string("druid.input_scroll_up", "mouse_wheel_up")) M.ACTION_SCROLL_DOWN = hash(sys.get_config_string("druid.input_scroll_down", "mouse_wheel_down")) +M.ACTION_LEFT = hash(sys.get_config_string("druid.input_key_left", "key_left")) +M.ACTION_RIGHT = hash(sys.get_config_string("druid.input_key_right", "key_right")) +M.ACTION_LSHIFT = hash(sys.get_config_string("druid.input_key_lshift", "key_lshift")) +M.ACTION_LCTRL = hash(sys.get_config_string("druid.input_key_lctrl", "key_lctrl")) M.IS_STENCIL_CHECK = not (sys.get_config_string("druid.no_stencil_check") == "1") diff --git a/druid/custom/pin_knob/pin_knob.lua b/druid/custom/pin_knob/pin_knob.lua index 5a37681..39e8c5f 100644 --- a/druid/custom/pin_knob/pin_knob.lua +++ b/druid/custom/pin_knob/pin_knob.lua @@ -58,9 +58,7 @@ end -- @tparam string template The template string name -- @tparam table nodes Nodes table from gui.clone_tree function PinKnob.init(self, callback, template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.druid = self:get_druid() + self.druid = self:get_druid(template, nodes) self.node = self:get_node(SCHEME.PIN) self.is_drag = false diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index a1310d0..0c6e14b 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -24,8 +24,13 @@ --- local component = require("druid.component") -local input = require("druid.extended.input") +local helper = require("druid.helper") +local const = require("druid.const") +local utf8_lua = require("druid.system.utf8") +local utf8 = utf8 or utf8_lua +local hotkey = require("druid.extended.hotkey") +local input = require("druid.extended.input") local RichInput = component.create("druid.rich_input") local SCHEME = { @@ -34,34 +39,142 @@ local SCHEME = { PLACEHOLDER = "placeholder_text", INPUT = "input_text", CURSOR = "cursor_node", + CURSOR_TEXT = "cursor_text", } +local DOUBLE_CLICK_TIME = 0.35 local function animate_cursor(self) - gui.cancel_animation(self.cursor, gui.PROP_COLOR) - gui.set_color(self.cursor, vmath.vector4(1)) - gui.animate(self.cursor, gui.PROP_COLOR, vmath.vector4(1,1,1,0), gui.EASING_INSINE, 0.8, 0, nil, gui.PLAYBACK_LOOP_PINGPONG) + gui.cancel_animation(self.cursor_text, "color.w") + gui.set_alpha(self.cursor_text, 1) + gui.animate(self.cursor_text, "color.w", 0, gui.EASING_INSINE, 0.8, 0, nil, gui.PLAYBACK_LOOP_PINGPONG) end -local function update_text(self, text) - local text_width = self.input.total_width - animate_cursor(self) - gui.set_position(self.cursor, vmath.vector3(text_width/2, 0, 0)) +local function set_selection_width(self, selection_width) + gui.set_visible(self.cursor, selection_width > 0) + + local width = selection_width / self.input.text.scale.x + local height = gui.get_size(self.cursor).y + gui.set_size(self.cursor, vmath.vector3(width, height, 0)) + + local is_selection_to_right = self.input.cursor_index == self.input.end_index + gui.set_pivot(self.cursor, is_selection_to_right and gui.PIVOT_E or gui.PIVOT_W) +end + + +local function update_text(self) + local left_text_part = utf8.sub(self.input:get_text(), 0, self.input.cursor_index) + local selected_text_part = utf8.sub(self.input:get_text(), self.input.start_index + 1, self.input.end_index) + + local left_part_width = self.input.text:get_text_size(left_text_part) + local selected_part_width = self.input.text:get_text_size(selected_text_part) + + local pivot_text = gui.get_pivot(self.input.text.node) + local pivot_offset = helper.get_pivot_offset(pivot_text) + + self.cursor_position.x = self.text_position.x - self.input.total_width * (0.5 + pivot_offset.x) + left_part_width + + gui.set_position(self.cursor, self.cursor_position) gui.set_scale(self.cursor, self.input.text.scale) + + set_selection_width(self, selected_part_width) end local function on_select(self) gui.set_enabled(self.cursor, true) gui.set_enabled(self.placeholder.node, false) + gui.set_enabled(self.input.button.node, true) + animate_cursor(self) + self.drag:set_enabled(true) + self:_set_hotkeys_enabled(true) end local function on_unselect(self) + gui.cancel_animation(self.cursor, gui.PROP_COLOR) gui.set_enabled(self.cursor, false) + gui.set_enabled(self.input.button.node, self.is_button_input_enabled) gui.set_enabled(self.placeholder.node, true and #self.input:get_text() == 0) + + self.drag:set_enabled(false) + self:_set_hotkeys_enabled(false) +end + + +--- Update selection +local function update_selection(self) + update_text(self) +end + + +local TEMP_VECTOR = vmath.vector3(0) +local function get_index_by_touch(self, touch) + local text_node = self.input.text.node + TEMP_VECTOR.x = touch.screen_x + TEMP_VECTOR.y = touch.screen_y + + -- Distance to the text node position + local scene_scale = helper.get_scene_scale(text_node) + local local_pos = gui.screen_to_local(text_node, TEMP_VECTOR) + local_pos.x = local_pos.x / scene_scale.x + + -- Offset to the left side of the text node + local pivot_offset = helper.get_pivot_offset(gui.get_pivot(text_node)) + local_pos.x = local_pos.x + self.input.total_width * (0.5 + pivot_offset.x) + local_pos.x = local_pos.x - self.text_position.x + + local cursor_index = self.input.text:get_text_index_by_width(local_pos.x) + return cursor_index +end + + +local function on_touch_start_callback(self, touch) + local cursor_index = get_index_by_touch(self, touch) + + if self._last_touch_info.cursor_index == cursor_index then + local time = socket.gettime() + if time - self._last_touch_info.time < DOUBLE_CLICK_TIME then + local len = utf8.len(self.input:get_text()) + self.input:select_cursor(len, 0, len) + self._last_touch_info.cursor_index = nil + + return + end + end + + self._last_touch_info.cursor_index = cursor_index + self._last_touch_info.time = socket.gettime() + + if self.input.is_lshift then + local start_index = self.input.start_index + local end_index = self.input.end_index + + if cursor_index < start_index then + self.input:select_cursor(cursor_index, cursor_index, end_index) + elseif cursor_index > end_index then + self.input:select_cursor(cursor_index, start_index, cursor_index) + end + else + self.input:select_cursor(cursor_index) + end +end + + + +local function on_drag_callback(self, dx, dy, x, y, touch) + if not self._last_touch_info.cursor_index then + return + end + + local index = get_index_by_touch(self, touch) + if self._last_touch_info.cursor_index <= index then + self.input:select_cursor(index, self._last_touch_info.cursor_index, index) + else + self.input:select_cursor(index, index, self._last_touch_info.cursor_index) + end end @@ -70,38 +183,112 @@ end -- @tparam string template The template string name -- @tparam table nodes Nodes table from gui.clone_tree function RichInput.init(self, template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.druid = self:get_druid() + self.druid = self:get_druid(template, nodes) self.root = self:get_node(SCHEME.ROOT) + self._last_touch_info = { + cursor_index = nil, + time = 0, + } + self.is_lshift = false + self.is_lctrl = false + + ---@type druid.input self.input = self.druid:new(input, self:get_node(SCHEME.BUTTON), self:get_node(SCHEME.INPUT)) + self.is_button_input_enabled = gui.is_enabled(self.input.button.node) + self.cursor = self:get_node(SCHEME.CURSOR) + self.cursor_position = gui.get_position(self.cursor) + self.cursor_text = self:get_node(SCHEME.CURSOR_TEXT) + + self.drag = self.druid:new_drag(self:get_node(SCHEME.BUTTON), on_drag_callback) + self.drag.on_touch_start:subscribe(on_touch_start_callback) + self.drag:set_input_priority(const.PRIORITY_INPUT_MAX + 1) + self.drag:set_enabled(false) self.input:set_text("") self.placeholder = self.druid:new_text(self:get_node(SCHEME.PLACEHOLDER)) + self.text_position = gui.get_position(self.input.text.node) self.input.on_input_text:subscribe(update_text) self.input.on_input_select:subscribe(on_select) self.input.on_input_unselect:subscribe(on_unselect) + self.input.on_select_cursor_change:subscribe(update_selection) + on_unselect(self) - update_text(self, "") + update_text(self) +end + + +function RichInput.on_input(self, action_id, action) + if action_id == const.ACTION_LSHIFT then + if action.pressed then + self.is_lshift = true + elseif action.released then + self.is_lshift = false + end + end + + if action_id == const.ACTION_LCTRL then + if action.pressed then + self.is_lctrl = true + elseif action.released then + self.is_lctrl = false + end + end + + if action_id == const.ACTION_LEFT and (action.pressed or action.repeated) then + self.input:move_selection(-1, self.is_lshift, self.is_lctrl) + end + + if action_id == const.ACTION_RIGHT and (action.pressed or action.repeated) then + self.input:move_selection(1, self.is_lshift, self.is_lctrl) + end end --- Set placeholder text -- @tparam RichInput self @{RichInput} --- @tparam string|nil placeholder_text The placeholder text --- @treturn RichInput Current instance +-- @tparam string placeholder_text The placeholder text function RichInput.set_placeholder(self, placeholder_text) self.placeholder:set_to(placeholder_text) return self end ----GSet input field text +--- Select input field +-- @tparam RichInput self @{RichInput} +function RichInput.select(self) + self.input:select() +end + + +--- Set input field text +-- @tparam RichInput self @{RichInput} +-- @treturn druid.input Current input instance +-- @tparam string text The input text +function RichInput.set_text(self, text) + self.input:set_text(text) + gui.set_enabled(self.placeholder.node, true and #self.input:get_text() == 0) + + return self +end + + +--- Set input field font +-- @tparam RichInput self @{RichInput} +-- @tparam hash font The font hash +-- @treturn druid.input Current input instance +function RichInput.set_font(self, font) + gui.set_font(self.input.text.node, font) + gui.set_font(self.placeholder.node, font) + + return self +end + + +--- Set input field text -- @tparam RichInput self @{RichInput} --- @treturn string Current input text function RichInput.get_text(self) return self.input:get_text() end diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 8a350ec..10ff471 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -234,6 +234,9 @@ function M._split_on_lines(words, settings) repeat local word = words[i] + if word == nil then + break + end if word.image then word.default_animation = settings.default_animation end diff --git a/druid/custom/rich_text/module/rt_parse.lua b/druid/custom/rich_text/module/rt_parse.lua index 66c6a1d..69f9216 100755 --- a/druid/custom/rich_text/module/rt_parse.lua +++ b/druid/custom/rich_text/module/rt_parse.lua @@ -117,6 +117,10 @@ function M.parse(text, default_settings, style) assert(default_settings) text = text:gsub("&zwsp;", "\226\128\139") + + -- Replace all \n with
    to make it easier to split the text + text = text:gsub("\n", "
    ") + local all_words = {} local open_tags = {} diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index dd2d802..ea9b97d 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -109,11 +109,9 @@ local SCHEME = { -- @tparam string template The Rich Text template name -- @tparam table nodes The node table, if prefab was copied by gui.clone_tree() function RichText.init(self, template, nodes) - self:set_template(template) - self:set_nodes(nodes) + self.druid = self:get_druid(template, nodes) self.root = self:get_node(SCHEME.ROOT) - self.druid = self:get_druid() self.text_prefab = self:get_node(SCHEME.TEXT_PREFAB) self.icon_prefab = self:get_node(SCHEME.ICON_PREFAB) @@ -151,7 +149,7 @@ end --- Set text for Rich Text -- @tparam RichText self @{RichText} --- @tparam string text The text to set +-- @tparam string text|nil The text to set -- @treturn druid.rich_text.word[] words -- @treturn druid.rich_text.lines_metrics line_metrics -- @usage @@ -198,6 +196,7 @@ end -- -- function RichText.set_text(self, text) + text = text or "" self:clear() self._last_value = text diff --git a/druid/editor_scripts/component.lua_template b/druid/editor_scripts/component.lua_template index 457284f..cf46000 100644 --- a/druid/editor_scripts/component.lua_template +++ b/druid/editor_scripts/component.lua_template @@ -7,8 +7,8 @@ local component = require("druid.component") ----@class {COMPONENT_TYPE}: druid.base_component{COMPONENT_ANNOTATIONS} ----@field druid druid_instance +---@class {COMPONENT_TYPE}: druid.base_component +---@field druid druid_instance{COMPONENT_ANNOTATIONS} local M = component.create("{COMPONENT_TYPE}") local SCHEME = { @@ -19,9 +19,7 @@ local SCHEME = { ---@param template string ---@param nodes table function M:init(template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.druid = self:get_druid(){COMPONENT_DEFINE} + self.druid = self:get_druid(template, nodes){COMPONENT_DEFINE} end diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index 88abf81..cb957b5 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -80,7 +80,6 @@ end -- @treturn druid.data_list Current DataList instance function DataList.set_data(self, data) self._data = data or {} - self.scroll:set_size(self.grid:get_size_for(#self._data)) self:_refresh() return self @@ -102,7 +101,7 @@ end -- @tparam number shift_policy The constant from const.SHIFT.* -- @local function DataList.add(self, data, index, shift_policy) - index = index or self._data_last_index + 1 + index = index or #self._data + 1 shift_policy = shift_policy or const.SHIFT.RIGHT helper.insert_with_shift(self._data, data, index, shift_policy) @@ -205,6 +204,7 @@ function DataList._add_at(self, index) local node, instance = self._create_function(self:get_context(), self._data[index], index, self) self._data_visual[index] = { + data = self._data[index], node = node, component = instance, } @@ -240,6 +240,8 @@ end -- @tparam DataList self @{DataList} -- @local function DataList._refresh(self) + self.scroll:set_size(self.grid:get_size_for(#self._data)) + local start_pos = -self.scroll.position local start_index = self.grid:get_index(start_pos) start_index = math.max(1, start_index) @@ -258,6 +260,10 @@ function DataList._refresh(self) for index, data in pairs(self._data_visual) do if index < start_index or index > end_index then self:_remove_at(index) + elseif self._data[index] ~= data.data then + -- TODO We want to find currently created data instances and move them to new positions + -- Now it will re-create them + self:_remove_at(index) end end diff --git a/druid/extended/input.lua b/druid/extended/input.lua index 4426da9..fbf5bb4 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -52,6 +52,7 @@ local Event = require("druid.event") local const = require("druid.const") +local helper = require("druid.helper") local component = require("druid.component") local utf8_lua = require("druid.system.utf8") local utf8 = utf8 or utf8_lua @@ -90,7 +91,6 @@ end -- @tfield boolean IS_LONGTAP_ERASE Is long tap will erase current input data. Default: false -- @tfield string MASK_DEFAULT_CHAR Default character mask for password input. Default: *] -- @tfield boolean IS_UNSELECT_ON_RESELECT If true, call unselect on select selected input. Default: false --- @tfield boolean NO_CONSUME_INPUT_WHILE_SELECTED If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false -- @tfield function on_select (self, button_node) Callback on input field selecting -- @tfield function on_unselect (self, button_node) Callback on input field unselecting -- @tfield function on_input_wrong (self, button_node) Callback on wrong user input @@ -101,7 +101,6 @@ function Input.on_style_change(self, style) self.style.IS_LONGTAP_ERASE = style.IS_LONGTAP_ERASE or false self.style.MASK_DEFAULT_CHAR = style.MASK_DEFAULT_CHAR or "*" self.style.IS_UNSELECT_ON_RESELECT = style.IS_UNSELECT_ON_RESELECT or false - self.style.NO_CONSUME_INPUT_WHILE_SELECTED = style.NO_CONSUME_INPUT_WHILE_SELECTED or false self.style.on_select = style.on_select or function(_, button_node) end self.style.on_unselect = style.on_unselect or function(_, button_node) end @@ -121,7 +120,7 @@ end -- @tparam node|Text text_node Text node what will be changed on user input. You can pass text component instead of text node name @{Text} -- @tparam number|nil keyboard_type Gui keyboard type for input field function Input.init(self, click_node, text_node, keyboard_type) - self.druid = self:get_druid(self) + self.druid = self:get_druid() if type(text_node) == "table" then self.text = text_node @@ -139,6 +138,9 @@ function Input.init(self, click_node, text_node, keyboard_type) self.text_width = 0 self.market_text_width = 0 self.total_width = 0 + self.cursor_index = utf8.len(self.value) + self.start_index = self.cursor_index + self.end_index = self.cursor_index self.max_length = nil self.allowed_characters = nil @@ -150,6 +152,11 @@ function Input.init(self, click_node, text_node, keyboard_type) self.button.on_click_outside:subscribe(self.unselect) self.button.on_long_click:subscribe(clear_and_select) + if defos then + self.button.hover.style.ON_HOVER_CURSOR = defos.CURSOR_IBEAM + self.button.hover.style.ON_MOUSE_HOVER_CURSOR = defos.CURSOR_IBEAM + end + if html5 then self.button:set_web_user_interaction(true) end @@ -160,6 +167,7 @@ function Input.init(self, click_node, text_node, keyboard_type) self.on_input_empty = Event() self.on_input_full = Event() self.on_input_wrong = Event() + self.on_select_cursor_change = Event() end diff --git a/druid/extended/slider.lua b/druid/extended/slider.lua index 37c4ab7..e050df1 100644 --- a/druid/extended/slider.lua +++ b/druid/extended/slider.lua @@ -85,6 +85,12 @@ function Slider.on_layout_change(self) end +function Slider.on_remove(self) + -- Return pin to start position + gui.set_position(self.node, self.start_pos) +end + + function Slider.on_window_resized(self) local x_koef, y_koef = helper.get_screen_aspect_koef() self._x_koef = x_koef diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 336efa4..2ce473e 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -115,11 +115,10 @@ M["swipe"] = { M["input"] = { - IS_LONGTAP_ERASE = true, - BUTTON_SELECT_INCREASE = 1.06, + IS_LONGTAP_ERASE = false, + BUTTON_SELECT_INCREASE = 1.08, MASK_DEFAULT_CHAR = "*", IS_UNSELECT_ON_RESELECT = false, - NO_CONSUME_INPUT_WHILE_SELECTED = false, on_select = function(self, button_node) local target_scale = self.button.start_scale diff --git a/druid/templates/component.template.lua b/druid/templates/component.template.lua index cbc43ad..df48277 100644 --- a/druid/templates/component.template.lua +++ b/druid/templates/component.template.lua @@ -11,10 +11,8 @@ local SCHEME = { -- Component constructor. Template name and nodes are optional. Pass it if you use it in your component function Component:init(template, nodes) - self:set_template(template) - self:set_nodes(nodes) + self.druid = self:get_druid(template, nodes) self.root = self:get_node(SCHEME.ROOT) - self.druid = self:get_druid() self.button = self.druid:new_button(SCHEME.BUTTON, function() end) end diff --git a/druid/templates/component_full.template.lua b/druid/templates/component_full.template.lua index 70232d1..e4a2f7a 100644 --- a/druid/templates/component_full.template.lua +++ b/druid/templates/component_full.template.lua @@ -13,16 +13,13 @@ local SCHEME = { -- Component constructor. Template name and nodes are optional. Pass it if you use it in your component function Component:init(template, nodes) -- If your component is gui template, pass the template name and set it - self:set_template(template) - -- If your component is cloned my gui.clone_tree, pass nodes to component and set it - self:set_nodes(nodes) + -- Use inner druid instance to create components inside this component + self.druid = self:get_druid(template, nodes) -- self:get_node will auto process component template and nodes self.root = self:get_node(SCHEME.ROOT) - -- Use inner druid instance to create components inside this component - self.druid = self:get_druid() end From d533e5ee2d781bd0414e8eec1fce0a76e1099fdb Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 10 Sep 2024 21:46:29 +0300 Subject: [PATCH 21/45] Fix scroll events while animating Fix slider issue with negative distance Add bunch of new functions to grid More accurate progress bar scaling with 9-slice images --- druid/base/hover.lua | 6 ++--- druid/base/scroll.lua | 10 +++++++- druid/base/static_grid.lua | 46 +++++++++++++++++++++++++++++++++++++ druid/extended/progress.lua | 40 ++++++++++++++++++++++++-------- druid/extended/slider.lua | 27 +++++++++++++++++++--- druid/helper.lua | 19 +++++++++++++++ 6 files changed, 131 insertions(+), 17 deletions(-) diff --git a/druid/base/hover.lua b/druid/base/hover.lua index cd147f7..97758c3 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -201,9 +201,9 @@ function Hover:_set_cursor(priority, cursor) local priority = nil local cursor_to_set = nil for _, stack in pairs(cursor_stack) do - for priority, _ in pairs(stack) do - if priority > (priority or 0) then - priority = priority + for pr, _ in pairs(stack) do + if pr > (priority or 0) then + priority = pr cursor_to_set = stack[priority] end end diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 4d22d9b..fa99ce1 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -54,7 +54,7 @@ -- @tfield node content_node --- Flag, if scroll now moving by inertion --- @tfield bool _is_inert +-- @tfield boolean _is_inert --- Current inert speed -- @tfield vector3 inertion @@ -704,6 +704,10 @@ end function Scroll._update_free_scroll(self, dt) + if self.is_animate then + return + end + local target = self.target_position if self._is_inert and (self.inertion.x ~= 0 or self.inertion.y ~= 0) then @@ -725,6 +729,10 @@ end function Scroll._update_hand_scroll(self, dt) + if self.is_animate then + self:_cancel_animate() + end + local dx = self.target_position.x - self.position.x local dy = self.target_position.y - self.position.y diff --git a/druid/base/static_grid.lua b/druid/base/static_grid.lua index 02b3f2a..e66813c 100644 --- a/druid/base/static_grid.lua +++ b/druid/base/static_grid.lua @@ -240,6 +240,23 @@ function StaticGrid.add(self, item, index, shift_policy, is_instant) end +--- Set new items to the grid. All previous items will be removed +-- @tparam StaticGrid self @{StaticGrid} +-- @tparam node[] nodes The new grid nodes +-- @tparam[opt=false] boolean is_instant If true, update node positions instantly +function StaticGrid.set_items(self, nodes, is_instant) + self.nodes = nodes + for index = 1, #nodes do + local item = nodes[index] + gui.set_parent(item, self.parent) + end + + self:_update(is_instant) + + self.on_change_items:trigger(self:get_context()) +end + + --- Remove the item from the grid. Note that gui node will be not deleted -- @tparam StaticGrid self @{StaticGrid} -- @tparam number index The grid node index to remove @@ -382,6 +399,35 @@ function StaticGrid.set_in_row(self, in_row) end +--- Set new node size for grid +-- @tparam StaticGrid self @{StaticGrid} +-- @tparam[opt] number width The new node width +-- @tparam[opt] number height The new node height +-- @treturn druid.static_grid Current grid instance +function StaticGrid.set_item_size(self, width, height) + if width then + self.node_size.x = width + end + if height then + self.node_size.y = height + end + self:_update() + self.on_change_items:trigger(self:get_context()) + + return self +end + + +--- Sort grid nodes by custom comparator function +-- @tparam StaticGrid self @{StaticGrid} +-- @tparam function comparator The comparator function. (a, b) -> boolean +-- @treturn druid.static_grid Current grid instance +function StaticGrid.sort_nodes(self, comparator) + table.sort(self.nodes, comparator) + self:_update(true) +end + + --- Update grid inner state -- @tparam StaticGrid self @{StaticGrid} -- @tparam boolean|nil is_instant If true, node position update instantly, otherwise with set_position_function callback diff --git a/druid/extended/progress.lua b/druid/extended/progress.lua index 2689057..163b017 100644 --- a/druid/extended/progress.lua +++ b/druid/extended/progress.lua @@ -76,15 +76,29 @@ end local function set_bar_to(self, set_to, is_silent) local prev_value = self.last_value + local other_side = self.key == const.SIDE.X and const.SIDE.Y or const.SIDE.X self.last_value = set_to - local total_width = set_to * self.max_size + local total_width = set_to * self.max_size[self.key] - local scale = math.min(total_width / self.slice_size, 1) - local size = math.max(total_width, self.slice_size) + local scale = 1 + if self.slice_size[self.key] > 0 then + scale = math.min(total_width / self.slice_size[self.key], 1) + end + local size = math.max(total_width, self.slice_size[self.key]) + + do -- Scale other side + -- Decrease other side of progress bar to match the oppotize slice_size + local minimal_size = self.size[other_side] - self.slice_size[other_side] + local maximum_size = self.size[other_side] + local scale_diff = (maximum_size - minimal_size) / maximum_size + local other_scale = 1 - (scale_diff * (1 - scale)) + self.scale[other_side] = other_scale + end self.scale[self.key] = scale gui.set_scale(self.node, self.scale) + self.size[self.key] = size gui.set_size(self.node, self.size) @@ -125,15 +139,15 @@ function Progress.init(self, node, key, init_value) self.node = self:get_node(node) self.scale = gui.get_scale(self.node) self.size = gui.get_size(self.node) - self.max_size = self.size[self.key] + self.max_size = gui.get_size(self.node) self.slice = gui.get_slice9(self.node) self.last_value = self._init_value - if self.key == const.SIDE.X then - self.slice_size = self.slice.x + self.slice.z - else - self.slice_size = self.slice.y + self.slice.w - end + self.slice_size = vmath.vector3( + self.slice.x + self.slice.z, + self.slice.y + self.slice.w, + 0 + ) self.on_change = Event() @@ -146,6 +160,12 @@ function Progress.on_layout_change(self) end +function Progress.on_remove(self) + -- Return default size + gui.set_size(self.node, self.max_size) +end + + function Progress.update(self, dt) if self.target then local prev_value = self.last_value @@ -231,7 +251,7 @@ end -- @tparam vector3 max_size The new node maximum (full) size -- @treturn Progress @{Progress} function Progress.set_max_size(self, max_size) - self.max_size = max_size[self.key] + self.max_size[self.key] = max_size[self.key] self:set_to(self.last_value) return self end diff --git a/druid/extended/slider.lua b/druid/extended/slider.lua index e050df1..22bd4e4 100644 --- a/druid/extended/slider.lua +++ b/druid/extended/slider.lua @@ -26,7 +26,7 @@ -- @tfield vector3 end_pos --- Length between start and end position --- @tfield number dist +-- @tfield vector3 dist --- Current drag state -- @tfield boolean is_drag @@ -68,6 +68,7 @@ function Slider.init(self, node, end_pos, callback) self.pos = gui.get_position(self.node) self.target_pos = vmath.vector3(self.pos) self.end_pos = end_pos + self._is_enabled = true self.dist = self.end_pos - self.start_pos self.is_drag = false @@ -104,6 +105,10 @@ function Slider.on_input(self, action_id, action) return false end + if not self._is_enabled or not gui.is_enabled(self.node, true) then + return false + end + if gui.pick_node(self.node, action.x, action.y) then if action.pressed then self.pos = gui.get_position(self.node) @@ -138,11 +143,11 @@ function Slider.on_input(self, action_id, action) if prev_x ~= self.target_pos.x or prev_y ~= self.target_pos.y then local prev_value = self.value - if self.dist.x > 0 then + if math.abs(self.dist.x) > 0 then self.value = (self.target_pos.x - self.start_pos.x) / self.dist.x end - if self.dist.y > 0 then + if math.abs(self.dist.y) > 0 then self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y end @@ -216,4 +221,20 @@ function Slider.set_input_node(self, input_node) end +--- Set Slider input enabled or disabled +-- @tparam Slider self @{Slider} +-- @tparam boolean is_enabled +function Slider.set_enabled(self, is_enabled) + self._is_enabled = is_enabled +end + + +--- Check if Slider component is enabled +-- @tparam Slider self @{Slider} +-- @treturn boolean +function Slider.is_enabled(self) + return self._is_enabled +end + + return Slider diff --git a/druid/helper.lua b/druid/helper.lua index 9ed9420..827e9cf 100644 --- a/druid/helper.lua +++ b/druid/helper.lua @@ -370,6 +370,25 @@ function M.is_web() end +--- Check if device is HTML5 mobile +-- @function helper.is_web_mobile +-- @treturn boolean Is web mobile +function M.is_web_mobile() + if html5 then + return html5.run("(typeof window.orientation !== 'undefined') || (navigator.userAgent.indexOf('IEMobile') !== -1);") == "true" + end + return false +end + + +--- Check if device is mobile and can support multitouch +-- @function helper.is_multitouch_supported +-- @treturn boolean Is multitouch supported +function M.is_multitouch_supported() + return M.is_mobile() or M.is_web_mobile() +end + + --- Simple table to one-line string converter -- @function helper.table_to_string -- @tparam table t From b2a88146e5dac98232cbab3798b452fbba6ebd2d Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 12 Sep 2024 20:59:50 +0300 Subject: [PATCH 22/45] Update input and rich input --- druid/custom/rich_input/rich_input.lua | 2 - druid/extended/input.lua | 233 ++++++++++++++++++++++--- 2 files changed, 213 insertions(+), 22 deletions(-) diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index 0c6e14b..c154782 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -89,7 +89,6 @@ local function on_select(self) animate_cursor(self) self.drag:set_enabled(true) - self:_set_hotkeys_enabled(true) end @@ -100,7 +99,6 @@ local function on_unselect(self) gui.set_enabled(self.placeholder.node, true and #self.input:get_text() == 0) self.drag:set_enabled(false) - self:_set_hotkeys_enabled(false) end diff --git a/druid/extended/input.lua b/druid/extended/input.lua index fbf5bb4..4de1d8b 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -9,10 +9,10 @@ -- @within BaseComponent -- @alias druid.input ---- On input field select callback(self, button_node) +--- On input field select callback(self, input_instance) -- @tfield DruidEvent on_input_select @{DruidEvent} ---- On input field unselect callback(self, input_text) +--- On input field unselect callback(self, input_text, input_instance) -- @tfield DruidEvent on_input_unselect @{DruidEvent} --- On input field text change callback(self, input_text) @@ -24,12 +24,42 @@ --- On input field text change to max length string callback(self, input_text) -- @tfield DruidEvent on_input_full @{DruidEvent} ---- On trying user input with not allowed character callback(self, params, button_instance) +--- On trying user input with not allowed character callback(self, params, input_text) -- @tfield DruidEvent on_input_wrong @{DruidEvent} +--- On cursor position change callback(self, cursor_index, start_index, end_index) +-- @tfield DruidEvent on_select_cursor_change @{DruidEvent} + +--- The cursor index. The index of letter cursor after. Leftmost cursor - 0 +-- @tfield number cursor_index + +--- The selection start index. The index of letter cursor after. Leftmost selection - 0 +-- @tfield number start_index + +--- Theselection end index. The index of letter cursor before. Rightmost selection - #text +-- @tfield number end_index + --- Text component -- @tfield Text text @{Text} +--- Current input value +-- @tfield string value + +--- Previous input value +-- @tfield string previous_value + +--- Current input value with marked text +-- @tfield string current_value + +--- Marked text for input field. Info: https://defold.com/manuals/input-key-and-text/#marked-text +-- @tfield string marked_value + +--- Text width +-- @tfield number text_width + +--- Marked text width +-- @tfield number marked_text_width + --- Button component -- @tfield Button button @{Button} @@ -59,6 +89,14 @@ local utf8 = utf8 or utf8_lua local Input = component.create("input") +Input.ALLOWED_ACTIONS = { + [const.ACTION_TOUCH] = true, + [const.ACTION_TEXT] = true, + [const.ACTION_MARKED_TEXT] = true, + [const.ACTION_BACKSPACE] = true, + [const.ACTION_ENTER] = true, + [const.ACTION_ESC] = true, +} --- Mask text by replacing every character with a mask character -- @tparam string text @@ -172,25 +210,31 @@ end function Input.on_input(self, action_id, action) + if not (action_id == nil or Input.ALLOWED_ACTIONS[action_id]) then + return false + end + if self.is_selected then local input_text = nil + local is_marked_text_changed = false + local cursor_shift_indexes = nil + if action_id == const.ACTION_TEXT then -- ignore return key if action.text == "\n" or action.text == "\r" then return true end - local hex = string.gsub(action.text,"(.)", function (c) + local hex = string.gsub(action.text, "(.)", function(c) return string.format("%02X%s",string.byte(c), "") end) -- ignore arrow keys if not utf8.match(hex, "EF9C8[0-3]") then if not self.allowed_characters or utf8.match(action.text, self.allowed_characters) then - input_text = self.value .. action.text - if self.max_length then - input_text = utf8.sub(input_text, 1, self.max_length) - end + local shift_offset = self.cursor_index - self.start_index + input_text = self:get_text_selected_replaced(action.text) + cursor_shift_indexes = utf8.len(action.text) - shift_offset else self.on_input_wrong:trigger(self:get_context(), action.text) self.style.on_input_wrong(self, self.button.node) @@ -204,10 +248,28 @@ function Input.on_input(self, action_id, action) if self.max_length then self.marked_value = utf8.sub(self.marked_value, 1, self.max_length) end + is_marked_text_changed = true end if action_id == const.ACTION_BACKSPACE and (action.pressed or action.repeated) then - input_text = utf8.sub(self.value, 1, -2) + local start_index = self.start_index or utf8.len(self.value) + local end_index = self.end_index or utf8.len(self.value) + + -- If start == end index, remove left of this selection letter, else delete all selection + if start_index == end_index then + local left_part = utf8.sub(self.value, 1, math.max(0, start_index - 1)) + local right_part = utf8.sub(self.value, end_index + 1, utf8.len(self.value)) + input_text = left_part .. right_part + + cursor_shift_indexes = -1 + else + local left_part = utf8.sub(self.value, 1, start_index) + local right_part = utf8.sub(self.value, end_index + 1, utf8.len(self.value)) + input_text = left_part .. right_part + + -- Calculate offsets from cursor pos to start index + cursor_shift_indexes = start_index - self.cursor_index + end end if action_id == const.ACTION_ENTER and action.released then @@ -225,14 +287,23 @@ function Input.on_input(self, action_id, action) return true end - if input_text or #self.marked_value > 0 then + if input_text or is_marked_text_changed then self:set_text(input_text) + + if cursor_shift_indexes then + self:select_cursor(self.cursor_index + cursor_shift_indexes) + end + return true end end - local is_consume_input = not self.style.NO_CONSUME_INPUT_WHILE_SELECTED and self.is_selected - return is_consume_input + local is_mouse_action = action_id == const.ACTION_TOUCH or not action_id + if is_mouse_action then + return false + end + + return false end @@ -242,7 +313,33 @@ end function Input.on_input_interrupt(self) - -- self:unselect() + --self:unselect() +end + + +function Input.get_text_selected(self) + if self.start_index == self.end_index then + return self.value + end + + return utf8.sub(self.value, self.start_index + 1, self.end_index) +end + +--- Replace selected text with new text +-- @tparam Input self @{Input} +-- @tparam string text The text to replace selected text +-- @treturn string New input text +function Input.get_text_selected_replaced(self, text) + local left_part = utf8.sub(self.value, 1, self.start_index) + local right_part = utf8.sub(self.value, self.end_index + 1, utf8.len(self.value)) + local result = left_part .. text .. right_part + + + if self.max_length then + result = utf8.sub(result, 1, self.max_length) + end + + return result end @@ -250,6 +347,8 @@ end -- @tparam Input self @{Input} -- @tparam string input_text The string to apply for input field function Input.set_text(self, input_text) + input_text = tostring(input_text or "") + -- Case when update with marked text if input_text then self.value = input_text @@ -275,7 +374,6 @@ function Input.set_text(self, input_text) self.is_empty = #value == 0 and #marked_value == 0 local final_text = value .. marked_value - local real_text = self.value .. self.marked_value self.text:set_to(final_text) -- measure it @@ -283,12 +381,12 @@ function Input.set_text(self, input_text) self.marked_text_width = self.text:get_text_size(marked_value) self.total_width = self.text_width + self.marked_text_width - self.on_input_text:trigger(self:get_context(), real_text) + self.on_input_text:trigger(self:get_context(), final_text) if #final_text == 0 then - self.on_input_empty:trigger(self:get_context(), real_text) + self.on_input_empty:trigger(self:get_context(), final_text) end if self.max_length and #final_text == self.max_length then - self.on_input_full:trigger(self:get_context(), real_text) + self.on_input_full:trigger(self:get_context(), final_text) end end end @@ -306,8 +404,10 @@ function Input.select(self) self.is_selected = true gui.show_keyboard(self.keyboard_type, false) - self.on_input_select:trigger(self:get_context()) + local len = utf8.len(self.value) + self:select_cursor(len, len, len) + self.on_input_select:trigger(self:get_context(), self) self.style.on_select(self, self.button.node) else if self.style.IS_UNSELECT_ON_RESELECT then @@ -322,13 +422,14 @@ end function Input.unselect(self) gui.reset_keyboard() self.marked_value = "" + self.value = self.current_value if self.is_selected then self:reset_input_priority() self.button:reset_input_priority() self.is_selected = false gui.hide_keyboard() - self.on_input_unselect:trigger(self:get_context(), self:get_text()) + self.on_input_unselect:trigger(self:get_context(), self:get_text(), self) self.style.on_unselect(self, self.button.node) end @@ -339,7 +440,11 @@ end -- @tparam Input self @{Input} -- @treturn string The current input field text function Input.get_text(self) - return self.value .. self.marked_value + if self.marked_value ~= "" then + return self.value .. self.marked_value + end + + return self.value end @@ -368,9 +473,97 @@ end --- Reset current input selection and return previous value -- @tparam Input self @{Input} +-- @treturn druid.input Current input instance function Input.reset_changes(self) self:set_text(self.previous_value) self:unselect() + return self +end + + +--- Set cursor position in input field +-- @tparam Input self @{Input} +-- @tparam number|nil cursor_index Cursor index for cursor position, if nil - will be set to the end of the text +-- @tparam number|nils start_index Start index for cursor position, if nil - will be set to the end of the text +-- @tparam number|nil end_index End index for cursor position, if nil - will be set to the start_index +-- @treturn druid.input Current input instance +function Input.select_cursor(self, cursor_index, start_index, end_index) + local len = utf8.len(self.value) + + self.cursor_index = cursor_index or len + self.start_index = start_index or self.cursor_index + self.end_index = end_index or self.start_index + + self.cursor_index = helper.clamp(self.cursor_index, 0, len) + self.start_index = helper.clamp(self.start_index, 0, len) + self.end_index = helper.clamp(self.end_index, 0, len) + + self.on_select_cursor_change:trigger(self:get_context(), self.cursor_index, self.start_index, self.end_index) + + return self +end + + +--- Change cursor position by delta +-- @tparam Input self @{Input} +-- @tparam number delta side for cursor position, -1 for left, 1 for right +-- @tparam boolean is_add_to_selection (Shift key) +-- @tparam boolean is_move_to_end (Ctrl key) +function Input.move_selection(self, delta, is_add_to_selection, is_move_to_end) + local len = utf8.len(self.value) + local cursor_index = self.cursor_index + local start_index, end_index -- if nil, the selection will be 0 at cursor position + local is_right = delta > 0 + + local target_index = cursor_index + delta + if is_move_to_end then + target_index = is_right and len or 0 + end + + -- The Shift is not pressed + if not is_add_to_selection then + cursor_index = target_index + + if self.start_index ~= self.end_index then + -- Reset selection without moving cursor + cursor_index = self.cursor_index + end + end + + -- The Shift is pressed + if is_add_to_selection then + cursor_index = target_index + start_index = self.start_index + end_index = self.end_index + + local is_cursor_extends_selection = (self.cursor_index == (is_right and end_index or start_index)) + + if is_cursor_extends_selection then + if is_right then + end_index = cursor_index + else + start_index = cursor_index + end + else + if is_right then + start_index = cursor_index + + if is_move_to_end then + start_index = end_index + end_index = cursor_index + end + else + end_index = cursor_index + + if is_move_to_end then + end_index = start_index + start_index = cursor_index + end + end + end + end + + self:select_cursor(cursor_index, start_index, end_index) end From ab90927d321e4b173496c1cc10894bdb0c915b56 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 12 Sep 2024 21:03:31 +0300 Subject: [PATCH 23/45] Update Druid logos --- media/druid_hero.png | Bin 0 -> 367168 bytes media/druid_logo.png | Bin 121448 -> 503634 bytes media/druid_thumb.png | Bin 0 -> 125566 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/druid_hero.png create mode 100644 media/druid_thumb.png diff --git a/media/druid_hero.png b/media/druid_hero.png new file mode 100644 index 0000000000000000000000000000000000000000..2f55dfdde4abc24e693cc708cdf32ce56a079b7f GIT binary patch literal 367168 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

    HMD26*sa@PAodmJLpX$NBS;uw|97q#x5&De>RQ2 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 J9hpW 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

    1_7^t2p=E}*z> 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%0A%w^JdX75 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 z zw80CE9_sL=d-byiS04xiuj5nyzKR^Z9^=9ipon?p^e`{ou+E95?r@;e!p^LjEWgMlB4~ zH6LW_fCEa;)&BhPe;m&7s6S0;6rrk!Oj1*%@sbg$9ecYpL>P#k>o>z32Ty67=!B4> zXzJqMX8{A+?>80WflmYEOo;15B0`%Lh<%@gs^8V%^pag*2lV(3{cW`Rg#|K~#zzQQ zc5Iv7O?K@%!q0rlWEJ8MgI_K=x*1%_GVlOzc>AgH(z>kr?4@LX2I}9s=K!BWE`#5{ zLS1_zcD57_G=tgArO806n3aK*E3EVow)J@Cw8nkS&(=|CiB5+-USxJiO6Jg302JIO ze%;3X#p*t~WdEhNSpn76Os%AQ{jx`<{r3iX{S-3!kHl{(1!!d5qCYUZ;mh$bk<`W?iprle{3e`jn~3xVce)0PDfu1V z4ccrkI-y+YBXO#=%p|S3yMYfZu0=}I(C1{ZWVDHizeOLI(^Cjd37g-pu=s`tkZ&a( zR^6TEr{iZ?`nfoXJ-vJd^M$(44)beDVQ}QVzXkGC(a)wi8>lfeD&4emi2`y5KDkYs zmr9YpRU`BrNi7h8XDqk#ZJiVB-i`Xi;FU~)-WK}lwMT?W&6i!&CS|jsAx0Hlz33Op71~h{TKn0#!`Tn3J1=3lbUcbpA@0 zQAh%_N0;fs8mVb}J6&JK`X^-}PkS~w945MF?*$4q?&&%4otJv(q7^*0DDVVTRF+Tu zo7s(~M29s_ot_Y!1bea(1g*A849#E$fCD z&15F1=Mw zuz8M;NhKX$h6?%&LOf3f(f#Cnm?ZX~KdDDX33~FCFgWzIA%p8tozyt5chxHp%>hN1 z@dqSQ4AJ~sXtI6~CBPwlaa_>WlEi!F{ zqQ8n|vsbP2lJ=&skmJ9(Ua0MpQZuu(H59ra{K?Mvd7L0aw4Km|V59{8gJk2G^c|mj z2o<GBNSM@Fwo1Sk?Qg;{qS@f30egF>-5hCeAD?2HtAyyy$Evn&;=pQ) znaf7%PWvE^@5F;uLESZlCzyD~k3t$R*H_?EgH@8imyZm7cQM?KqH6OTii1!~Yu8+1 z1kA3uuKYLK{H7#ea@f`Zh&B*UfGxfb_Pi#GY$iPMN-bVd%$?99-6h(f#h2RHH$ zal!a9@ar@fV@G~W@UCaKQ6XJ69i2f--O`W00-eR%Y-p{Sr9sU;xN}{`J)KyQ(7f_n z(+B8iJONNRi{m5Q0rZ0Zc-9ZE$mircwhJzYty9qCVapkQ5pc)}v=Cd$_)B~+VFVr4 zl3ot!|F|hLEK$i0j3dv#Twpr}*fs&6ya|U@tw3AwzPT_^=H9R*Vda}215fU$gT%x< zxuyL5^IAbaNs-sc9fx)s6RzYd!n)?(xrbwA2d`eQMC6%%8oVQTio8p95ok@#1uw;K75TSIdOrxT3{VmojJ#_QT2&aRhpUy%_Wp_~ks z?$fOEdc-X6`)AsaE9@{n8>wGccuL zt{iJ?GQGGKFai;{?yQFNcYHD_;2TU&01945O;bWzmNQXSjo(dA?M)9MM<r~IbyO_4T9a^(5W{uH8Ri5N~Xd23lwh5CS~ez@F?V2pC`GEY&gf) z3}Vd6VJ5UCreGL7Oo1LBuYQ^ZZDF(Qam zlK&o#T=D+Wkwxd1BR*mUYz;q$W5EI+R<>Cq8opHKjxl}+-jB`&H=a8AXnP{a)In7P zr~4)nFE9i`?}x-dq+@X7Tl*_ck{VuIfoFzUGDbUZ^x|S&a-M zD(qA?ieReuyaqIJKe3M)mzDkc@onr@&U~F-e_`eG1Ug18p1y$4r>BqZJ{5gAo2CPK zQNT5|LqYk_R=PsrOog@JO&dMpH(7JR+FfBvjePjSwU-dLO4G8LakH1NSp5OHw8eu#<0O%rGnPyq%~AeYJx&44dea9Ws59L%@FI z;i=xZv9cA10kqcKGBIy+JOHd?sJ-E(&Wk5jS+OD=f4Un?-Bj|2O^A!|{LbVT9H5D8 zGPRkM#vZfTqvSWQc+BhW9WnVH7w-VHa9ZX#@XsR#?y zxH*hw4aJb(f7N8VbkYtPA#59SH+k5H_fx0^2kXg^Oo ze_wod-@G8Leg0RjAQ@o~^7+|h`&yKoxP&^R{?tTJc@=Ai(zOo}Fzbvow^H#na~WUg zyEKFAq(h_EZLA+fMBg}kr1xD(x5G1=kRjblNaAHAd+mUSq)FV*m4PVI&s~Ot&IxB; z9A0z$xA6R&CTYt_=knLhRiq~>p_&(uv<4WTe0>LwrumJJ4ZtI*)Q5w{^PVtlB5zkUpp zC`$yyQ`QjUFu0U)Y$l)H{MxBH(E|yJ>#Dq*IF0TB$(lDV@G+BD`vRAvtraHYpjpS| z)ML?KIDpA$&359aFN`?&!b-B=qs7aXf-Of(j)l?V@0kuj%4TQ;G;`pLI?JGg06FVR zER+l?_8RyNp%LpIosw@sZ>SvoFA`~3?SFCyIqwT|pf!x$5r7evMnwDnk@ePbQMN%F zsFD&&NOwx7bS(&obeEK*($dWeNJy7-igb5(OG}q@ce8-I=UMgrzVDp#hwMJF{MP5< znz?4?p1Cdm<`uw%aQg|jlw!93qv8O{f%f3wtt7zI2M9wVPb`UPdmr8)U~?*}U={Zu zaOr(WPk7y2nX{KCu(HlI1PJkle~HDrO^=@J0E4G9XwWFUteR}_Ja^1JMRKZlQ?BjM$oYE zw69BQuHxN9EO@u!0_K2BL`cWmJ}I9b$2I%Y(%tsJt;b~Iyvvwf|CD23EdCeat(&>R zv&U}>F*Kn}#5osbxAkF9&}mI#7{-Y)a;|)SaJUHzik7+dqg3L_|il$IHwBfC-M_)Tn zGV(psrux5C{yO%)x(Afu&Doi^SnAs*=j!G@f=8MCw>Mu|4|5KO3`kz|3M7STU>XSE zj#_hVT;${qoAQabBP)G+^gU<|t@ zbVQ-$JoVx=qc4j)(Pl%Zr;>VcW5sHwrFrl?M;z4#_$?~IL!6}SfO$($3dMQs(m$30 zFC4B%|2Sy{HHg~=Yc)eq9Y$a!WB8@;lzj>qwDKSWuh~qCG67wNPvFx&j+OwR3#j0M z04`ketOUX0-ly%+-z}~4M!s~ou4b-ra|`>@K$Kn;;rLTxLsvHmgwsO5iy818^{0Y= zKpufLqf=(gN7sC|!*b@RW*Yj;TlZ>N{@<7&ImJtei|A;eWPG;=-FD^sFE1@z3wt#S z-t?I3A`vUCt?YL1<6`Bf($efE5)t;x#-Uo14ELLpBdiKmeSOrE@=OHbZ7rcQ4PF8@ zYq?cfz7~T3Z^jIgMyA8L>eL&`F^U~gOd;hW%{-QVoa>NWvd@9sSjyA(^=rq+kzino zzmUCKtB?#=T`aoG7qi;^1fk-fH5%|RsKKA01h+I4zaov0Yi7CiU{vgdmeQn)NQO9v zQm(n)XX7=AX#&E>pTp96Kper7uM&-v`w7JcFkUCAUk!XSakzf`OY>gwTK%p2y1VRe zjmT$^oh#&oLCpfjgDvijx6gS7o^qUSPpaY)(?1CkKEq<4luzS0PuJfhtE zr}qyI_T2x_Idkd-C9)I1P=Ki~5S^`|rV7Bv;J=~W3aZRAPhHL1yyS3s81r-Sdti_x z4h|DiBfbUyS6zWorFU|;TnI$-9n$`-CX+gc`T|*aJR@im?D^kC;z-$JH^-38oI>_k z;@&DCxdnxei0iwY4Paf(9}Xtl-Q;(-eqc9>HN@4$Y3k!K9n-x=t1%lBvs@xMA*!^;~GB5cXaeLrpGhG{T|d{bQ&Ug-D$ib*-57F9LzXqr`rsS%rM2odLVM?{jNoCCxS!bA zrcnZ+CCj|8F|*-*XSc)0&NmUsj-43{?}pam%pU=L79UjUkeq*h+oLN*|gG;9AF zU%+j~`Tp^)Iq*sw@E?M>4FN$TY)%V%`T-pEU@xlF9N6#27jZVKbnle8y3y`rmSk;% za=z(aOPE_sEJ8z;r{GgsO=n_Cv3Ww}*BT^|$4o|_@{t?ax{5_#!WWe-iER_%Gcd<% zkO#5$Fo~mDs$yYKMOW8e&ZTYPodwr!k1R;DYbQpt?9&%rfl1ttgO$p%^3{h9=SX4{ z%nlJ8+PPivDQZk8hrXtmU$xP0G+C8$>%z{YMHZ=sRU45m^t~={#kL(qQWMvY_i`3| zYyhQmd3>Y?jKB{J>?2g@Gxw+r(b6QEbmriHyHw{YhQa>9(wO}j4z_G{&YS@v$=NrZ zf_s(zE)ZTDVqB4-D|M_*;TRL4j*1Ed7(umR!f=tfeS>uF(gAtDy>ZG(br}1xv1z!S zg_w{ELKD?VS?#U;ZJ^pZR5Lo**6FZ6?aE!>J0fCGoh%YEMp$SKz4HIsRW{td8R)qV z3fn}|6nre?o}vCD%0oZWYYo&ZdSUM?lzA~Nb&;t6xW7RF8Iau{OyEW{4bZb+{uoiP z7hKxJ;f#R%D8jlo^Z`H#Cq}?p#G`ASz-QcK;kI1NQdWWV84%SjR#jlx<H^T)j%h|Nc4iz)FJxr1?Fg-J2Nh@52N9k1M4as zhJi}(bl?x?3G=q%gV*G`gt>1ph@4&G_DSEq6OZ@Cd^zG#0nBlME&=8~ABLF-kZw^-$iw zp0y30hsWvw(*QF4ePRAP80pWMzXg?gC%C=^`ig>5z$ZT+qVoTM?v(NEQL}HC)!y;es!wL-=7Lh+>a&Z3jj}9}K@JPfDjZj$ zEm+C%z)Mw0p);z1JCze^Z)OaT)guTuax&cvyMLdp2oj>2e*fXzs9-s9`6y&-92#2u z?NmsR`4fBZ^h{4IiYp;UQ)^=`*2&7`^73-sheFop(o{1>6>M~sIQQ;9lVEZ0{8}Z2JA9t1eo-mC8hwaYMtQ42}d7c3B6* zh!v%;%Nu=fzREgOc3VT=Q?jx@leH=`Mp%zGJi73#{6UST3vGfJ?JAD65B+Pe40ZsX zy?sAN?KY(pyaVWuD}?KjJg*C^Isl}0D>zo_)=;Mv08ee8$z2+h26o7TP%gt01bd1r z;o#V~!F9oqw(K|8FiMZigO{UbFE_}VOUPt}lhd3~Uj3LMe6VcZ*SMXp^Lb#;^^AV+ z&SZBv(O*!QGjj8r>RBn5O&KQ`r{U%SFQW-zzN zCLRWsYID6Gmx$@ZZfRJlG#=05v=M0^B{MT8{pL*D$m-C?bV#mBI!f!A@=C*1DG?Xd z^w%I90CR!F1Fw=!Pibwuhq0ftHPTh64aey%9Rs}x@XcJ)%dbh0_p$VP?KgX6v8NGC z)Hi5OYxX#!BGd)B`qvRmewtgqXM41yDv8BdH~eh`rfuB3P`uwjTr~7?6Zs@Zwo<($ULA7wzv(^>$I)qoJURz++W!hP8}b@ zcDkTHA0AaU{uDPXvS=(4%ALy@L;lgXCHM*EV$&`Hvzt^~(b0Hw>fZ(^de|ERURV)K z9WLJi%@76rfKz1zTmw)ef7+W+10J6>xxy8_(d-tm9~1oI1^5UFPOQH+54hA$1Z#)h z9YCLdzDMhmis2;rZri<7zp3nK_>rgvr2TveUDsVB*0Y&B>kR_w=P@_q_1MGP6iwKf z^P6bw_jOMSj(^fGZu(TS)di{*`I-1r7jdo#yy#SYFn2w%bK_S3^udZISVmlCa+cc$ zmM_g?mk7)x7ST;!6<46yeR;w{vClK((+^D>vbLeWFwq*pPA)N@M&2|Y*5@$HqoEWT zYm#@prXeE8FD!)pj@18vBlf~HF*0~?bm!&D^77gJ4Y1qMZykfVSVz1t%9)~^uE%-1 z*zyJ(Zwe_oJy?hgAFjP)K2N#_DI?b=tfzQugwk3YOQq_NO0dgUph$amf}+1*XkBsO z-G4u(aH>RRb?(53st|t2SG#G?pZt>H@OZn(FOn~SJ!PZzVoU_9EeITw4CC_MUcr5d zTiBLob>rvJ+i%EDzxfy@l(^UX(w}E6U3oT;OlUMG>K5x+EYa}$qKE1+@b_K2V^@Jj0%m(i6XiV^}8q4FtDrk|6 zc7|SJMJk#?Iv$H$ir2o$8Jsg%FB!Av+D0yU>+?V#%;>X^s}q;_ft?JY?uBlxl;1NO zUjm0^kv)Mhb{u17eC_$uMYP?q9KO8MmIzTQlc-IRh@owL4*C*QTB21SW7c){=6BzR>H3)OsoBNJ9 z5I3E4CN#6fnofT64g3Yj?y&dAdWV=A6x;gY>3x>2I=;R$wXucBnyU8G!*JzE?}lxN z2|EQr6AUsV4;8Zj2Pk)u@(UhVqy5DRP-_0?y|6BD|9CM_ z1aWyPxF#3EF#C7u@nKvJurR0n!TyL2Pbn@b!CJd)i^if1?~4?^;3ye-`R%O;GA@1) z0WXiWTDV5p^7K$xWCJUQOG76MYJj8O8uNws$IqXgn4Wt(S4!L&(*#bvO;c47IwluX z&n>#MV7dr+^Q_;7T_kfuNDU`4EGsR>N5^@JAJgiE-l1xdkKpLKXMp#Z%yo+)3Ca+; zo?697z}@;;3GIf+j7#WCk+HjNWPh#|Q85wU1xL(CfhAxt5PWUG@ipHxcczR6_`sb!(1%hcpKXIYL%{7Ua?$@mfNMEfMV! zX>)~B%C=<44RS*6Xz~WxpD*5w-6K+5;+}2dM!0B=4)Uzzey%Xw@QJ>G?i7N2CG}Ne z1^W$@wC7r+w|_gO@%vwbf$QOg>%Y41??3>DjQ=0?{%AwcynMV7KMd6g0xzfn`IE9O z@TC3XXmD))o4(?n?Xvp)#!NG_5g|(uUqEpTr*f{fdkQr(dhsUFyX{oGuLqz5hDmS# z^5Syj%z-A(V@dvF&Z^Of$pr-PD@D zq+=P;5gC(_14-_43S_I>60~HW-G)wzh~(o)f~G`!r)^A&H<;{XR|eI*dAn(az`7bU zceo1!73&qh!5Tz;k^J@bRkm#le8$M*f(%KmPZWCj6b@u zCgjW`(B~GNjB+|+1itmoO-o&0JD?B1ISdP*>Ln~k>^tzVn#$hC^u&brV%TmQsTu8d z*QFX1QNH6UP^_XLyfxY_CPe!z@Lf~y>Ki_+GU;b7L6|DzlkzXjFkqG%+wIs8f@+id zn~OPVf=lgtaU%8FL9^Ski|Ih5(%Zx)mF~BnG4MG!n2Xz_zJfW2XRGIU?JhL83n8eq zDKH`U&<4OzuAl;53oZoV|JpMFp$I++IZpxC|K0DWmu!Oz@AItG2u#lC+cucX=)&mj z1!Yqnd_fNY^OOVE-`}I%2bZuIhg7()JS93#5yNlbtqv{T7+~MNf%b z6PU+bN5UB+)zF-K@z>fomk4u zf|a;{zP>h|uMR;+EpA|7?)=f@GoistOVvwo1vEqE-E{N4AF>VxJ=Xr9>KE!Zbsb$#&+b3`?222g}L4dej47Nvu&y}Hr zAcYsO&CG{5@Oc!l-UY${KL}_Be&m#H8ZAjc2f^dAPzey^gfCkGxW9R1b7k>VbsaW< z$$35E%26%Q{lfM_6*u*0M8mYR%h_OeuALyh{x|r_)IoyxHNJF0nf2n-Hz&n;e6v|z zqUT4iO>42-ga<>H?Oo#$W|7P|+<8|us1kI|AN^L<&#xQaa46xcNaVv$+98mAeWe~Q zLo61*jCQ{#s(Aj`TxMlFsI_7&&(@WWMVIbz*#w6~>bwB6j0O$+Kv`5#eWjU`tH4s_;{1K%TCY&T`xb`xQ1ttAL;iHsAHUkDJ~rP^RTQX zxY1i`0CSXHd`MWQ+-JuSnZn}$GumUlwyZW3DNu6l2uOd)wm_$j@v-fPKht9JuUSm# z^?(G(F6AzsE$h5~DmDcp`qBZGNwwb}1gK#nguo+CH`rV;ssg&K0dN33fCVzB1K>*ism&Rz2KMFV0%3rxwOC6YJwl)U<$vUcY;MDi`eKb^l#%K!p|mpiE0`% z3Bh*6oH01uvc_pv+`ja_|B#bBc3@& z!{oEk!ou)_QI7j58@q8~OexcB$MuI+6^4iU*Qq>KwFkL#2iVhlET`5nTJ?)dzU*ZU z$}ZEE`b)ckv!8etJ3!WTxsY99*PE+HF!qdF62+Tw!&6|)bo zS+v#rOq0;X=G+%IHe)Z06cWS2kX9_9`Dv6l+_2&L)+FZJb;_D9u3Jh$W=Ys3o=u%) z9rS1|cX6r@n7j|50cVW8(h~raN$2zSC`vKl80#k-4ZfgnD}W~k za9`Z-Zmj=s^skG7MLmLD9mG_syqkC{r%3z=zpF1eLeMAjn?x+b=YmU>#$je-a7pCIrVtlS|Fp0zXZK~>hc&UMITLSv9du)q&6XOZoL*hZ6 zhlp7X^S52G8ac^H4&;unc!v*6yK{XFg54EoWJ?g3cC7@n8$K9Eh(8EStSaBy+1-44 z(J0zm%z91`jL)w{f4etaz0^UP*GxP=!WY0%u9k1tpZ~N2|-f~X2d7jJKNPa4%11z2vW1#4iH;? z@;ygEn|?d459N;(SWDt0ovJA9wQf*R_{<#eDvS!&CYBRkrY#I&OisOhzKy z<70dG^PA=p(PmA0R@ay|%lB>#5lmk|=69@>7@ z+C8CW&oj60CUHs+Zi&-{?6{=S_&O}%x;8%;wIt>YOH!76ONW**mM4b693{Qz8FfRQ zna~C44|$^GA{(Lc|W5?fWjoc;`}74v$d#@SrsZg)07fo)^sRk4eeope9GdZ$w(&?hDJ9_ka| z>^cmoTDcyXBZ21X9k_QaG`T0|W$PhtJnxMGc*R8n3w*f0hoc5#eX+SR4;Z;W?#XBX z1aX66B2NOo2?W6s`wuaIdmyAxxFb`B(!%a;+OMO27{NA6+jI-V)0k;IDh`Eol3(b* zpfa>x(Qe`+|KeRNMAEMT@>1zq3M|QO8`iR%O*s+O`Y`sm5rO8;r3I)VuvJdhh7=mG z2hVgJx2HBNtRE#QU})Ei==8L*_AML|+OaPvv~sx~qqhSeFl;lPHXhSNkbLHItz=^81nYdU6g^ zCpMMUCB!GA1_S8+Ty==AtI3_;IXPdGMOz0~51Q4T2vNKyftlC$p!?!ZcETLluEBLE zrvna+ofDLKMbrzFbt-vrvV~0!=4-+n#c6+Pm zV#Cp3x8w&e;!UFgupJ=;M8)#t1?=P;{`bC54>K$y|3j8P#G(AD_@5uzFh4&rj|TYE zXs`+UR6>>X&^{CZz*CU;;MM4A^FH&ohr!GXF~Nwq_Wn5H^-)XKI3Mm;0-VfT`s6t8 z8#HRAWX+uQc)Fdd5BJc}Pqy!{T3p^tLeR4;$LDFEo7KBGI&{o^xm0|;R;p$Yx$N|H z09qK0NFq&ogS-;*_9XNBbG~60|A{5W&sI?RnS~<*b=^*!0abUlJp{*@*J>Ny-x7eG8!&#@pT>Z?CA-4Nj z6{ekj=@a){Ltk~ALkAzHeq+NmADF^EEWgBIM3qK4<26K1G2r-q?K3dp?90+-D|V{l zx=8&?$Yy!JX=jBXr?+&l^p3a3^fYQ2tE-esl!xQ8`qs<*ElV?gs+upm=t__%E#bSv zVc044kn}Kywjn29(kwx$MIxD1cC&Y-#nQ%t$rc1PGvzQDX6WBLZ_JM9l%>7YO?bO( zldLZIotn?*AIYi2#@IC<}JVm_^Y?209?*8*ZGRUA4zw@ zEH3tg7O-wPt&EZYX$a3V=U@LL5o~Z1_68H^D|Gm+u@sbK$k;@XjH`u=!qc?w&k-eF zwK$L?kw|mesdO*4SvarujgRM<9rK*sT|OcrZt<5$orWZ|IpYm{Z&r1pCDm`xEDmT% zdg|h){Z3nW!&4>XvgW5!0u(mWj2O1ejn5rKt6R9Z8tnFj=F&VOoSHj=Xevg(K*i`w z>^t>(U-}&saUbqWi}VaURJ~H?H~PAJ)A zK6v%Qk6^oNGU2d0kIjhKSo4Y$>U*O~2Z?<=Gji*-VWZNZCZa>h)T_Grd?e!B^4f`U z8>S;eOPCS0$2%KK&s=9+s~zTQ82z1Ug}~=%JbUfOx+&qx8@SF^=LWctqp4-}sq#*X zug>aIKkegq*SGs66z=ml&@NoJeK0?kh2#Bv!*xr(5hTflB}GMPOs=0+wG^zcj>ab$ zc|#TKt@=<#%Tc$-m*+dvnu&v&@9E*-SEy;?)YWA?tGA}bTBCC4qe&tCG%>#h zW!?1A)9w^~7H*~Xp1Fv(yBFSP;j8yoWsV$MC@O{LnQzU3`lV0AAtTG!R5p&Xfr2(TjvY`3miVm zlR((f!3t~v#0-KA>ak;|Yk^Dc^Cqq;d|Q`!czELQ$Kp<2STB^s?@ma%(sRF2@ z9{a^ksV=>XN2a|p0&;`a+{~e2SeU8R!gIkFgewM1eMwECHE(#%#0?u<5HmUJ1hjt8 zloiyVeYD1R;w+JrXyp#BH{%;L`IzRG{?zeSXWPQOt?g?6cCAuhKP}2Dmwym3FQQV* z#>CG%K8Fq?U}S2)l58DJshz?)V%B@H>1D4ZBs_U+d!9ZpTqe~=w@BjQ?p~4if+ZP9 z2ZvX_b{T2fYX8bYqf-;y;ZQK&9DT6O(bn8>G{xfFj0phiFP~ zG{c0VM}bzNIV{og%h|crF$4^IH|@f1(-Z@IJAnZOA-}(T03IO7C!Hi1xZqm!ULZOyeNPI_(Jti60$43u0>x(m#q2=?4f#fzM%sfn@ zYzbDKY9#!pV&VH!}(Fe zT86{8&i{M$MzOGAglCdwm8c;oRa3#R6C!Y*_y`H)>_F#$D8*d)QF1BMO0~ zxZB?kz0ogGJavZ z|2-rxDl9ySdeTBmNJwZUJ&x}8l}eOE`8kV3ci?}h8K!POKvfR z$=eUsD_?D9vvgfNvPpY^q3I^Zb&Ud;f{Cr=De2k9MTMj{s3xU^ETcHd7|@0#N-?Tu z{#YPdqMVR=)C`@HW(}K=lu5n`3?JK zmAi0G?#%sBg&;!nf~^5E#p+$d(af=1eKm+S2^!;89XN=XGbEZ*(IHt@lvo4SCdUHx z-o_xrkeDirF`5JDNT#LP0kjLo1AYvGN$ZyZGQpVz=i(qpKW>u>R_y~v5ym;XC@6LN@C z2XSmbYqG465jarv7LEi6cbInh@8xC92=luPo^O=BJ0b(Ni&*y-rwnMLASF6n|8!2B zr=(m!L1HVniPu2DANw`%WHboDv1{Ctdi>XFroVo;VrOLmVV`AmHdoYHMQxmPMn~dE zYgJNMVPhDA6C&8^ud($`mTejTUv?3nvM!}y17{eTFE-xLU3%6tjC z5?~(PZ7a;>8IvQv*|xc!MM0yv-u`C!Qq#|Ytrmau-uwMkbl}R4v=x}Ij7?&UDBb+p z<6R=P_PACJWxVx;Uh0Ss+Vofq-Lp}CT{2E3+7(VD4wJo!z~Q!EAGA}o#VO17T+460 z&|kde-FFz*&1}y5f~7Nv?5&lVin|pES#(^yTTHz`h*hDf$ z3Dz)Poy#%N529!C=YlQ?A|O_R0WT6h6Q!;Txhd11 z+h0uB3Dd)V9aD>XO2VK2AFRMp&mr}G7d!wY=ApE3s3=c>kTz-!kmYdB0Vj+G{s9Vq zSussJH;T$}wKTG*kb6CKw_hXjddv+mC7g)(s%qLfne56`9u1g8w>TOG3me4Q!5C&T zPxz9VvNS1G=0zG8x+p%gF_9cxnaq)gR3>P^$4c^TWAakw*Rq<#u&v?*P>Csxnlz@d zVUx7MYv*s&(Z$%6p=>t%+VU9R!8ehpoJQSH0YY;+e|Q42W|X{nrmO>_nanFuBWNTT z(HxBHj||45+@CgTY-lKWZ5yZ|dSvj6u|-ef<9b(`;i|dYlm0%0dC5H6Nw$R681@;~ zYr&C7vGL7sz z)|ZPZi@^T6^{JL49a8g6pHAFI_PCd?OI}jEIdpQ4AQEFmb8U~%eyP-N_keIfE4dT> z-g?h8=Q{d3w)OPssrebvY|t`SaHoa$t>w3x{$k!{1W(}w+8g0xbDmw_WoNw$=SJ1- z;Hucov<|mG9YriVDpX=RxGINv!)@ZSARHFZz(2}WR=$F!|FePrAOp?G{-q)On6e3Q zX;|l54ghepTe`uLJn}9@TpB;qS;3X%jd(w?#UtOl>E2eI&9^ZJIK>J|uR! zUPZcap8I59wJ(JV;bnMSIo=MRqjP(B;wP zdSc;|VM2RtG&zh>Z4P;=GM}g4jt9}ApL;4Le#y*Y=xbQ14n>447gtBR%Z6ZWms?dx zisywGF%Ca{EZC1l`Qz*i=tt6jC-;@R3A4dIRQRw-Qa`Wj*XKiMc%MHq3VQV091T{D z?!ijLrfC(+t*O1LZ-|~I8+8ao+m}Hr{oy7vJ}44iC-u|_T3>x+&MnI3S1xS=$y3w@ zNwl1@b;>I&LY|tG_&q7(X4S0>M)OkR)E!|U=es&UPOV6fBzkAM%RaEKQd8Ktkh<;e z{>n(>PF*pRLGjF&{GnTa-+d#Lx0P|$S(oRYL?Fs9_y05s{6(VhpZ9}ZtilF%S%k@%mXmPS9NVWuSluh>&Z&ym`)Hn;HZfMHQrlTn zk4yxXTETXce>uMT-T3XOvp{ueRe00dGIQR7>1&o=kFAaRCC>U}_lG(O5jnrPcX`jFTMw#S_NEECiv`H5gwq7OH6+otW(8l8GqtPZ2nUD%Y`qIEI? zWd&nrYO3Vovkqg%K^u#1_N@@kcHABT&Igu%Z&rL>fTQ2Oxf-D^g2ZuE>@GK{H}S(*N{ zHWYJXB7rdLB~x07^2o|04ib|}&7Z@l6*+jIHt;KK`AdGJxd$iGa}|_dGRd4;baPr! zlap~x5V^6jvC2o{Pio$+eSW<(g6aK!q`-%Fej!!W+T39^iE2``7vU*i@A#K+#hxSi z<^@v9ALP$V9vzzoAbJ@G3%~7w6p?sGs~Y0m+l57X0DabN^8{RpiXWI+qNeCMvw7Mhtnz`D@y$=NuV)KD~LUIdI8H38R&G z2*4JpSqmr#(s^U;yc*DJzblz}`aG2*XqY^%F;?$SM=6@HN}PET6L!E= z{U5;rak~aw6#PWvfe$@Qi~^uhRCEl?KpFHeAOw=QyLMyKm;{%y|hBqwf@aoYl_jP%T* z?qIB3yEfeL!e^>qZTF;Q^71UCO&B|KD}Jr71sl$w!|c?ii#;ZL`rcNE-&<%ljY?N` zo1n;On@1E7s(ujRteTrUYFSP=YbE`8#N%O`_R7@GG|1Qbds}NLr05<|>g<6qEc?^b zlncrh3Qv8TQjgVu5K)oNCF2!#34N!YU`%TizEO(Q*Dc7DKkg)Zh*n6|(sFj6@hN}Q z?1WmB%TMnaBd<^TROk@Gvg&n>6BmS51KwDtl^(I*q*_JA{dhnW+R5sg7AT_G_#a0X|lVzJjYK(kDB@H%)MXGxHbAXl43M{WQbC?+(6n_XyzNKyhq+n zv1!mY3*TE&Egu!a+fZ+@M>pja_~jz4>%h7{NiBRA{6en$(ZySQG}GS6Lq1;Q)U#?S z(r)jt^j@9uVC>1;=h5f~Q>Fpjy*s+vxgT4@4-oizpZfgX;n#*}t$HQ&tk2FlT6?V+ z{%-8Ns}6Yo{(WgjWRS_nV48^DS?w!TZ*(42QtgtEqaqo?R&WvvZ;%ok1?eY3D}sHQ zMToP&y`ZIJR$?ri=9PvTYF8hD0rl|-fqiIv!utW)1mWM!eMN}Z3yNMz=;wGFa?l&g zRijJ=c%YnUC;Wd*AUtxe{@--T|H27e01jY?Bkf*@S`4b5p7VK0CO^AA*2|*Uuj+(7 z+x^h2?#gHGeeBAc&g}bK<^GuOd2%|HYY{v0wv6s-W*qfK)8zDT;;LmLjY5eJHA7b4 zx=ORGgY9~94hRbJ)tQJ6xC$11*yzt_btUU1n0m$`MPi1ySAAYY)$dTDEv8?f@l1!m z>B<@*4TRsb5N$5d%^KH+TX``y%$rmU!xwwEaz(t|^(n;MIm4f8m*}5aKAkk6jFz9Z zkbb)LZnD}uHOz1?kQVn#;57Pct@t~nGez9P5U3xA=`iDHXm2CoD;up{N&=|L9AA9N zV`;sVGKzK;=WIMbY8s_kXd|qaC;_LrO$pf>Nw}wXV5xpP>dX(7EYQ6n7@ZOkr{}2? zigzH2neXLEL(pxs$}7z5y(X9EE74L_UW!^aj{XN$JBq={I73;z8o?z$6HDVWU`oLQ zADSegc}`aymY83u^UD=G8*~&*mspS2+9ub=fG55J`uvbeylE6P@;|{C90me=fG~d) zKWP4cbGv^70Qhx~GSt3)!tO$GcBO=wO2e#0`pxP`v(L04Htu5KSt!~?rn>c z25cK1`B2JY_mxe$x;5pMHD#g%-0j?F&ji(4zNoe%lMQ{oAT^2bo%8NJFqW&Uv~9;( ze||+k#Ljx6WCdjg7~Vx@?dOnwhzTX8ZMzE?*>7Z|9{c!v z2+}LP?4H}--%qe^C@<+J>qLTq&6lUev842NI*FN{AQAytAM2 zJar9tg~jL_&9*o7@mq$9jX}wwcfIzigoTwedZn|lx#nNIlhTUB9>oalRxY==)z zTVo{mrG7UV_;JOpU|V0#o9#6ia*onBvfpNn|9m!!Fe@|6C)sQ9S*P1+C_dBwPWWRd z=)>G7;XuSp&oJ*EmP|vNSlLWgaLTF?vB}k0Qq(pUE6;c{fouY4bRIrSEl}Yus^V1L9f6UwP0sRTxQF3^@s%dc)wQ zWzFV0{GEA$9Hl`ZNWgxWe9uni_k1TR7G**lQ157IS%S!+Yp}*5w0_V(&+F^LG|k^8 zx#BV4Dj5~4DEuU+Js?3)^hJ>)<;V=Z3}?5;f;7~^iZ&88waO%I&&kuj6PM&&o*Vwf z;IXB6wBPJF7O|r7OZqR_&%o;7Z^OGQ-$7+8LC7x2WS6q~ZHHL0+L-zyf{w;-W>~Ff zCW!`bXCcPs4T2+MI+(8cbqxZ~M2{RA&%v7}J91wDB^HJF$HD*37@-9W&^XZ_*Kdjm zw^RTP{@NvY@<<^HLcQ4zY}NN)pbHngzAH9tdcp z*GqPIf;E1{b|!oA+2XmU-+hQMs4)@oevW^c-#->?iZuFg_Eg)}_P!}cB!v9#1j6Aj-ArmQ!q%IJ zQq9ljm)Fv^OLwNGFWIwW{vsUd* z*)Ot@!vTZKWwUUdaKg)49vmI(hWE0nDN!lJ@&Fu53_$T5utibOIIzH9{{atm;RHCQ zg5Cb9od4%m>}d}Fm8u58gungP+MfyhWOUIvVb{a!zHM8R>sn8Ikv-5-DHp^VXREQ= zJSta>@Uri6O+XWkG-!26n!-lh>`jdz8GYkSM6gp>APN{|L^2rtHXnNJDjPr% zUfso8TN2wwjb=(CZ9&-?WM@R|+Q-xY-FqurfvSkQxRkQyq0;p8$Q$3mBk?X+miQd) zqQkNJb0c!UOR$;OWFlE6+0fvi?DEwj!poF^#^)r8KSFpKvftdi;*0IT7oDA}bT{_9 z*=Zvx&Lb|J+a z`iYLmJW|_e(!spv8)ykhle}U%XpK^g^Nsv;wv)*4XH@KYJvs2BN>tq07S8&X%+~J- z;|++g&;z6OZt zEY1|XFCPj7#R#(*8#Qat|>EXp++b`uPPqOjV6 z(<|!cuC-ZdDE!+z`cUju* zEaYuEg^YE~4FjbGL{vVjVF?i|EF5N9up+8R%ac34TU65ZCMJzSZ0nm2(^H}{ZNfyXSUFg3D9}V*mfbcv{?;i<{5#>xEq^ z3dU^*eOXY%HbD~fKp@Mn3Noxg({O1Ha~D-gbT{Z79m#xWCjsFzYJH5n@mNT1oL)k^ zVc%38H$?rmLZ;5utH{#qpF)cQ&oay@|mq^BcuE zPn5HvOuTMSd0aKe8GoOl%E{hdp_uonI6FH#-;bT3T4VO)Vl8ngZ%JO^H7}cZpR)Z; zxq4$KGd#lH7x>3FCe$%7kH{C1&fqLY(>S;D)t_<%eJ0x=5nv&T{Q86!_FMt>O)~7A z-5C}#`h_$N%$R-q)oFFVg~$`kOu9j=ByIntG;js6S&sf-o4k&^U=L`w!(+GEryh-j zqUn`>8Wz=JI^_@A;b1y;=?5Xfdt9*TVE}r%^TxvA&0xDz3ShOUVRAsU84JTE+zE(= z*})U2+X~V0&{j;qmjj8@Cy*$If1zi-`XJ~|5!$H_a722by;sEH`+d&l%1E#N6W>4i z11DW&R+!t#udjOG`xV$%d$P!t0Dj&bMjCXmtOfUOYV~2bu)i@gt(&8f}Xc;%0 zn#;sg@dCS^66zCfU5i$-_{w4H;i~g~>7{$eMQA!>8VFr{bs1={ixc;B9oUyhk9)f3 zcymEx$(ZeKOt44+y0+jlPva4rRhCk|z?b!fK@)3OZ|VHNe#He?tsGbNK`5F7C{pPE zKTLgfTvPw|zak+e5&}{Kq?GPvgosF6pwg|BG*Y9HPU#c{18Jp87@eXtj2PV|494#7 zZutIufB($I^`VdFJ+Bkb^E~GwP-{9HHff_)f8XP4JV^|)TwzZenRDO`zzZF@kzDL$ z(@*WLSe|*~9wy%w^=4otkxx%)aRDFJJ4KU8ZA{UhN7v*1QpY~^)yW(sW5?n=^s{+e zA!U?h$qHmtq`iKQ;eOXG%2a%V<-4Z>i@Jh^R_S9ZA{e%SZD|WQtgEz~kh&rVkk&77 z5Yj1Kf$p;LVv6XmO|@JyjN`&;dYm;bf;z-Jp^p<#qC@36Ccrp>8bW1En;h;wfUVoV z|L8U-N*}xd=OMPPyP@a;2h&U7EjzDE1Xdy7n;DZQ`z9;1wXQZ(0e=tye=55*_*V@c zONINf_ndDU%M1RJY$PlA*vxiY=80)^UY{*KVIBI?fd-c#rLB52|hth<_hX=9s06pb#$M83fgFZMALH0zDH9V%(Q)&uZ}xN6ERq|IK1{DB*`8~h#^8`un`6HTpM{v7!NKHyXY#^&*1zPHgLdp^WTsE- z(XkNVAv@RWHU%5o`z+kFFjiPUeTCGHeIfd`xt=yNcQe1*t_vKaZB<`>8Txi|D#amFrWdaK za?D%QNrKMgE#*iHjOSE@p*X~PtTVkok4T8Bjb(>-e8dA2$zm&1GG36qZ2fj*4vJ5- zY%1&#LxLvW;~Riw(v7-;Plz|ZZ0h%*%oSYJ1KnyMFY;sN^T@A#$M&5JbK_*E{C3T@ zRdK$BlApjPOjt5==bU=%drV78@S9o2c_A3GIt2W$_r6@bZ2o~uW|gKU&XsdIu4iug zLW}i(b)hm?G!`)acYi2WLCqaDN3O@-D=AK35&R6XP{W2AL^HTO85lp&m%hV3l9|f^ zJf!;Svr9rIn6l?^WNMhmF59bzNchr7*}LpSOBY|HR62YaSxe0=Tu5ugk42_>qUg z+=*#5-BsZryP&!UE)<80->4i^YcmGnzTi%A#$G;~mePJiR1~SSwDj=e;^MVx#XZF# zmHY}j0#a&PVKGX(Pa#3pE9GS*VjX%W8ukOD97W>WCVBZC8{_fiHv>#KqhE+OevbHU z)HD?0b0b=d@@Ue)fb{Yd{=z)NomFrhqj}c&4ntPhJ-%BV;~_%O*TQ{XH=%jWQ=oXqy?(t270=6w ze7<5M_Geq4SQ8f!LUF=uEargY70^9_??_QQ;M}of5BzEg@j5$TM2Gzv5`)tP!QS5f zSK=67L0RKi8rTU&bg`M`i2G`@v#$$#?~SX(Gwv}u&8D~1dlsG-_Nd$%$v2CB&n#m( zZoV*xxe;$SQDpjd(n{+(vNBu3~UkkLI zcJUFpBtPil7tt!HiZWH#slxRFjL&g>MP5b+(?L1kW9z*Q)aP4}h5B7XzV&NM*y8c@ z>&k*J6M;|98~X-_Pm1NrFEq@3D3om9o95OEM^dFN=_s1od$Sq)8O9U9N4h;U=t``5 z!G~w@x=@m;4zuO>T*})skeRF)m*-27fo8RPkz>wJ-$QJ}uNL3#iuAWLyhSZfG915j z^y>1|kO!oJ*1x%ZqGX>^w)-T!kig|}Ve$h;hicB=?<_*A+4Q8f#K3I6-3ek^ae3%C z<<{BmTy^hGpB~m70rue&?~xD(Y$tRG0)7*U)}Y5(`+rF=LY4R8u7I*%X7Chv7Ivso zEaIw9BxLbVC&9DpPWu#1({HgZE9C`XJQZM-WQT8_EOdz>XzB{v2>y3yGV`_?^UUR& z&pxCx7gi!8WU{M`Y+ka{7?7)z=+KuhcW^~ZE?c1+ThJ>fX5E=n3aeaJ4Z+F&%m zeLZ?i741#DP99scG5;3xWqFZfwH3WyA=WO>^Q0?b`wETif%p-^#VAaLcgA17G-U;O z__(xYIO^cQuUHV7=sS5BU&@d%R24-P`RzxDYw24W6X6Fbu90vXa82gf0+Ni#NEFE5 zzQe@B$lWKyr;rKpBXY71Ukg#D@2owrL+Px?&1Kl2bp&J>&9;~0y4*p9$yN*neG*K? z<{63!vgwQYdarr$%8j0?>BOO`Q+Gl3{>I|Z4~CNDhpNOYf3ZF?R*prYRa|LTV9sDg z_B6V)#lAxZ1a9M35K9V?uI9LZ*6;ZYJOVZzS8-GY90qRc$~W%_$Il8-S7B2P!GY?FeW zSR>&tuNcei78peI;*kfsx~z+%)!T%OX`XWRQUB&XAU~6C^FmO5xXvAYW%62if1&^h zGyLu;v_40`8sKyGRkzgfUfx-}f3+WJ`KT?XruB}7M~M8RS9?sTPf9U^w?Zi6YEaiL zBs#V;OV`0Z85+&BWLn;d>OG3~uPQfslsW17;z!Wpc7ZVup&r6r^~+sGMT%3KPy}1B zDxgxEfPl*F& z+Dr^9^UvR!B&mD6=N_?BOR(FQl0FV*wK3Z~LJ$5hkQ+l2`J|w~7D`t%U-2lxTaX_XYPDz&pY#jV&sC!9fvbTom90tgoOvogeP+T-&E`4RXM_ zDbzFtJCFo%uutU&Pmb5ZNwe!p?6mhh1{{6PZ90g}$;};uVw>}f8c6hJvEgsKzkbd7 z>*u|_y<0Y8>w{%~$Z!8Cm(Q~LLbC09?0rP-dA3Vi=J@Hxr}G>g|7IaPkqVAD;xRM1 z{b5(AM(X3xniju56~*DbAN|U6DWf|+evNY_@U`1(@%n3LtDmOd9+$A%Cf>}9tRdO(XhuKev~_|m5&)iHuUbh+osgnJ%YM$WH6J$#nY-eq^D zz!6)OIkRKerqRJ~UEMrihGX#-#cx8wWT}~WsUltNFOfE;jU+X30^eAx?WBSHfT?kg zYtQy1Za%wHifX9M&^FF|iUh*FG$85p zN?if7us$Imvr=mbZm++tA0g5XrRhhj^eNw$2UJ#$Ks_%ZWw(ZTpB@{afz?Qbfp(!V^C@+nyK-Xw<1tXFrFNERoJq zVCvtvBc>DTV$68oI6KY+tlSyQr&q~B5_&&;lQ7Nm0e($T_I&u$yBwtVXGRLx>EEfP z%}slRn^Ytw*^`g~kLcK9k%oT5@^56-+LX(q1^1-OhyuQ`4~|2YJ)0Vm-JLvg_)KL` zq*dd#$6w$kT5EdOW)^-Ao~gB+9$I^*p`Fn!UAa)S&4pAj z9NUQM2A)%Z{zwqaPyyceqW;os=6z9MTP{%kOGt0HmZ zdeC=XSvjh(mqRj&Oazlq=a+!C!yH-ne=1b(z%Nhug#zSAf=zD46 zl;vl5ePKUW8DtDimhSz8Rev>+)$PhYS6At?RC6rI`h1@dHFi*Hc61A98`wbQc6wtx z-_%8_7&HW}BHjY=6mywe7%MgXD|f^vImh;P{E|$g?0&w^fj{I}geCH>1ydqrdw#m# zUkU5rAq9%EK<*ZnABANPaUP2sUg8*n-Dn@V=q^W=Z3cQ#egW4_0K{fNCO|Bgn$rXigqiLZ`a4jt9u zBq7J~$eZi+_LO?#_pg;!ma3HL7xZ&!)8+961$C??D(|{S)dtqf@?>0@hM7O4vwPot z0%z(@>|N%p){6ak98oA$o&BkAZ?e0|rG9x^2jS01Q_G~uOhqCxme; za7Pr7k(bhR5hj>By8}6sqHHdBu^)b;wOnMXs%H%^Hie@Zc}Y+dP=MqcuDO(~R~@@+ zUi%@qod8TIRBD8v7rj6!5}{QPjT6$Cam6vSN^Jw;nL%p9jFg9)dCh$m@aW|T0& zTTwnp*pIU&7+(_C(@Oq@(^%ukX+qK6bmG*e-Ny zV{(k#V8zD9+r{M}Lg2Ba?H@_&H7lRC(QoG~WX@mwT%B5fo|%^VdEN}eq(#$KVSJ(@ zHYqoqO{iuVsAbAYcihukxsN>xJ!V%{v&xp^?q;{@GSN{S^h42Oba?vNp|5_yWadg&mE%@JKx`HaGWb#p znGqha%5WMa&9Iq}r$#69RM-_E9B!u7kpB(_Of?QykMCMz+G^SOAI|jm;AB(CzF^+tv!H zpy0-fimV*+_L=vTa%DFM!pVj7eHWw_f6kL|`Hm)OL1RVl{~2V~4S~b=WHND@~N2rJG3mboVHmvR&p%S!Zp{pUJc`sC)Qre(Q?BH^+Y4-1KP6pfD9H;NdE_B0KaHYwOLg7*mR0~kHJ3v>3ZQdN#s_Zt6cNG#FpgK4WaQeM~75R#${X5M`k~8M}dkgJuAK{=69#18NfM2p+U_ zT}#cP4e)Bd$<7vGE>a)LWAW(e`Lu+|pK7!0+}zZ!&E6&3;{?%0AD$GO@I{HOzpX3U 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 literal 0 HcmV?d00001 diff --git a/media/druid_logo.png b/media/druid_logo.png index 6b5174b552c992b2ec60baca2d1c2718b1d2fcfd..4f3c65cfca5802321f437168a2c9e0d23a695557 100644 GIT binary patch literal 503634 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ℑ>}(a>ij1Ix{K*^O#yPTd7~V*(A7Gd-BS6+1 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

    Hztf8ZbH)pxYA@aEZ5dR|Mf8ZeZ= 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
    5XuVkO`IPQAAel*Q)(~+6SIdfTR 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 IVe-}g12)dtJv#sK~#7F?EQIm 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

    @0JsekXX{vPRCxuTVG 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

    p805wT^G) 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 O0000 Date: Sat, 5 Oct 2024 01:40:46 +0300 Subject: [PATCH 24/45] Update annotations, fix rare errors --- druid/annotations.lua | 9 +++- druid/base/scroll.lua | 2 +- druid/custom/rich_text/module/rt.lua | 55 +++++++++++----------- druid/custom/rich_text/module/rt_parse.lua | 2 +- druid/custom/rich_text/rich_text.lua | 18 +++++++ 5 files changed, 55 insertions(+), 31 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index a25439b..1f5cc41 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1846,19 +1846,24 @@ function helper.table_to_string(t) end ---@class druid.rich_text.word ---@field node node ---@field relative_scale number +---@field adjust_scale number ---@field color vector4 ---@field position vector3 ---@field offset vector3 ---@field scale vector3 ---@field size vector3 ---@field metrics druid.rich_text.metrics ----@field pivot number @ The gui.PIVOT_* constant +---@field pivot userdata @ The gui.PIVOT_* constant ---@field text string +---@field source_text string +---@field text_color vector4 ---@field shadow vector4 ---@field outline vector4 ---@field font string ---@field image druid.rich_text.image +---@field image_color vector4 ---@field default_animation string +---@field default_texture string ---@field anchor number ---@field br boolean ---@field nobr boolean @@ -1880,8 +1885,10 @@ function helper.table_to_string(t) end ---@field image_pixel_grid_snap boolean ---@field combine_words boolean ---@field default_animation string +---@field default_texture string ---@field node_prefab node ---@field text_prefab node +---@field is_multiline boolean ---@class GUITextMetrics ---@field width number diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index fa99ce1..068386d 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -351,7 +351,7 @@ function Scroll.set_size(self, size, offset) end ---- Set scroll view size. +--- Set new scroll view size in case the node size was changed. -- @tparam Scroll self @{Scroll} -- @tparam vector3 size The new size for view node -- @treturn druid.scroll Current scroll instance diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 10ff471..7531ebb 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -71,10 +71,10 @@ function M.length(text) end ----@param word rich_text.word ----@param previous_word rich_text.word|nil ----@param settings rich_text.settings ----@return rich_text.metrics +---@param word druid.rich_text.word +---@param previous_word druid.rich_text.word|nil +---@param settings druid.rich_text.settings +---@return druid.rich_text.metrics local function get_text_metrics(word, previous_word, settings) local text = word.text local font_resource = gui.get_font_resource(word.font) @@ -117,7 +117,8 @@ end ---@return druid.rich_text.metrics local function get_image_metrics(word, settings) local node_prefab = settings.node_prefab - gui.play_flipbook(node_prefab, word.image.anim) + gui.set_texture(node_prefab, word.image.texture or settings.default_texture) + gui.play_flipbook(node_prefab, word.image.anim or settings.default_animation) local node_size = gui.get_size(node_prefab) local aspect = node_size.x / node_size.y node_size.x = word.image.width or node_size.x @@ -145,8 +146,9 @@ end --- @param text string The text to create rich text nodes from --- @param settings table Optional settings table (refer to documentation for details) --- @param style druid.rich_text.style ---- @return words ---- @return metrics +--- @return druid.rich_text.word[] +--- @return druid.rich_text.settings +--- @return druid.rich_text.lines_metrics function M.create(text, settings, style) assert(text, "You must provide a text") @@ -171,10 +173,9 @@ function M.create(text, settings, style) outline = settings.outline, font = font, -- Image params - ---@type rich_text.word.image + ---@type druid.rich_text.image image = nil, image_color = gui.get_color(settings.node_prefab), - default_animation = nil, -- Tags br = nil, nobr = nil, @@ -237,9 +238,6 @@ function M._split_on_lines(words, settings) if word == nil then break end - if word.image then - word.default_animation = settings.default_animation - end -- Reset texts to start measure again word.text = word.source_text @@ -308,9 +306,9 @@ function M._split_on_lines(words, settings) end ----@param lines rich_text.word[][] ----@param settings rich_text.settings ----@return rich_text.lines_metrics +---@param lines druid.rich_text.word[][] +---@param settings druid.rich_text.settings +---@return druid.rich_text.lines_metrics function M._position_lines(lines, settings) local lines_metrics = M._get_lines_metrics(lines, settings) -- current x-y is left top point of text spawn @@ -355,9 +353,9 @@ function M._position_lines(lines, settings) end ----@param lines rich_text.word[][] ----@param settings rich_text.settings ----@return rich_text.lines_metrics +---@param lines druid.rich_text.word[][] +---@param settings druid.rich_text.settings +---@return druid.rich_text.lines_metrics function M._get_lines_metrics(lines, settings) local metrics = {} local text_width = 0 @@ -389,7 +387,7 @@ function M._get_lines_metrics(lines, settings) } end - ---@type rich_text.lines_metrics + ---@type druid.rich_text.lines_metrics local lines_metrics = { text_width = text_width, text_height = text_height, @@ -400,8 +398,8 @@ function M._get_lines_metrics(lines, settings) end ----@param lines rich_text.word[][] ----@param settings rich_text.settings +---@param lines druid.rich_text.word[][] +---@param settings druid.rich_text.settings function M._update_nodes(lines, settings) for line_index = 1, #lines do local line = lines[line_index] @@ -411,7 +409,8 @@ function M._update_nodes(lines, settings) if word.image then node = word.node or gui.clone(settings.node_prefab) gui.set_size_mode(node, gui.SIZE_MODE_MANUAL) - gui.play_flipbook(node, hash(word.image.anim or word.default_animation)) + gui.set_texture(node, word.image.texture or settings.default_texture) + gui.play_flipbook(node, hash(word.image.anim or settings.default_animation)) gui.set_color(node, word.color or word.image_color) else node = word.node or gui.clone(settings.text_prefab) @@ -432,10 +431,10 @@ function M._update_nodes(lines, settings) end ----@param words rich_text.word[] ----@param settings rich_text.settings +---@param words druid.rich_text.word[] +---@param settings druid.rich_text.settings ---@param scale number ----@return rich_text.lines_metrics +---@return druid.rich_text.lines_metrics function M.set_text_scale(words, settings, scale) settings.adjust_scale = scale @@ -499,15 +498,15 @@ function M.adjust_to_area(words, settings, lines_metrics, style) end ----@return boolean @If we fit into area size +---@return druid.rich_text.word[][] lines function M.apply_scale_without_update(words, settings, scale) settings.adjust_scale = scale return M._split_on_lines(words, settings) end ----@param lines rich_text.word[][] ----@param settings rich_text.settings +---@param lines druid.rich_text.word[][] +---@param settings druid.rich_text.settings function M.is_fit_info_area(lines, settings) local lines_metrics = M._get_lines_metrics(lines, settings) local area_size = gui.get_size(settings.parent) diff --git a/druid/custom/rich_text/module/rt_parse.lua b/druid/custom/rich_text/module/rt_parse.lua index 69f9216..53d42a6 100755 --- a/druid/custom/rich_text/module/rt_parse.lua +++ b/druid/custom/rich_text/module/rt_parse.lua @@ -149,7 +149,7 @@ function M.parse(text, default_settings, style) end -- parse the tag, split into name and optional parameters - local endtag, name, params, empty = tag:match("<(/?)(%a+)=?(%S-)(/?)>") + local endtag, name, params, empty = tag:match("<(/?)([%a_]+)=?(%S-)(/?)>") local is_endtag = endtag == "/" local is_empty = empty == "/" diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index ea9b97d..cf83f2a 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -210,7 +210,15 @@ function RichText.set_text(self, text) end +function RichText.get_text(self) + return self._last_value +end + + function RichText:on_remove() + pcall(gui.set_texture, self.icon_prefab, self._settings.default_texture) + pcall(gui.play_flipbook, self.icon_prefab, self._settings.default_animation) + self:clear() end @@ -238,6 +246,15 @@ function RichText.tagged(self, tag) end +---Split a word into it's characters +-- @tparam RichText self @{RichText} +-- @tparam druid.rich_text.word word +-- @treturn druid.rich_text.word[] characters +function RichText.characters(self, word) + return rich_text.characters(word) +end + + --- Get all current words. -- @treturn table druid.rich_text.word[] function RichText:get_words() @@ -277,6 +294,7 @@ function RichText:_create_settings() node_scale = gui.get_scale(self.icon_prefab), image_scale = gui.get_scale(self.icon_prefab), default_animation = gui.get_flipbook(self.icon_prefab), + default_texture = gui.get_texture(self.icon_prefab), } end From 4a8bb214d2da6f65028f6073c861a7ba6be16e02 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 5 Oct 2024 02:07:53 +0300 Subject: [PATCH 25/45] Update --- druid/annotations.lua | 205 +++++++++++++++++++------ druid/component.lua | 4 +- druid/custom/rich_input/rich_input.lua | 3 - druid/event.lua | 6 +- druid/extended/data_list.lua | 2 +- 5 files changed, 160 insertions(+), 60 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 1f5cc41..d6a453d 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -63,8 +63,10 @@ function druid__base_component.get_context(self) end --- Get Druid instance for inner component creation. ---@param self druid.base_component @{BaseComponent} +---@param template string|nil The template name +---@param nodes table|nil The nodes table ---@return druid_instance Druid instance with component context -function druid__base_component.get_druid(self) end +function druid__base_component.get_druid(self, template, nodes) end --- Return component input priority ---@param self druid.base_component @{BaseComponent} @@ -310,13 +312,11 @@ function druid__checkbox_group.set_state(self, indexes, is_instant) end ---@class druid.data_list : druid.base_component ---@field grid druid.static_grid|druid.dynamic_grid The Druid Grid component ----@field last_index number The current visual last data index ---@field on_element_add druid.event On DataList visual element created Event callback(self, index, node, instance) ---@field on_element_remove druid.event On DataList visual element created Event callback(self, index) ---@field on_scroll_progress_change druid.event Event triggered when scroll progress is changed; event(self, progress_value) ---@field scroll druid.scroll The Druid scroll component ---@field scroll_progress number The current progress of scroll posititon ----@field top_index number The current visual top data index local druid__data_list = {} --- Clear the DataList and refresh visuals @@ -338,24 +338,11 @@ function druid__data_list.get_created_nodes(self) end ---@return table The current data array function druid__data_list.get_data(self) end ---- Return first index from data. ---- It not always equals to 1 ----@param self druid.data_list @{DataList} -function druid__data_list.get_first_index(self) end - --- Return index for data value ---@param self druid.data_list @{DataList} ---@param data table function druid__data_list.get_index(self, data) end ---- Return last index from data ----@param self druid.data_list @{DataList} -function druid__data_list.get_last_index(self) end - ---- Return amount of data ----@param self druid.data_list @{DataList} -function druid__data_list.get_length(self) end - --- The @{DataList} constructor ---@param self druid.data_list @{DataList} ---@param scroll druid.scroll The @{Scroll} instance for Data List component @@ -526,20 +513,33 @@ local druid__event = {} function druid__event.clear(self) end --- DruidEvent constructor +---@param callback function|nil Subscribe the callback on new event, if callback exist +---@param callback_context any|nil Additional context as first param to callback call +function druid__event.create(callback, callback_context) end + +--- Return true, if event not have handler ---@param self druid.event @{DruidEvent} ----@param initial_callback function|nil Subscribe the callback on new event, if callback exist -function druid__event.initialize(self, initial_callback) end +---@return boolean True if event not have handlers +function druid__event.is_empty(self) end --- Return true, if event have at lease one handler ---@param self druid.event @{DruidEvent} ---@return boolean True if event have handlers function druid__event.is_exist(self) end +--- Check is event subscribed. +---@param self druid.event @{DruidEvent} +---@param callback function Callback itself +---@param callback_context any|nil Additional context as first param to callback call +---@return boolean, number|nil @Is event subscribed, return index of callback in event as second param +function druid__event.is_subscribed(self, callback, callback_context) end + --- Subscribe callback on event ---@param self druid.event @{DruidEvent} ---@param callback function Callback itself ----@param context any|nil Additional context as first param to callback call, usually it's self -function druid__event.subscribe(self, callback, context) end +---@param callback_context any|nil Additional context as first param to callback call, usually it's self +---@return boolean True if callback was subscribed +function druid__event.subscribe(self, callback, callback_context) end --- Trigger the event and call all subscribed callbacks ---@param self druid.event @{DruidEvent} @@ -549,8 +549,8 @@ function druid__event.trigger(self, ...) end --- Unsubscribe callback on event ---@param self druid.event @{DruidEvent} ---@param callback function Callback itself ----@param context any|nil Additional context as first param to callback call -function druid__event.unsubscribe(self, callback, context) end +---@param callback_context any|nil Additional context as first param to callback call +function druid__event.unsubscribe(self, callback, callback_context) end ---@class druid.hotkey : druid.base_component @@ -591,13 +591,15 @@ local druid__hotkey__style = {} ---@field node node Hover node ---@field on_hover druid.event On hover callback(self, state, hover_instance) ---@field on_mouse_hover druid.event On mouse hover callback(self, state, hover_instance) +---@field style druid.hover.style Component style params. local druid__hover = {} --- The @{Hover} constructor ---@param self druid.hover @{Hover} ---@param node node Gui node ---@param on_hover_callback function Hover callback -function druid__hover.init(self, node, on_hover_callback) end +---@param on_mouse_hover function On mouse hover callback +function druid__hover.init(self, node, on_hover_callback, on_mouse_hover) end --- Return current hover enabled state ---@param self druid.hover @{Hover} @@ -639,22 +641,37 @@ function druid__hover.set_hover(self, state) end function druid__hover.set_mouse_hover(self, state) end +---@class druid.hover.style +---@field ON_HOVER_CURSOR string Mouse hover style on node hover +---@field ON_MOUSE_HOVER_CURSOR string Mouse hover style on node mouse hover +local druid__hover__style = {} + + ---@class druid.input : druid.base_component ---@field allowerd_characters string|nil Pattern matching for user input ---@field button druid.button Button component +---@field current_value string Current input value with marked text +---@field cursor_index number The cursor index. +---@field end_index number Theselection end index. ---@field is_empty boolean Is current input is empty now ---@field is_selected boolean Is current input selected now ---@field keyboard_type number Gui keyboard type for input field +---@field marked_text_width number Marked text width +---@field marked_value string Marked text for input field. ---@field max_length number|nil Max length for input text ---@field on_input_empty druid.event On input field text change to empty string callback(self, input_text) ---@field on_input_full druid.event On input field text change to max length string callback(self, input_text) ----@field on_input_select druid.event On input field select callback(self, button_node) +---@field on_input_select druid.event On input field select callback(self, input_instance) ---@field on_input_text druid.event On input field text change callback(self, input_text) ----@field on_input_unselect druid.event On input field unselect callback(self, input_text) ----@field on_input_wrong druid.event On trying user input with not allowed character callback(self, params, button_instance) ----@field on_select_cursor_change druid.event On cursor position change callback(self, cursor_index, selection_start_index, selection_end_index) +---@field on_input_unselect druid.event On input field unselect callback(self, input_text, input_instance) +---@field on_input_wrong druid.event On trying user input with not allowed character callback(self, params, input_text) +---@field on_select_cursor_change druid.event On cursor position change callback(self, cursor_index, start_index, end_index) +---@field previous_value string Previous input value +---@field start_index number The selection start index. ---@field style druid.input.style Component style params. ---@field text druid.text Text component +---@field text_width number Text width +---@field value string Current input value local druid__input = {} --- Return current input field text @@ -662,6 +679,12 @@ local druid__input = {} ---@return string The current input field text function druid__input.get_text(self) end +--- Replace selected text with new text +---@param self druid.input @{Input} +---@param text string The text to replace selected text +---@return string New input text +function druid__input.get_text_selected_replaced(self, text) end + --- The @{Input} constructor ---@param self druid.input @{Input} ---@param click_node node Node to enabled input component @@ -669,8 +692,16 @@ function druid__input.get_text(self) end ---@param keyboard_type number|nil Gui keyboard type for input field function druid__input.init(self, click_node, text_node, keyboard_type) end +--- Change cursor position by delta +---@param self druid.input @{Input} +---@param delta number side for cursor position, -1 for left, 1 for right +---@param is_add_to_selection boolean (Shift key) +---@param is_move_to_end boolean (Ctrl key) +function druid__input.move_selection(self, delta, is_add_to_selection, is_move_to_end) end + --- Reset current input selection and return previous value ---@param self druid.input @{Input} +---@return druid.input Current input instance function druid__input.reset_changes(self) end --- Select input field. @@ -678,6 +709,14 @@ function druid__input.reset_changes(self) end ---@param self druid.input @{Input} function druid__input.select(self) end +--- Set cursor position in input field +---@param self druid.input @{Input} +---@param cursor_index number|nil Cursor index for cursor position, if nil - will be set to the end of the text +---@param start_index number|nils Start index for cursor position, if nil - will be set to the end of the text +---@param end_index number|nil End index for cursor position, if nil - will be set to the start_index +---@return druid.input Current input instance +function druid__input.select_cursor(self, cursor_index, start_index, end_index) end + --- Set allowed charaters for input field. --- See: https://defold.com/ref/stable/string/ ex: [%a%d] for alpha and numeric ---@param self druid.input @{Input} @@ -707,7 +746,6 @@ function druid__input.unselect(self) end ---@field IS_LONGTAP_ERASE boolean Is long tap will erase current input data. Default: false ---@field IS_UNSELECT_ON_RESELECT boolean If true, call unselect on select selected input. Default: false ---@field MASK_DEFAULT_CHAR string Default character mask for password input. Default: *] ----@field NO_CONSUME_INPUT_WHILE_SELECTED boolean If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false ---@field button_style table Custom button style for input node ---@field on_input_wrong function (self, button_node) Callback on wrong user input ---@field on_select function (self, button_node) Callback on input field selecting @@ -937,7 +975,7 @@ function druid__radio_group.init(self, nodes, callback, click_nodes) end function druid__radio_group.set_state(self, index, is_instant) end ----@class druid.rich_input : druid.input +---@class druid.rich_input ---@field cursor node On input field text change to empty string callback(self, input_text) ---@field druid druid_instance The component druid instance ---@field input druid.input On input field text change callback(self, input_text) @@ -945,9 +983,8 @@ function druid__radio_group.set_state(self, index, is_instant) end ---@field root node Root node local druid__rich_input = {} ---- GSet input field text +--- Set input field text ---@param self druid.rich_input @{RichInput} ----@return string Current input text function druid__rich_input.get_text(self) end --- The @{RichInput} constructor @@ -956,6 +993,10 @@ function druid__rich_input.get_text(self) end ---@param nodes table Nodes table from gui.clone_tree function druid__rich_input.init(self, template, nodes) end +--- Select input field +---@param self druid.rich_input @{RichInput} +function druid__rich_input.select(self) end + --- Set allowed charaters for input field. --- See: https://defold.com/ref/stable/string/ ex: [%a%d] for alpha and numeric ---@param self druid.rich_input @{RichInput} @@ -963,18 +1004,35 @@ function druid__rich_input.init(self, template, nodes) end ---@return druid.rich_input Current instance function druid__rich_input.set_allowed_characters(self, characters) end +--- Set input field font +---@param self druid.rich_input @{RichInput} +---@param font hash The font hash +---@return druid.input Current input instance +function druid__rich_input.set_font(self, font) end + --- Set placeholder text ---@param self druid.rich_input @{RichInput} ----@param placeholder_text string|nil The placeholder text ----@return druid.rich_input Current instance +---@param placeholder_text string The placeholder text function druid__rich_input.set_placeholder(self, placeholder_text) end +--- Set input field text +---@param self druid.rich_input @{RichInput} +---@param text string The input text +---@return druid.input Current input instance +function druid__rich_input.set_text(self, text) end + ---@class druid.rich_text : druid.base_component ---@field druid druid_instance The component druid instance ---@field style druid.rich_text.style Component style params. local druid__rich_text = {} +--- Split a word into it's characters +---@param self druid.rich_text @{RichText} +---@param word druid.rich_text.word +---@return druid.rich_text.word[] characters +function druid__rich_text.characters(self, word) end + --- Clear all created words. function druid__rich_text.clear() end @@ -994,7 +1052,7 @@ function druid__rich_text.init(self, template, nodes) end --- Set text for Rich Text ---@param self druid.rich_text @{RichText} ----@param text string|nil The text to set +---@param text string |nil The text to set ---@return druid.rich_text.word[] words ---@return druid.rich_text.lines_metrics line_metrics function druid__rich_text.set_text(self, text) end @@ -1014,7 +1072,7 @@ local druid__rich_text__style = {} ---@class druid.scroll : druid.base_component ----@field _is_inert bool Flag, if scroll now moving by inertion +---@field _is_inert boolean Flag, if scroll now moving by inertion ---@field available_pos vector4 Available position for content node: (min_x, max_y, max_x, min_y) ---@field available_size vector3 Size of available positions: (width, height, 0) ---@field content_node node Scroll content node @@ -1131,6 +1189,12 @@ function druid__scroll.set_size(self, size, offset) end ---@return druid.scroll Current scroll instance function druid__scroll.set_vertical_scroll(self, state) end +--- Set new scroll view size in case the node size was changed. +---@param self druid.scroll @{Scroll} +---@param size vector3 The new size for view node +---@return druid.scroll Current scroll instance +function druid__scroll.set_view_size(self, size) end + ---@class druid.scroll.style ---@field ANIM_SPEED number|nil Scroll gui.animation speed for scroll_to function. Default: 2 @@ -1149,7 +1213,7 @@ local druid__scroll__style = {} ---@class druid.slider : druid.base_component ----@field dist number Length between start and end position +---@field dist vector3 Length between start and end position ---@field end_pos vector3 End pin node position ---@field is_drag boolean Current drag state ---@field node node Slider pin node @@ -1167,12 +1231,22 @@ local druid__slider = {} ---@param callback function|nil On slider change callback function druid__slider.init(self, node, end_pos, callback) end +--- Check if Slider component is enabled +---@param self druid.slider @{Slider} +---@return boolean +function druid__slider.is_enabled(self) end + --- Set value for slider ---@param self druid.slider @{Slider} ---@param value number Value from 0 to 1 ---@param is_silent boolean|nil Don't trigger event if true function druid__slider.set(self, value, is_silent) end +--- Set Slider input enabled or disabled +---@param self druid.slider @{Slider} +---@param is_enabled boolean +function druid__slider.set_enabled(self, is_enabled) end + --- Set input zone for slider. --- User can touch any place of node, pin instantly will move at this position and node drag will start. This function require the Defold version 1.3.0+ ---@param self druid.slider @{Slider} @@ -1285,6 +1359,20 @@ function druid__static_grid.set_anchor(self, anchor) end ---@return druid.static_grid Current grid instance function druid__static_grid.set_in_row(self, in_row) end +--- Set new node size for grid +---@param self druid.static_grid @{StaticGrid} +---@param width number The new node width +---@param height number The new node height +---@return druid.static_grid Current grid instance +function druid__static_grid.set_item_size(self, width, height) end + +--- Set new items to the grid. +--- All previous items will be removed +---@param self druid.static_grid @{StaticGrid} +---@param nodes node[] The new grid nodes +---@param is_instant boolean If true, update node positions instantly +function druid__static_grid.set_items(self, nodes, is_instant) end + --- Change set position function for grid nodes. --- It will call on update poses on grid elements. Default: gui.set_position ---@param self druid.static_grid @{StaticGrid} @@ -1292,6 +1380,12 @@ function druid__static_grid.set_in_row(self, in_row) end ---@return druid.static_grid Current grid instance function druid__static_grid.set_position_function(self, callback) end +--- Sort grid nodes by custom comparator function +---@param self druid.static_grid @{StaticGrid} +---@param comparator function The comparator function. (a, b) -> boolean +---@return druid.static_grid Current grid instance +function druid__static_grid.sort_nodes(self, comparator) end + ---@class druid.static_grid.style ---@field IS_ALIGN_LAST_ROW boolean|nil If true, always align last row of the grid as grid pivot sets. Default: false @@ -1349,9 +1443,15 @@ local druid__text = {} ---@return number The current text adjust type function druid__text.get_text_adjust(self, adjust_type) end +--- Get chars count by width +---@param self druid.text @{Text} +---@param width number +---@return number Chars count +function druid__text.get_text_index_by_width(self, width) end + --- Calculate text width with font with respect to trailing space ---@param self druid.text @{Text} ----@param text string|nil +---@param text string |nil ---@return number Width ---@return number Height function druid__text.get_text_size(self, text) end @@ -1359,8 +1459,8 @@ function druid__text.get_text_size(self, text) end --- The @{Text} constructor ---@param self druid.text @{Text} ---@param node string|node Node name or GUI Text Node itself ----@param value string|nil Initial text. Default value is node text from GUI scene. ----@param adjust_type string|nil Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale +---@param value string|nil Initial text. Default value is node text from GUI scene. Default: nil +---@param adjust_type string|nil Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: DOWNSCALE function druid__text.init(self, node, value, adjust_type) end --- Return true, if text with line break @@ -1420,6 +1520,8 @@ function druid__text.set_to(self, set_to) end ---@class druid.text.style +---@field ADJUST_SCALE_DELTA string|nil Scale step on each height adjust step. Default: 0.02 +---@field ADJUST_STEPS string|nil Amount of iterations for text adjust by height. Default: 20 ---@field DEFAULT_ADJUST string|nil The default adjust type for any text component. Default: DOWNSCALE ---@field TRIM_POSTFIX string|nil The postfix for TRIM adjust type. Default: ... local druid__text__style = {} @@ -1491,7 +1593,7 @@ function druid_instance.new_blocker(self, node) end ---@param self druid_instance ---@param node string|node The node_id or gui.get_node(node_id) ---@param callback function|nil Button callback ----@param params table|nil Button callback params +---@param params any|nil Button callback params ---@param anim_node node|string|nil Button anim node (node, if not provided) ---@return druid.button @{Button} component function druid_instance.new_button(self, node, callback, params, anim_node) end @@ -1546,8 +1648,9 @@ function druid_instance.new_hotkey(self, keys_array, callback, callback_argument ---@param self druid_instance ---@param node string|node The node_id or gui.get_node(node_id) ---@param on_hover_callback function|nil Hover callback +---@param on_mouse_hover_callback function|nil Mouse hover callback ---@return druid.hover @{Hover} component -function druid_instance.new_hover(self, node, on_hover_callback) end +function druid_instance.new_hover(self, node, on_hover_callback, on_mouse_hover_callback) end --- Create @{Input} component ---@param self druid_instance @@ -1664,6 +1767,7 @@ function druid_instance.on_message(self, message_id, message, sender) end --- Component `on_remove` function will be invoked, if exist. ---@param self druid_instance ---@param component druid.base_component Component instance +---@return boolean True if component was removed function druid_instance.remove(self, component) end --- Set blacklist components for input processing. @@ -1784,10 +1888,18 @@ function helper.insert_with_shift(array, any, index, shift_policy) end ---@return boolean Is mobile function helper.is_mobile() end +--- Check if device is mobile and can support multitouch +---@return boolean Is multitouch supported +function helper.is_multitouch_supported() end + --- Check if device is HTML5 ---@return boolean Is web function helper.is_web() end +--- Check if device is HTML5 mobile +---@return boolean Is web mobile +function helper.is_web_mobile() end + --- Lerp between two values ---@param a number First value ---@param b number Second value @@ -1827,8 +1939,6 @@ function helper.step(current, target, step) end function helper.table_to_string(t) end ----@diagnostic disable: duplicate-doc-field - -- Manual Annotations -- ---@class druid.rich_text.metrics @@ -1846,24 +1956,19 @@ function helper.table_to_string(t) end ---@class druid.rich_text.word ---@field node node ---@field relative_scale number ----@field adjust_scale number ---@field color vector4 ---@field position vector3 ---@field offset vector3 ---@field scale vector3 ---@field size vector3 ---@field metrics druid.rich_text.metrics ----@field pivot userdata @ The gui.PIVOT_* constant +---@field pivot number @ The gui.PIVOT_* constant ---@field text string ----@field source_text string ----@field text_color vector4 ---@field shadow vector4 ---@field outline vector4 ---@field font string ---@field image druid.rich_text.image ----@field image_color vector4 ---@field default_animation string ----@field default_texture string ---@field anchor number ---@field br boolean ---@field nobr boolean @@ -1885,10 +1990,8 @@ function helper.table_to_string(t) end ---@field image_pixel_grid_snap boolean ---@field combine_words boolean ---@field default_animation string ----@field default_texture string ---@field node_prefab node ---@field text_prefab node ----@field is_multiline boolean ---@class GUITextMetrics ---@field width number diff --git a/druid/component.lua b/druid/component.lua index 0720ae7..98fcf51 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -455,7 +455,7 @@ end --- Add child to component children list -- @tparam BaseComponent self @{BaseComponent} --- @tparam component children The druid component instance +-- @tparam component child The druid component instance -- @local function BaseComponent.__add_child(self, child) table.insert(self._meta.children, child) @@ -464,7 +464,7 @@ end --- Remove child from component children list -- @tparam BaseComponent self @{BaseComponent} --- @tparam component children The druid component instance +-- @tparam component child The druid component instance -- @local function BaseComponent.__remove_child(self, child) for i = #self._meta.children, 1, -1 do diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index c154782..8e1a059 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -3,7 +3,6 @@ --- Druid Rich Input custom component. -- It's wrapper on Input component with cursor and placeholder text -- @module RichInput --- @within Input -- @alias druid.rich_input --- The component druid instance @@ -29,7 +28,6 @@ local const = require("druid.const") local utf8_lua = require("druid.system.utf8") local utf8 = utf8 or utf8_lua -local hotkey = require("druid.extended.hotkey") local input = require("druid.extended.input") local RichInput = component.create("druid.rich_input") @@ -191,7 +189,6 @@ function RichInput.init(self, template, nodes) self.is_lshift = false self.is_lctrl = false - ---@type druid.input self.input = self.druid:new(input, self:get_node(SCHEME.BUTTON), self:get_node(SCHEME.INPUT)) self.is_button_input_enabled = gui.is_enabled(self.input.button.node) diff --git a/druid/event.lua b/druid/event.lua index 429f711..ef79c86 100644 --- a/druid/event.lua +++ b/druid/event.lua @@ -20,12 +20,12 @@ local tinsert = table.insert local tremove = table.remove --- DruidEvent constructor --- @tparam DruidEvent self @{DruidEvent} --- @tparam function|nil initial_callback Subscribe the callback on new event, if callback exist +-- @tparam function|nil callback Subscribe the callback on new event, if callback exist +-- @tparam any|nil callback_context Additional context as first param to callback call -- @usage -- local Event = require("druid.event") -- ... --- local event = Event(initial_callback) +-- local event = Event(callback) function M.create(callback, callback_context) local instance = setmetatable({}, EVENT_METATABLE) diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index cb957b5..8052d82 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -227,7 +227,7 @@ function DataList._remove_at(self, index) gui.delete_node(node) if instance then - --- We should remove instance from druid that spawned component + -- We should remove instance from druid that spawned component instance._meta.druid:remove(instance) end self._data_visual[index] = nil From 3c9f539376c9c678dd9b5e9987900b7530c007c2 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 5 Oct 2024 02:27:30 +0300 Subject: [PATCH 26/45] Update annotations --- druid/annotations.lua | 28 +++++++++++++++++++++++++--- druid/custom/rich_text/rich_text.lua | 14 +++++++++++++- druid/extended/data_list.lua | 6 ++++++ druid/extended/input.lua | 4 ++-- utils/annotations_manual.lua | 14 +++++++++++++- 5 files changed, 59 insertions(+), 7 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index d6a453d..9ffadd0 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -312,11 +312,13 @@ function druid__checkbox_group.set_state(self, indexes, is_instant) end ---@class druid.data_list : druid.base_component ---@field grid druid.static_grid|druid.dynamic_grid The Druid Grid component +---@field last_index number The current last index of visual elements ---@field on_element_add druid.event On DataList visual element created Event callback(self, index, node, instance) ---@field on_element_remove druid.event On DataList visual element created Event callback(self, index) ---@field on_scroll_progress_change druid.event Event triggered when scroll progress is changed; event(self, progress_value) ---@field scroll druid.scroll The Druid scroll component ---@field scroll_progress number The current progress of scroll posititon +---@field top_index number The current top index of visual elements local druid__data_list = {} --- Clear the DataList and refresh visuals @@ -712,7 +714,7 @@ function druid__input.select(self) end --- Set cursor position in input field ---@param self druid.input @{Input} ---@param cursor_index number|nil Cursor index for cursor position, if nil - will be set to the end of the text ----@param start_index number|nils Start index for cursor position, if nil - will be set to the end of the text +---@param start_index number|nil Start index for cursor position, if nil - will be set to the end of the text ---@param end_index number|nil End index for cursor position, if nil - will be set to the start_index ---@return druid.input Current input instance function druid__input.select_cursor(self, cursor_index, start_index, end_index) end @@ -1024,7 +1026,10 @@ function druid__rich_input.set_text(self, text) end ---@class druid.rich_text : druid.base_component ---@field druid druid_instance The component druid instance +---@field icon_prefab node The icon prefab node +---@field root node The root node of the Rich Text ---@field style druid.rich_text.style Component style params. +---@field text_prefab node The text prefab node local druid__rich_text = {} --- Split a word into it's characters @@ -1040,6 +1045,11 @@ function druid__rich_text.clear() end ---@return druid.rich_text.lines_metrics function druid__rich_text.get_line_metric() end +--- Get current text +---@param self druid.rich_text @{RichText} +---@return string text +function druid__rich_text.get_text(self) end + --- Get all current words. ---@return table druid.rich_text.word[] function druid__rich_text.get_words() end @@ -1052,7 +1062,7 @@ function druid__rich_text.init(self, template, nodes) end --- Set text for Rich Text ---@param self druid.rich_text @{RichText} ----@param text string |nil The text to set +---@param text string|nil The text to set ---@return druid.rich_text.word[] words ---@return druid.rich_text.lines_metrics line_metrics function druid__rich_text.set_text(self, text) end @@ -1962,7 +1972,7 @@ function helper.table_to_string(t) end ---@field scale vector3 ---@field size vector3 ---@field metrics druid.rich_text.metrics ----@field pivot number @ The gui.PIVOT_* constant +---@field pivot userdata @ The gui.PIVOT_* constant ---@field text string ---@field shadow vector4 ---@field outline vector4 @@ -1972,6 +1982,9 @@ function helper.table_to_string(t) end ---@field anchor number ---@field br boolean ---@field nobr boolean +---@field source_text string +---@field image_color vector4 +---@field text_color vector4 ---@class druid.rich_text.image ---@field texture string @@ -1992,6 +2005,15 @@ function helper.table_to_string(t) end ---@field default_animation string ---@field node_prefab node ---@field text_prefab node +---@field text_scale vector3 +---@field adjust_scale number +---@field default_texture string +---@field node_scale vector3 +---@field is_multiline boolean +---@field text_leading number +---@field font hash +---@field width number +---@field height number ---@class GUITextMetrics ---@field width number diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index cf83f2a..48a5fd7 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -90,6 +90,15 @@ --- The component druid instance -- @tfield DruidInstance druid @{DruidInstance} +--- The root node of the Rich Text +-- @tfield node root + +--- The text prefab node +-- @tfield node text_prefab + +--- The icon prefab node +-- @tfield node icon_prefab + -- local component = require("druid.component") @@ -149,7 +158,7 @@ end --- Set text for Rich Text -- @tparam RichText self @{RichText} --- @tparam string text|nil The text to set +-- @tparam string|nil text The text to set -- @treturn druid.rich_text.word[] words -- @treturn druid.rich_text.lines_metrics line_metrics -- @usage @@ -210,6 +219,9 @@ function RichText.set_text(self, text) end +--- Get current text +-- @tparam RichText self @{RichText} +-- @treturn string text function RichText.get_text(self) return self._last_value end diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index 8052d82..c4a5f35 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -18,6 +18,12 @@ --- The current progress of scroll posititon -- @tfield number scroll_progress +--- The current top index of visual elements +-- @tfield number top_index + +--- The current last index of visual elements +-- @tfield number last_index + --- Event triggered when scroll progress is changed; event(self, progress_value) -- @tfield DruidEvent on_scroll_progress_change @{DruidEvent} diff --git a/druid/extended/input.lua b/druid/extended/input.lua index 4de1d8b..a48117f 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -303,7 +303,7 @@ function Input.on_input(self, action_id, action) return false end - return false + return self.is_selected end @@ -484,7 +484,7 @@ end --- Set cursor position in input field -- @tparam Input self @{Input} -- @tparam number|nil cursor_index Cursor index for cursor position, if nil - will be set to the end of the text --- @tparam number|nils start_index Start index for cursor position, if nil - will be set to the end of the text +-- @tparam number|nil start_index Start index for cursor position, if nil - will be set to the end of the text -- @tparam number|nil end_index End index for cursor position, if nil - will be set to the start_index -- @treturn druid.input Current input instance function Input.select_cursor(self, cursor_index, start_index, end_index) diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index d87b665..6f6547a 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -21,7 +21,7 @@ ---@field scale vector3 ---@field size vector3 ---@field metrics druid.rich_text.metrics ----@field pivot number @ The gui.PIVOT_* constant +---@field pivot userdata @ The gui.PIVOT_* constant ---@field text string ---@field shadow vector4 ---@field outline vector4 @@ -31,6 +31,9 @@ ---@field anchor number ---@field br boolean ---@field nobr boolean +---@field source_text string +---@field image_color vector4 +---@field text_color vector4 ---@class druid.rich_text.image ---@field texture string @@ -51,6 +54,15 @@ ---@field default_animation string ---@field node_prefab node ---@field text_prefab node +---@field text_scale vector3 +---@field adjust_scale number +---@field default_texture string +---@field node_scale vector3 +---@field is_multiline boolean +---@field text_leading number +---@field font hash +---@field width number +---@field height number ---@class GUITextMetrics ---@field width number From d11aeb6b18adc12c352c97854cca17b49bae51c6 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 14 Oct 2024 11:32:53 +0300 Subject: [PATCH 27/45] Update --- druid/annotations.lua | 5 +- druid/base/scroll.lua | 11 ++++ druid/extended/data_list.lua | 54 +++++++++++++++---- .../general/overview/overview.gui_script | 2 +- .../examples/general/scroll/scroll.gui_script | 7 +-- 5 files changed, 62 insertions(+), 17 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 9ffadd0..638d896 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1580,10 +1580,11 @@ local druid_instance = {} function druid_instance.final(self) end --- Create new component. +---@generic T ---@param self druid_instance ----@param component druid.base_component Component module +---@param component T Component module ---@param ... any Other component params to pass it to component:init function ----@return druid.base_component Component instance +---@return T Component instance function druid_instance.new(self, component, ...) end --- Create @{BackHandler} component diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 068386d..58ba1b5 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -365,6 +365,17 @@ function Scroll.set_view_size(self, size) end +--- Refresh scroll view size +-- @tparam Scroll self @{Scroll} +function Scroll.update_view_size(self) + self.view_size = helper.get_scaled_size(self.view_node) + self.view_border = helper.get_border(self.view_node) + self:_update_size() + + return self +end + + --- Enable or disable scroll inert. -- If disabled, scroll through points (if exist) -- If no points, just simple drag without inertion diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index c4a5f35..fa9adca 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -61,6 +61,8 @@ function DataList.init(self, scroll, grid, create_function) self.scroll_progress = 0 self._create_function = create_function + self._is_use_cache = false + self._cache = {} self._data = {} self._data_visual = {} @@ -80,6 +82,14 @@ function DataList.on_remove(self) end +--- Set refresh function for DataList component +-- @tparam DataList self @{DataList} +function DataList.set_use_cache(self, is_use_cache) + self._is_use_cache = is_use_cache + return self +end + + --- Set new data set for DataList component -- @tparam DataList self @{DataList} -- @tparam table data The new data array @@ -199,7 +209,7 @@ function DataList.scroll_to_index(self, index) end ---- Add element at passed index +--- Add element at passed index using cache or create new -- @tparam DataList self @{DataList} -- @tparam number index -- @local @@ -208,19 +218,32 @@ function DataList._add_at(self, index) self:_remove_at(index) end - local node, instance = self._create_function(self:get_context(), self._data[index], index, self) + local data = self._data[index] + local node, instance + + -- Use cache if available and is_use_cache is set + if #self._cache > 0 and self._is_use_cache then + local cached = table.remove(self._cache) + node = cached.node + instance = cached.component + gui.set_enabled(node, true) + else + -- Create a new element if no cache or refresh function is not set + node, instance = self._create_function(self:get_context(), data, index, self) + end + self._data_visual[index] = { - data = self._data[index], + data = data, node = node, component = instance, } self.grid:add(node, index, const.SHIFT.NO_SHIFT) - self.on_element_add:trigger(self:get_context(), index, node, instance) + self.on_element_add:trigger(self:get_context(), index, node, instance, data) end ---- Remove element from passed index +--- Remove element from passed index and add it to cache if applicable -- @tparam DataList self @{DataList} -- @tparam number index -- @local @@ -230,18 +253,27 @@ function DataList._remove_at(self, index) local visual_data = self._data_visual[index] local node = visual_data.node local instance = visual_data.component + local data = visual_data.data - gui.delete_node(node) - if instance then - -- We should remove instance from druid that spawned component - instance._meta.druid:remove(instance) + self.on_element_remove:trigger(self:get_context(), index, node, instance, data) + + if self._is_use_cache then + -- Disable the node and add it to the cache instead of deleting it + gui.set_enabled(node, false) + table.insert(self._cache, visual_data) -- Cache the removed element + else + -- If no refresh function, delete the node and component as usual + gui.delete_node(node) + if instance then + instance._meta.druid:remove(instance) + end end - self._data_visual[index] = nil - self.on_element_remove:trigger(self:get_context(), index) + self._data_visual[index] = nil end + --- Refresh all elements in DataList -- @tparam DataList self @{DataList} -- @local diff --git a/example/examples/general/overview/overview.gui_script b/example/examples/general/overview/overview.gui_script index f0ded90..8f4589a 100644 --- a/example/examples/general/overview/overview.gui_script +++ b/example/examples/general/overview/overview.gui_script @@ -52,7 +52,7 @@ end local function setup_slider(self) local slider = self.druid:new_slider("slider_pin", vmath.vector3(95, 0, 0), function(_, value) gui.set_text(gui.get_node("text_progress_slider"), math.ceil(value * 100) .. "%") - end) + end) --[[@as druid.slider]] slider:set(0.2) end diff --git a/example/examples/general/scroll/scroll.gui_script b/example/examples/general/scroll/scroll.gui_script index 3ad39b9..f9a5468 100644 --- a/example/examples/general/scroll/scroll.gui_script +++ b/example/examples/general/scroll/scroll.gui_script @@ -54,9 +54,10 @@ function init(self) self.druid:new_scroll("children_scroll_3", "children_scroll_content_3") -- Content with less size than view - self.druid:new_scroll("scroll_smaller_view", "scroll_smaller_content") - :set_extra_stretch_size(0) - :set_inert(false) + local small_scroll = self.druid:new_scroll("scroll_smaller_view", "scroll_smaller_content") --[[@as druid.scroll]] + small_scroll.style.SMALL_CONTENT_SCROLL = true + small_scroll:set_extra_stretch_size(0) -- it also update scroll size due the change of SMALL_CONTENT_SCROLL + small_scroll:set_inert(false) -- Scroll with points of interests self.druid:new_scroll("scroll_with_points", "scroll_with_points_content") From 59d3b116acdb8c4aa50446c7e89e1ad5851b1c83 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 14 Oct 2024 11:33:05 +0300 Subject: [PATCH 28/45] Add figma layout for druid 1.6.3 --- druid/extended/figma_layout.lua | 390 ++++++++++++++++++++++++++++++++ 1 file changed, 390 insertions(+) create mode 100644 druid/extended/figma_layout.lua diff --git a/druid/extended/figma_layout.lua b/druid/extended/figma_layout.lua new file mode 100644 index 0000000..3124ae2 --- /dev/null +++ b/druid/extended/figma_layout.lua @@ -0,0 +1,390 @@ +local helper = require("druid.helper") +local component = require("druid.component") + +---@class druid.figma_layout.row_data +---@field width number +---@field height number +---@field count number + +---@class druid.figma_layout.rows_data +---@field total_width number +---@field total_height number +---@field nodes_width table +---@field nodes_height table +---@field rows druid.figma_layout.row_data[]> + +---@class druid.figma_layout: druid.base_component +local M = component.create("layout") + + +--- The @{Layout} constructor +-- @tparam Layout self @{Layout} +-- @tparam node node Gui node +-- @tparam string layout_type The layout mode (from const.LAYOUT_MODE) +-- @tparam function|nil on_size_changed_callback The callback on window resize +function M:init(node, layout_type) + self.node = self:get_node(node) + + print(self.node) + self.is_dirty = true + self.entities = {} + self.margin = { x = 0, y = 0 } + self.padding = gui.get_slice9(self.node) + self.type = layout_type or "horizontal" + self.is_resize_width = false + self.is_resize_height = false + self.is_justify = false +end + + +function M:update() + if not self.is_dirty then + return + end + + self:refresh_layout() +end + + +---@param margin_x number|nil +---@param margin_y number|nil +---@return druid.figma_layout +function M:set_margin(margin_x, margin_y) + self.margin.x = margin_x or self.margin.x + self.margin.y = margin_y or self.margin.y + self.is_dirty = true + + return self +end + + +---@param padding vector4 The vector4 with padding values, where x - left, y - top, z - right, w - bottom +function M:set_padding(padding) + self.padding = padding + self.is_dirty = true + + return self +end + + +function M:set_dirty() + self.is_dirty = true + + return self +end + + +---@param is_justify boolean +---@return druid.figma_layout +function M:set_justify(is_justify) + self.is_justify = is_justify + self.is_dirty = true + + return self +end + + +---@param type string The layout type: "horizontal", "vertical", "horizontal_wrap" +function M:set_type(type) + self.type = type + self.is_dirty = true + + return self +end + + +---@param is_hug boolean +---@return druid.figma_layout +function M:set_hug_content(entity, is_hug) + self.is_resize_width = is_hug + self.is_resize_height = is_hug + self.is_dirty = true + + return entity +end + +---@param node_or_node_id string|node +---@return druid.figma_layout +function M:add(node_or_node_id) + -- Acquire node from entity or by id + local node = node_or_node_id + if type(node_or_node_id) == "table" then + assert(node_or_node_id.node, "The entity should have a node") + node = node_or_node_id.node + else + ---@cast node_or_node_id string|node + node = self:get_node(node_or_node_id) + end + + ---@cast node node + table.insert(self.entities, node) + gui.set_parent(node, self.node) + + self.is_dirty = true + + return self +end + + +---@return druid.figma_layout +function M:refresh_layout() + local layout_node = self.node + + local entities = self.entities + local type = self.type -- vertical, horizontal, horizontal_wrap + local margin = self.margin -- {x: horizontal, y: vertical} in pixels, between elements + local padding = self.padding -- {x: left, y: top, z: right, w: bottom} in pixels + local is_justify = self.is_justify + local size = gui.get_size(layout_node) + local max_width = size.x - padding.x - padding.z + local max_height = size.y - padding.y - padding.w + local layout_pivot_offset = helper.get_pivot_offset(gui.get_pivot(layout_node)) -- {x: -0.5, y: -0.5} - is left bot, {x: 0.5, y: 0.5} - is right top + + local rows_data = self:calculate_rows_data() + local rows = rows_data.rows + local row_index = 1 + local row = rows[row_index] + + -- Current x and Current y is a top left corner of the node + local current_x = -row.width * (0.5 + layout_pivot_offset.x) + local current_y = rows_data.total_height * (0.5 - layout_pivot_offset.y) + + if is_justify then + if (type == "horizontal" or type == "horizontal_wrap") and row.count > 1 then + current_x = -max_width * (0.5 + layout_pivot_offset.x) + end + if type == "vertical" then + current_y = max_height * (0.5 - layout_pivot_offset.y) + end + end + + for index = 1, #entities do + local node = entities[index] + local node_width = rows_data.nodes_width[node] + local node_height = rows_data.nodes_height[node] + local pivot_offset = helper.get_pivot_offset(gui.get_pivot(node)) + + if node_width > 0 and node_height > 0 then + -- Calculate position for current node + local position_x, position_y + + if type == "horizontal" then + position_x = current_x + node_width * (0.5 + pivot_offset.x) + position_y = current_y - row.height * (0.5 - pivot_offset.y) + + local node_margin = margin.x + if is_justify and row.count > 1 then + node_margin = (max_width - row.width) / (row.count - 1) + margin.x + end + current_x = current_x + node_width + node_margin + end + + if type == "vertical" then + position_x = current_x + row.width * (0.5 - pivot_offset.x) + position_y = current_y - node_height * (0.5 + pivot_offset.y) + + local node_margin = margin.y + if is_justify then + node_margin = (max_height - rows_data.total_height) / (#rows - 1) + margin.y + end + + current_y = current_y - node_height - node_margin + end + + if type == "horizontal_wrap" then + local width = row.width + if is_justify and row.count > 0 then + width = math.max(row.width, max_width) + end + local new_row_width = width * (0.5 - layout_pivot_offset.x) + + -- Compare with eps due the float loss and element flickering + if current_x + node_width - new_row_width > 0.0001 then + if row_index < #rows then + row_index = row_index + 1 + row = rows[row_index] + end + + current_x = -row.width * (0.5 + layout_pivot_offset.x) + current_y = current_y - row.height - margin.y + if is_justify and row.count > 1 then + current_x = -max_width * (0.5 + layout_pivot_offset.x) + end + end + + position_x = current_x + node_width * (0.5 + pivot_offset.x) + position_y = current_y - row.height * (0.5 - pivot_offset.y) + + local node_margin = margin.x + if is_justify and row.count > 1 then + node_margin = (max_width - row.width) / (row.count - 1) + margin.x + end + current_x = current_x + node_width + node_margin + end + + do -- Padding offset + if layout_pivot_offset.x == -0.5 then + position_x = position_x + padding.x + end + if layout_pivot_offset.y == 0.5 then + position_y = position_y - padding.y + end + if layout_pivot_offset.x == 0.5 then + position_x = position_x - padding.z + end + if layout_pivot_offset.y == -0.5 then + position_y = position_y + padding.w + end + end + + self:set_node_position(node, position_x, position_y) + end + end + + if self.is_resize_width or self.is_resize_height then + if self.is_resize_width then + size.x = rows_data.total_width + padding.x + padding.z + end + if self.is_resize_height then + size.y = rows_data.total_height + padding.y + padding.w + end + gui.set_size(layout_node, size) + end + + self.is_dirty = false + + return self +end + + +---@return druid.figma_layout +function M:clear_layout() + for index = #self.entities, 1, -1 do + self.entities[index] = nil + end + + self.is_dirty = true + + return self +end + + +---@param node node +---@return number, number +function M.get_node_size(node) + if not gui.is_enabled(node, false) then + return 0, 0 + end + + local scale = gui.get_scale(node) + + -- If node has text - get text size instead of node size + if gui.get_text(node) then + local text_metrics = helper.get_text_metrics_from_node(node) + return text_metrics.width * scale.x, text_metrics.height * scale.y + end + + local size = gui.get_size(node) + return size.x * scale.x, size.y * scale.y +end + + +---Calculate rows data for layout. Contains total width, height and rows info (width, height, count of elements in row) +---@private +---@return druid.figma_layout.rows_data +function M:calculate_rows_data() + local entities = self.entities + local margin = self.margin + local type = self.type + local padding = self.padding + + local size = gui.get_size(self.node) + local max_width = size.x - padding.x - padding.z + + -- Collect rows info about width, height and count of elements in row + local current_row = { width = 0, height = 0, count = 0 } + local rows_data = { + total_width = 0, + total_height = 0, + nodes_width = {}, + nodes_height = {}, + rows = { current_row } + } + + for index = 1, #entities do + local node = entities[index] + local node_width = rows_data.nodes_width[node] + local node_height = rows_data.nodes_height[node] + + -- Get node size if it's not calculated yet + if not node_width or not node_height then + node_width, node_height = M.get_node_size(node) + rows_data.nodes_width[node] = node_width + rows_data.nodes_height[node] = node_height + end + + if node_width > 0 and node_height > 0 then + if type == "horizontal" then + current_row.width = current_row.width + node_width + margin.x + current_row.height = math.max(current_row.height, node_height) + current_row.count = current_row.count + 1 + end + + if type == "vertical" then + if current_row.count > 0 then + current_row = { width = 0, height = 0, count = 0 } + table.insert(rows_data.rows, current_row) + end + + current_row.width = math.max(current_row.width, node_width + margin.x) + current_row.height = node_height + current_row.count = current_row.count + 1 + end + + if type == "horizontal_wrap" then + if current_row.width + node_width > max_width and current_row.count > 0 then + current_row = { width = 0, height = 0, count = 0 } + table.insert(rows_data.rows, current_row) + end + + current_row.width = current_row.width + node_width + margin.x + current_row.height = math.max(current_row.height, node_height) + current_row.count = current_row.count + 1 + end + end + end + + -- Remove last margin of each row + -- Calculate total width and height + local rows_count = #rows_data.rows + for index = 1, rows_count do + local row = rows_data.rows[index] + if row.width > 0 then + row.width = row.width - margin.x + end + + rows_data.total_width = math.max(rows_data.total_width, row.width) + rows_data.total_height = rows_data.total_height + row.height + end + + rows_data.total_height = rows_data.total_height + margin.y * (rows_count - 1) + return rows_data +end + + +---@private +---@param node node +---@param x number +---@param y number +---@return node +function M:set_node_position(node, x, y) + local position = gui.get_position(node) + position.x = x + position.y = y + gui.set_position(node, position) + + return node +end + + +return M \ No newline at end of file From 5d5fe7f374442e2656a6240b7e40b46d689eadd6 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 14 Oct 2024 22:13:57 +0300 Subject: [PATCH 29/45] Rich text based only on text node --- druid/custom/rich_text/module/rt.lua | 12 ++++----- druid/custom/rich_text/rich_text.lua | 38 ++++++++++------------------ 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 7531ebb..feaeb71 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -117,8 +117,8 @@ end ---@return druid.rich_text.metrics local function get_image_metrics(word, settings) local node_prefab = settings.node_prefab - gui.set_texture(node_prefab, word.image.texture or settings.default_texture) - gui.play_flipbook(node_prefab, word.image.anim or settings.default_animation) + gui.set_texture(node_prefab, word.image.texture) + gui.play_flipbook(node_prefab, word.image.anim) local node_size = gui.get_size(node_prefab) local aspect = node_size.x / node_size.y node_size.x = word.image.width or node_size.x @@ -175,7 +175,7 @@ function M.create(text, settings, style) -- Image params ---@type druid.rich_text.image image = nil, - image_color = gui.get_color(settings.node_prefab), + --image_color = gui.get_color(settings.node_prefab), -- Tags br = nil, nobr = nil, @@ -204,8 +204,8 @@ function M._fill_properties(word, metrics, settings) if word.image then -- Image properties - word.scale = gui.get_scale(settings.node_prefab) * word.relative_scale * settings.adjust_scale - word.pivot = gui.get_pivot(settings.node_prefab) + word.scale = vmath.vector3(word.relative_scale * settings.adjust_scale) + word.pivot = gui.PIVOT_CENTER word.size = metrics.node_size word.offset = vmath.vector3(0, 0, 0) if word.image.width then @@ -407,7 +407,7 @@ function M._update_nodes(lines, settings) local word = line[word_index] local node if word.image then - node = word.node or gui.clone(settings.node_prefab) + node = word.node or gui.new_box_node(vmath.vector3(0), word.size) gui.set_size_mode(node, gui.SIZE_MODE_MANUAL) gui.set_texture(node, word.image.texture or settings.default_texture) gui.play_flipbook(node, hash(word.image.anim or settings.default_animation)) diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 48a5fd7..1cf9a10 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -106,29 +106,23 @@ local rich_text = require("druid.custom.rich_text.module.rt") local RichText = component.create("rich_text") -local SCHEME = { - ROOT = "root", - TEXT_PREFAB = "text_prefab", - ICON_PREFAB = "icon_prefab" -} - --- The @{RichText} constructor -- @tparam RichText self @{RichText} -- @tparam string template The Rich Text template name -- @tparam table nodes The node table, if prefab was copied by gui.clone_tree() -function RichText.init(self, template, nodes) - self.druid = self:get_druid(template, nodes) - - self.root = self:get_node(SCHEME.ROOT) - - self.text_prefab = self:get_node(SCHEME.TEXT_PREFAB) - self.icon_prefab = self:get_node(SCHEME.ICON_PREFAB) - - gui.set_enabled(self.text_prefab, false) - gui.set_enabled(self.icon_prefab, false) +function RichText.init(self, text_node, value) + self.root = self:get_node(text_node) + self.text_prefab = self.root + self._last_value = value or gui.get_text(self.text_prefab) + gui.set_text(self.root, "") self._settings = self:_create_settings() + + if value then + self:set_text(value) + end + end @@ -228,9 +222,6 @@ end function RichText:on_remove() - pcall(gui.set_texture, self.icon_prefab, self._settings.default_texture) - pcall(gui.play_flipbook, self.icon_prefab, self._settings.default_animation) - self:clear() end @@ -292,7 +283,6 @@ function RichText:_create_settings() height = root_size.y, combine_words = false, -- disabled now text_prefab = self.text_prefab, - node_prefab = self.icon_prefab, -- Text Settings shadow = gui.get_shadow(self.text_prefab), @@ -303,10 +293,10 @@ function RichText:_create_settings() -- Image settings image_pixel_grid_snap = false, -- disabled now - node_scale = gui.get_scale(self.icon_prefab), - image_scale = gui.get_scale(self.icon_prefab), - default_animation = gui.get_flipbook(self.icon_prefab), - default_texture = gui.get_texture(self.icon_prefab), + node_scale = gui.get_scale(self.text_prefab), + image_scale = gui.get_scale(self.text_prefab), + --default_animation = gui.get_flipbook(self.icon_prefab), + --default_texture = gui.get_texture(self.icon_prefab), } end From a4fa0f03485c22f32beac6bac531d3208dc902a8 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 14 Oct 2024 22:24:57 +0300 Subject: [PATCH 30/45] WIP --- druid/custom/rich_text/module/rt.lua | 7 +++---- druid/custom/rich_text/rich_text.lua | 5 ----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index feaeb71..5347441 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -154,7 +154,6 @@ function M.create(text, settings, style) -- default settings for a word -- will be assigned to each word unless tags override the values - local font = gui.get_font(settings.text_prefab) local word_params = { node = nil, -- Autofill on node creation relative_scale = 1, @@ -171,7 +170,7 @@ function M.create(text, settings, style) text_color = gui.get_color(settings.text_prefab), shadow = settings.shadow, outline = settings.outline, - font = font, + font = gui.get_font(settings.text_prefab), -- Image params ---@type druid.rich_text.image image = nil, @@ -409,8 +408,8 @@ function M._update_nodes(lines, settings) if word.image then node = word.node or gui.new_box_node(vmath.vector3(0), word.size) gui.set_size_mode(node, gui.SIZE_MODE_MANUAL) - gui.set_texture(node, word.image.texture or settings.default_texture) - gui.play_flipbook(node, hash(word.image.anim or settings.default_animation)) + gui.set_texture(node, word.image.texture) + gui.play_flipbook(node, hash(word.image.anim)) gui.set_color(node, word.color or word.image_color) else node = word.node or gui.clone(settings.text_prefab) diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 1cf9a10..ea54753 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -127,8 +127,6 @@ end function RichText.on_layout_change(self) - gui.set_enabled(self.text_prefab, false) - gui.set_enabled(self.icon_prefab, false) if self._last_value then self:set_text(self._last_value) end @@ -294,9 +292,6 @@ function RichText:_create_settings() -- Image settings image_pixel_grid_snap = false, -- disabled now node_scale = gui.get_scale(self.text_prefab), - image_scale = gui.get_scale(self.text_prefab), - --default_animation = gui.get_flipbook(self.icon_prefab), - --default_texture = gui.get_texture(self.icon_prefab), } end From 66f4a1c8d5faba7a75d8d1ad64d0a280b4c46673 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 14 Oct 2024 23:03:45 +0300 Subject: [PATCH 31/45] WIP --- druid/annotations.lua | 1 - druid/custom/rich_text/module/rt.lua | 31 ++++++++++++++++------- druid/custom/rich_text/module/rt_tags.lua | 7 +---- druid/custom/rich_text/rich_text.lua | 16 +++++++----- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 638d896..c942402 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -2004,7 +2004,6 @@ function helper.table_to_string(t) end ---@field image_pixel_grid_snap boolean ---@field combine_words boolean ---@field default_animation string ----@field node_prefab node ---@field text_prefab node ---@field text_scale vector3 ---@field adjust_scale number diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 5347441..68d68c6 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -11,6 +11,9 @@ local parser = require("druid.custom.rich_text.module.rt_parse") local utf8_lua = require("druid.system.utf8") local utf8 = utf8 or utf8_lua +local VECTOR_ZERO = vmath.vector3(0) +local COLOR_WHITE = vmath.vector4(1) + local M = {} -- Trim spaces on string start @@ -116,10 +119,10 @@ end ---@param settings druid.rich_text.settings ---@return druid.rich_text.metrics local function get_image_metrics(word, settings) - local node_prefab = settings.node_prefab - gui.set_texture(node_prefab, word.image.texture) - gui.play_flipbook(node_prefab, word.image.anim) - local node_size = gui.get_size(node_prefab) + local node = word.node + gui.set_texture(node, word.image.texture) + gui.play_flipbook(node, word.image.anim) + local node_size = gui.get_size(node) local aspect = node_size.x / node_size.y node_size.x = word.image.width or node_size.x node_size.y = word.image.height or (node_size.x / aspect) @@ -137,6 +140,16 @@ end ---@param previous_word druid.rich_text.word|nil ---@return druid.rich_text.metrics local function measure_node(word, settings, previous_word) + do -- Clone node if required + local node + if word.image then + node = word.node or gui.new_box_node(vmath.vector3(0), vmath.vector3(word.image.width, word.image.height, 0)) + else + node = word.node or gui.clone(settings.text_prefab) + end + word.node = node + end + local metrics = word.image and get_image_metrics(word, settings) or get_text_metrics(word, previous_word, settings) return metrics end @@ -174,7 +187,6 @@ function M.create(text, settings, style) -- Image params ---@type druid.rich_text.image image = nil, - --image_color = gui.get_color(settings.node_prefab), -- Tags br = nil, nobr = nil, @@ -214,7 +226,7 @@ function M._fill_properties(word, metrics, settings) else -- Text properties word.scale = gui.get_scale(settings.text_prefab) * word.relative_scale * settings.adjust_scale - word.pivot = gui.get_pivot(settings.text_prefab) + word.pivot = gui.PIVOT_W -- With this pivot adjustments works correctly, but with another some misalignment word.size = vmath.vector3(metrics.width, metrics.height, 0) word.offset = vmath.vector3(metrics.offset_x, metrics.offset_y, 0) end @@ -327,7 +339,7 @@ function M._position_lines(lines, settings) local pivot_offset = helper.get_pivot_offset(word.pivot) local word_width = word.metrics.width word.position.x = current_x + word_width * (pivot_offset.x + 0.5) + word.offset.x - word.position.y = current_y + word.metrics.height * (pivot_offset.y - 0.5) + word.offset.y + word.position.y = current_y + word.offset.y -- Align item on text line depends on anchor word.position.y = word.position.y - (word.metrics.height - line_metrics.height) * (pivot_offset.y - 0.5) @@ -406,11 +418,11 @@ function M._update_nodes(lines, settings) local word = line[word_index] local node if word.image then - node = word.node or gui.new_box_node(vmath.vector3(0), word.size) + node = word.node or gui.new_box_node(VECTOR_ZERO, word.size) gui.set_size_mode(node, gui.SIZE_MODE_MANUAL) gui.set_texture(node, word.image.texture) gui.play_flipbook(node, hash(word.image.anim)) - gui.set_color(node, word.color or word.image_color) + gui.set_color(node, word.color or COLOR_WHITE) else node = word.node or gui.clone(settings.text_prefab) gui.set_outline(node, word.outline) @@ -422,6 +434,7 @@ function M._update_nodes(lines, settings) word.node = node gui.set_enabled(node, true) gui.set_parent(node, settings.parent) + gui.set_pivot(node, word.pivot) gui.set_size(node, word.size) gui.set_scale(node, word.scale) gui.set_position(node, word.position) diff --git a/druid/custom/rich_text/module/rt_tags.lua b/druid/custom/rich_text/module/rt_tags.lua index 0805822..058131e 100644 --- a/druid/custom/rich_text/module/rt_tags.lua +++ b/druid/custom/rich_text/module/rt_tags.lua @@ -93,11 +93,6 @@ M.register("img", function(params, settings) width, params = split(params, ",") height = split(params, ",") local texture, anim = split(texture_and_anim, ":") - if not anim then - anim = texture - texture = nil - end - width = width and tonumber(width) height = height and tonumber(height) @@ -105,7 +100,7 @@ M.register("img", function(params, settings) texture = texture, anim = anim, width = width, - height = height + height = height or width, } end) diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index ea54753..46993c7 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -116,9 +116,10 @@ function RichText.init(self, text_node, value) self.text_prefab = self.root self._last_value = value or gui.get_text(self.text_prefab) - gui.set_text(self.root, "") self._settings = self:_create_settings() + gui.set_text(self.root, "") + if value then self:set_text(value) end @@ -281,17 +282,18 @@ function RichText:_create_settings() height = root_size.y, combine_words = false, -- disabled now text_prefab = self.text_prefab, + pivot = gui.get_pivot(self.root), -- Text Settings - shadow = gui.get_shadow(self.text_prefab), - outline = gui.get_outline(self.text_prefab), - text_scale = gui.get_scale(self.text_prefab), - text_leading = gui.get_leading(self.text_prefab), - is_multiline = gui.get_line_break(self.text_prefab), + shadow = gui.get_shadow(self.root), + outline = gui.get_outline(self.root), + text_scale = gui.get_scale(self.root), + text_leading = gui.get_leading(self.root), + is_multiline = gui.get_line_break(self.root), -- Image settings image_pixel_grid_snap = false, -- disabled now - node_scale = gui.get_scale(self.text_prefab), + node_scale = gui.get_scale(self.root), } end From 87f52551e2552f32c1cd8b7e4f87cf5ddba8062c Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 00:56:06 +0300 Subject: [PATCH 32/45] Update rich text --- druid/annotations.lua | 3 +- druid/custom/rich_text/module/rt.lua | 15 +-- druid/custom/rich_text/rich_text.gui | 154 --------------------------- druid/custom/rich_text/rich_text.lua | 10 +- 4 files changed, 17 insertions(+), 165 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index c942402..3f0f074 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1997,6 +1997,7 @@ function helper.table_to_string(t) end ---@field parent node ---@field size number ---@field fonts table +---@field scale vector3 ---@field color vector4 ---@field shadow vector4 ---@field outline vector4 @@ -2005,10 +2006,8 @@ function helper.table_to_string(t) end ---@field combine_words boolean ---@field default_animation string ---@field text_prefab node ----@field text_scale vector3 ---@field adjust_scale number ---@field default_texture string ----@field node_scale vector3 ---@field is_multiline boolean ---@field text_leading number ---@field font hash diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 68d68c6..dc27bf5 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -12,6 +12,7 @@ local utf8_lua = require("druid.system.utf8") local utf8 = utf8 or utf8_lua local VECTOR_ZERO = vmath.vector3(0) +local VECTOR_ONE = vmath.vector3(1) local COLOR_WHITE = vmath.vector4(1) local M = {} @@ -84,8 +85,8 @@ local function get_text_metrics(word, previous_word, settings) ---@type druid.rich_text.metrics local metrics - local word_scale_x = word.relative_scale * settings.text_scale.x * settings.adjust_scale - local word_scale_y = word.relative_scale * settings.text_scale.y * settings.adjust_scale + local word_scale_x = word.relative_scale * settings.scale.x * settings.adjust_scale + local word_scale_y = word.relative_scale * settings.scale.y * settings.adjust_scale if utf8.len(text) == 0 then metrics = resource.get_text_metrics(font_resource, "|") @@ -128,8 +129,8 @@ local function get_image_metrics(word, settings) node_size.y = word.image.height or (node_size.x / aspect) return { - width = node_size.x * word.relative_scale * settings.node_scale.x * settings.adjust_scale, - height = node_size.y * word.relative_scale * settings.node_scale.y * settings.adjust_scale, + width = node_size.x * word.relative_scale * settings.scale.x * settings.adjust_scale, + height = node_size.y * word.relative_scale * settings.scale.y * settings.adjust_scale, node_size = node_size, } end @@ -225,7 +226,7 @@ function M._fill_properties(word, metrics, settings) end else -- Text properties - word.scale = gui.get_scale(settings.text_prefab) * word.relative_scale * settings.adjust_scale + word.scale = settings.scale * word.relative_scale * settings.adjust_scale word.pivot = gui.PIVOT_W -- With this pivot adjustments works correctly, but with another some misalignment word.size = vmath.vector3(metrics.width, metrics.height, 0) word.offset = vmath.vector3(metrics.offset_x, metrics.offset_y, 0) @@ -339,7 +340,7 @@ function M._position_lines(lines, settings) local pivot_offset = helper.get_pivot_offset(word.pivot) local word_width = word.metrics.width word.position.x = current_x + word_width * (pivot_offset.x + 0.5) + word.offset.x - word.position.y = current_y + word.offset.y + word.position.y = current_y + word.metrics.height * (pivot_offset.y - 0.5) + word.offset.y -- Align item on text line depends on anchor word.position.y = word.position.y - (word.metrics.height - line_metrics.height) * (pivot_offset.y - 0.5) @@ -477,7 +478,7 @@ function M.adjust_to_area(words, settings, lines_metrics, style) if lines_metrics.text_width * scale_koef > settings.width then scale_koef = math.sqrt(settings.width / lines_metrics.text_width) end - local adjust_scale = math.min(scale_koef, 1) + local adjust_scale = math.min(scale_koef, settings.scale.x) local lines = M.apply_scale_without_update(words, settings, adjust_scale) local is_fit = M.is_fit_info_area(lines, settings) diff --git a/druid/custom/rich_text/rich_text.gui b/druid/custom/rich_text/rich_text.gui index e37f9ea..0d6a8fe 100644 --- a/druid/custom/rich_text/rich_text.gui +++ b/druid/custom/rich_text/rich_text.gui @@ -1,4 +1,3 @@ -script: "" fonts { name: "game" font: "/example/assets/fonts/game.font" @@ -7,193 +6,40 @@ textures { name: "items" texture: "/example/assets/images/kenney.atlas" } -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } size { x: 400.0 y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true visible: false } nodes { position { x: -200.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 400.0 y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA text: "Rich text" font: "game" id: "text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: false parent: "root" - layer: "" inherit_alpha: true - alpha: 1.0 outline_alpha: 0.0 shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true } nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 21.0 - y: 20.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" id: "icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT parent: "root" - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true } material: "/builtins/materials/gui.material" adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 46993c7..d4f08f9 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -273,11 +273,19 @@ end function RichText:_create_settings() local root_size = gui.get_size(self.root) + local scale = gui.get_scale(self.root) + + root_size.x = root_size.x * scale.x + root_size.y = root_size.y * scale.y + gui.set_size(self.root, root_size) + gui.set_scale(self.root, vmath.vector3(1)) + return { -- General settings -- Adjust scale using to fit the text to the root node area adjust_scale = 1, parent = self.root, + scale = scale, width = root_size.x, height = root_size.y, combine_words = false, -- disabled now @@ -287,13 +295,11 @@ function RichText:_create_settings() -- Text Settings shadow = gui.get_shadow(self.root), outline = gui.get_outline(self.root), - text_scale = gui.get_scale(self.root), text_leading = gui.get_leading(self.root), is_multiline = gui.get_line_break(self.root), -- Image settings image_pixel_grid_snap = false, -- disabled now - node_scale = gui.get_scale(self.root), } end From a0113d335639202101c0281ec081615dc11f4f92 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 00:56:19 +0300 Subject: [PATCH 33/45] Update druid component template --- druid/editor_scripts/component.lua_template | 14 +++-------- .../editor_scripts/create_druid_component.py | 24 +++++++++---------- druid/extended/figma_layout.lua | 12 ++++++---- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/druid/editor_scripts/component.lua_template b/druid/editor_scripts/component.lua_template index cf46000..560dc2a 100644 --- a/druid/editor_scripts/component.lua_template +++ b/druid/editor_scripts/component.lua_template @@ -1,9 +1,9 @@ --- For component interest functions ---- see https://github.com/Insality/druid/blob/develop/docs_md/02-creating_custom_components.md +--- see https://github.com/Insality/druid/blob/master/docs_md/02-creating_custom_components.md --- Require this component in you gui file: ---- local {COMPONENT_NAME} = require("{COMPONENT_PATH}") +--- $ local {COMPONENT_NAME} = require("{COMPONENT_PATH}") --- And create this component via: ---- self.{COMPONENT_TYPE} = self.druid:new({COMPONENT_NAME}, template, nodes) +--- $ self.{COMPONENT_TYPE} = self.druid:new({COMPONENT_NAME}, template, nodes) local component = require("druid.component") @@ -11,10 +11,6 @@ local component = require("druid.component") ---@field druid druid_instance{COMPONENT_ANNOTATIONS} local M = component.create("{COMPONENT_TYPE}") -local SCHEME = { -{SCHEME_LIST} -} - ---@param template string ---@param nodes table @@ -22,9 +18,5 @@ function M:init(template, nodes) self.druid = self:get_druid(template, nodes){COMPONENT_DEFINE} end - -function M:on_remove() -end - {COMPONENT_FUNCTIONS} return M diff --git a/druid/editor_scripts/create_druid_component.py b/druid/editor_scripts/create_druid_component.py index b88c1a1..24d1203 100644 --- a/druid/editor_scripts/create_druid_component.py +++ b/druid/editor_scripts/create_druid_component.py @@ -28,53 +28,53 @@ def process_component(node_name, component_name): if node_name == "root": component_annotations += "\n---@field root node" - component_define += "\n\tself.root = self:get_node(SCHEME.ROOT)" + component_define += "\n\tself.root = self:get_node(\"root\")" if node_name.startswith("button"): component_annotations += "\n---@field {0} druid.button".format(node_name) component_functions += "\nfunction M:_on_{0}()\n\tprint(\"Click on {0}\")\nend\n\n".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_button(SCHEME.{1}, self._on_{0})".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_button(\"{1}\", self._on_{0})".format(node_name, node_name) if node_name.startswith("text"): component_annotations += "\n---@field {0} druid.text".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_text(SCHEME.{1})".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_text(\"{1}\")".format(node_name, node_name) if node_name.startswith("lang_text"): component_annotations += "\n---@field {0} druid.text".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_lang_text(SCHEME.{1}, \"lang_id\")".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_lang_text(\"{1}\", \"lang_id\")".format(node_name, node_name) if node_name.startswith("grid") or node_name.startswith("static_grid"): component_annotations += "\n---@field {0} druid.static_grid".format(node_name) component_define += "\n--TODO: Replace prefab_name with grid element prefab" - component_define += "\n\tself.{0} = self.druid:new_static_grid(SCHEME.{1}, \"prefab_name\", 1)".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_static_grid(\"{1}\", \"prefab_name\", 1)".format(node_name, node_name) if node_name.startswith("dynamic_grid"): component_annotations += "\n---@field {0} druid.dynamic_grid".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_dynamic_grid(SCHEME.{1})".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_dynamic_grid(\"{1}\")".format(node_name, node_name) if node_name.startswith("scroll_view"): field_name = node_name.replace("_view", "") content_name = node_name.replace("_view", "_content") component_annotations += "\n---@field {0} druid.scroll".format(field_name) - component_define += "\n\tself.{0} = self.druid:new_scroll(SCHEME.{1}, SCHEME.{2})".format(field_name, get_id(node_name), get_id(content_name)) + component_define += "\n\tself.{0} = self.druid:new_scroll(\"{1}\", \"{2}\")".format(field_name, node_name, content_name) if node_name.startswith("blocker"): component_annotations += "\n---@field {0} druid.blocker".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_blocker(SCHEME.{1})".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_blocker(\"{1}\")".format(node_name, node_name) if node_name.startswith("slider"): component_annotations += "\n---@field {0} druid.slider".format(node_name) component_define += "\n--TODO: Replace slider end position. It should be only vertical or horizontal" - component_define += "\n\tself.{0} = self.druid:new_slider(SCHEME.{1}, vmath.vector3(100, 0, 0), self._on_{0}_change)".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_slider(\"{1}\", vmath.vector3(100, 0, 0), self._on_{0}_change)".format(node_name, node_name) component_functions += "\nfunction M:_on_{0}_change(value)\n\tprint(\"Slider change:\", value)\nend\n\n".format(node_name) if node_name.startswith("progress"): component_annotations += "\n---@field {0} druid.progress".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_progress(SCHEME.{1}, \"x\")".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_progress(\"{1}\", \"x\")".format(node_name, get_id(node_name)) if node_name.startswith("timer"): component_annotations += "\n---@field {0} druid.timer".format(node_name) - component_define += "\n\tself.{0} = self.druid:new_timer(SCHEME.{1}, 59, 0, self._on_{0}_end)".format(node_name, get_id(node_name)) + component_define += "\n\tself.{0} = self.druid:new_timer(\"{1}\", 59, 0, self._on_{0}_end)".format(node_name, get_id(node_name)) component_functions += "\nfunction M:_on_{0}_end()\n\tprint(\"Timer {0} trigger\")\nend\n\n".format(node_name) @@ -126,7 +126,7 @@ def main(): filedata = filedata.replace("{COMPONENT_DEFINE}", component_define) filedata = filedata.replace("{COMPONENT_FUNCTIONS}", component_functions) filedata = filedata.replace("{COMPONENT_ANNOTATIONS}", component_annotations) - filedata = filedata.replace("{SCHEME_LIST}", ",\n".join(scheme_list)) + #filedata = filedata.replace("{SCHEME_LIST}", ",\n".join(scheme_list)) output_file = open(output_full_path, "w") output_file.write(filedata) diff --git a/druid/extended/figma_layout.lua b/druid/extended/figma_layout.lua index 3124ae2..0748a4e 100644 --- a/druid/extended/figma_layout.lua +++ b/druid/extended/figma_layout.lua @@ -93,14 +93,16 @@ function M:set_type(type) end ----@param is_hug boolean + +---@param is_hug_width boolean +---@param is_hug_height boolean ---@return druid.figma_layout -function M:set_hug_content(entity, is_hug) - self.is_resize_width = is_hug - self.is_resize_height = is_hug +function M:set_hug_content(is_hug_width, is_hug_height) + self.is_resize_width = is_hug_width or false + self.is_resize_height = is_hug_height or false self.is_dirty = true - return entity + return self end ---@param node_or_node_id string|node From 54345b924bebbe7cbce719d3a32c3fc667381c02 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 01:30:28 +0300 Subject: [PATCH 34/45] Update timer & text --- druid/annotations.lua | 2 +- druid/base/text.lua | 9 +++++++++ druid/extended/timer.lua | 16 +++++++++------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 3f0f074..e614543 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1752,7 +1752,7 @@ function druid_instance.new_text(self, node, value, no_adjust) end --- Create @{Timer} component ---@param self druid_instance ---@param node string|node Gui text node ----@param seconds_from number Start timer value in seconds +---@param seconds_from number|nil Start timer value in seconds ---@param seconds_to number|nil End timer value in seconds ---@param callback function|nil Function on timer end ---@return druid.timer @{Timer} component diff --git a/druid/base/text.lua b/druid/base/text.lua index 5d44c20..3aaa063 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -86,6 +86,13 @@ local utf8 = utf8 or utf8_lua --[[@as utf8]] local Text = component.create("text") local function update_text_size(self) + if self.scale.x == 0 or self.scale.y == 0 then + return + end + if self.start_scale.x == 0 or self.start_scale.y == 0 then + return + end + local size = vmath.vector3( self.start_size.x * (self.start_scale.x / self.scale.x), self.start_size.y * (self.start_scale.y / self.scale.y), @@ -207,6 +214,8 @@ local function update_text_with_trim(self, trim_postfix) end gui.set_text(self.node, new_text .. trim_postfix) + else + gui.set_text(self.node, self.last_value) end end diff --git a/druid/extended/timer.lua b/druid/extended/timer.lua index beb2af5..235f4be 100644 --- a/druid/extended/timer.lua +++ b/druid/extended/timer.lua @@ -47,24 +47,26 @@ end --- The @{Timer} constructor -- @tparam Timer self @{Timer} -- @tparam node node Gui text node --- @tparam number seconds_from Start timer value in seconds +-- @tparam number|nil seconds_from Start timer value in seconds -- @tparam number|nil seconds_to End timer value in seconds -- @tparam function|nil callback Function on timer end function Timer.init(self, node, seconds_from, seconds_to, callback) self.node = self:get_node(node) - seconds_from = math.max(seconds_from, 0) seconds_to = math.max(seconds_to or 0, 0) self.on_tick = Event() self.on_set_enabled = Event() self.on_timer_end = Event(callback) - self:set_to(seconds_from) - self:set_interval(seconds_from, seconds_to) + if seconds_from then + seconds_from = math.max(seconds_from, 0) + self:set_to(seconds_from) + self:set_interval(seconds_from, seconds_to) - if seconds_to - seconds_from == 0 then - self:set_state(false) - self.on_timer_end:trigger(self:get_context(), self) + if seconds_to - seconds_from == 0 then + self:set_state(false) + self.on_timer_end:trigger(self:get_context(), self) + end end return self From 067b650838bb5a304656acb15a9f76677fdf02fa Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 01:59:25 +0300 Subject: [PATCH 35/45] Get rid of middleclass --- druid/component.lua | 45 ++++----- druid/druid.lua | 4 +- druid/extended/hotkey.lua | 7 +- druid/system/druid_instance.lua | 7 +- druid/system/middleclass.lua | 156 -------------------------------- 5 files changed, 30 insertions(+), 189 deletions(-) delete mode 100644 druid/system/middleclass.lua diff --git a/druid/component.lua b/druid/component.lua index 98fcf51..d5bf761 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -19,10 +19,9 @@ -- @alias druid.base_component local const = require("druid.const") -local class = require("druid.system.middleclass") local helper = require("druid.helper") -local BaseComponent = class("druid.component") +local BaseComponent = {} local INTERESTS = {} -- Cache interests per component class in runtime local IS_AUTO_TEMPLATE = not (sys.get_config_int("druid.no_auto_template", 0) == "1") @@ -355,24 +354,6 @@ function BaseComponent.setup_component(self, druid_instance, context, style, ins end ---- Basic constructor of component. It will call automaticaly --- by `BaseComponent.create` --- @tparam BaseComponent self @{BaseComponent} --- @tparam string name BaseComponent name --- @tparam number|nil input_priority The input priority. The bigger number processed first --- @local -function BaseComponent.initialize(self, name, input_priority) - self._component = { - name = name, - input_priority = input_priority or const.PRIORITY_INPUT, - default_input_priority = input_priority or const.PRIORITY_INPUT, - is_debug = false, - _is_input_priority_changed = true, -- Default true for sort once time after GUI init - _uid = BaseComponent.create_uid() - } -end - - --- Print log information if debug mode is enabled -- @tparam BaseComponent self @{BaseComponent} -- @tparam string message @@ -499,12 +480,24 @@ end -- @tparam number|nil input_priority The input priority. The bigger number processed first -- @local function BaseComponent.create(name, input_priority) - -- Yea, inheritance here - local new_class = class(name, BaseComponent) - - new_class.initialize = function(self) - BaseComponent.initialize(self, name, input_priority) - end + local new_class = setmetatable({}, { + __index = BaseComponent, + __call = function(cls, ...) + local self = setmetatable({ + _component = { + name = name, + input_priority = input_priority or const.PRIORITY_INPUT, + default_input_priority = input_priority or const.PRIORITY_INPUT, + is_debug = false, + _is_input_priority_changed = true, -- Default true for sort once time after GUI init + _uid = BaseComponent.create_uid() + } + }, { + __index = cls + }) + return self + end + }) return new_class end diff --git a/druid/druid.lua b/druid/druid.lua index ad5e766..1d247f2 100644 --- a/druid/druid.lua +++ b/druid/druid.lua @@ -107,7 +107,9 @@ function M.new(context, style) M.set_default_style(default_style) end - local new_instance = druid_instance(context, style) + local new_instance = setmetatable({}, { __index = druid_instance }) + new_instance:initialize(context, style) + table.insert(_instances, new_instance) return new_instance end diff --git a/druid/extended/hotkey.lua b/druid/extended/hotkey.lua index 0076538..283839c 100644 --- a/druid/extended/hotkey.lua +++ b/druid/extended/hotkey.lua @@ -7,8 +7,11 @@ -- @within BaseComponent -- @alias druid.hotkey ---- On change state callback(self, state) --- @tfield DruidEvent on_change_state @{DruidEvent} +--- On hotkey released callback(self, argument) +-- @tfield DruidEvent on_hotkey_pressed @{DruidEvent} + +--- On hotkey released callback(self, argument) +-- @tfield DruidEvent on_hotkey_released @{DruidEvent} --- Visual node -- @tfield node node diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index c27d114..52a43c5 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -68,7 +68,6 @@ -- @see Timer local helper = require("druid.helper") -local class = require("druid.system.middleclass") local settings = require("druid.system.settings") local base_component = require("druid.component") @@ -94,7 +93,7 @@ local back_handler = require("druid.base.back_handler") -- local dynamic_grid = require("druid.extended.dynamic_grid") -- local checkbox_group = require("druid.extended.checkbox_group") -local DruidInstance = class("druid.druid_instance") +local DruidInstance = {} local MSG_ADD_FOCUS = hash("acquire_input_focus") local MSG_REMOVE_FOCUS = hash("release_input_focus") @@ -479,7 +478,7 @@ end -- @tparam table|BaseComponent|nil whitelist_components The array of component to whitelist -- @treturn self @{DruidInstance} function DruidInstance.set_whitelist(self, whitelist_components) - if whitelist_components and whitelist_components.isInstanceOf then + if whitelist_components and whitelist_components._component then whitelist_components = { whitelist_components } end @@ -501,7 +500,7 @@ end -- @tparam table|BaseComponent|nil blacklist_components The array of component to blacklist -- @treturn self @{DruidInstance} function DruidInstance.set_blacklist(self, blacklist_components) - if blacklist_components and blacklist_components.isInstanceOf then + if blacklist_components and blacklist_components._component then blacklist_components = { blacklist_components } end diff --git a/druid/system/middleclass.lua b/druid/system/middleclass.lua deleted file mode 100644 index e0ef598..0000000 --- a/druid/system/middleclass.lua +++ /dev/null @@ -1,156 +0,0 @@ --- Source: https://github.com/kikito/middleclass -local middleclass = {} - -local function _createIndexWrapper(aClass, f) - if f == nil then - return aClass.__instanceDict - else - return function(self, name) - local value = aClass.__instanceDict[name] - - if value ~= nil then - return value - elseif type(f) == "function" then - return (f(self, name)) - else - return f[name] - end - end - end -end - -local function _propagateInstanceMethod(aClass, name, f) - f = name == "__index" and _createIndexWrapper(aClass, f) or f - aClass.__instanceDict[name] = f - - for subclass in pairs(aClass.subclasses) do - if rawget(subclass.__declaredMethods, name) == nil then - _propagateInstanceMethod(subclass, name, f) - end - end -end - -local function _declareInstanceMethod(aClass, name, f) - aClass.__declaredMethods[name] = f - - if f == nil and aClass.super then - f = aClass.super.__instanceDict[name] - end - - _propagateInstanceMethod(aClass, name, f) -end - -local function _tostring(self) return "class " .. self.name end -local function _call(self, ...) return self:instantiate(...) end - -local function _createClass(name, super) - local dict = {} - dict.__index = dict - - local aClass = { name = name, super = super, static = {}, - __instanceDict = dict, __declaredMethods = {}, - subclasses = setmetatable({}, {__mode='k'}) } - - if super then - setmetatable(aClass.static, { - __index = function(_,k) - local result = rawget(dict,k) - if result == nil then - return super.static[k] - end - return result - end - }) - else - setmetatable(aClass.static, { __index = function(_,k) return rawget(dict,k) end }) - end - - setmetatable(aClass, { __index = aClass.static, __tostring = _tostring, - __call = _call, __newindex = _declareInstanceMethod }) - - return aClass -end - -local function _includeMixin(aClass, mixin) - assert(type(mixin) == 'table', "mixin must be a table") - - for name,method in pairs(mixin) do - if name ~= "included" and name ~= "static" then aClass[name] = method end - end - - for name,method in pairs(mixin.static or {}) do - aClass.static[name] = method - end - - if type(mixin.included)=="function" then mixin:included(aClass) end - return aClass -end - -local DefaultMixin = { - __tostring = function(self) return "instance of " .. tostring(self.class) end, - - initialize = function(self, ...) end, - - isInstanceOf = function(self, aClass) - return type(aClass) == 'table' - and type(self) == 'table' - and (self.class == aClass - or type(self.class) == 'table' - and type(self.class.isSubclassOf) == 'function' - and self.class:isSubclassOf(aClass)) - end, - - static = { - allocate = function(self) - assert(type(self) == 'table', "Make sure that you are using 'Class:allocate' instead of 'Class.allocate'") - return setmetatable({ class = self }, self.__instanceDict) - end, - - instantiate = function(self, ...) - assert(type(self) == 'table', "Make sure that you are using 'Class:instantiate' instead of 'Class.instantiate'") - local instance = self:allocate() - instance:initialize(...) - return instance - end, - - subclass = function(self, name) - assert(type(self) == 'table', "Make sure that you are using 'Class:subclass' instead of 'Class.subclass'") - assert(type(name) == "string", "You must provide a name(string) for your class") - - local subclass = _createClass(name, self) - - for methodName, f in pairs(self.__instanceDict) do - _propagateInstanceMethod(subclass, methodName, f) - end - subclass.initialize = function(instance, ...) return self.initialize(instance, ...) end - - self.subclasses[subclass] = true - self:subclassed(subclass) - - return subclass - end, - - subclassed = function(self, other) end, - - isSubclassOf = function(self, other) - return type(other) == 'table' and - type(self.super) == 'table' and - ( self.super == other or self.super:isSubclassOf(other) ) - end, - - include = function(self, ...) - assert(type(self) == 'table', "Make sure you that you are using 'Class:include' instead of 'Class.include'") - for _,mixin in ipairs({...}) do _includeMixin(self, mixin) end - return self - end - } -} - -function middleclass.class(name, super) - assert(type(name) == 'string', "A name (string) is needed for the new class") - return super and super:subclass(name) or _includeMixin(_createClass(name), DefaultMixin) -end - -setmetatable(middleclass, { __call = function(_, ...) return middleclass.class(...) end }) - -return middleclass From a5e579ddaa1f988b66d0fd26511f7876b6e01144 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 02:48:41 +0300 Subject: [PATCH 36/45] Update button hold callback --- druid/annotations.lua | 2 ++ druid/base/button.lua | 7 ++++++- druid/editor_scripts/component.lua_template | 2 +- utils/annotations_manual.lua | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index e614543..e8395b4 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -1952,6 +1952,8 @@ function helper.table_to_string(t) end -- Manual Annotations -- +---@class druid.component: druid.base_component + ---@class druid.rich_text.metrics ---@field width number ---@field height number diff --git a/druid/base/button.lua b/druid/base/button.lua index f406801..b08d897 100755 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -240,7 +240,12 @@ local function on_button_release(self) is_double_click = is_double_click and self.on_double_click:is_exist() if is_long_click then - on_button_long_click(self) + local is_hold_complete = (time - self.last_pressed_time) >= self.style.AUTOHOLD_TRIGGER + if is_hold_complete then + on_button_long_click(self) + else + self.on_click_outside:trigger(self:get_context(), self.params, self) + end elseif is_double_click then on_button_double_click(self) else diff --git a/druid/editor_scripts/component.lua_template b/druid/editor_scripts/component.lua_template index 560dc2a..f33bae3 100644 --- a/druid/editor_scripts/component.lua_template +++ b/druid/editor_scripts/component.lua_template @@ -7,7 +7,7 @@ local component = require("druid.component") ----@class {COMPONENT_TYPE}: druid.base_component +---@class {COMPONENT_TYPE}: druid.component ---@field druid druid_instance{COMPONENT_ANNOTATIONS} local M = component.create("{COMPONENT_TYPE}") diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index 6f6547a..cc258b2 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -1,5 +1,7 @@ -- Manual Annotations -- +---@class druid.component: druid.base_component + ---@class druid.rich_text.metrics ---@field width number ---@field height number From 2f5336fa4fe5367e5718e9fe70fb698f5200d490 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 02:49:56 +0300 Subject: [PATCH 37/45] Remove annotations --- annotations/defold/b2d.body.lua | 275 ----- annotations/defold/b2d.lua | 27 - annotations/defold/bit.lua | 104 -- annotations/defold/buffer.lua | 107 -- annotations/defold/builtins.lua | 32 - annotations/defold/camera.lua | 26 - annotations/defold/collectionfactory.lua | 86 -- annotations/defold/collectionproxy.lua | 40 - annotations/defold/crash.lua | 117 -- annotations/defold/factory.lua | 78 -- annotations/defold/go.lua | 355 ------- annotations/defold/gui.lua | 1236 ---------------------- annotations/defold/html5.lua | 37 - annotations/defold/http.lua | 49 - annotations/defold/image.lua | 78 -- annotations/defold/json.lua | 41 - annotations/defold/label.lua | 28 - annotations/defold/liveupdate.lua | 155 --- annotations/defold/model.lua | 92 -- annotations/defold/msg.lua | 54 - annotations/defold/particlefx.lua | 85 -- annotations/defold/physics.lua | 300 ------ annotations/defold/profiler.lua | 126 --- annotations/defold/render.lua | 674 ------------ annotations/defold/resource.lua | 760 ------------- annotations/defold/socket.lua | 173 --- annotations/defold/sound.lua | 160 --- annotations/defold/sprite.lua | 62 -- annotations/defold/sys.lua | 314 ------ annotations/defold/tilemap.lua | 90 -- annotations/defold/timer.lua | 68 -- annotations/defold/types.lua | 111 -- annotations/defold/vmath.lua | 404 ------- annotations/defold/window.lua | 110 -- annotations/defold/zlib.lua | 28 - 35 files changed, 6482 deletions(-) delete mode 100644 annotations/defold/b2d.body.lua delete mode 100644 annotations/defold/b2d.lua delete mode 100644 annotations/defold/bit.lua delete mode 100644 annotations/defold/buffer.lua delete mode 100644 annotations/defold/builtins.lua delete mode 100644 annotations/defold/camera.lua delete mode 100644 annotations/defold/collectionfactory.lua delete mode 100644 annotations/defold/collectionproxy.lua delete mode 100644 annotations/defold/crash.lua delete mode 100644 annotations/defold/factory.lua delete mode 100644 annotations/defold/go.lua delete mode 100644 annotations/defold/gui.lua delete mode 100644 annotations/defold/html5.lua delete mode 100644 annotations/defold/http.lua delete mode 100644 annotations/defold/image.lua delete mode 100644 annotations/defold/json.lua delete mode 100644 annotations/defold/label.lua delete mode 100644 annotations/defold/liveupdate.lua delete mode 100644 annotations/defold/model.lua delete mode 100644 annotations/defold/msg.lua delete mode 100644 annotations/defold/particlefx.lua delete mode 100644 annotations/defold/physics.lua delete mode 100644 annotations/defold/profiler.lua delete mode 100644 annotations/defold/render.lua delete mode 100644 annotations/defold/resource.lua delete mode 100644 annotations/defold/socket.lua delete mode 100644 annotations/defold/sound.lua delete mode 100644 annotations/defold/sprite.lua delete mode 100644 annotations/defold/sys.lua delete mode 100644 annotations/defold/tilemap.lua delete mode 100644 annotations/defold/timer.lua delete mode 100644 annotations/defold/types.lua delete mode 100644 annotations/defold/vmath.lua delete mode 100644 annotations/defold/window.lua delete mode 100644 annotations/defold/zlib.lua diff --git a/annotations/defold/b2d.body.lua b/annotations/defold/b2d.body.lua deleted file mode 100644 index b4e9b82..0000000 --- a/annotations/defold/b2d.body.lua +++ /dev/null @@ -1,275 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Box2D b2Body documentation - - Functions for interacting with Box2D bodies. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.b2d.body -b2d.body = {} - ----Dynamic body -b2d.body.B2_DYNAMIC_BODY = nil - ----Kinematic body -b2d.body.B2_KINEMATIC_BODY = nil - ----Static (immovable) body -b2d.body.B2_STATIC_BODY = nil - ----Apply an angular impulse. ----@param body b2Body body ----@param impulse number impulse the angular impulse in units of kgmm/s -function b2d.body.apply_angular_impulse(body, impulse) end - ----Apply a force at a world point. If the force is not ----applied at the center of mass, it will generate a torque and ----affect the angular velocity. This wakes up the body. ----@param body b2Body body ----@param force vector3 the world force vector, usually in Newtons (N). ----@param point vector3 the world position of the point of application. -function b2d.body.apply_force(body, force, point) end - ----Apply a force to the center of mass. This wakes up the body. ----@param body b2Body body ----@param force vector3 the world force vector, usually in Newtons (N). -function b2d.body.apply_force_to_center(body, force) end - ----Apply an impulse at a point. This immediately modifies the velocity. ----It also modifies the angular velocity if the point of application ----is not at the center of mass. This wakes up the body. ----@param body b2Body body ----@param impulse vector3 the world impulse vector, usually in N-seconds or kg-m/s. ----@param point vector3 the world position of the point of application. -function b2d.body.apply_linear_impulse(body, impulse, point) end - ----Apply a torque. This affects the angular velocity ----without affecting the linear velocity of the center of mass. ----This wakes up the body. ----@param body b2Body body ----@param torque number torque about the z-axis (out of the screen), usually in N-m. -function b2d.body.apply_torque(body, torque) end - ----Print the body representation to the log output ----@param body b2Body body -function b2d.body.dump(body) end - ----Get the angular damping of the body. ----@param body b2Body body ----@return number damping the damping -function b2d.body.get_angular_damping(body) end - ----Get the angular velocity. ----@param body b2Body body ----@return number velocity the angular velocity in radians/second. -function b2d.body.get_angular_velocity(body) end - ----Set the angular velocity. ----@param body b2Body body ----@param omega number the new angular velocity in radians/second. -function b2d.body.get_angular_velocity(body, omega) end - ----Get the gravity scale of the body. ----@param body b2Body body ----@return number scale the scale -function b2d.body.get_gravity_scale(body) end - ----Get the rotational inertia of the body about the local origin. ----@param body b2Body body ----@return number inertia the rotational inertia, usually in kg-m^2. -function b2d.body.get_inertia(body) end - ----Get the linear damping of the body. ----@param body b2Body body ----@return number damping the damping -function b2d.body.get_linear_damping(body) end - ----Get the linear velocity of the center of mass. ----@param body b2Body body ----@return vector3 velocity the linear velocity of the center of mass. -function b2d.body.get_linear_velocity(body) end - ----Get the world velocity of a local point. ----@param body b2Body body ----@param world_point vector3 a point in local coordinates. ----@return vector3 velocity the world velocity of a point. -function b2d.body.get_linear_velocity_from_world_point(body, world_point) end - ----Get the world linear velocity of a world point attached to this body. ----@param body b2Body body ----@param world_point vector3 a point in world coordinates. ----@return vector3 velocity the world velocity of a point. -function b2d.body.get_linear_velocity_from_world_point(body, world_point) end - ----Get the local position of the center of mass. ----@param body b2Body body ----@return vector3 center Get the local position of the center of mass. -function b2d.body.get_local_center(body) end - ----Gets a local point relative to the body's origin given a world point. ----@param body b2Body body ----@param world_point vector3 a point in world coordinates. ----@return vector3 vector the corresponding local point relative to the body's origin. -function b2d.body.get_local_point(body, world_point) end - ----Gets a local vector given a world vector. ----@param body b2Body body ----@param world_vector vector3 a vector in world coordinates. ----@return vector3 vector the corresponding local vector. -function b2d.body.get_local_vector(body, world_vector) end - ----Get the total mass of the body. ----@param body b2Body body ----@return number mass the mass, usually in kilograms (kg). -function b2d.body.get_mass(body) end - ----Get the next body in the world's body list. ----@param body b2Body body ----@return b2Body body the next body -function b2d.body.get_next(body) end - ----Get the world body origin position. ----@param body b2Body body ----@return vector3 position the world position of the body's origin. -function b2d.body.get_position(body) end - ----Get the type of this body. ----@param body b2Body body ----@return b2BodyType type the body type -function b2d.body.get_type(body) end - ----Get the parent world of this body. ----@param body b2Body body ----@return b2World world -function b2d.body.get_world(body) end - ----Get the angle in radians. ----@param body b2Body body ----@return number angle the current world rotation angle in radians. -function b2d.body.get_world_center(body) end - ----Get the world position of the center of mass. ----@param body b2Body body ----@return vector3 center Get the world position of the center of mass. -function b2d.body.get_world_center(body) end - ----Get the world coordinates of a point given the local coordinates. ----@param body b2Body body ----@param local_vector vector3 localPoint a point on the body measured relative the the body's origin. ----@return vector3 vector the same point expressed in world coordinates. -function b2d.body.get_world_point(body, local_vector) end - ----Get the world coordinates of a vector given the local coordinates. ----@param body b2Body body ----@param local_vector vector3 a vector fixed in the body. ----@return vector3 vector the same vector expressed in world coordinates. -function b2d.body.get_world_vector(body, local_vector) end - ----Get the active state of the body. ----@param body b2Body body ----@return bool enabled is the body active -function b2d.body.is_active(body) end - ----Get the sleeping state of this body. ----@param body b2Body body ----@return bool enabled true if the body is awake, false if it's sleeping. -function b2d.body.is_awake(body) end - ----Is this body in bullet mode ----@param body b2Body body ----@return bool enabled true if the body is in bullet mode -function b2d.body.is_bullet(body) end - ----Does this body have fixed rotation? ----@param body b2Body body ----@return bool enabled is the rotation fixed -function b2d.body.is_fixed_rotation(body) end - ----Is this body allowed to sleep ----@param body b2Body body ----@return bool enabled true if the body is allowed to sleep -function b2d.body.is_sleeping_allowed(body) end - ----This resets the mass properties to the sum of the mass properties of the fixtures. ----This normally does not need to be called unless you called SetMassData to override ----@param body b2Body body -function b2d.body.reset_mass_data(body) end - ----Set the active state of the body. An inactive body is not ----simulated and cannot be collided with or woken up. ----If you pass a flag of true, all fixtures will be added to the ----broad-phase. ----If you pass a flag of false, all fixtures will be removed from ----the broad-phase and all contacts will be destroyed. ----Fixtures and joints are otherwise unaffected. You may continue ----to create/destroy fixtures and joints on inactive bodies. ----Fixtures on an inactive body are implicitly inactive and will ----not participate in collisions, ray-casts, or queries. ----Joints connected to an inactive body are implicitly inactive. ----An inactive body is still owned by a b2World object and remains ----in the body list. ----@param body b2Body body ----@param enable bool true if the body should be active -function b2d.body.set_active(body, enable) end - ----Set the angular damping of the body. ----@param body b2Body body ----@param damping number the damping -function b2d.body.set_angular_damping(body, damping) end - ----Set the sleep state of the body. A sleeping body has very low CPU cost. ----@param body b2Body body ----@param enable bool flag set to false to put body to sleep, true to wake it. -function b2d.body.set_awake(body, enable) end - ----Should this body be treated like a bullet for continuous collision detection? ----@param body b2Body body ----@param enable bool if true, the body will be in bullet mode -function b2d.body.set_bullet(body, enable) end - ----Set this body to have fixed rotation. This causes the mass to be reset. ----@param body b2Body body ----@param enable bool true if the rotation should be fixed -function b2d.body.set_fixed_rotation(body, enable) end - ----Set the gravity scale of the body. ----@param body b2Body body ----@param scale number the scale -function b2d.body.set_gravity_scale(body, scale) end - ----Set the linear damping of the body. ----@param body b2Body body ----@param damping number the damping -function b2d.body.set_linear_damping(body, damping) end - ----Set the linear velocity of the center of mass. ----@param body b2Body body ----@param velocity vector3 the new linear velocity of the center of mass. -function b2d.body.set_linear_velocity(body, velocity) end - ----You can disable sleeping on this body. If you disable sleeping, the body will be woken. ----@param body b2Body body ----@param enable bool if false, the body will never sleep, and consume more CPU -function b2d.body.set_sleeping_allowed(body, enable) end - ----Set the position of the body's origin and rotation. ----This breaks any contacts and wakes the other bodies. ----Manipulating a body's transform may cause non-physical behavior. ----@param body b2Body body ----@param position vector3 the world position of the body's local origin. ----@param angle number the world position of the body's local origin. -function b2d.body.set_transform(body, position, angle) end - ----Set the type of this body. This may alter the mass and velocity. ----@param body b2Body body ----@param type b2BodyType the body type -function b2d.body.set_type(body, type) end - -return b2d.body \ No newline at end of file diff --git a/annotations/defold/b2d.lua b/annotations/defold/b2d.lua deleted file mode 100644 index 45d5bdd..0000000 --- a/annotations/defold/b2d.lua +++ /dev/null @@ -1,27 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Box2D documentation - - Functions for interacting with Box2D. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.b2d -b2d = {} - ----Get the Box2D body from a collision object ----@param url string|hash|url the url to the game object collision component ----@return b2Body body the body if successful. Otherwise nil. -function b2d.get_body(url) end - ----Get the Box2D world from the current collection ----@return b2World world the world if successful. Otherwise nil. -function b2d.get_world() end - -return b2d \ No newline at end of file diff --git a/annotations/defold/bit.lua b/annotations/defold/bit.lua deleted file mode 100644 index d11b857..0000000 --- a/annotations/defold/bit.lua +++ /dev/null @@ -1,104 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Bitwise operations API documentation - - Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers. - Lua BitOp is Copyright © 2008-2012 Mike Pall. - Lua BitOp is free software, released under the MIT license (same license as the Lua core). - Lua BitOp is compatible with the built-in bitwise operations in LuaJIT 2.0 and is used - on platforms where Defold runs without LuaJIT. - For clarity the examples assume the definition of a helper function printx(). - This prints its argument as an unsigned 32 bit hexadecimal number on all platforms: - function printx(x) - print("0x"..bit.tohex(x)) - end ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.bit -bit = {} - ----Returns the bitwise arithmetic right-shift of its first argument by the number of bits given by the second argument. ----Arithmetic right-shift treats the most-significant bit as a sign bit and replicates it. ----Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). ----@param x number number ----@param n number number of bits ----@return number y bitwise arithmetic right-shifted number -function bit.arshift(x, n) end - ----Returns the bitwise and of all of its arguments. Note that more than two arguments are allowed. ----@param x1 number number ----@param ... number|nil number(s) ----@return number y bitwise and of the provided arguments -function bit.band(x1, ...) end - ----Returns the bitwise not of its argument. ----@param x number number ----@return number y bitwise not of number x -function bit.bnot(x) end - ----Returns the bitwise or of all of its arguments. Note that more than two arguments are allowed. ----@param x1 number number ----@param ... number|nil number(s) ----@return number y bitwise or of the provided arguments -function bit.bor(x1, ...) end - ----Swaps the bytes of its argument and returns it. This can be used to convert little-endian 32 bit numbers to big-endian 32 bit numbers or vice versa. ----@param x number number ----@return number y bitwise swapped number -function bit.bswap(x) end - ----Returns the bitwise xor of all of its arguments. Note that more than two arguments are allowed. ----@param x1 number number ----@param ... number|nil number(s) ----@return number y bitwise xor of the provided arguments -function bit.bxor(x1, ...) end - ----Returns the bitwise logical left-shift of its first argument by the number of bits given by the second argument. ----Logical shifts treat the first argument as an unsigned number and shift in 0-bits. ----Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). ----@param x number number ----@param n number number of bits ----@return number y bitwise logical left-shifted number -function bit.lshift(x, n) end - ----Returns the bitwise left rotation of its first argument by the number of bits given by the second argument. Bits shifted out on one side are shifted back in on the other side. ----Only the lower 5 bits of the rotate count are used (reduces to the range [0..31]). ----@param x number number ----@param n number number of bits ----@return number y bitwise left-rotated number -function bit.rol(x, n) end - ----Returns the bitwise right rotation of its first argument by the number of bits given by the second argument. Bits shifted out on one side are shifted back in on the other side. ----Only the lower 5 bits of the rotate count are used (reduces to the range [0..31]). ----@param x number number ----@param n number number of bits ----@return number y bitwise right-rotated number -function bit.ror(x, n) end - ----Returns the bitwise logical right-shift of its first argument by the number of bits given by the second argument. ----Logical shifts treat the first argument as an unsigned number and shift in 0-bits. ----Only the lower 5 bits of the shift count are used (reduces to the range [0..31]). ----@param x number number ----@param n number number of bits ----@return number y bitwise logical right-shifted number -function bit.rshift(x, n) end - ----Normalizes a number to the numeric range for bit operations and returns it. This function is usually not needed since all bit operations already normalize all of their input arguments. ----@param x number number to normalize ----@return number y normalized number -function bit.tobit(x) end - ----Converts its first argument to a hex string. The number of hex digits is given by the absolute value of the optional second argument. Positive numbers between 1 and 8 generate lowercase hex digits. Negative numbers generate uppercase hex digits. Only the least-significant 4*|n| bits are used. The default is to generate 8 lowercase hex digits. ----@param x number number to convert ----@param n number number of hex digits to return ----@return string s hexadecimal string -function bit.tohex(x, n) end - -return bit \ No newline at end of file diff --git a/annotations/defold/buffer.lua b/annotations/defold/buffer.lua deleted file mode 100644 index 5bc4166..0000000 --- a/annotations/defold/buffer.lua +++ /dev/null @@ -1,107 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Buffer API documentation - - Functions for manipulating buffers and streams ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.buffer -buffer = {} - ----Float, single precision, 4 bytes -buffer.VALUE_TYPE_FLOAT32 = nil - ----Signed integer, 2 bytes -buffer.VALUE_TYPE_INT16 = nil - ----Signed integer, 4 bytes -buffer.VALUE_TYPE_INT32 = nil - ----Signed integer, 8 bytes -buffer.VALUE_TYPE_INT64 = nil - ----Signed integer, 1 byte -buffer.VALUE_TYPE_INT8 = nil - ----Unsigned integer, 2 bytes -buffer.VALUE_TYPE_UINT16 = nil - ----Unsigned integer, 4 bytes -buffer.VALUE_TYPE_UINT32 = nil - ----Unsigned integer, 8 bytes -buffer.VALUE_TYPE_UINT64 = nil - ----Unsigned integer, 1 byte -buffer.VALUE_TYPE_UINT8 = nil - ----Copy all data streams from one buffer to another, element wise. ---- Each of the source streams must have a matching stream in the ----destination buffer. The streams must match in both type and size. ----The source and destination buffer can be the same. ----@param dst buffer_data the destination buffer ----@param dstoffset number the offset to start copying data to ----@param src buffer_data the source data buffer ----@param srcoffset number the offset to start copying data from ----@param count number the number of elements to copy -function buffer.copy_buffer(dst, dstoffset, src, srcoffset, count) end - ----Copy a specified amount of data from one stream to another. ---- The value type and size must match between source and destination streams. ----The source and destination streams can be the same. ----@param dst buffer_stream the destination stream ----@param dstoffset number the offset to start copying data to (measured in value type) ----@param src buffer_stream the source data stream ----@param srcoffset number the offset to start copying data from (measured in value type) ----@param count number the number of values to copy (measured in value type) -function buffer.copy_stream(dst, dstoffset, src, srcoffset, count) end - ----Create a new data buffer containing a specified set of streams. A data buffer ----can contain one or more streams with typed data. This is useful for managing ----compound data, for instance a vertex buffer could contain separate streams for ----vertex position, color, normal etc. ----@param element_count number The number of elements the buffer should hold ----@param declaration { name:hash|string, type:constant, count:number }[] A table where each entry (table) describes a stream ---- ----hash | string name: The name of the stream ----constant type: The data type of the stream ----number count: The number of values each element should hold ---- ----@return buffer_data buffer the new buffer -function buffer.create(element_count, declaration) end - ----Get a copy of all the bytes from a specified stream as a Lua string. ----@param buffer buffer_data the source buffer ----@param stream_name hash the name of the stream ----@return string data the buffer data as a Lua string -function buffer.get_bytes(buffer, stream_name) end - ----Get a named metadata entry from a buffer along with its type. ----@param buf buffer_data the buffer to get the metadata from ----@param metadata_name hash|string name of the metadata entry ----@return number[]|nil values table of metadata values or nil if the entry does not exist ----@return constant|nil value_type numeric type of values or nil -function buffer.get_metadata(buf, metadata_name) end - ----Get a specified stream from a buffer. ----@param buffer buffer_data the buffer to get the stream from ----@param stream_name hash|string the stream name ----@return buffer_stream stream the data stream -function buffer.get_stream(buffer, stream_name) end - ----Creates or updates a metadata array entry on a buffer. ---- The value type and count given when updating the entry should match those used when first creating it. ----@param buf buffer_data the buffer to set the metadata on ----@param metadata_name hash|string name of the metadata entry ----@param values number[] actual metadata, an array of numeric values ----@param value_type constant type of values when stored -function buffer.set_metadata(buf, metadata_name, values, value_type) end - -return buffer \ No newline at end of file diff --git a/annotations/defold/builtins.lua b/annotations/defold/builtins.lua deleted file mode 100644 index 5a182a5..0000000 --- a/annotations/defold/builtins.lua +++ /dev/null @@ -1,32 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Built-ins API documentation - - Built-in scripting functions. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----All ids in the engine are represented as hashes, so a string needs to be hashed ----before it can be compared with an id. ----@param s string string to hash ----@return hash hash a hashed string -function hash(s) end - ----Returns a hexadecimal representation of a hash value. ----The returned string is always padded with leading zeros. ----@param h hash hash value to get hex string for ----@return string hex hex representation of the hash -function hash_to_hex(h) end - ----Pretty printing of Lua values. This function prints Lua values ----in a manner similar to +print()+, but will also recurse into tables ----and pretty print them. There is a limit to how deep the function ----will recurse. ----@param ... any value to print -function pprint(...) end \ No newline at end of file diff --git a/annotations/defold/camera.lua b/annotations/defold/camera.lua deleted file mode 100644 index 8cc9f9f..0000000 --- a/annotations/defold/camera.lua +++ /dev/null @@ -1,26 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Camera API documentation - - Messages to control camera components and camera focus. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.camera -camera = {} - ----makes camera active ----@param url string|hash|url url of camera component -function camera.acquire_focus(url) end - ----deactivate camera ----@param url string|hash|url url of camera component -function camera.release_focus(url) end - -return camera \ No newline at end of file diff --git a/annotations/defold/collectionfactory.lua b/annotations/defold/collectionfactory.lua deleted file mode 100644 index d21caf8..0000000 --- a/annotations/defold/collectionfactory.lua +++ /dev/null @@ -1,86 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Collection factory API documentation - - Functions for controlling collection factory components which are - used to dynamically spawn collections into the runtime. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.collectionfactory -collectionfactory = {} - ----loaded -collectionfactory.STATUS_LOADED = nil - ----loading -collectionfactory.STATUS_LOADING = nil - ----unloaded -collectionfactory.STATUS_UNLOADED = nil - ----The URL identifies the collectionfactory component that should do the spawning. ----Spawning is instant, but spawned game objects get their first update calls the following frame. The supplied parameters for position, rotation and scale ----will be applied to the whole collection when spawned. ----Script properties in the created game objects can be overridden through ----a properties-parameter table. The table should contain game object ids ----(hash) as keys and property tables as values to be used when initiating each ----spawned game object. ----See go.property for more information on script properties. ----The function returns a table that contains a key for each game object ----id (hash), as addressed if the collection file was top level, and the ----corresponding spawned instance id (hash) as value with a unique path ----prefix added to each instance. ---- Calling collectionfactory.create create on a collection factory that is marked as dynamic without having loaded resources ----using collectionfactory.load will synchronously load and create resources which may affect application performance. ----@param url string|hash|url the collection factory component to be used ----@param position vector3|nil position to assign to the newly spawned collection ----@param rotation quaternion|nil rotation to assign to the newly spawned collection ----@param properties table|nil table of script properties to propagate to any new game object instances ----@param scale number|nil uniform scaling to apply to the newly spawned collection (must be greater than 0). ----@return table ids a table mapping the id:s from the collection to the new instance id:s -function collectionfactory.create(url, position, rotation, properties, scale) end - ----This returns status of the collection factory. ----Calling this function when the factory is not marked as dynamic loading always returns COMP_COLLECTION_FACTORY_STATUS_LOADED. ----@param url string|hash|url|nil the collection factory component to get status from ----@return constant status status of the collection factory component ---- ----collectionfactory.STATUS_UNLOADED ----collectionfactory.STATUS_LOADING ----collectionfactory.STATUS_LOADED ---- -function collectionfactory.get_status(url) end - ----Resources loaded are referenced by the collection factory component until the existing (parent) collection is destroyed or collectionfactory.unload is called. ----Calling this function when the factory is not marked as dynamic loading does nothing. ----@param url string|hash|url|nil the collection factory component to load ----@param complete_function fun(self, url, result)|nil function to call when resources are loaded. ---- ----self ----object The current object. ----url ----url url of the collection factory component ----result ----boolean True if resource were loaded successfully ---- -function collectionfactory.load(url, complete_function) end - ----Changes the prototype for the collection factory. ----Setting the prototype to "nil" will revert back to the original prototype. ----@param url string|hash|url|nil the collection factory component ----@param prototype string|nil the path to the new prototype, or nil -function collectionfactory.set_prototype(url, prototype) end - ----This decreases the reference count for each resource loaded with collectionfactory.load. If reference is zero, the resource is destroyed. ----Calling this function when the factory is not marked as dynamic loading does nothing. ----@param url string|hash|url|nil the collection factory component to unload -function collectionfactory.unload(url) end - -return collectionfactory \ No newline at end of file diff --git a/annotations/defold/collectionproxy.lua b/annotations/defold/collectionproxy.lua deleted file mode 100644 index f8a3101..0000000 --- a/annotations/defold/collectionproxy.lua +++ /dev/null @@ -1,40 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Collection proxy API documentation - - Messages for controlling and interacting with collection proxies - which are used to dynamically load collections into the runtime. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.collectionproxy -collectionproxy = {} - ----return an indexed table of resources for a collection proxy. Each ----entry is a hexadecimal string that represents the data of the specific ----resource. This representation corresponds with the filename for each ----individual resource that is exported when you bundle an application with ----LiveUpdate functionality. ----@param collectionproxy url the collectionproxy to check for resources. ----@return string[] resources the resources -function collectionproxy.get_resources(collectionproxy) end - ----return an array of missing resources for a collection proxy. Each ----entry is a hexadecimal string that represents the data of the specific ----resource. This representation corresponds with the filename for each ----individual resource that is exported when you bundle an application with ----LiveUpdate functionality. It should be considered good practise to always ----check whether or not there are any missing resources in a collection proxy ----before attempting to load the collection proxy. ----@param collectionproxy url the collectionproxy to check for missing ----resources. ----@return string[] resources the missing resources -function collectionproxy.missing_resources(collectionproxy) end - -return collectionproxy \ No newline at end of file diff --git a/annotations/defold/crash.lua b/annotations/defold/crash.lua deleted file mode 100644 index 8534335..0000000 --- a/annotations/defold/crash.lua +++ /dev/null @@ -1,117 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Crash API documentation - - Native crash logging functions and constants. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.crash -crash = {} - ----android build fingerprint -crash.SYSFIELD_ANDROID_BUILD_FINGERPRINT = nil - ----system device language as reported by sys.get_sys_info -crash.SYSFIELD_DEVICE_LANGUAGE = nil - ----device model as reported by sys.get_sys_info -crash.SYSFIELD_DEVICE_MODEL = nil - ----engine version as hash -crash.SYSFIELD_ENGINE_HASH = nil - ----engine version as release number -crash.SYSFIELD_ENGINE_VERSION = nil - ----system language as reported by sys.get_sys_info -crash.SYSFIELD_LANGUAGE = nil - ----device manufacturer as reported by sys.get_sys_info -crash.SYSFIELD_MANUFACTURER = nil - ----The max number of sysfields. -crash.SYSFIELD_MAX = nil - ----system name as reported by sys.get_sys_info -crash.SYSFIELD_SYSTEM_NAME = nil - ----system version as reported by sys.get_sys_info -crash.SYSFIELD_SYSTEM_VERSION = nil - ----system territory as reported by sys.get_sys_info -crash.SYSFIELD_TERRITORY = nil - ----The max number of user fields. -crash.USERFIELD_MAX = nil - ----The max size of a single user field. -crash.USERFIELD_SIZE = nil - ----A table is returned containing the addresses of the call stack. ----@param handle number crash dump handle ----@return table backtrace table containing the backtrace -function crash.get_backtrace(handle) end - ----The format of read text blob is platform specific ----and not guaranteed ----but can be useful for manual inspection. ----@param handle number crash dump handle ----@return string blob string with the platform specific data -function crash.get_extra_data(handle) end - ----The function returns a table containing entries with sub-tables that ----have fields 'name' and 'address' set for all loaded modules. ----@param handle number crash dump handle ----@return { name:string, address:string }[] modules module table -function crash.get_modules(handle) end - ----read signal number from a crash report ----@param handle number crash dump handle ----@return number signal signal number -function crash.get_signum(handle) end - ----reads a system field from a loaded crash dump ----@param handle number crash dump handle ----@param index number system field enum. Must be less than crash.SYSFIELD_MAX ----@return string|nil value value recorded in the crash dump, or nil if it didn't exist -function crash.get_sys_field(handle, index) end - ----reads user field from a loaded crash dump ----@param handle number crash dump handle ----@param index number user data slot index ----@return string value user data value recorded in the crash dump -function crash.get_user_field(handle, index) end - ----The crash dump will be removed from disk upon a successful ----load, so loading is one-shot. ----@return number|nil handle handle to the loaded dump, or nil if no dump was found -function crash.load_previous() end - ----releases a previously loaded crash dump ----@param handle number handle to loaded crash dump -function crash.release(handle) end - ----Crashes occuring before the path is set will be stored to a default engine location. ----@param path string file path to use -function crash.set_file_path(path) end - ----Store a user value that will get written to a crash dump when ----a crash occurs. This can be user id:s, breadcrumb data etc. ----There are 32 slots indexed from 0. Each slot stores at most 255 characters. ----@param index number slot index. 0-indexed ----@param value string string value to store -function crash.set_user_field(index, value) end - ----Performs the same steps as if a crash had just occured but ----allows the program to continue. ----The generated dump can be read by crash.load_previous -function crash.write_dump() end - -return crash \ No newline at end of file diff --git a/annotations/defold/factory.lua b/annotations/defold/factory.lua deleted file mode 100644 index 6a0bf8e..0000000 --- a/annotations/defold/factory.lua +++ /dev/null @@ -1,78 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Factory API documentation - - Functions for controlling factory components which are used to - dynamically spawn game objects into the runtime. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.factory -factory = {} - ----loaded -factory.STATUS_LOADED = nil - ----loading -factory.STATUS_LOADING = nil - ----unloaded -factory.STATUS_UNLOADED = nil - ----The URL identifies which factory should create the game object. ----If the game object is created inside of the frame (e.g. from an update callback), the game object will be created instantly, but none of its component will be updated in the same frame. ----Properties defined in scripts in the created game object can be overridden through the properties-parameter below. ----See go.property for more information on script properties. ---- Calling factory.create on a factory that is marked as dynamic without having loaded resources ----using factory.load will synchronously load and create resources which may affect application performance. ----@param url string|hash|url the factory that should create a game object. ----@param position vector3|nil the position of the new game object, the position of the game object calling factory.create() is used by default, or if the value is nil. ----@param rotation quaternion|nil the rotation of the new game object, the rotation of the game object calling factory.create() is used by default, or if the value is nil. ----@param properties table|nil the properties defined in a script attached to the new game object. ----@param scale number|vector3|nil the scale of the new game object (must be greater than 0), the scale of the game object containing the factory is used by default, or if the value is nil ----@return hash id the global id of the spawned game object -function factory.create(url, position, rotation, properties, scale) end - ----This returns status of the factory. ----Calling this function when the factory is not marked as dynamic loading always returns ----factory.STATUS_LOADED. ----@param url string|hash|url|nil the factory component to get status from ----@return constant status status of the factory component ---- ----factory.STATUS_UNLOADED ----factory.STATUS_LOADING ----factory.STATUS_LOADED ---- -function factory.get_status(url) end - ----Resources are referenced by the factory component until the existing (parent) collection is destroyed or factory.unload is called. ----Calling this function when the factory is not marked as dynamic loading does nothing. ----@param url string|hash|url|nil the factory component to load ----@param complete_function fun(self, url, result)|nil function to call when resources are loaded. ---- ----self ----object The current object. ----url ----url url of the factory component ----result ----boolean True if resources were loaded successfully ---- -function factory.load(url, complete_function) end - ----Changes the prototype for the factory. ----@param url string|hash|url|nil the factory component ----@param prototype string|nil the path to the new prototype, or nil -function factory.set_prototype(url, prototype) end - ----This decreases the reference count for each resource loaded with factory.load. If reference is zero, the resource is destroyed. ----Calling this function when the factory is not marked as dynamic loading does nothing. ----@param url string|hash|url|nil the factory component to unload -function factory.unload(url) end - -return factory \ No newline at end of file diff --git a/annotations/defold/go.lua b/annotations/defold/go.lua deleted file mode 100644 index 131c554..0000000 --- a/annotations/defold/go.lua +++ /dev/null @@ -1,355 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Game object API documentation - - Functions, core hooks, messages and constants for manipulation of - game objects. The "go" namespace is accessible from game object script - files. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.go -go = {} - ----in-back -go.EASING_INBACK = nil - ----in-bounce -go.EASING_INBOUNCE = nil - ----in-circlic -go.EASING_INCIRC = nil - ----in-cubic -go.EASING_INCUBIC = nil - ----in-elastic -go.EASING_INELASTIC = nil - ----in-exponential -go.EASING_INEXPO = nil - ----in-out-back -go.EASING_INOUTBACK = nil - ----in-out-bounce -go.EASING_INOUTBOUNCE = nil - ----in-out-circlic -go.EASING_INOUTCIRC = nil - ----in-out-cubic -go.EASING_INOUTCUBIC = nil - ----in-out-elastic -go.EASING_INOUTELASTIC = nil - ----in-out-exponential -go.EASING_INOUTEXPO = nil - ----in-out-quadratic -go.EASING_INOUTQUAD = nil - ----in-out-quartic -go.EASING_INOUTQUART = nil - ----in-out-quintic -go.EASING_INOUTQUINT = nil - ----in-out-sine -go.EASING_INOUTSINE = nil - ----in-quadratic -go.EASING_INQUAD = nil - ----in-quartic -go.EASING_INQUART = nil - ----in-quintic -go.EASING_INQUINT = nil - ----in-sine -go.EASING_INSINE = nil - ----linear interpolation -go.EASING_LINEAR = nil - ----out-back -go.EASING_OUTBACK = nil - ----out-bounce -go.EASING_OUTBOUNCE = nil - ----out-circlic -go.EASING_OUTCIRC = nil - ----out-cubic -go.EASING_OUTCUBIC = nil - ----out-elastic -go.EASING_OUTELASTIC = nil - ----out-exponential -go.EASING_OUTEXPO = nil - ----out-in-back -go.EASING_OUTINBACK = nil - ----out-in-bounce -go.EASING_OUTINBOUNCE = nil - ----out-in-circlic -go.EASING_OUTINCIRC = nil - ----out-in-cubic -go.EASING_OUTINCUBIC = nil - ----out-in-elastic -go.EASING_OUTINELASTIC = nil - ----out-in-exponential -go.EASING_OUTINEXPO = nil - ----out-in-quadratic -go.EASING_OUTINQUAD = nil - ----out-in-quartic -go.EASING_OUTINQUART = nil - ----out-in-quintic -go.EASING_OUTINQUINT = nil - ----out-in-sine -go.EASING_OUTINSINE = nil - ----out-quadratic -go.EASING_OUTQUAD = nil - ----out-quartic -go.EASING_OUTQUART = nil - ----out-quintic -go.EASING_OUTQUINT = nil - ----out-sine -go.EASING_OUTSINE = nil - ----loop backward -go.PLAYBACK_LOOP_BACKWARD = nil - ----loop forward -go.PLAYBACK_LOOP_FORWARD = nil - ----ping pong loop -go.PLAYBACK_LOOP_PINGPONG = nil - ----no playback -go.PLAYBACK_NONE = nil - ----once backward -go.PLAYBACK_ONCE_BACKWARD = nil - ----once forward -go.PLAYBACK_ONCE_FORWARD = nil - ----once ping pong -go.PLAYBACK_ONCE_PINGPONG = nil - ----This is only supported for numerical properties. If the node property is already being ----animated, that animation will be canceled and replaced by the new one. ----If a complete_function (lua function) is specified, that function will be called when the animation has completed. ----By starting a new animation in that function, several animations can be sequenced together. See the examples for more information. ---- If you call go.animate() from a game object's final() function, ----any passed complete_function will be ignored and never called upon animation completion. ----See the properties guide for which properties can be animated and the animation guide for how ----them. ----@param url string|hash|url url of the game object or component having the property ----@param property string|hash id of the property to animate ----@param playback constant playback mode of the animation ---- ----go.PLAYBACK_ONCE_FORWARD ----go.PLAYBACK_ONCE_BACKWARD ----go.PLAYBACK_ONCE_PINGPONG ----go.PLAYBACK_LOOP_FORWARD ----go.PLAYBACK_LOOP_BACKWARD ----go.PLAYBACK_LOOP_PINGPONG ---- ----@param to number|vector3|vector4|quaternion target property value ----@param easing constant|vector4|vector3 easing to use during animation. Either specify a constant, see the animation guide for a complete list, or a vmath.vector with a curve ----@param duration number duration of the animation in seconds ----@param delay number|nil delay before the animation starts in seconds ----@param complete_function fun(self, url, property)|nil optional function to call when the animation has completed ---- ----self ---- ----object The current object. ---- ----url ---- ----url The game object or component instance for which the property is animated. ---- ----property ---- ----hash The id of the animated property. ---- ---- -function go.animate(url, property, playback, to, easing, duration, delay, complete_function) end - ----By calling this function, all or specified stored property animations of the game object or component will be canceled. ----See the properties guide for which properties can be animated and the animation guide for how to animate them. ----@param url string|hash|url url of the game object or component ----@param property string|hash|nil optional id of the property to cancel -function go.cancel_animations(url, property) end - ----Delete one or more game objects identified by id. Deletion is asynchronous meaning that ----the game object(s) are scheduled for deletion which will happen at the end of the current ----frame. Note that game objects scheduled for deletion will be counted against ----max_instances in "game.project" until they are actually removed. ---- Deleting a game object containing a particle FX component emitting particles will not immediately stop the particle FX from emitting particles. You need to manually stop the particle FX using particlefx.stop(). ---- Deleting a game object containing a sound component that is playing will not immediately stop the sound from playing. You need to manually stop the sound using sound.stop(). ----@param id string|hash|url|table|nil optional id or table of id's of the instance(s) to delete, the instance of the calling script is deleted by default ----@param recursive boolean|nil optional boolean, set to true to recursively delete child hiearchy in child to parent order -function go.delete(id, recursive) end - ----check if the specified game object exists ----@param url string|hash|url url of the game object to check ----@return bool exists true if the game object exists -function go.exists(url) end - ----gets a named property of the specified game object or component ----@param url string|hash|url url of the game object or component having the property ----@param property string|hash id of the property to retrieve ----@param options table|nil optional options table ----- index integer index into array property (1 based) ----- key hash name of internal property ----@return any value the value of the specified property -function go.get(url, property, options) end - ----Returns or constructs an instance identifier. The instance id is a hash ----of the absolute path to the instance. ----If path is specified, it can either be absolute or relative to the instance of the calling script. ----If path is not specified, the id of the game object instance the script is attached to will be returned. ----@param path string|nil path of the instance for which to return the id ----@return hash id instance id -function go.get_id(path) end - ----Get the parent for a game object instance. ----@param id string|hash|url|nil optional id of the game object instance to get parent for, defaults to the instance containing the calling script ----@return hash|nil parent_id parent instance or nil -function go.get_parent(id) end - ----The position is relative the parent (if any). Use go.get_world_position to retrieve the global world position. ----@param id string|hash|url|nil optional id of the game object instance to get the position for, by default the instance of the calling script ----@return vector3 position instance position -function go.get_position(id) end - ----The rotation is relative to the parent (if any). Use go.get_world_rotation to retrieve the global world rotation. ----@param id string|hash|url|nil optional id of the game object instance to get the rotation for, by default the instance of the calling script ----@return quaternion rotation instance rotation -function go.get_rotation(id) end - ----The scale is relative the parent (if any). Use go.get_world_scale to retrieve the global world 3D scale factor. ----@param id string|hash|url|nil optional id of the game object instance to get the scale for, by default the instance of the calling script ----@return vector3 scale instance scale factor -function go.get_scale(id) end - ----The uniform scale is relative the parent (if any). If the underlying scale vector is non-uniform the min element of the vector is returned as the uniform scale factor. ----@param id string|hash|url|nil optional id of the game object instance to get the uniform scale for, by default the instance of the calling script ----@return number scale uniform instance scale factor -function go.get_scale_uniform(id) end - ----The function will return the world position calculated at the end of the previous frame. ----Use go.get_position to retrieve the position relative to the parent. ----@param id string|hash|url|nil optional id of the game object instance to get the world position for, by default the instance of the calling script ----@return vector3 position instance world position -function go.get_world_position(id) end - ----The function will return the world rotation calculated at the end of the previous frame. ----Use go.get_rotation to retrieve the rotation relative to the parent. ----@param id string|hash|url|nil optional id of the game object instance to get the world rotation for, by default the instance of the calling script ----@return quaternion rotation instance world rotation -function go.get_world_rotation(id) end - ----The function will return the world 3D scale factor calculated at the end of the previous frame. ----Use go.get_scale to retrieve the 3D scale factor relative to the parent. ----This vector is derived by decomposing the transformation matrix and should be used with care. ----For most cases it should be fine to use go.get_world_scale_uniform instead. ----@param id string|hash|url|nil optional id of the game object instance to get the world scale for, by default the instance of the calling script ----@return vector3 scale instance world 3D scale factor -function go.get_world_scale(id) end - ----The function will return the world scale factor calculated at the end of the previous frame. ----Use go.get_scale_uniform to retrieve the scale factor relative to the parent. ----@param id string|hash|url|nil optional id of the game object instance to get the world scale for, by default the instance of the calling script ----@return number scale instance world scale factor -function go.get_world_scale_uniform(id) end - ----The function will return the world transform matrix calculated at the end of the previous frame. ----@param id string|hash|url|nil optional id of the game object instance to get the world transform for, by default the instance of the calling script ----@return matrix4 transform instance world transform -function go.get_world_transform(id) end - ----This function defines a property which can then be used in the script through the self-reference. ----The properties defined this way are automatically exposed in the editor in game objects and collections which use the script. ----Note that you can only use this function outside any callback-functions like init and update. ----@param name string the id of the property ----@param value number|hash|url|vector3|vector4|quaternion|resource_data|boolean default value of the property. In the case of a url, only the empty constructor msg.url() is allowed. In the case of a resource one of the resource constructors (eg resource.atlas(), resource.font() etc) is expected. -function go.property(name, value) end - ----sets a named property of the specified game object or component, or a material constant ----@param url string|hash|url url of the game object or component having the property ----@param property string|hash id of the property to set ----@param value any|table the value to set ----@param options table|nil optional options table ----- index integer index into array property (1 based) ----- key hash name of internal property -function go.set(url, property, value, options) end - ----Sets the parent for a game object instance. This means that the instance will exist in the geometrical space of its parent, ----like a basic transformation hierarchy or scene graph. If no parent is specified, the instance will be detached from any parent and exist in world ----space. ----This function will generate a set_parent message. It is not until the message has been processed that the change actually takes effect. This ----typically happens later in the same frame or the beginning of the next frame. Refer to the manual to learn how messages are processed by the ----engine. ----@param id string|hash|url|nil optional id of the game object instance to set parent for, defaults to the instance containing the calling script ----@param parent_id string|hash|url|nil optional id of the new parent game object, defaults to detaching game object from its parent ----@param keep_world_transform boolean|nil optional boolean, set to true to maintain the world transform when changing spaces. Defaults to false. -function go.set_parent(id, parent_id, keep_world_transform) end - ----The position is relative to the parent (if any). The global world position cannot be manually set. ----@param position vector3 position to set ----@param id string|hash|url|nil optional id of the game object instance to set the position for, by default the instance of the calling script -function go.set_position(position, id) end - ----The rotation is relative to the parent (if any). The global world rotation cannot be manually set. ----@param rotation quaternion rotation to set ----@param id string|hash|url|nil optional id of the game object instance to get the rotation for, by default the instance of the calling script -function go.set_rotation(rotation, id) end - ----The scale factor is relative to the parent (if any). The global world scale factor cannot be manually set. ---- Physics are currently not affected when setting scale from this function. ----@param scale number|vector3 vector or uniform scale factor, must be greater than 0 ----@param id string|hash|url|nil optional id of the game object instance to get the scale for, by default the instance of the calling script -function go.set_scale(scale, id) end - ---- The function uses world transformation calculated at the end of previous frame. ----@param position vector3 position which need to be converted ----@param url string|hash|url url of the game object which coordinate system convert to ----@return vector3 converted_postion converted position -function go.world_to_local_position(position, url) end - ---- The function uses world transformation calculated at the end of previous frame. ----@param transformation matrix4 transformation which need to be converted ----@param url string|hash|url url of the game object which coordinate system convert to ----@return matrix4 converted_transform converted transformation -function go.world_to_local_transform(transformation, url) end - - - -return go \ No newline at end of file diff --git a/annotations/defold/gui.lua b/annotations/defold/gui.lua deleted file mode 100644 index d516b4e..0000000 --- a/annotations/defold/gui.lua +++ /dev/null @@ -1,1236 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - GUI API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.gui -gui = {} - ----Adjust mode is used when the screen resolution differs from the project settings. ----The fit mode ensures that the entire node is visible in the adjusted gui scene. -gui.ADJUST_FIT = nil - ----Adjust mode is used when the screen resolution differs from the project settings. ----The stretch mode ensures that the node is displayed as is in the adjusted gui scene, which might scale it non-uniformally. -gui.ADJUST_STRETCH = nil - ----Adjust mode is used when the screen resolution differs from the project settings. ----The zoom mode ensures that the node fills its entire area and might make the node exceed it. -gui.ADJUST_ZOOM = nil - ----bottom y-anchor -gui.ANCHOR_BOTTOM = nil - ----left x-anchor -gui.ANCHOR_LEFT = nil - ----no anchor -gui.ANCHOR_NONE = nil - ----right x-anchor -gui.ANCHOR_RIGHT = nil - ----top y-anchor -gui.ANCHOR_TOP = nil - ----additive blending -gui.BLEND_ADD = nil - ----additive alpha blending -gui.BLEND_ADD_ALPHA = nil - ----alpha blending -gui.BLEND_ALPHA = nil - ----multiply blending -gui.BLEND_MULT = nil - ----screen blending -gui.BLEND_SCREEN = nil - ----clipping mode none -gui.CLIPPING_MODE_NONE = nil - ----clipping mode stencil -gui.CLIPPING_MODE_STENCIL = nil - ----in-back -gui.EASING_INBACK = nil - ----in-bounce -gui.EASING_INBOUNCE = nil - ----in-circlic -gui.EASING_INCIRC = nil - ----in-cubic -gui.EASING_INCUBIC = nil - ----in-elastic -gui.EASING_INELASTIC = nil - ----in-exponential -gui.EASING_INEXPO = nil - ----in-out-back -gui.EASING_INOUTBACK = nil - ----in-out-bounce -gui.EASING_INOUTBOUNCE = nil - ----in-out-circlic -gui.EASING_INOUTCIRC = nil - ----in-out-cubic -gui.EASING_INOUTCUBIC = nil - ----in-out-elastic -gui.EASING_INOUTELASTIC = nil - ----in-out-exponential -gui.EASING_INOUTEXPO = nil - ----in-out-quadratic -gui.EASING_INOUTQUAD = nil - ----in-out-quartic -gui.EASING_INOUTQUART = nil - ----in-out-quintic -gui.EASING_INOUTQUINT = nil - ----in-out-sine -gui.EASING_INOUTSINE = nil - ----in-quadratic -gui.EASING_INQUAD = nil - ----in-quartic -gui.EASING_INQUART = nil - ----in-quintic -gui.EASING_INQUINT = nil - ----in-sine -gui.EASING_INSINE = nil - ----linear interpolation -gui.EASING_LINEAR = nil - ----out-back -gui.EASING_OUTBACK = nil - ----out-bounce -gui.EASING_OUTBOUNCE = nil - ----out-circlic -gui.EASING_OUTCIRC = nil - ----out-cubic -gui.EASING_OUTCUBIC = nil - ----out-elastic -gui.EASING_OUTELASTIC = nil - ----out-exponential -gui.EASING_OUTEXPO = nil - ----out-in-back -gui.EASING_OUTINBACK = nil - ----out-in-bounce -gui.EASING_OUTINBOUNCE = nil - ----out-in-circlic -gui.EASING_OUTINCIRC = nil - ----out-in-cubic -gui.EASING_OUTINCUBIC = nil - ----out-in-elastic -gui.EASING_OUTINELASTIC = nil - ----out-in-exponential -gui.EASING_OUTINEXPO = nil - ----out-in-quadratic -gui.EASING_OUTINQUAD = nil - ----out-in-quartic -gui.EASING_OUTINQUART = nil - ----out-in-quintic -gui.EASING_OUTINQUINT = nil - ----out-in-sine -gui.EASING_OUTINSINE = nil - ----out-quadratic -gui.EASING_OUTQUAD = nil - ----out-quartic -gui.EASING_OUTQUART = nil - ----out-quintic -gui.EASING_OUTQUINT = nil - ----out-sine -gui.EASING_OUTSINE = nil - ----default keyboard -gui.KEYBOARD_TYPE_DEFAULT = nil - ----email keyboard -gui.KEYBOARD_TYPE_EMAIL = nil - ----number input keyboard -gui.KEYBOARD_TYPE_NUMBER_PAD = nil - ----password keyboard -gui.KEYBOARD_TYPE_PASSWORD = nil - ----elliptical pie node bounds -gui.PIEBOUNDS_ELLIPSE = nil - ----rectangular pie node bounds -gui.PIEBOUNDS_RECTANGLE = nil - ----center pivot -gui.PIVOT_CENTER = nil - ----east pivot -gui.PIVOT_E = nil - ----north pivot -gui.PIVOT_N = nil - ----north-east pivot -gui.PIVOT_NE = nil - ----north-west pivot -gui.PIVOT_NW = nil - ----south pivot -gui.PIVOT_S = nil - ----south-east pivot -gui.PIVOT_SE = nil - ----south-west pivot -gui.PIVOT_SW = nil - ----west pivot -gui.PIVOT_W = nil - ----loop backward -gui.PLAYBACK_LOOP_BACKWARD = nil - ----loop forward -gui.PLAYBACK_LOOP_FORWARD = nil - ----ping pong loop -gui.PLAYBACK_LOOP_PINGPONG = nil - ----once backward -gui.PLAYBACK_ONCE_BACKWARD = nil - ----once forward -gui.PLAYBACK_ONCE_FORWARD = nil - ----once forward and then backward -gui.PLAYBACK_ONCE_PINGPONG = nil - ----color property -gui.PROP_COLOR = nil - ----euler property -gui.PROP_EULER = nil - ----fill_angle property -gui.PROP_FILL_ANGLE = nil - ----inner_radius property -gui.PROP_INNER_RADIUS = nil - ----outline color property -gui.PROP_OUTLINE = nil - ----position property -gui.PROP_POSITION = nil - ----rotation property -gui.PROP_ROTATION = nil - ----scale property -gui.PROP_SCALE = nil - ----shadow color property -gui.PROP_SHADOW = nil - ----size property -gui.PROP_SIZE = nil - ----slice9 property -gui.PROP_SLICE9 = nil - ----The provided data is not in the expected format or is in some other way ----incorrect, for instance the image data provided to gui.new_texture(). -gui.RESULT_DATA_ERROR = nil - ----The system is out of resources, for instance when trying to create a new ----texture using gui.new_texture(). -gui.RESULT_OUT_OF_RESOURCES = nil - ----The texture id already exists when trying to use gui.new_texture(). -gui.RESULT_TEXTURE_ALREADY_EXISTS = nil - ----The size of the node is determined by the currently assigned texture. -gui.SIZE_MODE_AUTO = nil - ----The size of the node is determined by the size set in the editor, the constructor or by gui.set_size() -gui.SIZE_MODE_MANUAL = nil - ----This starts an animation of a node property according to the specified parameters. ----If the node property is already being animated, that animation will be canceled and ----replaced by the new one. Note however that several different node properties ----can be animated simultaneously. Use gui.cancel_animation to stop the animation ----before it has completed. ----Composite properties of type vector3, vector4 or quaternion ----also expose their sub-components (x, y, z and w). ----You can address the components individually by suffixing the name with a dot '.' ----and the name of the component. ----For instance, "position.x" (the position x coordinate) or "color.w" ----(the color alpha value). ----If a complete_function (Lua function) is specified, that function will be called ----when the animation has completed. ----By starting a new animation in that function, several animations can be sequenced ----together. See the examples below for more information. ----@param node node node to animate ----@param property string|constant property to animate ---- ----"position" ----"rotation" ----"euler" ----"scale" ----"color" ----"outline" ----"shadow" ----"size" ----"fill_angle" (pie) ----"inner_radius" (pie) ----"slice9" (slice9) ---- ----The following property constants are defined equaling the corresponding property string names. ---- ----gui.PROP_POSITION ----gui.PROP_ROTATION ----gui.PROP_EULER ----gui.PROP_SCALE ----gui.PROP_COLOR ----gui.PROP_OUTLINE ----gui.PROP_SHADOW ----gui.PROP_SIZE ----gui.PROP_FILL_ANGLE ----gui.PROP_INNER_RADIUS ----gui.PROP_SLICE9 ---- ----@param to number|vector3|vector4|quaternion target property value ----@param easing constant|vector4|vector3 easing to use during animation. ---- Either specify one of the gui.EASING_* constants or provide a ---- vector with a custom curve. See the animation guide for more information. ----@param duration number duration of the animation in seconds. ----@param delay number|nil delay before the animation starts in seconds. ----@param complete_function fun(self, node)|nil function to call when the ---- animation has completed ----@param playback constant|nil playback mode ---- ----gui.PLAYBACK_ONCE_FORWARD ----gui.PLAYBACK_ONCE_BACKWARD ----gui.PLAYBACK_ONCE_PINGPONG ----gui.PLAYBACK_LOOP_FORWARD ----gui.PLAYBACK_LOOP_BACKWARD ----gui.PLAYBACK_LOOP_PINGPONG ---- -function gui.animate(node, property, to, easing, duration, delay, complete_function, playback) end - ----If an animation of the specified node is currently running (started by gui.animate), it will immediately be canceled. ----@param node node node that should have its animation canceled ----@param property string|constant property for which the animation should be canceled ---- ----"position" ----"rotation" ----"euler" ----"scale" ----"color" ----"outline" ----"shadow" ----"size" ----"fill_angle" (pie) ----"inner_radius" (pie) ----"slice9" (slice9) ---- -function gui.cancel_animation(node, property) end - ----Cancels any running flipbook animation on the specified node. ----@param node node node cancel flipbook animation for -function gui.cancel_flipbook(node) end - ----Make a clone instance of a node. The cloned node will be identical to the ----original node, except the id which is generated as the string "node" plus ----a sequential unsigned integer value. ----This function does not clone the supplied node's children nodes. ----Use gui.clone_tree for that purpose. ----@param node node node to clone ----@return node clone the cloned node -function gui.clone(node) end - ----Make a clone instance of a node and all its children. ----Use gui.clone to clone a node excluding its children. ----@param node node root node to clone ----@return table clones a table mapping node ids to the corresponding cloned nodes -function gui.clone_tree(node) end - ----Deletes the specified node. Any child nodes of the specified node will be ----recursively deleted. ----@param node node node to delete -function gui.delete_node(node) end - ----Delete a dynamically created texture. ----@param texture string|hash texture id -function gui.delete_texture(texture) end - ----Instead of using specific getters such as gui.get_position or gui.get_scale, ----you can use gui.get instead and supply the property as a string or a hash. ----While this function is similar to go.get, there are a few more restrictions ----when operating in the gui namespace. Most notably, only these propertie identifiers are supported: ----"position" ----"rotation" ----"euler" ----"scale" ----"color" ----"outline" ----"shadow" ----"size" ----"fill_angle" (pie) ----"inner_radius" (pie) ----"slice9" (slice9) ----The value returned will either be a vmath.vector4 or a single number, i.e getting the "position" ----property will return a vec4 while getting the "position.x" property will return a single value. ----@param node node node to get the property for ----@param property string|hash|constant the property to retrieve -function gui.get(node, property) end - ----Returns the adjust mode of a node. ----The adjust mode defines how the node will adjust itself to screen ----resolutions that differs from the one in the project settings. ----@param node node node from which to get the adjust mode (node) ----@return constant adjust_mode the current adjust mode ---- ----gui.ADJUST_FIT ----gui.ADJUST_ZOOM ----gui.ADJUST_STRETCH ---- -function gui.get_adjust_mode(node) end - ----gets the node alpha ----@param node node node from which to get alpha -function gui.get_alpha(node) end - ----Returns the blend mode of a node. ----Blend mode defines how the node will be blended with the background. ----@param node node node from which to get the blend mode ----@return constant blend_mode blend mode ---- ----gui.BLEND_ALPHA ----gui.BLEND_ADD ----gui.BLEND_ADD_ALPHA ----gui.BLEND_MULT ----gui.BLEND_SCREEN ---- -function gui.get_blend_mode(node) end - ----If node is set as an inverted clipping node, it will clip anything inside as opposed to outside. ----@param node node node from which to get the clipping inverted state ----@return boolean inverted true or false -function gui.get_clipping_inverted(node) end - ----Clipping mode defines how the node will clip it's children nodes ----@param node node node from which to get the clipping mode ----@return constant clipping_mode clipping mode ---- ---- gui.CLIPPING_MODE_NONE ---- gui.CLIPPING_MODE_STENCIL ---- -function gui.get_clipping_mode(node) end - ----If node is set as visible clipping node, it will be shown as well as clipping. Otherwise, it will only clip but not show visually. ----@param node node node from which to get the clipping visibility state ----@return boolean visible true or false -function gui.get_clipping_visible(node) end - ----Returns the color of the supplied node. The components ----of the returned vector4 contains the color channel values: ----Component ----Color value ----x ----Red value ----y ----Green value ----z ----Blue value ----w ----Alpha value ----@param node node node to get the color from ----@return vector4 color node color -function gui.get_color(node) end - ----Returns the rotation of the supplied node. ----The rotation is expressed in degree Euler angles. ----@param node node node to get the rotation from ----@return vector3 rotation node rotation -function gui.get_euler(node) end - ----Returns the sector angle of a pie node. ----@param node node node from which to get the fill angle ----@return number angle sector angle -function gui.get_fill_angle(node) end - ----Get node flipbook animation. ----@param node node node to get flipbook animation from ----@return hash animation animation id -function gui.get_flipbook(node) end - ----This is only useful nodes with flipbook animations. Gets the normalized cursor of the flipbook animation on a node. ----@param node node node to get the cursor for (node) ----@return number cursor cursor value -function gui.get_flipbook_cursor(node) end - ----This is only useful nodes with flipbook animations. Gets the playback rate of the flipbook animation on a node. ----@param node node node to set the cursor for ----@return number rate playback rate -function gui.get_flipbook_playback_rate(node) end - ----This is only useful for text nodes. The font must be mapped to the gui scene in the gui editor. ----@param node node node from which to get the font ----@return hash font font id -function gui.get_font(node) end - ----This is only useful for text nodes. The font must be mapped to the gui scene in the gui editor. ----@param font_name hash|string font of which to get the path hash ----@return hash hash path hash to resource -function gui.get_font_resource(font_name) end - ----Returns the scene height. ----@return number height scene height -function gui.get_height() end - ----Retrieves the id of the specified node. ----@param node node the node to retrieve the id from ----@return hash id the id of the node -function gui.get_id(node) end - ----Retrieve the index of the specified node among its siblings. ----The index defines the order in which a node appear in a GUI scene. ----Higher index means the node is drawn on top of lower indexed nodes. ----@param node node the node to retrieve the id from ----@return number index the index of the node -function gui.get_index(node) end - ----gets the node inherit alpha state ----@param node node node from which to get the inherit alpha state -function gui.get_inherit_alpha(node) end - ----Returns the inner radius of a pie node. ----The radius is defined along the x-axis. ----@param node node node from where to get the inner radius ----@return number radius inner radius -function gui.get_inner_radius(node) end - ----The layer must be mapped to the gui scene in the gui editor. ----@param node node node from which to get the layer ----@return hash layer layer id -function gui.get_layer(node) end - ----gets the scene current layout ----@return hash layout layout id -function gui.get_layout() end - ----Returns the leading value for a text node. ----@param node node node from where to get the leading ----@return number leading leading scaling value (default=1) -function gui.get_leading(node) end - ----Returns whether a text node is in line-break mode or not. ----This is only useful for text nodes. ----@param node node node from which to get the line-break for ----@return boolean line_break true or false -function gui.get_line_break(node) end - ----Returns the material of a node. ----The material must be mapped to the gui scene in the gui editor. ----@param node node node to get the material for -function gui.get_material(node) end - ----Retrieves the node with the specified id. ----@param id string|hash id of the node to retrieve ----@return node instance a new node instance -function gui.get_node(id) end - ----Returns the outer bounds mode for a pie node. ----@param node node node from where to get the outer bounds mode ----@return constant bounds_mode the outer bounds mode of the pie node: ---- ----gui.PIEBOUNDS_RECTANGLE ----gui.PIEBOUNDS_ELLIPSE ---- -function gui.get_outer_bounds(node) end - ----Returns the outline color of the supplied node. ----See gui.get_color for info how vectors encode color values. ----@param node node node to get the outline color from ----@return vector4 color outline color -function gui.get_outline(node) end - ----Returns the parent node of the specified node. ----If the supplied node does not have a parent, nil is returned. ----@param node node the node from which to retrieve its parent ----@return node|nil parent parent instance or nil -function gui.get_parent(node) end - ----Get the paricle fx for a gui node ----@param node node node to get particle fx for ----@return hash particlefx particle fx id -function gui.get_particlefx(node) end - ----Returns the number of generated vertices around the perimeter ----of a pie node. ----@param node node pie node ----@return number vertices vertex count -function gui.get_perimeter_vertices(node) end - ----The pivot specifies how the node is drawn and rotated from its position. ----@param node node node to get pivot from ----@return constant pivot pivot constant ---- ---- gui.PIVOT_CENTER ---- gui.PIVOT_N ---- gui.PIVOT_NE ---- gui.PIVOT_E ---- gui.PIVOT_SE ---- gui.PIVOT_S ---- gui.PIVOT_SW ---- gui.PIVOT_W ---- gui.PIVOT_NW ---- -function gui.get_pivot(node) end - ----Returns the position of the supplied node. ----@param node node node to get the position from ----@return vector3 position node position -function gui.get_position(node) end - ----Returns the rotation of the supplied node. ----The rotation is expressed as a quaternion ----@param node node node to get the rotation from ----@return quaternion rotation node rotation -function gui.get_rotation(node) end - ----Returns the scale of the supplied node. ----@param node node node to get the scale from ----@return vector3 scale node scale -function gui.get_scale(node) end - ----Returns the screen position of the supplied node. This function returns the ----calculated transformed position of the node, taking into account any parent node ----transforms. ----@param node node node to get the screen position from ----@return vector3 position node screen position -function gui.get_screen_position(node) end - ----Returns the shadow color of the supplied node. ----See gui.get_color for info how vectors encode color values. ----@param node node node to get the shadow color from ----@return vector4 color node shadow color -function gui.get_shadow(node) end - ----Returns the size of the supplied node. ----@param node node node to get the size from ----@return vector3 size node size -function gui.get_size(node) end - ----Returns the size of a node. ----The size mode defines how the node will adjust itself in size. Automatic ----size mode alters the node size based on the node's content. Automatic size ----mode works for Box nodes and Pie nodes which will both adjust their size ----to match the assigned image. Particle fx and Text nodes will ignore ----any size mode setting. ----@param node node node from which to get the size mode (node) ----@return constant size_mode the current size mode ---- ----gui.SIZE_MODE_MANUAL ----gui.SIZE_MODE_AUTO ---- -function gui.get_size_mode(node) end - ----Returns the slice9 configuration values for the node. ----@param node node node to manipulate ----@return vector4 values configuration values -function gui.get_slice9(node) end - ----Returns the text value of a text node. This is only useful for text nodes. ----@param node node node from which to get the text ----@return string text text value -function gui.get_text(node) end - ----Returns the texture of a node. ----This is currently only useful for box or pie nodes. ----The texture must be mapped to the gui scene in the gui editor. ----@param node node node to get texture from ----@return hash texture texture id -function gui.get_texture(node) end - ----Returns the tracking value of a text node. ----@param node node node from where to get the tracking ----@return number tracking tracking scaling number (default=0) -function gui.get_tracking(node) end - ----Get a node and all its children as a Lua table. ----@param node node root node to get node tree from ----@return table clones a table mapping node ids to the corresponding nodes -function gui.get_tree(node) end - ----Returns true if a node is visible and false if it's not. ----Invisible nodes are not rendered. ----@param node node node to query ----@return boolean visible whether the node is visible or not -function gui.get_visible(node) end - ----Returns the scene width. ----@return number width scene width -function gui.get_width() end - ----The x-anchor specifies how the node is moved when the game is run in a different resolution. ----@param node node node to get x-anchor from ----@return constant anchor anchor constant ---- ----gui.ANCHOR_NONE ----gui.ANCHOR_LEFT ----gui.ANCHOR_RIGHT ---- -function gui.get_xanchor(node) end - ----The y-anchor specifies how the node is moved when the game is run in a different resolution. ----@param node node node to get y-anchor from ----@return constant anchor anchor constant ---- ----gui.ANCHOR_NONE ----gui.ANCHOR_TOP ----gui.ANCHOR_BOTTOM ---- -function gui.get_yanchor(node) end - ----Hides the on-display touch keyboard on the device. -function gui.hide_keyboard() end - ----Returns true if a node is enabled and false if it's not. ----Disabled nodes are not rendered and animations acting on them are not evaluated. ----@param node node node to query ----@param recursive boolean|nil check hierarchy recursively ----@return boolean enabled whether the node is enabled or not -function gui.is_enabled(node, recursive) end - ----Alters the ordering of the two supplied nodes by moving the first node ----above the second. ----If the second argument is nil the first node is moved to the top. ----@param node node to move ----@param reference node|nil reference node above which the first node should be moved -function gui.move_above(node, reference) end - ----Alters the ordering of the two supplied nodes by moving the first node ----below the second. ----If the second argument is nil the first node is moved to the bottom. ----@param node node to move ----@param reference node|nil reference node below which the first node should be moved -function gui.move_below(node, reference) end - ----Dynamically create a new box node. ----@param pos vector3|vector4 node position ----@param size vector3 node size ----@return node node new box node -function gui.new_box_node(pos, size) end - ----Dynamically create a particle fx node. ----@param pos vector3|vector4 node position ----@param particlefx hash|string particle fx resource name ----@return node node new particle fx node -function gui.new_particlefx_node(pos, particlefx) end - ----Dynamically create a new pie node. ----@param pos vector3|vector4 node position ----@param size vector3 node size ----@return node node new pie node -function gui.new_pie_node(pos, size) end - ----Dynamically create a new text node. ----@param pos vector3|vector4 node position ----@param text string node text ----@return node node new text node -function gui.new_text_node(pos, text) end - ----Dynamically create a new texture. ----@param texture_id string|hash texture id ----@param width number texture width ----@param height number texture height ----@param type string|constant texture type ---- ----"rgb" - RGB ----"rgba" - RGBA ----"l" - LUMINANCE ---- ----@param buffer string texture data ----@param flip boolean flip texture vertically ----@return boolean success texture creation was successful ----@return number code one of the gui.RESULT_* codes if unsuccessful -function gui.new_texture(texture_id, width, height, type, buffer, flip) end - ----Tests whether a coordinate is within the bounding box of a ----node. ----@param node node node to be tested for picking ----@param x number x-coordinate (see on_input ) ----@param y number y-coordinate (see on_input ) ----@return boolean pickable pick result -function gui.pick_node(node, x, y) end - ----Play flipbook animation on a box or pie node. ----The current node texture must contain the animation. ----Use this function to set one-frame still images on the node. ----@param node node node to set animation for ----@param animation string|hash animation id ----@param complete_function fun(self, node)|nil optional function to call when the animation has completed ---- ----self ---- ----object The current object. ---- ----node ---- ----node The node that is animated. ---- ---- ----@param play_properties { offset:number|nil, playback_rate:number|nil }|nil optional table with properties ---- ----offset ----number The normalized initial value of the animation cursor when the animation starts playing ----playback_rate ----number The rate with which the animation will be played. Must be positive ---- -function gui.play_flipbook(node, animation, complete_function, play_properties) end - ----Plays the paricle fx for a gui node ----@param node node node to play particle fx for ----@param emitter_state_function fun(self, node, emitter, state)|nil optional callback function that will be called when an emitter attached to this particlefx changes state. ---- ----self ----object The current object ----node ----hash The particle fx node, or nil if the node was deleted ----emitter ----hash The id of the emitter ----state ----constant the new state of the emitter: ---- ---- ----particlefx.EMITTER_STATE_SLEEPING ----particlefx.EMITTER_STATE_PRESPAWN ----particlefx.EMITTER_STATE_SPAWNING ----particlefx.EMITTER_STATE_POSTSPAWN ---- -function gui.play_particlefx(node, emitter_state_function) end - ----Resets the input context of keyboard. This will clear marked text. -function gui.reset_keyboard() end - ----Resets the node material to the material assigned in the gui scene. ----@param node node node to reset the material for -function gui.reset_material(node) end - ----Resets all nodes in the current GUI scene to their initial state. ----The reset only applies to static node loaded from the scene. ----Nodes that are created dynamically from script are not affected. -function gui.reset_nodes() end - ----Convert the screen position to the local position of supplied node ----@param node node node used for getting local transformation matrix ----@param screen_position vector3 screen position ----@return vector3 local_position local position -function gui.screen_to_local(node, screen_position) end - ----Instead of using specific setteres such as gui.set_position or gui.set_scale, ----you can use gui.set instead and supply the property as a string or a hash. ----While this function is similar to go.get and go.set, there are a few more restrictions ----when operating in the gui namespace. Most notably, only these propertie identifiers are supported: ----"position" ----"rotation" ----"euler" ----"scale" ----"color" ----"outline" ----"shadow" ----"size" ----"fill_angle" (pie) ----"inner_radius" (pie) ----"slice9" (slice9) ----The value to set must either be a vmath.vector4, vmath.vector3, vmath.quat or a single number and depends on the property name you want to set. ----I.e when setting the "position" property, you need to use a vmath.vector4 and when setting a single component of the property, ----such as "position.x", you need to use a single value. ----Note: When setting the rotation using the "rotation" property, you need to pass in a vmath.quat. This behaviour is different than from the gui.set_rotation function, ----the intention is to move new functionality closer to go namespace so that migrating between gui and go is easier. To set the rotation using degrees instead, ----use the "euler" property instead. The rotation and euler properties are linked, changing one of them will change the backing data of the other. ----@param node node node to set the property for ----@param property string|hash|constant the property to set ----@param value number|vector4|vector3|quaternion the property to set -function gui.set(node, property, value) end - ----Sets the adjust mode on a node. ----The adjust mode defines how the node will adjust itself to screen ----resolutions that differs from the one in the project settings. ----@param node node node to set adjust mode for ----@param adjust_mode constant adjust mode to set ---- ----gui.ADJUST_FIT ----gui.ADJUST_ZOOM ----gui.ADJUST_STRETCH ---- -function gui.set_adjust_mode(node, adjust_mode) end - ----sets the node alpha ----@param node node node for which to set alpha ----@param alpha number 0..1 alpha color -function gui.set_alpha(node, alpha) end - ----Set the blend mode of a node. ----Blend mode defines how the node will be blended with the background. ----@param node node node to set blend mode for ----@param blend_mode constant blend mode to set ---- ----gui.BLEND_ALPHA ----gui.BLEND_ADD ----gui.BLEND_ADD_ALPHA ----gui.BLEND_MULT ----gui.BLEND_SCREEN ---- -function gui.set_blend_mode(node, blend_mode) end - ----If node is set as an inverted clipping node, it will clip anything inside as opposed to outside. ----@param node node node to set clipping inverted state for ----@param inverted boolean true or false -function gui.set_clipping_inverted(node, inverted) end - ----Clipping mode defines how the node will clip it's children nodes ----@param node node node to set clipping mode for ----@param clipping_mode constant clipping mode to set ---- ---- gui.CLIPPING_MODE_NONE ---- gui.CLIPPING_MODE_STENCIL ---- -function gui.set_clipping_mode(node, clipping_mode) end - ----If node is set as an visible clipping node, it will be shown as well as clipping. Otherwise, it will only clip but not show visually. ----@param node node node to set clipping visibility for ----@param visible boolean true or false -function gui.set_clipping_visible(node, visible) end - ----Sets the color of the supplied node. The components ----of the supplied vector3 or vector4 should contain the color channel values: ----Component ----Color value ----x ----Red value ----y ----Green value ----z ----Blue value ----w vector4 ----Alpha value ----@param node node node to set the color for ----@param color vector3|vector4 new color -function gui.set_color(node, color) end - ----Sets a node to the disabled or enabled state. ----Disabled nodes are not rendered and animations acting on them are not evaluated. ----@param node node node to be enabled/disabled ----@param enabled boolean whether the node should be enabled or not -function gui.set_enabled(node, enabled) end - ----Sets the rotation of the supplied node. ----The rotation is expressed in degree Euler angles. ----@param node node node to set the rotation for ----@param rotation vector3|vector4 new rotation -function gui.set_euler(node, rotation) end - ----Set the sector angle of a pie node. ----@param node node node to set the fill angle for ----@param angle number sector angle -function gui.set_fill_angle(node, angle) end - ----This is only useful nodes with flipbook animations. The cursor is normalized. ----@param node node node to set the cursor for ----@param cursor number cursor value -function gui.set_flipbook_cursor(node, cursor) end - ----This is only useful nodes with flipbook animations. Sets the playback rate of the flipbook animation on a node. Must be positive. ----@param node node node to set the cursor for ----@param playback_rate number playback rate -function gui.set_flipbook_playback_rate(node, playback_rate) end - ----This is only useful for text nodes. ----The font must be mapped to the gui scene in the gui editor. ----@param node node node for which to set the font ----@param font string|hash font id -function gui.set_font(node, font) end - ----Set the id of the specicied node to a new value. ----Nodes created with the gui.new_*_node() functions get ----an empty id. This function allows you to give dynamically ----created nodes an id. ---- No checking is done on the uniqueness of supplied ids. ----It is up to you to make sure you use unique ids. ----@param node node node to set the id for ----@param id string|hash id to set -function gui.set_id(node, id) end - ----sets the node inherit alpha state ----@param node node node from which to set the inherit alpha state ----@param inherit_alpha boolean true or false -function gui.set_inherit_alpha(node, inherit_alpha) end - ----Sets the inner radius of a pie node. ----The radius is defined along the x-axis. ----@param node node node to set the inner radius for ----@param radius number inner radius -function gui.set_inner_radius(node, radius) end - ----The layer must be mapped to the gui scene in the gui editor. ----@param node node node for which to set the layer ----@param layer string|hash layer id -function gui.set_layer(node, layer) end - ----Sets the leading value for a text node. This value is used to ----scale the line spacing of text. ----@param node node node for which to set the leading ----@param leading number a scaling value for the line spacing (default=1) -function gui.set_leading(node, leading) end - ----Sets the line-break mode on a text node. ----This is only useful for text nodes. ----@param node node node to set line-break for ----@param line_break boolean true or false -function gui.set_line_break(node, line_break) end - ----Set the material on a node. The material must be mapped to the gui scene in the gui editor, ----and assigning a material is supported for all node types. To set the default material that ----is assigned to the gui scene node, use gui.reset_material(node_id) instead. ----@param node node node to set material for ----@param material string|hash material id -function gui.set_material(node, material) end - ----Sets the outer bounds mode for a pie node. ----@param node node node for which to set the outer bounds mode ----@param bounds_mode constant the outer bounds mode of the pie node: ---- ----gui.PIEBOUNDS_RECTANGLE ----gui.PIEBOUNDS_ELLIPSE ---- -function gui.set_outer_bounds(node, bounds_mode) end - ----Sets the outline color of the supplied node. ----See gui.set_color for info how vectors encode color values. ----@param node node node to set the outline color for ----@param color vector3|vector4 new outline color -function gui.set_outline(node, color) end - ----Sets the parent node of the specified node. ----@param node node node for which to set its parent ----@param parent node|nil parent node to set ----@param keep_scene_transform boolean|nil optional flag to make the scene position being perserved -function gui.set_parent(node, parent, keep_scene_transform) end - ----Set the paricle fx for a gui node ----@param node node node to set particle fx for ----@param particlefx hash|string particle fx id -function gui.set_particlefx(node, particlefx) end - ----Sets the number of generated vertices around the perimeter of a pie node. ----@param node node pie node ----@param vertices number vertex count -function gui.set_perimeter_vertices(node, vertices) end - ----The pivot specifies how the node is drawn and rotated from its position. ----@param node node node to set pivot for ----@param pivot constant pivot constant ---- ---- gui.PIVOT_CENTER ---- gui.PIVOT_N ---- gui.PIVOT_NE ---- gui.PIVOT_E ---- gui.PIVOT_SE ---- gui.PIVOT_S ---- gui.PIVOT_SW ---- gui.PIVOT_W ---- gui.PIVOT_NW ---- -function gui.set_pivot(node, pivot) end - ----Sets the position of the supplied node. ----@param node node node to set the position for ----@param position vector3|vector4 new position -function gui.set_position(node, position) end - ----Set the order number for the current GUI scene. ----The number dictates the sorting of the "gui" render predicate, ----in other words in which order the scene will be rendered in relation ----to other currently rendered GUI scenes. ----The number must be in the range 0 to 15. ----@param order number rendering order (0-15) -function gui.set_render_order(order) end - ----Sets the rotation of the supplied node. ----The rotation is expressed as a quaternion ----@param node node node to set the rotation for ----@param rotation quaternion|vector4 new rotation -function gui.set_rotation(node, rotation) end - ----Sets the scaling of the supplied node. ----@param node node node to set the scale for ----@param scale vector3|vector4 new scale -function gui.set_scale(node, scale) end - ----Set the screen position to the supplied node ----@param node node node to set the screen position to ----@param screen_position vector3 screen position -function gui.set_screen_position(node, screen_position) end - ----Sets the shadow color of the supplied node. ----See gui.set_color for info how vectors encode color values. ----@param node node node to set the shadow color for ----@param color vector3|vector4 new shadow color -function gui.set_shadow(node, color) end - ----Sets the size of the supplied node. ---- You can only set size on nodes with size mode set to SIZE_MODE_MANUAL ----@param node node node to set the size for ----@param size vector3|vector4 new size -function gui.set_size(node, size) end - ----Sets the size mode of a node. ----The size mode defines how the node will adjust itself in size. Automatic ----size mode alters the node size based on the node's content. Automatic size ----mode works for Box nodes and Pie nodes which will both adjust their size ----to match the assigned image. Particle fx and Text nodes will ignore ----any size mode setting. ----@param node node node to set size mode for ----@param size_mode constant size mode to set ---- ----gui.SIZE_MODE_MANUAL ----gui.SIZE_MODE_AUTO ---- -function gui.set_size_mode(node, size_mode) end - ----Set the slice9 configuration values for the node. ----@param node node node to manipulate ----@param values vector4 new values -function gui.set_slice9(node, values) end - ----Set the text value of a text node. This is only useful for text nodes. ----@param node node node to set text for ----@param text string|number text to set -function gui.set_text(node, text) end - ----Set the texture on a box or pie node. The texture must be mapped to ----the gui scene in the gui editor. The function points out which texture ----the node should render from. If the texture is an atlas, further ----information is needed to select which image/animation in the atlas ----to render. In such cases, use gui.play_flipbook() in ----addition to this function. ----@param node node node to set texture for ----@param texture string|hash texture id -function gui.set_texture(node, texture) end - ----Set the texture buffer data for a dynamically created texture. ----@param texture string|hash texture id ----@param width number texture width ----@param height number texture height ----@param type string|constant texture type ---- ---- "rgb" - RGB ---- "rgba" - RGBA ---- "l" - LUMINANCE ---- ----@param buffer string texture data ----@param flip boolean flip texture vertically ----@return boolean success setting the data was successful -function gui.set_texture_data(texture, width, height, type, buffer, flip) end - ----Sets the tracking value of a text node. This value is used to ----adjust the vertical spacing of characters in the text. ----@param node node node for which to set the tracking ----@param tracking number a scaling number for the letter spacing (default=0) -function gui.set_tracking(node, tracking) end - ----Set if a node should be visible or not. Only visible nodes are rendered. ----@param node node node to be visible or not ----@param visible boolean whether the node should be visible or not -function gui.set_visible(node, visible) end - ----The x-anchor specifies how the node is moved when the game is run in a different resolution. ----@param node node node to set x-anchor for ----@param anchor constant anchor constant ---- ----gui.ANCHOR_NONE ----gui.ANCHOR_LEFT ----gui.ANCHOR_RIGHT ---- -function gui.set_xanchor(node, anchor) end - ----The y-anchor specifies how the node is moved when the game is run in a different resolution. ----@param node node node to set y-anchor for ----@param anchor constant anchor constant ---- ----gui.ANCHOR_NONE ----gui.ANCHOR_TOP ----gui.ANCHOR_BOTTOM ---- -function gui.set_yanchor(node, anchor) end - ----Shows the on-display touch keyboard. ----The specified type of keyboard is displayed if it is available on ----the device. ----This function is only available on iOS and Android. . ----@param type constant keyboard type ---- ----gui.KEYBOARD_TYPE_DEFAULT ----gui.KEYBOARD_TYPE_EMAIL ----gui.KEYBOARD_TYPE_NUMBER_PAD ----gui.KEYBOARD_TYPE_PASSWORD ---- ----@param autoclose boolean if the keyboard should automatically close when clicking outside -function gui.show_keyboard(type, autoclose) end - ----Stops the particle fx for a gui node ----@param node node node to stop particle fx for ----@param options { clear:boolean|nil }|nil options when stopping the particle fx. Supported options: ---- ----boolean clear: instantly clear spawned particles ---- -function gui.stop_particlefx(node, options) end - - - -return gui \ No newline at end of file diff --git a/annotations/defold/html5.lua b/annotations/defold/html5.lua deleted file mode 100644 index bafc165..0000000 --- a/annotations/defold/html5.lua +++ /dev/null @@ -1,37 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - HTML5 API documentation - - HTML5 platform specific functions. - The following functions are only available on HTML5 builds, the html5.* Lua namespace will not be available on other platforms. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.html5 -html5 = {} - ----Executes the supplied string as JavaScript inside the browser. ----A call to this function is blocking, the result is returned as-is, as a string. ----(Internally this will execute the string using the eval() JavaScript function.) ----@param code string Javascript code to run ----@return string result result as string -function html5.run(code) end - ----Set a JavaScript interaction listener callaback from lua that will be ----invoked when a user interacts with the web page by clicking, touching or typing. ----The callback can then call DOM restricted actions like requesting a pointer lock, ----or start playing sounds the first time the callback is invoked. ----@param callback fun(self)|nil The interaction callback. Pass an empty function or nil if you no longer wish to receive callbacks. ---- ----self ----object The calling script ---- -function html5.set_interaction_listener(callback) end - -return html5 \ No newline at end of file diff --git a/annotations/defold/http.lua b/annotations/defold/http.lua deleted file mode 100644 index a4860a6..0000000 --- a/annotations/defold/http.lua +++ /dev/null @@ -1,49 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - HTTP API documentation - - Functions for performing HTTP and HTTPS requests. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.http -http = {} - ----Perform a HTTP/HTTPS request. ---- If no timeout value is passed, the configuration value "network.http_timeout" is used. If that is not set, the timeout value is 0 (which blocks indefinitely). ----@param url string target url ----@param method string HTTP/HTTPS method, e.g. "GET", "PUT", "POST" etc. ----@param callback fun(self, id, response) response callback function ---- ----self ----object The script instance ----id ----hash Internal message identifier. Do not use! ----response ----table The response data. Contains the fields: ---- ---- ----number status: the status of the response ----string response: the response data (if not saved on disc) ----table headers: all the returned headers ----string path: the stored path (if saved to disc) ----string error: if any unforeseen errors occurred (e.g. file I/O) ---- ----@param headers table|nil optional table with custom headers ----@param post_data string|nil optional data to send ----@param options table|nil optional table with request parameters. Supported entries: ---- ----number timeout: timeout in seconds ----string path: path on disc where to download the file. Only overwrites the path if status is 200. Not available in HTML5 build ----boolean ignore_cache: don't return cached data if we get a 304. Not available in HTML5 build ----boolean chunked_transfer: use chunked transfer encoding for https requests larger than 16kb. Defaults to true. Not available in HTML5 build ---- -function http.request(url, method, callback, headers, post_data, options) end - -return http \ No newline at end of file diff --git a/annotations/defold/image.lua b/annotations/defold/image.lua deleted file mode 100644 index 74843f2..0000000 --- a/annotations/defold/image.lua +++ /dev/null @@ -1,78 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Image API documentation - - Functions for creating image objects. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.image -image = {} - ----luminance image type -image.TYPE_LUMINANCE = nil - ----luminance image type -image.TYPE_LUMINANCE_ALPHA = nil - ----RGB image type -image.TYPE_RGB = nil - ----RGBA image type -image.TYPE_RGBA = nil - ----Load image (PNG or JPEG) from buffer. ----@param buffer string image data buffer ----@param options table|nil An optional table containing parameters for loading the image. Supported entries: ---- ----premultiply_alpha ----boolean True if alpha should be premultiplied into the color components. Defaults to false. ----flip_vertically ----boolean True if the image contents should be flipped vertically. Defaults to false. ---- ----@return { width:number, height:number, type:constant, buffer:string }|nil image object or nil if loading fails. The object is a table with the following fields: ---- ----number width: image width ----number height: image height ----constant type: image type ----image.TYPE_RGB ----image.TYPE_RGBA ----image.TYPE_LUMINANCE ----image.TYPE_LUMINANCE_ALPHA ---- ---- ----string buffer: the raw image data ---- -function image.load(buffer, options) end - ----Load image (PNG or JPEG) from a string buffer. ----@param buffer string image data buffer ----@param options table|nil An optional table containing parameters for loading the image. Supported entries: ---- ----premultiply_alpha ----boolean True if alpha should be premultiplied into the color components. Defaults to false. ----flip_vertically ----boolean True if the image contents should be flipped vertically. Defaults to false. ---- ----@return { width:number, height:number, type:constant, buffer:buffer_data }|nil image object or nil if loading fails. The object is a table with the following fields: ---- ----number width: image width ----number height: image height ----constant type: image type ----image.TYPE_RGB ----image.TYPE_RGBA ----image.TYPE_LUMINANCE ----image.TYPE_LUMINANCE_ALPHA ---- ---- ----buffer buffer: the script buffer that holds the decompressed image data. See buffer.create how to use the buffer. ---- -function image.load_buffer(buffer, options) end - -return image \ No newline at end of file diff --git a/annotations/defold/json.lua b/annotations/defold/json.lua deleted file mode 100644 index 50dba47..0000000 --- a/annotations/defold/json.lua +++ /dev/null @@ -1,41 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - JSON API documentation - - Manipulation of JSON data strings. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.json -json = {} - ----Represents the null primitive from a json file -json.null = nil - ----Decode a string of JSON data into a Lua table. ----A Lua error is raised for syntax errors. ----@param json string json data ----@param options { decode_null_as_userdata:boolean|nil }|nil table with decode options ---- ----bool decode_null_as_userdata: wether to decode a JSON null value as json.null or nil (default is nil) ---- ----@return table data decoded json -function json.decode(json, options) end - ----Encode a lua table to a JSON string. ----A Lua error is raised for syntax errors. ----@param tbl table lua table to encode ----@param options { encode_empty_table_as_object:string }|nil table with encode options ---- ----string encode_empty_table_as_object: wether to encode an empty table as an JSON object or array (default is object) ---- ----@return string json encoded json -function json.encode(tbl, options) end - -return json \ No newline at end of file diff --git a/annotations/defold/label.lua b/annotations/defold/label.lua deleted file mode 100644 index e042411..0000000 --- a/annotations/defold/label.lua +++ /dev/null @@ -1,28 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Label API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.label -label = {} - ----Gets the text from a label component ----@param url string|hash|url the label to get the text from ----@return string metrics the label text -function label.get_text(url) end - ----Sets the text of a label component ---- This method uses the message passing that means the value will be set after dispatch messages step. ----More information is available in the Application Lifecycle manual. ----@param url string|hash|url the label that should have a constant set ----@param text string the text -function label.set_text(url, text) end - -return label \ No newline at end of file diff --git a/annotations/defold/liveupdate.lua b/annotations/defold/liveupdate.lua deleted file mode 100644 index 0b93064..0000000 --- a/annotations/defold/liveupdate.lua +++ /dev/null @@ -1,155 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - LiveUpdate API documentation - - Functions and constants to access resources. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.liveupdate -liveupdate = {} - ----Mismatch between between expected bundled resources and actual bundled resources. The manifest expects a resource to be in the bundle, but it was not found in the bundle. This is typically the case when a non-excluded resource was modified between publishing the bundle and publishing the manifest. -liveupdate.LIVEUPDATE_BUNDLED_RESOURCE_MISMATCH = nil - ----Mismatch between running engine version and engine versions supported by manifest. -liveupdate.LIVEUPDATE_ENGINE_VERSION_MISMATCH = nil - ----Failed to parse manifest data buffer. The manifest was probably produced by a different engine version. -liveupdate.LIVEUPDATE_FORMAT_ERROR = nil - ----Argument was invalid -liveupdate.LIVEUPDATE_INVAL = nil - ----The handled resource is invalid. -liveupdate.LIVEUPDATE_INVALID_HEADER = nil - ----The header of the resource is invalid. -liveupdate.LIVEUPDATE_INVALID_RESOURCE = nil - ----I/O operation failed -liveupdate.LIVEUPDATE_IO_ERROR = nil - ----Memory wasn't allocated -liveupdate.LIVEUPDATE_MEM_ERROR = nil - ----LIVEUPDATE_OK -liveupdate.LIVEUPDATE_OK = nil - ----Mismatch between scheme used to load resources. Resources are loaded with a different scheme than from manifest, for example over HTTP or directly from file. This is typically the case when running the game directly from the editor instead of from a bundle. -liveupdate.LIVEUPDATE_SCHEME_MISMATCH = nil - ----Mismatch between manifest expected signature and actual signature. -liveupdate.LIVEUPDATE_SIGNATURE_MISMATCH = nil - ----Unspecified error -liveupdate.LIVEUPDATE_UNKNOWN = nil - ----Mismatch between manifest expected version and actual version. -liveupdate.LIVEUPDATE_VERSION_MISMATCH = nil - ----Adds a resource mount to the resource system. ----The mounts are persisted between sessions. ----After the mount succeeded, the resources are available to load. (i.e. no reboot required) ----@param name string Unique name of the mount ----@param uri string The uri of the mount, including the scheme. Currently supported schemes are 'zip' and 'archive'. ----@param priority integer Priority of mount. Larger priority takes prescedence ----@param callback function Callback after the asynchronous request completed ----@return number result The result of the request -function liveupdate.add_mount(name, uri, priority, callback) end - ----Return a reference to the Manifest that is currently loaded. ----@return number manifest_reference reference to the Manifest that is currently loaded -function liveupdate.get_current_manifest() end - ----Get an array of the current mounts ----This can be used to determine if a new mount is needed or not ----@return array mounts Array of mounts -function liveupdate.get_mounts() end - ----Is any liveupdate data mounted and currently in use? ----This can be used to determine if a new manifest or zip file should be downloaded. ----@return bool bool true if a liveupdate archive (any format) has been loaded -function liveupdate.is_using_liveupdate_data() end - ----Remove a mount the resource system. ----The remaining mounts are persisted between sessions. ----Removing a mount does not affect any loaded resources. ----@param name string Unique name of the mount ----@return number result The result of the call -function liveupdate.remove_mount(name) end - ----Stores a zip file and uses it for live update content. The contents of the ----zip file will be verified against the manifest to ensure file integrity. ----It is possible to opt out of the resource verification using an option passed ----to this function. ----The path is stored in the (internal) live update location. ----@param path string the path to the original file on disc ----@param callback fun(self, status) the callback function ----executed after the storage has completed ---- ----self ----object The current object. ----status ----constant the status of the store operation (See liveupdate.store_manifest) ---- ----@param options table|nil optional table with extra parameters. Supported entries: ---- ----boolean verify: if archive should be verified as well as stored (defaults to true) ---- -function liveupdate.store_archive(path, callback, options) end - ----Create a new manifest from a buffer. The created manifest is verified ----by ensuring that the manifest was signed using the bundled public/private ----key-pair during the bundle process and that the manifest supports the current ----running engine version. Once the manifest is verified it is stored on device. ----The next time the engine starts (or is rebooted) it will look for the stored ----manifest before loading resources. Storing a new manifest allows the ----developer to update the game, modify existing resources, or add new ----resources to the game through LiveUpdate. ----@param manifest_buffer string the binary data that represents the manifest ----@param callback fun(self, status) the callback function ----executed once the engine has attempted to store the manifest. ---- ----self ----object The current object. ----status ----constant the status of the store operation: ---- ---- ----liveupdate.LIVEUPDATE_OK ----liveupdate.LIVEUPDATE_INVALID_RESOURCE ----liveupdate.LIVEUPDATE_VERSION_MISMATCH ----liveupdate.LIVEUPDATE_ENGINE_VERSION_MISMATCH ----liveupdate.LIVEUPDATE_SIGNATURE_MISMATCH ----liveupdate.LIVEUPDATE_BUNDLED_RESOURCE_MISMATCH ----liveupdate.LIVEUPDATE_FORMAT_ERROR ---- -function liveupdate.store_manifest(manifest_buffer, callback) end - ----add a resource to the data archive and runtime index. The resource will be verified ----internally before being added to the data archive. ----@param manifest_reference number The manifest to check against. ----@param data string The resource data that should be stored. ----@param hexdigest string The expected hash for the resource, ----retrieved through collectionproxy.missing_resources. ----@param callback fun(self, hexdigest, status) The callback ----function that is executed once the engine has been attempted to store ----the resource. ---- ----self ----object The current object. ----hexdigest ----string The hexdigest of the resource. ----status ----boolean Whether or not the resource was successfully stored. ---- -function liveupdate.store_resource(manifest_reference, data, hexdigest, callback) end - -return liveupdate \ No newline at end of file diff --git a/annotations/defold/model.lua b/annotations/defold/model.lua deleted file mode 100644 index d38bb9d..0000000 --- a/annotations/defold/model.lua +++ /dev/null @@ -1,92 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Model API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.model -model = {} - ----Cancels all animation on a model component. ----@param url string|hash|url the model for which to cancel the animation -function model.cancel(url) end - ----Gets the id of the game object that corresponds to a model skeleton bone. ----The returned game object can be used for parenting and transform queries. ----This function has complexity O(n), where n is the number of bones in the model skeleton. ----Game objects corresponding to a model skeleton bone can not be individually deleted. ----@param url string|hash|url the model to query ----@param bone_id string|hash id of the corresponding bone ----@return hash id id of the game object -function model.get_go(url, bone_id) end - ----Get the enabled state of a mesh ----@param url string|hash|url the model ----@param mesh_id string|hash|url the id of the mesh ----@return boolean enabled true if the mesh is visible, false otherwise -function model.get_mesh_enabled(url, mesh_id) end - ----Plays an animation on a model component with specified playback ----mode and parameters. ----An optional completion callback function can be provided that will be called when ----the animation has completed playing. If no function is provided, ----a model_animation_done message is sent to the script that started the animation. ---- The callback is not called (or message sent) if the animation is ----cancelled with model.cancel. The callback is called (or message sent) only for ----animations that play with the following playback modes: ----go.PLAYBACK_ONCE_FORWARD ----go.PLAYBACK_ONCE_BACKWARD ----go.PLAYBACK_ONCE_PINGPONG ----@param url string|hash|url the model for which to play the animation ----@param anim_id string|hash id of the animation to play ----@param playback constant playback mode of the animation ---- ----go.PLAYBACK_ONCE_FORWARD ----go.PLAYBACK_ONCE_BACKWARD ----go.PLAYBACK_ONCE_PINGPONG ----go.PLAYBACK_LOOP_FORWARD ----go.PLAYBACK_LOOP_BACKWARD ----go.PLAYBACK_LOOP_PINGPONG ---- ----@param play_properties { blend_duration:number|nil, offset:number|nil, playback_rate:number|nil}|nil optional table with properties ----Play properties table: ---- ----blend_duration ----number Duration of a linear blend between the current and new animation. ----offset ----number The normalized initial value of the animation cursor when the animation starts playing. ----playback_rate ----number The rate with which the animation will be played. Must be positive. ---- ----@param complete_function fun(self, message_id, message, sender)|nil function to call when the animation has completed. ---- ----self ----object The current object. ----message_id ----hash The name of the completion message, "model_animation_done". ----message ----table Information about the completion: ---- ---- ----hash animation_id - the animation that was completed. ----constant playback - the playback mode for the animation. ---- ---- ----sender ----url The invoker of the callback: the model component. ---- -function model.play_anim(url, anim_id, playback, play_properties, complete_function) end - ----Enable or disable visibility of a mesh ----@param url string|hash|url the model ----@param mesh_id string|hash|url the id of the mesh ----@param enabled boolean true if the mesh should be visible, false if it should be hideen -function model.set_mesh_enabled(url, mesh_id, enabled) end - -return model \ No newline at end of file diff --git a/annotations/defold/msg.lua b/annotations/defold/msg.lua deleted file mode 100644 index a14c2fd..0000000 --- a/annotations/defold/msg.lua +++ /dev/null @@ -1,54 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Messaging API documentation - - Functions for passing messages and constructing URL objects. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.msg -msg = {} - ----Post a message to a receiving URL. The most common case is to send messages ----to a component. If the component part of the receiver is omitted, the message ----is broadcast to all components in the game object. ----The following receiver shorthands are available: ----"." the current game object ----"#" the current component ---- There is a 2 kilobyte limit to the message parameter table size. ----@param receiver string|url|hash The receiver must be a string in URL-format, a URL object or a hashed string. ----@param message_id string|hash The id must be a string or a hashed string. ----@param message table|nil a lua table with message parameters to send. -function msg.post(receiver, message_id, message) end - ----creates a new URL from separate arguments ----@param socket string|hash|nil socket of the URL ----@param path string|hash|nil path of the URL ----@param fragment string|hash|nil fragment of the URL ----@return url url a new URL -function msg.url(socket, path, fragment) end - ----The format of the string must be [socket:][path][#fragment], which is similar to a HTTP URL. ----When addressing instances: ----socket is the name of a valid world (a collection) ----path is the id of the instance, which can either be relative the instance of the calling script or global ----fragment would be the id of the desired component ----In addition, the following shorthands are available: ----"." the current game object ----"#" the current component ----@param urlstring string string to create the url from ----@return url url a new URL -function msg.url(urlstring) end - ----This is equivalent to msg.url(nil) or msg.url("#"), which creates an url to the current ----script component. ----@return url url a new URL -function msg.url() end - -return msg \ No newline at end of file diff --git a/annotations/defold/particlefx.lua b/annotations/defold/particlefx.lua deleted file mode 100644 index 7f59db8..0000000 --- a/annotations/defold/particlefx.lua +++ /dev/null @@ -1,85 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Particle effects API documentation - - Functions for controlling particle effect component playback and - shader constants. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.particlefx -particlefx = {} - ----The emitter is not spawning any particles, but has particles that are still alive. -particlefx.EMITTER_STATE_POSTSPAWN = nil - ----The emitter will be in this state when it has been started but before spawning any particles. Normally the emitter is in this state for a short time, depending on if a start delay has been set for this emitter or not. -particlefx.EMITTER_STATE_PRESPAWN = nil - ----The emitter does not have any living particles and will not spawn any particles in this state. -particlefx.EMITTER_STATE_SLEEPING = nil - ----The emitter is spawning particles. -particlefx.EMITTER_STATE_SPAWNING = nil - ----Starts playing a particle FX component. ----Particle FX started this way need to be manually stopped through particlefx.stop(). ----Which particle FX to play is identified by the URL. ---- A particle FX will continue to emit particles even if the game object the particle FX component belonged to is deleted. You can call particlefx.stop() to stop it from emitting more particles. ----@param url string|hash|url the particle fx that should start playing. ----@param emitter_state_function fun(self, id, emitter, state)|nil optional callback function that will be called when an emitter attached to this particlefx changes state. ---- ----self ----object The current object ----id ----hash The id of the particle fx component ----emitter ----hash The id of the emitter ----state ----constant the new state of the emitter: ---- ---- ----particlefx.EMITTER_STATE_SLEEPING ----particlefx.EMITTER_STATE_PRESPAWN ----particlefx.EMITTER_STATE_SPAWNING ----particlefx.EMITTER_STATE_POSTSPAWN ---- -function particlefx.play(url, emitter_state_function) end - ----Resets a shader constant for a particle FX component emitter. ----The constant must be defined in the material assigned to the emitter. ----Resetting a constant through this function implies that the value defined in the material will be used. ----Which particle FX to reset a constant for is identified by the URL. ----@param url string|hash|url the particle FX that should have a constant reset ----@param emitter string|hash the id of the emitter ----@param constant string|hash the name of the constant -function particlefx.reset_constant(url, emitter, constant) end - ----Sets a shader constant for a particle FX component emitter. ----The constant must be defined in the material assigned to the emitter. ----Setting a constant through this function will override the value set for that constant in the material. ----The value will be overridden until particlefx.reset_constant is called. ----Which particle FX to set a constant for is identified by the URL. ----@param url string|hash|url the particle FX that should have a constant set ----@param emitter string|hash the id of the emitter ----@param constant string|hash the name of the constant ----@param value vector4 the value of the constant -function particlefx.set_constant(url, emitter, constant, value) end - ----Stops a particle FX component from playing. ----Stopping a particle FX does not remove already spawned particles. ----Which particle FX to stop is identified by the URL. ----@param url string|hash|url the particle fx that should stop playing ----@param options { clear:boolean|nil }|nil Options when stopping the particle fx. Supported options: ---- ----boolean clear: instantly clear spawned particles ---- -function particlefx.stop(url, options) end - -return particlefx \ No newline at end of file diff --git a/annotations/defold/physics.lua b/annotations/defold/physics.lua deleted file mode 100644 index 17f19b7..0000000 --- a/annotations/defold/physics.lua +++ /dev/null @@ -1,300 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Collision object physics API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.physics -physics = {} - ----The following properties are available when connecting a joint of JOINT_TYPE_FIXED type: -physics.JOINT_TYPE_FIXED = nil - ----The following properties are available when connecting a joint of JOINT_TYPE_HINGE type: -physics.JOINT_TYPE_HINGE = nil - ----The following properties are available when connecting a joint of JOINT_TYPE_SLIDER type: -physics.JOINT_TYPE_SLIDER = nil - ----The following properties are available when connecting a joint of JOINT_TYPE_SPRING type: -physics.JOINT_TYPE_SPRING = nil - ----The following properties are available when connecting a joint of JOINT_TYPE_WELD type: -physics.JOINT_TYPE_WELD = nil - ----The following properties are available when connecting a joint of JOINT_TYPE_WHEEL type: -physics.JOINT_TYPE_WHEEL = nil - -physics.SHAPE_TYPE_SPHERE = nil - -physics.SHAPE_TYPE_BOX = nil - -physics.SHAPE_TYPE_CAPSULE = nil - -physics.SHAPE_TYPE_HULL = nil - ----Create a physics joint between two collision object components. ----Note: Currently only supported in 2D physics. ----@param joint_type number the joint type ----@param collisionobject_a string|hash|url first collision object ----@param joint_id string|hash id of the joint ----@param position_a vector3 local position where to attach the joint on the first collision object ----@param collisionobject_b string|hash|url second collision object ----@param position_b vector3 local position where to attach the joint on the second collision object ----@param properties table|nil optional joint specific properties table ----See each joint type for possible properties field. The one field that is accepted for all joint types is: ----- boolean collide_connected: Set this flag to true if the attached bodies should collide. -function physics.create_joint(joint_type, collisionobject_a, joint_id, position_a, collisionobject_b, position_b, properties) end - ----Destroy an already physics joint. The joint has to be created before a ----destroy can be issued. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url collision object where the joint exist ----@param joint_id string|hash id of the joint -function physics.destroy_joint(collisionobject, joint_id) end - ----Get the gravity in runtime. The gravity returned is not global, it will return ----the gravity for the collection that the function is called from. ----Note: For 2D physics the z component will always be zero. ----@return vector3 gravity gravity vector of collection -function physics.get_gravity() end - ----Returns the group name of a collision object as a hash. ----@param url string|hash|url the collision object to return the group of. ----@return hash group hash value of the group. ----local function check_is_enemy() ---- local group = physics.get_group("#collisionobject") ---- return group == hash("enemy") ----end ---- -function physics.get_group(url) end - ----Get a table for properties for a connected joint. The joint has to be created before ----properties can be retrieved. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url collision object where the joint exist ----@param joint_id string|hash id of the joint ----@return { collide_connected:boolean|nil } properties properties table. See the joint types for what fields are available, the only field available for all types is: ---- ----boolean collide_connected: Set this flag to true if the attached bodies should collide. ---- -function physics.get_joint_properties(collisionobject, joint_id) end - ----Get the reaction force for a joint. The joint has to be created before ----the reaction force can be calculated. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url collision object where the joint exist ----@param joint_id string|hash id of the joint ----@return vector3 force reaction force for the joint -function physics.get_joint_reaction_force(collisionobject, joint_id) end - ----Get the reaction torque for a joint. The joint has to be created before ----the reaction torque can be calculated. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url collision object where the joint exist ----@param joint_id string|hash id of the joint ----@return float torque the reaction torque on bodyB in N*m. -function physics.get_joint_reaction_torque(collisionobject, joint_id) end - ----Returns true if the specified group is set in the mask of a collision ----object, false otherwise. ----@param url string|hash|url the collision object to check the mask of. ----@param group string the name of the group to check for. ----@return boolean maskbit boolean value of the maskbit. 'true' if present, 'false' otherwise. ----local function is_invincible() ---- -- check if the collisionobject would collide with the "bullet" group ---- local invincible = physics.get_maskbit("#collisionobject", "bullet") ---- return invincible ----end ---- -function physics.get_maskbit(url, group) end - ----Gets collision shape data from a collision object ----@param url string|hash|url the collision object. ----@param shape string|hash the name of the shape to get data for. ----@return { type:number|nil, diameter:number|nil, dimensions:vector3|nil, height:number|nil } table A table containing meta data about the physics shape ---- ----type ----number The shape type. Supported values: ---- ---- ----physics.SHAPE_TYPE_SPHERE ----physics.SHAPE_TYPE_BOX ----physics.SHAPE_TYPE_CAPSULE Only supported for 3D physics ----physics.SHAPE_TYPE_HULL ---- ----The returned table contains different fields depending on which type the shape is. ----If the shape is a sphere: ---- ----diameter ----number the diameter of the sphere shape ---- ----If the shape is a box: ---- ----dimensions ----vector3 a vmath.vector3 of the box dimensions ---- ----If the shape is a capsule: ---- ----diameter ----number the diameter of the capsule poles ----height ----number the height of the capsule ---- ----local function get_shape_meta() ---- local sphere = physics.get_shape("#collisionobject", "my_sphere_shape") ---- -- returns a table with sphere.diameter ---- return sphere ----end ---- -function physics.get_shape(url, shape) end - ----Ray casts are used to test for intersections against collision objects in the physics world. ----Collision objects of types kinematic, dynamic and static are tested against. Trigger objects ----do not intersect with ray casts. ----Which collision objects to hit is filtered by their collision groups and can be configured ----through groups. ----@param from vector3 the world position of the start of the ray ----@param to vector3 the world position of the end of the ray ----@param groups table a lua table containing the hashed groups for which to test collisions against ----@param options { all:boolean|nil }|nil a lua table containing options for the raycast. ---- ----all ----boolean Set to true to return all ray cast hits. If false, it will only return the closest hit. ---- ----@return physics.raycast_response[]|physics.raycast_response|nil result It returns a list. If missed it returns nil. See ray_cast_response for details on the returned values. -function physics.raycast(from, to, groups, options) end - ----Ray casts are used to test for intersections against collision objects in the physics world. ----Collision objects of types kinematic, dynamic and static are tested against. Trigger objects ----do not intersect with ray casts. ----Which collision objects to hit is filtered by their collision groups and can be configured ----through groups. ----The actual ray cast will be performed during the physics-update. ----If an object is hit, the result will be reported via a ray_cast_response message. ----If there is no object hit, the result will be reported via a ray_cast_missed message. ----@param from vector3 the world position of the start of the ray ----@param to vector3 the world position of the end of the ray ----@param groups table a lua table containing the hashed groups for which to test collisions against ----@param request_id number|nil a number between [0,-255]. It will be sent back in the response for identification, 0 by default -function physics.raycast_async(from, to, groups, request_id) end - ----Set the gravity in runtime. The gravity change is not global, it will only affect ----the collection that the function is called from. ----Note: For 2D physics the z component of the gravity vector will be ignored. ----@param gravity vector3 the new gravity vector -function physics.set_gravity(gravity) end - ----Updates the group property of a collision object to the specified ----string value. The group name should exist i.e. have been used in ----a collision object in the editor. ----@param url string|hash|url the collision object affected. ----@param group string the new group name to be assigned. ----local function change_collision_group() ---- physics.set_group("#collisionobject", "enemy") ----end ---- -function physics.set_group(url, group) end - ----Flips the collision shapes horizontally for a collision object ----@param url string|hash|url the collision object that should flip its shapes ----@param flip boolean true if the collision object should flip its shapes, false if not -function physics.set_hflip(url, flip) end - ----Updates the properties for an already connected joint. The joint has to be created before ----properties can be changed. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url collision object where the joint exist ----@param joint_id string|hash id of the joint ----@param properties table joint specific properties table ----Note: The collide_connected field cannot be updated/changed after a connection has been made. -function physics.set_joint_properties(collisionobject, joint_id, properties) end - ----sets a physics world event listener. If a function is set, physics messages will no longer be sent. ----@param callback fun(self, event, data)|nil A callback that receives information about all the physics interactions in this physics world. ---- ----self ----object The calling script ----event ----constant The type of event. Can be one of these messages: ---- ---- ----contact_point_event ----collision_event ----trigger_event ----ray_cast_response ----ray_cast_missed ---- ---- ----data ----table The callback value data is a table that contains event-related data. See the documentation for details on the messages. ---- -function physics.set_listener(callback) end - ----Sets or clears the masking of a group (maskbit) in a collision object. ----@param url string|hash|url the collision object to change the mask of. ----@param group string the name of the group (maskbit) to modify in the mask. ----@param maskbit boolean boolean value of the new maskbit. 'true' to enable, 'false' to disable. ----local function make_invincible() ---- -- no longer collide with the "bullet" group ---- physics.set_maskbit("#collisionobject", "bullet", false) ----end ---- -function physics.set_maskbit(url, group, maskbit) end - ----Sets collision shape data for a collision object. Please note that updating data in 3D ----can be quite costly for box and capsules. Because of the physics engine, the cost ----comes from having to recreate the shape objects when certain shapes needs to be updated. ----@param url string|hash|url the collision object. ----@param shape string|hash the name of the shape to get data for. ----@param table { diameter:number|nil, dimensions:vector3|nil, height:number|nil } the shape data to update the shape with. ----See physics.get_shape for a detailed description of each field in the data table. ----local function set_shape_data() ---- -- set capsule shape data ---- local data = {} ---- data.diameter = 10 ---- data.height = 20 ---- physics.set_shape("#collisionobject", "my_capsule_shape", data) ---- ---- -- set sphere shape data ---- data = {} ---- data.diameter = 10 ---- physics.set_shape("#collisionobject", "my_sphere_shape", data) ---- ---- -- set box shape data ---- data = {} ---- data.dimensions = vmath.vector3(10, 10, 5) ---- physics.set_shape("#collisionobject", "my_box_shape", data) ----end ---- -function physics.set_shape(url, shape, table) end - ----Flips the collision shapes vertically for a collision object ----@param url string|hash|url the collision object that should flip its shapes ----@param flip boolean true if the collision object should flip its shapes, false if not -function physics.set_vflip(url, flip) end - ----The function recalculates the density of each shape based on the total area of all shapes and the specified mass, then updates the mass of the body accordingly. ----Note: Currently only supported in 2D physics. ----@param collisionobject string|hash|url the collision object whose mass needs to be updated. ----@param mass number the new mass value to set for the collision object. -function physics.update_mass(collisionobject, mass) end - ----Collision objects tend to fall asleep when inactive for a small period of time for ----efficiency reasons. This function wakes them up. ----@param url string|hash|url the collision object to wake. ----function on_input(self, action_id, action) ---- if action_id == hash("test") and action.pressed then ---- physics.wakeup("#collisionobject") ---- end ----end ---- -function physics.wakeup(url) end - -return physics \ No newline at end of file diff --git a/annotations/defold/profiler.lua b/annotations/defold/profiler.lua deleted file mode 100644 index 348fba5..0000000 --- a/annotations/defold/profiler.lua +++ /dev/null @@ -1,126 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Profiler API documentation - - Functions for getting profiling data in runtime. - More detailed profiling and debugging information available in the manuals. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.profiler -profiler = {} - ----pause on current frame -profiler.MODE_PAUSE = nil - ----start recording -profiler.MODE_RECORD = nil - ----continously show latest frame -profiler.MODE_RUN = nil - ----pause at peak frame -profiler.MODE_SHOW_PEAK_FRAME = nil - ----show full profiler ui -profiler.VIEW_MODE_FULL = nil - ----show mimimal profiler ui -profiler.VIEW_MODE_MINIMIZED = nil - ----Creates and shows or hides and destroys the on-sceen profiler ui ----The profiler is a real-time tool that shows the numbers of milliseconds spent ----in each scope per frame as well as counters. The profiler is very useful for ----tracking down performance and resource problems. ----@param enabled boolean true to enable, false to disable -function profiler.enable_ui(enabled) end - ----Get the percent of CPU usage by the application, as reported by the OS. ---- This function is not available on HTML5. ----For some platforms ( Android, Linux and Windows), this information is only available ----by default in the debug version of the engine. It can be enabled in release version as well ----by checking track_cpu under profiler in the game.project file. ----(This means that the engine will sample the CPU usage in intervalls during execution even in release mode.) ----@return number percent of CPU used by the application -function profiler.get_cpu_usage() end - ----Get the amount of memory used (resident/working set) by the application in bytes, as reported by the OS. ---- This function is not available on HTML5. ----The values are gathered from internal OS functions which correspond to the following; ----OS ----Value ---- iOS MacOSAndroid Linux ----Resident memory ---- Windows ----Working set ---- HTML5 ---- Not available ----@return number bytes used by the application -function profiler.get_memory_usage() end - ----Send a text to the profiler ----@param text string the string to send to the profiler -function profiler.log_text(text) end - ----Get the number of recorded frames in the on-screen profiler ui recording buffer ----@return number frame_count the number of recorded frames, zero if on-screen profiler is disabled -function profiler.recorded_frame_count() end - ----Starts a profile scope. ----@param name string The name of the scope -function profiler.scope_begin(name) end - ----End the current profile scope. -function profiler.scope_end() end - ----Set the on-screen profile mode - run, pause, record or show peak frame ----@param mode constant the mode to set the ui profiler in ---- ----profiler.MODE_RUN This is default mode that continously shows the last frame ----profiler.MODE_PAUSE Pauses on the currently displayed frame ----profiler.MODE_SHOW_PEAK_FRAME Pauses on the currently displayed frame but shows a new frame if that frame is slower ----profiler.MODE_RECORD Records all incoming frames to the recording buffer ---- ----To stop recording, switch to a different mode such as MODE_PAUSE or MODE_RUN. ----You can also use the view_recorded_frame function to display a recorded frame. Doing so stops the recording as well. ----Every time you switch to recording mode the recording buffer is cleared. ----The recording buffer is also cleared when setting the MODE_SHOW_PEAK_FRAME mode. -function profiler.set_ui_mode(mode) end - ----Set the on-screen profile view mode - minimized or expanded ----@param mode constant the view mode to set the ui profiler in ---- ----profiler.VIEW_MODE_FULL The default mode which displays all the ui profiler details ----profiler.VIEW_MODE_MINIMIZED Minimized mode which only shows the top header (fps counters and ui profiler mode) ---- -function profiler.set_ui_view_mode(mode) end - ----Shows or hides the time the engine waits for vsync in the on-screen profiler ----Each frame the engine waits for vsync and depending on your vsync settings and how much time ----your game logic takes this time can dwarf the time in the game logic making it hard to ----see details in the on-screen profiler graph and lists. ----Also, by hiding this the FPS times in the header show the time spent each time excuding the ----time spent waiting for vsync. This shows you how long time your game is spending actively ----working each frame. ----This setting also effects the display of recorded frames but does not affect the actual ----recorded frames so it is possible to toggle this on and off when viewing recorded frames. ----By default the vsync wait times is displayed in the profiler. ----@param visible boolean true to include it in the display, false to hide it. -function profiler.set_ui_vsync_wait_visible(visible) end - ----Pauses and displays a frame from the recording buffer in the on-screen profiler ui ----The frame to show can either be an absolute frame or a relative frame to the current frame. ----@param frame_index table a table where you specify one of the following parameters: ---- ----distance The offset from the currently displayed frame (this is truncated between zero and the number of recorded frames) ----frame The frame index in the recording buffer (1 is first recorded frame) ---- -function profiler.view_recorded_frame(frame_index) end - -return profiler \ No newline at end of file diff --git a/annotations/defold/render.lua b/annotations/defold/render.lua deleted file mode 100644 index b691d44..0000000 --- a/annotations/defold/render.lua +++ /dev/null @@ -1,674 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Rendering API documentation - - Rendering functions, messages and constants. The "render" namespace is - accessible only from render scripts. - The rendering API was originally built on top of OpenGL ES 2.0, and it uses a subset of the - OpenGL computer graphics rendering API for rendering 2D and 3D computer - graphics. Our current target is OpenGLES 3.0 with fallbacks to 2.0 on some platforms. - It is possible to create materials and write shaders that - require features not in OpenGL ES 2.0, but those will not work cross platform. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.render -render = {} - ---- -render.BLEND_CONSTANT_ALPHA = nil - ---- -render.BLEND_CONSTANT_COLOR = nil - ---- -render.BLEND_DST_ALPHA = nil - ---- -render.BLEND_DST_COLOR = nil - ---- -render.BLEND_ONE = nil - ---- -render.BLEND_ONE_MINUS_CONSTANT_ALPHA = nil - ---- -render.BLEND_ONE_MINUS_CONSTANT_COLOR = nil - ---- -render.BLEND_ONE_MINUS_DST_ALPHA = nil - ---- -render.BLEND_ONE_MINUS_DST_COLOR = nil - ---- -render.BLEND_ONE_MINUS_SRC_ALPHA = nil - ---- -render.BLEND_ONE_MINUS_SRC_COLOR = nil - ---- -render.BLEND_SRC_ALPHA = nil - ---- -render.BLEND_SRC_ALPHA_SATURATE = nil - ---- -render.BLEND_SRC_COLOR = nil - ---- -render.BLEND_ZERO = nil - ---- -render.BUFFER_COLOR0_BIT = nil - ---- -render.BUFFER_COLOR1_BIT = nil - ---- -render.BUFFER_COLOR2_BIT = nil - ---- -render.BUFFER_COLOR3_BIT = nil - ---- -render.BUFFER_COLOR_BIT = nil - ---- -render.BUFFER_DEPTH_BIT = nil - ---- -render.BUFFER_STENCIL_BIT = nil - ---- -render.COMPARE_FUNC_ALWAYS = nil - ---- -render.COMPARE_FUNC_EQUAL = nil - ---- -render.COMPARE_FUNC_GEQUAL = nil - ---- -render.COMPARE_FUNC_GREATER = nil - ---- -render.COMPARE_FUNC_LEQUAL = nil - ---- -render.COMPARE_FUNC_LESS = nil - ---- -render.COMPARE_FUNC_NEVER = nil - ---- -render.COMPARE_FUNC_NOTEQUAL = nil - ---- -render.FACE_BACK = nil - ---- -render.FACE_FRONT = nil - ---- -render.FACE_FRONT_AND_BACK = nil - ---- -render.FILTER_LINEAR = nil - ---- -render.FILTER_NEAREST = nil - ---- -render.FORMAT_DEPTH = nil - ---- -render.FORMAT_LUMINANCE = nil - ----May be nil if the format isn't supported -render.FORMAT_R16F = nil - ----May be nil if the format isn't supported -render.FORMAT_R32F = nil - ----May be nil if the format isn't supported -render.FORMAT_RG16F = nil - ----May be nil if the format isn't supported -render.FORMAT_RG32F = nil - ---- -render.FORMAT_RGB = nil - ----May be nil if the format isn't supported -render.FORMAT_RGB16F = nil - ----May be nil if the format isn't supported -render.FORMAT_RGB32F = nil - ---- -render.FORMAT_RGBA = nil - ----May be nil if the format isn't supported -render.FORMAT_RGBA16F = nil - ----May be nil if the format isn't supported -render.FORMAT_RGBA32F = nil - ---- -render.FORMAT_STENCIL = nil - ---- -render.FRUSTUM_PLANES_ALL = nil - ---- -render.FRUSTUM_PLANES_SIDES = nil - ---- -render.RENDER_TARGET_DEFAULT = nil - ---- -render.STATE_BLEND = nil - ---- -render.STATE_CULL_FACE = nil - ---- -render.STATE_DEPTH_TEST = nil - ---- -render.STATE_POLYGON_OFFSET_FILL = nil - ---- -render.STATE_STENCIL_TEST = nil - ---- -render.STENCIL_OP_DECR = nil - ---- -render.STENCIL_OP_DECR_WRAP = nil - ---- -render.STENCIL_OP_INCR = nil - ---- -render.STENCIL_OP_INCR_WRAP = nil - ---- -render.STENCIL_OP_INVERT = nil - ---- -render.STENCIL_OP_KEEP = nil - ---- -render.STENCIL_OP_REPLACE = nil - ---- -render.STENCIL_OP_ZERO = nil - ---- -render.WRAP_CLAMP_TO_BORDER = nil - ---- -render.WRAP_CLAMP_TO_EDGE = nil - ---- -render.WRAP_MIRRORED_REPEAT = nil - ---- -render.WRAP_REPEAT = nil - ----Clear buffers in the currently enabled render target with specified value. If the render target has been created with multiple ----color attachments, all buffers will be cleared with the same value. ----@param buffers table table with keys specifying which buffers to clear and values set to clear values. Available keys are: ---- ----render.BUFFER_COLOR_BIT ----render.BUFFER_DEPTH_BIT ----render.BUFFER_STENCIL_BIT ---- -function render.clear(buffers) end - ----Constant buffers are used to set shader program variables and are optionally passed to the render.draw() function. ----The buffer's constant elements can be indexed like an ordinary Lua table, but you can't iterate over them with pairs() or ipairs(). ----@return constant_buffer buffer new constant buffer -function render.constant_buffer() end - ----Deletes a render target created by a render script. ----You cannot delete a render target resource. ----@param render_target render_target render target to delete -function render.delete_render_target(render_target) end - ----If a material is currently enabled, disable it. ----The name of the material must be specified in the ".render" resource set ----in the "game.project" setting. -function render.disable_material() end - ----Disables a render state. ----@param state constant state to disable ---- ----render.STATE_DEPTH_TEST ----render.STATE_STENCIL_TEST ----render.STATE_BLEND ----render.STATE_ALPHA_TEST ( not available on iOS and Android) ----render.STATE_CULL_FACE ----render.STATE_POLYGON_OFFSET_FILL ---- -function render.disable_state(state) end - ----Disables a texture that has previourly been enabled. ----@param binding number|string|hash texture binding, either by texture unit, string or hash that should be disabled -function render.disable_texture(binding) end - ----Draws all objects that match a specified predicate. An optional constant buffer can be ----provided to override the default constants. If no constants buffer is provided, a default ----system constants buffer is used containing constants as defined in materials and set through ----go.set (or particlefx.set_constant) on visual components. ----@param predicate render_predicate predicate to draw for ----@param options { frustum:matrix4|nil, frustum_planes:number|nil, constants:constant_buffer|nil }|nil optional table with properties: ---- ----frustum ----vmath.matrix4 A frustum matrix used to cull renderable items. (E.g. local frustum = proj * view). default=nil ----frustum_planes ----int Determines which sides of the frustum will be used. Default is render.FRUSTUM_PLANES_SIDES. ---- ---- ----render.FRUSTUM_PLANES_SIDES : The left, right, top and bottom sides of the frustum. ----render.FRUSTUM_PLANES_ALL : All 6 sides of the frustum. ---- ---- ----constants ----constant_buffer optional constants to use while rendering ---- -function render.draw(predicate, options) end - ----Draws all 3d debug graphics such as lines drawn with "draw_line" messages and physics visualization. ----@param options { frustum:matrix4|nil, frustum_planes:number|nil }|nil optional table with properties: ---- ----frustum ----vmath.matrix4 A frustum matrix used to cull renderable items. (E.g. local frustum = proj * view). May be nil. ----frustum_planes ----int Determines which sides of the frustum will be used. Default is render.FRUSTUM_PLANES_SIDES. ---- ---- ----render.FRUSTUM_PLANES_SIDES : The left, right, top and bottom sides of the frustum. ----render.FRUSTUM_PLANES_ALL : All sides of the frustum. ---- -function render.draw_debug3d(options) end - ----If another material was already enabled, it will be automatically disabled ----and the specified material is used instead. ----The name of the material must be specified in the ".render" resource set ----in the "game.project" setting. ----@param material_id string|hash material id to enable -function render.enable_material(material_id) end - ----Enables a particular render state. The state will be enabled until disabled. ----@param state constant state to enable ---- ----render.STATE_DEPTH_TEST ----render.STATE_STENCIL_TEST ----render.STATE_BLEND ----render.STATE_ALPHA_TEST ( not available on iOS and Android) ----render.STATE_CULL_FACE ----render.STATE_POLYGON_OFFSET_FILL ---- -function render.enable_state(state) end - ----Sets the specified texture handle for a render target attachment or a regular texture ----that should be used for rendering. The texture can be bound to either a texture unit ----or to a sampler name by a hash or a string. ----A texture can be bound to multiple units and sampler names at the same time, ----the actual binding will be applied to the shaders when a shader program is bound. ----When mixing binding using both units and sampler names, you might end up in situations ----where two different textures will be applied to the same bind location in the shader. ----In this case, the texture set to the named sampler will take precedence over the unit. ----Note that you can bind multiple sampler names to the same texture, in case you want to reuse ----the same texture for differnt use-cases. It is however recommended that you use the same name ----everywhere for the textures that should be shared across different materials. ----@param binding number|string|hash texture binding, either by texture unit, string or hash for the sampler name that the texture should be bound to ----@param handle_or_name resource_handle|string|hash render target or texture handle that should be bound, or a named resource in the "Render Resource" table in the currently assigned .render file ----@param buffer_type constant|nil optional buffer type from which to enable the texture. Note that this argument only applies to render targets. Defaults to render.BUFFER_COLOR_BIT. These values are supported: ---- ----render.BUFFER_COLOR_BIT ---- ----If The render target has been created as depth and/or stencil textures, these buffer types can be used: ---- ----render.BUFFER_DEPTH_BIT ----render.BUFFER_STENCIL_BIT ---- ----If the render target has been created with multiple color attachments, these buffer types can be used ----to enable those textures as well. Currently 4 color attachments are supported: ---- ----render.BUFFER_COLOR0_BIT ----render.BUFFER_COLOR1_BIT ----render.BUFFER_COLOR2_BIT ----render.BUFFER_COLOR3_BIT ---- -function render.enable_texture(binding, handle_or_name, buffer_type) end - ----Returns the logical window height that is set in the "game.project" settings. ----Note that the actual window pixel size can change, either by device constraints ----or user input. ----@return number height specified window height -function render.get_height() end - ----Returns the specified buffer height from a render target. ----@param render_target render_target render target from which to retrieve the buffer height ----@param buffer_type constant which type of buffer to retrieve the height from ---- ----render.BUFFER_COLOR_BIT ----render.BUFFER_DEPTH_BIT ----render.BUFFER_STENCIL_BIT ---- ----@return number height the height of the render target buffer texture -function render.get_render_target_height(render_target, buffer_type) end - ----Returns the specified buffer width from a render target. ----@param render_target render_target render target from which to retrieve the buffer width ----@param buffer_type constant which type of buffer to retrieve the width from ---- ----render.BUFFER_COLOR_BIT ----render.BUFFER_COLOR[x]_BIT (x: [0..3], if supported!) ----render.BUFFER_DEPTH_BIT ----render.BUFFER_STENCIL_BIT ---- ----@return number width the width of the render target buffer texture -function render.get_render_target_width(render_target, buffer_type) end - ----Returns the logical window width that is set in the "game.project" settings. ----Note that the actual window pixel size can change, either by device constraints ----or user input. ----@return number width specified window width (number) -function render.get_width() end - ----Returns the actual physical window height. ----Note that this value might differ from the logical height that is set in the ----"game.project" settings. ----@return number height actual window height -function render.get_window_height() end - ----Returns the actual physical window width. ----Note that this value might differ from the logical width that is set in the ----"game.project" settings. ----@return number width actual window width -function render.get_window_width() end - ----This function returns a new render predicate for objects with materials matching ----the provided material tags. The provided tags are combined into a bit mask ----for the predicate. If multiple tags are provided, the predicate matches materials ----with all tags ANDed together. ----The current limit to the number of tags that can be defined is 64. ----@param tags (string|hash)[] table of tags that the predicate should match. The tags can be of either hash or string type ----@return render_predicate predicate new predicate -function render.predicate(tags) end - ----Creates a new render target according to the supplied ----specification table. ----The table should contain keys specifying which buffers should be created ----with what parameters. Each buffer key should have a table value consisting ----of parameters. The following parameter keys are available: ----Key ----Values ----format ----render.FORMAT_LUMINANCErender.FORMAT_RGBrender.FORMAT_RGBArender.FORMAT_DEPTHrender.FORMAT_STENCILrender.FORMAT_RGBA32Frender.FORMAT_RGBA16F ----width ----number ----height ----number ----min_filter (optional) ----render.FILTER_LINEARrender.FILTER_NEAREST ----mag_filter (optional) ----render.FILTER_LINEARrender.FILTER_NEAREST ----u_wrap (optional) ----render.WRAP_CLAMP_TO_BORDERrender.WRAP_CLAMP_TO_EDGErender.WRAP_MIRRORED_REPEATrender.WRAP_REPEAT ----v_wrap (optional) ----render.WRAP_CLAMP_TO_BORDERrender.WRAP_CLAMP_TO_EDGErender.WRAP_MIRRORED_REPEATrender.WRAP_REPEAT ----flags (optional) ----render.TEXTURE_BIT (only applicable to depth and stencil buffers) ----The render target can be created to support multiple color attachments. Each attachment can have different format settings and texture filters, ----but attachments must be added in sequence, meaning you cannot create a render target at slot 0 and 3. ----Instead it has to be created with all four buffer types ranging from [0..3] (as denoted by render.BUFFER_COLORX_BIT where 'X' is the attachment you want to create). ----It is not guaranteed that the device running the script can support creating render targets with multiple color attachments. To check if the device can support multiple attachments, ----you can check if the render table contains any of the BUFFER_COLOR1_BIT, BUFFER_COLOR2_BIT or BUFFER_COLOR3_BIT constants: ----function init(self) ---- if render.BUFFER_COLOR1_BIT == nil then ---- -- this devices does not support multiple color attachments ---- end ----end ----@param name string render target name ----@param parameters table table of buffer parameters, see the description for available keys and values ----@return render_target render_target new render target -function render.render_target(name, parameters) end - ----Specifies the arithmetic used when computing pixel values that are written to the frame ----buffer. In RGBA mode, pixels can be drawn using a function that blends the source RGBA ----pixel values with the destination pixel values already in the frame buffer. ----Blending is initially disabled. ----source_factor specifies which method is used to scale the source color components. ----destination_factor specifies which method is used to scale the destination color ----components. ----Source color components are referred to as (Rs,Gs,Bs,As). ----Destination color components are referred to as (Rd,Gd,Bd,Ad). ----The color specified by setting the blendcolor is referred to as (Rc,Gc,Bc,Ac). ----The source scale factor is referred to as (sR,sG,sB,sA). ----The destination scale factor is referred to as (dR,dG,dB,dA). ----The color values have integer values between 0 and (kR,kG,kB,kA), where kc = 2mc - 1 and mc is the number of bitplanes for that color. I.e for 8 bit color depth, color values are between 0 and 255. ----Available factor constants and corresponding scale factors: ----Factor constant ----Scale factor (fR,fG,fB,fA) ----render.BLEND_ZERO ----(0,0,0,0) ----render.BLEND_ONE ----(1,1,1,1) ----render.BLEND_SRC_COLOR ----(Rs/kR,Gs/kG,Bs/kB,As/kA) ----render.BLEND_ONE_MINUS_SRC_COLOR ----(1,1,1,1) - (Rs/kR,Gs/kG,Bs/kB,As/kA) ----render.BLEND_DST_COLOR ----(Rd/kR,Gd/kG,Bd/kB,Ad/kA) ----render.BLEND_ONE_MINUS_DST_COLOR ----(1,1,1,1) - (Rd/kR,Gd/kG,Bd/kB,Ad/kA) ----render.BLEND_SRC_ALPHA ----(As/kA,As/kA,As/kA,As/kA) ----render.BLEND_ONE_MINUS_SRC_ALPHA ----(1,1,1,1) - (As/kA,As/kA,As/kA,As/kA) ----render.BLEND_DST_ALPHA ----(Ad/kA,Ad/kA,Ad/kA,Ad/kA) ----render.BLEND_ONE_MINUS_DST_ALPHA ----(1,1,1,1) - (Ad/kA,Ad/kA,Ad/kA,Ad/kA) ----render.BLEND_CONSTANT_COLOR ----(Rc,Gc,Bc,Ac) ----render.BLEND_ONE_MINUS_CONSTANT_COLOR ----(1,1,1,1) - (Rc,Gc,Bc,Ac) ----render.BLEND_CONSTANT_ALPHA ----(Ac,Ac,Ac,Ac) ----render.BLEND_ONE_MINUS_CONSTANT_ALPHA ----(1,1,1,1) - (Ac,Ac,Ac,Ac) ----render.BLEND_SRC_ALPHA_SATURATE ----(i,i,i,1) where i = min(As, kA - Ad) /kA ----The blended RGBA values of a pixel comes from the following equations: ----Rd = min(kR, Rs * sR + Rd * dR) ----Gd = min(kG, Gs * sG + Gd * dG) ----Bd = min(kB, Bs * sB + Bd * dB) ----Ad = min(kA, As * sA + Ad * dA) ----Blend function (render.BLEND_SRC_ALPHA, render.BLEND_ONE_MINUS_SRC_ALPHA) is useful for ----drawing with transparency when the drawn objects are sorted from farthest to nearest. ----It is also useful for drawing antialiased points and lines in arbitrary order. ----@param source_factor constant source factor ----@param destination_factor constant destination factor -function render.set_blend_func(source_factor, destination_factor) end - ----Specifies whether the individual color components in the frame buffer is enabled for writing (true) or disabled (false). For example, if blue is false, nothing is written to the blue component of any pixel in any of the color buffers, regardless of the drawing operation attempted. Note that writing are either enabled or disabled for entire color components, not the individual bits of a component. ----The component masks are all initially true. ----@param red boolean red mask ----@param green boolean green mask ----@param blue boolean blue mask ----@param alpha boolean alpha mask -function render.set_color_mask(red, green, blue, alpha) end - ----Specifies whether front- or back-facing polygons can be culled ----when polygon culling is enabled. Polygon culling is initially disabled. ----If mode is render.FACE_FRONT_AND_BACK, no polygons are drawn, but other ----primitives such as points and lines are drawn. The initial value for ----face_type is render.FACE_BACK. ----@param face_type constant face type ---- ----render.FACE_FRONT ----render.FACE_BACK ----render.FACE_FRONT_AND_BACK ---- -function render.set_cull_face(face_type) end - ----Specifies the function that should be used to compare each incoming pixel ----depth value with the value present in the depth buffer. ----The comparison is performed only if depth testing is enabled and specifies ----the conditions under which a pixel will be drawn. ----Function constants: ----render.COMPARE_FUNC_NEVER (never passes) ----render.COMPARE_FUNC_LESS (passes if the incoming depth value is less than the stored value) ----render.COMPARE_FUNC_LEQUAL (passes if the incoming depth value is less than or equal to the stored value) ----render.COMPARE_FUNC_GREATER (passes if the incoming depth value is greater than the stored value) ----render.COMPARE_FUNC_GEQUAL (passes if the incoming depth value is greater than or equal to the stored value) ----render.COMPARE_FUNC_EQUAL (passes if the incoming depth value is equal to the stored value) ----render.COMPARE_FUNC_NOTEQUAL (passes if the incoming depth value is not equal to the stored value) ----render.COMPARE_FUNC_ALWAYS (always passes) ----The depth function is initially set to render.COMPARE_FUNC_LESS. ----@param func constant depth test function, see the description for available values -function render.set_depth_func(func) end - ----Specifies whether the depth buffer is enabled for writing. The supplied mask governs ----if depth buffer writing is enabled (true) or disabled (false). ----The mask is initially true. ----@param depth boolean depth mask -function render.set_depth_mask(depth) end - ----Sets the scale and units used to calculate depth values. ----If render.STATE_POLYGON_OFFSET_FILL is enabled, each fragment's depth value ----is offset from its interpolated value (depending on the depth value of the ----appropriate vertices). Polygon offset can be used when drawing decals, rendering ----hidden-line images etc. ----factor specifies a scale factor that is used to create a variable depth ----offset for each polygon. The initial value is 0. ----units is multiplied by an implementation-specific value to create a ----constant depth offset. The initial value is 0. ----The value of the offset is computed as factor × DZ + r × units ----DZ is a measurement of the depth slope of the polygon which is the change in z (depth) ----values divided by the change in either x or y coordinates, as you traverse a polygon. ----The depth values are in window coordinates, clamped to the range [0, 1]. ----r is the smallest value that is guaranteed to produce a resolvable difference. ----It's value is an implementation-specific constant. ----The offset is added before the depth test is performed and before the ----value is written into the depth buffer. ----@param factor number polygon offset factor ----@param units number polygon offset units -function render.set_polygon_offset(factor, units) end - ----Sets the projection matrix to use when rendering. ----@param matrix matrix4 projection matrix -function render.set_projection(matrix) end - ----Sets a render target. Subsequent draw operations will be to the ----render target until it is replaced by a subsequent call to set_render_target. ----This function supports render targets created by a render script, or a render target resource. ----@param render_target render_target render target to set. render.RENDER_TARGET_DEFAULT to set the default render target ----@param options { transient:number[]|nil }|nil optional table with behaviour parameters ---- ----transient ----table Transient frame buffer types are only valid while the render target is active, i.e becomes undefined when a new target is set by a subsequent call to set_render_target. ---- Default is all non-transient. Be aware that some hardware uses a combined depth stencil buffer and when this is the case both are considered non-transient if exclusively selected! ---- A buffer type defined that doesn't exist in the render target is silently ignored. ---- ---- ----render.BUFFER_COLOR_BIT ----render.BUFFER_DEPTH_BIT ----render.BUFFER_STENCIL_BIT ---- -function render.set_render_target(render_target, options) end - ----Sets the render target size for a render target created from ----either a render script, or from a render target resource. ----@param render_target render_target render target to set size for ----@param width number new render target width ----@param height number new render target height -function render.set_render_target_size(render_target, width, height) end - ----Stenciling is similar to depth-buffering as it enables and disables drawing on a ----per-pixel basis. First, GL drawing primitives are drawn into the stencil planes. ----Second, geometry and images are rendered but using the stencil planes to mask out ----where to draw. ----The stencil test discards a pixel based on the outcome of a comparison between the ----reference value ref and the corresponding value in the stencil buffer. ----func specifies the comparison function. See the table below for values. ----The initial value is render.COMPARE_FUNC_ALWAYS. ----ref specifies the reference value for the stencil test. The value is clamped to ----the range [0, 2n-1], where n is the number of bitplanes in the stencil buffer. ----The initial value is 0. ----mask is ANDed with both the reference value and the stored stencil value when the test ----is done. The initial value is all 1's. ----Function constant: ----render.COMPARE_FUNC_NEVER (never passes) ----render.COMPARE_FUNC_LESS (passes if (ref & mask) < (stencil & mask)) ----render.COMPARE_FUNC_LEQUAL (passes if (ref & mask) <= (stencil & mask)) ----render.COMPARE_FUNC_GREATER (passes if (ref & mask) > (stencil & mask)) ----render.COMPARE_FUNC_GEQUAL (passes if (ref & mask) >= (stencil & mask)) ----render.COMPARE_FUNC_EQUAL (passes if (ref & mask) = (stencil & mask)) ----render.COMPARE_FUNC_NOTEQUAL (passes if (ref & mask) != (stencil & mask)) ----render.COMPARE_FUNC_ALWAYS (always passes) ----@param func constant stencil test function, see the description for available values ----@param ref number reference value for the stencil test ----@param mask number mask that is ANDed with both the reference value and the stored stencil value when the test is done -function render.set_stencil_func(func, ref, mask) end - ----The stencil mask controls the writing of individual bits in the stencil buffer. ----The least significant n bits of the parameter mask, where n is the number of ----bits in the stencil buffer, specify the mask. ----Where a 1 bit appears in the mask, the corresponding ----bit in the stencil buffer can be written. Where a 0 bit appears in the mask, ----the corresponding bit in the stencil buffer is never written. ----The mask is initially all 1's. ----@param mask number stencil mask -function render.set_stencil_mask(mask) end - ----The stencil test discards a pixel based on the outcome of a comparison between the ----reference value ref and the corresponding value in the stencil buffer. ----To control the test, call render.set_stencil_func. ----This function takes three arguments that control what happens to the stored stencil ----value while stenciling is enabled. If the stencil test fails, no change is made to the ----pixel's color or depth buffers, and sfail specifies what happens to the stencil buffer ----contents. ----Operator constants: ----render.STENCIL_OP_KEEP (keeps the current value) ----render.STENCIL_OP_ZERO (sets the stencil buffer value to 0) ----render.STENCIL_OP_REPLACE (sets the stencil buffer value to ref, as specified by render.set_stencil_func) ----render.STENCIL_OP_INCR (increments the stencil buffer value and clamp to the maximum representable unsigned value) ----render.STENCIL_OP_INCR_WRAP (increments the stencil buffer value and wrap to zero when incrementing the maximum representable unsigned value) ----render.STENCIL_OP_DECR (decrements the current stencil buffer value and clamp to 0) ----render.STENCIL_OP_DECR_WRAP (decrements the current stencil buffer value and wrap to the maximum representable unsigned value when decrementing zero) ----render.STENCIL_OP_INVERT (bitwise inverts the current stencil buffer value) ----dppass and dpfail specify the stencil buffer actions depending on whether subsequent ----depth buffer tests succeed (dppass) or fail (dpfail). ----The initial value for all operators is render.STENCIL_OP_KEEP. ----@param sfail constant action to take when the stencil test fails ----@param dpfail constant the stencil action when the stencil test passes ----@param dppass constant the stencil action when both the stencil test and the depth test pass, or when the stencil test passes and either there is no depth buffer or depth testing is not enabled -function render.set_stencil_op(sfail, dpfail, dppass) end - ----Sets the view matrix to use when rendering. ----@param matrix matrix4 view matrix to set -function render.set_view(matrix) end - ----Set the render viewport to the specified rectangle. ----@param x number left corner ----@param y number bottom corner ----@param width number viewport width ----@param height number viewport height -function render.set_viewport(x, y, width, height) end - -return render \ No newline at end of file diff --git a/annotations/defold/resource.lua b/annotations/defold/resource.lua deleted file mode 100644 index b812d2d..0000000 --- a/annotations/defold/resource.lua +++ /dev/null @@ -1,760 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Resource API documentation - - Functions and constants to access resources. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.resource -resource = {} - ----BASIS_UASTC compression type -resource.COMPRESSION_TYPE_BASIS_UASTC = nil - ----COMPRESSION_TYPE_DEFAULT compression type -resource.COMPRESSION_TYPE_DEFAULT = nil - ----luminance type texture format -resource.TEXTURE_FORMAT_LUMINANCE = nil - ----R16F type texture format -resource.TEXTURE_FORMAT_R16F = nil - ----R32F type texture format -resource.TEXTURE_FORMAT_R32F = nil - ----RG16F type texture format -resource.TEXTURE_FORMAT_RG16F = nil - ----RG32F type texture format -resource.TEXTURE_FORMAT_RG32F = nil - ----RGB type texture format -resource.TEXTURE_FORMAT_RGB = nil - ----RGB16F type texture format -resource.TEXTURE_FORMAT_RGB16F = nil - ----RGB32F type texture format -resource.TEXTURE_FORMAT_RGB32F = nil - ----RGBA type texture format -resource.TEXTURE_FORMAT_RGBA = nil - ----RGBA16F type texture format -resource.TEXTURE_FORMAT_RGBA16F = nil - ----RGBA32F type texture format -resource.TEXTURE_FORMAT_RGBA32F = nil - ----RGBA_ASTC_4x4 type texture format -resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 = nil - ----RGBA_BC3 type texture format -resource.TEXTURE_FORMAT_RGBA_BC3 = nil - ----RGBA_BC7 type texture format -resource.TEXTURE_FORMAT_RGBA_BC7 = nil - ----RGBA_ETC2 type texture format -resource.TEXTURE_FORMAT_RGBA_ETC2 = nil - ----RGBA_PVRTC_2BPPV1 type texture format -resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 = nil - ----RGBA_PVRTC_4BPPV1 type texture format -resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 = nil - ----RGB_BC1 type texture format -resource.TEXTURE_FORMAT_RGB_BC1 = nil - ----RGB_ETC1 type texture format -resource.TEXTURE_FORMAT_RGB_ETC1 = nil - ----RGB_PVRTC_2BPPV1 type texture format -resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 = nil - ----RGB_PVRTC_4BPPV1 type texture format -resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 = nil - ----RG_BC5 type texture format -resource.TEXTURE_FORMAT_RG_BC5 = nil - ----R_BC4 type texture format -resource.TEXTURE_FORMAT_R_BC4 = nil - ----2D texture type -resource.TEXTURE_TYPE_2D = nil - ----2D Array texture type -resource.TEXTURE_TYPE_2D_ARRAY = nil - ----Cube map texture type -resource.TEXTURE_TYPE_CUBE_MAP = nil - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.atlas(path) end - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.buffer(path) end - ----This function creates a new atlas resource that can be used in the same way as any atlas created during build time. ----The path used for creating the atlas must be unique, trying to create a resource at a path that is already ----registered will trigger an error. If the intention is to instead modify an existing atlas, use the resource.set_atlas ----function. Also note that the path to the new atlas resource must have a '.texturesetc' extension, ----meaning "/path/my_atlas" is not a valid path but "/path/my_atlas.texturesetc" is. ----When creating the atlas, at least one geometry and one animation is required, and an error will be ----raised if these requirements are not met. A reference to the resource will be held by the collection ----that created the resource and will automatically be released when that collection is destroyed. ----Note that releasing a resource essentially means decreasing the reference count of that resource, ----and not necessarily that it will be deleted. ----@param path string The path to the resource. ----@param table resource.atlas A table containing info about how to create the atlas. Supported entries: ---- ---- ---- ----texture ----string | hash the path to the texture resource, e.g "/main/my_texture.texturec" ---- ---- ---- ---- ----animations ----table a list of the animations in the atlas. Supports the following fields: ---- ---- ---- ---- ----id ----string the id of the animation, used in e.g sprite.play_animation ---- ---- ---- ---- ----width ----integer the width of the animation ---- ---- ---- ---- ----height ----integer the height of the animation ---- ---- ---- ---- ----frame_start ----integer index to the first geometry of the animation. Indices are lua based and must be in the range of 1 .. in atlas. ---- ---- ---- ---- ----frame_end ----integer index to the last geometry of the animation (non-inclusive). Indices are lua based and must be in the range of 1 .. in atlas. ---- ---- ---- ---- ----playback ----constant optional playback mode of the animation, the default value is go.PLAYBACK_ONCE_FORWARD ---- ---- ---- ---- ----fps ----integer optional fps of the animation, the default value is 30 ---- ---- ---- ---- ----flip_vertical ----boolean optional flip the animation vertically, the default value is false ---- ---- ---- ---- ----flip_horizontal ----boolean optional flip the animation horizontally, the default value is false ---- ---- ---- ---- ----geometries ----table A list of the geometries that should map to the texture data. Supports the following fields: ---- ---- ---- ---- ----id ----string The name of the geometry. Used when matching animations between multiple atlases ---- ---- ---- ---- ----vertices ----table a list of the vertices in texture space of the geometry in the form {px0, py0, px1, py1, ..., pxn, pyn} ---- ---- ---- ---- ----uvs ----table a list of the uv coordinates in texture space of the geometry in the form of {u0, v0, u1, v1, ..., un, vn} ---- ---- ---- ---- ----indices ----table a list of the indices of the geometry in the form {i0, i1, i2, ..., in}. Each tripe in the list represents a triangle. ---- ---- ---- ----@return hash path Returns the atlas resource path -function resource.create_atlas(path, table) end - ----This function creates a new buffer resource that can be used in the same way as any buffer created during build time. ----The function requires a valid buffer created from either buffer.create or another pre-existing buffer resource. ----By default, the new resource will take ownership of the buffer lua reference, meaning the buffer will not automatically be removed ----when the lua reference to the buffer is garbage collected. This behaviour can be overruled by specifying 'transfer_ownership = false' ----in the argument table. If the new buffer resource is created from a buffer object that is created by another resource, ----the buffer object will be copied and the new resource will effectively own a copy of the buffer instead. ----Note that the path to the new resource must have the '.bufferc' extension, "/path/my_buffer" is not a valid path but "/path/my_buffer.bufferc" is. ----The path must also be unique, attempting to create a buffer with the same name as an existing resource will raise an error. ----@param path string The path to the resource. ----@param table { buffer:buffer_data, transfer_ownership:boolean|nil }|nil A table containing info about how to create the buffer. Supported entries: ---- ---- ---- ----buffer ----buffer the buffer to bind to this resource ---- ---- ---- ---- ----transfer_ownership ----boolean optional flag to determine wether or not the resource should take over ownership of the buffer object (default true) ---- ---- ---- ----@return hash path Returns the buffer resource path -function resource.create_buffer(path, table) end - ----Creates a new texture resource that can be used in the same way as any texture created during build time. ----The path used for creating the texture must be unique, trying to create a resource at a path that is already ----registered will trigger an error. If the intention is to instead modify an existing texture, use the resource.set_texture ----function. Also note that the path to the new texture resource must have a '.texturec' extension, ----meaning "/path/my_texture" is not a valid path but "/path/my_texture.texturec" is. ----If the texture is created without a buffer, the pixel data will be blank. ----@param path string The path to the resource. ----@param table { type:number, width:number, height:number, format:number, max_mipmaps:number|nil, compression_type:number|nil} A table containing info about how to create the texture. Supported entries: ---- ----type ----number The texture type. Supported values: ---- ---- ----resource.TEXTURE_TYPE_2D ----resource.TEXTURE_TYPE_CUBE_MAP ---- ---- ----width ----number The width of the texture (in pixels). Must be larger than 0. ----height ----number The width of the texture (in pixels). Must be larger than 0. ----format ----number The texture format, note that some of these formats might not be supported by the running device. Supported values: ---- ---- ----resource.TEXTURE_FORMAT_LUMINANCE ----resource.TEXTURE_FORMAT_RGB ----resource.TEXTURE_FORMAT_RGBA ---- ----These constants might not be available on the device: ---- ----resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 ----resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 ----resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 ----resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 ----resource.TEXTURE_FORMAT_RGB_ETC1 ----resource.TEXTURE_FORMAT_RGBA_ETC2 ----resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 ----resource.TEXTURE_FORMAT_RGB_BC1 ----resource.TEXTURE_FORMAT_RGBA_BC3 ----resource.TEXTURE_FORMAT_R_BC4 ----resource.TEXTURE_FORMAT_RG_BC5 ----resource.TEXTURE_FORMAT_RGBA_BC7 ----resource.TEXTURE_FORMAT_RGB16F ----resource.TEXTURE_FORMAT_RGB32F ----resource.TEXTURE_FORMAT_RGBA16F ----resource.TEXTURE_FORMAT_RGBA32F ----resource.TEXTURE_FORMAT_R16F ----resource.TEXTURE_FORMAT_RG16F ----resource.TEXTURE_FORMAT_R32F ----resource.TEXTURE_FORMAT_RG32F ---- ----You can test if the device supports these values by checking if a specific enum is nil or not: ----if resource.TEXTURE_FORMAT_RGBA16F ~= nil then ---- -- it is safe to use this format ----end ---- ---- ---- ----max_mipmaps ----number optional max number of mipmaps. Defaults to zero, i.e no mipmap support ----compression_type ----number optional specify the compression type for the data in the buffer object that holds the texture data. Will only be used when a compressed buffer has been passed into the function. ----Creating an empty texture with no buffer data is not supported as a core feature. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: ---- ---- ----COMPRESSION_TYPE_DEFAULT ----COMPRESSION_TYPE_BASIS_UASTC ---- ----@param buffer buffer_data optional buffer of precreated pixel data ----@return hash path The path to the resource. -function resource.create_texture(path, table, buffer) end - ----Creates a new texture resource that can be used in the same way as any texture created during build time. ----The path used for creating the texture must be unique, trying to create a resource at a path that is already ----registered will trigger an error. If the intention is to instead modify an existing texture, use the resource.set_texture ----function. Also note that the path to the new texture resource must have a '.texturec' extension, ----meaning "/path/my_texture" is not a valid path but "/path/my_texture.texturec" is. ----If the texture is created without a buffer, the pixel data will be blank. ----The difference between the async version and resource.create_texture is that the texture data will be uploaded ----in a graphics worker thread. The function will return a resource immediately that contains a 1x1 blank texture which can be used ----immediately after the function call. When the new texture has been uploaded, the initial blank texture will be deleted and replaced with the ----new texture. Be careful when using the initial texture handle handle as it will not be valid after the upload has finished. ----@param path string The path to the resource. ----@param table { type:number, width:number, height:number, format:number, max_mipmaps:number|nil, compression_type:number|nil} ----A table containing info about how to create the texture. Supported entries: ----type ----number The texture type. Supported values: ---- ---- ----resource.TEXTURE_TYPE_2D ----resource.TEXTURE_TYPE_CUBE_MAP ---- ---- ----width ----number The width of the texture (in pixels). Must be larger than 0. ----height ----number The width of the texture (in pixels). Must be larger than 0. ----format ----number The texture format, note that some of these formats might not be supported by the running device. Supported values: ---- ---- ----resource.TEXTURE_FORMAT_LUMINANCE ----resource.TEXTURE_FORMAT_RGB ----resource.TEXTURE_FORMAT_RGBA ---- ----These constants might not be available on the device: ---- ----resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 ----resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 ----resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 ----resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 ----resource.TEXTURE_FORMAT_RGB_ETC1 ----resource.TEXTURE_FORMAT_RGBA_ETC2 ----resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 ----resource.TEXTURE_FORMAT_RGB_BC1 ----resource.TEXTURE_FORMAT_RGBA_BC3 ----resource.TEXTURE_FORMAT_R_BC4 ----resource.TEXTURE_FORMAT_RG_BC5 ----resource.TEXTURE_FORMAT_RGBA_BC7 ----resource.TEXTURE_FORMAT_RGB16F ----resource.TEXTURE_FORMAT_RGB32F ----resource.TEXTURE_FORMAT_RGBA16F ----resource.TEXTURE_FORMAT_RGBA32F ----resource.TEXTURE_FORMAT_R16F ----resource.TEXTURE_FORMAT_RG16F ----resource.TEXTURE_FORMAT_R32F ----resource.TEXTURE_FORMAT_RG32F ---- ----You can test if the device supports these values by checking if a specific enum is nil or not: ----if resource.TEXTURE_FORMAT_RGBA16F ~= nil then ---- -- it is safe to use this format ----end ---- ---- ---- ----max_mipmaps ----number optional max number of mipmaps. Defaults to zero, i.e no mipmap support ----compression_type ----number optional specify the compression type for the data in the buffer object that holds the texture data. Will only be used when a compressed buffer has been passed into the function. ----Creating an empty texture with no buffer data is not supported as a core feature. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: ---- ---- ----COMPRESSION_TYPE_DEFAULT ----COMPRESSION_TYPE_BASIS_UASTC ---- ----@param buffer buffer_data optional buffer of precreated pixel data ----@return hash path The path to the resource. ----@return resource_handle request_id The request id for the async request. -function resource.create_texture_async(path, table, buffer) end - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.font(path) end - ----Returns the atlas data for an atlas ----@param path hash|string The path to the atlas resource ----@return resource.atlas data A table with the following entries: ---- ----texture ----geometries ----animations ---- ----See resource.set_atlas for a detailed description of each field -function resource.get_atlas(path) end - ----gets the buffer from a resource ----@param path hash|string The path to the resource ----@return buffer_data buffer The resource buffer -function resource.get_buffer(path) end - ----Gets render target info from a render target resource path or a render target handle ----@param path hash|string|resource_handle The path to the resource or a render target handle ----@return { handle:resource_handle, attachments:{ handle:resource_handle, width:number, height:number, depth:number, mipmaps:number, type:number, buffer_type:number }[] } table A table containing info about the render target: ---- ----handle ----handle the opaque handle to the texture resource ----'attachments' ----table a table of attachments, where each attachment contains the following entries: ----handle ----handle the opaque handle to the texture resource ----width ----integer width of the texture ----height ----integer height of the texture ----depth ----integer depth of the texture (i.e 1 for a 2D texture and 6 for a cube map) ----mipmaps ----integer number of mipmaps of the texture ----type ----number The texture type. Supported values: ---- ---- ----resource.TEXTURE_TYPE_2D ----resource.TEXTURE_TYPE_CUBE_MAP ----resource.TEXTURE_TYPE_2D_ARRAY ---- ---- ----buffer_type ----number The attachment buffer type. Supported values: ---- ---- ----resource.BUFFER_TYPE_COLOR0 ----resource.BUFFER_TYPE_COLOR1 ----resource.BUFFER_TYPE_COLOR2 ----resource.BUFFER_TYPE_COLOR3 ----resource.BUFFER_TYPE_DEPTH ----resource.BUFFER_TYPE_STENCIL ---- -function resource.get_render_target_info(path) end - ----Gets the text metrics from a font ----@param url hash the font to get the (unscaled) metrics from ----@param text string text to measure ----@param options { width:number|nil, leading:number|nil, tracking:number|nil, line_break:boolean|nil}|nil A table containing parameters for the text. Supported entries: ---- ----width ----integer The width of the text field. Not used if line_break is false. ----leading ----number The leading (default 1.0) ----tracking ----number The tracking (default 0.0) ----line_break ----boolean If the calculation should consider line breaks (default false) ---- ----@return { width:number, height:number, max_ascent:number, max_descent:number } metrics a table with the following fields: ---- ----width ----height ----max_ascent ----max_descent ---- -function resource.get_text_metrics(url, text, options) end - ----Gets texture info from a texture resource path or a texture handle ----@param path hash|string|resource_handle The path to the resource or a texture handle ----@return { handle:resource_handle, width:number, height:number, depth:number, mipmaps:number, type:number } table A table containing info about the texture: ---- ----handle ----handle the opaque handle to the texture resource ----width ----integer width of the texture ----height ----integer height of the texture ----depth ----integer depth of the texture (i.e 1 for a 2D texture and 6 for a cube map) ----mipmaps ----integer number of mipmaps of the texture ----type ----number The texture type. Supported values: ---- ---- ----resource.TEXTURE_TYPE_2D ----resource.TEXTURE_TYPE_CUBE_MAP ----resource.TEXTURE_TYPE_2D_ARRAY ---- -function resource.get_texture_info(path) end - ----Loads the resource data for a specific resource. ----@param path string The path to the resource ----@return buffer_data buffer Returns the buffer stored on disc -function resource.load(path) end - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.material(path) end - ----Release a resource. ---- This is a potentially dangerous operation, releasing resources currently being used can cause unexpected behaviour. ----@param path hash|string The path to the resource. -function resource.release(path) end - ----Sets the resource data for a specific resource ----@param path string|hash The path to the resource ----@param buffer buffer_data The buffer of precreated data, suitable for the intended resource type -function resource.set(path, buffer) end - ----Sets the data for a specific atlas resource. Setting new atlas data is specified by passing in ----a texture path for the backing texture of the atlas, a list of geometries and a list of animations ----that map to the entries in the geometry list. The geometry entries are represented by three lists: ----vertices, uvs and indices that together represent triangles that are used in other parts of the ----engine to produce render objects from. ----Vertex and uv coordinates for the geometries are expected to be ----in pixel coordinates where 0,0 is the top left corner of the texture. ----There is no automatic padding or margin support when setting custom data, ----which could potentially cause filtering artifacts if used with a material sampler that has linear filtering. ----If that is an issue, you need to calculate padding and margins manually before passing in the geometry data to ----this function. ----@param path hash|string The path to the atlas resource ----@param table resource.atlas A table containing info about the atlas. Supported entries: ---- ---- ---- ----texture ----string | hash the path to the texture resource, e.g "/main/my_texture.texturec" ---- ---- ---- ---- ----animations ----table a list of the animations in the atlas. Supports the following fields: ---- ---- ---- ---- ----id ----string the id of the animation, used in e.g sprite.play_animation ---- ---- ---- ---- ----width ----integer the width of the animation ---- ---- ---- ---- ----height ----integer the height of the animation ---- ---- ---- ---- ----frame_start ----integer index to the first geometry of the animation. Indices are lua based and must be in the range of 1 .. in atlas. ---- ---- ---- ---- ----frame_end ----integer index to the last geometry of the animation (non-inclusive). Indices are lua based and must be in the range of 1 .. in atlas. ---- ---- ---- ---- ----playback ----constant optional playback mode of the animation, the default value is go.PLAYBACK_ONCE_FORWARD ---- ---- ---- ---- ----fps ----integer optional fps of the animation, the default value is 30 ---- ---- ---- ---- ----flip_vertical ----boolean optional flip the animation vertically, the default value is false ---- ---- ---- ---- ----flip_horizontal ----boolean optional flip the animation horizontally, the default value is false ---- ---- ---- ---- ----geometries ----table A list of the geometries that should map to the texture data. Supports the following fields: ---- ---- ---- ---- ----vertices ----table a list of the vertices in texture space of the geometry in the form {px0, py0, px1, py1, ..., pxn, pyn} ---- ---- ---- ---- ----uvs ----table a list of the uv coordinates in texture space of the geometry in the form of {u0, v0, u1, v1, ..., un, vn} ---- ---- ---- ---- ----indices ----table a list of the indices of the geometry in the form {i0, i1, i2, ..., in}. Each tripe in the list represents a triangle. ---- ---- ---- -function resource.set_atlas(path, table) end - ----Sets the buffer of a resource. By default, setting the resource buffer will either copy the data from the incoming buffer object ----to the buffer stored in the destination resource, or make a new buffer object if the sizes between the source buffer and the destination buffer ----stored in the resource differs. In some cases, e.g performance reasons, it might be beneficial to just set the buffer object on the resource without copying or cloning. ----To achieve this, set the transfer_ownership flag to true in the argument table. Transferring ownership from a lua buffer to a resource with this function ----works exactly the same as resource.create_buffer: the destination resource will take ownership of the buffer held by the lua reference, i.e the buffer will not automatically be removed ----when the lua reference to the buffer is garbage collected. ----Note: When setting a buffer with transfer_ownership = true, the currently bound buffer in the resource will be destroyed. ----@param path hash|string The path to the resource ----@param buffer buffer_data The resource buffer ----@param table { transfer_ownership: boolean|nil }|nil A table containing info about how to set the buffer. Supported entries: ---- ---- ---- ----transfer_ownership ----boolean optional flag to determine wether or not the resource should take over ownership of the buffer object (default false) ---- ---- ---- -function resource.set_buffer(path, buffer, table) end - ----Update internal sound resource (wavc/oggc) with new data ----@param path hash|string The path to the resource ----@param buffer string A lua string containing the binary sound data -function resource.set_sound(path, buffer) end - ----Sets the pixel data for a specific texture. ----@param path hash|string The path to the resource ----@param table { type:number, width:number, height:number, format:number, x:number|nil, y:number|nil, mipmap:number|nil, compression_type:number|nil} A table containing info about the texture. Supported entries: ---- ----type ----number The texture type. Supported values: ---- ---- ----resource.TEXTURE_TYPE_2D ----resource.TEXTURE_TYPE_CUBE_MAP ---- ---- ----width ----number The width of the texture (in pixels) ----height ----number The width of the texture (in pixels) ----format ----number The texture format, note that some of these formats are platform specific. Supported values: ---- ---- ----resource.TEXTURE_FORMAT_LUMINANCE ----resource.TEXTURE_FORMAT_RGB ----resource.TEXTURE_FORMAT_RGBA ---- ----These constants might not be available on the device: ----- resource.TEXTURE_FORMAT_RGB_PVRTC_2BPPV1 ----- resource.TEXTURE_FORMAT_RGB_PVRTC_4BPPV1 ----- resource.TEXTURE_FORMAT_RGBA_PVRTC_2BPPV1 ----- resource.TEXTURE_FORMAT_RGBA_PVRTC_4BPPV1 ----- resource.TEXTURE_FORMAT_RGB_ETC1 ----- resource.TEXTURE_FORMAT_RGBA_ETC2 ----- resource.TEXTURE_FORMAT_RGBA_ASTC_4x4 ----- resource.TEXTURE_FORMAT_RGB_BC1 ----- resource.TEXTURE_FORMAT_RGBA_BC3 ----- resource.TEXTURE_FORMAT_R_BC4 ----- resource.TEXTURE_FORMAT_RG_BC5 ----- resource.TEXTURE_FORMAT_RGBA_BC7 ----- resource.TEXTURE_FORMAT_RGB16F ----- resource.TEXTURE_FORMAT_RGB32F ----- resource.TEXTURE_FORMAT_RGBA16F ----- resource.TEXTURE_FORMAT_RGBA32F ----- resource.TEXTURE_FORMAT_R16F ----- resource.TEXTURE_FORMAT_RG16F ----- resource.TEXTURE_FORMAT_R32F ----- resource.TEXTURE_FORMAT_RG32F ----You can test if the device supports these values by checking if a specific enum is nil or not: ----if resource.TEXTURE_FORMAT_RGBA16F ~= nil then ---- -- it is safe to use this format ----end ---- ---- ---- ----x ----number optional x offset of the texture (in pixels) ----y ----number optional y offset of the texture (in pixels) ----mipmap ----number optional mipmap to upload the data to ----compression_type ----number optional specify the compression type for the data in the buffer object that holds the texture data. Defaults to resource.COMPRESSION_TYPE_DEFAULT, i.e no compression. Supported values: ---- ---- ----COMPRESSION_TYPE_DEFAULT ----COMPRESSION_TYPE_BASIS_UASTC ---- ----@param buffer buffer_data The buffer of precreated pixel data ---- To update a cube map texture you need to pass in six times the amount of data via the buffer, since a cube map has six sides! -function resource.set_texture(path, table, buffer) end - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.texture(path) end - ----Constructor-like function with two purposes: ----Load the specified resource as part of loading the script ----Return a hash to the run-time version of the resource ---- This function can only be called within go.property function calls. ----@param path string|nil optional resource path string to the resource ----@return hash path a path hash to the binary version of the resource -function resource.tile_source(path) end - -return resource \ No newline at end of file diff --git a/annotations/defold/socket.lua b/annotations/defold/socket.lua deleted file mode 100644 index 73e15ec..0000000 --- a/annotations/defold/socket.lua +++ /dev/null @@ -1,173 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - LuaSocket API documentation - - LuaSocket is a Lua extension library that provides - support for the TCP and UDP transport layers. Defold provides the "socket" namespace in - runtime, which contain the core C functionality. Additional LuaSocket support modules for - SMTP, HTTP, FTP etc are not part of the core included, but can be easily added to a project - and used. - Note the included helper module "socket.lua" in "builtins/scripts/socket.lua". Require this - module to add some additional functions and shortcuts to the namespace: - require "builtins.scripts.socket" - LuaSocket is Copyright © 2004-2007 Diego Nehab. All rights reserved. - LuaSocket is free software, released under the MIT license (same license as the Lua core). ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.socket -socket = {} - ----This constant contains the maximum number of sockets that the select function can handle. -socket._SETSIZE = nil - ----This constant has a string describing the current LuaSocket version. -socket._VERSION = nil - ----This function is a shortcut that creates and returns a TCP client object connected to a remote ----address at a given port. Optionally, the user can also specify the local address and port to ----bind (locaddr and locport), or restrict the socket family to "inet" or "inet6". ----Without specifying family to connect, whether a tcp or tcp6 connection is created depends on ----your system configuration. ----@param address string the address to connect to. ----@param port number the port to connect to. ----@param locaddr string|nil optional local address to bind to. ----@param locport number|nil optional local port to bind to. ----@param family string|nil optional socket family to use, "inet" or "inet6". ----@return socket_client|nil tcp_client a new IPv6 TCP client object, or nil in case of error. ----@return string|nil error the error message, or nil if no error occurred. -function socket.connect(address, port, locaddr, locport, family) end - ----This function converts a host name to IPv4 or IPv6 address. ----The supplied address can be an IPv4 or IPv6 address or host name. ----The function returns a table with all information returned by the resolver: ----{ ---- [1] = { ---- family = family-name-1, ---- addr = address-1 ---- }, ---- ... ---- [n] = { ---- family = family-name-n, ---- addr = address-n ---- } ----} ----Here, family contains the string "inet" for IPv4 addresses, and "inet6" for IPv6 addresses. ----In case of error, the function returns nil followed by an error message. ----@param address string a hostname or an IPv4 or IPv6 address. ----@return table|nil resolved a table with all information returned by the resolver, or if an error occurs, nil. ----@return string|nil error the error message, or nil if no error occurred. -function socket.dns.getaddrinfo(address) end - ----Returns the standard host name for the machine as a string. ----@return string hostname the host name for the machine. -function socket.dns.gethostname() end - ----This function converts an address to host name. ----The supplied address can be an IPv4 or IPv6 address or host name. ----The function returns a table with all information returned by the resolver: ----{ ---- [1] = host-name-1, ---- ... ---- [n] = host-name-n, ----} ----@param address string a hostname or an IPv4 or IPv6 address. ----@return table|nil resolved a table with all information returned by the resolver, or if an error occurs, nil. ----@return string|nil error the error message, or nil if no error occurred. -function socket.dns.getnameinfo(address) end - ----This function converts from an IPv4 address to host name. ----The address can be an IPv4 address or a host name. ----@param address string an IPv4 address or host name. ----@return string|nil hostname the canonic host name of the given address, or nil in case of an error. ----@return table|string resolved a table with all information returned by the resolver, or if an error occurs, the error message string. -function socket.dns.tohostname(address) end - ----This function converts a host name to IPv4 address. ----The address can be an IP address or a host name. ----@param address string a hostname or an IP address. ----@return string|nil ip_address the first IP address found for the hostname, or nil in case of an error. ----@return table|string resolved a table with all information returned by the resolver, or if an error occurs, the error message string. -function socket.dns.toip(address) end - ----Returns the time in seconds, relative to the system epoch (Unix epoch time since January 1, 1970 (UTC) or Windows file time since January 1, 1601 (UTC)). ----You should use the values returned by this function for relative measurements only. ----@return number seconds the number of seconds elapsed. -function socket.gettime() end - ----This function creates and returns a clean try function that allows for cleanup before the exception is raised. ----The finalizer function will be called in protected mode (see protect). ----@param finalizer function a function that will be called before the try throws the exception. ----@return function try the customized try function. -function socket.newtry(finalizer) end - ----Converts a function that throws exceptions into a safe function. This function only catches exceptions thrown by try functions. It does not catch normal Lua errors. ---- Beware that if your function performs some illegal operation that raises an error, the protected function will catch the error and return it as a string. This is because try functions uses errors as the mechanism to throw exceptions. ----@param func function a function that calls a try function (or assert, or error) to throw exceptions. ----@return fun(function) safe_func an equivalent function that instead of throwing exceptions, returns nil followed by an error message. -function socket.protect(func) end - ----The function returns a list with the sockets ready for reading, a list with the sockets ready for writing and an error message. The error message is "timeout" if a timeout condition was met and nil otherwise. The returned tables are doubly keyed both by integers and also by the sockets themselves, to simplify the test if a specific socket has changed status. ----Recvt and sendt parameters can be empty tables or nil. Non-socket values (or values with non-numeric indices) in these arrays will be silently ignored. ----The returned tables are doubly keyed both by integers and also by the sockets themselves, to simplify the test if a specific socket has changed status. ---- This function can monitor a limited number of sockets, as defined by the constant socket._SETSIZE. This number may be as high as 1024 or as low as 64 by default, depending on the system. It is usually possible to change this at compile time. Invoking select with a larger number of sockets will raise an error. ---- A known bug in WinSock causes select to fail on non-blocking TCP sockets. The function may return a socket as writable even though the socket is not ready for sending. ---- Calling select with a server socket in the receive parameter before a call to accept does not guarantee accept will return immediately. Use the settimeout method or accept might block forever. ---- If you close a socket and pass it to select, it will be ignored. ----(Using select with non-socket objects: Any object that implements getfd and dirty can be used with select, allowing objects from other libraries to be used within a socket.select driven loop.) ----@param recvt table array with the sockets to test for characters available for reading. ----@param sendt table array with sockets that are watched to see if it is OK to immediately write on them. ----@param timeout number|nil the maximum amount of time (in seconds) to wait for a change in status. Nil, negative or omitted timeout value allows the function to block indefinitely. ----@return table sockets_r a list with the sockets ready for reading. ----@return table sockets_w a list with the sockets ready for writing. ----@return string|nil error an error message. "timeout" if a timeout condition was met, otherwise nil. -function socket.select(recvt, sendt, timeout) end - ----This function drops a number of arguments and returns the remaining. ----It is useful to avoid creation of dummy variables: ----D is the number of arguments to drop. Ret1 to retN are the arguments. ----The function returns retD+1 to retN. ----@param d number the number of arguments to drop. ----@param ret1 any|nil argument 1. ----@param ret2 any|nil argument 2. ----@param retN any|nil argument N. ----@return any|nil retD+1 argument D+1. ----@return any|nil retD+2 argument D+2. ----@return any|nil retN argument N. -function socket.skip(d, ret1, ret2, retN) end - ----Freezes the program execution during a given amount of time. ----@param time number the number of seconds to sleep for. -function socket.sleep(time) end - ----Creates and returns an IPv4 TCP master object. A master object can be transformed into a server object with the method listen (after a call to bind) or into a client object with the method connect. The only other method supported by a master object is the close method. ----@return socket_master|nil tcp_master a new IPv4 TCP master object, or nil in case of error. ----@return string|nil error the error message, or nil if no error occurred. -function socket.tcp() end - ----Creates and returns an IPv6 TCP master object. A master object can be transformed into a server object with the method listen (after a call to bind) or into a client object with the method connect. The only other method supported by a master object is the close method. ----Note: The TCP object returned will have the option "ipv6-v6only" set to true. ----@return socket_master|nil tcp_master a new IPv6 TCP master object, or nil in case of error. ----@return string|nil error the error message, or nil if no error occurred. -function socket.tcp6() end - ----Creates and returns an unconnected IPv4 UDP object. Unconnected objects support the sendto, receive, receivefrom, getoption, getsockname, setoption, settimeout, setpeername, setsockname, and close methods. The setpeername method is used to connect the object. ----@return socket_unconnected|nil udp_unconnected a new unconnected IPv4 UDP object, or nil in case of error. ----@return string|nil error the error message, or nil if no error occurred. -function socket.udp() end - ----Creates and returns an unconnected IPv6 UDP object. Unconnected objects support the sendto, receive, receivefrom, getoption, getsockname, setoption, settimeout, setpeername, setsockname, and close methods. The setpeername method is used to connect the object. ----Note: The UDP object returned will have the option "ipv6-v6only" set to true. ----@return socket_unconnected|nil udp_unconnected a new unconnected IPv6 UDP object, or nil in case of error. ----@return string|nil error the error message, or nil if no error occurred. -function socket.udp6() end - - - -return socket \ No newline at end of file diff --git a/annotations/defold/sound.lua b/annotations/defold/sound.lua deleted file mode 100644 index 2c201b8..0000000 --- a/annotations/defold/sound.lua +++ /dev/null @@ -1,160 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Sound API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.sound -sound = {} - ----Get mixer group gain ---- Note that gain is in linear scale, between 0 and 1. ----To get the dB value from the gain, use the formula 20 * log(gain). ----Inversely, to find the linear value from a dB value, use the formula ----10db/20. ----@param group string|hash group name ----@return number gain gain in linear scale -function sound.get_group_gain(group) end - ----Get a mixer group name as a string. ---- This function is to be used for debugging and ----development tooling only. The function does a reverse hash lookup, which does not ----return a proper string value when the game is built in release mode. ----@param group string|hash group name ----@return string name group name -function sound.get_group_name(group) end - ----Get a table of all mixer group names (hashes). ----@return hash[] groups table of mixer group names -function sound.get_groups() end - ----Get peak value from mixer group. ---- Note that gain is in linear scale, between 0 and 1. ----To get the dB value from the gain, use the formula 20 * log(gain). ----Inversely, to find the linear value from a dB value, use the formula ----10db/20. ----Also note that the returned value might be an approximation and in particular ----the effective window might be larger than specified. ----@param group string|hash group name ----@param window number window length in seconds ----@return number peak_l peak value for left channel ----@return number peak_r peak value for right channel -function sound.get_peak(group, window) end - ----Get RMS (Root Mean Square) value from mixer group. This value is the ----square root of the mean (average) value of the squared function of ----the instantaneous values. ----For instance: for a sinewave signal with a peak gain of -1.94 dB (0.8 linear), ----the RMS is 0.8 × 1/sqrt(2) which is about 0.566. ---- Note the returned value might be an approximation and in particular ----the effective window might be larger than specified. ----@param group string|hash group name ----@param window number window length in seconds ----@return number rms_l RMS value for left channel ----@return number rms_r RMS value for right channel -function sound.get_rms(group, window) end - ----Checks if background music is playing, e.g. from iTunes. ---- On non mobile platforms, ----this function always return false. ---- On Android you can only get a correct reading ----of this state if your game is not playing any sounds itself. This is a limitation ----in the Android SDK. If your game is playing any sounds, even with a gain of zero, this ----function will return false. ----The best time to call this function is: ----In the init function of your main collection script before any sounds are triggered ----In a window listener callback when the window.WINDOW_EVENT_FOCUS_GAINED event is received ----Both those times will give you a correct reading of the state even when your application is ----swapped out and in while playing sounds and it works equally well on Android and iOS. ----@return boolean playing true if music is playing, otherwise false. -function sound.is_music_playing() end - ----Checks if a phone call is active. If there is an active phone call all ----other sounds will be muted until the phone call is finished. ---- On non mobile platforms, ----this function always return false. ----@return boolean call_active true if there is an active phone call, false otherwise. -function sound.is_phone_call_active() end - ----Pause all active voices ----@param url string|hash|url the sound that should pause ----@param pause bool true if the sound should pause -function sound.pause(url, pause) end - ----Make the sound component play its sound. Multiple voices are supported. The limit is set to 32 voices per sound component. ---- Note that gain is in linear scale, between 0 and 1. ----To get the dB value from the gain, use the formula 20 * log(gain). ----Inversely, to find the linear value from a dB value, use the formula ----10db/20. ---- A sound will continue to play even if the game object the sound component belonged to is deleted. You can call sound.stop() to stop the sound. ----@param url string|hash|url the sound that should play ----@param play_properties { delay:number|nil, gain:number|nil, pan:number|nil, speed:number|nil }|nil ----optional table with properties: ----delay ----number delay in seconds before the sound starts playing, default is 0. ----gain ----number sound gain between 0 and 1, default is 1. The final gain of the sound will be a combination of this gain, the group gain and the master gain. ----pan ----number sound pan between -1 and 1, default is 0. The final pan of the sound will be an addition of this pan and the sound pan. ----speed ----number sound speed where 1.0 is normal speed, 0.5 is half speed and 2.0 is double speed. The final speed of the sound will be a multiplication of this speed and the sound speed. ---- ----@param complete_function fun(self, message_id, message, sender)|nil function to call when the sound has finished playing or stopped manually via sound.stop. ---- ----self ----object The current object. ----message_id ----hash The name of the completion message, which can be either "sound_done" if the sound has finished playing, or "sound_stopped" if it was stopped manually. ----message ----table Information about the completion: ---- ---- ----number play_id - the sequential play identifier that was given by the sound.play function. ---- ---- ----sender ----url The invoker of the callback: the sound component. ---- ----@return number play_id The identifier for the sound voice -function sound.play(url, play_properties, complete_function) end - ----Set gain on all active playing voices of a sound. ---- Note that gain is in linear scale, between 0 and 1. ----To get the dB value from the gain, use the formula 20 * log(gain). ----Inversely, to find the linear value from a dB value, use the formula ----10db/20. ----@param url string|hash|url the sound to set the gain of ----@param gain number|nil sound gain between 0 and 1. The final gain of the sound will be a combination of this gain, the group gain and the master gain. -function sound.set_gain(url, gain) end - ----Set mixer group gain ---- Note that gain is in linear scale, between 0 and 1. ----To get the dB value from the gain, use the formula 20 * log(gain). ----Inversely, to find the linear value from a dB value, use the formula ----10db/20. ----@param group string|hash group name ----@param gain number gain in linear scale -function sound.set_group_gain(group, gain) end - ----Set panning on all active playing voices of a sound. ----The valid range is from -1.0 to 1.0, representing -45 degrees left, to +45 degrees right. ----@param url string|hash|url the sound to set the panning value to ----@param pan number|nil sound panning between -1.0 and 1.0 -function sound.set_pan(url, pan) end - ----Stop playing all active voices or just one voice if play_id provided ----@param url string|hash|url the sound component that should stop ----@param stop_properties { play_id:number }|nil ----optional table with properties: ----play_id ----number the sequential play identifier that should be stopped (was given by the sound.play() function) ---- -function sound.stop(url, stop_properties) end - -return sound \ No newline at end of file diff --git a/annotations/defold/sprite.lua b/annotations/defold/sprite.lua deleted file mode 100644 index f0d8009..0000000 --- a/annotations/defold/sprite.lua +++ /dev/null @@ -1,62 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Sprite API documentation ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.sprite -sprite = {} - ----Play an animation on a sprite component from its tile set ----An optional completion callback function can be provided that will be called when ----the animation has completed playing. If no function is provided, ----a animation_done message is sent to the script that started the animation. ----@param url string|hash|url the sprite that should play the animation ----@param id string|hash hashed id of the animation to play ----@param complete_function fun(self, message_id, message, sender)|nil function to call when the animation has completed. ---- ----self ----object The current object. ----message_id ----hash The name of the completion message, "animation_done". ----message ----table Information about the completion: ---- ---- ----number current_tile - the current tile of the sprite. ----hash id - id of the animation that was completed. ---- ---- ----sender ----url The invoker of the callback: the sprite component. ---- ----@param play_properties table|nil optional table with properties: ---- ----offset ----number the normalized initial value of the animation cursor when the animation starts playing. ----playback_rate ----number the rate with which the animation will be played. Must be positive. ---- -function sprite.play_flipbook(url, id, complete_function, play_properties) end - ----Sets horizontal flipping of the provided sprite's animations. ----The sprite is identified by its URL. ----If the currently playing animation is flipped by default, flipping it again will make it appear like the original texture. ----@param url string|hash|url the sprite that should flip its animations ----@param flip boolean true if the sprite should flip its animations, false if not -function sprite.set_hflip(url, flip) end - ----Sets vertical flipping of the provided sprite's animations. ----The sprite is identified by its URL. ----If the currently playing animation is flipped by default, flipping it again will make it appear like the original texture. ----@param url string|hash|url the sprite that should flip its animations ----@param flip boolean true if the sprite should flip its animations, false if not -function sprite.set_vflip(url, flip) end - -return sprite \ No newline at end of file diff --git a/annotations/defold/sys.lua b/annotations/defold/sys.lua deleted file mode 100644 index f6dfed4..0000000 --- a/annotations/defold/sys.lua +++ /dev/null @@ -1,314 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - System API documentation - - Functions and messages for using system resources, controlling the engine, - error handling and debugging. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.sys -sys = {} - ----network connected through other, non cellular, connection -sys.NETWORK_CONNECTED = nil - ----network connected through mobile cellular -sys.NETWORK_CONNECTED_CELLULAR = nil - ----no network connection found -sys.NETWORK_DISCONNECTED = nil - ----an asyncronous request is unable to read the resource -sys.REQUEST_STATUS_ERROR_IO_ERROR = nil - ----an asyncronous request is unable to locate the resource -sys.REQUEST_STATUS_ERROR_NOT_FOUND = nil - ----an asyncronous request has finished successfully -sys.REQUEST_STATUS_FINISHED = nil - ----deserializes buffer into a lua table ----@param buffer string buffer to deserialize from ----@return table table lua table with deserialized data -function sys.deserialize(buffer) end - ----Check if a path exists ----Good for checking if a file exists before loading a large file ----@param path string path to check ----@return bool result true if the path exists, false otherwise -function sys.exists(path) end - ----Terminates the game application and reports the specified code to the OS. ----@param code number exit code to report to the OS, 0 means clean exit -function sys.exit(code) end - ----Returns a table with application information for the requested app. ---- On iOS, the app_string is an url scheme for the app that is queried. Your ----game needs to list the schemes that are queried in an LSApplicationQueriesSchemes array ----in a custom "Info.plist". ---- On Android, the app_string is the package identifier for the app. ----@param app_string string platform specific string with application package or query, see above for details. ----@return { installed:boolean } app_info table with application information in the following fields: ---- ----installed ----boolean true if the application is installed, false otherwise. ---- -function sys.get_application_info(app_string) end - ----The path from which the application is run. ----@return string path path to application executable -function sys.get_application_path() end - ----Get integer config value from the game.project configuration file with optional default value ----@param key string key to get value for. The syntax is SECTION.KEY ----@param default_value integer|nil (optional) default value to return if the value does not exist ----@return integer value config value as an integer. default_value if the config key does not exist. 0 if no default value was supplied. -function sys.get_config_int(key, default_value) end - ----Get number config value from the game.project configuration file with optional default value ----@param key string key to get value for. The syntax is SECTION.KEY ----@param default_value number|nil (optional) default value to return if the value does not exist ----@return number value config value as an number. default_value if the config key does not exist. 0 if no default value was supplied. -function sys.get_config_number(key, default_value) end - ----Get string config value from the game.project configuration file with optional default value ----@param key string key to get value for. The syntax is SECTION.KEY ----@param default_value string|nil (optional) default value to return if the value does not exist ----@return string value config value as a string. default_value if the config key does not exist. nil if no default value was supplied. -function sys.get_config_string(key, default_value) end - ---- Returns the current network connectivity status ----on mobile platforms. ----On desktop, this function always return sys.NETWORK_CONNECTED. ----@return constant status network connectivity status: ---- ----sys.NETWORK_DISCONNECTED (no network connection is found) ----sys.NETWORK_CONNECTED_CELLULAR (connected through mobile cellular) ----sys.NETWORK_CONNECTED (otherwise, Wifi) ---- -function sys.get_connectivity() end - ----Returns a table with engine information. ----@return { version:string, version_sha1:string, is_debug:boolean } engine_info table with engine information in the following fields: ---- ----version ----string The current Defold engine version, i.e. "1.2.96" ----version_sha1 ----string The SHA1 for the current engine build, i.e. "0060183cce2e29dbd09c85ece83cbb72068ee050" ----is_debug ----boolean If the engine is a debug or release version ---- -function sys.get_engine_info() end - ----Create a path to the host device for unit testing ----Useful for saving logs etc during development ----@param filename string file to read from ----@return string host_path the path prefixed with the proper host mount -function sys.get_host_path(filename) end - ----Returns an array of tables with information on network interfaces. ----@return { name:string, address:string|nil, mac:string|nil, up:boolean, running:boolean } ifaddrs an array of tables. Each table entry contain the following fields: ---- ----name ----string Interface name ----address ----string IP address. might be nil if not available. ----mac ----string Hardware MAC address. might be nil if not available. ----up ----boolean true if the interface is up (available to transmit and receive data), false otherwise. ----running ----boolean true if the interface is running, false otherwise. ---- -function sys.get_ifaddrs() end - ----The save-file path is operating system specific and is typically located under the user's home directory. ----@param application_id string user defined id of the application, which helps define the location of the save-file ----@param file_name string file-name to get path for ----@return string path path to save-file -function sys.get_save_file(application_id, file_name) end - ----Returns a table with system information. ----@param options { ignore_secure:boolean|nil }|nil optional options table ----- ignore_secure boolean this flag ignores values might be secured by OS e.g. device_ident ----@return { device_model:string|nil, manufacturer:string|nil, system_name:string, system_version:string, api_version:string, language:string, device_language:string, territory:string, gmt_offset:number, device_ident:string|nil, user_agent:string|nil } sys_info table with system information in the following fields: ---- ----device_model ----string Only available on iOS and Android. ----manufacturer ----string Only available on iOS and Android. ----system_name ----string The system name: "Darwin", "Linux", "Windows", "HTML5", "Android" or "iPhone OS" ----system_version ----string The system OS version. ----api_version ----string The API version on the system. ----language ----string Two character ISO-639 format, i.e. "en". ----device_language ----string Two character ISO-639 format (i.e. "sr") and, if applicable, followed by a dash (-) and an ISO 15924 script code (i.e. "sr-Cyrl" or "sr-Latn"). Reflects the device preferred language. ----territory ----string Two character ISO-3166 format, i.e. "US". ----gmt_offset ----number The current offset from GMT (Greenwich Mean Time), in minutes. ----device_ident ----string This value secured by OS. "identifierForVendor" on iOS. "android_id" on Android. On Android, you need to add READ_PHONE_STATE permission to be able to get this data. We don't use this permission in Defold. ----user_agent ----string The HTTP user agent, i.e. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8" ---- -function sys.get_sys_info(options) end - ----If the file exists, it must have been created by sys.save to be loaded. ----@param filename string file to read from ----@return table loaded lua table, which is empty if the file could not be found -function sys.load(filename) end - ----The sys.load_buffer function will first try to load the resource ----from any of the mounted resource locations and return the data if ----any matching entries found. If not, the path will be tried ----as is from the primary disk on the device. ----In order for the engine to include custom resources in the build process, you need ----to specify them in the "custom_resources" key in your "game.project" settings file. ----You can specify single resource files or directories. If a directory is included ----in the resource list, all files and directories in that directory is recursively ----included: ----For example "main/data/,assets/level_data.json". ----@param path string the path to load the buffer from ----@return buffer_data buffer the buffer with data -function sys.load_buffer(path) end - ----The sys.load_buffer function will first try to load the resource ----from any of the mounted resource locations and return the data if ----any matching entries found. If not, the path will be tried ----as is from the primary disk on the device. ----In order for the engine to include custom resources in the build process, you need ----to specify them in the "custom_resources" key in your "game.project" settings file. ----You can specify single resource files or directories. If a directory is included ----in the resource list, all files and directories in that directory is recursively ----included: ----For example "main/data/,assets/level_data.json". ----Note that issuing multiple requests of the same resource will yield ----individual buffers per request. There is no implic caching of the buffers ----based on request path. ----@param path string the path to load the buffer from ----@param status_callback fun(self, request_id, result) A status callback that will be invoked when a request has been handled, or an error occured. The result is a table containing: ---- ----status ----number The status of the request, supported values are: ---- ---- ----resource.REQUEST_STATUS_FINISHED ----resource.REQUEST_STATUS_ERROR_IO_ERROR ----resource.REQUEST_STATUS_ERROR_NOT_FOUND ---- ---- ----buffer ----buffer If the request was successfull, this will contain the request payload in a buffer object, and nil otherwise. Make sure to check the status before doing anything with the buffer value! ---- ----@return resource_handle handle a handle to the request -function sys.load_buffer_async(path, status_callback) end - ----Loads a custom resource. Specify the full filename of the resource that you want ----to load. When loaded, the file data is returned as a string. ----If loading fails, the function returns nil plus the error message. ----In order for the engine to include custom resources in the build process, you need ----to specify them in the "custom_resources" key in your "game.project" settings file. ----You can specify single resource files or directories. If a directory is included ----in the resource list, all files and directories in that directory is recursively ----included: ----For example "main/data/,assets/level_data.json". ----@param filename string resource to load, full path ----@return string|nil data loaded data, or nil if the resource could not be loaded ----@return string|nil error the error message, or nil if no error occurred -function sys.load_resource(filename) end - ----Open URL in default application, typically a browser ----@param url string url to open ----@param attributes { target:string|nil, name:string|nil }|nil table with attributes ----target ----- string : Optional. Specifies the target attribute or the name of the window. The following values are supported: ----- _self - (default value) URL replaces the current page. ----- _blank - URL is loaded into a new window, or tab. ----- _parent - URL is loaded into the parent frame. ----- _top - URL replaces any framesets that may be loaded. ----- name - The name of the window (Note: the name does not specify the title of the new window). ----@return boolean success a boolean indicating if the url could be opened or not -function sys.open_url(url, attributes) end - ----Reboots the game engine with a specified set of arguments. ----Arguments will be translated into command line arguments. Calling reboot ----function is equivalent to starting the engine with the same arguments. ----On startup the engine reads configuration from "game.project" in the ----project root. ----@param arg1 string|nil argument 1 ----@param arg2 string|nil argument 2 ----@param arg3 string|nil argument 3 ----@param arg4 string|nil argument 4 ----@param arg5 string|nil argument 5 ----@param arg6 string|nil argument 6 -function sys.reboot(arg1, arg2, arg3, arg4, arg5, arg6) end - ----The table can later be loaded by sys.load. ----Use sys.get_save_file to obtain a valid location for the file. ----Internally, this function uses a workspace buffer sized output file sized 512kb. ----This size reflects the output file size which must not exceed this limit. ----Additionally, the total number of rows that any one table may contain is limited to 65536 ----(i.e. a 16 bit range). When tables are used to represent arrays, the values of ----keys are permitted to fall within a 32 bit range, supporting sparse arrays, however ----the limit on the total number of rows remains in effect. ----@param filename string file to write to ----@param table table lua table to save ----@return boolean success a boolean indicating if the table could be saved or not -function sys.save(filename, table) end - ----The buffer can later deserialized by sys.deserialize. ----This method has all the same limitations as sys.save. ----@param table table lua table to serialize ----@return string buffer serialized data buffer -function sys.serialize(table) end - ----Sets the host that is used to check for network connectivity against. ----@param host string hostname to check against -function sys.set_connectivity_host(host) end - ----Set the Lua error handler function. ----The error handler is a function which is called whenever a lua runtime error occurs. ----@param error_handler fun(source, message, traceback) the function to be called on error ---- ----source ----string The runtime context of the error. Currently, this is always "lua". ----message ----string The source file, line number and error message. ----traceback ----string The stack traceback. ---- -function sys.set_error_handler(error_handler) end - ----Set game update-frequency (frame cap). This option is equivalent to display.update_frequency in ----the "game.project" settings but set in run-time. If Vsync checked in "game.project", the rate will ----be clamped to a swap interval that matches any detected main monitor refresh rate. If Vsync is ----unchecked the engine will try to respect the rate in software using timers. There is no ----guarantee that the frame cap will be achieved depending on platform specifics and hardware settings. ----@param frequency number target frequency. 60 for 60 fps -function sys.set_update_frequency(frequency) end - ----Set the vsync swap interval. The interval with which to swap the front and back buffers ----in sync with vertical blanks (v-blank), the hardware event where the screen image is updated ----with data from the front buffer. A value of 1 swaps the buffers at every v-blank, a value of ----2 swaps the buffers every other v-blank and so on. A value of 0 disables waiting for v-blank ----before swapping the buffers. Default value is 1. ----When setting the swap interval to 0 and having vsync disabled in ----"game.project", the engine will try to respect the set frame cap value from ----"game.project" in software instead. ----This setting may be overridden by driver settings. ----@param swap_interval number target swap interval. -function sys.set_vsync_swap_interval(swap_interval) end - -return sys \ No newline at end of file diff --git a/annotations/defold/tilemap.lua b/annotations/defold/tilemap.lua deleted file mode 100644 index 79b3a19..0000000 --- a/annotations/defold/tilemap.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Tilemap API documentation - - Functions and messages used to manipulate tile map components. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.tilemap -tilemap = {} - ----flip tile horizontally -tilemap.H_FLIP = nil - ----rotate tile 180 degrees clockwise -tilemap.ROTATE_180 = nil - ----rotate tile 270 degrees clockwise -tilemap.ROTATE_270 = nil - ----rotate tile 90 degrees clockwise -tilemap.ROTATE_90 = nil - ----flip tile vertically -tilemap.V_FLIP = nil - ----Get the bounds for a tile map. This function returns multiple values: ----The lower left corner index x and y coordinates (1-indexed), ----the tile map width and the tile map height. ----The resulting values take all tile map layers into account, meaning that ----the bounds are calculated as if all layers were collapsed into one. ----@param url string|hash|url the tile map ----@return number x x coordinate of the bottom left corner ----@return number y y coordinate of the bottom left corner ----@return number w number of columns (width) in the tile map ----@return number h number of rows (height) in the tile map -function tilemap.get_bounds(url) end - ----Get the tile set at the specified position in the tilemap. ----The position is identified by the tile index starting at origin ----with index 1, 1. (see tilemap.set_tile()) ----Which tile map and layer to query is identified by the URL and the ----layer name parameters. ----@param url string|hash|url the tile map ----@param layer string|hash name of the layer for the tile ----@param x number x-coordinate of the tile ----@param y number y-coordinate of the tile ----@return number tile index of the tile -function tilemap.get_tile(url, layer, x, y) end - ----Replace a tile in a tile map with a new tile. ----The coordinates of the tiles are indexed so that the "first" tile just ----above and to the right of origin has coordinates 1,1. ----Tiles to the left of and below origin are indexed 0, -1, -2 and so forth. ----+-------+-------+------+------+ ----| 0,3 | 1,3 | 2,3 | 3,3 | ----+-------+-------+------+------+ ----| 0,2 | 1,2 | 2,2 | 3,2 | ----+-------+-------+------+------+ ----| 0,1 | 1,1 | 2,1 | 3,1 | ----+-------O-------+------+------+ ----| 0,0 | 1,0 | 2,0 | 3,0 | ----+-------+-------+------+------+ ----The coordinates must be within the bounds of the tile map as it were created. ----That is, it is not possible to extend the size of a tile map by setting tiles outside the edges. ----To clear a tile, set the tile to number 0. Which tile map and layer to manipulate is identified by the URL and the layer name parameters. ----Transform bitmask is arithmetic sum of one or both FLIP constants (tilemap.H_FLIP, tilemap.V_FLIP) and/or one of ROTATION constants ----(tilemap.ROTATE_90, tilemap.ROTATE_180, tilemap.ROTATE_270). ----Flip always applies before rotation (clockwise). ----@param url string|hash|url the tile map ----@param layer string|hash name of the layer for the tile ----@param x number x-coordinate of the tile ----@param y number y-coordinate of the tile ----@param tile number index of new tile to set. 0 resets the cell ----@param transform_bitmask number|nil optional flip and/or rotation should be applied to the tile -function tilemap.set_tile(url, layer, x, y, tile, transform_bitmask) end - ----Sets the visibility of the tilemap layer ----@param url string|hash|url the tile map ----@param layer string|hash name of the layer for the tile ----@param visible boolean should the layer be visible -function tilemap.set_visible(url, layer, visible) end - -return tilemap \ No newline at end of file diff --git a/annotations/defold/timer.lua b/annotations/defold/timer.lua deleted file mode 100644 index 3921aac..0000000 --- a/annotations/defold/timer.lua +++ /dev/null @@ -1,68 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Timer API documentation - - Timers allow you to set a delay and a callback to be called when the timer completes. - The timers created with this API are updated with the collection timer where they - are created. If you pause or speed up the collection (using set_time_step) it will - also affect the new timer. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.timer -timer = {} - ----Indicates an invalid timer handle -timer.INVALID_TIMER_HANDLE = nil - ----You may cancel a timer from inside a timer callback. ----Cancelling a timer that is already executed or cancelled is safe. ----@param handle hash the timer handle returned by timer.delay() ----@return boolean true if the timer was active, false if the timer is already cancelled / complete -function timer.cancel(handle) end - ----Adds a timer and returns a unique handle. ----You may create more timers from inside a timer callback. ----Using a delay of 0 will result in a timer that triggers at the next frame just before ----script update functions. ----If you want a timer that triggers on each frame, set delay to 0.0f and repeat to true. ----Timers created within a script will automatically die when the script is deleted. ----@param delay number time interval in seconds ----@param repeating boolean true = repeat timer until cancel, false = one-shot timer ----@param callback fun(self, handle, time_elapsed) timer callback function ---- ----self ----object The current object ----handle ----number The handle of the timer ----time_elapsed ----number The elapsed time - on first trigger it is time since timer.delay call, otherwise time since last trigger ---- ----@return hash handle identifier for the create timer, returns timer.INVALID_TIMER_HANDLE if the timer can not be created -function timer.delay(delay, repeating, callback) end - ----Get information about timer. ----@param handle hash the timer handle returned by timer.delay() ----@return { time_remaining:number, delay:number, repeating:boolean }|nil data table or nil if timer is cancelled/completed. table with data in the following fields: ---- ----time_remaining ----number Time remaining until the next time a timer.delay() fires. ----delay ----number Time interval. ----repeating ----boolean true = repeat timer until cancel, false = one-shot timer. ---- -function timer.get_info(handle) end - ----Manual triggering a callback for a timer. ----@param handle hash the timer handle returned by timer.delay() ----@return boolean true if the timer was active, false if the timer is already cancelled / complete -function timer.trigger(handle) end - -return timer \ No newline at end of file diff --git a/annotations/defold/types.lua b/annotations/defold/types.lua deleted file mode 100644 index 0db72cb..0000000 --- a/annotations/defold/types.lua +++ /dev/null @@ -1,111 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Known classes and aliases used in the Defold API ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class matrix4 ----@field c0 vector4 ----@field c1 vector4 ----@field c2 vector4 ----@field c3 vector4 ----@field m00 number ----@field m01 number ----@field m02 number ----@field m03 number ----@field m10 number ----@field m11 number ----@field m12 number ----@field m13 number ----@field m20 number ----@field m21 number ----@field m22 number ----@field m23 number ----@field m30 number ----@field m31 number ----@field m32 number ----@field m33 number - ----@class physics.raycast_response ----@field fraction number ----@field group hash ----@field id hash ----@field normal vector3 ----@field position vector3 ----@field request_id number - ----@class resource.animation ----@field flip_horizontal boolean ----@field flip_vertical boolean ----@field fps integer ----@field frame_end integer ----@field frame_start integer ----@field height integer ----@field id string ----@field playback constant ----@field width integer - ----@class resource.atlas ----@field animations resource.animation[] ----@field geometries resource.geometry[] ----@field texture string|hash - ----@class resource.geometry ----@field id string ----@field indices number[] ----@field uvs number[] ----@field vertices number[] - ----@class socket.dns -socket.dns = {} - ----@class url ----@field fragment hash ----@field path hash ----@field socket hash - ----@class vector3 ----@field x number ----@field y number ----@field z number ----@operator add(vector3): vector3 ----@operator mul(number): vector3 ----@operator sub(vector3): vector3 ----@operator unm: vector3 - ----@class vector4 ----@field w number ----@field x number ----@field y number ----@field z number ----@operator add(vector4): vector4 ----@operator mul(number): vector4 ----@operator sub(vector4): vector4 ----@operator unm: vector4 - ----@alias array table ----@alias b2Body userdata ----@alias b2BodyType number ----@alias b2World userdata ----@alias bool boolean ----@alias buffer_data userdata ----@alias buffer_stream userdata ----@alias constant userdata ----@alias constant_buffer userdata ----@alias float number ----@alias hash userdata ----@alias node userdata ----@alias quaternion vector4 ----@alias render_predicate userdata ----@alias render_target userdata ----@alias resource_data userdata ----@alias resource_handle number|userdata ----@alias socket_client userdata ----@alias socket_master userdata ----@alias socket_unconnected userdata \ No newline at end of file diff --git a/annotations/defold/vmath.lua b/annotations/defold/vmath.lua deleted file mode 100644 index 1134fd4..0000000 --- a/annotations/defold/vmath.lua +++ /dev/null @@ -1,404 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Vector math API documentation - - Functions for mathematical operations on vectors, matrices and quaternions. - The vector types (vmath.vector3 and vmath.vector4) supports addition and subtraction - with vectors of the same type. Vectors can be negated and multiplied (scaled) or divided by numbers. - The quaternion type (vmath.quat) supports multiplication with other quaternions. - The matrix type (vmath.matrix4) can be multiplied with numbers, other matrices - and vmath.vector4 values. - All types performs equality comparison by each component value. - The following components are available for the various types: - vector3 - x, y and z. Example: v.y - vector4 - x, y, z, and w. Example: v.w - quaternion - x, y, z, and w. Example: q.w - matrix4 - m00 to m33 where the first number is the row (starting from 0) and the second - number is the column. Columns can be accessed with c0 to c3, returning a vector4. - Example: m.m21 which is equal to m.c1.z - vector - indexed by number 1 to the vector length. Example: v[3] ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.vmath -vmath = {} - ----Calculates the conjugate of a quaternion. The result is a ----quaternion with the same magnitudes but with the sign of ----the imaginary (vector) parts changed: ----q* = [w, -v] ----@param q1 quaternion quaternion of which to calculate the conjugate ----@return quaternion q the conjugate -function vmath.conj(q1) end - ----Given two linearly independent vectors P and Q, the cross product, ----P × Q, is a vector that is perpendicular to both P and Q and ----therefore normal to the plane containing them. ----If the two vectors have the same direction (or have the exact ----opposite direction from one another, i.e. are not linearly independent) ----or if either one has zero length, then their cross product is zero. ----@param v1 vector3 first vector ----@param v2 vector3 second vector ----@return vector3 v a new vector representing the cross product -function vmath.cross(v1, v2) end - ----The returned value is a scalar defined as: ----P ⋅ Q = |P| |Q| cos θ ----where θ is the angle between the vectors P and Q. ----If the dot product is positive then the angle between the vectors is below 90 degrees. ----If the dot product is zero the vectors are perpendicular (at right-angles to each other). ----If the dot product is negative then the angle between the vectors is more than 90 degrees. ----@param v1 vector3|vector4 first vector ----@param v2 vector3|vector4 second vector ----@return number n dot product -function vmath.dot(v1, v2) end - ----The resulting matrix is the inverse of the supplied matrix. ---- For ortho-normal matrices, e.g. regular object transformation, ----use vmath.ortho_inv() instead. ----The specialized inverse for ortho-normalized matrices is much faster ----than the general inverse. ----@param m1 matrix4 matrix to invert ----@return matrix4 m inverse of the supplied matrix -function vmath.inv(m1) end - ----Returns the length of the supplied vector or quaternion. ----If you are comparing the lengths of vectors or quaternions, you should compare ----the length squared instead as it is slightly more efficient to calculate ----(it eliminates a square root calculation). ----@param v vector3|vector4|quaternion value of which to calculate the length ----@return number n length -function vmath.length(v) end - ----Returns the squared length of the supplied vector or quaternion. ----@param v vector3|vector4|quaternion value of which to calculate the squared length ----@return number n squared length -function vmath.length_sqr(v) end - ----Linearly interpolate between two quaternions. Linear ----interpolation of rotations are only useful for small ----rotations. For interpolations of arbitrary rotations, ----vmath.slerp yields much better results. ---- The function does not clamp t between 0 and 1. ----@param t number interpolation parameter, 0-1 ----@param q1 quaternion quaternion to lerp from ----@param q2 quaternion quaternion to lerp to ----@return quaternion q the lerped quaternion -function vmath.lerp(t, q1, q2) end - ----Linearly interpolate between two vectors. The function ----treats the vectors as positions and interpolates between ----the positions in a straight line. Lerp is useful to describe ----transitions from one place to another over time. ---- The function does not clamp t between 0 and 1. ----@param t number interpolation parameter, 0-1 ----@param v1 vector3|vector4 vector to lerp from ----@param v2 vector3|vector4 vector to lerp to ----@return vector3|vector4 v the lerped vector -function vmath.lerp(t, v1, v2) end - ----Linearly interpolate between two values. Lerp is useful ----to describe transitions from one value to another over time. ---- The function does not clamp t between 0 and 1. ----@param t number interpolation parameter, 0-1 ----@param n1 number number to lerp from ----@param n2 number number to lerp to ----@return number n the lerped number -function vmath.lerp(t, n1, n2) end - ----The resulting identity matrix describes a transform with ----no translation or rotation. ----@return matrix4 m identity matrix -function vmath.matrix4() end - ----Creates a new matrix with all components set to the ----corresponding values from the supplied matrix. I.e. ----the function creates a copy of the given matrix. ----@param m1 matrix4 existing matrix ----@return matrix4 m matrix which is a copy of the specified matrix -function vmath.matrix4(m1) end - ----The resulting matrix describes a rotation around the axis by the specified angle. ----@param v vector3 axis ----@param angle number angle in radians ----@return matrix4 m matrix represented by axis and angle -function vmath.matrix4_axis_angle(v, angle) end - ----The resulting matrix describes the same rotation as the quaternion, but does not have any translation (also like the quaternion). ----@param q quaternion quaternion to create matrix from ----@return matrix4 m matrix represented by quaternion -function vmath.matrix4_from_quat(q) end - ----Constructs a frustum matrix from the given values. The left, right, ----top and bottom coordinates of the view cone are expressed as distances ----from the center of the near clipping plane. The near and far coordinates ----are expressed as distances from the tip of the view frustum cone. ----@param left number coordinate for left clipping plane ----@param right number coordinate for right clipping plane ----@param bottom number coordinate for bottom clipping plane ----@param top number coordinate for top clipping plane ----@param near number coordinate for near clipping plane ----@param far number coordinate for far clipping plane ----@return matrix4 m matrix representing the frustum -function vmath.matrix4_frustum(left, right, bottom, top, near, far) end - ----The resulting matrix is created from the supplied look-at parameters. ----This is useful for constructing a view matrix for a camera or ----rendering in general. ----@param eye vector3 eye position ----@param look_at vector3 look-at position ----@param up vector3 up vector ----@return matrix4 m look-at matrix -function vmath.matrix4_look_at(eye, look_at, up) end - ----Creates an orthographic projection matrix. ----This is useful to construct a projection matrix for a camera or rendering in general. ----@param left number coordinate for left clipping plane ----@param right number coordinate for right clipping plane ----@param bottom number coordinate for bottom clipping plane ----@param top number coordinate for top clipping plane ----@param near number coordinate for near clipping plane ----@param far number coordinate for far clipping plane ----@return matrix4 m orthographic projection matrix -function vmath.matrix4_orthographic(left, right, bottom, top, near, far) end - ----Creates a perspective projection matrix. ----This is useful to construct a projection matrix for a camera or rendering in general. ----@param fov number angle of the full vertical field of view in radians ----@param aspect number aspect ratio ----@param near number coordinate for near clipping plane ----@param far number coordinate for far clipping plane ----@return matrix4 m perspective projection matrix -function vmath.matrix4_perspective(fov, aspect, near, far) end - ----The resulting matrix describes a rotation around the x-axis ----by the specified angle. ----@param angle number angle in radians around x-axis ----@return matrix4 m matrix from rotation around x-axis -function vmath.matrix4_rotation_x(angle) end - ----The resulting matrix describes a rotation around the y-axis ----by the specified angle. ----@param angle number angle in radians around y-axis ----@return matrix4 m matrix from rotation around y-axis -function vmath.matrix4_rotation_y(angle) end - ----The resulting matrix describes a rotation around the z-axis ----by the specified angle. ----@param angle number angle in radians around z-axis ----@return matrix4 m matrix from rotation around z-axis -function vmath.matrix4_rotation_z(angle) end - ----The resulting matrix describes a translation of a point ----in euclidean space. ----@param position vector3|vector4 position vector to create matrix from ----@return matrix4 m matrix from the supplied position vector -function vmath.matrix4_translation(position) end - ----Performs an element wise multiplication between two vectors of the same type ----The returned value is a vector defined as (e.g. for a vector3): ----v = vmath.mul_per_elem(a, b) = vmath.vector3(a.x * b.x, a.y * b.y, a.z * b.z) ----@param v1 vector3|vector4 first vector ----@param v2 vector3|vector4 second vector ----@return vector3|vector4 v multiplied vector -function vmath.mul_per_elem(v1, v2) end - ----Normalizes a vector, i.e. returns a new vector with the same ----direction as the input vector, but with length 1. ---- The length of the vector must be above 0, otherwise a ----division-by-zero will occur. ----@param v1 vector3|vector4|quaternion vector to normalize ----@return vector3|vector4|quaternion v new normalized vector -function vmath.normalize(v1) end - ----The resulting matrix is the inverse of the supplied matrix. ----The supplied matrix has to be an ortho-normal matrix, e.g. ----describe a regular object transformation. ---- For matrices that are not ortho-normal ----use the general inverse vmath.inv() instead. ----@param m1 matrix4 ortho-normalized matrix to invert ----@return matrix4 m inverse of the supplied matrix -function vmath.ortho_inv(m1) end - ----Calculates the extent the projection of the first vector onto the second. ----The returned value is a scalar p defined as: ----p = |P| cos θ / |Q| ----where θ is the angle between the vectors P and Q. ----@param v1 vector3 vector to be projected on the second ----@param v2 vector3 vector onto which the first will be projected, must not have zero length ----@return number n the projected extent of the first vector onto the second -function vmath.project(v1, v2) end - ----Creates a new identity quaternion. The identity ----quaternion is equal to: ----vmath.quat(0, 0, 0, 1) ----@return quaternion q new identity quaternion -function vmath.quat() end - ----Creates a new quaternion with the components set ----according to the supplied parameter values. ----@param x number x coordinate ----@param y number y coordinate ----@param z number z coordinate ----@param w number w coordinate ----@return quaternion q new quaternion -function vmath.quat(x, y, z, w) end - ----Creates a new quaternion with all components set to the ----corresponding values from the supplied quaternion. I.e. ----This function creates a copy of the given quaternion. ----@param q1 quaternion existing quaternion ----@return quaternion q new quaternion -function vmath.quat(q1) end - ----The resulting quaternion describes a rotation of angle ----radians around the axis described by the unit vector v. ----@param v vector3 axis ----@param angle number angle ----@return quaternion q quaternion representing the axis-angle rotation -function vmath.quat_axis_angle(v, angle) end - ----The resulting quaternion describes the rotation from the ----identity quaternion (no rotation) to the coordinate system ----as described by the given x, y and z base unit vectors. ----@param x vector3 x base vector ----@param y vector3 y base vector ----@param z vector3 z base vector ----@return quaternion q quaternion representing the rotation of the specified base vectors -function vmath.quat_basis(x, y, z) end - ----The resulting quaternion describes the rotation that, ----if applied to the first vector, would rotate the first ----vector to the second. The two vectors must be unit ----vectors (of length 1). ---- The result is undefined if the two vectors point in opposite directions ----@param v1 vector3 first unit vector, before rotation ----@param v2 vector3 second unit vector, after rotation ----@return quaternion q quaternion representing the rotation from first to second vector -function vmath.quat_from_to(v1, v2) end - ----The resulting quaternion describes a rotation of angle ----radians around the x-axis. ----@param angle number angle in radians around x-axis ----@return quaternion q quaternion representing the rotation around the x-axis -function vmath.quat_rotation_x(angle) end - ----The resulting quaternion describes a rotation of angle ----radians around the y-axis. ----@param angle number angle in radians around y-axis ----@return quaternion q quaternion representing the rotation around the y-axis -function vmath.quat_rotation_y(angle) end - ----The resulting quaternion describes a rotation of angle ----radians around the z-axis. ----@param angle number angle in radians around z-axis ----@return quaternion q quaternion representing the rotation around the z-axis -function vmath.quat_rotation_z(angle) end - ----Returns a new vector from the supplied vector that is ----rotated by the rotation described by the supplied ----quaternion. ----@param q quaternion quaternion ----@param v1 vector3 vector to rotate ----@return vector3 v the rotated vector -function vmath.rotate(q, v1) end - ----Slerp travels the torque-minimal path maintaining constant ----velocity, which means it travels along the straightest path along ----the rounded surface of a sphere. Slerp is useful for interpolation ----of rotations. ----Slerp travels the torque-minimal path, which means it travels ----along the straightest path the rounded surface of a sphere. ---- The function does not clamp t between 0 and 1. ----@param t number interpolation parameter, 0-1 ----@param q1 quaternion quaternion to slerp from ----@param q2 quaternion quaternion to slerp to ----@return quaternion q the slerped quaternion -function vmath.slerp(t, q1, q2) end - ----Spherically interpolates between two vectors. The difference to ----lerp is that slerp treats the vectors as directions instead of ----positions in space. ----The direction of the returned vector is interpolated by the angle ----and the magnitude is interpolated between the magnitudes of the ----from and to vectors. ---- Slerp is computationally more expensive than lerp. ----The function does not clamp t between 0 and 1. ----@param t number interpolation parameter, 0-1 ----@param v1 vector3|vector4 vector to slerp from ----@param v2 vector3|vector4 vector to slerp to ----@return vector3|vector4 v the slerped vector -function vmath.slerp(t, v1, v2) end - ----Creates a vector of arbitrary size. The vector is initialized ----with numeric values from a table. ---- The table values are converted to floating point ----values. If a value cannot be converted, a 0 is stored in that ----value position in the vector. ----@param t table table of numbers ----@return vector4|vector3 v new vector -function vmath.vector(t) end - ----Creates a new vector with all components set to the ----corresponding values from the supplied vector. I.e. ----This function creates a copy of the given vector. ----@param v1 vector3 existing vector ----@return vector3 v new vector -function vmath.vector3(v1) end - ----Creates a new vector with the components set to the ----supplied values. ----@param x number x coordinate ----@param y number y coordinate ----@param z number z coordinate ----@return vector3 v new vector -function vmath.vector3(x, y, z) end - ----Creates a new zero vector with all components set to 0. ----@return vector3 v new zero vector -function vmath.vector3() end - ----Creates a new vector with all components set to the ----supplied scalar value. ----@param n number scalar value to splat ----@return vector3 v new vector -function vmath.vector3(n) end - ----Creates a new vector with the components set to the ----supplied values. ----@param x number x coordinate ----@param y number y coordinate ----@param z number z coordinate ----@param w number w coordinate ----@return vector4 v new vector -function vmath.vector4(x, y, z, w) end - ----Creates a new vector with all components set to the ----supplied scalar value. ----@param n number scalar value to splat ----@return vector4 v new vector -function vmath.vector4(n) end - ----Creates a new zero vector with all components set to 0. ----@return vector4 v new zero vector -function vmath.vector4() end - ----Creates a new vector with all components set to the ----corresponding values from the supplied vector. I.e. ----This function creates a copy of the given vector. ----@param v1 vector4 existing vector ----@return vector4 v new vector -function vmath.vector4(v1) end - -return vmath \ No newline at end of file diff --git a/annotations/defold/window.lua b/annotations/defold/window.lua deleted file mode 100644 index cbb69b0..0000000 --- a/annotations/defold/window.lua +++ /dev/null @@ -1,110 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Window API documentation - - Functions and constants to access the window, window event listeners - and screen dimming. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.window -window = {} - ----Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. -window.DIMMING_OFF = nil - ----Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. -window.DIMMING_ON = nil - ----Dimming mode is used to control whether or not a mobile device should dim the screen after a period without user interaction. ----This mode indicates that the dim mode can't be determined, or that the platform doesn't support dimming. -window.DIMMING_UNKNOWN = nil - ---- This event is sent to a window event listener when the game window or app screen is ----restored after being iconified. -window.WINDOW_EVENT_DEICONIFIED = nil - ----This event is sent to a window event listener when the game window or app screen has ----gained focus. ----This event is also sent at game startup and the engine gives focus to the game. -window.WINDOW_EVENT_FOCUS_GAINED = nil - ----This event is sent to a window event listener when the game window or app screen has lost focus. -window.WINDOW_EVENT_FOCUS_LOST = nil - ---- This event is sent to a window event listener when the game window or app screen is ----iconified (reduced to an application icon in a toolbar, application tray or similar). -window.WINDOW_EVENT_ICONFIED = nil - ----This event is sent to a window event listener when the game window or app screen is resized. ----The new size is passed along in the data field to the event listener. -window.WINDOW_EVENT_RESIZED = nil - ---- Returns the current dimming mode set on a mobile device. ----The dimming mode specifies whether or not a mobile device should dim the screen after a period without user interaction. ----On platforms that does not support dimming, window.DIMMING_UNKNOWN is always returned. ----@return constant mode The mode for screen dimming ---- ----window.DIMMING_UNKNOWN ----window.DIMMING_ON ----window.DIMMING_OFF ---- -function window.get_dim_mode() end - ----This returns the current lock state of the mouse cursor ----@return boolean state The lock state -function window.get_mouse_lock() end - ----This returns the current window size (width and height). ----@return number width The window width ----@return number height The window height -function window.get_size() end - ---- Sets the dimming mode on a mobile device. ----The dimming mode specifies whether or not a mobile device should dim the screen after a period without user interaction. The dimming mode will only affect the mobile device while the game is in focus on the device, but not when the game is running in the background. ----This function has no effect on platforms that does not support dimming. ----@param mode constant The mode for screen dimming ---- ----window.DIMMING_ON ----window.DIMMING_OFF ---- -function window.set_dim_mode(mode) end - ----Sets a window event listener. ----@param callback fun(self, event, data)|nil A callback which receives info about window events. Pass an empty function or nil if you no longer wish to receive callbacks. ---- ----self ----object The calling script ----event ----constant The type of event. Can be one of these: ---- ---- ----window.WINDOW_EVENT_FOCUS_LOST ----window.WINDOW_EVENT_FOCUS_GAINED ----window.WINDOW_EVENT_RESIZED ----window.WINDOW_EVENT_ICONIFIED ----window.WINDOW_EVENT_DEICONIFIED ---- ---- ----data ----table The callback value data is a table which currently holds these values ---- ---- ----number width: The width of a resize event. nil otherwise. ----number height: The height of a resize event. nil otherwise. ---- -function window.set_listener(callback) end - ----Set the locking state for current mouse cursor on a PC platform. ----This function locks or unlocks the mouse cursor to the center point of the window. While the cursor is locked, ----mouse position updates will still be sent to the scripts as usual. ----@param flag boolean The lock state for the mouse cursor -function window.set_mouse_lock(flag) end - -return window \ No newline at end of file diff --git a/annotations/defold/zlib.lua b/annotations/defold/zlib.lua deleted file mode 100644 index 268c7bc..0000000 --- a/annotations/defold/zlib.lua +++ /dev/null @@ -1,28 +0,0 @@ ---[[ - Generated with github.com/astrochili/defold-annotations - Defold 1.8.0 - - Zlib compression API documentation - - Functions for compression and decompression of string buffers. ---]] - ----@diagnostic disable: lowercase-global ----@diagnostic disable: missing-return ----@diagnostic disable: duplicate-doc-param ----@diagnostic disable: duplicate-set-field - ----@class defold_api.zlib -zlib = {} - ----A lua error is raised is on error ----@param buf string buffer to deflate ----@return string buf deflated buffer -function zlib.deflate(buf) end - ----A lua error is raised is on error ----@param buf string buffer to inflate ----@return string buf inflated buffer -function zlib.inflate(buf) end - -return zlib \ No newline at end of file From 5848921cba6e2fff020507588237a2a4312ffd24 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 19:34:07 +0300 Subject: [PATCH 38/45] Update docs, config generations, fix linter --- .vscode/settings.json | 7 +- README.md | 4 +- config.ld | 1 - docs/modules/BaseComponent.html | 12 +- docs/modules/DataList.html | 118 ++--- docs/modules/Drag.html | 8 +- docs/modules/DruidEvent.html | 110 +++- docs/modules/DruidInstance.html | 63 +-- docs/modules/Helper.html | 48 ++ docs/modules/Hotkey.html | 36 +- docs/modules/Hover.html | 77 ++- docs/modules/Input.html | 377 ++++++++++++- docs/modules/Layout.html | 345 ------------ docs/modules/RichInput.html | 105 +++- docs/modules/RichText.html | 164 +++++- docs/modules/Scroll.html | 86 ++- docs/modules/Slider.html | 62 ++- docs/modules/StaticGrid.html | 110 ++++ docs/modules/Text.html | 51 +- docs/modules/Timer.html | 2 +- docs/modules/druid.extended.layout.html | 95 ++++ docs/modules/druid.system.utf8.html | 93 ++++ docs_md/02-creating_custom_components.md | 57 +- druid/annotations.lua | 117 ++--- druid/base/button.lua | 4 - druid/base/drag.lua | 4 +- druid/base/scroll.lua | 3 + druid/base/text.lua | 3 + druid/custom/rich_text/module/rt.lua | 2 +- druid/custom/rich_text/rich_text.gui | 45 -- druid/custom/rich_text/rich_text.lua | 4 +- druid/editor_scripts/druid.editor_script | 29 - druid/extended/data_list.lua | 4 +- druid/extended/figma_layout.lua | 392 -------------- druid/extended/hotkey.lua | 1 - druid/extended/layout.lua | 495 ++++++++++++------ druid/extended/slider.lua | 2 + druid/styles/default/style.lua | 12 +- druid/system/druid_instance.lua | 5 +- druid/system/utf8.lua | 3 +- druid/templates/component.template.lua | 9 +- druid/templates/component_full.template.lua | 9 +- .../button_component/button_component.lua | 17 +- utils/annotations_manual.lua | 25 +- 44 files changed, 1880 insertions(+), 1336 deletions(-) create mode 100644 docs/modules/druid.extended.layout.html create mode 100644 docs/modules/druid.system.utf8.html delete mode 100644 druid/custom/rich_text/rich_text.gui delete mode 100644 druid/extended/figma_layout.lua diff --git a/.vscode/settings.json b/.vscode/settings.json index 125c6f0..fc31eb2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -27,6 +27,11 @@ "test/tests/*.lua", "utils/annotations_manual.lua" ], + "Lua.runtime.pathStrict": true, "Lua.diagnostics.libraryFiles": "Enable", - "Lua.runtime.version": "Lua 5.1" + "Lua.runtime.version": "Lua 5.1", + "Lua.workspace.library": [ + "~/Library/Application Support/Code/User/globalStorage/astronachos.defold", + "~/Library/Application Support/Code/User/workspaceStorage/72e25b7e0fdc873ee6f7baa61edbd6b1/astronachos.defold" + ] } \ No newline at end of file diff --git a/README.md b/README.md index 84f0cb5..75a3ae5 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,9 @@ Try the [**HTML5 version**](https://insality.github.io/druid/druid/) of the **Dr To integrate the **Druid** extension into your own project, add this project as a [dependency](https://www.defold.com/manuals/libraries/) in your **Defold** game. Open your `game.project` file and add the following line to the dependencies field under the project section: -**Druid v0.11.0** +**Druid v0.12.0** -> [https://github.com/Insality/druid/archive/refs/tags/0.11.0.zip](https://github.com/Insality/druid/archive/refs/tags/0.11.0.zip) +> [https://github.com/Insality/druid/archive/refs/tags/0.12.0.zip](https://github.com/Insality/druid/archive/refs/tags/0.12.0.zip) Here is a list of [all releases](https://github.com/Insality/druid/releases). diff --git a/config.ld b/config.ld index 1a295b1..a487ec9 100644 --- a/config.ld +++ b/config.ld @@ -4,7 +4,6 @@ description='Documentation for Druid Framework' file={"./druid", exclude = { "./druid/styles/", - "./druid/system/middleclass.lua", "./druid/templates/", "./druid/annotations.lua", "./druid/custom/rich_text/module", diff --git a/docs/modules/BaseComponent.html b/docs/modules/BaseComponent.html index 1c81617..4d4d649 100644 --- a/docs/modules/BaseComponent.html +++ b/docs/modules/BaseComponent.html @@ -106,7 +106,7 @@ return AwesomeComponent Context used as first arg in all Druid events - get_druid(self) + get_druid(self, template, nodes) Get Druid instance for inner component creation. @@ -226,7 +226,7 @@ return AwesomeComponent

    - get_druid(self) + get_druid(self, template, nodes)
    Get Druid instance for inner component creation. @@ -238,6 +238,14 @@ return AwesomeComponent BaseComponent BaseComponent +
  • template + string or nil + The template name +
  • +
  • nodes + table or nil + The nodes table +
  • Returns:

    diff --git a/docs/modules/DataList.html b/docs/modules/DataList.html index 8003f36..7dcbdbe 100644 --- a/docs/modules/DataList.html +++ b/docs/modules/DataList.html @@ -100,22 +100,10 @@ Return current data from DataList component - get_first_index(self) - Return first index from data. - - get_index(self, data) Return index for data value - get_last_index(self) - Return last index from data - - - get_length(self) - Return amount of data - - init(self, scroll, grid, create_function) The DataList constructor @@ -131,6 +119,10 @@ set_data(self, data) Set new data set for DataList component + + set_use_cache(self, is_use_cache) + Set refresh function for DataList component +

    Fields

    @@ -140,7 +132,7 @@ - + @@ -164,7 +156,7 @@ - +
    last_indexThe current visual last data indexThe current last index of visual elements
    on_element_add
    top_indexThe current visual top data indexThe current top index of visual elements
    @@ -276,27 +268,6 @@ -
    -
    - - get_first_index(self) -
    -
    - Return first index from data. It not always equals to 1 - - -

    Parameters:

    - - - - - -
    @@ -322,48 +293,6 @@ -
    U;VXjGw}qH1K0Tsf#4L$Lwn^VTw8wfjwN_o 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�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

    -
    - - get_last_index(self) -
    -
    - Return last index from data - - -

    Parameters:

    - - - - - - -
    -
    - - get_length(self) -
    -
    - Return amount of data - - -

    Parameters:

    - - - - - -
    @@ -474,6 +403,37 @@ + +
    + + set_use_cache(self, is_use_cache) +
    +
    + Set refresh function for DataList component + + +

    Parameters:

    +
      +
    • self + DataList + DataList +
    • +
    • is_use_cache + boolean + Use cache version of DataList. Requires make setup of components in on_element_add callback and clean in on_element_remove +
    • +
    + +

    Returns:

    +
      + + druid.data_list + Current DataList instance +
    + + + +

    Fields

    @@ -504,7 +464,7 @@ last_index
    - The current visual last data index + The current last index of visual elements
      @@ -624,7 +584,7 @@ top_index
      - The current visual top data index + The current top index of visual elements
        diff --git a/docs/modules/Drag.html b/docs/modules/Drag.html index 0b7c4c7..f61f06c 100644 --- a/docs/modules/Drag.html +++ b/docs/modules/Drag.html @@ -134,11 +134,11 @@ on_drag - on drag progress callback(self, dx, dy, total_x, total_y) + on drag progress callback(self, dx, dy, total_x, total_y, touch) on_drag_end - Event on drag end callback(self, total_x, total_y) + Event on drag end callback(self, total_x, total_y, touch) on_drag_start @@ -428,7 +428,7 @@ on_drag
        - on drag progress callback(self, dx, dy, total_x, total_y) + on drag progress callback(self, dx, dy, total_x, total_y, touch)
          @@ -448,7 +448,7 @@ on_drag_end
          - Event on drag end callback(self, total_x, total_y) + Event on drag end callback(self, total_x, total_y, touch)
          - - initialize(self, initial_callback) + + create(callback, callback_context)
          DruidEvent constructor @@ -150,14 +158,14 @@

          Parameters:

            -
          • self - DruidEvent - DruidEvent -
          • -
          • initial_callback +
          • callback function or nil Subscribe the callback on new event, if callback exist
          • +
          • callback_context + any or nil + Additional context as first param to callback call +
          @@ -167,7 +175,38 @@
            local Event = require("druid.event")
             ...
            -local event = Event(initial_callback)
            +local event = Event(callback) +
          + +
          +
          + + is_empty(self) +
          +
          + Return true, if event not have handler + + +

          Parameters:

          + + +

          Returns:

          +
            + + boolean + True if event not have handlers +
          + + + +

          Usage:

          +
            +
            local is_long_click_handler_not_exists = button.on_long_click:is_empty()
          @@ -201,10 +240,45 @@
          local is_long_click_handler_exists = button.on_long_click:is_exist()
        +
        +
        + + is_subscribed(self, callback, callback_context) +
        +
        + Check is event subscribed. + + +

        Parameters:

        +
          +
        • self + DruidEvent + DruidEvent +
        • +
        • callback + function + Callback itself +
        • +
        • callback_context + any or nil + Additional context as first param to callback call +
        • +
        + +

        Returns:

        +
          + + boolean, + number|nil @Is event subscribed, return index of callback in event as second param +
        + + + +
        - subscribe(self, callback, context) + subscribe(self, callback, callback_context)
        Subscribe callback on event @@ -220,12 +294,18 @@ function Callback itself -
      • context +
      • callback_context any or nil Additional context as first param to callback call, usually it's self
      +

      Returns:

      +
        + + boolean + True if callback was subscribed +
      @@ -274,7 +354,7 @@ event:trigger("Param1", "Param2
      - unsubscribe(self, callback, context) + unsubscribe(self, callback, callback_context)
      Unsubscribe callback on event @@ -290,7 +370,7 @@ event:trigger("Param1", "Param2 function Callback itself -
    • context +
    • callback_context any or nil Additional context as first param to callback call
    • diff --git a/docs/modules/DruidInstance.html b/docs/modules/DruidInstance.html index 71a1df5..5007e3c 100644 --- a/docs/modules/DruidInstance.html +++ b/docs/modules/DruidInstance.html @@ -142,10 +142,6 @@ end Call this in gui_script final function. - new(self, component, ...) - Create new component. - - new_back_handler(self, callback, params) Create BackHandler component @@ -182,7 +178,7 @@ end Create Hotkey component - new_hover(self, node, on_hover_callback) + new_hover(self, node, on_hover_callback, on_mouse_hover_callback) Create Hover component @@ -194,7 +190,7 @@ end Create LangText component - new_layout(self, node, mode, on_size_changed_callback) + new_layout(self, node, mode) Create Layout component @@ -286,41 +282,6 @@ end -
      -
      - - new(self, component, ...) -
      -
      - Create new component. - - -

      Parameters:

      -
        -
      • self - DruidInstance - -
      • -
      • component - BaseComponent - Component module -
      • -
      • ... - any - Other component params to pass it to component:init function -
      • -
      - -

      Returns:

      -
        - - BaseComponent - Component instance -
      - - - -
      @@ -411,7 +372,7 @@ end Button callback
    • params - table or nil + any or nil Button callback params
    • anim_node @@ -659,7 +620,7 @@ end
    - new_hover(self, node, on_hover_callback) + new_hover(self, node, on_hover_callback, on_mouse_hover_callback)
    Create Hover component @@ -679,6 +640,10 @@ end function or nil Hover callback +
  • on_mouse_hover_callback + function or nil + Mouse hover callback +
  • Returns:

    @@ -772,7 +737,7 @@ end
    - new_layout(self, node, mode, on_size_changed_callback) + new_layout(self, node, mode)
    Create Layout component @@ -792,10 +757,6 @@ end string The layout mode -
  • on_size_changed_callback - function or nil - The callback on window resize -
  • Returns:

    @@ -1244,6 +1205,12 @@ end +

    Returns:

    +
      + + boolean + True if component was removed +
    diff --git a/docs/modules/Helper.html b/docs/modules/Helper.html index 2ede020..f465d57 100644 --- a/docs/modules/Helper.html +++ b/docs/modules/Helper.html @@ -151,10 +151,18 @@ helper.centrate_nodes(0, node_1, node_2) Check if device is native mobile (Android or iOS) + helper.is_multitouch_supported() + Check if device is mobile and can support multitouch + + helper.is_web() Check if device is HTML5 + helper.is_web_mobile() + Check if device is HTML5 mobile + + helper.lerp(a, b, t) Lerp between two values @@ -658,6 +666,26 @@ helper.centrate_nodes(0, node_1, node_2) +
    +
    + + helper.is_multitouch_supported() +
    +
    + Check if device is mobile and can support multitouch + + + +

    Returns:

    +
      + + boolean + Is multitouch supported +
    + + + +
    @@ -678,6 +706,26 @@ helper.centrate_nodes(0, node_1, node_2) + +
    + + helper.is_web_mobile() +
    +
    + Check if device is HTML5 mobile + + + +

    Returns:

    +
      + + boolean + Is web mobile +
    + + + +
    diff --git a/docs/modules/Hotkey.html b/docs/modules/Hotkey.html index bb8c0da..68e4015 100644 --- a/docs/modules/Hotkey.html +++ b/docs/modules/Hotkey.html @@ -117,8 +117,12 @@ Visual node - on_change_state - On change state callback(self, state) + on_hotkey_pressed + On hotkey released callback(self, argument) + + + on_hotkey_released + On hotkey released callback(self, argument) @@ -320,15 +324,35 @@
    - - on_change_state + + on_hotkey_pressed
    - On change state callback(self, state) + On hotkey released callback(self, argument)
      -
    • on_change_state +
    • on_hotkey_pressed + DruidEvent + DruidEvent +
    • +
    + + + + + +
    +
    + + on_hotkey_released +
    +
    + On hotkey released callback(self, argument) + + +
    +
    + + get_text_selected_replaced(self, text) +
    +
    + Replace selected text with new text + + +

    Parameters:

    +
      +
    • self + Input + Input +
    • +
    • text + string + The text to replace selected text +
    • +
    + +

    Returns:

    +
      + + string + New input text +
    + + + +
    @@ -250,6 +333,39 @@ + +
    + + move_selection(self, delta, is_add_to_selection, is_move_to_end) +
    +
    + Change cursor position by delta + + +

    Parameters:

    +
      +
    • self + Input + Input +
    • +
    • delta + number + side for cursor position, -1 for left, 1 for right +
    • +
    • is_add_to_selection + boolean + (Shift key) +
    • +
    • is_move_to_end + boolean + (Ctrl key) +
    • +
    + + + + +
    @@ -267,6 +383,12 @@ +

    Returns:

    +
      + + druid.input + Current input instance +
    @@ -292,6 +414,45 @@ + +
    + + select_cursor(self, cursor_index, start_index, end_index) +
    +
    + Set cursor position in input field + + +

    Parameters:

    +
      +
    • self + Input + Input +
    • +
    • cursor_index + number or nil + Cursor index for cursor position, if nil - will be set to the end of the text +
    • +
    • start_index + number or nil + Start index for cursor position, if nil - will be set to the end of the text +
    • +
    • end_index + number or nil + End index for cursor position, if nil - will be set to the start_index +
    • +
    + +

    Returns:

    +
      + + druid.input + Current input instance +
    + + + +
    @@ -432,10 +593,6 @@ boolean If true, call unselect on select selected input. Default: false -
  • NO_CONSUME_INPUT_WHILE_SELECTED - boolean - If true, will not consume input while input is selected. It's allow to interact with other components while input is selected (text input still captured). Default: false -
  • on_select function (self, button_node) Callback on input field selecting @@ -502,6 +659,66 @@ + +
    + + current_value +
    +
    + Current input value with marked text + + +
      +
    • current_value + string + +
    • +
    + + + + + +
    +
    + + cursor_index +
    +
    + The cursor index. The index of letter cursor after. Leftmost cursor - 0 + + +
      +
    • cursor_index + number + +
    • +
    + + + + + +
    +
    + + end_index +
    +
    + Theselection end index. The index of letter cursor before. Rightmost selection - #text + + +
      +
    • end_index + number + +
    • +
    + + + + +
    @@ -562,6 +779,46 @@ + +
    + + marked_text_width +
    +
    + Marked text width + + +
      +
    • marked_text_width + number + +
    • +
    + + + + + +
    +
    + + marked_value +
    +
    + Marked text for input field. Info: https://defold.com/manuals/input-key-and-text/#marked-text + + +
      +
    • marked_value + string + +
    • +
    + + + + +
    @@ -628,7 +885,7 @@ on_input_select
    - On input field select callback(self, button_node) + On input field select callback(self, input_instance)
      @@ -668,7 +925,7 @@ on_input_unselect
  • - On input field unselect callback(self, input_text) + On input field unselect callback(self, input_text, input_instance)
      @@ -688,7 +945,7 @@ on_input_wrong
      - On trying user input with not allowed character callback(self, params, button_instance) + On trying user input with not allowed character callback(self, params, input_text)
        @@ -702,6 +959,66 @@ +
      +
      + + on_select_cursor_change +
      +
      + On cursor position change callback(self, cursor_index, start_index, end_index) + + +
        +
      • on_select_cursor_change + DruidEvent + DruidEvent +
      • +
      + + + + + +
      +
      + + previous_value +
      +
      + Previous input value + + +
        +
      • previous_value + string + +
      • +
      + + + + + +
      +
      + + start_index +
      +
      + The selection start index. The index of letter cursor after. Leftmost selection - 0 + + +
        +
      • start_index + number + +
      • +
      + + + + +
      @@ -722,6 +1039,46 @@ +
    +
    + + text_width +
    +
    + Text width + + +
      +
    • text_width + number + +
    • +
    + + + + + +
    +
    + + value +
    +
    + Current input value + + + + + + + +
    diff --git a/docs/modules/Layout.html b/docs/modules/Layout.html index edad2b6..c8f4140 100644 --- a/docs/modules/Layout.html +++ b/docs/modules/Layout.html @@ -32,7 +32,6 @@

    Contents

    @@ -79,45 +78,6 @@

    Example Link

    -

    Functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    fit_into_node(self, node)Set node for layout node to fit inside it.
    fit_into_size(self, target_size)Set size for layout node to fit inside it
    fit_into_window(self)Set current size for layout node to fit inside it
    init(self, node, mode, on_size_changed_callback)The Layout constructor
    set_max_gui_upscale(self, max_gui_upscale)Set max gui upscale for FIT adjust mode (or side).
    set_max_size(self, max_size)Set maximum size of layout node
    set_min_size(self, min_size)Set minimal size of layout node
    set_origin_position(self, new_origin_position)Set new origin position of layout node.
    set_origin_size(self, new_origin_size)Set new origin size of layout node.

    Fields

    @@ -128,297 +88,12 @@ - - - -
    node Layout node
    on_size_changedOn window resize callback(self, new_size)


    -

    Functions

    - -
    -
    - - fit_into_node(self, node) -
    -
    - Set node for layout node to fit inside it. Pass nil to reset - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • node - node or nil - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - fit_into_size(self, target_size) -
    -
    - Set size for layout node to fit inside it - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • target_size - vector3 - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - fit_into_window(self) -
    -
    - Set current size for layout node to fit inside it - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - init(self, node, mode, on_size_changed_callback) -
    -
    - The Layout constructor - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • node - node - Gui node -
    • -
    • mode - string - The layout mode (from const.LAYOUT_MODE) -
    • -
    • on_size_changed_callback - function or nil - The callback on window resize -
    • -
    - - - - - -
    -
    - - set_max_gui_upscale(self, max_gui_upscale) -
    -
    - Set max gui upscale for FIT adjust mode (or side). It happens on bigger render gui screen - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • max_gui_upscale - number - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - set_max_size(self, max_size) -
    -
    - Set maximum size of layout node - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • max_size - vector3 - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - set_min_size(self, min_size) -
    -
    - Set minimal size of layout node - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • min_size - vector3 - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - set_origin_position(self, new_origin_position) -
    -
    - Set new origin position of layout node. You should apply this on node movement - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • new_origin_position - vector3 - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -
    - - set_origin_size(self, new_origin_size) -
    -
    - Set new origin size of layout node. You should apply this on node manual size change - - -

    Parameters:

    -
      -
    • self - Layout - Layout -
    • -
    • new_origin_size - vector3 - -
    • -
    - -

    Returns:

    -
      - - Layout - Layout -
    - - - - -
    -

    Fields

    @@ -461,26 +136,6 @@ - -
    - - on_size_changed -
    -
    - On window resize callback(self, new_size) - - - - - - - -
    diff --git a/docs/modules/RichInput.html b/docs/modules/RichInput.html index c8d62dc..0c70936 100644 --- a/docs/modules/RichInput.html +++ b/docs/modules/RichInput.html @@ -84,20 +84,32 @@ - + + + + + + + + + + + + +
    get_text(self)GSet input field textSet input field text
    init(self, template, nodes) The RichInput constructor
    select(self)Select input field
    set_allowed_characters(self, characters) Set allowed charaters for input field.
    set_font(self, font)Set input field font
    set_placeholder(self, placeholder_text) Set placeholder text
    set_text(self, text)Set input field text

    Fields

    @@ -135,7 +147,7 @@ get_text(self)
    - GSet input field text + Set input field text

    Parameters:

    @@ -146,12 +158,6 @@ -

    Returns:

    -
      - - string - Current input text -
    @@ -185,6 +191,27 @@ +
    +
    + + select(self) +
    +
    + Select input field + + +

    Parameters:

    + + + + + +
    @@ -218,6 +245,37 @@ + +
    + + set_font(self, font) +
    +
    + Set input field font + + +

    Parameters:

    +
      +
    • self + RichInput + RichInput +
    • +
    • font + hash + The font hash +
    • +
    + +

    Returns:

    +
      + + druid.input + Current input instance +
    + + + +
    @@ -234,16 +292,41 @@ RichInput
  • placeholder_text - string or nil + string The placeholder text
  • + + + + + +
    + + set_text(self, text) +
    +
    + Set input field text + + +

    Parameters:

    + +

    Returns:

      - RichInput - Current instance + druid.input + Current input instance
    diff --git a/docs/modules/RichText.html b/docs/modules/RichText.html index 990ce51..c72269b 100644 --- a/docs/modules/RichText.html +++ b/docs/modules/RichText.html @@ -150,6 +150,10 @@ type druid.rich_text.metrics = {

    Functions

    + + + + @@ -159,11 +163,15 @@ type druid.rich_text.metrics = { + + + + - + @@ -171,7 +179,7 @@ type druid.rich_text.metrics = { - +
    characters(self, word)Split a word into it's characters
    clear() Clear all created words.Get current line metrics
    get_text(self)Get current text
    get_words() Get all current words.
    init(self, template, nodes)init(self, text_node, value) The RichText constructor
    Set text for Rich Text
    tagged(tag)tagged(self, tag) Get all words, which has a passed tag.
    @@ -188,6 +196,18 @@ type druid.rich_text.metrics = { druid The component druid instance + + icon_prefab + The icon prefab node + + + root + The root node of the Rich Text + + + text_prefab + The text prefab node +
    @@ -197,6 +217,37 @@ type druid.rich_text.metrics = {

    Functions

    +
    + + characters(self, word) +
    +
    + Split a word into it's characters + + +

    Parameters:

    +
      +
    • self + RichText + RichText +
    • +
    • word + druid.rich_text.word + +
    • +
    + +

    Returns:

    +
      + + druid.rich_text.word[] + characters +
    + + + + +
    clear() @@ -230,6 +281,33 @@ type druid.rich_text.metrics = { + +
    + + get_text(self) +
    +
    + Get current text + + +

    Parameters:

    + + +

    Returns:

    +
      + + string + text +
    + + + +
    @@ -253,7 +331,7 @@ type druid.rich_text.metrics = {
    - init(self, template, nodes) + init(self, text_node, value)
    The RichText constructor @@ -265,13 +343,13 @@ type druid.rich_text.metrics = { RichText RichText -
  • template - string - The Rich Text template name +
  • text_node + node or string + The text node to make Rich Text
  • -
  • nodes - table - The node table, if prefab was copied by gui.clone_tree() +
  • value + string or nil + The initial text value. Default will be gui.get_text(text_node)
  • @@ -295,7 +373,7 @@ type druid.rich_text.metrics = { RichText
  • text - string + string or nil The text to set
  • @@ -361,7 +439,7 @@ Words <nobr>inside tag</nobr> won't break
    - tagged(tag) + tagged(self, tag)
    Get all words, which has a passed tag. @@ -369,6 +447,10 @@ Words <nobr>inside tag</nobr> won't breakParameters:
      +
    • self + RichText + RichText +
    • tag string @@ -444,6 +526,66 @@ Words <nobr>inside tag</nobr> won't break +
      + + icon_prefab +
      +
      + The icon prefab node + + +
        +
      • icon_prefab + node + +
      • +
      + + + + + +
      +
      + + root +
      +
      + The root node of the Rich Text + + +
        +
      • root + node + +
      • +
      + + + + + +
      +
      + + text_prefab +
      +
      + The text prefab node + + +
        +
      • text_prefab + node + +
      • +
      + + + + +
    diff --git a/docs/modules/Scroll.html b/docs/modules/Scroll.html index 6eefd06..dcf5180 100644 --- a/docs/modules/Scroll.html +++ b/docs/modules/Scroll.html @@ -167,6 +167,14 @@ set_vertical_scroll(self, state) Lock or unlock vertical scroll + + set_view_size(self, size) + Set new scroll view size in case the node size was changed. + + + update_view_size(self) + Refresh scroll view size +

    Tables

    @@ -233,6 +241,10 @@ + + + +
    view_node Scroll view node
    view_sizeScroll view size

    @@ -733,6 +745,58 @@ + +
    + + set_view_size(self, size) +
    +
    + Set new scroll view size in case the node size was changed. + + +

    Parameters:

    +
      +
    • self + Scroll + Scroll +
    • +
    • size + vector3 + The new size for view node +
    • +
    + +

    Returns:

    +
      + + druid.scroll + Current scroll instance +
    + + + + +
    +
    + + update_view_size(self) +
    +
    + Refresh scroll view size + + +

    Parameters:

    +
      +
    • self + Scroll + Scroll +
    • +
    + + + + +

    Tables

    @@ -819,7 +883,7 @@
    • _is_inert - bool + boolean
    @@ -1088,6 +1152,26 @@ + +
    + + view_size +
    +
    + Scroll view size + + +
      +
    • view_size + vector3 + +
    • +
    + + + + +
    diff --git a/docs/modules/Slider.html b/docs/modules/Slider.html index bc72643..94fc9f0 100644 --- a/docs/modules/Slider.html +++ b/docs/modules/Slider.html @@ -86,10 +86,18 @@ The Slider constructor + is_enabled(self) + Check if Slider component is enabled + + set(self, value, is_silent) Set value for slider + set_enabled(self, is_enabled) + Set Slider input enabled or disabled + + set_input_node(self, input_node) Set input zone for slider. @@ -177,6 +185,33 @@ + +
    + + is_enabled(self) +
    +
    + Check if Slider component is enabled + + +

    Parameters:

    +
      +
    • self + Slider + Slider +
    • +
    + +

    Returns:

    +
      + + boolean + +
    + + + +
    @@ -206,6 +241,31 @@ + +
    + + set_enabled(self, is_enabled) +
    +
    + Set Slider input enabled or disabled + + +

    Parameters:

    +
      +
    • self + Slider + Slider +
    • +
    • is_enabled + boolean + +
    • +
    + + + + +
    @@ -291,7 +351,7 @@
    • dist - number + vector3
    diff --git a/docs/modules/StaticGrid.html b/docs/modules/StaticGrid.html index 4f2daee..076f3bb 100644 --- a/docs/modules/StaticGrid.html +++ b/docs/modules/StaticGrid.html @@ -154,9 +154,21 @@ Set new in_row elements for grid + set_item_size(self[, width[, height]]) + Set new node size for grid + + + set_items(self, nodes[, is_instant=false]) + Set new items to the grid. + + set_position_function(self, callback) Change set position function for grid nodes. + + sort_nodes(self, comparator) + Sort grid nodes by custom comparator function +

    Tables

    @@ -621,6 +633,73 @@ + +
    + + set_item_size(self[, width[, height]]) +
    +
    + Set new node size for grid + + +

    Parameters:

    +
      +
    • self + StaticGrid + StaticGrid +
    • +
    • width + number + The new node width + (optional) +
    • +
    • height + number + The new node height + (optional) +
    • +
    + +

    Returns:

    +
      + + druid.static_grid + Current grid instance +
    + + + + +
    +
    + + set_items(self, nodes[, is_instant=false]) +
    +
    + Set new items to the grid. All previous items will be removed + + +

    Parameters:

    +
      +
    • self + StaticGrid + StaticGrid +
    • +
    • nodes + node[] + The new grid nodes +
    • +
    • is_instant + boolean + If true, update node positions instantly + (default false) +
    • +
    + + + + +
    @@ -653,6 +732,37 @@ + +
    + + sort_nodes(self, comparator) +
    +
    + Sort grid nodes by custom comparator function + + +

    Parameters:

    +
      +
    • self + StaticGrid + StaticGrid +
    • +
    • comparator + function + The comparator function. (a, b) -> boolean +
    • +
    + +

    Returns:

    +
      + + druid.static_grid + Current grid instance +
    + + + +

    Tables

    diff --git a/docs/modules/Text.html b/docs/modules/Text.html index eb925ac..4f7d196 100644 --- a/docs/modules/Text.html +++ b/docs/modules/Text.html @@ -105,6 +105,10 @@ + + + + @@ -247,6 +251,37 @@ + +
    + + get_text_index_by_width(self, width) +
    +
    + Get chars count by width + + +

    Parameters:

    +
      +
    • self + Text + Text +
    • +
    • width + number + +
    • +
    + +

    Returns:

    +
      + + number + Chars count +
    + + + +
    @@ -263,8 +298,8 @@ Text
  • text - string or nil - + string + |nil
  • @@ -302,11 +337,11 @@
  • value string or nil - Initial text. Default value is node text from GUI scene. + Initial text. Default value is node text from GUI scene. Default: nil
  • adjust_type string or nil - Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: downscale + Adjust type for text. By default is DOWNSCALE. Look const.TEXT_ADJUST for reference. Default: DOWNSCALE
  • @@ -618,6 +653,14 @@ string or nil The default adjust type for any text component. Default: DOWNSCALE +
  • ADJUST_STEPS + string or nil + Amount of iterations for text adjust by height. Default: 20 +
  • +
  • ADJUST_SCALE_DELTA + string or nil + Scale step on each height adjust step. Default: 0.02 +
  • diff --git a/docs/modules/Timer.html b/docs/modules/Timer.html index 7c3eb82..9dca7a5 100644 --- a/docs/modules/Timer.html +++ b/docs/modules/Timer.html @@ -158,7 +158,7 @@ Gui text node
  • seconds_from - number + number or nil Start timer value in seconds
  • seconds_to diff --git a/docs/modules/druid.extended.layout.html b/docs/modules/druid.extended.layout.html new file mode 100644 index 0000000..4f01fd5 --- /dev/null +++ b/docs/modules/druid.extended.layout.html @@ -0,0 +1,95 @@ + + + + + Defold Druid UI Framework + + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + +

    Module druid.extended.layout

    +

    Druid layout module +

    # Overview # +

    Layout component works like Dynamic Grid before - for aligning elements in a row or column.

    +

    Works like a Figma layout. +

    # Notes

    + + + +
    +
    + + + + +
    +
    +
    +generated by LDoc TESTING +Last updated 2015-01-01 12:00:00 +
    +
    + + diff --git a/docs/modules/druid.system.utf8.html b/docs/modules/druid.system.utf8.html new file mode 100644 index 0000000..0582106 --- /dev/null +++ b/docs/modules/druid.system.utf8.html @@ -0,0 +1,93 @@ + + + + + Defold Druid UI Framework + + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + +

    Module druid.system.utf8

    +

    +

    + + + +
    +
    + + + + +
    +
    +
    +generated by LDoc TESTING +Last updated 2015-01-01 12:00:00 +
    +
    + + diff --git a/docs_md/02-creating_custom_components.md b/docs_md/02-creating_custom_components.md index b7aaf99..b763f6f 100644 --- a/docs_md/02-creating_custom_components.md +++ b/docs_md/02-creating_custom_components.md @@ -14,21 +14,14 @@ A basic custom component template looks like this (you can copy it from `/druid/ ```lua local component = require("druid.component") ----@class component_name : druid.base_component +---@class component_name: druid.base_component local Component = component.create("component_name") -local SCHEME = { - ROOT = "root", - BUTTON = "button", -} - function Component:init(template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.root = self:get_node(SCHEME.ROOT) - self.druid = self:get_druid() + self.druid = self:get_druid(template, nodes) + self.root = self:get_node("root") - self.button = self.druid:new_button(SCHEME.BUTTON, function() end) + self.button = self.druid:new_button("button", function() end) end function Component:on_remove() end @@ -43,18 +36,12 @@ A full custom component template looks like this (you can copy it from `/druid/t ```lua local component = require("druid.component") ----@class component_name : druid.base_component +---@class component_name: druid.base_component local Component = component.create("component_name") -local SCHEME = { - ROOT = "root", - BUTTON = "button", -} function Component:init(template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.root = self:get_node(SCHEME.ROOT) - self.druid = self:get_druid() + self.druid = self:get_druid(template, nodes) + self.root = self:get_node("root") end function Component:update(dt) end @@ -92,7 +79,7 @@ local my_component = require("my.amazing.component") function init(self) self.druid = druid.new(self) - self.druid:new(my_component, "template_name", nodes) + self.druid:new(my_component, "template_name") end ``` @@ -107,6 +94,7 @@ local druid = require("druid.druid") local my_component = require("my.amazing.component") function init(self) + -- Register makes a "druid:new_{component_name}" function available druid.register("my_component", my_component) end ``` @@ -149,33 +137,6 @@ Available keywords: uid Timer](01-components.md#timer) component. -## Best Practices for Custom Components - -When working with each component, it's recommended to describe the component scheme in the following way: - -```lua --- Component module -local component = require("druid.component") - -local M = component.create("your_component") - -local SCHEME = { - ROOT = "root", - ITEM = "item", - TITLE = "title" -} - -function M.init(self, template_name, node_table) - self:set_template(template_name) - self:set_nodes(node_table) - - local root = self:get_node(SCHEME.ROOT) - local druid = self:get_druid() - - -- Create components inside this component using the inner druid instance -end -``` - ## The Power of Using Templates With Druid, you can use a single component but create and customize templates for it. Templates only need to match the component scheme. For example, you can have a component named `player_panel` and two GUI templates named `player_panel` and `enemy_panel` with different layouts. The same component script can be used for both templates. diff --git a/druid/annotations.lua b/druid/annotations.lua index e8395b4..c8e29dd 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -367,6 +367,12 @@ function druid__data_list.scroll_to_index(self, index) end ---@return druid.data_list Current DataList instance function druid__data_list.set_data(self, data) end +--- Set refresh function for DataList component +---@param self druid.data_list @{DataList} +---@param is_use_cache boolean Use cache version of DataList. Requires make setup of components in on_element_add callback and clean in on_element_remove +---@return druid.data_list Current DataList instance +function druid__data_list.set_use_cache(self, is_use_cache) end + ---@class druid.drag : druid.base_component ---@field can_x boolean Is drag component process vertical dragging. @@ -374,8 +380,8 @@ function druid__data_list.set_data(self, data) end ---@field is_drag boolean Is component now dragging ---@field is_touch boolean Is component now touching ---@field node node Drag node ----@field on_drag druid.event on drag progress callback(self, dx, dy, total_x, total_y) ----@field on_drag_end druid.event Event on drag end callback(self, total_x, total_y) +---@field on_drag druid.event on drag progress callback(self, dx, dy, total_x, total_y, touch) +---@field on_drag_end druid.event Event on drag end callback(self, total_x, total_y, touch) ---@field on_drag_start druid.event Event on drag start callback(self, touch) ---@field on_touch_end druid.event Event on touch end callback(self) ---@field on_touch_start druid.event Event on touch start callback(self) @@ -559,7 +565,8 @@ function druid__event.unsubscribe(self, callback, callback_context) end ---@field button druid.button Button component from click_node ---@field click_node node|nil Button trigger node ---@field node node Visual node ----@field on_change_state druid.event On change state callback(self, state) +---@field on_hotkey_pressed druid.event On hotkey released callback(self, argument) +---@field on_hotkey_released druid.event On hotkey released callback(self, argument) ---@field style druid.hotkey.style Component style params. local druid__hotkey = {} @@ -803,67 +810,8 @@ function druid__lang_text.translate(self, locale_id, a, b, c, d, e, f, g) end ---@class druid.layout : druid.base_component ---@field mode string Current layout mode ---@field node node Layout node ----@field on_size_changed druid.event On window resize callback(self, new_size) local druid__layout = {} ---- Set node for layout node to fit inside it. ---- Pass nil to reset ----@param self druid.layout @{Layout} ----@param node node|nil ----@return druid.layout @{Layout} -function druid__layout.fit_into_node(self, node) end - ---- Set size for layout node to fit inside it ----@param self druid.layout @{Layout} ----@param target_size vector3 ----@return druid.layout @{Layout} -function druid__layout.fit_into_size(self, target_size) end - ---- Set current size for layout node to fit inside it ----@param self druid.layout @{Layout} ----@return druid.layout @{Layout} -function druid__layout.fit_into_window(self) end - ---- The @{Layout} constructor ----@param self druid.layout @{Layout} ----@param node node Gui node ----@param mode string The layout mode (from const.LAYOUT_MODE) ----@param on_size_changed_callback function|nil The callback on window resize -function druid__layout.init(self, node, mode, on_size_changed_callback) end - ---- Set max gui upscale for FIT adjust mode (or side). ---- It happens on bigger render gui screen ----@param self druid.layout @{Layout} ----@param max_gui_upscale number ----@return druid.layout @{Layout} -function druid__layout.set_max_gui_upscale(self, max_gui_upscale) end - ---- Set maximum size of layout node ----@param self druid.layout @{Layout} ----@param max_size vector3 ----@return druid.layout @{Layout} -function druid__layout.set_max_size(self, max_size) end - ---- Set minimal size of layout node ----@param self druid.layout @{Layout} ----@param min_size vector3 ----@return druid.layout @{Layout} -function druid__layout.set_min_size(self, min_size) end - ---- Set new origin position of layout node. ---- You should apply this on node movement ----@param self druid.layout @{Layout} ----@param new_origin_position vector3 ----@return druid.layout @{Layout} -function druid__layout.set_origin_position(self, new_origin_position) end - ---- Set new origin size of layout node. ---- You should apply this on node manual size change ----@param self druid.layout @{Layout} ----@param new_origin_size vector3 ----@return druid.layout @{Layout} -function druid__layout.set_origin_size(self, new_origin_size) end - ---@class druid.pin_knob : druid.base_component ---@field druid druid_instance The component druid instance @@ -1056,9 +1004,9 @@ function druid__rich_text.get_words() end --- The @{RichText} constructor ---@param self druid.rich_text @{RichText} ----@param template string The Rich Text template name ----@param nodes table The node table, if prefab was copied by gui.clone_tree() -function druid__rich_text.init(self, template, nodes) end +---@param text_node node|string The text node to make Rich Text +---@param value string|nil The initial text value. Default will be gui.get_text(text_node) +function druid__rich_text.init(self, text_node, value) end --- Set text for Rich Text ---@param self druid.rich_text @{RichText} @@ -1097,6 +1045,7 @@ local druid__rich_text__style = {} ---@field style druid.scroll.style Component style params. ---@field target_position vector3 Current scroll target position ---@field view_node node Scroll view node +---@field view_size vector3 Scroll view size local druid__scroll = {} --- Bind the grid component (Static or Dynamic) to recalculate scroll size on grid changes @@ -1205,6 +1154,10 @@ function druid__scroll.set_vertical_scroll(self, state) end ---@return druid.scroll Current scroll instance function druid__scroll.set_view_size(self, size) end +--- Refresh scroll view size +---@param self druid.scroll @{Scroll} +function druid__scroll.update_view_size(self) end + ---@class druid.scroll.style ---@field ANIM_SPEED number|nil Scroll gui.animation speed for scroll_to function. Default: 2 @@ -1550,7 +1503,7 @@ local druid__timer = {} --- The @{Timer} constructor ---@param self druid.timer @{Timer} ---@param node node Gui text node ----@param seconds_from number Start timer value in seconds +---@param seconds_from number|nil Start timer value in seconds ---@param seconds_to number|nil End timer value in seconds ---@param callback function|nil Function on timer end function druid__timer.init(self, node, seconds_from, seconds_to, callback) end @@ -1579,14 +1532,6 @@ local druid_instance = {} ---@param self druid_instance function druid_instance.final(self) end ---- Create new component. ----@generic T ----@param self druid_instance ----@param component T Component module ----@param ... any Other component params to pass it to component:init function ----@return T Component instance -function druid_instance.new(self, component, ...) end - --- Create @{BackHandler} component ---@param self druid_instance ---@param callback function|nil @The callback(self, custom_args) to call on back event @@ -1683,9 +1628,8 @@ function druid_instance.new_lang_text(self, node, locale_id, adjust_type) end ---@param self druid_instance ---@param node string|node The_node id or gui.get_node(node_id). ---@param mode string The layout mode ----@param on_size_changed_callback function|nil The callback on window resize ---@return druid.layout @{Layout} component -function druid_instance.new_layout(self, node, mode, on_size_changed_callback) end +function druid_instance.new_layout(self, node, mode) end --- Create @{Progress} component ---@param self druid_instance @@ -1752,7 +1696,7 @@ function druid_instance.new_text(self, node, value, no_adjust) end --- Create @{Timer} component ---@param self druid_instance ---@param node string|node Gui text node ----@param seconds_from number|nil Start timer value in seconds +---@param seconds_from number Start timer value in seconds ---@param seconds_to number|nil End timer value in seconds ---@param callback function|nil Function on timer end ---@return druid.timer @{Timer} component @@ -2021,3 +1965,22 @@ function helper.table_to_string(t) end ---@field height number ---@field max_ascent number ---@field max_descent number + +---@class utf8 +---@field len fun(string: string): number +---@field sub fun(string: string, i: number, j: number): string +---@field gmatch fun(string: string, pattern: string): fun(): string +---@field gsub fun(string: string, pattern: string, repl: string, n: number): string +---@field char fun(...: number): string +---@field byte fun(string: string, i: number, j: number): number + + +---Add generics to some functions. + +---Create new component. +---@generic T: druid.base_component +---@param self druid_instance +---@param component T Component module +---@param ... any Other component params to pass it to component:init function +---@return T Component instance +function druid_instance.new(self, component, ...) end \ No newline at end of file diff --git a/druid/base/button.lua b/druid/base/button.lua index b08d897..ada2a26 100755 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -344,10 +344,6 @@ function Button.on_input(self, action_id, action) return false end - if not self:is_enabled() then - return false - end - local is_consume = true local is_pick = true local is_key_trigger = (action_id == self.key_trigger) diff --git a/druid/base/drag.lua b/druid/base/drag.lua index 3cae2b9..fd79105 100644 --- a/druid/base/drag.lua +++ b/druid/base/drag.lua @@ -22,10 +22,10 @@ --- Event on drag start callback(self, touch) -- @tfield DruidEvent on_drag_start @{DruidEvent} ---- on drag progress callback(self, dx, dy, total_x, total_y) +--- on drag progress callback(self, dx, dy, total_x, total_y, touch) -- @tfield DruidEvent on_drag Event @{DruidEvent} ---- Event on drag end callback(self, total_x, total_y) +--- Event on drag end callback(self, total_x, total_y, touch) -- @tfield DruidEvent on_drag_end @{DruidEvent} --- Is component now touching diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 58ba1b5..7a80620 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -50,6 +50,9 @@ --- Scroll view node -- @tfield node view_node +--- Scroll view size +-- @tfield vector3 view_size + --- Scroll content node -- @tfield node content_node diff --git a/druid/base/text.lua b/druid/base/text.lua index 3aaa063..39188f4 100755 --- a/druid/base/text.lua +++ b/druid/base/text.lua @@ -211,6 +211,9 @@ local function update_text_with_trim(self, trim_postfix) text_length = text_length - 1 new_text = utf8.sub(self.last_value, 1, text_length) text_width = self:get_text_size(new_text .. trim_postfix) + if text_length == 0 then + break + end end gui.set_text(self.node, new_text .. trim_postfix) diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index dc27bf5..74aa679 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -227,7 +227,7 @@ function M._fill_properties(word, metrics, settings) else -- Text properties word.scale = settings.scale * word.relative_scale * settings.adjust_scale - word.pivot = gui.PIVOT_W -- With this pivot adjustments works correctly, but with another some misalignment + word.pivot = gui.PIVOT_SW -- With this pivot adjustments works more correctly than with other pivots word.size = vmath.vector3(metrics.width, metrics.height, 0) word.offset = vmath.vector3(metrics.offset_x, metrics.offset_y, 0) end diff --git a/druid/custom/rich_text/rich_text.gui b/druid/custom/rich_text/rich_text.gui deleted file mode 100644 index 0d6a8fe..0000000 --- a/druid/custom/rich_text/rich_text.gui +++ /dev/null @@ -1,45 +0,0 @@ -fonts { - name: "game" - font: "/example/assets/fonts/game.font" -} -textures { - name: "items" - texture: "/example/assets/images/kenney.atlas" -} -nodes { - size { - x: 400.0 - y: 100.0 - } - type: TYPE_BOX - id: "root" - inherit_alpha: true - visible: false -} -nodes { - position { - x: -200.0 - } - size { - x: 400.0 - y: 100.0 - } - type: TYPE_TEXT - text: "Rich text" - font: "game" - id: "text_prefab" - pivot: PIVOT_W - parent: "root" - inherit_alpha: true - outline_alpha: 0.0 - shadow_alpha: 0.0 -} -nodes { - type: TYPE_BOX - id: "icon_prefab" - parent: "root" - inherit_alpha: true - size_mode: SIZE_MODE_AUTO -} -material: "/builtins/materials/gui.material" -adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index d4f08f9..29bb098 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -109,8 +109,8 @@ local RichText = component.create("rich_text") --- The @{RichText} constructor -- @tparam RichText self @{RichText} --- @tparam string template The Rich Text template name --- @tparam table nodes The node table, if prefab was copied by gui.clone_tree() +-- @tparam node|string text_node The text node to make Rich Text +-- @tparam string|nil value The initial text value. Default will be gui.get_text(text_node) function RichText.init(self, text_node, value) self.root = self:get_node(text_node) self.text_prefab = self.root diff --git a/druid/editor_scripts/druid.editor_script b/druid/editor_scripts/druid.editor_script index 6534c1d..f72488a 100644 --- a/druid/editor_scripts/druid.editor_script +++ b/druid/editor_scripts/druid.editor_script @@ -25,35 +25,6 @@ end function M.get_commands() return { - { - label = "Print GUI Scheme", - - locations = { "Outline" }, - - query = { - selection = {type = "outline", cardinality = "many"} - }, - - active = function(opts) - return true - end, - - run = function(opts) - print("local SCHEME = {") - - for i = 1, #opts.selection do - local file = opts.selection[i] - if editor.can_get(file, "id") then - local id = editor.get(file, "id") - print("\t" .. string.upper(id) .. " = \"" .. id .. "\",") - end - end - - print("}") - print("") - end - }, - { label = "Assign layers", diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index fa9adca..17aba86 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -84,6 +84,8 @@ end --- Set refresh function for DataList component -- @tparam DataList self @{DataList} +-- @tparam boolean is_use_cache Use cache version of DataList. Requires make setup of components in on_element_add callback and clean in on_element_remove +-- @treturn druid.data_list Current DataList instance function DataList.set_use_cache(self, is_use_cache) self._is_use_cache = is_use_cache return self @@ -280,7 +282,7 @@ end function DataList._refresh(self) self.scroll:set_size(self.grid:get_size_for(#self._data)) - local start_pos = -self.scroll.position + local start_pos = -self.scroll.position --[[@as vector3]] local start_index = self.grid:get_index(start_pos) start_index = math.max(1, start_index) diff --git a/druid/extended/figma_layout.lua b/druid/extended/figma_layout.lua deleted file mode 100644 index 0748a4e..0000000 --- a/druid/extended/figma_layout.lua +++ /dev/null @@ -1,392 +0,0 @@ -local helper = require("druid.helper") -local component = require("druid.component") - ----@class druid.figma_layout.row_data ----@field width number ----@field height number ----@field count number - ----@class druid.figma_layout.rows_data ----@field total_width number ----@field total_height number ----@field nodes_width table ----@field nodes_height table ----@field rows druid.figma_layout.row_data[]> - ----@class druid.figma_layout: druid.base_component -local M = component.create("layout") - - ---- The @{Layout} constructor --- @tparam Layout self @{Layout} --- @tparam node node Gui node --- @tparam string layout_type The layout mode (from const.LAYOUT_MODE) --- @tparam function|nil on_size_changed_callback The callback on window resize -function M:init(node, layout_type) - self.node = self:get_node(node) - - print(self.node) - self.is_dirty = true - self.entities = {} - self.margin = { x = 0, y = 0 } - self.padding = gui.get_slice9(self.node) - self.type = layout_type or "horizontal" - self.is_resize_width = false - self.is_resize_height = false - self.is_justify = false -end - - -function M:update() - if not self.is_dirty then - return - end - - self:refresh_layout() -end - - ----@param margin_x number|nil ----@param margin_y number|nil ----@return druid.figma_layout -function M:set_margin(margin_x, margin_y) - self.margin.x = margin_x or self.margin.x - self.margin.y = margin_y or self.margin.y - self.is_dirty = true - - return self -end - - ----@param padding vector4 The vector4 with padding values, where x - left, y - top, z - right, w - bottom -function M:set_padding(padding) - self.padding = padding - self.is_dirty = true - - return self -end - - -function M:set_dirty() - self.is_dirty = true - - return self -end - - ----@param is_justify boolean ----@return druid.figma_layout -function M:set_justify(is_justify) - self.is_justify = is_justify - self.is_dirty = true - - return self -end - - ----@param type string The layout type: "horizontal", "vertical", "horizontal_wrap" -function M:set_type(type) - self.type = type - self.is_dirty = true - - return self -end - - - ----@param is_hug_width boolean ----@param is_hug_height boolean ----@return druid.figma_layout -function M:set_hug_content(is_hug_width, is_hug_height) - self.is_resize_width = is_hug_width or false - self.is_resize_height = is_hug_height or false - self.is_dirty = true - - return self -end - ----@param node_or_node_id string|node ----@return druid.figma_layout -function M:add(node_or_node_id) - -- Acquire node from entity or by id - local node = node_or_node_id - if type(node_or_node_id) == "table" then - assert(node_or_node_id.node, "The entity should have a node") - node = node_or_node_id.node - else - ---@cast node_or_node_id string|node - node = self:get_node(node_or_node_id) - end - - ---@cast node node - table.insert(self.entities, node) - gui.set_parent(node, self.node) - - self.is_dirty = true - - return self -end - - ----@return druid.figma_layout -function M:refresh_layout() - local layout_node = self.node - - local entities = self.entities - local type = self.type -- vertical, horizontal, horizontal_wrap - local margin = self.margin -- {x: horizontal, y: vertical} in pixels, between elements - local padding = self.padding -- {x: left, y: top, z: right, w: bottom} in pixels - local is_justify = self.is_justify - local size = gui.get_size(layout_node) - local max_width = size.x - padding.x - padding.z - local max_height = size.y - padding.y - padding.w - local layout_pivot_offset = helper.get_pivot_offset(gui.get_pivot(layout_node)) -- {x: -0.5, y: -0.5} - is left bot, {x: 0.5, y: 0.5} - is right top - - local rows_data = self:calculate_rows_data() - local rows = rows_data.rows - local row_index = 1 - local row = rows[row_index] - - -- Current x and Current y is a top left corner of the node - local current_x = -row.width * (0.5 + layout_pivot_offset.x) - local current_y = rows_data.total_height * (0.5 - layout_pivot_offset.y) - - if is_justify then - if (type == "horizontal" or type == "horizontal_wrap") and row.count > 1 then - current_x = -max_width * (0.5 + layout_pivot_offset.x) - end - if type == "vertical" then - current_y = max_height * (0.5 - layout_pivot_offset.y) - end - end - - for index = 1, #entities do - local node = entities[index] - local node_width = rows_data.nodes_width[node] - local node_height = rows_data.nodes_height[node] - local pivot_offset = helper.get_pivot_offset(gui.get_pivot(node)) - - if node_width > 0 and node_height > 0 then - -- Calculate position for current node - local position_x, position_y - - if type == "horizontal" then - position_x = current_x + node_width * (0.5 + pivot_offset.x) - position_y = current_y - row.height * (0.5 - pivot_offset.y) - - local node_margin = margin.x - if is_justify and row.count > 1 then - node_margin = (max_width - row.width) / (row.count - 1) + margin.x - end - current_x = current_x + node_width + node_margin - end - - if type == "vertical" then - position_x = current_x + row.width * (0.5 - pivot_offset.x) - position_y = current_y - node_height * (0.5 + pivot_offset.y) - - local node_margin = margin.y - if is_justify then - node_margin = (max_height - rows_data.total_height) / (#rows - 1) + margin.y - end - - current_y = current_y - node_height - node_margin - end - - if type == "horizontal_wrap" then - local width = row.width - if is_justify and row.count > 0 then - width = math.max(row.width, max_width) - end - local new_row_width = width * (0.5 - layout_pivot_offset.x) - - -- Compare with eps due the float loss and element flickering - if current_x + node_width - new_row_width > 0.0001 then - if row_index < #rows then - row_index = row_index + 1 - row = rows[row_index] - end - - current_x = -row.width * (0.5 + layout_pivot_offset.x) - current_y = current_y - row.height - margin.y - if is_justify and row.count > 1 then - current_x = -max_width * (0.5 + layout_pivot_offset.x) - end - end - - position_x = current_x + node_width * (0.5 + pivot_offset.x) - position_y = current_y - row.height * (0.5 - pivot_offset.y) - - local node_margin = margin.x - if is_justify and row.count > 1 then - node_margin = (max_width - row.width) / (row.count - 1) + margin.x - end - current_x = current_x + node_width + node_margin - end - - do -- Padding offset - if layout_pivot_offset.x == -0.5 then - position_x = position_x + padding.x - end - if layout_pivot_offset.y == 0.5 then - position_y = position_y - padding.y - end - if layout_pivot_offset.x == 0.5 then - position_x = position_x - padding.z - end - if layout_pivot_offset.y == -0.5 then - position_y = position_y + padding.w - end - end - - self:set_node_position(node, position_x, position_y) - end - end - - if self.is_resize_width or self.is_resize_height then - if self.is_resize_width then - size.x = rows_data.total_width + padding.x + padding.z - end - if self.is_resize_height then - size.y = rows_data.total_height + padding.y + padding.w - end - gui.set_size(layout_node, size) - end - - self.is_dirty = false - - return self -end - - ----@return druid.figma_layout -function M:clear_layout() - for index = #self.entities, 1, -1 do - self.entities[index] = nil - end - - self.is_dirty = true - - return self -end - - ----@param node node ----@return number, number -function M.get_node_size(node) - if not gui.is_enabled(node, false) then - return 0, 0 - end - - local scale = gui.get_scale(node) - - -- If node has text - get text size instead of node size - if gui.get_text(node) then - local text_metrics = helper.get_text_metrics_from_node(node) - return text_metrics.width * scale.x, text_metrics.height * scale.y - end - - local size = gui.get_size(node) - return size.x * scale.x, size.y * scale.y -end - - ----Calculate rows data for layout. Contains total width, height and rows info (width, height, count of elements in row) ----@private ----@return druid.figma_layout.rows_data -function M:calculate_rows_data() - local entities = self.entities - local margin = self.margin - local type = self.type - local padding = self.padding - - local size = gui.get_size(self.node) - local max_width = size.x - padding.x - padding.z - - -- Collect rows info about width, height and count of elements in row - local current_row = { width = 0, height = 0, count = 0 } - local rows_data = { - total_width = 0, - total_height = 0, - nodes_width = {}, - nodes_height = {}, - rows = { current_row } - } - - for index = 1, #entities do - local node = entities[index] - local node_width = rows_data.nodes_width[node] - local node_height = rows_data.nodes_height[node] - - -- Get node size if it's not calculated yet - if not node_width or not node_height then - node_width, node_height = M.get_node_size(node) - rows_data.nodes_width[node] = node_width - rows_data.nodes_height[node] = node_height - end - - if node_width > 0 and node_height > 0 then - if type == "horizontal" then - current_row.width = current_row.width + node_width + margin.x - current_row.height = math.max(current_row.height, node_height) - current_row.count = current_row.count + 1 - end - - if type == "vertical" then - if current_row.count > 0 then - current_row = { width = 0, height = 0, count = 0 } - table.insert(rows_data.rows, current_row) - end - - current_row.width = math.max(current_row.width, node_width + margin.x) - current_row.height = node_height - current_row.count = current_row.count + 1 - end - - if type == "horizontal_wrap" then - if current_row.width + node_width > max_width and current_row.count > 0 then - current_row = { width = 0, height = 0, count = 0 } - table.insert(rows_data.rows, current_row) - end - - current_row.width = current_row.width + node_width + margin.x - current_row.height = math.max(current_row.height, node_height) - current_row.count = current_row.count + 1 - end - end - end - - -- Remove last margin of each row - -- Calculate total width and height - local rows_count = #rows_data.rows - for index = 1, rows_count do - local row = rows_data.rows[index] - if row.width > 0 then - row.width = row.width - margin.x - end - - rows_data.total_width = math.max(rows_data.total_width, row.width) - rows_data.total_height = rows_data.total_height + row.height - end - - rows_data.total_height = rows_data.total_height + margin.y * (rows_count - 1) - return rows_data -end - - ----@private ----@param node node ----@param x number ----@param y number ----@return node -function M:set_node_position(node, x, y) - local position = gui.get_position(node) - position.x = x - position.y = y - gui.set_position(node, position) - - return node -end - - -return M \ No newline at end of file diff --git a/druid/extended/hotkey.lua b/druid/extended/hotkey.lua index 283839c..41507bd 100644 --- a/druid/extended/hotkey.lua +++ b/druid/extended/hotkey.lua @@ -27,7 +27,6 @@ local helper = require("druid.helper") local component = require("druid.component") local Event = require("druid.event") -local const = require("druid.const") local Hotkey = component.create("hotkey") diff --git a/druid/extended/layout.lua b/druid/extended/layout.lua index ff24fef..d8ac732 100644 --- a/druid/extended/layout.lua +++ b/druid/extended/layout.lua @@ -1,4 +1,4 @@ --- Copyright (c) 2021 Maksim Tuprikov . This code is licensed under MIT license +-- Copyright (c) 2024 Maksim Tuprikov . This code is licensed under MIT license --- Layout management on node -- @@ -13,205 +13,406 @@ --- Current layout mode -- @tfield string mode ----On window resize callback(self, new_size) --- @tfield DruidEvent on_size_changed @{DruidEvent} - --- - -local const = require("druid.const") local helper = require("druid.helper") local component = require("druid.component") -local Event = require("druid.event") +-- @class druid.layout.row_data +-- @tfield width number +-- @tfield height number +-- @tfield count number -local Layout = component.create("layout") +-- @class druid.layout.rows_data +-- @tfield total_width number +-- @tfield total_height number +-- @tfield nodes_width table +-- @tfield nodes_height table +-- @tfield rows druid.layout.row_data[]> +-- @class druid.layout: druid.base_component +local M = component.create("layout") ---- The @{Layout} constructor +-- The @{Layout} constructor -- @tparam Layout self @{Layout} -- @tparam node node Gui node --- @tparam string mode The layout mode (from const.LAYOUT_MODE) +-- @tparam string layout_type The layout mode (from const.LAYOUT_MODE) -- @tparam function|nil on_size_changed_callback The callback on window resize -function Layout.init(self, node, mode, on_size_changed_callback) +function M.init(self, node, layout_type) self.node = self:get_node(node) - self._min_size = nil - self._max_size = nil - self._current_size = vmath.vector3(0) - self._inited = false - self._max_gui_upscale = nil - self._fit_node = nil - - self._anchors = {} - - self.mode = mode or const.LAYOUT_MODE.FIT - - self.on_size_changed = Event(on_size_changed_callback) + self.is_dirty = true + self.entities = {} + self.margin = { x = 0, y = 0 } + self.padding = gui.get_slice9(self.node) + self.type = layout_type or "horizontal" + self.is_resize_width = false + self.is_resize_height = false + self.is_justify = false end - -function Layout.on_late_init(self) - self._inited = true - self.origin_size = self.origin_size or gui.get_size(self.node) - self.fit_size = self.fit_size or vmath.vector3(self.origin_size) - self.pivot = helper.get_pivot_offset(gui.get_pivot(self.node)) - self.origin_position = gui.get_position(self.node) - self.position = vmath.vector3(self.origin_position) - gui.set_size_mode(self.node, gui.SIZE_MODE_MANUAL) - gui.set_adjust_mode(self.node, gui.ADJUST_FIT) - self:on_window_resized() -end - - -function Layout.on_window_resized(self) - if not self._inited then +function M:update() + if not self.is_dirty then return end - local x_koef, y_koef = helper.get_screen_aspect_koef() - - local revert_scale = 1 - if self._max_gui_upscale then - revert_scale = self._max_gui_upscale / helper.get_gui_scale() - revert_scale = math.min(revert_scale, 1) - end - gui.set_scale(self.node, vmath.vector3(revert_scale)) - - if self._fit_node then - self.fit_size = gui.get_size(self._fit_node) - self.fit_size.x = self.fit_size.x / x_koef - self.fit_size.y = self.fit_size.y / y_koef - end - - x_koef = self.fit_size.x / self.origin_size.x * x_koef - y_koef = self.fit_size.y / self.origin_size.y * y_koef - - local new_size = vmath.vector3(self.origin_size) - - if self.mode == const.LAYOUT_MODE.STRETCH then - new_size.x = new_size.x * x_koef / revert_scale - new_size.y = new_size.y * y_koef / revert_scale - end - - if self.mode == const.LAYOUT_MODE.STRETCH_X then - new_size.x = new_size.x * x_koef / revert_scale - end - - if self.mode == const.LAYOUT_MODE.STRETCH_Y then - new_size.y = new_size.y * y_koef / revert_scale - end - - -- Fit to the stretched container (node size or other defined) - if self.mode == const.LAYOUT_MODE.ZOOM_MIN then - new_size = new_size * math.min(x_koef, y_koef) - end - if self.mode == const.LAYOUT_MODE.ZOOM_MAX then - new_size = new_size * math.max(x_koef, y_koef) - end - - if self._min_size then - new_size.x = math.max(new_size.x, self._min_size.x) - new_size.y = math.max(new_size.y, self._min_size.y) - end - if self._max_size then - new_size.x = math.min(new_size.x, self._max_size.x) - new_size.y = math.min(new_size.y, self._max_size.y) - end - self._current_size = new_size - gui.set_size(self.node, new_size) - - self.position.x = self.origin_position.x + self.origin_position.x * (x_koef - 1) - self.position.y = self.origin_position.y + self.origin_position.y * (y_koef - 1) - gui.set_position(self.node, self.position) - - self.on_size_changed:trigger(self:get_context(), new_size) + self:refresh_layout() end ---- Set minimal size of layout node -- @tparam Layout self @{Layout} --- @tparam vector3 min_size --- @treturn Layout @{Layout} -function Layout.set_min_size(self, min_size) - self._min_size = min_size +-- @tparam number|nil margin_x +-- @tparam number|nil margin_y +-- @treturn druid.layout @{Layout} +function M.set_margin(self, margin_x, margin_y) + self.margin.x = margin_x or self.margin.x + self.margin.y = margin_y or self.margin.y + self.is_dirty = true + return self end ---- Set maximum size of layout node -- @tparam Layout self @{Layout} --- @tparam vector3 max_size --- @treturn Layout @{Layout} -function Layout.set_max_size(self, max_size) - self._max_size = max_size +-- @tparam vector4 padding The vector4 with padding values, where x - left, y - top, z - right, w - bottom +-- @treturn druid.layout @{Layout} +function M.set_padding(self, padding) + self.padding = padding + self.is_dirty = true + return self end ---- Set new origin position of layout node. You should apply this on node movement -- @tparam Layout self @{Layout} --- @tparam vector3 new_origin_position --- @treturn Layout @{Layout} -function Layout.set_origin_position(self, new_origin_position) - self.origin_position = new_origin_position or self.origin_position - self:on_window_resized() +-- @treturn druid.layout @{Layout} +function M.set_dirty(self) + self.is_dirty = true + return self end ---- Set new origin size of layout node. You should apply this on node manual size change -- @tparam Layout self @{Layout} --- @tparam vector3 new_origin_size --- @treturn Layout @{Layout} -function Layout.set_origin_size(self, new_origin_size) - self.origin_size = new_origin_size or self.origin_size - self:on_window_resized() +-- @tparam boolean is_justify +-- @treturn druid.layout @{Layout} +function M.set_justify(self, is_justify) + self.is_justify = is_justify + self.is_dirty = true + return self end ---- Set max gui upscale for FIT adjust mode (or side). It happens on bigger render gui screen -- @tparam Layout self @{Layout} --- @tparam number max_gui_upscale --- @treturn Layout @{Layout} -function Layout.set_max_gui_upscale(self, max_gui_upscale) - self._max_gui_upscale = max_gui_upscale - self:on_window_resized() -end +-- @tparam string type The layout type: "horizontal", "vertical", "horizontal_wrap" +-- @treturn druid.layout @{Layout} +function M.set_type(self, type) + self.type = type + self.is_dirty = true - ---- Set size for layout node to fit inside it --- @tparam Layout self @{Layout} --- @tparam vector3 target_size --- @treturn Layout @{Layout} -function Layout.fit_into_size(self, target_size) - self.fit_size = target_size - self:on_window_resized() return self end ---- Set node for layout node to fit inside it. Pass nil to reset -- @tparam Layout self @{Layout} --- @tparam node|nil node --- @treturn Layout @{Layout} -function Layout.fit_into_node(self, node) - self._fit_node = node - self:on_window_resized() +-- @tparam boolean is_hug_width +-- @tparam boolean is_hug_height +-- @treturn druid.layout @{Layout} +function M.set_hug_content(self, is_hug_width, is_hug_height) + self.is_resize_width = is_hug_width or false + self.is_resize_height = is_hug_height or false + self.is_dirty = true + return self end ---- Set current size for layout node to fit inside it -- @tparam Layout self @{Layout} --- @treturn Layout @{Layout} -function Layout.fit_into_window(self) - return self:fit_into_size(vmath.vector3( - gui.get_width(), - gui.get_height(), - 0)) +-- @tparam string|node node_or_node_id +-- @treturn druid.layout @{Layout} +function M.add(self, node_or_node_id) + -- Acquire node from entity or by id + local node = node_or_node_id + if type(node_or_node_id) == "table" then + assert(node_or_node_id.node, "The entity should have a node") + node = node_or_node_id.node + else + -- @cast node_or_node_id string|node + node = self:get_node(node_or_node_id) + end + + -- @cast node node + table.insert(self.entities, node) + gui.set_parent(node, self.node) + + self.is_dirty = true + + return self end -return Layout +-- @tparam Layout self @{Layout} +-- @treturn druid.layout @{Layout} +function M.refresh_layout(self) + local layout_node = self.node + + local entities = self.entities + local type = self.type -- vertical, horizontal, horizontal_wrap + local margin = self.margin -- {x: horizontal, y: vertical} in pixels, between elements + local padding = self.padding -- {x: left, y: top, z: right, w: bottom} in pixels + local is_justify = self.is_justify + local size = gui.get_size(layout_node) + local max_width = size.x - padding.x - padding.z + local max_height = size.y - padding.y - padding.w + local layout_pivot_offset = helper.get_pivot_offset(gui.get_pivot(layout_node)) -- {x: -0.5, y: -0.5} - is left bot, {x: 0.5, y: 0.5} - is right top + + local rows_data = self:calculate_rows_data() + local rows = rows_data.rows + local row_index = 1 + local row = rows[row_index] + + -- Current x and Current y is a top left corner of the node + local current_x = -row.width * (0.5 + layout_pivot_offset.x) + local current_y = rows_data.total_height * (0.5 - layout_pivot_offset.y) + + if is_justify then + if (type == "horizontal" or type == "horizontal_wrap") and row.count > 1 then + current_x = -max_width * (0.5 + layout_pivot_offset.x) + end + if type == "vertical" then + current_y = max_height * (0.5 - layout_pivot_offset.y) + end + end + + for index = 1, #entities do + local node = entities[index] + local node_width = rows_data.nodes_width[node] + local node_height = rows_data.nodes_height[node] + local pivot_offset = helper.get_pivot_offset(gui.get_pivot(node)) + + if node_width > 0 and node_height > 0 then + -- Calculate position for current node + local position_x, position_y + + if type == "horizontal" then + position_x = current_x + node_width * (0.5 + pivot_offset.x) + position_y = current_y - row.height * (0.5 - pivot_offset.y) + + local node_margin = margin.x + if is_justify and row.count > 1 then + node_margin = (max_width - row.width) / (row.count - 1) + margin.x + end + current_x = current_x + node_width + node_margin + end + + if type == "vertical" then + position_x = current_x + row.width * (0.5 - pivot_offset.x) + position_y = current_y - node_height * (0.5 + pivot_offset.y) + + local node_margin = margin.y + if is_justify then + node_margin = (max_height - rows_data.total_height) / (#rows - 1) + margin.y + end + + current_y = current_y - node_height - node_margin + end + + if type == "horizontal_wrap" then + local width = row.width + if is_justify and row.count > 0 then + width = math.max(row.width, max_width) + end + local new_row_width = width * (0.5 - layout_pivot_offset.x) + + -- Compare with eps due the float loss and element flickering + if current_x + node_width - new_row_width > 0.0001 then + if row_index < #rows then + row_index = row_index + 1 + row = rows[row_index] + end + + current_x = -row.width * (0.5 + layout_pivot_offset.x) + current_y = current_y - row.height - margin.y + if is_justify and row.count > 1 then + current_x = -max_width * (0.5 + layout_pivot_offset.x) + end + end + + position_x = current_x + node_width * (0.5 + pivot_offset.x) + position_y = current_y - row.height * (0.5 - pivot_offset.y) + + local node_margin = margin.x + if is_justify and row.count > 1 then + node_margin = (max_width - row.width) / (row.count - 1) + margin.x + end + current_x = current_x + node_width + node_margin + end + + do -- Padding offset + if layout_pivot_offset.x == -0.5 then + position_x = position_x + padding.x + end + if layout_pivot_offset.y == 0.5 then + position_y = position_y - padding.y + end + if layout_pivot_offset.x == 0.5 then + position_x = position_x - padding.z + end + if layout_pivot_offset.y == -0.5 then + position_y = position_y + padding.w + end + end + + self:set_node_position(node, position_x, position_y) + end + end + + if self.is_resize_width or self.is_resize_height then + if self.is_resize_width then + size.x = rows_data.total_width + padding.x + padding.z + end + if self.is_resize_height then + size.y = rows_data.total_height + padding.y + padding.w + end + gui.set_size(layout_node, size) + end + + self.is_dirty = false + + return self +end + + +-- @tparam Layout self @{Layout} +-- @treturn druid.layout @{Layout} +function M.clear_layout(self) + for index = #self.entities, 1, -1 do + self.entities[index] = nil + end + + self.is_dirty = true + + return self +end + + +-- @private +-- @tparam node node +-- @treturn number, number +function M.get_node_size(node) + if not gui.is_enabled(node, false) then + return 0, 0 + end + + local scale = gui.get_scale(node) + + -- If node has text - get text size instead of node size + if gui.get_text(node) then + local text_metrics = helper.get_text_metrics_from_node(node) + return text_metrics.width * scale.x, text_metrics.height * scale.y + end + + local size = gui.get_size(node) + return size.x * scale.x, size.y * scale.y +end + + +-- @private +-- @tparam Layout self @{Layout} +-- Calculate rows data for layout. Contains total width, height and rows info (width, height, count of elements in row) +-- @treturn druid.layout.rows_data +function M.calculate_rows_data(self) + local entities = self.entities + local margin = self.margin + local type = self.type + local padding = self.padding + + local size = gui.get_size(self.node) + local max_width = size.x - padding.x - padding.z + + -- Collect rows info about width, height and count of elements in row + local current_row = { width = 0, height = 0, count = 0 } + local rows_data = { + total_width = 0, + total_height = 0, + nodes_width = {}, + nodes_height = {}, + rows = { current_row } + } + + for index = 1, #entities do + local node = entities[index] + local node_width = rows_data.nodes_width[node] + local node_height = rows_data.nodes_height[node] + + -- Get node size if it's not calculated yet + if not node_width or not node_height then + node_width, node_height = M.get_node_size(node) + rows_data.nodes_width[node] = node_width + rows_data.nodes_height[node] = node_height + end + + if node_width > 0 and node_height > 0 then + if type == "horizontal" then + current_row.width = current_row.width + node_width + margin.x + current_row.height = math.max(current_row.height, node_height) + current_row.count = current_row.count + 1 + end + + if type == "vertical" then + if current_row.count > 0 then + current_row = { width = 0, height = 0, count = 0 } + table.insert(rows_data.rows, current_row) + end + + current_row.width = math.max(current_row.width, node_width + margin.x) + current_row.height = node_height + current_row.count = current_row.count + 1 + end + + if type == "horizontal_wrap" then + if current_row.width + node_width > max_width and current_row.count > 0 then + current_row = { width = 0, height = 0, count = 0 } + table.insert(rows_data.rows, current_row) + end + + current_row.width = current_row.width + node_width + margin.x + current_row.height = math.max(current_row.height, node_height) + current_row.count = current_row.count + 1 + end + end + end + + -- Remove last margin of each row + -- Calculate total width and height + local rows_count = #rows_data.rows + for index = 1, rows_count do + local row = rows_data.rows[index] + if row.width > 0 then + row.width = row.width - margin.x + end + + rows_data.total_width = math.max(rows_data.total_width, row.width) + rows_data.total_height = rows_data.total_height + row.height + end + + rows_data.total_height = rows_data.total_height + margin.y * (rows_count - 1) + return rows_data +end + +-- @private +-- @tparam node node +-- @tparam number x +-- @tparam number y +-- @treturn node +function M:set_node_position(node, x, y) + local position = gui.get_position(node) + position.x = x + position.y = y + gui.set_position(node, position) + + return node +end + +return M diff --git a/druid/extended/slider.lua b/druid/extended/slider.lua index 22bd4e4..7af97d3 100644 --- a/druid/extended/slider.lua +++ b/druid/extended/slider.lua @@ -151,6 +151,8 @@ function Slider.on_input(self, action_id, action) self.value = (self.target_pos.y - self.start_pos.y) / self.dist.y end + self.value = math.abs(self.value) + if self.steps then local closest_dist = 1000 local closest = nil diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 2ce473e..1a857b9 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -42,15 +42,15 @@ M["button"] = { end, on_click_disabled = function(self, node) - settings.play_sound(M.button.BTN_SOUND_DISABLED) + local start_pos = self.start_pos + gui.animate(node, "position.x", start_pos.x - 3, gui.EASING_OUTSINE, 0.05, 0, function() + gui.animate(node, "position.x", start_pos.x + 3, gui.EASING_OUTSINE, 0.1, 0, function() + gui.animate(node, "position.x", start_pos.x, gui.EASING_OUTSINE, 0.05) + end) + end) end, on_set_enabled = function(self, node, state) - if state then - gui.set_color(node, M.button.ENABLED_COLOR) - else - gui.set_color(node, M.button.DISABLED_COLOR) - end end } diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index 52a43c5..4f8f31b 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -247,7 +247,7 @@ function DruidInstance.initialize(self, context, style) end ---- Create new component. +-- Create new component. -- @tparam DruidInstance self -- @tparam BaseComponent component Component module -- @tparam any ... Other component params to pass it to component:init function @@ -776,9 +776,8 @@ end -- @tparam DruidInstance self -- @tparam string|node node The_node id or gui.get_node(node_id). -- @tparam string mode The layout mode --- @tparam function|nil on_size_changed_callback The callback on window resize -- @treturn Layout @{Layout} component -function DruidInstance.new_layout(self, node, mode, on_size_changed_callback) +function DruidInstance.new_layout(self, node, mode) return helper.require_component_message("layout") end diff --git a/druid/system/utf8.lua b/druid/system/utf8.lua index 7f13914..6c99fcf 100644 --- a/druid/system/utf8.lua +++ b/druid/system/utf8.lua @@ -688,7 +688,8 @@ local function matcherGenerator(regex, plain) local sum = 0 local bc, ec = utf8sub(str, 1, 1), utf8sub(str, 2, 2) local skip = len(bc) + len(ec) - bc, ec = utf8unicode(bc), utf8unicode(ec) + bc = utf8unicode(bc) --[[@as string]] + ec = utf8unicode(ec) --[[@as string]] return function(cC) if cC == ec and sum > 0 then sum = sum - 1 diff --git a/druid/templates/component.template.lua b/druid/templates/component.template.lua index df48277..d67bf32 100644 --- a/druid/templates/component.template.lua +++ b/druid/templates/component.template.lua @@ -3,18 +3,13 @@ local component = require("druid.component") ---@class component_name : druid.base_component local Component = component.create("component_name") -local SCHEME = { - ROOT = "root", - BUTTON = "button", -} - -- Component constructor. Template name and nodes are optional. Pass it if you use it in your component function Component:init(template, nodes) self.druid = self:get_druid(template, nodes) - self.root = self:get_node(SCHEME.ROOT) + self.root = self:get_node("root") - self.button = self.druid:new_button(SCHEME.BUTTON, function() end) + self.button = self.druid:new_button("button", function() end) end diff --git a/druid/templates/component_full.template.lua b/druid/templates/component_full.template.lua index e4a2f7a..1978cf2 100644 --- a/druid/templates/component_full.template.lua +++ b/druid/templates/component_full.template.lua @@ -3,13 +3,6 @@ local component = require("druid.component") ---@class component_name : druid.base_component local Component = component.create("component_name") --- Scheme of component gui nodes -local SCHEME = { - ROOT = "root", - BUTTON = "button", -} - - -- Component constructor. Template name and nodes are optional. Pass it if you use it in your component function Component:init(template, nodes) -- If your component is gui template, pass the template name and set it @@ -18,7 +11,7 @@ function Component:init(template, nodes) self.druid = self:get_druid(template, nodes) -- self:get_node will auto process component template and nodes - self.root = self:get_node(SCHEME.ROOT) + self.root = self:get_node("root") end diff --git a/example/examples/data_list/with_component/button_component/button_component.lua b/example/examples/data_list/with_component/button_component/button_component.lua index 39c6c23..2609c8e 100644 --- a/example/examples/data_list/with_component/button_component/button_component.lua +++ b/example/examples/data_list/with_component/button_component/button_component.lua @@ -14,24 +14,15 @@ local component = require("druid.component") ---@field druid druid_instance local ButtonComponent = component.create("button_component") -local SCHEME = { - ROOT = "root", - TEXT = "text", - ICON = "icon", - CHECKBOX = "checkbox" -} - ---@param template string ---@param nodes table function ButtonComponent:init(template, nodes) - self:set_template(template) - self:set_nodes(nodes) - self.druid = self:get_druid() + self.druid = self:get_druid(template, nodes) - self.root = self:get_node(SCHEME.ROOT) - self.text = self.druid:new_text(SCHEME.TEXT) - self.checkbox = self:get_node(SCHEME.CHECKBOX) + self.root = self:get_node("root") + self.text = self.druid:new_text("text") + self.checkbox = self:get_node("checkbox") self.button = self.druid:new_button(self.root, self._on_click) diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index cc258b2..a72a32e 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -7,6 +7,8 @@ ---@field height number ---@field offset_x number|nil ---@field offset_y number|nil +---@field max_ascent number +---@field max_descent number ---@field node_size vector3|nil @For images only ---@class druid.rich_text.lines_metrics @@ -47,6 +49,7 @@ ---@field parent node ---@field size number ---@field fonts table +---@field scale vector3 ---@field color vector4 ---@field shadow vector4 ---@field outline vector4 @@ -54,12 +57,9 @@ ---@field image_pixel_grid_snap boolean ---@field combine_words boolean ---@field default_animation string ----@field node_prefab node ---@field text_prefab node ----@field text_scale vector3 ---@field adjust_scale number ---@field default_texture string ----@field node_scale vector3 ---@field is_multiline boolean ---@field text_leading number ---@field font hash @@ -71,3 +71,22 @@ ---@field height number ---@field max_ascent number ---@field max_descent number + +---@class utf8 +---@field len fun(string: string): number +---@field sub fun(string: string, i: number, j: number): string +---@field gmatch fun(string: string, pattern: string): fun(): string +---@field gsub fun(string: string, pattern: string, repl: string, n: number): string +---@field char fun(...: number): string +---@field byte fun(string: string, i: number, j: number): number + + +---Add generics to some functions. + +---Create new component. +---@generic T: druid.base_component +---@param self druid_instance +---@param component T Component module +---@param ... any Other component params to pass it to component:init function +---@return T Component instance +function druid_instance.new(self, component, ...) end \ No newline at end of file From ea80c874f6c0ea175b317d01ac45c567db9179c7 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 19:43:36 +0300 Subject: [PATCH 39/45] Update annotations --- docs/modules/DataList.html | 103 +++++++++++++++++++++++++++ docs/modules/RichText.html | 15 +--- druid/annotations.lua | 46 ++++++++++-- druid/custom/rich_text/module/rt.lua | 1 - druid/custom/rich_text/rich_text.lua | 27 +------ druid/extended/data_list.lua | 15 ++-- druid/extended/layout.lua | 6 +- utils/annotations_manual.lua | 22 ++++-- 8 files changed, 170 insertions(+), 65 deletions(-) diff --git a/docs/modules/DataList.html b/docs/modules/DataList.html index 7dcbdbe..68df37a 100644 --- a/docs/modules/DataList.html +++ b/docs/modules/DataList.html @@ -83,6 +83,10 @@

    Functions

  • Return current text adjust type
    get_text_index_by_width(self, width)Get chars count by width
    get_text_size(self, text) Calculate text width with font with respect to trailing space
    + + + + @@ -112,6 +116,14 @@ + + + + + + + + @@ -167,6 +179,39 @@

    Functions

    +
    + + add(self, data, index, shift_policy) +
    +
    + Add element to DataList. Currenly untested + + +

    Parameters:

    +
      +
    • self + DataList + DataList +
    • +
    • data + table + +
    • +
    • index + number or nil + +
    • +
    • shift_policy + number or nil + The constant from const.SHIFT.* +
    • +
    + + + + + +
    clear(self) @@ -347,6 +392,64 @@ + +
    + + remove(self, index, shift_policy) +
    +
    + Remove element from DataList. Currenly untested + + +

    Parameters:

    +
      +
    • self + DataList + DataList +
    • +
    • index + number or nil + +
    • +
    • shift_policy + number or nil + The constant from const.SHIFT.* +
    • +
    + + + + + +
    +
    + + remove_by_data(self, data, shift_policy) +
    +
    + Remove element from DataList by data value. Currenly untested + + +

    Parameters:

    +
      +
    • self + DataList + DataList +
    • +
    • data + table + +
    • +
    • shift_policy + number or nil + The constant from const.SHIFT.* +
    • +
    + + + + +
    diff --git a/docs/modules/RichText.html b/docs/modules/RichText.html index c72269b..ec185a8 100644 --- a/docs/modules/RichText.html +++ b/docs/modules/RichText.html @@ -81,19 +81,7 @@ # Overview #

    This custom component is inspired by defold-richtext by britzl. It uses a similar syntax for tags but currently supports fewer tags. -

    All parameters for the Rich Text component are adjusted in the GUI scene. -

    This component uses GUI component template. (/druid/custom/rich_text/rich_text.gui). -

    You able to customize it or make your own with the next node scructure: -

    root -

    - text_prefab -

    - icon_prefab -

    # Rich Text Setup # -

    • Root node size: Set the maximum width and height of the text. -

    • Root anchor: Define the alignment of the Rich Text inside the root node size area. -

    • Text prefab: Configure all default text parameters for the text node. -

    • Text prefab anchor: Set the anchor for each text node (adjust this only if animating text). -

    • Icon prefab: Configure all default node parameters for the icon node. -

    • Icon prefab anchor: Set the anchor for each icon node (adjust this only if animating the icon). +

    Create Rich Text on your GUI Text Node. All properties of the text node will be used as default for the text.

    # Notes #

    • Nested tags are supported

    Example Link

    @@ -119,7 +107,6 @@ self.rich_text:set_text("Hello, Druid Rich Text!") outline: vector4, font: string, image: druid.rich_text.image, - default_animation: string, br: boolean, nobr: boolean, } diff --git a/druid/annotations.lua b/druid/annotations.lua index c8e29dd..3e8be27 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -321,6 +321,14 @@ function druid__checkbox_group.set_state(self, indexes, is_instant) end ---@field top_index number The current top index of visual elements local druid__data_list = {} +--- Add element to DataList. +--- Currenly untested +---@param self druid.data_list @{DataList} +---@param data table +---@param index number|nil +---@param shift_policy number|nil The constant from const.SHIFT.* +function druid__data_list.add(self, data, index, shift_policy) end + --- Clear the DataList and refresh visuals ---@param self druid.data_list @{DataList} function druid__data_list.clear(self) end @@ -356,6 +364,20 @@ function druid__data_list.init(self, scroll, grid, create_function) end ---@param self druid.data_list @{DataList} function druid__data_list.on_remove(self) end +--- Remove element from DataList. +--- Currenly untested +---@param self druid.data_list @{DataList} +---@param index number|nil +---@param shift_policy number|nil The constant from const.SHIFT.* +function druid__data_list.remove(self, index, shift_policy) end + +--- Remove element from DataList by data value. +--- Currenly untested +---@param self druid.data_list @{DataList} +---@param data table +---@param shift_policy number|nil The constant from const.SHIFT.* +function druid__data_list.remove_by_data(self, data, shift_policy) end + --- Instant scroll to element with passed index ---@param self druid.data_list @{DataList} ---@param index number @@ -1903,6 +1925,8 @@ function helper.table_to_string(t) end ---@field height number ---@field offset_x number|nil ---@field offset_y number|nil +---@field max_ascent number +---@field max_descent number ---@field node_size vector3|nil @For images only ---@class druid.rich_text.lines_metrics @@ -1967,12 +1991,22 @@ function helper.table_to_string(t) end ---@field max_descent number ---@class utf8 ----@field len fun(string: string): number ----@field sub fun(string: string, i: number, j: number): string ----@field gmatch fun(string: string, pattern: string): fun(): string ----@field gsub fun(string: string, pattern: string, repl: string, n: number): string ----@field char fun(...: number): string ----@field byte fun(string: string, i: number, j: number): number +---@field len fun(s: string):number +---@field sub fun(s: string, start_index: number, length: number) +---@field reverse fun() +---@field char fun() +---@field unicode fun() +---@field gensub fun() +---@field byte fun() +---@field find fun() +---@field match fun(s: string, m: string) +---@field gmatch fun(s: string, m: string) +---@field gsub fun() +---@field dump fun() +---@field format fun() +---@field lower fun() +---@field upper fun() +---@field rep fun() ---Add generics to some functions. diff --git a/druid/custom/rich_text/module/rt.lua b/druid/custom/rich_text/module/rt.lua index 74aa679..8baa48c 100755 --- a/druid/custom/rich_text/module/rt.lua +++ b/druid/custom/rich_text/module/rt.lua @@ -12,7 +12,6 @@ local utf8_lua = require("druid.system.utf8") local utf8 = utf8 or utf8_lua local VECTOR_ZERO = vmath.vector3(0) -local VECTOR_ONE = vmath.vector3(1) local COLOR_WHITE = vmath.vector4(1) local M = {} diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index 29bb098..b3d4973 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -6,31 +6,7 @@ -- This custom component is inspired by defold-richtext by britzl. -- It uses a similar syntax for tags but currently supports fewer tags. -- --- All parameters for the Rich Text component are adjusted in the GUI scene. --- --- This component uses GUI component template. (/druid/custom/rich_text/rich_text.gui). --- --- You able to customize it or make your own with the next node scructure: --- --- root --- --- - text_prefab --- --- - icon_prefab --- --- # Rich Text Setup # --- --- • Root node size: Set the maximum width and height of the text. --- --- • Root anchor: Define the alignment of the Rich Text inside the root node size area. --- --- • Text prefab: Configure all default text parameters for the text node. --- --- • Text prefab anchor: Set the anchor for each text node (adjust this only if animating text). --- --- • Icon prefab: Configure all default node parameters for the icon node. --- --- • Icon prefab anchor: Set the anchor for each icon node (adjust this only if animating the icon). +-- Create Rich Text on your GUI Text Node. All properties of the text node will be used as default for the text. -- -- # Notes # -- @@ -58,7 +34,6 @@ -- outline: vector4, -- font: string, -- image: druid.rich_text.image, --- default_animation: string, -- br: boolean, -- nobr: boolean, -- } diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index 17aba86..e28714f 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -115,9 +115,8 @@ end --- Add element to DataList. Currenly untested -- @tparam DataList self @{DataList} -- @tparam table data --- @tparam number index --- @tparam number shift_policy The constant from const.SHIFT.* --- @local +-- @tparam number|nil index +-- @tparam number|nil shift_policy The constant from const.SHIFT.* function DataList.add(self, data, index, shift_policy) index = index or #self._data + 1 shift_policy = shift_policy or const.SHIFT.RIGHT @@ -129,9 +128,8 @@ end --- Remove element from DataList. Currenly untested -- @tparam DataList self @{DataList} --- @tparam number index --- @tparam number shift_policy The constant from const.SHIFT.* --- @local +-- @tparam number|nil index +-- @tparam number|nil shift_policy The constant from const.SHIFT.* function DataList.remove(self, index, shift_policy) helper.remove_with_shift(self._data, index, shift_policy) self:_refresh() @@ -140,9 +138,8 @@ end --- Remove element from DataList by data value. Currenly untested -- @tparam DataList self @{DataList} --- @tparam tabe data --- @tparam number shift_policy The constant from const.SHIFT.* --- @local +-- @tparam table data +-- @tparam number|nil shift_policy The constant from const.SHIFT.* function DataList.remove_by_data(self, data, shift_policy) local index = helper.contains(self._data, data) if index then diff --git a/druid/extended/layout.lua b/druid/extended/layout.lua index d8ac732..7d2dc04 100644 --- a/druid/extended/layout.lua +++ b/druid/extended/layout.lua @@ -297,9 +297,9 @@ function M.clear_layout(self) end --- @private -- @tparam node node -- @treturn number, number +-- @local function M.get_node_size(node) if not gui.is_enabled(node, false) then return 0, 0 @@ -318,10 +318,10 @@ function M.get_node_size(node) end --- @private -- @tparam Layout self @{Layout} -- Calculate rows data for layout. Contains total width, height and rows info (width, height, count of elements in row) -- @treturn druid.layout.rows_data +-- @local function M.calculate_rows_data(self) local entities = self.entities local margin = self.margin @@ -401,11 +401,11 @@ function M.calculate_rows_data(self) return rows_data end --- @private -- @tparam node node -- @tparam number x -- @tparam number y -- @treturn node +-- @local function M:set_node_position(node, x, y) local position = gui.get_position(node) position.x = x diff --git a/utils/annotations_manual.lua b/utils/annotations_manual.lua index a72a32e..ab4169d 100644 --- a/utils/annotations_manual.lua +++ b/utils/annotations_manual.lua @@ -73,12 +73,22 @@ ---@field max_descent number ---@class utf8 ----@field len fun(string: string): number ----@field sub fun(string: string, i: number, j: number): string ----@field gmatch fun(string: string, pattern: string): fun(): string ----@field gsub fun(string: string, pattern: string, repl: string, n: number): string ----@field char fun(...: number): string ----@field byte fun(string: string, i: number, j: number): number +---@field len fun(s: string):number +---@field sub fun(s: string, start_index: number, length: number) +---@field reverse fun() +---@field char fun() +---@field unicode fun() +---@field gensub fun() +---@field byte fun() +---@field find fun() +---@field match fun(s: string, m: string) +---@field gmatch fun(s: string, m: string) +---@field gsub fun() +---@field dump fun() +---@field format fun() +---@field lower fun() +---@field upper fun() +---@field rep fun() ---Add generics to some functions. From e8dbc097d016f823409f95214933ac48554681c5 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 21:35:51 +0300 Subject: [PATCH 40/45] Update --- README.md | 2 +- deployer_build_stats.csv | 1 + docs_md/changelog.md | 25 + druid/base/scroll.lua | 2 +- druid/extended/data_list.lua | 4 +- druid/system/druid_instance.lua | 2 +- .../examples/custom/rich_text/rich_text.gui | 5307 ----------------- .../general/overview/overview.gui_script | 2 +- .../prefab_example_rich_text.gui | 357 -- .../rich_text_texts/rich_text_texts.gui | 2802 --------- game.project | 2 +- test/tests/test_button.lua | 19 +- 12 files changed, 43 insertions(+), 8482 deletions(-) diff --git a/README.md b/README.md index 75a3ae5..7ab2388 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Here is a list of [all releases](https://github.com/Insality/druid/releases). ### Input Bindings -**Druid** utilizes the `/builtins/input/all.input_binding` input bindings. For custom input bindings, refer to the Input Binding section in the **_[Advanced Setup](docs_md/advanced-setup.md#input-bindings)_**. +**Druid** utilizes the `/builtins/input/all.input_binding` input bindings. Either use this file for your project by setting the `Runtime -> Input -> Game Binding` field in the `game.project` input section to `/builtins/input/all.input_binding`, or add the specific bindings you need to your game's input binding file. For custom input bindings, refer to the Input Binding section in the [Advanced Setup](https://github.com/Insality/druid/blob/master/docs_md/advanced-setup.md#input-bindings). ## Usage diff --git a/deployer_build_stats.csv b/deployer_build_stats.csv index 8643758..9960c84 100644 --- a/deployer_build_stats.csv +++ b/deployer_build_stats.csv @@ -17,3 +17,4 @@ date,sha,version,build_size,build_time,platform,mode,is_cache_using,commits_coun 2023-08-05T16:31:19Z,37fff52aa59feb20f761ef4d340d9f677743d54b,0.11.693,2456,43,js-web,release,true,693 2023-08-05T16:41:25Z,d7dd4a86b81d73d345ad7e136de9c2c488bc4d8b,0.11.694,2452,43,js-web,release,true,694 2023-10-20T08:23:33Z,9132dc477b645d674ec21efbfcf85f48ef0ea8a6,0.11.718,2544,47,js-web,release,true,718 +2024-10-15T16:54:05Z,ea80c874f6c0ea175b317d01ac45c567db9179c7,0.11.0,1840,24,js-web,release,true,796 diff --git a/docs_md/changelog.md b/docs_md/changelog.md index cffcf26..3ef2890 100644 --- a/docs_md/changelog.md +++ b/docs_md/changelog.md @@ -500,3 +500,28 @@ Thanks to the my supporters: Please support me if you like this project! It will help me keep engaged to update **Druid** and make it even better! [![Github-sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/insality) [![Ko-Fi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/insality) [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/insality) + + + +### Druid 0.12.0 + +**Changelog 0.12.0** +- Remove `middleclass.lua` +- The Rich Text now applied to the text node instead of Rich Text Template (contained 3 nodes before - root, text and image prefabs) +- New Logo! +- New Example Page with 40+ examples +- Updated and fixed annotations +- Add `self:get_druid(template, nodes)` to escape the `self:set_template(template)` and `self:set_nodes(nodes)` calls +- Update Rich Input. Now with selection and cursor navigation. Updated Input settings for Druid +- Rework Data List. Now only works with Static Grid only. Now the Data List more stable with extended API. +- Add Cached Data List option. This used less memory (it's really much optimized) but requires uses the `on_add_element` and `on_remove_element` events to setup your nodes. All components should be the same class. +- Now user can tap from one text input area to another with one click. Before first tap is closed the focus on selected input. +- Removed Layout component. Add new Layout component what do a some different things. It's like Dynamic Grid but with more control and settings. +- Deprecated Dynamic Grid. Layout will be instead of it. +- Add touch param to Drag callbacks, it's much easier to add custom logic with knowledge of input action data. +- Add `scroll.view_size`, `scroll:set_view_size(size)` and `scroll:update_view_size()` functions to manage with current scroll input area and scroll visible part +- Add `grid:set_item_size(size)`, `grid:sort_nodes(comparator)` functions +- Seems adjust by height for multiline text is workings good now +- Extended Rich Input API +- More accurate scaling for progress bars fow images with slice9 params +- Fix several slider issues diff --git a/druid/base/scroll.lua b/druid/base/scroll.lua index 7a80620..962411a 100755 --- a/druid/base/scroll.lua +++ b/druid/base/scroll.lua @@ -505,7 +505,7 @@ end --- Bind the grid component (Static or Dynamic) to recalculate -- scroll size on grid changes -- @tparam Scroll self @{Scroll} --- @tparam StaticGrid|DynamicGrid grid Druid grid component +-- @tparam StaticGrid grid Druid grid component -- @treturn druid.scroll Current scroll instance function Scroll.bind_grid(self, grid) if self._grid_on_change then diff --git a/druid/extended/data_list.lua b/druid/extended/data_list.lua index e28714f..81bf959 100644 --- a/druid/extended/data_list.lua +++ b/druid/extended/data_list.lua @@ -13,7 +13,7 @@ -- @tfield Scroll scroll @{Scroll} --- The Druid Grid component --- @tfield StaticGrid|DynamicGrid grid @{StaticGrid}, @{DynamicGrid} +-- @tfield StaticGrid grid @{StaticGrid}, @{DynamicGrid} --- The current progress of scroll posititon -- @tfield number scroll_progress @@ -46,7 +46,7 @@ local DataList = component.create("data_list") --- The @{DataList} constructor -- @tparam DataList self @{DataList} -- @tparam Scroll scroll The @{Scroll} instance for Data List component --- @tparam StaticGrid|DynamicGrid grid The @{StaticGrid} or @{DynamicGrid} instance for Data List component +-- @tparam StaticGrid grid The @{StaticGrid} or @{DynamicGrid} instance for Data List component -- @tparam function create_function The create function callback(self, data, index, data_list). Function should return (node, [component]) function DataList.init(self, scroll, grid, create_function) self.scroll = scroll diff --git a/druid/system/druid_instance.lua b/druid/system/druid_instance.lua index 4f8f31b..ece7d01 100755 --- a/druid/system/druid_instance.lua +++ b/druid/system/druid_instance.lua @@ -730,7 +730,7 @@ end --- Create @{DataList} component -- @tparam DruidInstance self -- @tparam Scroll druid_scroll The Scroll instance for Data List component --- @tparam StaticGrid|DynamicGrid druid_grid The @{StaticGrid} or @{DynamicGrid} instance for Data List component +-- @tparam StaticGrid druid_grid The @{StaticGrid} or @{DynamicGrid} instance for Data List component -- @tparam function create_function The create function callback(self, data, index, data_list). Function should return (node, [component]) -- @treturn DataList @{DataList} component function DruidInstance.new_data_list(self, druid_scroll, druid_grid, create_function) diff --git a/example/examples/custom/rich_text/rich_text.gui b/example/examples/custom/rich_text/rich_text.gui index f2dd603..0762a48 100644 --- a/example/examples/custom/rich_text/rich_text.gui +++ b/example/examples/custom/rich_text/rich_text.gui @@ -7,5388 +7,82 @@ textures { name: "kenney" texture: "/example/assets/images/kenney.atlas" } -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} nodes { position { x: 300.0 y: 415.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 600.0 y: 830.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true } nodes { position { - x: 0.0 y: 415.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 600.0 y: 830.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "scroll_view" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT parent: "root" - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true visible: false } nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } size { x: 600.0 y: 1800.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "scroll_content" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT parent: "scroll_view" - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true visible: false } nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } scale { x: 0.8 y: 0.8 - z: 1.0 - w: 1.0 } size { x: 500.0 y: 100.0 - z: 0.0 - w: 1.0 } color { x: 0.9490196 y: 0.9490196 z: 0.9490196 - w: 1.0 } type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA text: "This is the example page of Rich Text component" font: "game" id: "hint1" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N outline { x: 0.2 - y: 0.0 z: 0.2 - w: 1.0 } shadow { x: 0.2 y: 0.2 z: 0.2 - w: 1.0 } - adjust_mode: ADJUST_MODE_FIT line_break: true parent: "scroll_content" - layer: "" inherit_alpha: true - alpha: 1.0 outline_alpha: 0.75 shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -160.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case1" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_1" - parent: "case1" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_1/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_1" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "rich_text_1/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_1/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.0 - overridden_fields: 4 - overridden_fields: 18 - overridden_fields: 31 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_1/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_1/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -252.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9490196 - y: 0.9490196 - z: 0.9490196 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text should match with usual text node" - font: "game" - id: "hint2" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.2 - y: 0.0 - z: 0.2 - w: 1.0 - } - shadow { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "scroll_content" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -400.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 120.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case2" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_2" - parent: "case2" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 112.5 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_2/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_2" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: -10.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 550.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Here is example to compare Rich Text posing with usual GUI Text Node." - font: "game" - id: "rich_text_2/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_2/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_2/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_2/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 533.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9019608 - y: 0.7019608 - z: 0.9019608 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Here is example to compare Rich Text posing with usual GUI Text Node." - font: "game" - id: "text_case_2" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case2" - layer: "" - inherit_alpha: true - alpha: 0.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -475.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9490196 - y: 0.9490196 - z: 0.9490196 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text split text to several text nodes" - font: "game" - id: "hint3" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.2 - y: 0.0 - z: 0.2 - w: 1.0 - } - shadow { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "scroll_content" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -620.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 120.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case3" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_3" - parent: "case3" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 112.5 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_3/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_3" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: -10.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_3/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_3/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_3/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_3/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -685.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9490196 - y: 0.9490196 - z: 0.9490196 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text supports images" - font: "game" - id: "hint4" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.2 - y: 0.0 - z: 0.2 - w: 1.0 - } - shadow { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "scroll_content" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -800.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case4_1" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_4_1" - parent: "case4_1" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_4_1/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_1" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_4_1/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_4_1/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_4_1/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_1/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -870.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case4_2" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_4_2" - parent: "case4_2" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_4_2/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_2" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_4_2/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_4_2/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_4_2/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_2/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -940.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case4_3" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_4_3" - parent: "case4_3" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_4_3/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_3" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -200.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_4_3/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_4_3/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_4_3/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_4_3/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -986.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 700.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9490196 - y: 0.9490196 - z: 0.9490196 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text support all pivots (area from root node size)" - font: "game" - id: "hint5" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.2 - y: 0.0 - z: 0.2 - w: 1.0 - } - shadow { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "scroll_content" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: -180.0 - y: -1132.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_NW" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_NW" - parent: "case5_NW" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: -75.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_NW/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_NW - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_NW" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_NW/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_NW/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_NW/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_NW/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1132.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_N" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_N" - parent: "case5_N" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_N/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_N" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -73.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_N/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_N/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_N/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_N/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 180.0 - y: -1132.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_NE" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_NE" - parent: "case5_NE" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 75.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_NE/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_NE - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_NE" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -150.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_NE/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_NE/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_NE/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_NE/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: -180.0 - y: -1252.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_W" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_W" - parent: "case5_W" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: -75.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_W/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_W" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_W/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_W/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_W/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_W/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1252.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_C" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_C" - parent: "case5_C" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_C/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_C" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -73.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_C/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_C/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_C/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_C/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 180.0 - y: -1252.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_E" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_E" - parent: "case5_E" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 75.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_E/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_E - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_E" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -150.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_E/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_E/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_E/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_E/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: -180.0 - y: -1372.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_SW" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_SW" - parent: "case5_SW" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: -75.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_SW/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SW - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_SW" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_SW/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_SW/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_SW/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_S - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_SW/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1372.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_S" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_S" - parent: "case5_S" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_S/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_S - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_S" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -75.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_S/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_S/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_S/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_S - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_S/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 180.0 - y: -1372.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5_SE" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_5_SE" - parent: "case5_SE" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 75.0 - y: -50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_5_SE/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SE - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_SE" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: -150.0 - y: 50.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.5 - y: 0.5 - z: 1.0 - w: 1.0 - } - size { - x: 150.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 0.9019608 - z: 0.6 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "rich_text_5_SE/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_W - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.5019608 - y: 0.7019608 - z: 0.7019608 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_5_SE/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 8 - overridden_fields: 16 - overridden_fields: 18 - overridden_fields: 32 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_5_SE/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_S - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_5_SE/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 3 - overridden_fields: 14 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: -500.0 - y: -200.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "highlight" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1455.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 700.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.9490196 - y: 0.9490196 - z: 0.9490196 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "You can get the tagged word to make logic around" - font: "game" - id: "hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.2 - y: 0.0 - z: 0.2 - w: 1.0 - } - shadow { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "scroll_content" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.25 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1622.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.3019608 - z: 0.3019608 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case6" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "scroll_content" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text_6" - parent: "case6" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text_6/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_6" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 150.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "rich_text_6/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text_6/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.75 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 14 - overridden_fields: 18 - overridden_fields: 31 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text_6/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text_6/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true } layers { name: "image" @@ -5398,4 +92,3 @@ layers { } material: "/builtins/materials/gui.material" adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/example/examples/general/overview/overview.gui_script b/example/examples/general/overview/overview.gui_script index 8f4589a..f0ded90 100644 --- a/example/examples/general/overview/overview.gui_script +++ b/example/examples/general/overview/overview.gui_script @@ -52,7 +52,7 @@ end local function setup_slider(self) local slider = self.druid:new_slider("slider_pin", vmath.vector3(95, 0, 0), function(_, value) gui.set_text(gui.get_node("text_progress_slider"), math.ceil(value * 100) .. "%") - end) --[[@as druid.slider]] + end) slider:set(0.2) end diff --git a/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui b/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui index 2c49da9..aa377e3 100644 --- a/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui +++ b/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui @@ -1,4 +1,3 @@ -script: "" fonts { name: "game" font: "/example/assets/fonts/game.font" @@ -7,423 +6,67 @@ textures { name: "kenney" texture: "/example/assets/images/kenney.atlas" } -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } size { x: 600.0 y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true visible: false } nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } scale { x: 0.8 y: 0.8 - z: 1.0 - w: 1.0 } size { x: 750.0 y: 100.0 - z: 0.0 - w: 1.0 } color { - x: 1.0 - y: 1.0 z: 0.9411765 - w: 1.0 } type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA text: "Here is simple example with text" font: "game" id: "hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N outline { x: 0.101960786 y: 0.101960786 z: 0.101960786 - w: 1.0 } shadow { x: 1.0 y: 1.0 z: 1.0 - w: 1.0 } - adjust_mode: ADJUST_MODE_FIT line_break: true parent: "root" - layer: "" inherit_alpha: true - alpha: 1.0 outline_alpha: 0.7 shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true } nodes { position { - x: 0.0 y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 600.0 y: 130.0 - z: 0.0 - w: 1.0 } color { - x: 1.0 - y: 1.0 z: 0.9411765 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" id: "area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT parent: "root" - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "rich_text" - parent: "area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 14 - overridden_fields: 18 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true } material: "/builtins/materials/gui.material" adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/example/examples/rich_text/rich_text_texts/rich_text_texts.gui b/example/examples/rich_text/rich_text_texts/rich_text_texts.gui index 757aa39..6354116 100644 --- a/example/examples/rich_text/rich_text_texts/rich_text_texts.gui +++ b/example/examples/rich_text/rich_text_texts/rich_text_texts.gui @@ -15,2838 +15,37 @@ textures { name: "kenney" texture: "/example/assets/images/kenney.atlas" } -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} nodes { position { x: 300.0 y: 415.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 600.0 y: 830.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true } nodes { position { - x: 0.0 y: 415.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } size { x: 600.0 y: 1200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 } type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA texture: "kenney/empty" id: "content" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE pivot: PIVOT_N adjust_mode: ADJUST_MODE_STRETCH parent: "root" - layer: "" inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true visible: false } -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case1" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case1/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case1" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 750.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Here is simple example with text" - font: "game" - id: "case1/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case1/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case1/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case1/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case1/rich_text" - parent: "case1/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case1/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case1/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "case1/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case1/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case1/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case1/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -200.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case2" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case2/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case2" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 750.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Text color setup" - font: "game" - id: "case2/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case2/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - overridden_fields: 8 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case2/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case2/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case2/rich_text" - parent: "case2/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case2/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case2/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "case2/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case2/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case2/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case2/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -400.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case3" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case3/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case3" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 750.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Text font setup" - font: "game" - id: "case3/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case3/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - overridden_fields: 8 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case3/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case3/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case3/rich_text" - parent: "case3/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case3/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case3/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich text" - font: "game" - id: "case3/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SW - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case3/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 14 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case3/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case3/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -600.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case4" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case4/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case4" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 750.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Example with
    and " - font: "game" - id: "case4/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case4/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - overridden_fields: 8 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case4/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case4/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case4/rich_text" - parent: "case4/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 500.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case4/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case4/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "case4/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SW - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case4/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 8 - overridden_fields: 14 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case4/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case4/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -800.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case5" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case5/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case5" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.8 - y: 0.8 - z: 1.0 - w: 1.0 - } - size { - x: 750.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text can adjust text by height:" - font: "game" - id: "case5/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case5/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - overridden_fields: 8 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case5/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case5/rich_text" - parent: "case5/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.8 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case5/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case5/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 46 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "case5/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SW - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case5/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 8 - overridden_fields: 14 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case5/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case5/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -1000.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case6" - parent: "content" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/example/examples/rich_text/rich_text_texts/prefab_example_rich_text.gui" - template_node_child: false - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 200.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "case6/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case6" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: false -} -nodes { - position { - x: 0.0 - y: 9.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.7 - y: 0.7 - z: 1.0 - w: 1.0 - } - size { - x: 800.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Disabled Line Break in text_prefab, adjust by width" - font: "game" - id: "case6/hint" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - outline { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: true - parent: "case6/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.7 - shadow_alpha: 0.0 - overridden_fields: 1 - overridden_fields: 3 - overridden_fields: 4 - overridden_fields: 8 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -60.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 130.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 0.9411765 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case6/area" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_N - adjust_mode: ADJUST_MODE_FIT - parent: "case6/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: -65.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "case6/rich_text" - parent: "case6/area" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/rich_text/rich_text.gui" - template_node_child: true - custom_type: 0 - enabled: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 400.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.8 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "" - id: "case6/rich_text/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case6/rich_text" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - overridden_fields: 4 - overridden_fields: 5 - overridden_fields: 46 - template_node_child: true - size_mode: SIZE_MODE_MANUAL - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 300.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.2 - y: 0.2 - z: 0.2 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Text" - font: "game" - id: "case6/rich_text/text_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_SW - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: false - parent: "case6/rich_text/root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 0.0 - shadow_alpha: 0.0 - overridden_fields: 8 - overridden_fields: 14 - overridden_fields: 18 - template_node_child: true - text_leading: 1.0 - text_tracking: 0.0 - custom_type: 0 - enabled: true - visible: true -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "items/checkmark" - id: "case6/rich_text/icon_prefab" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "case6/rich_text/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO - custom_type: 0 - enabled: true - visible: true -} layers { name: "image" } @@ -2855,4 +54,3 @@ layers { } material: "/builtins/materials/gui.material" adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/game.project b/game.project index cdedace..3df4888 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example.collectionc +main_collection = /test/test.collectionc [script] shared_state = 1 diff --git a/test/tests/test_button.lua b/test/tests/test_button.lua index 154803f..057135b 100644 --- a/test/tests/test_button.lua +++ b/test/tests/test_button.lua @@ -63,7 +63,7 @@ return function() assert(on_long_click_mock.calls == 0) druid:on_input(mock_input.click_pressed(10, 10)) - mock_time.elapse(0.5) + mock_time.elapse(1) druid:on_input(mock_input.click_released(20, 10)) assert(on_click_mock.calls == 1) @@ -144,14 +144,15 @@ return function() instance.on_hold_callback:subscribe(on_hold_callback) druid:on_input(mock_input.click_pressed(10, 10)) - mock_time.elapse(0.5) -- time between hold treshold and autorelease hold time - druid:on_input(mock_input.click_repeated(10, 10)) + mock_time.elapse(1) -- time between hold treshold and autorelease hold time + druid:on_input(mock_input.input_empty(10, 10)) + pprint(on_long_click_mock) assert(on_click_mock.calls == 0) - assert(on_hold_callback_mock.calls == 1) - assert(on_hold_callback_mock.params[1] == context) - assert(on_hold_callback_mock.params[2] == button_params) - assert(on_hold_callback_mock.params[3] == instance) + assert(on_long_click_mock.calls == 1) + assert(on_long_click_mock.params[1] == context) + assert(on_long_click_mock.params[2] == button_params) + assert(on_long_click_mock.params[3] == instance) druid:on_input(mock_input.click_released(10, 10)) @@ -257,8 +258,8 @@ return function() instance:set_enabled(false) local is_clicked_pressed = druid:on_input(mock_input.click_pressed(10, 10)) local is_clicked_released = druid:on_input(mock_input.click_released(10, 10)) - assert(is_clicked_pressed == false) - assert(is_clicked_released == false) + assert(is_clicked_pressed == true) + assert(is_clicked_released == true) assert(on_click_mock.calls == 0) assert(instance:is_enabled() == false) From 6e4490a3a71eff715c9ba79e1df9f47c0e7a5fd3 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 15 Oct 2024 21:38:40 +0300 Subject: [PATCH 41/45] Fix test.ini --- druid/styles/sprites/style.lua | 26 ------------------- .../general/buttons/buttons.gui_script | 4 --- test/{tests => }/test.ini | 0 3 files changed, 30 deletions(-) delete mode 100644 druid/styles/sprites/style.lua rename test/{tests => }/test.ini (100%) diff --git a/druid/styles/sprites/style.lua b/druid/styles/sprites/style.lua deleted file mode 100644 index 260ff2d..0000000 --- a/druid/styles/sprites/style.lua +++ /dev/null @@ -1,26 +0,0 @@ --- Copyright (c) 2021 Maksim Tuprikov . This code is licensed under MIT license - -local M = {} - - -M["button"] = { - LONGTAP_TIME = 0.4, - DOUBLETAP_TIME = 0.4, - - HOVER_MOUSE_IMAGE = "button_yellow", - DEFAULT_IMAGE = "button_blue", - HOVER_IMAGE = "button_red", - - on_hover = function(self, node, state) - local anim = state and M.button.HOVER_IMAGE or M.button.DEFAULT_IMAGE - gui.play_flipbook(node, anim) - end, - - on_mouse_hover = function(self, node, state) - local anim = state and M.button.HOVER_MOUSE_IMAGE or M.button.DEFAULT_IMAGE - gui.play_flipbook(node, anim) - end -} - - -return M diff --git a/example/examples/general/buttons/buttons.gui_script b/example/examples/general/buttons/buttons.gui_script index 04b3f1c..144c237 100644 --- a/example/examples/general/buttons/buttons.gui_script +++ b/example/examples/general/buttons/buttons.gui_script @@ -1,5 +1,4 @@ local druid = require("druid.druid") -local sprite_style = require("druid.styles.sprites.style") local function usual_callback() @@ -52,9 +51,6 @@ end local function setup_buttons(self) self.druid:new_button("button_usual/button", usual_callback) - local custom_style = self.druid:new_button("button_custom_style/button", usual_callback) - custom_style:set_style(sprite_style) - local long_button = self.druid:new_button("button_long_tap/button", usual_callback) long_button.on_hold_callback:subscribe(hold_callback) long_button.on_long_click:subscribe(long_tap_callback) diff --git a/test/tests/test.ini b/test/test.ini similarity index 100% rename from test/tests/test.ini rename to test/test.ini From aa6310db9105e69220b5657b10b7972b4e6a0989 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 16 Oct 2024 20:30:55 +0300 Subject: [PATCH 42/45] Update --- .vscode/settings.json | 3 +- README.md | 2 +- docs_md/02-creating_custom_components.md | 4 +-- docs_md/advanced-setup.md | 4 ++- docs_md/changelog.md | 36 ++++++++++++------------ druid/base/button.lua | 2 ++ druid/base/hover.lua | 28 ++++++++++-------- druid/component.lua | 2 +- druid/const.lua | 3 +- druid/custom/rich_input/rich_input.lua | 2 +- druid/custom/rich_text/rich_text.lua | 3 -- druid/editor_scripts/druid.editor_script | 2 +- druid/extended/layout.lua | 11 ++++++-- druid/styles/default/style.lua | 5 +++- 14 files changed, 60 insertions(+), 47 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index fc31eb2..44850ee 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,7 +11,8 @@ "it", "utf8", "defos", - "clipboard" + "clipboard", + "editor" ], "Lua.workspace.checkThirdParty": false, "Lua.diagnostics.neededFileStatus": { diff --git a/README.md b/README.md index 7ab2388..760392e 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ druid.register("data_list", data_list) | **[Slider](https://insality.github.io/druid/modules/Slider.html)** | Logic over GUI Node. Handle draggable node with position restrictions. | [Slider Example](https://insality.github.io/druid/druid/?example=general_sliders) | | | **[Timer](https://insality.github.io/druid/modules/Timer.html)** | Logic over GUI Text. Handle basic timer functions. | ❌ | | | **[Hotkey](https://insality.github.io/druid/modules/Hotkey.html)** | Allow to set callbacks for keyboard hotkeys with key modificators. | [Hotkey Example](https://insality.github.io/druid/druid/?example=general_hotkey) | | -| **[Layout](https://insality.github.io/druid/modules/Layout.html)** | Logic over GUI Node. Handle node size depends on layout mode and screen aspect ratio. Contains helpers to build more complex UI layout. | [Layout Example](https://insality.github.io/druid/druid/?example=general_layout) | | +| **[Layout](https://insality.github.io/druid/modules/Layout.html)** | Logic over GUI Node. Arrange nodes inside layout node with margin/paddings settings. | [Layout Example](https://insality.github.io/druid/druid/?example=general_layout) | | For a complete overview, see: **_[components.md](docs_md/01-components.md)_**. diff --git a/docs_md/02-creating_custom_components.md b/docs_md/02-creating_custom_components.md index b763f6f..cf9c32c 100644 --- a/docs_md/02-creating_custom_components.md +++ b/docs_md/02-creating_custom_components.md @@ -133,9 +133,7 @@ Available keywords: - `blocker`: Adds a [Druid Blocker](01-components.md#blocker) component. - `slider`: Adds a [Druid Slider](01-components.md#slider) component. You should adjust the end position of the Slider after generating the file. - `progress`: Adds a [Druid Progress](01-components.md#progress) component. -- `timer`: Adds a [Dr - -uid Timer](01-components.md#timer) component. +- `timer`: Adds a [Druid Timer](01-components.md#timer) component. ## The Power of Using Templates diff --git a/docs_md/advanced-setup.md b/docs_md/advanced-setup.md index b18369a..5e047a7 100644 --- a/docs_md/advanced-setup.md +++ b/docs_md/advanced-setup.md @@ -3,7 +3,7 @@ ## Input Bindings -By default, **Druid** utilizes the `/builtins/input/all.input_binding` for input bindings. +By default, **Druid** uses all key names from Defold's default `/builtins/input/all.input_binding` for input bindings. **Druid** requires the following input bindings: @@ -18,6 +18,7 @@ By default, **Druid** utilizes the `/builtins/input/all.input_binding` for input - Key trigger: `Right` -> `key_right` (for Rich Input component, optional) - Key trigger: `Shift` -> `key_lshift` (for Rich Input component, optional) - Key trigger: `Ctrl` -> `key_lctrl` (for Rich Input component, optional) +- Key trigger: `Super` -> `key_lsuper` (for Rich Input component, optional) - Touch triggers: `Touch multi` -> `touch_multi` (for Scroll component) ![](../media/input_binding_2.png) @@ -45,6 +46,7 @@ input_key_left = key_left input_key_right = key_right input_key_lshift = key_lshift input_key_lctrl = key_lctrl +input_key_lsuper = key_lsuper ``` diff --git a/docs_md/changelog.md b/docs_md/changelog.md index 3ef2890..f04f284 100644 --- a/docs_md/changelog.md +++ b/docs_md/changelog.md @@ -506,22 +506,22 @@ Please support me if you like this project! It will help me keep engaged to upda ### Druid 0.12.0 **Changelog 0.12.0** -- Remove `middleclass.lua` -- The Rich Text now applied to the text node instead of Rich Text Template (contained 3 nodes before - root, text and image prefabs) - New Logo! -- New Example Page with 40+ examples -- Updated and fixed annotations -- Add `self:get_druid(template, nodes)` to escape the `self:set_template(template)` and `self:set_nodes(nodes)` calls -- Update Rich Input. Now with selection and cursor navigation. Updated Input settings for Druid -- Rework Data List. Now only works with Static Grid only. Now the Data List more stable with extended API. -- Add Cached Data List option. This used less memory (it's really much optimized) but requires uses the `on_add_element` and `on_remove_element` events to setup your nodes. All components should be the same class. -- Now user can tap from one text input area to another with one click. Before first tap is closed the focus on selected input. -- Removed Layout component. Add new Layout component what do a some different things. It's like Dynamic Grid but with more control and settings. -- Deprecated Dynamic Grid. Layout will be instead of it. -- Add touch param to Drag callbacks, it's much easier to add custom logic with knowledge of input action data. -- Add `scroll.view_size`, `scroll:set_view_size(size)` and `scroll:update_view_size()` functions to manage with current scroll input area and scroll visible part -- Add `grid:set_item_size(size)`, `grid:sort_nodes(comparator)` functions -- Seems adjust by height for multiline text is workings good now -- Extended Rich Input API -- More accurate scaling for progress bars fow images with slice9 params -- Fix several slider issues +- [Example] New Example Page with 40+ examples +- [Data List] Rework Data List. Now only works with Static Grid only. Now the Data List more stable with extended API. + - Add Cached Data List option. This used less memory (it's really much optimized) but requires uses the `on_add_element` and `on_remove_element` events to setup your nodes. All components should be the same class. +- [Rich Text] The Rich Text now applied to the text node instead of Rich Text Template (contained 3 nodes before - root, text and image prefabs) +- [Rich Input] Updated Rich Input. Now it goes with selection and cursor navigation. Added new input keys for setup in Druid (arrows keys, ctrl, shift) +- [System] Updated and fixed annotations +- [System] Removed `middleclass.lua` +- [System] Add `self:get_druid(template, nodes)` to escape the `self:set_template(template)` and `self:set_nodes(nodes)` calls in custom components +- [Input] Now user can tap from one text input area to another with one click. Before first tap is closed the focus on selected input. +- [Layout] Removed Layout component. Add new Layout component what do a some different things. It's like Dynamic Grid but with more control and settings. +- [Dynamic Grid] Deprecated Dynamic Grid. Layout will be instead of it. +- [Drag] Add touch param to Drag callbacks, it's much easier to add custom logic with knowledge of input action data. +- [Scroll] Add `scroll.view_size`, `scroll:set_view_size(size)` and `scroll:update_view_size()` functions to manage with current scroll input area and scroll visible part +- [Static Grid] Add `grid:set_item_size(size)`, `grid:sort_nodes(comparator)` functions +- [Text] Seems adjust by height for multiline text is workings good now +- [Rich Input] Extended Rich Input API +- [Progress Bar] More accurate scaling for progress bars fow images with slice9 params +- [Slider] Fix several slider issues in slider setup diff --git a/druid/base/button.lua b/druid/base/button.lua index ada2a26..9b09c48 100755 --- a/druid/base/button.lua +++ b/druid/base/button.lua @@ -418,6 +418,8 @@ end function Button.on_input_interrupt(self) self.can_action = false + self.hover:set_hover(false) + self.hover:set_mouse_hover(false) end diff --git a/druid/base/hover.lua b/druid/base/hover.lua index 97758c3..f178cf2 100644 --- a/druid/base/hover.lua +++ b/druid/base/hover.lua @@ -108,13 +108,15 @@ end -- @tparam Hover self @{Hover} -- @tparam boolean|nil state The hover state function Hover.set_hover(self, state) - if self._is_hovered ~= state then - self._is_hovered = state - self.on_hover:trigger(self:get_context(), state, self) + if self._is_hovered == state then + return + end - if defos and self.style.ON_HOVER_CURSOR then - self:_set_cursor(3, state and self.style.ON_HOVER_CURSOR or nil) - end + self._is_hovered = state + self.on_hover:trigger(self:get_context(), state, self) + + if defos and self.style.ON_HOVER_CURSOR then + self:_set_cursor(3, state and self.style.ON_HOVER_CURSOR or nil) end end @@ -131,13 +133,15 @@ end -- @tparam Hover self @{Hover} -- @tparam boolean|nil state The mouse hover state function Hover.set_mouse_hover(self, state) - if self._is_mouse_hovered ~= state then - self._is_mouse_hovered = state - self.on_mouse_hover:trigger(self:get_context(), state, self) + if self._is_mouse_hovered == state then + return + end - if defos and self.style.ON_MOUSE_HOVER_CURSOR then - self:_set_cursor(2, state and self.style.ON_MOUSE_HOVER_CURSOR or nil) - end + self._is_mouse_hovered = state + self.on_mouse_hover:trigger(self:get_context(), state, self) + + if defos and self.style.ON_MOUSE_HOVER_CURSOR then + self:_set_cursor(2, state and self.style.ON_MOUSE_HOVER_CURSOR or nil) end end diff --git a/druid/component.lua b/druid/component.lua index d5bf761..1bd76c9 100644 --- a/druid/component.lua +++ b/druid/component.lua @@ -24,7 +24,7 @@ local helper = require("druid.helper") local BaseComponent = {} local INTERESTS = {} -- Cache interests per component class in runtime -local IS_AUTO_TEMPLATE = not (sys.get_config_int("druid.no_auto_template", 0) == "1") +local IS_AUTO_TEMPLATE = not (sys.get_config_int("druid.no_auto_template", 0) == 1) -- Component Interests BaseComponent.ON_INPUT = const.ON_INPUT diff --git a/druid/const.lua b/druid/const.lua index 6801e35..70667de 100755 --- a/druid/const.lua +++ b/druid/const.lua @@ -21,8 +21,9 @@ M.ACTION_LEFT = hash(sys.get_config_string("druid.input_key_left", "key_left")) M.ACTION_RIGHT = hash(sys.get_config_string("druid.input_key_right", "key_right")) M.ACTION_LSHIFT = hash(sys.get_config_string("druid.input_key_lshift", "key_lshift")) M.ACTION_LCTRL = hash(sys.get_config_string("druid.input_key_lctrl", "key_lctrl")) +M.ACTION_LCMD = hash(sys.get_config_string("druid.input_key_lsuper", "key_lsuper")) -M.IS_STENCIL_CHECK = not (sys.get_config_string("druid.no_stencil_check") == "1") +M.IS_STENCIL_CHECK = not (sys.get_config_int("druid.no_stencil_check", 0) == 1) M.ON_INPUT = "on_input" diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index 8e1a059..a1c6987 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -224,7 +224,7 @@ function RichInput.on_input(self, action_id, action) end end - if action_id == const.ACTION_LCTRL then + if action_id == const.ACTION_LCTRL or action_id == const.ACTION_LCMD then if action.pressed then self.is_lctrl = true elseif action.released then diff --git a/druid/custom/rich_text/rich_text.lua b/druid/custom/rich_text/rich_text.lua index b3d4973..81ac7ac 100644 --- a/druid/custom/rich_text/rich_text.lua +++ b/druid/custom/rich_text/rich_text.lua @@ -71,9 +71,6 @@ --- The text prefab node -- @tfield node text_prefab ---- The icon prefab node --- @tfield node icon_prefab - -- local component = require("druid.component") diff --git a/druid/editor_scripts/druid.editor_script b/druid/editor_scripts/druid.editor_script index f72488a..7903c00 100644 --- a/druid/editor_scripts/druid.editor_script +++ b/druid/editor_scripts/druid.editor_script @@ -26,7 +26,7 @@ end function M.get_commands() return { { - label = "Assign layers", + label = "Assign Layers", locations = {"Edit"}, diff --git a/druid/extended/layout.lua b/druid/extended/layout.lua index 7d2dc04..2380d58 100644 --- a/druid/extended/layout.lua +++ b/druid/extended/layout.lua @@ -207,15 +207,20 @@ function M.refresh_layout(self) end if type == "vertical" then - position_x = current_x + row.width * (0.5 - pivot_offset.x) - position_y = current_y - node_height * (0.5 + pivot_offset.y) - local node_margin = margin.y if is_justify then node_margin = (max_height - rows_data.total_height) / (#rows - 1) + margin.y end + current_x = -row.width * (0.5 + layout_pivot_offset.x) + + position_x = current_x + row.width * (0.5 + pivot_offset.x) + position_y = current_y - node_height * (0.5 - pivot_offset.y) + current_y = current_y - node_height - node_margin + + row_index = row_index + 1 + row = rows[row_index] end if type == "horizontal_wrap" then diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 1a857b9..7477e21 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -36,7 +36,10 @@ M["button"] = { on_click = function(self, node) local scale_to = self.start_scale + M.button.SCALE_CHANGE gui.set_scale(node, scale_to) - gui.animate(node, gui.PROP_SCALE, self.start_scale, gui.EASING_OUTBACK, 0.24) + + local is_hover = self.hover:is_mouse_hovered() + local target_scale = is_hover and self.start_scale + M.button.HOVER_MOUSE_SCALE or self.start_scale + gui.animate(node, gui.PROP_SCALE, target_scale, gui.EASING_OUTBACK, 0.24) settings.play_sound(M.button.BTN_SOUND) end, From c0c1870ac5d06a07508720f412ed56305578d245 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 16 Oct 2024 20:58:55 +0300 Subject: [PATCH 43/45] Solve #239 Remove button style --- druid/annotations.lua | 1 - druid/custom/rich_input/rich_input.lua | 18 ++++++++++++++++++ druid/extended/input.lua | 8 -------- druid/styles/default/style.lua | 6 ------ 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/druid/annotations.lua b/druid/annotations.lua index 3e8be27..4c9e4c7 100644 --- a/druid/annotations.lua +++ b/druid/annotations.lua @@ -777,7 +777,6 @@ function druid__input.unselect(self) end ---@field IS_LONGTAP_ERASE boolean Is long tap will erase current input data. Default: false ---@field IS_UNSELECT_ON_RESELECT boolean If true, call unselect on select selected input. Default: false ---@field MASK_DEFAULT_CHAR string Default character mask for password input. Default: *] ----@field button_style table Custom button style for input node ---@field on_input_wrong function (self, button_node) Callback on wrong user input ---@field on_select function (self, button_node) Callback on input field selecting ---@field on_unselect function (self, button_node) Callback on input field unselecting diff --git a/druid/custom/rich_input/rich_input.lua b/druid/custom/rich_input/rich_input.lua index a1c6987..bffe3fa 100644 --- a/druid/custom/rich_input/rich_input.lua +++ b/druid/custom/rich_input/rich_input.lua @@ -17,6 +17,24 @@ --- On input field text change to empty string callback(self, input_text) -- @tfield node cursor +--- On input field text change to empty string callback(self, input_text) +-- @tfield node cursor_text + +--- On input field text change to empty string callback(self, input_text) +-- @tfield vector3 cursor_position + +--- On input field text change to empty string callback(self, input_text) +-- @tfield druid.text input_text + +--- On input field text change to empty string callback(self, input_text) +-- @tfield druid.drag drag + +--- On input field text change to empty string callback(self, input_text) +-- @tfield druid.text placeholder + +--- On input field text change to empty string callback(self, input_text) +-- @tfield vector3 text_position + --- On input field text change to max length string callback(self, input_text) -- @tfield druid.text placeholder @{Text} diff --git a/druid/extended/input.lua b/druid/extended/input.lua index a48117f..db608e1 100755 --- a/druid/extended/input.lua +++ b/druid/extended/input.lua @@ -132,7 +132,6 @@ end -- @tfield function on_select (self, button_node) Callback on input field selecting -- @tfield function on_unselect (self, button_node) Callback on input field unselecting -- @tfield function on_input_wrong (self, button_node) Callback on wrong user input --- @tfield table button_style Custom button style for input node function Input.on_style_change(self, style) self.style = {} @@ -143,12 +142,6 @@ function Input.on_style_change(self, style) self.style.on_select = style.on_select or function(_, button_node) end self.style.on_unselect = style.on_unselect or function(_, button_node) end self.style.on_input_wrong = style.on_input_wrong or function(_, button_node) end - - self.style.button_style = style.button_style or { - LONGTAP_TIME = 0.4, - AUTOHOLD_TRIGGER = 0.8, - DOUBLETAP_TIME = 0.4 - } end @@ -186,7 +179,6 @@ function Input.init(self, click_node, text_node, keyboard_type) self.keyboard_type = keyboard_type or gui.KEYBOARD_TYPE_DEFAULT self.button = self.druid:new_button(click_node, self.select) - self.button:set_style(self.button_style) self.button.on_click_outside:subscribe(self.unselect) self.button.on_long_click:subscribe(clear_and_select) diff --git a/druid/styles/default/style.lua b/druid/styles/default/style.lua index 7477e21..ca9121c 100644 --- a/druid/styles/default/style.lua +++ b/druid/styles/default/style.lua @@ -141,12 +141,6 @@ M["input"] = { end) end) end, - - button = { - LONGTAP_TIME = 0.4, - AUTOHOLD_TRIGGER = 0.8, - DOUBLETAP_TIME = 0.4, - } } From 3ccfe2c30699839e173945a2daebe71645c0954f Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 16 Oct 2024 21:15:16 +0300 Subject: [PATCH 44/45] Remove pin knob component --- druid/custom/pin_knob/pin_knob.gui | 182 ----------------------------- druid/custom/pin_knob/pin_knob.lua | 121 ------------------- 2 files changed, 303 deletions(-) delete mode 100644 druid/custom/pin_knob/pin_knob.gui delete mode 100644 druid/custom/pin_knob/pin_knob.lua diff --git a/druid/custom/pin_knob/pin_knob.gui b/druid/custom/pin_knob/pin_knob.gui deleted file mode 100644 index 6397460..0000000 --- a/druid/custom/pin_knob/pin_knob.gui +++ /dev/null @@ -1,182 +0,0 @@ -script: "" -fonts { - name: "game" - font: "/example/assets/fonts/game.font" -} -textures { - name: "kenney" - texture: "/example/assets/images/kenney.atlas" -} -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 1.0 - y: 1.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 2.0 - y: 2.0 - z: 1.0 - w: 1.0 - } - size { - x: 36.0 - y: 36.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/slider_move" - id: "pin" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 13.5 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.2 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 17.0 - y: 17.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/tick" - id: "notch" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_AUTO -} -material: "/builtins/materials/gui.material" -adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/druid/custom/pin_knob/pin_knob.lua b/druid/custom/pin_knob/pin_knob.lua deleted file mode 100644 index 39e8c5f..0000000 --- a/druid/custom/pin_knob/pin_knob.lua +++ /dev/null @@ -1,121 +0,0 @@ --- Copyright (c) 2022 Maksim Tuprikov . This code is licensed under MIT license - ---- Druid pin knob custom component. --- It's simple rotating input element --- @module PinKnob --- @within BaseComponent --- @alias druid.pin_knob - ---- The component druid instance --- @tfield DruidInstance druid @{DruidInstance} - ---- Is currently under user control --- @tfield boolean is_drag - ---- The pin node --- @tfield node node - ---- - -local const = require("druid.const") -local component = require("druid.component") - -local PinKnob = component.create("druid.pin_knob", { const.ON_INPUT }) - -local SCHEME = { - ROOT = "root", - PIN = "pin", -} - - -local function update_visual(self) - local rotation = vmath.vector3(0, 0, self.angle) - gui.set_euler(self.node, rotation) -end - - -local function set_angle(self, value) - local prev_value = self.angle - - self.angle = value - self.angle = math.min(self.angle, self.angle_max) - self.angle = math.max(self.angle, self.angle_min) - update_visual(self) - - if prev_value ~= self.angle and self.callback then - local output_value = self.angle - if output_value ~= 0 then - output_value = -output_value - end - self.callback(self:get_context(), output_value) - end -end - - ---- The @{PinKnob} constructor --- @tparam PinKnob self @{PinKnob} --- @tparam function callback Callback(self, value) on value changed --- @tparam string template The template string name --- @tparam table nodes Nodes table from gui.clone_tree -function PinKnob.init(self, callback, template, nodes) - self.druid = self:get_druid(template, nodes) - self.node = self:get_node(SCHEME.PIN) - self.is_drag = false - - self.callback = callback - self:set_angle(0, -100, 100) - self._friction = 0.75 -end - - ---- Set current and min/max angles for component --- @tparam PinKnob self @{PinKnob} --- @tparam number cur_value The new value for pin knob --- @tparam number min The minimum value for pin knob --- @tparam number max The maximum value for pin knob --- @treturn PinKnob @{PinKnob} -function PinKnob.set_angle(self, cur_value, min, max) - self.angle_min = min or self.angle_min - self.angle_max = max or self.angle_max - set_angle(self, cur_value) - - return self -end - - ---- Set current and min/max angles for component --- @tparam PinKnob self @{PinKnob} --- @tparam number|nil value The spin speed multiplier. Default: 1 --- @treturn PinKnob @{PinKnob} -function PinKnob.set_friction(self, value) - self._friction = value or 1 - - return self -end - - -function PinKnob.on_input(self, action_id, action) - if action_id ~= const.ACTION_TOUCH then - return false - end - - if gui.pick_node(self.node, action.x, action.y) then - if action.pressed then - self.pos = gui.get_position(self.node) - self.is_drag = true - end - end - - if self.is_drag and not action.pressed then - set_angle(self, self.angle - action.dx * self._friction - action.dy * self._friction) - end - - if action.released then - self.is_drag = false - end - - return self.is_drag -end - - -return PinKnob From 40bda1b0eb4dedfdfcb35b474376eed37f470dd5 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 16 Oct 2024 21:30:32 +0300 Subject: [PATCH 45/45] Fix deleted knob --- example/example.collection | 1592 ----------------- .../custom/pin_knob/pin_knob.collection | 37 - example/examples/custom/pin_knob/pin_knob.gui | 677 ------- .../custom/pin_knob/pin_knob.gui_script | 49 - 4 files changed, 2355 deletions(-) delete mode 100644 example/examples/custom/pin_knob/pin_knob.collection delete mode 100644 example/examples/custom/pin_knob/pin_knob.gui delete mode 100644 example/examples/custom/pin_knob/pin_knob.gui_script diff --git a/example/example.collection b/example/example.collection index 0d91d8e..4651339 100644 --- a/example/example.collection +++ b/example/example.collection @@ -5,74 +5,16 @@ embedded_instances { data: "components {\n" " id: \"main\"\n" " component: \"/example/example.gui\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" - " property_decls {\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "system" data: "components {\n" " id: \"init\"\n" " component: \"/example/init.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" - " property_decls {\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "sound" @@ -80,59 +22,15 @@ embedded_instances { " id: \"click\"\n" " type: \"sound\"\n" " data: \"sound: \\\"/example/assets/sounds/click.ogg\\\"\\n" - "looping: 0\\n" - "group: \\\"master\\\"\\n" - "gain: 1.0\\n" - "pan: 0.0\\n" - "speed: 1.0\\n" - "loopcount: 0\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_overview" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_overview\"\n" @@ -143,62 +41,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/overview/overview.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_buttons" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_buttons\"\n" @@ -209,62 +66,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/buttons/buttons.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "texts_general" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"texts_general\"\n" @@ -275,62 +91,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/texts/texts_general/texts_general.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_sliders" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_sliders\"\n" @@ -341,62 +116,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/sliders/sliders.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_grid" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_grid\"\n" @@ -407,62 +141,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/grid/grid.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_input" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_input\"\n" @@ -473,62 +166,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/input/input.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_scroll" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_scroll\"\n" @@ -539,62 +191,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/scroll/scroll.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_data_list" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_data_list\"\n" @@ -605,62 +216,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/data_list/data_list.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_static_grid" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_static_grid\"\n" @@ -671,62 +241,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/static_grid/static_grid.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_dynamic_grid" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_dynamic_grid\"\n" @@ -737,62 +266,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/dynamic_grid/dynamic_grid.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_navigate" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_navigate\"\n" @@ -803,62 +291,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/navigate/navigate.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_add_remove_nodes" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_add_remove_nodes\"\n" @@ -869,62 +316,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/add_remove_nodes/add_remove_nodes.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "grid_static_grid" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"grid_static_grid\"\n" @@ -935,62 +341,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/grid/static_grid/static_grid.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "grid_animations" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"grid_animations\"\n" @@ -1001,62 +366,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/grid/grid_animations/grid_animations.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "grid_static_grid_dynamic_pos" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"grid_static_grid_dynamic_pos\"\n" @@ -1067,62 +391,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/grid/static_grid_dynamic_pos/static_grid_dynamic_pos.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "system_whitelist_blacklist" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"system_whitelist_blacklist\"\n" @@ -1133,62 +416,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/system/whitelist_blacklist/whitelist_blacklist.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "texts_adjust" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"texts_adjust\"\n" @@ -1199,62 +441,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/texts/texts_adjust/texts_adjust.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "system_message_input" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"system_message_input\"\n" @@ -1265,62 +466,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/system/message_input/message_input.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "custom_rich_input" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"custom_rich_input\"\n" @@ -1331,128 +491,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/custom/rich_input/rich_input.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } -} -embedded_instances { - id: "custom_pin_knob" - data: "components {\n" - " id: \"screen_factory\"\n" - " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" - " properties {\n" - " id: \"screen_id\"\n" - " value: \"custom_pin_knob\"\n" - " type: PROPERTY_TYPE_HASH\n" - " }\n" - " properties {\n" - " id: \"popup\"\n" - " value: \"true\"\n" - " type: PROPERTY_TYPE_BOOLEAN\n" - " }\n" - " property_decls {\n" - " }\n" - "}\n" - "embedded_components {\n" - " id: \"collectionfactory\"\n" - " type: \"collectionfactory\"\n" - " data: \"prototype: \\\"/example/examples/custom/pin_knob/pin_knob.collection\\\"\\n" - "load_dynamically: true\\n" - "dynamic_prototype: false\\n" - "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" - "}\n" - "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "system_inner_templates" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"system_inner_templates\"\n" @@ -1463,62 +516,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/system/inner_templates/inner_templates.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_swipe" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_swipe\"\n" @@ -1529,62 +541,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/swipe/swipe.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_drag" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_drag\"\n" @@ -1595,62 +566,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/drag/drag.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_checkboxes" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_checkboxes\"\n" @@ -1661,62 +591,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/checkboxes/checkboxes.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_reinit_data" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_reinit_data\"\n" @@ -1727,62 +616,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/reinit_data/reinit_data.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_layout" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_layout\"\n" @@ -1793,62 +641,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/layout/layout.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_hotkey" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_hotkey\"\n" @@ -1859,62 +666,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/hotkey/hotkey.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_with_component" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_with_component\"\n" @@ -1925,62 +691,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/with_component/with_component.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "layout_fit" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"layout_fit\"\n" @@ -1991,62 +716,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/layout/layout_fit/layout_fit.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_progress_bar" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_progress_bar\"\n" @@ -2057,62 +741,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/progress_bar/progress_bar.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "system_late_init_check" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"system_late_init_check\"\n" @@ -2123,62 +766,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/system/late_init_check/late_init_check.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "general_hover" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"general_hover\"\n" @@ -2189,62 +791,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/general/hover/hover.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "texts_lang_text" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"texts_lang_text\"\n" @@ -2255,62 +816,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/texts/lang_text/lang_text.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "custom_rich_text" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"custom_rich_text\"\n" @@ -2321,62 +841,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/custom/rich_text/rich_text.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "data_list_manage_data" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"data_list_manage_data\"\n" @@ -2387,62 +866,21 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/data_list/manage_data/manage_data.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } embedded_instances { id: "rich_text_texts" data: "components {\n" " id: \"screen_factory\"\n" " component: \"/monarch/screen_factory.script\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" " properties {\n" " id: \"screen_id\"\n" " value: \"rich_text_texts\"\n" @@ -2453,43 +891,13 @@ embedded_instances { " value: \"true\"\n" " type: PROPERTY_TYPE_BOOLEAN\n" " }\n" - " property_decls {\n" - " }\n" "}\n" "embedded_components {\n" " id: \"collectionfactory\"\n" " type: \"collectionfactory\"\n" " data: \"prototype: \\\"/example/examples/rich_text/rich_text_texts/rich_text_texts.collection\\\"\\n" "load_dynamically: true\\n" - "dynamic_prototype: false\\n" "\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" "}\n" "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } } diff --git a/example/examples/custom/pin_knob/pin_knob.collection b/example/examples/custom/pin_knob/pin_knob.collection deleted file mode 100644 index 2698ebf..0000000 --- a/example/examples/custom/pin_knob/pin_knob.collection +++ /dev/null @@ -1,37 +0,0 @@ -name: "pin_knob" -scale_along_z: 0 -embedded_instances { - id: "go" - data: "components {\n" - " id: \"rich_input\"\n" - " component: \"/example/examples/custom/pin_knob/pin_knob.gui\"\n" - " position {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " }\n" - " rotation {\n" - " x: 0.0\n" - " y: 0.0\n" - " z: 0.0\n" - " w: 1.0\n" - " }\n" - "}\n" - "" - position { - x: 0.0 - y: 0.0 - z: 0.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale3 { - x: 1.0 - y: 1.0 - z: 1.0 - } -} diff --git a/example/examples/custom/pin_knob/pin_knob.gui b/example/examples/custom/pin_knob/pin_knob.gui deleted file mode 100644 index d20d64f..0000000 --- a/example/examples/custom/pin_knob/pin_knob.gui +++ /dev/null @@ -1,677 +0,0 @@ -script: "/example/examples/custom/pin_knob/pin_knob.gui_script" -fonts { - name: "game" - font: "/example/assets/fonts/game.font" -} -textures { - name: "kenney" - texture: "/example/assets/images/kenney.atlas" -} -background_color { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 -} -nodes { - position { - x: 300.0 - y: 415.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 600.0 - y: 830.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: false - size_mode: SIZE_MODE_MANUAL -} -nodes { - position { - x: 0.0 - y: 370.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 700.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "Rich Input custom component" - font: "game" - id: "text_hint_horizontal" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: false - parent: "root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 1.0 - shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 -} -nodes { - position { - x: -100.0 - y: 230.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "pin_knob1" - parent: "root" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/pin_knob/pin_knob.gui" - template_node_child: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 1.0 - y: 1.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "pin_knob1/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob1" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 2.0 - y: 2.0 - z: 1.0 - w: 1.0 - } - size { - x: 36.0 - y: 36.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/slider_move" - id: "pin_knob1/pin" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob1/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 13.5 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.2 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 17.0 - y: 17.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/tick" - id: "pin_knob1/notch" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob1/pin" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: -100.0 - y: 154.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 120.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "50" - font: "game" - id: "text_value1" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: false - parent: "root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 1.0 - shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 -} -nodes { - position { - x: 100.0 - y: 230.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 200.0 - y: 100.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEMPLATE - id: "pin_knob2" - parent: "root" - layer: "" - inherit_alpha: true - alpha: 1.0 - template: "/druid/custom/pin_knob/pin_knob.gui" - template_node_child: false -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 1.0 - y: 1.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/empty" - id: "pin_knob2/root" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob2" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 2.0 - y: 2.0 - z: 1.0 - w: 1.0 - } - size { - x: 36.0 - y: 36.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/slider_move" - id: "pin_knob2/pin" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob2/root" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 0.0 - y: 13.5 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.2 - y: 1.0 - z: 1.0 - w: 1.0 - } - size { - x: 17.0 - y: 17.0 - z: 0.0 - w: 1.0 - } - color { - x: 0.101960786 - y: 0.101960786 - z: 0.101960786 - w: 1.0 - } - type: TYPE_BOX - blend_mode: BLEND_MODE_ALPHA - texture: "kenney/tick" - id: "pin_knob2/notch" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - adjust_mode: ADJUST_MODE_FIT - parent: "pin_knob2/pin" - layer: "" - inherit_alpha: true - slice9 { - x: 0.0 - y: 0.0 - z: 0.0 - w: 0.0 - } - clipping_mode: CLIPPING_MODE_NONE - clipping_visible: true - clipping_inverted: false - alpha: 1.0 - template_node_child: true - size_mode: SIZE_MODE_AUTO -} -nodes { - position { - x: 100.0 - y: 154.0 - z: 0.0 - w: 1.0 - } - rotation { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - scale { - x: 0.75 - y: 0.75 - z: 1.0 - w: 1.0 - } - size { - x: 120.0 - y: 60.0 - z: 0.0 - w: 1.0 - } - color { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - type: TYPE_TEXT - blend_mode: BLEND_MODE_ALPHA - text: "50" - font: "game" - id: "text_value2" - xanchor: XANCHOR_NONE - yanchor: YANCHOR_NONE - pivot: PIVOT_CENTER - outline { - x: 0.0 - y: 0.0 - z: 0.0 - w: 1.0 - } - shadow { - x: 1.0 - y: 1.0 - z: 1.0 - w: 1.0 - } - adjust_mode: ADJUST_MODE_FIT - line_break: false - parent: "root" - layer: "" - inherit_alpha: true - alpha: 1.0 - outline_alpha: 1.0 - shadow_alpha: 0.0 - template_node_child: false - text_leading: 1.0 - text_tracking: 0.0 -} -layers { - name: "image" -} -layers { - name: "text" -} -material: "/builtins/materials/gui.material" -adjust_reference: ADJUST_REFERENCE_PARENT -max_nodes: 512 diff --git a/example/examples/custom/pin_knob/pin_knob.gui_script b/example/examples/custom/pin_knob/pin_knob.gui_script deleted file mode 100644 index cd81204..0000000 --- a/example/examples/custom/pin_knob/pin_knob.gui_script +++ /dev/null @@ -1,49 +0,0 @@ -local druid = require("druid.druid") - -local pin_knob = require("druid.custom.pin_knob.pin_knob") - - -local function on_pin_change1(self, value) - self.text1:set_to(math.ceil(value)) -end - - -local function on_pin_change2(self, value) - self.text2:set_to(math.ceil(value)) -end - - -function init(self) - self.druid = druid.new(self) - - self.text1 = self.druid:new_text("text_value1", 0) - ---@type druid.pin_knob - self.pin_knob = self.druid:new(pin_knob, on_pin_change1, "pin_knob1") - self.pin_knob:set_angle(-10, -270, 270) - - self.text2 = self.druid:new_text("text_value2", 0) - ---@type druid.pin_knob - self.pin_knob2 = self.druid:new(pin_knob, on_pin_change2, "pin_knob2") - self.pin_knob2:set_angle(0, -90, 90) - self.pin_knob2:set_friction(0.15) -end - - -function final(self) - self.druid:final() -end - - -function update(self, dt) - self.druid:update(dt) -end - - -function on_message(self, message_id, message, sender) - self.druid:on_message(message_id, message, sender) -end - - -function on_input(self, action_id, action) - return self.druid:on_input(action_id, action) -end
    add(self, data, index, shift_policy)Add element to DataList.
    clear(self) Clear the DataList and refresh visualsDruid System on_remove function
    remove(self, index, shift_policy)Remove element from DataList.
    remove_by_data(self, data, shift_policy)Remove element from DataList by data value.
    scroll_to_index(self, index) Instant scroll to element with passed index