Skip to content

Commit

Permalink
improve new turtle
Browse files Browse the repository at this point in the history
  • Loading branch information
fredboudon committed Oct 19, 2022
1 parent e7289d1 commit f2eee74
Show file tree
Hide file tree
Showing 4 changed files with 228 additions and 98 deletions.
69 changes: 49 additions & 20 deletions src/cpp/plantgl/algo/modelling/pglturtledrawer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<PlanarModel>(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<PlanarModel>(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)
Expand Down Expand Up @@ -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){
Expand Down
140 changes: 111 additions & 29 deletions src/cpp/plantgl/algo/modelling/pglturtledrawer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<Vector3>& left,
const std::vector<real_t>& 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;

Expand Down
101 changes: 56 additions & 45 deletions src/cpp/plantgl/algo/modelling/turtledrawer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<Vector3>& left,
const std::vector<real_t>& 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<TurtleDrawer> TurtleDrawerPtr;
Expand Down
Loading

0 comments on commit f2eee74

Please sign in to comment.