*** empty log message ***
[lsystem3d.git] / src / turtle.cpp
index 9847b5af8d8562e2f7f6a763a8f6694f8c774f31..69421c86433bb861191a8d82b313d69fc35462ca 100644 (file)
 #include "turtle.h"
 #include "vector.h"
 
+using namespace std;
+
 
 
 /**
  * Constructor
- * @param model render this model
+ * @param model create this model
  */
 Turtle::Turtle(Model *model)
 {
+    _model = model;
+    
     // initial position and orientation
     reset();
 
     // 90 degrees
     _angle = M_PIl / 2.0;
-    
-    _model = model;
 }
 
 
@@ -159,18 +161,31 @@ void Turtle::walk()
     // move turtle to new position
     _position.setXYZ(endX, endY, endZ);
     
-    if (!_fenceMode)
-    {
-        // connect the points
-        _model->segment(_diameter,
-                         startX, startY, startZ,
-                         endX,   endY,   endZ);
-    }
-    else
-    {
-        // part of a filled surface
-        _model->point(endX, endY, endZ);
-    }
+    // connect start and end point
+    _model->segment(startX, startY, startZ,
+                    endX,   endY,   endZ);
+}
+
+
+
+/**
+ * Walk forward, creating a filled surface
+ * TODO: merge with walk() ?
+ */
+void Turtle::fillWalk()
+{
+    // end point
+    double destinationX = _position.getX() + _heading.getX();
+    double destinationY = _position.getY() + _heading.getY();
+    double destinationZ = _position.getZ() + _heading.getZ();
+    
+    _model->normal(_up.getX(), _up.getY(), _up.getZ());
+    
+    // move turtle to new position
+    _position.setXYZ(destinationX, destinationY, destinationZ);
+    
+    // part of a filled polygon
+    _model->vertex(destinationX, destinationY, destinationZ);
 }
 
 
@@ -189,7 +204,12 @@ void Turtle::push()
     _upStack.push(_up);
     
     // diameter
-    _diameterStack.push(_diameter);
+    double diameter = _model->getDiameter();
+    _diameterStack.push(diameter);
+    
+    // color index
+    int colorIndex = _model->getColorIndex();
+    _colorIndexStack.push(colorIndex);
 }
 
 
@@ -200,15 +220,20 @@ void Turtle::push()
 void Turtle::pop()
 {
     // position
-    _position = _positionStack.top();       _positionStack.pop();
+    _position = _positionStack.top();           _positionStack.pop();
 
     // orientation
-    _heading = _headingStack.top();         _headingStack.pop();
-    _left = _leftStack.top();               _leftStack.pop();
-    _up = _upStack.top();                   _upStack.pop();
+    _heading = _headingStack.top();             _headingStack.pop();
+    _left = _leftStack.top();                   _leftStack.pop();
+    _up = _upStack.top();                       _upStack.pop();
     
     // diameter
-    _diameter = _diameterStack.top();       _diameterStack.pop();
+    double diameter = _diameterStack.top();        _diameterStack.pop();
+    _model->setDiameter(diameter);
+    
+    // color index
+    int colorIndex = _colorIndexStack.top();    _colorIndexStack.pop();
+    _model->setColorIndex(colorIndex);
 }
 
 
@@ -217,12 +242,7 @@ void Turtle::pop()
  * Reset to default state
  */
 void Turtle::reset()
-{
-    _diameter = 0.1;
-    
-    _fenceMode = false;
-    
-    
+{   
     // put turtle at (0,0,0), head upwards, back towards camera
     
     _position.setXYZ(0.0, 0.0, 0.0);
@@ -230,42 +250,15 @@ void Turtle::reset()
     _heading.setXYZ(0.0, 1.0, 0.0);
     _left.setXYZ(1.0, 0.0, 0.0);
     _up.setXYZ(0.0, 0.0, 1.0);
-}
-
-
-
-/**
- * Decrement diameter of segment
- */
-void Turtle::decrementDiameter()
-{
-    // TODO: dynamic value...
-    _diameter *= 0.8;
-}
-
-
-
-/**
- * Begin creation of a filled surface
- */
-void Turtle::fenceInBegin()
-{
-    _fenceMode = true;
     
-    _model->fillBegin();
-    _model->point(_position.getX(), _position.getY(), _position.getZ());
-}
-
-
-
-/**
- * End creation of a filled surface
- */
-void Turtle::fenceInEnd()
-{
-    _model->fillEnd();
     
-    _fenceMode = false;
+    // empty the stacks
+    _positionStack = stack<Coordinate>();
+    _headingStack = stack<Vector>();
+    _leftStack = stack<Vector>();
+    _upStack = stack<Vector>();
+    _diameterStack = stack<double>();
+    _colorIndexStack = stack<int>();
 }