Author: Carlos Lopez <[email protected]>
Date: Sun Jul 24 12:07:59 2011 +0200
Improve step size for smooth render. Experimental. I think this should be user
selectable because it can eventually reduce render speed
---
.../src/modules/mod_geometry/advanced_outline.cpp | 44 ++++++++++++++++---
.../src/modules/mod_geometry/advanced_outline.h | 1 +
2 files changed, 38 insertions(+), 7 deletions(-)
diff --git a/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
b/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
index c4642ad..bac0dce 100644
--- a/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
+++ b/synfig-core/src/modules/mod_geometry/advanced_outline.cpp
@@ -54,6 +54,9 @@ using namespace etl;
/* === M A C R O S ========================================================= */
#define SAMPLES 50
+#define ANGLE_ERROR 0.01
+#define MINIMUM_STD_STEP 0.001
+#define IMPROVE_STEPS true
#define ROUND_END_FACTOR (4)
#define CUSP_THRESHOLD (0.40)
#define SPIKE_AMOUNT (4)
@@ -248,17 +251,13 @@ Advanced_Outline::sync()
// Sort the wplist again to place the two new widthpoints on
place.
sort(wplist.begin(),wplist.end());
- ////////////////////////////////////////////////////////////////
+ /////////////////////////////DEBUG/////////////////////////////
//list the wplist
//synfig::info("------");
//for(witer=wplist.begin();witer!=wplist.end();witer++)
//synfig::info("P:%f W:%f B:%d A:%d",
witer->get_norm_position(), witer->get_width(), witer->get_side_type_before(),
witer->get_side_type_after());
//synfig::info("------");
- ////////////////////////////////////////////////////////////////
- // TODO: step should be a function of the current situation
- // i.e.: where in the bline, and where in wplist so we could go
- // faster or slower when needed.
- Real step(1.0/SAMPLES/bline_size);
+ ////////////////////////////DEBUG//////////////////////////////
// we start with the next withpoint being the first on the list.
wnext=wplist.begin();
// then the current widthpoint would be the last one if
blinelooped...
@@ -465,8 +464,30 @@ Advanced_Outline::sync()
const Real
w(expand_+width_*0.5*widthpoint_interpolate(*witer, *wnext, ipos, smoothness_));
side_a.push_back(p+d*w);
side_b.push_back(p-d*w);
- ipos = ipos + step;
+ // get the standard position
sipos = homogeneous?hom_to_std(bline, ipos,
wplist_.get_loop(), blineloop):ipos;
+ Real witer_pos((*witer).get_norm_position());
+ witer_pos = homogeneous?hom_to_std(bline,
witer_pos, wplist_.get_loop(), blineloop):witer_pos;
+ // calculate a new standard positon based on
the surrounding points (width and bline)
+ Real sipos_new = sipos + step(sipos, witer_pos,
swnext_pos, biter_pos, bnext_pos);
+ // if we stay in the same bezier...
+ if(sipos_new < bnext_pos && IMPROVE_STEPS)
+ {
+ // Lets compare the new position with
the tangent on previous position
+ // to see how much polygonal is the
step we are doing
+ Vector
p2(curve(bline_to_bezier(sipos_new, biter_pos, bezier_size)));
+ Vector d2(deriv(q).norm());
+ Vector on_curve(Vector(p2-p).norm());
+ Real cosfi(on_curve*d2);
+ while ((1.0-cosfi) > ANGLE_ERROR &&
(sipos_new-sipos) > MINIMUM_STD_STEP)
+ {
+ sipos_new = sipos_new -
(sipos_new-sipos)/2;
+
p2=curve(bline_to_bezier(sipos_new, biter_pos, bezier_size));
+ on_curve=Vector(p2-p).norm();
+ cosfi=on_curve*d2;
+ }
+ }
+ ipos = homogeneous?std_to_hom(bline, sipos_new,
wplist_.get_loop(), blineloop):sipos_new;
} while (1); // secondary loop
} while(1); // main loop
@@ -893,3 +914,12 @@ Advanced_Outline::add_cusp(std::vector<Point> &side_a,
std::vector<Point> &side_
break;
}
}
+
+Real
+Advanced_Outline::step(Real ipos, Real wipos, Real wnpos, Real bipos, Real
bnpos)
+{
+ if(ipos < wnpos && ipos < bnpos && ipos > wipos && ipos > bipos)
+ return min(min(min(bnpos-wipos, bnpos-bipos), wnpos-wipos),
wnpos-bipos)/SAMPLES;
+ else
+ return (bnpos-bipos)/SAMPLES;
+}
diff --git a/synfig-core/src/modules/mod_geometry/advanced_outline.h
b/synfig-core/src/modules/mod_geometry/advanced_outline.h
index d4702f3..a558fa8 100644
--- a/synfig-core/src/modules/mod_geometry/advanced_outline.h
+++ b/synfig-core/src/modules/mod_geometry/advanced_outline.h
@@ -85,6 +85,7 @@ private:
Real bezier_to_bline(Real bezier_pos, Real origin, Real bezier_size);
void add_tip(std::vector<Point> &side_a, std::vector<Point> &side_b,
const Point vertex, const Vector tangent, const WidthPoint wp);
void add_cusp(std::vector<Point> &side_a, std::vector<Point> &side_b,
const Point vertex, const Vector curr, const Vector last, Real width);
+ Real step(Real ipos, Real witer_pos, Real wnext_pos, Real biter_pos,
Real bnext_pos);
};
/* === E N D =============================================================== */
------------------------------------------------------------------------------
Magic Quadrant for Content-Aware Data Loss Prevention
Research study explores the data loss prevention market. Includes in-depth
analysis on the changes within the DLP market, and the criteria used to
evaluate the strengths and weaknesses of these DLP solutions.
http://www.accelacomm.com/jaw/sfnl/114/51385063/
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl