]> git.donarmstrong.com Git - lilypond.git/commitdiff
Adds Beam_collision_engraver to the Score context.
authorMike Solomon <mike@apollinemike.com>
Wed, 21 Dec 2011 07:57:53 +0000 (08:57 +0100)
committerGraham Percival <graham@percival-music.ca>
Mon, 26 Dec 2011 01:49:18 +0000 (17:49 -0800)
Modifies the engraver to handle all cross staff collisions and
gets the coordinate for collision avoidance correct in beam-quanting.cc.

input/regression/beam-collision-cross-staff2.ly [new file with mode: 0644]
lily/beam-collision-engraver.cc
lily/beam-quanting.cc
ly/engraver-init.ly

diff --git a/input/regression/beam-collision-cross-staff2.ly b/input/regression/beam-collision-cross-staff2.ly
new file mode 100644 (file)
index 0000000..7d147de
--- /dev/null
@@ -0,0 +1,15 @@
+\version "2.15.22"
+
+\header {
+  texidoc = "Cross staff beams do collision avoidance.
+"
+}
+
+\new PianoStaff <<
+  \new Staff = up \relative c' { s2 }
+  \new Staff \relative c' {
+    \clef bass \time 2/4
+    g,32 [ d' \change Staff = up d'
+    gis a c d g ] r4 |
+  }
+>>
index fa829325593d7cd3beb45037bc22267c6ea5ae7c..8e397508b79df7aa092516598a6e5df8fcb653b0 100644 (file)
@@ -77,6 +77,14 @@ Beam_collision_engraver::finalize ()
     {
       Grob *beam_grob = beams_[i].grob ();
 
+      extract_grob_set (beam_grob, "normal-stems", stems);
+      Interval_t<int> vertical_span;
+      for (vsize j = 0; j < stems.size (); j++)
+        {
+          int vag = Grob::get_vertical_axis_group_index (stems[j]);
+          if (vag >= 0)
+            vertical_span.add_point (vag);
+        }
       Context *beam_context = beams_[i].context ();
 
       Interval_t<int> beam_spanned_rank_ = beam_grob->spanned_rank_interval ();
@@ -88,6 +96,9 @@ Beam_collision_engraver::finalize ()
       for (vsize j = start; j < covered_grobs_.size (); j++)
         {
           Grob *covered_grob = covered_grobs_[j].grob ();
+          int vag = Grob::get_vertical_axis_group_index (covered_grob);
+          if (!vertical_span.contains (vag))
+            continue;
           Context *covered_grob_context = covered_grobs_[j].context ();
 
           Interval_t<int> covered_grob_spanned_rank = covered_grob->spanned_rank_interval ();
index e971d6ee9d14f8a734105f80c896430363c436da..77dfc9ae0a51d8f42e58e6f80ee283c41b9a896b 100644 (file)
@@ -283,6 +283,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
           base_lengths_.push_back (y / staff_space_);
           stem_xpositions_.push_back (s->relative_coordinate (common[X_AXIS], X_AXIS) - x_pos[LEFT] + x_span_);
           stem_ypositions_.push_back (s->relative_coordinate (common[Y_AXIS], Y_AXIS) - my_y);
+
           if (is_normal_.back ())
             {
               if (beam_width[LEFT] == -1.0)
@@ -350,6 +351,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
             continue;
 
           b[X_AXIS] += (x_span_ - x_pos[LEFT]);
+          b[Y_AXIS] -= my_y;
           Real width = b[X_AXIS].length ();
           Real width_factor = sqrt (width / staff_space_);
 
@@ -374,7 +376,7 @@ void Beam_scoring_problem::init_instance_variables (Grob *me, Drul_array<Real> y
           Interval y;
           y.set_full ();
           y[-stem_dir] = Stem::chord_start_y (*it) + (*it)->relative_coordinate (common[Y_AXIS], Y_AXIS)
-                         - beams[i]->relative_coordinate (common[Y_AXIS], Y_AXIS);
+                         - my_y;
 
           Real factor = parameters_.STEM_COLLISION_FACTOR;
           if (!unsmob_grob (s->get_object ("beam")))
index 093b88e9b2f833497f71d2e4e334fc70cda71f3b..d1f43f79fe0266a9f5262b47a0ba484faa98e89e 100644 (file)
@@ -71,7 +71,6 @@
   \consists "Ledger_line_engraver"
   \consists "Staff_symbol_engraver"
   \consists "Collision_engraver"
-  \consists "Beam_collision_engraver"
   \consists "Grob_pq_engraver"
   \consists "Rest_collision_engraver"
   \consists "Accidental_engraver"
@@ -539,6 +538,7 @@ automatically when an output definition (a @code{\score} or
   \consists "Bar_number_engraver"
   \consists "Parenthesis_engraver"
   \consists "Concurrent_hairpin_engraver"
+  \consists "Beam_collision_engraver"
 
   \defaultchild "Staff"