mirror of
https://github.com/luanti-org/luanti.git
synced 2025-09-30 19:22:14 +00:00
Merge remote-tracking branch 'upstream/master' into Visuals-Vol-2
This commit is contained in:
commit
66aeedc74d
667 changed files with 34156 additions and 87678 deletions
20
.github/CONTRIBUTING.md
vendored
20
.github/CONTRIBUTING.md
vendored
|
@ -25,16 +25,16 @@ Contributions are welcome! Here's how you can help:
|
|||
the work, to avoid disappointment.
|
||||
|
||||
You may also benefit from discussing on our IRC development channel
|
||||
[#luanti-dev](http://www.luanti.org/irc/). Note that a proper IRC client
|
||||
[#luanti-dev](https://docs.luanti.org/about/irc/). Note that a proper IRC client
|
||||
is required to speak on this channel.
|
||||
|
||||
3. Start coding!
|
||||
- Refer to the
|
||||
[Lua API](https://github.com/luanti-org/luanti/blob/master/doc/lua_api.md),
|
||||
[Developer Wiki](https://dev.luanti.org/) and other
|
||||
[Luanti Documentation](https://docs.luanti.org/) and other
|
||||
[documentation](https://github.com/luanti-org/luanti/tree/master/doc).
|
||||
- Follow the [C/C++](https://dev.luanti.org/Code_style_guidelines) and
|
||||
[Lua](https://dev.luanti.org/Lua_code_style_guidelines) code style guidelines.
|
||||
- Follow the [C/C++](https://docs.luanti.org/for-engine-devs/code-style-guidelines/) and
|
||||
[Lua](https://docs.luanti.org/for-engine-devs/lua-code-style-guidelines/) code style guidelines.
|
||||
- Check your code works as expected and document any changes to the Lua API.
|
||||
- To avoid conflicting changes between contributions, do not do the following manually. They will be done before each release.
|
||||
- Run `updatepo.sh` or update `luanti.po{,t}` even if your code adds new translatable strings.
|
||||
|
@ -64,8 +64,8 @@ Contributions are welcome! Here's how you can help:
|
|||
picture of the project.
|
||||
2. It works.
|
||||
3. It follows the code style for
|
||||
[C/C++](https://dev.luanti.org/Code_style_guidelines) or
|
||||
[Lua](https://dev.luanti.org/Lua_code_style_guidelines).
|
||||
[C/C++](https://docs.luanti.org/for-engine-devs/code-style-guidelines/) or
|
||||
[Lua](https://docs.luanti.org/for-engine-devs/lua-code-style-guidelines/).
|
||||
4. The code's interfaces are well designed, regardless of other aspects that
|
||||
might need more work in the future.
|
||||
5. It uses protocols and formats which include the required compatibility.
|
||||
|
@ -106,7 +106,7 @@ the project page with a list of current languages
|
|||
Builtin (the component which contains things like server messages, chat command
|
||||
descriptions, privilege descriptions) is translated separately; it needs to be
|
||||
translated by editing a `.tr` text file. See
|
||||
[Translation](https://dev.luanti.org/Translation) for more information.
|
||||
[Translation](https://docs.luanti.org/for-creators/translation/) for more information.
|
||||
|
||||
## Donations
|
||||
|
||||
|
@ -116,11 +116,11 @@ methods on [our website](http://www.luanti.org/development/#donate).
|
|||
# Maintaining
|
||||
|
||||
* This is a concise version of the
|
||||
[Rules & Guidelines](https://dev.luanti.org/engine-dev-process/) on the developer wiki.*
|
||||
[Rules & Guidelines](https://docs.luanti.org/for-engine-devs/) on the Luanti Documentation.*
|
||||
|
||||
These notes are for those who have push access Luanti (core developers / maintainers).
|
||||
|
||||
- See the [project organisation](https://dev.luanti.org/Organisation) for the people involved.
|
||||
- See the [project organisation](https://docs.luanti.org/for-engine-devs/organization/) for the people involved.
|
||||
|
||||
## Concept approvals and roadmaps
|
||||
|
||||
|
@ -169,4 +169,4 @@ Submit a :+1: (+1) or "Looks good" comment to show you believe the pull-request
|
|||
|
||||
## Releasing a new version
|
||||
|
||||
*Refer to [dev.luanti.org/Releasing_Luanti](https://dev.luanti.org/Releasing_Luanti)*
|
||||
*Refer to [docs.luanti.org/for-engine-devs/releasing-luanti](https://docs.luanti.org/for-engine-devs/releasing-luanti/)*
|
||||
|
|
18
.github/workflows/linux.yml
vendored
18
.github/workflows/linux.yml
vendored
|
@ -14,6 +14,7 @@ on:
|
|||
- 'cmake/Modules/**'
|
||||
- 'po/**.po'
|
||||
- 'util/ci/**'
|
||||
- 'util/helper_mod/**'
|
||||
- '.github/workflows/linux.yml'
|
||||
pull_request:
|
||||
paths:
|
||||
|
@ -27,6 +28,7 @@ on:
|
|||
- 'cmake/Modules/**'
|
||||
- 'po/**.po'
|
||||
- 'util/ci/**'
|
||||
- 'util/helper_mod/**'
|
||||
- '.github/workflows/linux.yml'
|
||||
|
||||
env:
|
||||
|
@ -76,6 +78,8 @@ jobs:
|
|||
env:
|
||||
CC: gcc-14
|
||||
CXX: g++-14
|
||||
# just to check that they compile correctly
|
||||
CMAKE_FLAGS: '-DBUILD_BENCHMARKS=1'
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
|
@ -132,16 +136,16 @@ jobs:
|
|||
run: |
|
||||
./util/test_multiplayer.sh
|
||||
|
||||
# Build with prometheus-cpp (server-only)
|
||||
clang_11_prometheus:
|
||||
name: "clang_11 (PROMETHEUS=1)"
|
||||
runs-on: ubuntu-22.04
|
||||
# Build with prometheus-cpp (server-only), also runs on ARM64
|
||||
clang_prometheus_arm:
|
||||
name: "clang (with Prometheus, ARM64)"
|
||||
runs-on: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install deps
|
||||
run: |
|
||||
source ./util/ci/common.sh
|
||||
install_linux_deps clang-11
|
||||
install_linux_deps --headless clang libluajit-5.1-dev
|
||||
|
||||
- name: Build prometheus-cpp
|
||||
run: ./util/ci/build_prometheus_cpp.sh
|
||||
|
@ -150,8 +154,8 @@ jobs:
|
|||
run: |
|
||||
./util/ci/build.sh
|
||||
env:
|
||||
CC: clang-11
|
||||
CXX: clang++-11
|
||||
CC: clang
|
||||
CXX: clang++
|
||||
CMAKE_FLAGS: "-DENABLE_PROMETHEUS=1 -DBUILD_CLIENT=0 -DENABLE_CURSES=0"
|
||||
|
||||
- name: Test
|
||||
|
|
|
@ -14,7 +14,7 @@ set(CLANG_MINIMUM_VERSION "7.0.1")
|
|||
|
||||
# You should not need to edit these manually, use util/bump_version.sh
|
||||
set(VERSION_MAJOR 5)
|
||||
set(VERSION_MINOR 12)
|
||||
set(VERSION_MINOR 14)
|
||||
set(VERSION_PATCH 0)
|
||||
set(VERSION_EXTRA "" CACHE STRING "Stuff to append to version string")
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ Table of Contents
|
|||
Further documentation
|
||||
----------------------
|
||||
- Website: https://www.luanti.org/
|
||||
- Wiki: https://wiki.luanti.org/
|
||||
- Luanti Documentation: https://docs.luanti.org/
|
||||
- Forum: https://forum.luanti.org/
|
||||
- GitHub: https://github.com/luanti-org/luanti/
|
||||
- [Developer documentation](doc/developing/)
|
||||
|
|
|
@ -8,4 +8,5 @@
|
|||
<string name="unzip_notification_description">Menos de 1 minuto…</string>
|
||||
<string name="ime_dialog_done">Feito</string>
|
||||
<string name="no_web_browser">Non se atopou ningún navegador web</string>
|
||||
<string name="game_notification_title">Luanti está en funcionamento</string>
|
||||
</resources>
|
||||
|
|
12
android/app/src/main/res/values-iw/strings.xml
Normal file
12
android/app/src/main/res/values-iw/strings.xml
Normal file
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="label">לואנטי</string>
|
||||
<string name="loading">טוען…</string>
|
||||
<string name="notification_channel_name">הודעה כללית</string>
|
||||
<string name="notification_channel_description">התראות מלואנטי</string>
|
||||
<string name="unzip_notification_title">טוען לואנטי</string>
|
||||
<string name="game_notification_title">לואנטי רץ</string>
|
||||
<string name="ime_dialog_done">בוצע</string>
|
||||
<string name="no_web_browser">לא נמצא דפדפן אינטרנט</string>
|
||||
<string name="unzip_notification_description">פחות מדקה אחת…</string>
|
||||
</resources>
|
|
@ -8,4 +8,5 @@
|
|||
<string name="notification_channel_description">Obvestilo od Luantia</string>
|
||||
<string name="ime_dialog_done">Končano!l</string>
|
||||
<string name="unzip_notification_title">Nalaganje Luantia</string>
|
||||
<string name="game_notification_title">Luanti deluje</string>
|
||||
</resources>
|
||||
|
|
|
@ -8,4 +8,5 @@
|
|||
<string name="unzip_notification_description">Менше за 1 хвилину…</string>
|
||||
<string name="ime_dialog_done">Готово</string>
|
||||
<string name="notification_channel_description">Сповіщення від Luanti</string>
|
||||
<string name="game_notification_title">Luanti працює</string>
|
||||
</resources>
|
|
@ -8,4 +8,5 @@
|
|||
<string name="unzip_notification_description">不到1分钟…</string>
|
||||
<string name="ime_dialog_done">完成</string>
|
||||
<string name="no_web_browser">未找到网页浏览器</string>
|
||||
<string name="game_notification_title">Luanti正在运行</string>
|
||||
</resources>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
project.ext.set("versionMajor", 5) // Version Major
|
||||
project.ext.set("versionMinor", 12) // Version Minor
|
||||
project.ext.set("versionMinor", 14) // Version Minor
|
||||
project.ext.set("versionPatch", 0) // Version Patch
|
||||
// ^ keep in sync with cmake
|
||||
|
||||
|
|
|
@ -438,13 +438,30 @@ function make.key(setting)
|
|||
if value == "" then
|
||||
return height
|
||||
end
|
||||
|
||||
local critical_keys = {
|
||||
keymap_drop = true,
|
||||
keymap_dig = true,
|
||||
keymap_place = true,
|
||||
}
|
||||
|
||||
for _, o in ipairs(core.full_settingtypes) do
|
||||
if o.type == "key" and o.name ~= setting.name and core.are_keycodes_equal(core.settings:get(o.name), value) then
|
||||
if o.type == "key" and o.name ~= setting.name and
|
||||
core.are_keycodes_equal(core.settings:get(o.name), value) then
|
||||
|
||||
local is_current_close_world = setting.name == "keymap_close_world"
|
||||
local is_other_close_world = o.name == "keymap_close_world"
|
||||
local is_current_critical = critical_keys[setting.name]
|
||||
local is_other_critical = critical_keys[o.name]
|
||||
|
||||
if (is_other_critical or is_current_critical) or
|
||||
(not is_current_close_world and not is_other_close_world) then
|
||||
table.insert(fs, ("label[0,%f;%s]"):format(height + 0.3,
|
||||
core.colorize(mt_color_orange, fgettext([[Conflicts with "$1"]], fgettext(o.readable_name)))))
|
||||
height = height + 0.6
|
||||
end
|
||||
end
|
||||
end
|
||||
return height
|
||||
end
|
||||
return {
|
||||
|
@ -454,12 +471,12 @@ function make.key(setting)
|
|||
|
||||
get_formspec = function(self, avail_w)
|
||||
self.resettable = core.settings:has(setting.name)
|
||||
local btn_bind_width = math.max(2.5, avail_w/2)
|
||||
local btn_bind_width = math.max(2.5, avail_w / 2)
|
||||
local value = core.settings:get(setting.name)
|
||||
local fs = {
|
||||
("label[0,0.4;%s]"):format(get_label(setting)),
|
||||
("button_key[%f,0;%f,0.8;%s;%s]"):format(
|
||||
btn_bind_width, btn_bind_width-0.8,
|
||||
btn_bind_width, btn_bind_width - 0.8,
|
||||
btn_bind, core.formspec_escape(value)),
|
||||
("image_button[%f,0;0.8,0.8;%s;%s;]"):format(avail_w - 0.8,
|
||||
core.formspec_escape(defaulttexturedir .. "clear.png"),
|
||||
|
|
|
@ -16,7 +16,7 @@ local minetest_example_header = [[
|
|||
# to the program, eg. "luanti.exe --config ../minetest.conf.example".
|
||||
|
||||
# Further documentation:
|
||||
# https://wiki.luanti.org/
|
||||
# https://docs.luanti.org/
|
||||
|
||||
]]
|
||||
|
||||
|
@ -44,15 +44,18 @@ local function create_minetest_conf_example(settings)
|
|||
insert(result, rep("#", entry.level))
|
||||
insert(result, "# " .. entry.name .. "\n\n")
|
||||
end
|
||||
else
|
||||
else -- any `type` as listed in `settingtypes.txt`
|
||||
local group_format = false
|
||||
if entry.noise_params and entry.values then
|
||||
if entry.type == "noise_params_2d" or entry.type == "noise_params_3d" then
|
||||
group_format = true
|
||||
end
|
||||
end
|
||||
if entry.comment ~= "" then
|
||||
for _, comment_line in ipairs(entry.comment:split("\n", true)) do
|
||||
|
||||
local comment = entry.comment ~= "" and entry.comment
|
||||
or entry.readable_name -- fallback to the short description
|
||||
if comment ~= "" then
|
||||
for _, comment_line in ipairs(comment:split("\n", true)) do
|
||||
if comment_line == "" then
|
||||
insert(result, "#\n")
|
||||
else
|
||||
|
@ -102,23 +105,45 @@ end
|
|||
local translation_file_header = [[
|
||||
// This file is automatically generated
|
||||
// It contains a bunch of fake gettext calls, to tell xgettext about the strings in config files
|
||||
// To update it, refer to the bottom of builtin/mainmenu/dlg_settings_advanced.lua
|
||||
// To update it, refer to the bottom of builtin/common/settings/init.lua
|
||||
|
||||
fake_function() {]]
|
||||
|
||||
local function add_translation_string(result, str, seen)
|
||||
if seen[str] then
|
||||
return
|
||||
end
|
||||
seen[str] = true
|
||||
|
||||
-- Prevent gettext from interpreting e.g. "50% of volume" as C-formatted string
|
||||
-- Documentation: https://www.gnu.org/software/gettext/manual/html_node/c_002dformat-Flag.html
|
||||
local force_no_c_format = str:find("%", 1, true)
|
||||
local prefix = force_no_c_format and "/* xgettext:no-c-format */ " or ""
|
||||
|
||||
local have_newlines = str:find("\n", 1, true)
|
||||
if have_newlines then
|
||||
-- Formatting as "%q" inserts literal newlines. But we want '\n'.
|
||||
-- Hence, use "%s" and escape relevant characters manually.
|
||||
str = str:gsub("\n", "\\n")
|
||||
str = str:gsub("\"", "\\\"")
|
||||
insert(result, sprintf("\t%sgettext(\"%s\");", prefix, str))
|
||||
else
|
||||
insert(result, sprintf("\t%sgettext(%q);", prefix, str))
|
||||
end
|
||||
end
|
||||
|
||||
local function create_translation_file(settings)
|
||||
local seen = {} -- to deduplicate entries
|
||||
local result = { translation_file_header }
|
||||
for _, entry in ipairs(settings) do
|
||||
if entry.type == "category" then
|
||||
insert(result, sprintf("\tgettext(%q);", entry.name))
|
||||
add_translation_string(result, entry.name, seen)
|
||||
else
|
||||
if entry.readable_name then
|
||||
insert(result, sprintf("\tgettext(%q);", entry.readable_name))
|
||||
add_translation_string(result, entry.readable_name, seen)
|
||||
end
|
||||
if entry.comment ~= "" then
|
||||
local comment_escaped = entry.comment:gsub("\n", "\\n")
|
||||
comment_escaped = comment_escaped:gsub("\"", "\\\"")
|
||||
insert(result, "\tgettext(\"" .. comment_escaped .. "\");")
|
||||
add_translation_string(result, entry.comment, seen)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,6 +19,7 @@ function meta:__newindex(name, value)
|
|||
return
|
||||
end
|
||||
local info = getinfo(2, "Sl")
|
||||
if info ~= nil then
|
||||
local desc = ("%s:%d"):format(info.short_src, info.currentline)
|
||||
local warn_key = ("%s\0%d\0%s"):format(info.source, info.currentline, name)
|
||||
if not warned[warn_key] and info.what ~= "main" and info.what ~= "C" then
|
||||
|
@ -26,6 +27,7 @@ function meta:__newindex(name, value)
|
|||
:format(name, desc))
|
||||
warned[warn_key] = true
|
||||
end
|
||||
end
|
||||
declared[name] = true
|
||||
end
|
||||
|
||||
|
@ -35,6 +37,9 @@ function meta:__index(name)
|
|||
return
|
||||
end
|
||||
local info = getinfo(2, "Sl")
|
||||
if info == nil then
|
||||
return
|
||||
end
|
||||
local warn_key = ("%s\0%d\0%s"):format(info.source, info.currentline, name)
|
||||
if not warned[warn_key] and info.what ~= "C" then
|
||||
core.log("warning", ("Undeclared global variable %q accessed at %s:%s")
|
||||
|
|
|
@ -432,7 +432,32 @@ describe("vector", function()
|
|||
assert.True(almost_equal({x = 1, y = 0, z = 0},
|
||||
vector.rotate({x = 1, y = 0, z = 0}, {x = math.pi / 123, y = 0, z = 0})))
|
||||
end)
|
||||
it("is counterclockwise", function()
|
||||
it("rotation order is Z-X-Y", function()
|
||||
local r = vector.new(1, 2, 3)
|
||||
for _, v in ipairs({
|
||||
vector.new(1, 0, 0),
|
||||
vector.new(0, 1, 0),
|
||||
vector.new(0, 0, 1),
|
||||
}) do
|
||||
local expected = v:rotate(r)
|
||||
local function try(order)
|
||||
local rotated = v
|
||||
for axis in order:gmatch(".") do
|
||||
local r_axis = vector.zero()
|
||||
r_axis[axis] = r[axis]
|
||||
rotated = vector.rotate(rotated, r_axis)
|
||||
end
|
||||
return almost_equal(rotated, expected)
|
||||
end
|
||||
assert.False(try("xyz"))
|
||||
assert.False(try("xzy"))
|
||||
assert.False(try("yxz"))
|
||||
assert.False(try("yzx"))
|
||||
assert.True(try("zxy"))
|
||||
assert.False(try("zyx"))
|
||||
end
|
||||
end)
|
||||
it("is right handed", function()
|
||||
local v_before1 = {x = 0, y = 1, z = -1}
|
||||
local v_after1 = vector.rotate(v_before1, {x = math.pi / 4, y = 0, z = 0})
|
||||
assert.True(almost_equal(vector.normalize(vector.cross(v_after1, v_before1)), {x = 1, y = 0, z = 0}))
|
||||
|
|
|
@ -118,7 +118,7 @@ function ui.update()
|
|||
|
||||
if (active_toplevel_ui_elements > 1) then
|
||||
core.log("warning", "more than one active ui "..
|
||||
"element, self most likely isn't intended")
|
||||
"element, this most likely isn't intended")
|
||||
end
|
||||
|
||||
if (active_toplevel_ui_elements == 0) then
|
||||
|
|
|
@ -47,6 +47,7 @@ core.features = {
|
|||
particle_blend_clip = true,
|
||||
remove_item_match_meta = true,
|
||||
httpfetch_additional_methods = true,
|
||||
object_guids = true,
|
||||
}
|
||||
|
||||
function core.has_feature(arg)
|
||||
|
|
|
@ -740,16 +740,16 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items
|
|||
--
|
||||
|
||||
local get_node_raw = core.get_node_raw
|
||||
core.get_node_raw = nil
|
||||
local get_name_from_content_id = core.get_name_from_content_id
|
||||
|
||||
function core.get_node(pos)
|
||||
local content, param1, param2 = get_node_raw(pos.x, pos.y, pos.z)
|
||||
return {name = core.get_name_from_content_id(content), param1 = param1, param2 = param2}
|
||||
return {name = get_name_from_content_id(content), param1 = param1, param2 = param2}
|
||||
end
|
||||
|
||||
function core.get_node_or_nil(pos)
|
||||
local content, param1, param2, pos_ok = get_node_raw(pos.x, pos.y, pos.z)
|
||||
return pos_ok and
|
||||
{name = core.get_name_from_content_id(content), param1 = param1, param2 = param2}
|
||||
{name = get_name_from_content_id(content), param1 = param1, param2 = param2}
|
||||
or nil
|
||||
end
|
||||
|
|
|
@ -130,6 +130,7 @@ core.protocol_versions = {
|
|||
["5.10.0"] = 46,
|
||||
["5.11.0"] = 47,
|
||||
["5.12.0"] = 48,
|
||||
["5.13.0"] = 49,
|
||||
}
|
||||
|
||||
setmetatable(core.protocol_versions, {__newindex = function()
|
||||
|
|
|
@ -3,18 +3,61 @@
|
|||
-- SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
|
||||
|
||||
local function get_info_formspec(size, padding, text)
|
||||
return table.concat({
|
||||
"formspec_version[6]",
|
||||
"size[", size.x, ",", size.y, "]",
|
||||
"padding[0,0]",
|
||||
"bgcolor[;true]",
|
||||
local function get_description_hypertext(package, info, loading_error)
|
||||
-- Screenshots and description
|
||||
local hypertext = "<big><b>" .. core.hypertext_escape(package.short_description) .. "</b></big>\n"
|
||||
|
||||
"label[4,4.35;", text, "]",
|
||||
"container[", padding.x, ",", size.y - 0.8 - padding.y, "]",
|
||||
"button[0,0;2,0.8;back;", fgettext("Back"), "]",
|
||||
"container_end[]",
|
||||
})
|
||||
local screenshots = info and info.screenshots or {{url = package.thumbnail}}
|
||||
|
||||
local winfo = core.get_window_info()
|
||||
local fs_to_px = winfo.size.x / winfo.max_formspec_size.x
|
||||
for i, ss in ipairs(screenshots) do
|
||||
local path = get_screenshot(package, ss.url, 2)
|
||||
hypertext = hypertext .. "<action name=\"ss_".. i .. "\"><img name=\"" ..
|
||||
core.hypertext_escape(path) .. "\" width=" .. (3 * fs_to_px) ..
|
||||
" height=" .. (2 * fs_to_px) .. "></action>"
|
||||
if i ~= #screenshots then
|
||||
hypertext = hypertext .. "<img name=\"blank.png\" width=" .. (0.25 * fs_to_px) ..
|
||||
" height=" .. (2.25 * fs_to_px).. ">"
|
||||
end
|
||||
end
|
||||
|
||||
if info then
|
||||
hypertext = hypertext .. "\n" .. info.long_description.head
|
||||
|
||||
local first = true
|
||||
local function add_link_button(label, name)
|
||||
if info[name] then
|
||||
if not first then
|
||||
hypertext = hypertext .. " | "
|
||||
end
|
||||
hypertext = hypertext .. "<action name=link_" .. name .. ">" .. label .. "</action>"
|
||||
info.long_description.links["link_" .. name] = info[name]
|
||||
first = false
|
||||
end
|
||||
end
|
||||
|
||||
add_link_button(hgettext("Donate"), "donate_url")
|
||||
add_link_button(hgettext("Website"), "website")
|
||||
add_link_button(hgettext("Source"), "repo")
|
||||
add_link_button(hgettext("Issue Tracker"), "issue_tracker")
|
||||
add_link_button(hgettext("Translate"), "translation_url")
|
||||
add_link_button(hgettext("Forum Topic"), "forum_url")
|
||||
|
||||
hypertext = hypertext .. "\n\n" .. info.long_description.body
|
||||
|
||||
elseif loading_error then
|
||||
hypertext = hypertext .. "\n\n" .. hgettext("Error loading package information")
|
||||
else
|
||||
hypertext = hypertext .. "\n\n" .. hgettext("Loading...")
|
||||
end
|
||||
|
||||
-- Fix the path to blank.png. This is needed for bullet indentation,
|
||||
-- and also used for screenshot spacing.
|
||||
hypertext = hypertext:gsub("<img name=\"?blank.png\"? ",
|
||||
"<img name=\"" .. core.hypertext_escape(defaulttexturedir) .. "blank.png\" ")
|
||||
|
||||
return hypertext
|
||||
end
|
||||
|
||||
|
||||
|
@ -41,18 +84,10 @@ local function get_formspec(data)
|
|||
|
||||
assert(data.package.name == info.name)
|
||||
data.info = info
|
||||
-- note: get_full_package_info can also return cached info immediately
|
||||
ui.update()
|
||||
end)
|
||||
end
|
||||
|
||||
-- get_full_package_info can return cached info immediately, so
|
||||
-- check to see if that happened
|
||||
if not data.info then
|
||||
if data.loading_error then
|
||||
return get_info_formspec(size, window_padding, fgettext("Error loading package information"))
|
||||
end
|
||||
return get_info_formspec(size, window_padding, fgettext("Loading..."))
|
||||
end
|
||||
end
|
||||
|
||||
-- Check installation status
|
||||
|
@ -60,10 +95,14 @@ local function get_formspec(data)
|
|||
|
||||
local info = data.info
|
||||
|
||||
local info_line =
|
||||
fgettext("by $1 — $2 downloads — +$3 / $4 / -$5",
|
||||
local info_line
|
||||
if info then
|
||||
info_line = fgettext_ne("by $1 — $2 downloads — +$3 / $4 / -$5",
|
||||
info.author, info.downloads,
|
||||
info.reviews.positive, info.reviews.neutral, info.reviews.negative)
|
||||
else
|
||||
info_line = fgettext_ne("by $1", package.author)
|
||||
end
|
||||
|
||||
local bottom_buttons_y = H - 0.8
|
||||
|
||||
|
@ -79,7 +118,7 @@ local function get_formspec(data)
|
|||
"button[", W - 3, ",", bottom_buttons_y, ";3,0.8;open_contentdb;", fgettext("ContentDB page"), "]",
|
||||
|
||||
"style_type[label;font_size=+24;font=bold]",
|
||||
"label[0,0.4;", core.formspec_escape(info.title), "]",
|
||||
"label[0,0.4;", core.formspec_escape(package.title), "]",
|
||||
"style_type[label;font_size=;font=]",
|
||||
|
||||
"label[0,1.2;", core.formspec_escape(info_line), "]",
|
||||
|
@ -100,11 +139,13 @@ local function get_formspec(data)
|
|||
formspec[#formspec + 1] = "image_button[5,0;1,1;" .. core.formspec_escape(defaulttexturedir)
|
||||
formspec[#formspec + 1] = "cdb_queued.png;queued;]"
|
||||
elseif not package.path then
|
||||
local label = info and fgettext("Install [$1]", info.download_size) or
|
||||
fgettext("Install")
|
||||
formspec[#formspec + 1] = "style[install;bgcolor=green]"
|
||||
formspec[#formspec + 1] = "button["
|
||||
formspec[#formspec + 1] = right_button_rect
|
||||
formspec[#formspec + 1] =";install;"
|
||||
formspec[#formspec + 1] = fgettext("Install [$1]", info.download_size)
|
||||
formspec[#formspec + 1] = label
|
||||
formspec[#formspec + 1] = "]"
|
||||
else
|
||||
if package.installed_release < package.release then
|
||||
|
@ -125,13 +166,15 @@ local function get_formspec(data)
|
|||
formspec[#formspec + 1] = "]"
|
||||
end
|
||||
|
||||
local review_count = info.reviews.positive + info.reviews.neutral + info.reviews.negative
|
||||
local current_tab = data.current_tab or 1
|
||||
local tab_titles = {
|
||||
fgettext("Description"),
|
||||
fgettext("Information"),
|
||||
fgettext("Reviews") .. core.formspec_escape(" [" .. review_count .. "]"),
|
||||
}
|
||||
if info then
|
||||
local review_count = info.reviews.positive + info.reviews.neutral + info.reviews.negative
|
||||
table.insert(tab_titles, fgettext("Information"))
|
||||
table.insert(tab_titles, fgettext("Reviews") .. core.formspec_escape(" [" .. review_count .. "]"))
|
||||
end
|
||||
|
||||
local tab_body_height = bottom_buttons_y - 2.8
|
||||
|
||||
|
@ -147,59 +190,21 @@ local function get_formspec(data)
|
|||
})
|
||||
|
||||
if current_tab == 1 then
|
||||
-- Screenshots and description
|
||||
local hypertext = "<big><b>" .. core.hypertext_escape(info.short_description) .. "</b></big>\n"
|
||||
local winfo = core.get_window_info()
|
||||
local fs_to_px = winfo.size.x / winfo.max_formspec_size.x
|
||||
for i, ss in ipairs(info.screenshots) do
|
||||
local path = get_screenshot(package, ss.url, 2)
|
||||
hypertext = hypertext .. "<action name=\"ss_".. i .. "\"><img name=\"" ..
|
||||
core.hypertext_escape(path) .. "\" width=" .. (3 * fs_to_px) ..
|
||||
" height=" .. (2 * fs_to_px) .. "></action>"
|
||||
if i ~= #info.screenshots then
|
||||
hypertext = hypertext .. "<img name=\"blank.png\" width=" .. (0.25 * fs_to_px) ..
|
||||
" height=" .. (2.25 * fs_to_px).. ">"
|
||||
end
|
||||
end
|
||||
hypertext = hypertext .. "\n" .. info.long_description.head
|
||||
|
||||
local first = true
|
||||
local function add_link_button(label, name)
|
||||
if info[name] then
|
||||
if not first then
|
||||
hypertext = hypertext .. " | "
|
||||
end
|
||||
hypertext = hypertext .. "<action name=link_" .. name .. ">" .. core.hypertext_escape(label) .. "</action>"
|
||||
info.long_description.links["link_" .. name] = info[name]
|
||||
first = false
|
||||
end
|
||||
end
|
||||
|
||||
add_link_button(fgettext("Donate"), "donate_url")
|
||||
add_link_button(fgettext("Website"), "website")
|
||||
add_link_button(fgettext("Source"), "repo")
|
||||
add_link_button(fgettext("Issue Tracker"), "issue_tracker")
|
||||
add_link_button(fgettext("Translate"), "translation_url")
|
||||
add_link_button(fgettext("Forum Topic"), "forum_url")
|
||||
|
||||
hypertext = hypertext .. "\n\n" .. info.long_description.body
|
||||
|
||||
-- Fix the path to blank.png. This is needed for bullet indentation.
|
||||
hypertext = hypertext:gsub("<img name=\"?blank.png\"? ",
|
||||
"<img name=\"" .. core.hypertext_escape(defaulttexturedir) .. "blank.png\" ")
|
||||
|
||||
local hypertext = get_description_hypertext(package, info, data.loading_error)
|
||||
table.insert_all(formspec, {
|
||||
"hypertext[0,0;", W, ",", tab_body_height - 0.375,
|
||||
";desc;", core.formspec_escape(hypertext), "]",
|
||||
})
|
||||
|
||||
elseif current_tab == 2 then
|
||||
assert(info)
|
||||
local hypertext = info.info_hypertext.head .. info.info_hypertext.body
|
||||
table.insert_all(formspec, {
|
||||
"hypertext[0,0;", W, ",", tab_body_height - 0.375,
|
||||
";info;", core.formspec_escape(hypertext), "]",
|
||||
})
|
||||
elseif current_tab == 3 then
|
||||
assert(info)
|
||||
if not package.reviews and not data.reviews_error and not data.reviews_loading then
|
||||
data.reviews_loading = true
|
||||
|
||||
|
@ -286,10 +291,6 @@ local function handle_submit(this, fields)
|
|||
return true
|
||||
end
|
||||
|
||||
if not info then
|
||||
return false
|
||||
end
|
||||
|
||||
if fields.open_contentdb then
|
||||
local version = core.get_version()
|
||||
local url = core.settings:get("contentdb_url") .. "/packages/" .. package.url_part ..
|
||||
|
@ -312,6 +313,12 @@ local function handle_submit(this, fields)
|
|||
return true
|
||||
end
|
||||
|
||||
-- The events handled below are only valid if the package info has finished
|
||||
-- loading.
|
||||
if not info then
|
||||
return false
|
||||
end
|
||||
|
||||
if fields.tabs then
|
||||
this.data.current_tab = tonumber(fields.tabs)
|
||||
return true
|
||||
|
|
|
@ -114,9 +114,12 @@ function update_detector.get_all()
|
|||
local ret = {}
|
||||
local all_content = pkgmgr.get_all()
|
||||
for _, content in ipairs(all_content) do
|
||||
assert(content.path and content.path ~= "")
|
||||
local cdb_id = pkgmgr.get_contentdb_id(content)
|
||||
|
||||
if cdb_id then
|
||||
-- Do not consider content that we cannot modify to be out-of-date.
|
||||
-- This would be technically correct but confusing for the user.
|
||||
if cdb_id and core.may_modify_path(content.path) then
|
||||
-- The backend will account for aliases in `latest_releases`
|
||||
local latest_release = latest_releases[cdb_id]
|
||||
if not latest_release and content.type == "game" then
|
||||
|
|
|
@ -48,12 +48,11 @@
|
|||
"#": "For updating active/previous contributors, see the script in ./util/gather_git_credits.py",
|
||||
"contributors": [
|
||||
"Erich Schubert",
|
||||
"wrrrzr",
|
||||
"siliconsniffer",
|
||||
"JosiahWI",
|
||||
"veprogames",
|
||||
"Lucas OH",
|
||||
"Xeno333",
|
||||
"Miguel P.L",
|
||||
"AFCMS"
|
||||
"siliconsniffer",
|
||||
"JosiahWI"
|
||||
],
|
||||
"previous_contributors": [
|
||||
"Ælla Chiana Moskopp (erle) <erle@dieweltistgarnichtso.net> [Logo]",
|
||||
|
|
|
@ -33,13 +33,13 @@ end
|
|||
|
||||
local function buttonhandler(this, fields)
|
||||
if fields.reconfigure then
|
||||
local parent = this.parent
|
||||
|
||||
close_dialog(this)
|
||||
|
||||
local maintab = ui.find_by_name("maintab")
|
||||
|
||||
local dlg = create_settings_dlg("controls_keyboard_and_mouse")
|
||||
dlg:set_parent(maintab)
|
||||
maintab:hide()
|
||||
dlg:set_parent(parent)
|
||||
parent:hide()
|
||||
dlg:show()
|
||||
|
||||
return true
|
||||
|
@ -74,7 +74,7 @@ local function create_rebind_keys_dlg()
|
|||
return dlg
|
||||
end
|
||||
|
||||
function migrate_keybindings()
|
||||
function migrate_keybindings(parent)
|
||||
-- Show migration dialog if the user upgraded from an earlier version
|
||||
-- and this has not yet been shown before, *or* if keys settings had to be changed
|
||||
if core.is_first_run then
|
||||
|
@ -95,14 +95,14 @@ function migrate_keybindings()
|
|||
end
|
||||
|
||||
if not has_migration then
|
||||
return
|
||||
return parent
|
||||
end
|
||||
|
||||
local maintab = ui.find_by_name("maintab")
|
||||
|
||||
local dlg = create_rebind_keys_dlg()
|
||||
dlg:set_parent(maintab)
|
||||
maintab:hide()
|
||||
dlg:set_parent(parent)
|
||||
parent:hide()
|
||||
dlg:show()
|
||||
ui.update()
|
||||
|
||||
return dlg
|
||||
end
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
local SETTING_NAME = "no_mtg_notification"
|
||||
|
||||
function check_reinstall_mtg()
|
||||
function check_reinstall_mtg(parent)
|
||||
-- used to be in minetest.conf
|
||||
if core.settings:get_bool(SETTING_NAME) then
|
||||
cache_settings:set_bool(SETTING_NAME, true)
|
||||
|
@ -19,14 +19,14 @@ function check_reinstall_mtg()
|
|||
end
|
||||
|
||||
if cache_settings:get_bool(SETTING_NAME) then
|
||||
return
|
||||
return parent
|
||||
end
|
||||
|
||||
local games = core.get_games()
|
||||
for _, game in ipairs(games) do
|
||||
if game.id == "minetest" then
|
||||
cache_settings:set_bool(SETTING_NAME, true)
|
||||
return
|
||||
return parent
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -40,16 +40,16 @@ function check_reinstall_mtg()
|
|||
end
|
||||
if not mtg_world_found then
|
||||
cache_settings:set_bool(SETTING_NAME, true)
|
||||
return
|
||||
return parent
|
||||
end
|
||||
|
||||
local maintab = ui.find_by_name("maintab")
|
||||
|
||||
local dlg = create_reinstall_mtg_dlg()
|
||||
dlg:set_parent(maintab)
|
||||
maintab:hide()
|
||||
dlg:set_parent(parent)
|
||||
parent:hide()
|
||||
dlg:show()
|
||||
ui.update()
|
||||
|
||||
return dlg
|
||||
end
|
||||
|
||||
local function get_formspec(dialogdata)
|
||||
|
@ -74,22 +74,22 @@ end
|
|||
|
||||
local function buttonhandler(this, fields)
|
||||
if fields.reinstall then
|
||||
local parent = this.parent
|
||||
|
||||
-- Don't set "no_mtg_notification" here so that the dialog will be shown
|
||||
-- again if downloading MTG fails for whatever reason.
|
||||
this:delete()
|
||||
|
||||
local maintab = ui.find_by_name("maintab")
|
||||
|
||||
local dlg = create_contentdb_dlg(nil, "minetest/minetest")
|
||||
dlg:set_parent(maintab)
|
||||
maintab:hide()
|
||||
dlg:set_parent(parent)
|
||||
parent:hide()
|
||||
dlg:show()
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
if fields.dismiss then
|
||||
cache_settings:set_bool("no_mtg_notification", true)
|
||||
cache_settings:set_bool(SETTING_NAME, true)
|
||||
this:delete()
|
||||
return true
|
||||
end
|
||||
|
|
|
@ -112,8 +112,12 @@ local function init_globals()
|
|||
tv_main:show()
|
||||
ui.update()
|
||||
|
||||
check_reinstall_mtg()
|
||||
migrate_keybindings()
|
||||
-- synchronous, chain parents to only show one at a time
|
||||
local parent = tv_main
|
||||
parent = migrate_keybindings(parent)
|
||||
check_reinstall_mtg(parent)
|
||||
|
||||
-- asynchronous, will only be shown if we're still on "maintab"
|
||||
check_new_version()
|
||||
end
|
||||
|
||||
|
|
|
@ -182,23 +182,17 @@ invert_hotbar_mouse_wheel (Hotbar: Invert mouse wheel direction) bool false
|
|||
|
||||
[**Keybindings]
|
||||
|
||||
# Key for moving the player forward.
|
||||
keymap_forward (Move forward) key SYSTEM_SCANCODE_26
|
||||
|
||||
# Key for moving the player backward.
|
||||
# Will also disable autoforward, when active.
|
||||
keymap_backward (Move backward) key SYSTEM_SCANCODE_22
|
||||
|
||||
# Key for moving the player left.
|
||||
keymap_left (Move left) key SYSTEM_SCANCODE_4
|
||||
|
||||
# Key for moving the player right.
|
||||
keymap_right (Move right) key SYSTEM_SCANCODE_7
|
||||
|
||||
# Key for jumping.
|
||||
keymap_jump (Jump) key SYSTEM_SCANCODE_44
|
||||
|
||||
# Key for sneaking.
|
||||
# Also used for climbing down and descending in water if aux1_descends is disabled.
|
||||
keymap_sneak (Sneak) key SYSTEM_SCANCODE_225
|
||||
|
||||
|
@ -210,13 +204,11 @@ keymap_dig (Dig/punch/use) key KEY_LBUTTON
|
|||
# (Note: The actual meaning might vary on a per-game basis.)
|
||||
keymap_place (Place/use) key KEY_RBUTTON
|
||||
|
||||
# Key for opening the inventory.
|
||||
keymap_inventory (Open inventory) key SYSTEM_SCANCODE_12
|
||||
|
||||
# Key for moving fast in fast mode.
|
||||
keymap_aux1 (Aux1) key SYSTEM_SCANCODE_8
|
||||
|
||||
# Key for opening the chat window.
|
||||
keymap_chat (Open chat) key SYSTEM_SCANCODE_23
|
||||
|
||||
# Key for opening the chat window to type commands.
|
||||
|
@ -225,70 +217,48 @@ keymap_cmd (Command) key SYSTEM_SCANCODE_56
|
|||
# Key for opening the chat window to type local commands.
|
||||
keymap_cmd_local (Local command) key SYSTEM_SCANCODE_55
|
||||
|
||||
# Key for toggling unlimited view range.
|
||||
keymap_rangeselect (Range select) key
|
||||
keymap_rangeselect (Toggle unlimited view range) key
|
||||
|
||||
# Key for toggling flying.
|
||||
keymap_freemove (Toggle fly) key SYSTEM_SCANCODE_14
|
||||
|
||||
# Key for toggling pitch move mode.
|
||||
keymap_pitchmove (Toggle pitchmove) key
|
||||
|
||||
# Key for toggling fast mode.
|
||||
keymap_fastmove (Toggle fast) key SYSTEM_SCANCODE_13
|
||||
|
||||
# Key for toggling noclip mode.
|
||||
keymap_noclip (Toggle noclip) key SYSTEM_SCANCODE_11
|
||||
|
||||
# Key for selecting the next item in the hotbar.
|
||||
keymap_hotbar_next (Hotbar: select next item) key SYSTEM_SCANCODE_17
|
||||
|
||||
# Key for selecting the previous item in the hotbar.
|
||||
keymap_hotbar_previous (Hotbar: select previous item) key SYSTEM_SCANCODE_5
|
||||
|
||||
# Key for muting the game.
|
||||
keymap_mute (Mute) key SYSTEM_SCANCODE_16
|
||||
|
||||
# Key for increasing the volume.
|
||||
keymap_increase_volume (Increase volume) key
|
||||
|
||||
# Key for decreasing the volume.
|
||||
keymap_decrease_volume (Decrease volume) key
|
||||
|
||||
# Key for toggling autoforward.
|
||||
keymap_autoforward (Toggle automatic forward) key
|
||||
|
||||
# Key for toggling cinematic mode.
|
||||
keymap_cinematic (Toggle cinematic mode) key
|
||||
|
||||
# Key for toggling display of minimap.
|
||||
keymap_minimap (Toggle minimap) key SYSTEM_SCANCODE_25
|
||||
|
||||
# Key for taking screenshots.
|
||||
keymap_screenshot (Screenshot) key SYSTEM_SCANCODE_69
|
||||
|
||||
# Key for toggling fullscreen mode.
|
||||
keymap_fullscreen (Toggle fullscreen) key SYSTEM_SCANCODE_68
|
||||
|
||||
# Key for dropping the currently selected item.
|
||||
keymap_drop (Drop item) key SYSTEM_SCANCODE_20
|
||||
|
||||
# Key to use view zoom when possible.
|
||||
keymap_zoom (Zoom) key SYSTEM_SCANCODE_29
|
||||
|
||||
# Key for toggling the display of the HUD.
|
||||
keymap_toggle_hud (Toggle HUD) key SYSTEM_SCANCODE_58
|
||||
|
||||
# Key for toggling the display of chat.
|
||||
keymap_toggle_chat (Toggle chat log) key SYSTEM_SCANCODE_59
|
||||
|
||||
# Key for toggling the display of the large chat console.
|
||||
keymap_console (Large chat console) key SYSTEM_SCANCODE_67
|
||||
keymap_console (Toggle large chat console) key SYSTEM_SCANCODE_67
|
||||
|
||||
# Key for toggling the display of fog.
|
||||
keymap_toggle_fog (Toggle fog) key SYSTEM_SCANCODE_60
|
||||
|
||||
# Key for toggling the display of debug info.
|
||||
keymap_toggle_debug (Toggle debug info) key SYSTEM_SCANCODE_62
|
||||
|
||||
# Key for toggling the display of the profiler. Used for development.
|
||||
|
@ -297,109 +267,78 @@ keymap_toggle_profiler (Toggle profiler) key SYSTEM_SCANCODE_63
|
|||
# Key for toggling the display of mapblock boundaries.
|
||||
keymap_toggle_block_bounds (Toggle block bounds) key
|
||||
|
||||
# Key for switching between first- and third-person camera.
|
||||
keymap_camera_mode (Toggle camera mode) key SYSTEM_SCANCODE_6
|
||||
|
||||
# Key for increasing the viewing range.
|
||||
keymap_increase_viewing_range_min (Increase view range) key SYSTEM_SCANCODE_46
|
||||
|
||||
# Key for decreasing the viewing range.
|
||||
keymap_decrease_viewing_range_min (Decrease view range) key SYSTEM_SCANCODE_45
|
||||
|
||||
# Key for selecting the first hotbar slot.
|
||||
# Modifier key bind for closing your world.
|
||||
# Requires ESC + the selected key to work.
|
||||
keymap_close_world (Return to Main Menu) key
|
||||
|
||||
keymap_slot1 (Hotbar slot 1) key SYSTEM_SCANCODE_30
|
||||
|
||||
# Key for selecting the second hotbar slot.
|
||||
keymap_slot2 (Hotbar slot 2) key SYSTEM_SCANCODE_31
|
||||
|
||||
# Key for selecting the third hotbar slot.
|
||||
keymap_slot3 (Hotbar slot 3) key SYSTEM_SCANCODE_32
|
||||
|
||||
# Key for selecting the fourth hotbar slot.
|
||||
keymap_slot4 (Hotbar slot 4) key SYSTEM_SCANCODE_33
|
||||
|
||||
# Key for selecting the fifth hotbar slot.
|
||||
keymap_slot5 (Hotbar slot 5) key SYSTEM_SCANCODE_34
|
||||
|
||||
# Key for selecting the sixth hotbar slot.
|
||||
keymap_slot6 (Hotbar slot 6) key SYSTEM_SCANCODE_35
|
||||
|
||||
# Key for selecting the seventh hotbar slot.
|
||||
keymap_slot7 (Hotbar slot 7) key SYSTEM_SCANCODE_36
|
||||
|
||||
# Key for selecting the eighth hotbar slot.
|
||||
keymap_slot8 (Hotbar slot 8) key SYSTEM_SCANCODE_37
|
||||
|
||||
# Key for selecting the ninth hotbar slot.
|
||||
keymap_slot9 (Hotbar slot 9) key SYSTEM_SCANCODE_38
|
||||
|
||||
# Key for selecting the tenth hotbar slot.
|
||||
keymap_slot10 (Hotbar slot 10) key SYSTEM_SCANCODE_39
|
||||
|
||||
# Key for selecting the 11th hotbar slot.
|
||||
keymap_slot11 (Hotbar slot 11) key
|
||||
|
||||
# Key for selecting the 12th hotbar slot.
|
||||
keymap_slot12 (Hotbar slot 12) key
|
||||
|
||||
# Key for selecting the 13th hotbar slot.
|
||||
keymap_slot13 (Hotbar slot 13) key
|
||||
|
||||
# Key for selecting the 14th hotbar slot.
|
||||
keymap_slot14 (Hotbar slot 14) key
|
||||
|
||||
# Key for selecting the 15th hotbar slot.
|
||||
keymap_slot15 (Hotbar slot 15) key
|
||||
|
||||
# Key for selecting the 16th hotbar slot.
|
||||
keymap_slot16 (Hotbar slot 16) key
|
||||
|
||||
# Key for selecting the 17th hotbar slot.
|
||||
keymap_slot17 (Hotbar slot 17) key
|
||||
|
||||
# Key for selecting the 18th hotbar slot.
|
||||
keymap_slot18 (Hotbar slot 18) key
|
||||
|
||||
# Key for selecting the 19th hotbar slot.
|
||||
keymap_slot19 (Hotbar slot 19) key
|
||||
|
||||
# Key for selecting the 20th hotbar slot.
|
||||
keymap_slot20 (Hotbar slot 20) key
|
||||
|
||||
# Key for selecting the 21st hotbar slot.
|
||||
keymap_slot21 (Hotbar slot 21) key
|
||||
|
||||
# Key for selecting the 22nd hotbar slot.
|
||||
keymap_slot22 (Hotbar slot 22) key
|
||||
|
||||
# Key for selecting the 23rd hotbar slot.
|
||||
keymap_slot23 (Hotbar slot 23) key
|
||||
|
||||
# Key for selecting the 24th hotbar slot.
|
||||
keymap_slot24 (Hotbar slot 24) key
|
||||
|
||||
# Key for selecting the 25th hotbar slot.
|
||||
keymap_slot25 (Hotbar slot 25) key
|
||||
|
||||
# Key for selecting the 26th hotbar slot.
|
||||
keymap_slot26 (Hotbar slot 26) key
|
||||
|
||||
# Key for selecting the 27th hotbar slot.
|
||||
keymap_slot27 (Hotbar slot 27) key
|
||||
|
||||
# Key for selecting the 28th hotbar slot.
|
||||
keymap_slot28 (Hotbar slot 28) key
|
||||
|
||||
# Key for selecting the 29th hotbar slot.
|
||||
keymap_slot29 (Hotbar slot 29) key
|
||||
|
||||
# Key for selecting the 30th hotbar slot.
|
||||
keymap_slot30 (Hotbar slot 30) key
|
||||
|
||||
# Key for selecting the 31st hotbar slot.
|
||||
keymap_slot31 (Hotbar slot 31) key
|
||||
|
||||
# Key for selecting the 32nd hotbar slot.
|
||||
keymap_slot32 (Hotbar slot 32) key
|
||||
|
||||
[*Touchscreen]
|
||||
|
@ -2104,11 +2043,11 @@ transparency_sorting_group_by_buffers (Transparency Sorting Group by Buffers) bo
|
|||
cloud_radius (Cloud radius) int 12 8 62
|
||||
|
||||
# Delay between mesh updates on the client in ms. Increasing this will slow
|
||||
# down the rate of mesh updates, thus reducing jitter on slower clients.
|
||||
mesh_generation_interval (Mapblock mesh generation delay) int 0 0 50
|
||||
# down the rate of mesh updates, which can help reduce jitter.
|
||||
mesh_generation_interval (Mapblock mesh generation delay) int 0 0 25
|
||||
|
||||
# Number of threads to use for mesh generation.
|
||||
# Value of 0 (default) will let Luanti autodetect the number of available threads.
|
||||
# Value of 0 (default) will let Luanti automatically choose the number of threads.
|
||||
mesh_generation_threads (Mapblock mesh generation threads) int 0 0 8
|
||||
|
||||
# All mesh buffers with less than this number of vertices will be merged
|
||||
|
|
60
doc/README.md
Normal file
60
doc/README.md
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Documentation
|
||||
|
||||
This directory contains mostly reference documentation for the Luanti engine.
|
||||
For a less prescriptive and more guiding documentation, also look at:
|
||||
https://docs.luanti.org
|
||||
|
||||
Note that the inner workings of the engine are not well documented. It's most
|
||||
often better to read the code.
|
||||
|
||||
Markdown files are written in a way that they can also be read in plain text.
|
||||
When modifying, please keep it that way!
|
||||
|
||||
Here is a list with descriptions of relevant files:
|
||||
|
||||
## Server Modding
|
||||
|
||||
- [lua_api.md](lua_api.md): Server Modding API reference. (Not only the Lua part,
|
||||
but also file structure and everything else.)
|
||||
If you want to make a mod or game, look here!
|
||||
A rendered version is also available at <https://api.luanti.org/>.
|
||||
- [builtin_entities.md](builtin_entities.md): Doc for entities predefined by the
|
||||
engine (in builtin), i.e. dropped items and falling nodes.
|
||||
|
||||
## Client-Side Content
|
||||
|
||||
- [texture_packs.md](texture_packs.md): Layout and description of Luanti's
|
||||
texture packs structure and configuration.
|
||||
- [client_lua_api.md](client_lua_api.md): Client-Provided Client-Side Modding
|
||||
(CPCSM) API reference.
|
||||
|
||||
## Mainmenu scripting
|
||||
|
||||
- [menu_lua_api.md](menu_lua_api.md): API reference for the mainmenu scripting
|
||||
environment.
|
||||
- [fst_api.txt](fst_api.txt): Formspec Toolkit API, included in builtin for the
|
||||
main menu.
|
||||
|
||||
## Formats and Protocols
|
||||
|
||||
- [world_format.md](world_format.md): Structure of Luanti world directories and
|
||||
format of the files therein.
|
||||
Note: If you want to write your own deserializer, it will be easier to read
|
||||
the `serialize()` and `deSerialize()` functions of the various structures in
|
||||
C++, e.g. `MapBlock::deSerialize()`.
|
||||
- [protocol.txt](protocol.txt): *Rough* outline of Luanti's network protocol.
|
||||
|
||||
## Misc.
|
||||
|
||||
- [compiling/](compiling/): Compilation instructions, and options.
|
||||
- [ides/](ides/): Instructions for configuring certain IDEs for engine development.
|
||||
- [developing/](developing/): Information about Luanti development.
|
||||
Note: [developing/profiling.md](developing/profiling.md) can be useful for
|
||||
modders and server owners!
|
||||
- [android.md](android.md): Android quirks.
|
||||
- [direction.md](direction.md): Information related to the future direction of
|
||||
Luanti. Commonly referred to as the roadmap document.
|
||||
- [breakages.md](breakages.md): List of planned breakages for the next major
|
||||
release, i.e. 6.0.0.
|
||||
- [docker_server.md](docker_server.md): Information about our Docker server
|
||||
images in the ghcr.
|
|
@ -42,7 +42,7 @@ configuration file can usually be found at:
|
|||
* After 5.4.2:
|
||||
* `/sdcard/Android/data/net.minetest.minetest/` or `/storage/emulated/0/Android/data/net.minetest.minetest/` if stored on the device
|
||||
* `/storage/emulated/(varying folder name)/Android/data/net.minetest.minetest/` if stored on the SD card
|
||||
* [Learn more about Android directory](https://wiki.luanti.org/Accessing_Android_Data_Directory)
|
||||
* [Learn more about Android directory](https://docs.luanti.org/for-players/mobile/)
|
||||
|
||||
## Useful settings
|
||||
|
||||
|
|
|
@ -25,3 +25,4 @@ This list is largely advisory and items may be reevaluated once the time comes.
|
|||
* remove built-in knockback and related functions entirely
|
||||
* remove `safe` parameter from `core.serialize`, always enforce `safe = true`.
|
||||
possibly error when `loadstring` calls are encountered in `core.deserialize`.
|
||||
* introduce strict type checking for all instances of `v3s16` / `v3f` read from Lua
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
Luanti Lua Client Modding API Reference 5.12.0
|
||||
Luanti Lua Client Modding API Reference 5.14.0
|
||||
==============================================
|
||||
|
||||
**WARNING**: if you're looking for the `minetest` namespace (e.g. `minetest.something`),
|
||||
it's now called `core` due to the renaming of Luanti (formerly Minetest).
|
||||
`minetest` will keep existing as an alias, so that old code won't break.
|
||||
|
||||
Note that `core` has already existed since version 0.4.10, so you can use it
|
||||
safely without breaking backwards compatibility.
|
||||
|
||||
* More information at <http://www.luanti.org/>
|
||||
* Developer Wiki: <https://dev.luanti.org/>
|
||||
* Additional documentation: <https://docs.luanti.org/>
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
|
|
@ -1,26 +1,27 @@
|
|||
# Developer documentation
|
||||
|
||||
## Wiki
|
||||
## Luanti Documentation
|
||||
|
||||
Some important development docs are found in the wiki: https://dev.luanti.org/
|
||||
Some important development docs are found on the docs site: https://docs.luanti.org/
|
||||
|
||||
Notable pages:
|
||||
|
||||
- [Releasing Luanti](https://dev.luanti.org/Releasing_Luanti)
|
||||
- [Engine translations](https://dev.luanti.org/Translation#Maintaining_engine_translations)
|
||||
- [Changelog](https://dev.luanti.org/Changelog)
|
||||
- [Organisation](https://dev.luanti.org/Organisation)
|
||||
- [Code style guidelines](https://dev.luanti.org/Code_style_guidelines)
|
||||
- [Releasing Luanti](https://docs.luanti.org/for-engine-devs/releasing-luanti/)
|
||||
- [Engine translations](https://docs.luanti.org/for-creators/translation/)
|
||||
- [Changelog](https://docs.luanti.org/about/changelog/)
|
||||
- [Organisation](https://docs.luanti.org/for-engine-devs/organization/)
|
||||
- [Code style guidelines](https://docs.luanti.org/for-engine-devs/code-style-guidelines/)
|
||||
and [Lua code style guidelines](https://docs.luanti.org/for-engine-devs/lua-code-style-guidelines/)
|
||||
|
||||
## In this folder
|
||||
|
||||
- [Developing minetestserver with Docker](docker.md)
|
||||
- [Android tips & tricks](android.md)
|
||||
- [OS/library compatibility policy](os-compatibility.md)
|
||||
- [Miscellaneous](misc.md)
|
||||
- [docker.md](docker.md): Developing minetestserver with Docker
|
||||
- [android.md](android.md): Android tips & tricks
|
||||
- [os-compatibility.md](os-compatibility.md): OS/library compatibility policy
|
||||
- [profiling.md](profiling.md): Profiling instructions
|
||||
|
||||
## IRC
|
||||
|
||||
Oftentimes knowledge hasn't been written down (yet) and your best bet is to ask someone experienced and/or the core developers.
|
||||
|
||||
Feel free to join the [#minetest-dev IRC](https://wiki.luanti.org/IRC) and ask questions related to **engine development**.
|
||||
Feel free to join the [#luanti-dev IRC](https://docs.luanti.org/about/irc/) and ask questions related to **engine development**.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Miscellaneous
|
||||
# Profiling
|
||||
|
||||
## Profiling Luanti on Linux with perf
|
||||
|
|
@ -37,7 +37,7 @@ Examples include
|
|||
[general view distance](https://github.com/luanti-org/luanti/issues/7222).
|
||||
|
||||
This includes work on maintaining
|
||||
[our Irrlicht fork](https://github.com/minetest/irrlicht), and switching to
|
||||
[our Irrlicht fork](https://github.com/luanti-org/luanti/tree/master/irr), and switching to
|
||||
alternative libraries to replace Irrlicht functionality as needed
|
||||
|
||||
### 2.2 Internal code refactoring
|
||||
|
|
|
@ -3,8 +3,10 @@ Formspec toolkit api 0.0.3
|
|||
|
||||
Formspec toolkit is a set of functions to create basic ui elements.
|
||||
|
||||
You can find the files in builtin/fstk/.
|
||||
|
||||
File: fst/ui.lua
|
||||
|
||||
File: fstk/ui.lua
|
||||
----------------
|
||||
|
||||
ui.lua adds base ui interface to add additional components to.
|
||||
|
@ -25,7 +27,7 @@ ui.find_by_name(name) --> returns component or nil
|
|||
^ find a component within ui
|
||||
^ name: name of component to look for
|
||||
|
||||
File: fst/tabview.lua
|
||||
File: fstk/tabview.lua
|
||||
---------------------
|
||||
|
||||
tabview_create(name, size, tabheaderpos) --> returns tabview component
|
||||
|
@ -92,7 +94,7 @@ methods:
|
|||
* icon: path to icon
|
||||
* on_click(tabview): callback function
|
||||
|
||||
File: fst/dialog.lua
|
||||
File: fstk/dialog.lua
|
||||
---------------------
|
||||
Only one dialog can be shown at a time. If a dialog is closed it's parent is
|
||||
gonna be activated and shown again.
|
||||
|
@ -129,7 +131,7 @@ members:
|
|||
- parent
|
||||
^ parent component to return to on exit
|
||||
|
||||
File: fst/buttonbar.lua
|
||||
File: fstk/buttonbar.lua
|
||||
-----------------------
|
||||
|
||||
buttonbar_create(name, pos, size, bgcolor, cbf_buttonhandler)
|
||||
|
|
461
doc/lua_api.md
461
doc/lua_api.md
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
Luanti Lua Mainmenu API Reference 5.12.0
|
||||
Luanti Lua Mainmenu API Reference 5.14.0
|
||||
========================================
|
||||
|
||||
Introduction
|
||||
|
@ -23,8 +23,8 @@ Callbacks
|
|||
* `core.button_handler(fields)`: called when a button is pressed.
|
||||
* `fields` = `{name1 = value1, name2 = value2, ...}`
|
||||
* `core.event_handler(event)`
|
||||
* `event`: `"MenuQuit"`, `"KeyEnter"`, `"ExitButton"`, `"EditBoxEnter"` or
|
||||
`"FullscreenChange"`
|
||||
* `event`: `"MenuQuit"` (derived from `quit`) or `"FullscreenChange"`
|
||||
The main menu may issue custom events, such as `"Refresh"` (server list).
|
||||
* `core.on_before_close()`: called before the menu is closed, either to exit or
|
||||
to join a game
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@ Updated 2011-06-18
|
|||
|
||||
A custom protocol over UDP.
|
||||
Integers are big endian.
|
||||
Refer to connection.{h,cpp} for further reference.
|
||||
Refer to network/mtp/internal.h, network/networkprotocol.{h,cpp}, and
|
||||
server/clientiface.h for further reference.
|
||||
|
||||
Initialization:
|
||||
- A dummy reliable packet with peer_id=PEER_ID_INEXISTENT=0 is sent to the server:
|
||||
|
|
|
@ -401,7 +401,7 @@ See below for description.
|
|||
Luanti will correct lighting in the day light bank when the block at
|
||||
`(1, 0, 0)` is also loaded.
|
||||
|
||||
Timestamp and node ID mappings were introduced in map format version 29.
|
||||
Timestamp and node ID mappings come here if map format version >= 29.
|
||||
* `u32` timestamp
|
||||
* Timestamp when last saved, as seconds from starting the game.
|
||||
* `0xffffffff` = invalid/unknown timestamp, nothing should be done with the time
|
||||
|
@ -482,13 +482,7 @@ Timestamp and node ID mappings were introduced in map format version 29.
|
|||
* `s32` timeout * 1000
|
||||
* `s32` elapsed * 1000
|
||||
|
||||
* Since map format version 25:
|
||||
* `u8` length of the data of a single timer (always 2+4+4=10)
|
||||
* `u16` `num_of_timers`
|
||||
* foreach `num_of_timers`:
|
||||
* `u16` timer position (`(z*16*16 + y*16 + x)`)
|
||||
* `s32` timeout * 1000
|
||||
* `s32` elapsed * 1000
|
||||
* Map format version >= 25: see below
|
||||
|
||||
`u8` static object version:
|
||||
* Always 0
|
||||
|
@ -516,6 +510,14 @@ Before map format version 29:
|
|||
* `u16` `name_len`
|
||||
* `u8[name_len]` `name`
|
||||
|
||||
Since map format version 25, node timers come here:
|
||||
* `u8` length of the data of a single timer (always 2+4+4=10)
|
||||
* `u16` `num_of_timers`
|
||||
* foreach `num_of_timers`:
|
||||
* `u16` timer position (`(z*16*16 + y*16 + x)`)
|
||||
* `s32` timeout * 1000
|
||||
* `s32` elapsed * 1000
|
||||
|
||||
End of File (EOF).
|
||||
|
||||
# Format of Nodes
|
||||
|
@ -594,9 +596,11 @@ Object types:
|
|||
* `s32` yaw * 1000
|
||||
|
||||
Since protocol version 37:
|
||||
* `u8` `version2` (=1)
|
||||
* `u8` `version2` (=1 or 2)
|
||||
* `s32` pitch * 1000
|
||||
* `s32` roll * 1000
|
||||
* if version2 >= 2:
|
||||
* `u8[16]` guid
|
||||
|
||||
# Itemstring Format
|
||||
|
||||
|
|
|
@ -106,7 +106,7 @@ core.register_chatcommand("bench_bulk_set_node", {
|
|||
core.chat_send_player(name, "Warming up finished, now benchmarking ...")
|
||||
|
||||
local start_time = core.get_us_time()
|
||||
for i=1,#pos_list do
|
||||
for i = 1, #pos_list do
|
||||
core.set_node(pos_list[i], {name = "mapgen_stone"})
|
||||
end
|
||||
local middle_time = core.get_us_time()
|
||||
|
@ -116,6 +116,7 @@ core.register_chatcommand("bench_bulk_set_node", {
|
|||
((middle_time - start_time)) / 1000,
|
||||
((end_time - middle_time)) / 1000
|
||||
)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
@ -129,16 +130,13 @@ core.register_chatcommand("bench_bulk_get_node", {
|
|||
return false, "No player."
|
||||
end
|
||||
local pos_list = get_positions_cube(player:get_pos())
|
||||
local dummy = 0
|
||||
local function bench()
|
||||
local start_time = core.get_us_time()
|
||||
for i=1,#pos_list do
|
||||
for i = 1, #pos_list do
|
||||
local n = core.get_node(pos_list[i])
|
||||
-- Make sure the name lookup is never optimized away.
|
||||
-- Table allocation might still be omitted. But only accessing
|
||||
-- the name of a node is a common pattern anyways.
|
||||
if n.name == "benchmarks:nonexistent_node" then
|
||||
error("should never happen")
|
||||
end
|
||||
-- Make sure the name lookup is not optimized away (can this even happen?)
|
||||
dummy = dummy + #n.name
|
||||
end
|
||||
return core.get_us_time() - start_time
|
||||
end
|
||||
|
@ -151,6 +149,115 @@ core.register_chatcommand("bench_bulk_get_node", {
|
|||
|
||||
local msg = string.format("Benchmark results: core.get_node loop 1: %.2f ms",
|
||||
result_us / 1000)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
||||
core.register_chatcommand("bench_bulk_get_node_raw", {
|
||||
params = "",
|
||||
description = "Benchmark: Bulk-get 99×99×99 nodes with raw API",
|
||||
func = function(name, param)
|
||||
local player = core.get_player_by_name(name)
|
||||
if not player then
|
||||
return false, "No player."
|
||||
end
|
||||
local pos_list = get_positions_cube(player:get_pos())
|
||||
local dummy = 0
|
||||
local function bench()
|
||||
local start_time = core.get_us_time()
|
||||
for i = 1, #pos_list do
|
||||
local pos_i = pos_list[i]
|
||||
local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z)
|
||||
-- Make sure the result is not optimized away
|
||||
dummy = dummy + nid
|
||||
end
|
||||
return core.get_us_time() - start_time
|
||||
end
|
||||
|
||||
core.chat_send_player(name, "Benchmarking core.get_node_raw. Warming up ...")
|
||||
bench()
|
||||
|
||||
core.chat_send_player(name, "Warming up finished, now benchmarking ...")
|
||||
local result_us = bench()
|
||||
|
||||
local msg = string.format("Benchmark results: core.get_node_raw loop 1: %.2f ms",
|
||||
result_us / 1000)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
||||
core.register_chatcommand("bench_bulk_get_node_raw2", {
|
||||
params = "",
|
||||
description = "Benchmark: Bulk-get 99×99×99 nodes with raw API and lookup names",
|
||||
func = function(name, param)
|
||||
local player = core.get_player_by_name(name)
|
||||
if not player then
|
||||
return false, "No player."
|
||||
end
|
||||
local pos_list = get_positions_cube(player:get_pos())
|
||||
local dummy = 0
|
||||
local function bench()
|
||||
local start_time = core.get_us_time()
|
||||
for i = 1, #pos_list do
|
||||
local pos_i = pos_list[i]
|
||||
local nid = core.get_node_raw(pos_i.x, pos_i.y, pos_i.z)
|
||||
local name = core.get_name_from_content_id(nid)
|
||||
-- Make sure the name lookup is not optimized away
|
||||
dummy = dummy + #name
|
||||
end
|
||||
return core.get_us_time() - start_time
|
||||
end
|
||||
|
||||
core.chat_send_player(name, "Benchmarking core.get_node_raw+get_name_from_content_id. Warming up ...")
|
||||
bench()
|
||||
|
||||
core.chat_send_player(name, "Warming up finished, now benchmarking ...")
|
||||
local result_us = bench()
|
||||
|
||||
local msg = string.format("Benchmark results: core.get_node_raw+get_name_from_content_id loop 1: %.2f ms",
|
||||
result_us / 1000)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
||||
core.register_chatcommand("bench_bulk_get_node_vm", {
|
||||
params = "",
|
||||
description = "Benchmark: Bulk-get 99×99×99 nodes with voxel manipulator",
|
||||
func = function(name, param)
|
||||
local player = core.get_player_by_name(name)
|
||||
if not player then
|
||||
return false, "No player."
|
||||
end
|
||||
local pos = player:get_pos()
|
||||
local dummy = 0
|
||||
local function bench()
|
||||
local start_time = core.get_us_time()
|
||||
local vm = core.get_voxel_manip(pos:offset(1,1,1), pos:offset(100,100,100))
|
||||
local data = vm:get_data()
|
||||
local mid_time = core.get_us_time()
|
||||
-- Note that the VManip will actually retrieve more than just the 100³ nodes
|
||||
-- and also we don't need to iterate pos_list here, so it's not an entirely
|
||||
-- fair comparison.
|
||||
for i = 1, 99*99*99 do
|
||||
local nid = data[i]
|
||||
-- Make sure the table lookup is not optimized away
|
||||
dummy = dummy + nid
|
||||
end
|
||||
return core.get_us_time() - start_time, mid_time - start_time
|
||||
end
|
||||
|
||||
core.chat_send_player(name, "Benchmarking core.get_voxel_vmanip+get_data+loop . Warming up ...")
|
||||
bench()
|
||||
|
||||
core.chat_send_player(name, "Warming up finished, now benchmarking ...")
|
||||
local result_us, get_data_us = bench()
|
||||
|
||||
local msg = string.format("Benchmark results: core.get_voxel_vmanip+get_data+loop loop 1: %.2f ms of which get_data() %.2f ms",
|
||||
result_us / 1000, get_data_us / 1000)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
@ -174,7 +281,7 @@ core.register_chatcommand("bench_bulk_swap_node", {
|
|||
core.chat_send_player(name, "Warming up finished, now benchmarking ...")
|
||||
|
||||
local start_time = core.get_us_time()
|
||||
for i=1,#pos_list do
|
||||
for i = 1, #pos_list do
|
||||
core.swap_node(pos_list[i], {name = "mapgen_stone"})
|
||||
end
|
||||
local middle_time = core.get_us_time()
|
||||
|
@ -184,6 +291,7 @@ core.register_chatcommand("bench_bulk_swap_node", {
|
|||
((middle_time - start_time)) / 1000,
|
||||
((end_time - middle_time)) / 1000
|
||||
)
|
||||
print(msg)
|
||||
return true, msg
|
||||
end,
|
||||
})
|
||||
|
|
|
@ -13,3 +13,9 @@ Jordach (CC BY-SA 3.0):
|
|||
Zeg9 (CC BY-SA 3.0):
|
||||
testentities_lava_flan.x
|
||||
testentities_lava_flan.png
|
||||
|
||||
"Cool Guy":
|
||||
|
||||
hecks (refer to irr/LICENSE):
|
||||
testentities_cool_guy.x
|
||||
testentities_cool_guy.png
|
||||
|
|
BIN
games/devtest/mods/testentities/models/testentities_cool_guy.png
Normal file
BIN
games/devtest/mods/testentities/models/testentities_cool_guy.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
2
games/devtest/mods/testentities/models/testentities_cool_guy.x
Executable file
2
games/devtest/mods/testentities/models/testentities_cool_guy.x
Executable file
File diff suppressed because one or more lines are too long
|
@ -102,6 +102,19 @@ core.register_entity("testentities:lava_flan", {
|
|||
end,
|
||||
})
|
||||
|
||||
core.register_entity("testentities:cool_guy", {
|
||||
initial_properties = {
|
||||
visual = "mesh",
|
||||
mesh = "testentities_cool_guy.x",
|
||||
textures = {
|
||||
"testentities_cool_guy.png"
|
||||
},
|
||||
},
|
||||
on_activate = function(self)
|
||||
self.object:set_animation({x = 0, y = 29}, 30, 0, true)
|
||||
end,
|
||||
})
|
||||
|
||||
-- Advanced visual tests
|
||||
|
||||
-- An entity for testing animated and yaw-modulated sprites
|
||||
|
|
|
@ -255,3 +255,17 @@ local function test_item_drop(_, pos)
|
|||
assert(itemstack_ret:equals(itemstack_src))
|
||||
end
|
||||
unittests.register("test_item_drop", test_item_drop, {map=true})
|
||||
|
||||
local function test_entity_guid(_, pos)
|
||||
local obj0 = core.add_entity(pos, "unittests:dummy")
|
||||
local obj1 = core.add_entity(pos, "unittests:dummy")
|
||||
|
||||
assert(obj0 ~= obj1)
|
||||
assert(obj0:get_guid() ~= obj1:get_guid())
|
||||
assert(core.objects_by_guid[obj0:get_guid()] == obj0)
|
||||
assert(core.objects_by_guid[obj1:get_guid()] == obj1)
|
||||
|
||||
obj0:remove()
|
||||
obj1:remove()
|
||||
end
|
||||
unittests.register("test_entity_guid", test_entity_guid, {map=true})
|
||||
|
|
|
@ -29,6 +29,6 @@ if core.ipc_cas("unittests:mg_once", nil, true) then
|
|||
end
|
||||
|
||||
core.register_on_generated(function(vm, pos1, pos2, blockseed)
|
||||
local n = tonumber(core.get_mapgen_setting("chunksize")) * 16 - 1
|
||||
assert(pos2:subtract(pos1) == vector.new(n, n, n))
|
||||
local cs = core.get_mapgen_chunksize()
|
||||
assert(pos2:subtract(pos1) == cs:multiply(core.MAP_BLOCKSIZE):subtract(1))
|
||||
end)
|
||||
|
|
|
@ -67,18 +67,6 @@ local function test_dynamic_media(cb, player)
|
|||
end
|
||||
unittests.register("test_dynamic_media", test_dynamic_media, {async=true, player=true})
|
||||
|
||||
local function test_v3f_metatable(player)
|
||||
assert(vector.check(player:get_pos()))
|
||||
end
|
||||
unittests.register("test_v3f_metatable", test_v3f_metatable, {player=true})
|
||||
|
||||
local function test_v3s16_metatable(player, pos)
|
||||
local node = core.get_node(pos)
|
||||
local found_pos = core.find_node_near(pos, 0, node.name, true)
|
||||
assert(vector.check(found_pos))
|
||||
end
|
||||
unittests.register("test_v3s16_metatable", test_v3s16_metatable, {map=true})
|
||||
|
||||
local function test_clear_meta(_, pos)
|
||||
local ref = core.get_meta(pos)
|
||||
|
||||
|
|
|
@ -204,3 +204,12 @@ local function run_player_hotbar_clamp_tests(player)
|
|||
player:hud_set_hotbar_itemcount(old_bar_size)
|
||||
end
|
||||
unittests.register("test_player_hotbar_clamp", run_player_hotbar_clamp_tests, {player=true})
|
||||
|
||||
--
|
||||
-- Player GUID
|
||||
--
|
||||
local function test_player_guid(player)
|
||||
assert(player:get_guid() == player:get_player_name())
|
||||
assert(core.objects_by_guid[player:get_guid()] == player)
|
||||
end
|
||||
unittests.register("test_player_guid", test_player_guid, {player=true})
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
IrrlichtMt version 1.9
|
||||
======================
|
||||
|
||||
IrrlichtMt is the 3D engine of [Minetest](https://github.com/minetest).
|
||||
IrrlichtMt is the 3D engine of [Luanti](https://github.com/luanti-org).
|
||||
It is based on the [Irrlicht Engine](https://irrlicht.sourceforge.io/) but is now developed independently.
|
||||
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Minetest.
|
||||
It is intentionally not compatible to upstream and is planned to be eventually absorbed into Luanti.
|
||||
|
||||
Build
|
||||
-----
|
||||
|
|
|
@ -14,8 +14,6 @@
|
|||
#include "../src/os.h"
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
//! Template implementation of the IIndexBuffer interface
|
||||
|
@ -95,4 +93,3 @@ public:
|
|||
typedef CIndexBuffer<u16> SIndexBuffer;
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
#include "CVertexBuffer.h"
|
||||
#include "CIndexBuffer.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
//! Template implementation of the IMeshBuffer interface
|
||||
|
@ -87,7 +85,7 @@ public:
|
|||
{
|
||||
if (Vertices->getCount()) {
|
||||
BoundingBox.reset(Vertices->getPosition(0));
|
||||
const irr::u32 vsize = Vertices->getCount();
|
||||
const u32 vsize = Vertices->getCount();
|
||||
for (u32 i = 1; i < vsize; ++i)
|
||||
BoundingBox.addInternalPoint(Vertices->getPosition(i));
|
||||
} else
|
||||
|
@ -146,4 +144,3 @@ typedef CMeshBuffer<video::S3DVertex2TCoords> SMeshBufferLightMap;
|
|||
//! Meshbuffer with vertices having tangents stored, e.g. for normal mapping
|
||||
typedef CMeshBuffer<video::S3DVertexTangents> SMeshBufferTangents;
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -14,8 +14,6 @@
|
|||
#include "../src/os.h"
|
||||
#endif
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
//! Template implementation of the IVertexBuffer interface
|
||||
|
@ -128,4 +126,3 @@ typedef CVertexBuffer<video::S3DVertex2TCoords> SVertexBufferLightMap;
|
|||
typedef CVertexBuffer<video::S3DVertexTangents> SVertexBufferTangents;
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -32,4 +30,3 @@ const c8 *const AutomaticCullingNames[] = {
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -38,4 +36,3 @@ enum E_DEBUG_SCENE_TYPE
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,9 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
//! An enum for the different device types supported by the Irrlicht Engine.
|
||||
enum E_DEVICE_TYPE
|
||||
{
|
||||
|
@ -42,5 +39,3 @@ enum E_DEVICE_TYPE
|
|||
May support hw-acceleration via OpenGL-ES */
|
||||
EIDT_ANDROID,
|
||||
};
|
||||
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -140,4 +138,3 @@ enum E_VIDEO_DRIVER_FEATURE
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -36,4 +34,3 @@ enum E_DRIVER_TYPE
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -31,4 +29,3 @@ enum EFOCUS_FLAG
|
|||
};
|
||||
|
||||
} // namespace gui
|
||||
} // namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
enum EGUI_ALIGNMENT
|
||||
|
@ -32,4 +30,3 @@ const c8 *const GUIAlignmentNames[] = {
|
|||
};
|
||||
|
||||
} // namespace gui
|
||||
} // namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -72,4 +70,3 @@ enum EGUI_ELEMENT_TYPE
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -37,4 +35,3 @@ enum E_BUFFER_TYPE
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -67,4 +65,3 @@ enum E_MATERIAL_PROP
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -71,4 +69,3 @@ constexpr u32 numBuiltInMaterials =
|
|||
sizeof(sBuiltInMaterialTypeNames) / sizeof(char *) - 1;
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -40,4 +38,3 @@ enum E_PRIMITIVE_TYPE
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
|
||||
|
@ -27,4 +25,3 @@ enum EREAD_FILE_TYPE
|
|||
EFIT_UNKNOWN = MAKE_IRR_ID('u', 'n', 'k', 'n')
|
||||
};
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -46,4 +44,3 @@ enum ESCENE_NODE_TYPE
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -31,4 +29,3 @@ const char *const sBuiltInVertexAttributeNames[] = {
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "SMaterial.h" // MATERIAL_MAX_TEXTURES
|
||||
|
||||
namespace irr::video
|
||||
namespace video
|
||||
{
|
||||
|
||||
//! enumeration for geometry transformation states
|
||||
|
@ -71,5 +71,5 @@ enum E_FOG_TYPE
|
|||
EFT_FOG_EXP2
|
||||
};
|
||||
|
||||
} // irr::video
|
||||
} // end namespace video
|
||||
|
||||
|
|
|
@ -6,15 +6,13 @@
|
|||
|
||||
#include "IMesh.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
//! Interface for an animated mesh.
|
||||
/** There are already simple implementations of this interface available so
|
||||
you don't have to implement this interface on your own if you need to:
|
||||
You might want to use irr::scene::SAnimatedMesh, irr::scene::SMesh,
|
||||
irr::scene::SMeshBuffer etc. */
|
||||
You might want to use scene::SMesh, scene::SMeshBuffer etc.
|
||||
*/
|
||||
class IAnimatedMesh : public IMesh
|
||||
{
|
||||
public:
|
||||
|
@ -34,23 +32,8 @@ public:
|
|||
scene node the mesh is instantiated in.*/
|
||||
virtual void setAnimationSpeed(f32 fps) = 0;
|
||||
|
||||
//! Returns the IMesh interface for a frame.
|
||||
/** \param frame: Frame number, >= 0, <= getMaxFrameNumber()
|
||||
Linear interpolation is used if this is between two frames.
|
||||
\return Returns the animated mesh for the given frame */
|
||||
virtual IMesh *getMesh(f32 frame) = 0;
|
||||
|
||||
//! Returns the type of the animated mesh.
|
||||
/** In most cases it is not necessary to use this method.
|
||||
This is useful for making a safe downcast. For example,
|
||||
if getMeshType() returns EAMT_MD2 it's safe to cast the
|
||||
IAnimatedMesh to IAnimatedMeshMD2.
|
||||
\returns Type of the mesh. */
|
||||
E_ANIMATED_MESH_TYPE getMeshType() const override
|
||||
{
|
||||
return EAMT_UNKNOWN;
|
||||
}
|
||||
//! Returns the type of the animated mesh. Useful for safe downcasts.
|
||||
E_ANIMATED_MESH_TYPE getMeshType() const = 0;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,39 +8,10 @@
|
|||
#include "IBoneSceneNode.h"
|
||||
#include "IAnimatedMesh.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
enum E_JOINT_UPDATE_ON_RENDER
|
||||
{
|
||||
//! do nothing
|
||||
EJUOR_NONE = 0,
|
||||
|
||||
//! get joints positions from the mesh (for attached nodes, etc)
|
||||
EJUOR_READ,
|
||||
|
||||
//! control joint positions in the mesh (eg. ragdolls, or set the animation from animateJoints() )
|
||||
EJUOR_CONTROL
|
||||
};
|
||||
|
||||
class IAnimatedMeshSceneNode;
|
||||
|
||||
//! Callback interface for catching events of ended animations.
|
||||
/** Implement this interface and use
|
||||
IAnimatedMeshSceneNode::setAnimationEndCallback to be able to
|
||||
be notified if an animation playback has ended.
|
||||
**/
|
||||
class IAnimationEndCallBack : public virtual IReferenceCounted
|
||||
{
|
||||
public:
|
||||
//! Will be called when the animation playback has ended.
|
||||
/** See IAnimatedMeshSceneNode::setAnimationEndCallback for
|
||||
more information.
|
||||
\param node: Node of which the animation has ended. */
|
||||
virtual void OnAnimationEnd(IAnimatedMeshSceneNode *node) = 0;
|
||||
};
|
||||
|
||||
//! Scene node capable of displaying an animated mesh.
|
||||
class IAnimatedMeshSceneNode : public ISceneNode
|
||||
{
|
||||
|
@ -120,11 +91,10 @@ public:
|
|||
/** When true the animations are played looped */
|
||||
virtual bool getLoopMode() const = 0;
|
||||
|
||||
//! Sets a callback interface which will be called if an animation playback has ended.
|
||||
/** Set this to 0 to disable the callback again.
|
||||
Please note that this will only be called when in non looped
|
||||
mode, see IAnimatedMeshSceneNode::setLoopMode(). */
|
||||
virtual void setAnimationEndCallback(IAnimationEndCallBack *callback = 0) = 0;
|
||||
//! Will be called right after the joints have been animated,
|
||||
//! but before the transforms have been propagated recursively to children.
|
||||
virtual void setOnAnimateCallback(
|
||||
const std::function<void(f32 dtime)> &cb) = 0;
|
||||
|
||||
//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
|
||||
/** In this way it is possible to change the materials a mesh
|
||||
|
@ -139,20 +109,15 @@ public:
|
|||
virtual void setMesh(IAnimatedMesh *mesh) = 0;
|
||||
|
||||
//! Returns the current mesh
|
||||
virtual IAnimatedMesh *getMesh(void) = 0;
|
||||
|
||||
//! Set how the joints should be updated on render
|
||||
virtual void setJointMode(E_JOINT_UPDATE_ON_RENDER mode) = 0;
|
||||
virtual IAnimatedMesh *getMesh() = 0;
|
||||
|
||||
//! Sets the transition time in seconds
|
||||
/** Note: This needs to enable joints, and setJointmode set to
|
||||
EJUOR_CONTROL. You must call animateJoints(), or the mesh will
|
||||
not animate. */
|
||||
/** Note: You must call animateJoints(), or the mesh will not animate. */
|
||||
virtual void setTransitionTime(f32 Time) = 0;
|
||||
|
||||
//! animates the joints in the mesh based on the current frame.
|
||||
/** Also takes in to account transitions. */
|
||||
virtual void animateJoints(bool CalculateAbsolutePositions = true) = 0;
|
||||
virtual void animateJoints() = 0;
|
||||
|
||||
//! render mesh ignoring its transformation.
|
||||
/** Culling is unaffected. */
|
||||
|
@ -166,4 +131,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "ISceneNode.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
class ICameraSceneNode;
|
||||
|
@ -72,7 +70,7 @@ public:
|
|||
So we don't know the real boundingboxes before that. Which would be too late for culling.
|
||||
That is why the usual getBoundingBox will return a "safe" boundingbox which is guaranteed
|
||||
to contain the billboard. While this function can return the real one. */
|
||||
virtual const core::aabbox3d<f32> &getTransformedBillboardBoundingBox(const irr::scene::ICameraSceneNode *camera) = 0;
|
||||
virtual const core::aabbox3d<f32> &getTransformedBillboardBoundingBox(const scene::ICameraSceneNode *camera) = 0;
|
||||
|
||||
//! Get the amount of mesh buffers.
|
||||
/** \return Amount of mesh buffers (IMeshBuffer) in this mesh. */
|
||||
|
@ -87,4 +85,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,91 +6,44 @@
|
|||
|
||||
#include "ISceneNode.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
//! Enumeration for different bone animation modes
|
||||
enum E_BONE_ANIMATION_MODE
|
||||
{
|
||||
//! The bone is usually animated, unless it's parent is not animated
|
||||
EBAM_AUTOMATIC = 0,
|
||||
|
||||
//! The bone is animated by the skin, if it's parent is not animated then animation will resume from this bone onward
|
||||
EBAM_ANIMATED,
|
||||
|
||||
//! The bone is not animated by the skin
|
||||
EBAM_UNANIMATED,
|
||||
|
||||
//! Not an animation mode, just here to count the available modes
|
||||
EBAM_COUNT
|
||||
|
||||
};
|
||||
|
||||
enum E_BONE_SKINNING_SPACE
|
||||
{
|
||||
//! local skinning, standard
|
||||
EBSS_LOCAL = 0,
|
||||
|
||||
//! global skinning
|
||||
EBSS_GLOBAL,
|
||||
|
||||
EBSS_COUNT
|
||||
};
|
||||
|
||||
//! Names for bone animation modes
|
||||
const c8 *const BoneAnimationModeNames[] = {
|
||||
"automatic",
|
||||
"animated",
|
||||
"unanimated",
|
||||
0,
|
||||
};
|
||||
|
||||
//! Interface for bones used for skeletal animation.
|
||||
/** Used with SkinnedMesh and IAnimatedMeshSceneNode. */
|
||||
class IBoneSceneNode : public ISceneNode
|
||||
{
|
||||
public:
|
||||
IBoneSceneNode(ISceneNode *parent, ISceneManager *mgr, s32 id = -1) :
|
||||
ISceneNode(parent, mgr, id), positionHint(-1), scaleHint(-1), rotationHint(-1) {}
|
||||
IBoneSceneNode(ISceneNode *parent, ISceneManager *mgr,
|
||||
s32 id = -1, u32 boneIndex = 0,
|
||||
const std::optional<std::string> &boneName = std::nullopt)
|
||||
:
|
||||
ISceneNode(parent, mgr, id),
|
||||
BoneIndex(boneIndex)
|
||||
{
|
||||
setName(boneName);
|
||||
}
|
||||
|
||||
//! Get the index of the bone
|
||||
virtual u32 getBoneIndex() const = 0;
|
||||
//! Returns the index of the bone
|
||||
u32 getBoneIndex() const
|
||||
{
|
||||
return BoneIndex;
|
||||
}
|
||||
|
||||
//! Sets the animation mode of the bone.
|
||||
/** \return True if successful. (Unused) */
|
||||
virtual bool setAnimationMode(E_BONE_ANIMATION_MODE mode) = 0;
|
||||
//! returns the axis aligned bounding box of this node
|
||||
const core::aabbox3d<f32> &getBoundingBox() const override
|
||||
{
|
||||
return Box;
|
||||
}
|
||||
|
||||
//! Gets the current animation mode of the bone
|
||||
virtual E_BONE_ANIMATION_MODE getAnimationMode() const = 0;
|
||||
const u32 BoneIndex;
|
||||
|
||||
//! Get the axis aligned bounding box of this node
|
||||
const core::aabbox3d<f32> &getBoundingBox() const override = 0;
|
||||
|
||||
//! Returns the relative transformation of the scene node.
|
||||
// virtual core::matrix4 getRelativeTransformation() const = 0;
|
||||
|
||||
//! The animation method.
|
||||
void OnAnimate(u32 timeMs) override = 0;
|
||||
// Bogus box; bone scene nodes are not rendered anyways.
|
||||
static constexpr core::aabbox3d<f32> Box = {{0, 0, 0}};
|
||||
|
||||
//! The render method.
|
||||
/** Does nothing as bones are not visible. */
|
||||
void render() override {}
|
||||
|
||||
//! How the relative transformation of the bone is used
|
||||
virtual void setSkinningSpace(E_BONE_SKINNING_SPACE space) = 0;
|
||||
|
||||
//! How the relative transformation of the bone is used
|
||||
virtual E_BONE_SKINNING_SPACE getSkinningSpace() const = 0;
|
||||
|
||||
//! Updates the absolute position based on the relative and the parents position
|
||||
virtual void updateAbsolutePositionOfAllChildren() = 0;
|
||||
|
||||
s32 positionHint;
|
||||
s32 scaleHint;
|
||||
s32 rotationHint;
|
||||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "ISceneNode.h"
|
||||
#include "IEventReceiver.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
struct SViewFrustum;
|
||||
|
@ -181,4 +179,3 @@ protected:
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "SIrrCreationParameters.h"
|
||||
#include <string>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
// For system specific window contexts (used for OpenGL)
|
||||
|
@ -43,7 +41,7 @@ public:
|
|||
/** This is mostly used internally by IVideoDriver::beginScene().
|
||||
But if you want to switch threads which access your OpenGL driver you will have to
|
||||
call this function as follows:
|
||||
Old thread gives up context with: activateContext(irr::video::SExposedVideoData());
|
||||
Old thread gives up context with: activateContext(video::SExposedVideoData());
|
||||
New thread takes over context with: activateContext(videoDriver->getExposedVideoData());
|
||||
Note that only 1 thread at a time may access an OpenGL context. */
|
||||
virtual bool activateContext(const SExposedVideoData &videoData, bool restorePrimaryOnZero = false) = 0;
|
||||
|
@ -56,4 +54,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "position2d.h"
|
||||
#include "rect.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -192,4 +190,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "ISceneNode.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace scene
|
||||
{
|
||||
|
||||
|
@ -33,4 +31,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace scene
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "Keycodes.h"
|
||||
#include "irrString.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
//! Enumeration for all event types there are.
|
||||
enum EEVENT_TYPE
|
||||
{
|
||||
|
@ -297,7 +295,7 @@ enum EGUI_EVENT_TYPE
|
|||
};
|
||||
} // end namespace gui
|
||||
|
||||
//! SEvents hold information about an event. See irr::IEventReceiver for details on event handling.
|
||||
//! SEvents hold information about an event. See IEventReceiver for details on event handling.
|
||||
struct SEvent
|
||||
{
|
||||
//! Any kind of GUI event.
|
||||
|
@ -444,7 +442,7 @@ struct SEvent
|
|||
/** Unlike other events, joystick events represent the result of polling
|
||||
* each connected joystick once per run() of the device. Joystick events will
|
||||
* not be generated by default. If joystick support is available for the
|
||||
* active device, and @ref irr::IrrlichtDevice::activateJoysticks() has been
|
||||
* active device, and @ref IrrlichtDevice::activateJoysticks() has been
|
||||
* called, an event of this type will be generated once per joystick per
|
||||
* @ref IrrlichtDevice::run() regardless of whether the state of the joystick
|
||||
* has actually changed. */
|
||||
|
@ -553,7 +551,7 @@ struct SEvent
|
|||
/** Many of the engine's classes inherit IEventReceiver so they are able to
|
||||
process events. Events usually start at a postEventFromUser function and are
|
||||
passed down through a chain of event receivers until OnEvent returns true. See
|
||||
irr::EEVENT_TYPE for a description of where each type of event starts, and the
|
||||
EEVENT_TYPE for a description of where each type of event starts, and the
|
||||
path it takes through the system. */
|
||||
class IEventReceiver
|
||||
{
|
||||
|
@ -570,13 +568,13 @@ public:
|
|||
virtual bool OnEvent(const SEvent &event) = 0;
|
||||
};
|
||||
|
||||
//! Information on a joystick, returned from @ref irr::IrrlichtDevice::activateJoysticks()
|
||||
//! Information on a joystick, returned from @ref IrrlichtDevice::activateJoysticks()
|
||||
struct SJoystickInfo
|
||||
{
|
||||
//! The ID of the joystick
|
||||
/** This is an internal Irrlicht index; it does not map directly
|
||||
* to any particular hardware joystick. It corresponds to the
|
||||
* irr::SJoystickEvent Joystick ID. */
|
||||
* SJoystickEvent Joystick ID. */
|
||||
u8 Joystick;
|
||||
|
||||
//! The name that the joystick uses to identify itself.
|
||||
|
@ -605,5 +603,3 @@ struct SJoystickInfo
|
|||
POV_HAT_UNKNOWN
|
||||
} PovHat;
|
||||
}; // struct SJoystickInfo
|
||||
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,9 +7,6 @@
|
|||
#include "IReadFile.h"
|
||||
#include "IFileList.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace io
|
||||
{
|
||||
|
||||
|
@ -111,4 +108,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IReferenceCounted.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
|
||||
|
@ -85,5 +83,4 @@ public:
|
|||
virtual void sort() = 0;
|
||||
};
|
||||
|
||||
} // end namespace irr
|
||||
} // end namespace io
|
||||
|
|
|
@ -7,12 +7,6 @@
|
|||
#include "IReferenceCounted.h"
|
||||
#include "IFileArchive.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
class IVideoDriver;
|
||||
} // end namespace video
|
||||
namespace io
|
||||
{
|
||||
|
||||
|
@ -154,4 +148,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace io
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,18 +8,9 @@
|
|||
#include "EPrimitiveTypes.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace io
|
||||
{
|
||||
class IReadFile;
|
||||
} // end namespace io
|
||||
|
||||
namespace video
|
||||
{
|
||||
|
||||
class IVideoDriver;
|
||||
class IShaderConstantSetCallBack;
|
||||
|
||||
//! Interface making it possible to create and use programs running on the GPU.
|
||||
|
@ -141,4 +132,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,9 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace video
|
||||
{
|
||||
class ITexture;
|
||||
|
@ -254,4 +251,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -44,4 +42,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -69,4 +67,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
|
@ -141,11 +139,10 @@ public:
|
|||
|
||||
//! Set the blinktime for the cursor. 2x blinktime is one full cycle.
|
||||
//** \param timeMs Blinktime in milliseconds. When set to 0 the cursor is constantly on without blinking */
|
||||
virtual void setCursorBlinkTime(irr::u32 timeMs) = 0;
|
||||
virtual void setCursorBlinkTime(u32 timeMs) = 0;
|
||||
|
||||
//! Get the cursor blinktime
|
||||
virtual irr::u32 getCursorBlinkTime() const = 0;
|
||||
virtual u32 getCursorBlinkTime() const = 0;
|
||||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -14,8 +14,6 @@
|
|||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIEnvironment;
|
||||
|
@ -926,4 +924,3 @@ protected:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -11,15 +11,11 @@
|
|||
#include "IEventReceiver.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
class IOSOperator;
|
||||
class IEventReceiver;
|
||||
|
||||
namespace io
|
||||
{
|
||||
class IReadFile;
|
||||
class IWriteFile;
|
||||
class IFileSystem;
|
||||
} // end namespace io
|
||||
namespace video
|
||||
|
@ -46,7 +42,6 @@ class IGUITabControl;
|
|||
class IGUITab;
|
||||
class IGUIComboBox;
|
||||
class IGUIButton;
|
||||
class IGUIWindow;
|
||||
|
||||
//! GUI Environment. Used as factory and manager of all other GUI elements.
|
||||
/** \par This element can create the following events of type EGUI_EVENT_TYPE (which are passed on to focused sub-elements):
|
||||
|
@ -403,4 +398,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -41,4 +39,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
#include "rect.h"
|
||||
#include "irrString.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -93,4 +91,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "IGUIFont.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUISpriteBank;
|
||||
|
@ -27,4 +25,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
class ITexture;
|
||||
|
@ -80,4 +78,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "rect.h"
|
||||
#include "irrTypes.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -37,4 +35,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUISpriteBank;
|
||||
|
@ -133,4 +131,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
|
||||
|
@ -56,4 +54,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -9,8 +9,6 @@
|
|||
#include "SColor.h"
|
||||
#include "rect.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
|
@ -537,4 +535,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -9,9 +9,6 @@
|
|||
#include "SColor.h"
|
||||
#include "rect.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
|
||||
namespace video
|
||||
{
|
||||
class ITexture;
|
||||
|
@ -135,4 +132,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUIFont;
|
||||
|
@ -130,4 +128,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IGUIElement.h"
|
||||
#include "SColor.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace gui
|
||||
{
|
||||
class IGUITab;
|
||||
|
@ -145,4 +143,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -6,8 +6,6 @@
|
|||
|
||||
#include "IGUIElement.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
class ITexture;
|
||||
|
@ -31,4 +29,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace gui
|
||||
} // end namespace irr
|
||||
|
|
|
@ -10,8 +10,6 @@
|
|||
#include "SColor.h"
|
||||
#include <cstring>
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace video
|
||||
{
|
||||
|
||||
|
@ -208,14 +206,6 @@ public:
|
|||
//! copies this surface into another
|
||||
virtual void copyTo(IImage *target, const core::position2d<s32> &pos, const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect = 0) = 0;
|
||||
|
||||
//! copies this surface into another, using the alpha mask and cliprect and a color to add with
|
||||
/** \param combineAlpha - When true then combine alpha channels. When false replace target image alpha with source image alpha.
|
||||
*/
|
||||
virtual void copyToWithAlpha(IImage *target, const core::position2d<s32> &pos,
|
||||
const core::rect<s32> &sourceRect, const SColor &color,
|
||||
const core::rect<s32> *clipRect = 0,
|
||||
bool combineAlpha = false) = 0;
|
||||
|
||||
//! copies this surface into another, scaling it to fit, applying a box filter
|
||||
virtual void copyToScalingBoxFilter(IImage *target, s32 bias = 0, bool blend = false) = 0;
|
||||
|
||||
|
@ -332,4 +322,3 @@ protected:
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "IImage.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
class IReadFile;
|
||||
|
@ -44,4 +42,3 @@ public:
|
|||
};
|
||||
|
||||
} // end namespace video
|
||||
} // end namespace irr
|
||||
|
|
|
@ -7,8 +7,6 @@
|
|||
#include "IReferenceCounted.h"
|
||||
#include "path.h"
|
||||
|
||||
namespace irr
|
||||
{
|
||||
namespace io
|
||||
{
|
||||
class IWriteFile;
|
||||
|
@ -36,4 +34,3 @@ public:
|
|||
};
|
||||
|
||||
} // namespace video
|
||||
} // namespace irr
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue