From 8b38d5796685fe356f230114d964ab7b59a4044b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 22 Sep 2025 23:52:50 +0300 Subject: [PATCH 1/3] fix body:set_gravity_scale & fix docs --- doc/en/scripting/ecs.md | 4 ++-- doc/ru/scripting/ecs.md | 4 ++-- res/scripts/components/mob.lua | 2 +- src/logic/scripting/lua/libs/lib__rigidbody.cpp | 7 ++++++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/doc/en/scripting/ecs.md b/doc/en/scripting/ecs.md index e72723af..7da294c2 100644 --- a/doc/en/scripting/ecs.md +++ b/doc/en/scripting/ecs.md @@ -86,9 +86,9 @@ body:get_size() -> vec3 body:set_size(size: vec3) -- Returns the gravity multiplier -body:get_gravity_scale() -> vec3 +body:get_gravity_scale() -> number -- Sets the gravity multiplier -body:set_gravity_scale(scale: vec3) +body:set_gravity_scale(scale: number) -- Returns the linear velocity attenuation multiplier (used to simulate air resistance and friction) body:get_linear_damping() -> number diff --git a/doc/ru/scripting/ecs.md b/doc/ru/scripting/ecs.md index ea217b00..6c1b041d 100644 --- a/doc/ru/scripting/ecs.md +++ b/doc/ru/scripting/ecs.md @@ -86,9 +86,9 @@ body:get_size() -> vec3 body:set_size(size: vec3) -- Возвращает множитель гравитации -body:get_gravity_scale() -> vec3 +body:get_gravity_scale() -> number -- Устанавливает множитель гравитации -body:set_gravity_scale(scale: vec3) +body:set_gravity_scale(scale: number) -- Возвращает множитель затухания линейной скорости (используется для имитации сопротивления воздуха и трения) body:get_linear_damping() -> number diff --git a/res/scripts/components/mob.lua b/res/scripts/components/mob.lua index f81658a9..91ddf026 100644 --- a/res/scripts/components/mob.lua +++ b/res/scripts/components/mob.lua @@ -159,7 +159,7 @@ local prev_angle = (vec2.angle({dir[3], dir[1]})) % 360 function on_physics_update(delta) local grounded = body:is_grounded() body:set_vdamping(flight) - body:set_gravity_scale({0, flight and 0.0 or props.gravity_scale, 0}) + body:set_gravity_scale(flight and 0.0 or props.gravity_scale) body:set_linear_damping( (flight or not grounded) and props.air_damping or props.ground_damping ) diff --git a/src/logic/scripting/lua/libs/lib__rigidbody.cpp b/src/logic/scripting/lua/libs/lib__rigidbody.cpp index 71b6987b..726b7193 100644 --- a/src/logic/scripting/lua/libs/lib__rigidbody.cpp +++ b/src/logic/scripting/lua/libs/lib__rigidbody.cpp @@ -54,7 +54,12 @@ static int l_get_gravity_scale(lua::State* L) { static int l_set_gravity_scale(lua::State* L) { if (auto entity = get_entity(L, 1)) { - entity->getRigidbody().hitbox.gravityScale = lua::tovec3(L, 2).y; + auto& hitbox = entity->getRigidbody().hitbox; + if (lua::istable(L, 2)) { + hitbox.gravityScale = lua::tovec3(L, 2).y; + } else { + hitbox.gravityScale = lua::tonumber(L, 2); + } } return 0; } From 28c821006af35b70b9859a7572eab30e5902a2dc Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 23 Sep 2025 00:08:05 +0300 Subject: [PATCH 2/3] fix unicode string literal escape --- src/coders/BasicParser.hpp | 2 +- src/coders/BasicParser.inl | 9 ++++-- src/graphics/ui/markdown.hpp | 2 +- src/util/stringutil.cpp | 2 +- test/util/stringutil.cpp | 54 ++++++++++++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/coders/BasicParser.hpp b/src/coders/BasicParser.hpp index e0a4445a..3b756f57 100644 --- a/src/coders/BasicParser.hpp +++ b/src/coders/BasicParser.hpp @@ -32,7 +32,7 @@ protected: void goBack(size_t count = 1); void reset(); - int64_t parseSimpleInt(int base); + int64_t parseSimpleInt(int base, size_t maxLength = 0xFFFFFFFF); dv::value parseNumber(int sign); dv::value parseNumber(); StringT parseString(CharT chr, bool closeRequired = true); diff --git a/src/coders/BasicParser.inl b/src/coders/BasicParser.inl index 2e7a3623..7af27fe5 100644 --- a/src/coders/BasicParser.inl +++ b/src/coders/BasicParser.inl @@ -349,7 +349,10 @@ std::basic_string BasicParser::parseXmlName() { } template -int64_t BasicParser::parseSimpleInt(int base) { +int64_t BasicParser::parseSimpleInt(int base, size_t maxLength) { + if (maxLength == 0) return 0; + + size_t start = pos; CharT c = peek(); int index = hexchar2int(c); if (index == -1 || index >= base) { @@ -357,7 +360,7 @@ int64_t BasicParser::parseSimpleInt(int base) { } int64_t value = index; pos++; - while (hasNext()) { + while (hasNext() && pos - start < maxLength) { c = source[pos]; while (c == '_') { c = source[++pos]; @@ -476,7 +479,7 @@ std::basic_string BasicParser::parseString( continue; } if (c == 'u' || c == 'x') { - int codepoint = parseSimpleInt(16); + int codepoint = parseSimpleInt(16, c == 'u' ? 4 : 2); ubyte bytes[4]; int size = util::encode_utf8(codepoint, bytes); CharT chars[4]; diff --git a/src/graphics/ui/markdown.hpp b/src/graphics/ui/markdown.hpp index 0f089d58..39b2f1ec 100644 --- a/src/graphics/ui/markdown.hpp +++ b/src/graphics/ui/markdown.hpp @@ -22,7 +22,7 @@ namespace markdown { Result process(std::wstring_view source, bool eraseMarkdown); template - inline std::basic_string escape(std::string_view source) { + inline std::basic_string escape(std::basic_string_view source) { std::basic_stringstream ss; int pos = 0; while (pos < source.size()) { diff --git a/src/util/stringutil.cpp b/src/util/stringutil.cpp index 79f8a1c5..63271a13 100644 --- a/src/util/stringutil.cpp +++ b/src/util/stringutil.cpp @@ -40,7 +40,7 @@ std::string util::escape(std::string_view s, bool escapeUnicode) { uint cpsize; int codepoint = decode_utf8(cpsize, s.data() + pos); if (escapeUnicode) { - ss << "\\u" << std::hex << codepoint; + ss << "\\u" << std::setw(4) << std::setfill('0') << std::hex << codepoint; } else { ss << std::string(s.data() + pos, cpsize); } diff --git a/test/util/stringutil.cpp b/test/util/stringutil.cpp index fd459663..22df2b35 100644 --- a/test/util/stringutil.cpp +++ b/test/util/stringutil.cpp @@ -1,4 +1,5 @@ #include "util/stringutil.hpp" +#include "coders/BasicParser.hpp" #include @@ -16,6 +17,25 @@ TEST(stringutil, utf8) { EXPECT_EQ(str, str2); } +static std::wstring gen_random_unicode_wstring(int n) { + std::wstring str; + str.resize(n); + for (int i = 0; i < n; i++) { + // wstring is 16 bit in some systems + str[i] = rand() & 0xFFFF; + } + return str; +} + +TEST(stringutil, utf8_random) { + srand(5436324); + + auto str = gen_random_unicode_wstring(10'000); + auto utf8str = util::wstr2str_utf8(str); + auto back = util::str2wstr_utf8(utf8str); + EXPECT_EQ(str, back); +} + TEST(stringutil, base64) { srand(2019); for (size_t size = 0; size < 30; size++) { @@ -47,3 +67,37 @@ TEST(stringutil, base64_urlsafe) { } } } + +class StringParser : BasicParser { +public: + StringParser(std::string_view source) : BasicParser("", source) {} + + std::string parse() { + ++pos; + return parseString(source[0], true); + } +}; + +TEST(stringutil, escape_cases) { + auto escaped = util::escape("тест5", true); + auto expected = "\"\\u0442\\u0435\\u0441\\u04425\""; + ASSERT_EQ(expected, escaped); + + srand(345873458); + for (int i = 0; i < 36; i++) { + rand(); + } + + auto str = gen_random_unicode_wstring(40); + auto utf8str = util::wstr2str_utf8(str); + escaped = util::escape(utf8str, true); + + StringParser parser(escaped); + auto restored = parser.parse(); + for (int i = 0; i < utf8str.length(); i++) { + if (utf8str[i] != restored[i]) { + std::cout << i << ": " << (int)utf8str[i] << " " << (int)restored[i] << std::endl; + } + } + EXPECT_EQ(utf8str, restored); +} From 4ff18fec990fd4cabcc7e7eaf96453fb80dab88b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 23 Sep 2025 00:51:21 +0300 Subject: [PATCH 3/3] fix sky shader --- res/shaders/lib/shadows.glsl | 2 +- res/shaders/lib/sky.glsl | 2 +- res/shaders/skybox_gen.glslf | 6 +++++- src/graphics/core/Shadows.cpp | 6 +++++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/res/shaders/lib/shadows.glsl b/res/shaders/lib/shadows.glsl index 71ef4776..658e9a69 100644 --- a/res/shaders/lib/shadows.glsl +++ b/res/shaders/lib/shadows.glsl @@ -43,7 +43,7 @@ float calc_shadow( // TODO: add array textures support float calc_shadow(vec4 modelPos, vec3 realnormal, float distance) { #ifdef ENABLE_SHADOWS - float s = pow(abs(cos(u_dayTime * PI2)), 0.25) * u_shadowsOpacity; + float s = u_shadowsOpacity; vec3 normalOffset = realnormal * (distance > 64.0 ? 0.2 : 0.04); // as slow as mix(...) diff --git a/res/shaders/lib/sky.glsl b/res/shaders/lib/sky.glsl index 028fb51a..ce3604f5 100644 --- a/res/shaders/lib/sky.glsl +++ b/res/shaders/lib/sky.glsl @@ -4,7 +4,7 @@ #include vec3 pick_sky_color(samplerCube cubemap) { - vec3 skyLightColor = texture(cubemap, vec3(0.8f, 0.01f, 0.4f)).rgb; + vec3 skyLightColor = texture(cubemap, vec3(0.4f, 0.05f, 0.4f)).rgb; skyLightColor *= SKY_LIGHT_TINT; skyLightColor = min(vec3(1.0f), skyLightColor * SKY_LIGHT_MUL); skyLightColor = max(MIN_SKY_LIGHT, skyLightColor); diff --git a/res/shaders/skybox_gen.glslf b/res/shaders/skybox_gen.glslf index 481203f3..583104eb 100644 --- a/res/shaders/skybox_gen.glslf +++ b/res/shaders/skybox_gen.glslf @@ -268,7 +268,11 @@ void main() { camera_vector, // the camera vector (ray direction of this pixel) 1e12f, // max dist, essentially the scene depth vec3(0.0f), // scene color, the color of the current pixel being rendered - vec3(u_lightDir.x, pow(u_lightDir.y, 3.0), u_lightDir.z), // light direction + vec3( + u_lightDir.x, + u_lightDir.y, + u_lightDir.z + ), // light direction vec3(40.0*fog), // light intensity, 40 looks nice PLANET_POS, // position of the planet PLANET_RADIUS, // radius of the planet in meters diff --git a/src/graphics/core/Shadows.cpp b/src/graphics/core/Shadows.cpp index d37dc557..c47b8a6a 100644 --- a/src/graphics/core/Shadows.cpp +++ b/src/graphics/core/Shadows.cpp @@ -96,12 +96,16 @@ void Shadows::setup(Shader& shader, const Weather& weather) { if (shadows) { const auto& worldInfo = level.getWorld()->getInfo(); float cloudsIntensity = glm::max(worldInfo.fog, weather.clouds()); + float shadowsOpacity = 1.0f - cloudsIntensity; + shadowsOpacity *= glm::sqrt(glm::abs( + glm::mod((worldInfo.daytime + 0.5f) * 2.0f, 1.0f) * 2.0f - 1.0f + )); shader.uniform1i("u_screen", 0); shader.uniformMatrix("u_shadowsMatrix[0]", shadowCamera.getProjView()); shader.uniformMatrix("u_shadowsMatrix[1]", wideShadowCamera.getProjView()); shader.uniform3f("u_sunDir", shadowCamera.front); shader.uniform1i("u_shadowsRes", shadowMap->getResolution()); - shader.uniform1f("u_shadowsOpacity", 1.0f - cloudsIntensity); // TODO: make it configurable + shader.uniform1f("u_shadowsOpacity", shadowsOpacity); // TODO: make it configurable shader.uniform1f("u_shadowsSoftness", 1.0f + cloudsIntensity * 4); // TODO: make it configurable glActiveTexture(GL_TEXTURE0 + TARGET_SHADOWS0);