--- /dev/null
+// Copyright (C) 2006 Erik Dahlberg
+//
+// This file is part of LSystem3d.
+//
+// LSystem3D is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// LSystem3D is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with LSystem3D; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+
+
+#ifndef TURTLE_H
+#define TURTLE_H
+
+#include <stack>
+
+#include "coordinate.h"
+#include "model.h"
+#include "vector.h"
+
+using namespace std;
+
+
+
+/**
+ * The model renderer
+ */
+class Turtle
+{
+public:
+ /**
+ * Constructor
+ * @param model render this model
+ */
+ Turtle(Model *model);
+
+ /**
+ * Destructor
+ */
+ ~Turtle();
+
+ /**
+ * Turn left
+ */
+ void turnLeft();
+
+ /**
+ * Turn right
+ */
+ void turnRight();
+
+ /**
+ * Pitch down
+ */
+ void pitchDown();
+
+ /**
+ * Pitch up
+ */
+ void pitchUp();
+
+ /**
+ * Roll left
+ */
+ void rollLeft();
+
+ /**
+ * Roll right
+ */
+ void rollRight();
+
+ /**
+ * Turn around
+ */
+ void turnAround();
+
+ /**
+ * Walk forward
+ */
+ void walk();
+
+ /**
+ * Save current state to stack
+ */
+ void push();
+
+ /**
+ * Restore old state from stack
+ */
+ void pop();
+
+ /**
+ * Reset to default state
+ */
+ void reset();
+
+ /**
+ * Decrement diameter of segment
+ */
+ void decrementDiameter();
+
+ /**
+ * Begin creation of a filled surface
+ */
+ void fenceInBegin();
+
+ /**
+ * End creation of a filled surface
+ */
+ void fenceInEnd();
+
+ /**
+ * Set turn/pitch/roll angle
+ * @param angle the angle, in radians
+ */
+ void setAngle(double radians);
+
+ /**
+ * Get turn/pitch/roll angle
+ * @return the angle, in radians
+ */
+ double getAngle();
+
+protected:
+
+ Coordinate _position; // current position
+
+ Vector _heading; // forward pointing vector
+ Vector _left; // left pointing vector
+ Vector _up; // up pointing vector
+
+ double _angle; // turn/pitch/roll angle
+ double _diameter; // diameter of segment
+ bool _fenceMode; // create filled surface?
+
+ stack<Coordinate> _positionStack; // positions in stack
+ stack<Vector> _headingStack; // heading vectors in stack
+ stack<Vector> _leftStack; // left vectors in stack
+ stack<Vector> _upStack; // up vectors in stack
+ stack<double> _diameterStack; // diameters in stack
+
+ Model *_model; // the rendered model
+};
+
+
+
+#endif