Browse Source

Improve 2d snapping

Partially revert change allowing sprite get_rect snapping to be controlled by `pixel_snap` again rather than `transform_snap` (to prevent breaking compatibility). Adds a final `use_camera_snap` project setting to allow snapping viewports as in reduz original PR.
lawnjelly 4 years ago
parent
commit
a237c671bb
4 changed files with 19 additions and 4 deletions
  1. 2 0
      core/engine.h
  2. 1 0
      main/main.cpp
  3. 2 2
      scene/2d/sprite.cpp
  4. 14 2
      servers/visual/visual_server_viewport.cpp

+ 2 - 0
core/engine.h

@@ -60,6 +60,7 @@ private:
 	float _time_scale;
 	bool _pixel_snap;
 	bool _snap_2d_transforms;
+	bool _snap_2d_viewports;
 	uint64_t _physics_frames;
 	float _physics_interpolation_fraction;
 
@@ -109,6 +110,7 @@ public:
 
 	_FORCE_INLINE_ bool get_use_pixel_snap() const { return _pixel_snap; }
 	bool get_snap_2d_transforms() const { return _snap_2d_transforms; }
+	bool get_snap_2d_viewports() const { return _snap_2d_viewports; }
 
 #ifdef TOOLS_ENABLED
 	_FORCE_INLINE_ void set_editor_hint(bool p_enabled) { editor_hint = p_enabled; }

+ 1 - 0
main/main.cpp

@@ -1114,6 +1114,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 
 	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);
 	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);

+ 2 - 2
scene/2d/sprite.cpp

@@ -99,7 +99,7 @@ void Sprite::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_cli
 	Point2 dest_offset = offset;
 	if (centered)
 		dest_offset -= frame_size / 2;
-	if (Engine::get_singleton()->get_snap_2d_transforms()) {
+	if (Engine::get_singleton()->get_use_pixel_snap()) {
 		dest_offset = dest_offset.floor();
 	}
 
@@ -378,7 +378,7 @@ Rect2 Sprite::get_rect() const {
 	Point2 ofs = offset;
 	if (centered)
 		ofs -= Size2(s) / 2;
-	if (Engine::get_singleton()->get_snap_2d_transforms()) {
+	if (Engine::get_singleton()->get_use_pixel_snap()) {
 		ofs = ofs.floor();
 	}
 

+ 14 - 2
servers/visual/visual_server_viewport.cpp

@@ -40,12 +40,24 @@ static Transform2D _canvas_get_transform(VisualServerViewport::Viewport *p_viewp
 	Transform2D xf = p_viewport->global_transform;
 
 	float scale = 1.0;
+
+	bool snap = Engine::get_singleton()->get_snap_2d_viewports();
+
 	if (p_viewport->canvas_map.has(p_canvas->parent)) {
-		xf = xf * p_viewport->canvas_map[p_canvas->parent].transform;
+
+		Transform2D c_xform = p_viewport->canvas_map[p_canvas->parent].transform;
+		if (snap) {
+			c_xform.elements[2] = c_xform.elements[2].floor();
+		}
+		xf = xf * c_xform;
 		scale = p_canvas->parent_scale;
 	}
 
-	xf = xf * p_canvas_data->transform;
+	Transform2D c_xform = p_canvas_data->transform;
+	if (snap) {
+		c_xform.elements[2] = c_xform.elements[2].floor();
+	}
+	xf = xf * c_xform;
 
 	if (scale != 1.0 && !VSG::canvas->disable_scale) {
 		Vector2 pivot = p_vp_size * 0.5;