diff --git a/core/engine.cpp b/core/engine.cpp index 5dc10295bb1..d0f35b3b82e 100644 --- a/core/engine.cpp +++ b/core/engine.cpp @@ -227,7 +227,7 @@ Engine::Engine() { _fps = 1; _target_fps = 0; _time_scale = 1.0; - _pixel_snap = false; + _gpu_pixel_snap = false; _snap_2d_transforms = false; _physics_frames = 0; _idle_frames = 0; diff --git a/core/engine.h b/core/engine.h index 57c3368d198..66069916198 100644 --- a/core/engine.h +++ b/core/engine.h @@ -58,7 +58,7 @@ private: float _fps; int _target_fps; float _time_scale; - bool _pixel_snap; + bool _gpu_pixel_snap; bool _snap_2d_transforms; bool _snap_2d_viewports; uint64_t _physics_frames; @@ -108,7 +108,7 @@ public: bool has_singleton(const String &p_name) const; Object *get_singleton_object(const String &p_name) const; - _FORCE_INLINE_ bool get_use_pixel_snap() const { return _pixel_snap; } + _FORCE_INLINE_ bool get_use_gpu_pixel_snap() const { return _gpu_pixel_snap; } bool get_snap_2d_transforms() const { return _snap_2d_transforms; } bool get_snap_2d_viewports() const { return _snap_2d_viewports; } diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index f7c0671bb6c..af85d8cbf3d 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -435,7 +435,7 @@ Maximum number of contact points between collision shapes to display when "Visible Collision Shapes" is enabled in the Debug menu. - + Color of the collision shapes, visible when "Visible Collision Shapes" is enabled in the Debug menu. @@ -1031,6 +1031,32 @@ Fix to improve physics jitter, specially on monitors where refresh rate is different than the physics FPS. [b]Note:[/b] This property is only read when the project starts. To change the physics FPS at runtime, set [member Engine.physics_jitter_fix] instead. + + Choose between default mode where corner scalings are preserved matching the artwork, and scaling mode. + Not available in GLES3 when [member rendering/batching/options/use_batching] is off. + + + Some NVIDIA GPU drivers have a bug which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to [url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/url] for details. + If [code]true[/code], this option enables a "safe" code path for such NVIDIA GPUs at the cost of performance. This option affects GLES2 and GLES3 rendering, but only on desktop platforms. + + + If [code]true[/code], performs 2D skinning on the CPU rather than the GPU. This provides greater compatibility with a wide range of hardware, and also may be faster in some circumstances. + Currently only available when [member rendering/batching/options/use_batching] is active. + [b]Note:[/b] Antialiased software skinned polys are not supported, and will be rendered without antialiasing. + + + If [code]true[/code], forces snapping of 2D viewports to the nearest whole coordinate. + Can reduce unwanted camera relative movement in pixel art styles. + + + If [code]true[/code], forces snapping of vertices to pixels in 2D rendering. May help in some pixel art styles. + This snapping is performed on the GPU in the vertex shader. + Consider using the project setting [member rendering/batching/precision/uv_contract] to prevent artifacts. + + + If [code]true[/code], forces snapping of 2D object transforms to the nearest whole coordinate. + Can help prevent unwanted relative movement in pixel art styles. + When batching is on, this regularly prints a frame diagnosis log. Note that this will degrade performance. @@ -1124,31 +1150,6 @@ Shaders have a time variable that constantly increases. At some point, it needs to be rolled back to zero to avoid precision errors on shader animations. This setting specifies when (in seconds). - - Choose between default mode where corner scalings are preserved matching the artwork, and scaling mode. - Not available in GLES3 when [member rendering/batching/options/use_batching] is off. - - - If [code]true[/code], forces snapping of 2D viewports to the nearest whole coordinate. - Can reduce unwanted camera relative movement in pixel art styles. - - - Some NVIDIA GPU drivers have a bug which produces flickering issues for the [code]draw_rect[/code] method, especially as used in [TileMap]. Refer to [url=https://github.com/godotengine/godot/issues/9913]GitHub issue 9913[/url] for details. - If [code]true[/code], this option enables a "safe" code path for such NVIDIA GPUs at the cost of performance. This option affects GLES2 and GLES3 rendering, but only on desktop platforms. - - - If [code]true[/code], forces snapping of polygons to pixels in 2D rendering. May help in some pixel art styles. - Consider using the project setting [member rendering/batching/precision/uv_contract] to prevent artifacts. - - - If [code]true[/code], performs 2D skinning on the CPU rather than the GPU. This provides greater compatibility with a wide range of hardware, and also may be faster in some circumstances. - Currently only available when [member rendering/batching/options/use_batching] is active. - [b]Note:[/b] Antialiased software skinned polys are not supported, and will be rendered without antialiasing. - - - If [code]true[/code], forces snapping of 2D object transforms to the nearest whole coordinate. - Can help prevent unwanted relative movement in pixel art styles. - If [code]true[/code], allocates the main framebuffer with high dynamic range. High dynamic range allows the use of [Color] values greater than 1. [b]Note:[/b] Only available on the GLES3 backend. diff --git a/drivers/gles2/rasterizer_canvas_base_gles2.cpp b/drivers/gles2/rasterizer_canvas_base_gles2.cpp index 7d930b54118..9cdbb5b4899 100644 --- a/drivers/gles2/rasterizer_canvas_base_gles2.cpp +++ b/drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -1074,7 +1074,7 @@ void RasterizerCanvasBaseGLES2::initialize() { state.lens_shader.init(); - state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false)); + state.canvas_shader.set_conditional(CanvasShaderGLES2::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/2d/snapping/use_gpu_pixel_snap", false)); state.using_light = NULL; state.using_transparent_rt = false; diff --git a/drivers/gles3/rasterizer_canvas_base_gles3.cpp b/drivers/gles3/rasterizer_canvas_base_gles3.cpp index 07f17482386..d0a85e0e2f0 100644 --- a/drivers/gles3/rasterizer_canvas_base_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1292,7 +1292,7 @@ void RasterizerCanvasBaseGLES3::initialize() { state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows); state.canvas_shadow_shader.set_conditional(CanvasShadowShaderGLES3::USE_RGBA_SHADOWS, storage->config.use_rgba_2d_shadows); - state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false)); + state.canvas_shader.set_conditional(CanvasShaderGLES3::USE_PIXEL_SNAP, GLOBAL_DEF("rendering/2d/snapping/use_gpu_pixel_snap", false)); } void RasterizerCanvasBaseGLES3::finalize() { diff --git a/drivers/gles_common/rasterizer_canvas_batcher.h b/drivers/gles_common/rasterizer_canvas_batcher.h index d0c1acf3304..0fe00f6a16c 100644 --- a/drivers/gles_common/rasterizer_canvas_batcher.h +++ b/drivers/gles_common/rasterizer_canvas_batcher.h @@ -969,7 +969,7 @@ PREAMBLE(void)::batch_constructor() { bdata.settings_use_batching = false; #ifdef GLES_OVER_GL - use_nvidia_rect_workaround = GLOBAL_GET("rendering/quality/2d/use_nvidia_rect_flicker_workaround"); + use_nvidia_rect_workaround = GLOBAL_GET("rendering/2d/options/use_nvidia_rect_flicker_workaround"); #else // Not needed (a priori) on GLES devices use_nvidia_rect_workaround = false; @@ -983,8 +983,8 @@ PREAMBLE(void)::batch_initialize() { bdata.settings_item_reordering_lookahead = GLOBAL_GET("rendering/batching/parameters/item_reordering_lookahead"); bdata.settings_light_max_join_items = GLOBAL_GET("rendering/batching/lights/max_join_items"); bdata.settings_use_single_rect_fallback = GLOBAL_GET("rendering/batching/options/single_rect_fallback"); - bdata.settings_use_software_skinning = GLOBAL_GET("rendering/quality/2d/use_software_skinning"); - bdata.settings_ninepatch_mode = GLOBAL_GET("rendering/quality/2d/ninepatch_mode"); + bdata.settings_use_software_skinning = GLOBAL_GET("rendering/2d/options/use_software_skinning"); + bdata.settings_ninepatch_mode = GLOBAL_GET("rendering/2d/options/ninepatch_mode"); // alternatively only enable uv contract if pixel snap in use, // but with this enable bool, it should not be necessary diff --git a/main/main.cpp b/main/main.cpp index d9ce57dd26c..78257855943 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -1040,7 +1040,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph GLOBAL_DEF("rendering/quality/driver/fallback_to_gles2", false); // Assigning here, to be sure that it appears in docs - GLOBAL_DEF("rendering/quality/2d/use_nvidia_rect_flicker_workaround", false); + GLOBAL_DEF("rendering/2d/options/use_nvidia_rect_flicker_workaround", false); GLOBAL_DEF("display/window/size/width", 1024); ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/width", PropertyInfo(Variant::INT, "display/window/size/width", PROPERTY_HINT_RANGE, "0,7680,or_greater")); // 8K resolution @@ -1124,9 +1124,9 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->_allow_layered = false; } - Engine::get_singleton()->_pixel_snap = GLOBAL_DEF("rendering/quality/2d/use_pixel_snap", false); - Engine::get_singleton()->_snap_2d_transforms = GLOBAL_DEF("rendering/quality/2d/use_transform_snap", false); - Engine::get_singleton()->_snap_2d_viewports = GLOBAL_DEF("rendering/quality/2d/use_camera_snap", false); + Engine::get_singleton()->_gpu_pixel_snap = GLOBAL_DEF("rendering/2d/snapping/use_gpu_pixel_snap", false); + Engine::get_singleton()->_snap_2d_transforms = GLOBAL_DEF("rendering/2d/snapping/use_transform_snap", false); + Engine::get_singleton()->_snap_2d_viewports = GLOBAL_DEF("rendering/2d/snapping/use_camera_snap", false); OS::get_singleton()->_keep_screen_on = GLOBAL_DEF("display/window/energy_saving/keep_screen_on", true); if (rtm == -1) { rtm = GLOBAL_DEF("rendering/threads/thread_model", OS::RENDER_THREAD_SAFE); diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp index 4d9378c47a1..6769dcc0cde 100644 --- a/scene/2d/animated_sprite.cpp +++ b/scene/2d/animated_sprite.cpp @@ -454,7 +454,7 @@ void AnimatedSprite::_notification(int p_what) { if (Engine::get_singleton()->get_snap_2d_transforms()) { ofs = ofs.round(); - } else if (Engine::get_singleton()->get_use_pixel_snap()) { + } else if (Engine::get_singleton()->get_use_gpu_pixel_snap()) { ofs = ofs.floor(); } Rect2 dst_rect(ofs, s); diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp index adcabc93341..7040a1741cc 100644 --- a/scene/2d/sprite.cpp +++ b/scene/2d/sprite.cpp @@ -102,7 +102,7 @@ void Sprite::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_cli if (Engine::get_singleton()->get_snap_2d_transforms()) { dest_offset = dest_offset.round(); - } else if (Engine::get_singleton()->get_use_pixel_snap()) { + } else if (Engine::get_singleton()->get_use_gpu_pixel_snap()) { dest_offset = dest_offset.floor(); } @@ -383,7 +383,7 @@ Rect2 Sprite::get_rect() const { ofs -= Size2(s) / 2; if (Engine::get_singleton()->get_snap_2d_transforms()) { ofs = ofs.round(); - } else if (Engine::get_singleton()->get_use_pixel_snap()) { + } else if (Engine::get_singleton()->get_use_gpu_pixel_snap()) { ofs = ofs.floor(); } diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp index f022651a8ad..ead05d1e4b3 100644 --- a/servers/visual_server.cpp +++ b/servers/visual_server.cpp @@ -2448,9 +2448,9 @@ VisualServer::VisualServer() { GLOBAL_DEF(sz_balance_render_tree, 0.0f); ProjectSettings::get_singleton()->set_custom_property_info(sz_balance_render_tree, PropertyInfo(Variant::REAL, sz_balance_render_tree, PROPERTY_HINT_RANGE, "0.0,1.0,0.01")); - GLOBAL_DEF("rendering/quality/2d/use_software_skinning", true); - GLOBAL_DEF("rendering/quality/2d/ninepatch_mode", 0); - ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/2d/ninepatch_mode", PropertyInfo(Variant::INT, "rendering/quality/2d/ninepatch_mode", PROPERTY_HINT_ENUM, "Default,Scaling")); + GLOBAL_DEF("rendering/2d/options/use_software_skinning", true); + GLOBAL_DEF("rendering/2d/options/ninepatch_mode", 0); + ProjectSettings::get_singleton()->set_custom_property_info("rendering/2d/options/ninepatch_mode", PropertyInfo(Variant::INT, "rendering/2d/options/ninepatch_mode", PROPERTY_HINT_ENUM, "Default,Scaling")); GLOBAL_DEF("rendering/batching/options/use_batching", true); GLOBAL_DEF_RST("rendering/batching/options/use_batching_in_editor", true);