4242#include " video/viewport.hpp"
4343#include " worldmap/worldmap_object.hpp"
4444
45+ using namespace std ::chrono;
46+
4547namespace {
4648
4749const int snap_grid_sizes[4 ] = {4 , 8 , 16 , 32 };
@@ -482,10 +484,15 @@ void
482484EditorOverlayWidget::replace ()
483485{
484486 auto tilemap = m_editor.get_selected_tilemap ();
487+ auto tiles = m_editor.get_tiles ();
488+
485489 uint32_t replace_tile = tilemap->get_tile_id (m_hovered_tile);
486490
487491 // Don't do anything if the old and new tiles are the same tile.
488- if (m_editor.get_tiles ()->m_width == 1 && m_editor.get_tiles ()->m_height == 1 && replace_tile == m_editor.get_tiles ()->pos (0 , 0 )) return ;
492+ if (tiles->m_width == 1 && tiles->m_height == 1 && replace_tile == tiles->pos (0 , 0 ))
493+ {
494+ return ;
495+ }
489496
490497 tilemap->save_state ();
491498 for (int x = 0 ; x < tilemap->get_width (); ++x)
@@ -494,9 +501,9 @@ EditorOverlayWidget::replace()
494501 {
495502 if (tilemap->get_tile_id (x, y) == replace_tile)
496503 {
497- tilemap->change (x, y, m_editor. get_tiles () ->pos (
498- (x - static_cast <int >(m_hovered_tile.x )) % m_editor. get_tiles () ->m_width ,
499- (y - static_cast <int >(m_hovered_tile.y )) % m_editor. get_tiles () ->m_height )
504+ tilemap->change (x, y, tiles ->pos (
505+ (x - static_cast <int >(m_hovered_tile.x )) % tiles ->m_width ,
506+ (y - static_cast <int >(m_hovered_tile.y )) % tiles ->m_height )
500507 );
501508 }
502509 }
@@ -517,43 +524,41 @@ EditorOverlayWidget::hover_object()
517524 for (auto & moving_object : m_editor.get_sector ()->get_objects_by_type <MovingObject>())
518525 {
519526 const Rectf& bbox = moving_object.get_bbox ();
520- if (bbox.contains (m_sector_pos))
527+ if (! bbox.contains (m_sector_pos) || &moving_object == m_hovered_object )
521528 {
522- if (&moving_object != m_hovered_object)
523- {
529+ continue ;
530+ }
524531
525- // Ignore BezierMarkers if ctrl isn't pressed... (1/2)
526- auto * bezier_marker = dynamic_cast <BezierMarker*>(&moving_object);
527- if (bezier_marker)
528- {
529- if (!m_editor.m_ctrl_pressed )
530- {
531- marker_hovered_without_ctrl = bezier_marker;
532- continue ;
533- }
534- else
535- {
536- cache_is_marker = true ;
537- cache_layer = 2147483647 ;
538- m_hovered_object = &moving_object;
539- }
540- }
532+ // Ignore BezierMarkers if ctrl isn't pressed... (1/2)
533+ auto * bezier_marker = dynamic_cast <BezierMarker*>(&moving_object);
534+ if (bezier_marker)
535+ {
536+ if (!m_editor.m_ctrl_pressed )
537+ {
538+ marker_hovered_without_ctrl = bezier_marker;
539+ continue ;
540+ }
541+ else
542+ {
543+ cache_is_marker = true ;
544+ cache_layer = INT_MAX ;
545+ m_hovered_object = &moving_object;
546+ }
547+ }
541548
542- // Pick objects in this priority:
543- // 1. Markers
544- // 2. Objects with a higher layer ID
545- // 3. If many objects are on the highest layer, pick the last created one
546- // (Which will be the one rendererd on top)
549+ // Pick objects in this priority:
550+ // 1. Markers
551+ // 2. Objects with a higher layer ID
552+ // 3. If many objects are on the highest layer, pick the last created one
553+ // (Which will be the one rendererd on top)
547554
548- bool is_marker = dynamic_cast <MarkerObject*>(&moving_object);
549- // The "=" part of ">=" ensures that for equal layer, the last object is picked; don't remove the "="!
550- if ((is_marker && !cache_is_marker) || moving_object.get_layer () >= cache_layer)
551- {
552- cache_is_marker = is_marker;
553- cache_layer = moving_object.get_layer ();
554- m_hovered_object = &moving_object;
555- }
556- }
555+ bool is_marker = dynamic_cast <MarkerObject*>(&moving_object);
556+ // The "=" part of ">=" ensures that for equal layer, the last object is picked; don't remove the "="!
557+ if ((is_marker && !cache_is_marker) || moving_object.get_layer () >= cache_layer)
558+ {
559+ cache_is_marker = is_marker;
560+ cache_layer = moving_object.get_layer ();
561+ m_hovered_object = &moving_object;
557562 }
558563 }
559564
@@ -692,40 +697,38 @@ EditorOverlayWidget::show_object_menu(GameObject& object)
692697void
693698EditorOverlayWidget::move_object ()
694699{
695- if (m_dragged_object)
700+ if (m_dragged_object == nullptr || !m_dragged_object-> is_valid () )
696701 {
697- if (!m_dragged_object->is_valid ())
698- {
699- m_dragged_object = nullptr ;
700- return ;
701- }
702- Vector new_pos = m_sector_pos - m_obj_mouse_desync;
703- if (g_config->editor_snap_to_grid )
704- {
705- auto & snap_grid_size = snap_grid_sizes[g_config->editor_selected_snap_grid_size ];
706- new_pos = glm::floor (new_pos / static_cast <float >(snap_grid_size)) * static_cast <float >(snap_grid_size);
702+ m_dragged_object = nullptr ;
703+ return ;
704+ }
707705
708- auto pm = dynamic_cast <MarkerObject*>(m_dragged_object.get ());
709- if (pm)
710- new_pos -= pm->get_offset ();
711- }
706+ Vector new_pos = m_sector_pos - m_obj_mouse_desync;
707+ if (g_config->editor_snap_to_grid )
708+ {
709+ auto & snap_grid_size = snap_grid_sizes[g_config->editor_selected_snap_grid_size ];
710+ new_pos = glm::floor (new_pos / static_cast <float >(snap_grid_size)) * static_cast <float >(snap_grid_size);
712711
713- // TODO: Temporarily disabled during ongoing discussion
714- // Special case: Bezier markers should influence each other when holding shift
715- // if (alt_pressed) {
716- // auto bm = dynamic_cast<BezierMarker*>(m_dragged_object);
717- // if (bm) {
718- // auto nm = bm->get_parent();
719- // if (nm) {
720- // nm->move_other_marker(bm->get_uid(), nm->get_pos() * 2.f - new_pos);
721- // } else {
722- // log_warning << "Moving bezier handles without parent NodeMarker" << std::endl;
723- // }
724- // }
725- // }
726-
727- m_dragged_object->move_to (new_pos);
712+ auto pm = dynamic_cast <MarkerObject*>(m_dragged_object.get ());
713+ if (pm)
714+ new_pos -= pm->get_offset ();
728715 }
716+
717+ // TODO: Temporarily disabled during ongoing discussion
718+ // Special case: Bezier markers should influence each other when holding shift
719+ // if (alt_pressed) {
720+ // auto bm = dynamic_cast<BezierMarker*>(m_dragged_object);
721+ // if (bm) {
722+ // auto nm = bm->get_parent();
723+ // if (nm) {
724+ // nm->move_other_marker(bm->get_uid(), nm->get_pos() * 2.f - new_pos);
725+ // } else {
726+ // log_warning << "Moving bezier handles without parent NodeMarker" << std::endl;
727+ // }
728+ // }
729+ // }
730+
731+ m_dragged_object->move_to (new_pos);
729732}
730733
731734void
@@ -776,15 +779,18 @@ EditorOverlayWidget::add_path_node()
776779{
777780 m_edited_path->save_state ();
778781
779- Path::Node new_node (&m_edited_path->get_path ());
782+ auto & path = m_edited_path->get_path ();
783+ auto & path_nodes = path.m_nodes ;
784+
785+ Path::Node new_node (&path);
780786 new_node.position = m_sector_pos;
781787 new_node.bezier_before = new_node.position ;
782788 new_node.bezier_after = new_node.position ;
783789 new_node.time = 1 ;
784790 m_edited_path->get_path ().m_nodes .insert (m_last_node_marker->m_node + 1 , new_node);
785- auto & bezier_before = Sector::get ().add <BezierMarker>(&(*(m_edited_path-> get_path (). m_nodes . end () - 1 )), &((m_edited_path-> get_path (). m_nodes .end () - 1 )->bezier_before ));
786- auto & bezier_after = Sector::get ().add <BezierMarker>(&(*(m_edited_path-> get_path (). m_nodes . end () - 1 )), &((m_edited_path-> get_path (). m_nodes .end () - 1 )->bezier_after ));
787- auto & new_marker = Sector::get ().add <NodeMarker>(m_edited_path-> get_path (). m_nodes . end () - 1 , m_edited_path-> get_path (). m_nodes .size () - 1 , bezier_before.get_uid (), bezier_after.get_uid ());
791+ auto & bezier_before = Sector::get ().add <BezierMarker>(&(*(path_nodes. end () - 1 )), &((path_nodes .end () - 1 )->bezier_before ));
792+ auto & bezier_after = Sector::get ().add <BezierMarker>(&(*(path_nodes. end () - 1 )), &((path_nodes .end () - 1 )->bezier_after ));
793+ auto & new_marker = Sector::get ().add <NodeMarker>(path_nodes. end () - 1 , path_nodes .size () - 1 , bezier_before.get_uid (), bezier_after.get_uid ());
788794 bezier_before.set_parent (new_marker.get_uid ());
789795 bezier_after.set_parent (new_marker.get_uid ());
790796 // last_node_marker = dynamic_cast<NodeMarker*>(marker.get());
0 commit comments