--- /dev/null
+/*! ========================================================================
+** Sinfg
+** Template File
+** $Id: region.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $
+**
+** Copyright (c) 2002 Robert B. Quattlebaum Jr.
+**
+** This software and associated documentation
+** are CONFIDENTIAL and PROPRIETARY property of
+** the above-mentioned copyright holder.
+**
+** You may not copy, print, publish, or in any
+** other way distribute this software without
+** a prior written agreement with
+** the copyright holder.
+**
+** === N O T E S ===========================================================
+**
+** ========================================================================= */
+
+/* === H E A D E R S ======================================================= */
+
+#ifdef USING_PCH
+# include "pch.h"
+#else
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "region.h"
+#include <ETL/stringf>
+#include <ETL/bezier>
+#include <ETL/hermite>
+
+#include <sinfg/string.h>
+#include <sinfg/time.h>
+#include <sinfg/context.h>
+#include <sinfg/paramdesc.h>
+#include <sinfg/renddesc.h>
+#include <sinfg/surface.h>
+#include <sinfg/value.h>
+#include <sinfg/valuenode.h>
+#include <sinfg/segment.h>
+#include <sinfg/valuenode_bline.h>
+
+#endif
+
+using namespace etl;
+
+/* === M A C R O S ========================================================= */
+
+#define SAMPLES 75
+
+/* === G L O B A L S ======================================================= */
+
+SINFG_LAYER_INIT(Region);
+SINFG_LAYER_SET_NAME(Region,"region");
+SINFG_LAYER_SET_LOCAL_NAME(Region,_("Region"));
+SINFG_LAYER_SET_CATEGORY(Region,_("Geometry"));
+SINFG_LAYER_SET_VERSION(Region,"0.1");
+SINFG_LAYER_SET_CVS_ID(Region,"$Id: region.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $");
+
+/* === P R O C E D U R E S ================================================= */
+
+/* === M E T H O D S ======================================================= */
+
+/* === E N T R Y P O I N T ================================================= */
+
+Region::Region()
+{
+ clear();
+ vector<BLinePoint> bline_point_list;
+ bline_point_list.push_back(BLinePoint());
+ bline_point_list.push_back(BLinePoint());
+ bline_point_list.push_back(BLinePoint());
+ bline_point_list[0].set_vertex(Point(0,1));
+ bline_point_list[1].set_vertex(Point(0,-1));
+ bline_point_list[2].set_vertex(Point(1,0));
+ bline_point_list[0].set_tangent(bline_point_list[1].get_vertex()-bline_point_list[2].get_vertex()*0.5f);
+ bline_point_list[1].set_tangent(bline_point_list[2].get_vertex()-bline_point_list[0].get_vertex()*0.5f);
+ bline_point_list[2].set_tangent(bline_point_list[0].get_vertex()-bline_point_list[1].get_vertex()*0.5f);
+ bline_point_list[0].set_width(1.0f);
+ bline_point_list[1].set_width(1.0f);
+ bline_point_list[2].set_width(1.0f);
+ bline=bline_point_list;
+}
+
+void
+Region::sync()
+{
+ if(bline.get_contained_type()==ValueBase::TYPE_BLINEPOINT)
+ {
+ segment_list=convert_bline_to_segment_list(bline);
+ }
+ else
+ {
+ sinfg::warning("Region: incorrect type on bline, layer disabled");
+ clear();
+ return;
+ }
+
+ if(segment_list.empty())
+ {
+ sinfg::warning("Region: segment_list is empty, layer disabled");
+ clear();
+ return;
+ }
+
+ bool looped = bline.get_loop();
+
+ Vector::value_type n;
+ etl::hermite<Vector> curve;
+ vector<Point> vector_list;
+
+ vector<Segment>::const_iterator iter=segment_list.begin();
+ //Vector last = iter->p1;
+
+ //make sure the shape has a clean slate for writing
+ //clear();
+
+ //and start off at the first point
+ //move_to(last[0],last[1]);
+
+ for(;iter!=segment_list.end();++iter)
+ {
+ //connect them with a line if they aren't already joined
+ /*if(iter->p1 != last)
+ {
+ line_to(iter->p1[0],iter->p1[1]);
+ }
+
+ //curve to the next end point
+ curve_to(iter->p1[0] + iter->t1[0]/3.0,iter->p1[1] + iter->t1[1]/3.0,
+ iter->p2[0] - iter->t2[0]/3.0,iter->p2[1] - iter->t2[1]/3.0,
+ iter->p2[0],iter->p2[1]);
+
+ last = iter->p2;*/
+
+ if(iter->t1.is_equal_to(Vector(0,0)) && iter->t2.is_equal_to(Vector(0,0)))
+ {
+ vector_list.push_back(iter->p2);
+ }
+ else
+ {
+ curve.p1()=iter->p1;
+ curve.t1()=iter->t1;
+ curve.p2()=iter->p2;
+ curve.t2()=iter->t2;
+ curve.sync();
+
+ for(n=0.0;n<1.0;n+=1.0/SAMPLES)
+ vector_list.push_back(curve(n));
+ }
+ }
+
+ //add a single point onto the end so it actually fits the shape, so we can be awesome...
+ if(!looped)
+ {
+ vector_list.push_back(curve.p2());
+ }
+
+ clear();
+ add_polygon(vector_list);
+
+ /*close();
+ endpath();*/
+}
+
+bool
+Region::set_param(const String & param, const ValueBase &value)
+{
+ if(param=="segment_list")
+ {
+ if(dynamic_param_list().count("segment_list"))
+ {
+ connect_dynamic_param("bline",dynamic_param_list().find("segment_list")->second);
+ disconnect_dynamic_param("segment_list");
+ sinfg::warning("Region::set_param(): Updated valuenode connection to use the new \"bline\" parameter.");
+ }
+ else
+ sinfg::warning("Region::set_param(): The parameter \"segment_list\" is deprecated. Use \"bline\" instead.");
+ }
+
+ if( (param=="segment_list" || param=="bline") && value.get_type()==ValueBase::TYPE_LIST)
+ {
+ //if(value.get_contained_type()!=ValueBase::TYPE_BLINEPOINT)
+ // return false;
+
+ bline=value;
+
+ return true;
+ }
+
+/* if( param=="segment_list" && value.get_type()==ValueBase::TYPE_LIST)
+ {
+ if(value.get_contained_type()==ValueBase::TYPE_BLINEPOINT)
+ segment_list=convert_bline_to_segment_list(value);
+ else
+ if(value.get_contained_type()==ValueBase::TYPE_SEGMENT)
+ segment_list=value;
+ else
+ if(value.empty())
+ segment_list.clear();
+ else
+ return false;
+ sync();
+ return true;
+ }
+ */
+ return Layer_Shape::set_param(param,value);
+}
+
+ValueBase
+Region::get_param(const String& param)const
+{
+ EXPORT(bline);
+ EXPORT_NAME();
+ EXPORT_VERSION();
+
+ return Layer_Shape::get_param(param);
+}
+
+Layer::Vocab
+Region::get_param_vocab()const
+{
+ Layer::Vocab ret(Layer_Shape::get_param_vocab());
+
+ ret.push_back(ParamDesc("bline")
+ .set_local_name(_("Vertices"))
+ .set_origin("offset")
+ );
+
+ return ret;
+}
+
+void
+Region::set_time(Context context, Time time)const
+{
+ const_cast<Region*>(this)->sync();
+ context.set_time(time);
+}
+
+void
+Region::set_time(Context context, Time time, Vector pos)const
+{
+ const_cast<Region*>(this)->sync();
+ context.set_time(time,pos);
+}