diff --git a/src/cpp/plantgl/algo/modelling/pglturtledrawer.cpp b/src/cpp/plantgl/algo/modelling/pglturtledrawer.cpp index 3ebfae6b..baa677cd 100644 --- a/src/cpp/plantgl/algo/modelling/pglturtledrawer.cpp +++ b/src/cpp/plantgl/algo/modelling/pglturtledrawer.cpp @@ -145,34 +145,54 @@ AppearancePtr PglTurtle::getCurrentInitialMaterial() const{ } */ -void PglTurtleDrawer::customGeometry(const GeometryPtr smb, real_t scale) +void PglTurtleDrawer::customGeometry(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + const GeometryPtr smb) { - if( FABS(scale) > GEOM_EPSILON){ - PlanarModelPtr _2Dtest = dynamic_pointer_cast(smb); - if (is_valid_ptr(_2Dtest) && __params->screenCoordinates) - _addToScene(transform(GeometryPtr(new Scaled(getScale()*scale,GeometryPtr(new Oriented(Vector3(0,1,0),Vector3(0,0,1),smb)))),false)); - else _addToScene(transform(GeometryPtr(new Scaled(getScale()*scale,smb)),false)); - } + if( FABS(norm(scaling)) > GEOM_EPSILON){ + PlanarModelPtr _2Dtest = dynamic_pointer_cast(smb); + if (is_valid_ptr(_2Dtest) && __params->screenCoordinates) + _addToScene(transform(position, heading, left, up scaling, GeometryPtr(new Oriented(Vector3(0,1,0),Vector3(0,0,1),smb)))); + else _addToScene(transform(position, heading, left, up scaling, smb)); + } } GeometryPtr -PglTurtleDrawer::transform(const GeometryPtr& o, bool scaled) const{ - GeometryPtr obj = o; - if ( scaled && getScale() != Vector3(1,1,1) && - (getScale().x() != getScale().y() || - getScale().y() != getScale().z() )) - obj = GeometryPtr(new Scaled(getScale(),obj)); - if ( getUp() != Vector3::OX || - getLeft() != -Vector3::OY ) - obj = GeometryPtr(new Oriented(getUp(),-getLeft(),obj)); - if ( getPosition() != Vector3::ORIGIN ) - obj = GeometryPtr(new Translated(getPosition(),obj)); +PglTurtleDrawer::transform(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const GeometryPtr& obj) const { + if ( up != Vector3::OX || + left != -Vector3::OY ) + obj = GeometryPtr(new Oriented(up,-left,obj)); + if ( position != Vector3::ORIGIN ) + obj = GeometryPtr(new Translated(position,obj)); return obj; } +GeometryPtr +PglTurtleDrawer::transform_n_scale(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const GeometryPtr& obj) const { + if ( scaling != Vector3(1,1,1) && + (scaling.x() != scaling.y() || + scaling.y() != scaling.z() )) + obj = GeometryPtr(new Scaled(scaling,obj)); + return transform(position, heading, left, up, obj); +} + -void PglTurtleDrawer::addToScene(const GeometryPtr geom, bool custompid, AppearancePtr app, bool projection) +void PglTurtleDrawer::addToScene(const GeometryPtr geom, const uint_t id, AppearancePtr app, bool projection) { GeometryPtr mgeom = geom; if (projection && getParameters().screenCoordinates) @@ -228,7 +248,16 @@ void PglTurtleDrawer::frustum(real_t length, real_t topradius){ } } -void PglTurtleDrawer::cylinder(real_t length){ +void PglTurtleDrawer::void cylinder(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t length, + real_t radius, + uint_t sectionResolution){ if (fabs(length) > GEOM_EPSILON) { real_t width = getWidth(); if(FABS(width) < GEOM_EPSILON){ diff --git a/src/cpp/plantgl/algo/modelling/pglturtledrawer.h b/src/cpp/plantgl/algo/modelling/pglturtledrawer.h index 8a5d7d25..ce12f3ff 100644 --- a/src/cpp/plantgl/algo/modelling/pglturtledrawer.h +++ b/src/cpp/plantgl/algo/modelling/pglturtledrawer.h @@ -68,45 +68,127 @@ class ALGO_API PglTurtleDrawer : public TurtleDrawer { const ScenePtr& getScene() const { return __scene; } - virtual void cylinder(const TurtleParam * params, real_t length, real_t radius); - - virtual void frustum(const TurtleParam * params, real_t length, real_t baseradius, real_t topradius); - - virtual void generalizedCylinder(const TurtleParam * params, + virtual void cylinder(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t length, + real_t radius, + uint_t sectionResolution){} + + virtual void frustum(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t length, + real_t baseradius, + real_t topradius, + uint_t sectionResolution){} + + virtual void generalizedCylinder(const uint_t id, + AppearancePtr appearance, const Point3ArrayPtr& points, const std::vector& left, const std::vector& radius, const Curve2DPtr& crossSection, - bool crossSectionCCW, - bool currentcolor = false); - - virtual void sphere(const TurtleParam * params, real_t radius); - - virtual void circle(const TurtleParam * params, real_t radius); - - virtual void box(const TurtleParam * params, real_t radius, real_t botradius, real_t topradius); - - virtual void quad(const TurtleParam * params, real_t radius, real_t botradius, real_t topradius); - - virtual void polygon(const TurtleParam * params, const Point3ArrayPtr& points, bool concavetest = false); - - virtual void vector(const TurtleParam * params, real_t heigth, real_t cap_heigth_ratio, real_t cap_radius_ratio, real_t color, real_t transparency); - - virtual void label(const TurtleParam * params, const std::string& text, int size = -1); - - virtual void customGeometry(const GeometryPtr smb, real_t scale = 1.0); + bool crossSectionCCW){} + + virtual void sphere(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t radius){} + + virtual void circle(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t radius){} + + virtual void box(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t length, + real_t botradius, + real_t topradius){} + + virtual void quad(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + real_t length, + real_t botradius, + real_t topradius){} + + virtual void polygon(const uint_t id, + AppearancePtr appearance, + const Point3ArrayPtr& points, + const Index3ArrayPtr& indices){} + + virtual void arrow(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance + real_t heigth, + real_t cap_heigth_ratio, + real_t cap_radius_ratio, + Color4 color) { } + + virtual void label(const Vector3& position, + const uint_t id, + AppearancePtr appearance, + const std::string& text, + int size = -1){} + + virtual void customGeometry(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const uint_t id, + AppearancePtr appearance, + const GeometryPtr smb); protected: - AppearancePtr getCurrentMaterial() const; - - AppearancePtr getCurrentInitialMaterial() const; - GeometryPtr getCircle(real_t radius) const; - GeometryPtr transform(const GeometryPtr& obj, bool scaled = true) const; + GeometryPtr transform(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const Vector3& scaling, + const GeometryPtr& obj) const; + + GeometryPtr transform_n_scale(const Vector3& position, + const Vector3& heading, + const Vector3& left, + const Vector3& up, + const GeometryPtr& obj) const; - void _addToScene(const TurtleParam * params, const GeometryPtr geom, bool customid = false, AppearancePtr app = NULL, bool projection = true); + void _addToScene(const GeometryPtr geom, const uint_t id, AppearancePtr app = NULL, bool projection = true); ScenePtr __scene; diff --git a/src/cpp/plantgl/algo/modelling/turtledrawer.h b/src/cpp/plantgl/algo/modelling/turtledrawer.h index 92ef0195..d4cfc3fb 100644 --- a/src/cpp/plantgl/algo/modelling/turtledrawer.h +++ b/src/cpp/plantgl/algo/modelling/turtledrawer.h @@ -53,81 +53,92 @@ PGL_BEGIN_NAMESPACE class ALGO_API TurtleDrawer : public RefCountObject { public: + struct FrameInfo { + const Vector3& position; + const Vector3& heading; + const Vector3& left; + const Vector3& up; + const Vector3& scaling; + bool screenprojection; + }; + TurtleDrawer(); virtual ~TurtleDrawer(); - virtual void cylinder(const Vector3& position, - const Vector3& heading, - const Vector3& left, - const Vector3& up, - const Vector3& scaling, - const uint_t id, + virtual void cylinder(const uint_t id, AppearancePtr appearance, + const FrameInfo& frameinfo, real_t length, real_t radius, uint_t sectionResolution){} - virtual void frustum(const Vector3& position, - const Vector3& heading, - const Vector3& left, - const Vector3& up, - const Vector3& scaling, - const uint_t id, + virtual void frustum( const uint_t id, AppearancePtr appearance, + const FrameInfo& frameinfo, real_t length, real_t baseradius, - real_t topradius, uint_t sectionResolution){} + real_t topradius, + uint_t sectionResolution){} virtual void generalizedCylinder(const uint_t id, AppearancePtr appearance, + bool screenprojection, const Point3ArrayPtr& points, const std::vector& left, const std::vector& radius, const Curve2DPtr& crossSection, - bool crossSectionCCW, - bool currentcolor = false){} - - virtual void sphere(const Vector3& position, - const Vector3& heading, - const Vector3& left, - const Vector3& up, - const Vector3& scaling, - const uint_t id, + bool crossSectionCCW){} + + virtual void sphere(const uint_t id, AppearancePtr appearance, + const FrameInfo& frameinfo, real_t radius){} - virtual void circle(const Vector3& position, - const Vector3& heading, - const Vector3& left, - const Vector3& up, - const Vector3& scaling, - const uint_t id, + virtual void circle(const uint_t id, AppearancePtr appearance, + const FrameInfo& frameinfo, real_t radius){} - virtual void box(const Vector3& position, - const Vector3& heading, - const Vector3& left, - const Vector3& up, - const Vector3& scaling, - const uint_t id, - AppearancePtr appearance, + virtual void box(const uint_t id, + AppearancePtr appearance, + const FrameInfo& frameinfo, real_t length, real_t botradius, real_t topradius){} - virtual void quad(const TurtleParam * params, real_t length, real_t botradius, real_t topradius){} - - virtual void polygon(const TurtleParam * params, const Point3ArrayPtr& points, bool concavetest = false){} - - virtual void arrow(const TurtleParam * params, real_t heigth, real_t cap_heigth_ratio, real_t cap_radius_ratio, - real_t color, real_t transparency) { } - - virtual void label(const TurtleParam * params, const std::string& text, int size = -1){} - - virtual void customGeometry(const GeometryPtr smb, real_t scale = 1.0); + virtual void quad(const uint_t id, + AppearancePtr appearance, + const FrameInfo& frameinfo, + real_t length, + real_t botradius, + real_t topradius){} + + virtual void polygon(const uint_t id, + AppearancePtr appearance, + bool screenprojection, + const Point3ArrayPtr& points, + const Index3ArrayPtr& indices){} + + virtual void arrow(const FrameInfo& frameinfo, + real_t heigth, + real_t cap_heigth_ratio, + real_t cap_radius_ratio, + Color4 color) { } + + virtual void label(const Vector3& position, + bool screenprojection, + const uint_t id, + AppearancePtr appearance, + const std::string& text, + int size = -1){} + + virtual void customGeometry(const uint_t id, + AppearancePtr appearance + const FrameInfo& frameinfo, + const GeometryPtr smb, + real_t scale = 1.0); }; typedef RCPtr TurtleDrawerPtr; diff --git a/src/cpp/plantgl/algo/modelling/turtleparam.h b/src/cpp/plantgl/algo/modelling/turtleparam.h index 302678f3..eeec71a9 100644 --- a/src/cpp/plantgl/algo/modelling/turtleparam.h +++ b/src/cpp/plantgl/algo/modelling/turtleparam.h @@ -153,6 +153,14 @@ class ALGO_API TurtleParam : public TurtleDrawParameter { return position ; } + void forward(real_t l); + + void left(real_t angle); + + void up(real_t angle); + + void rollR(real_t angle); + public: Vector3 position; @@ -164,16 +172,16 @@ class ALGO_API TurtleParam : public TurtleDrawParameter { real_t width; - Point3ArrayPtr pointList; - std::vector leftList; - std::vector radiusList; - uint_t customId; uint_t customParentId; uint_t lastId; uint_t sectionResolution; + Point3ArrayPtr pointList; + std::vector leftList; + std::vector radiusList; + TurtleDrawParameter initial; Vector3 tropism;