/*
 *  chill_fractal.h
 *  lsystems_one
 *
 *  Created by lewhill2 on Sat Feb 21 2004.
 *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
 *
 */

#ifndef _TREE_FRACTAL_H_
#define _TREE_FRACTAL_H_


#include <string>
#include <iostream>
#include <list>


#include "FractalRule.h"
#include "SpiralFlower.h"
#include "NoteColorLookupTable.h"

// grammar
//
// F = forward
// + = turn left about Z axis
// - = turn right about Z axis
// ( = turn left about Y axis
// ) = turn right about Y axis
// * = turn left about X axis
// & = turn right about X axis
// [ = push stack
// ] = pop stack
// L = flower
//

using namespace std;

class TreeFractal{
	
public:
	
	TreeFractal();
	TreeFractal(int mode);
	~TreeFractal();
	
	void init();

	void setInitiator(string in_initiator);
	void addRule(char generator_key, string generator);	
	void clearRules();
	void printRules();
		
	void doOneGeneration();
	
	int getFractalLength();
	
	string getFractal();
	
	int getNumGenerations();
	
	void frame();
	
	void draw();
	
	void playNote(int note, float intensity);
	void toggleNote(int note);
	
	void setConfiguration(int mode);

	void generateAngles();
	
	void setAttColor(int angleIndex);
	
	void drawFlower();
	void drawLeaf();

	void setRotationAngle(char symbol, float angle);
	void setRotationVector(char symbol, float x, float y, float z); //xyz
	void setRotationAngleAndVector(char symbol, float angle, float x, float y, float z); //xyz
	void setDefaultRotationAnglesAndVectors();
	
	void requestUpdate();
	
private:

	void doGenerations();
		
	int newData; // flag indicating a change in a variable status.
	
	string initiator;
	string generator;
	char generator_key;
	
	string fractal;
	string newFractal;

	//contains the number of generations performed by the simulation.
	int generationsPerformed;
	int doNumGenerations;
	int* fractalAngleIndex;
	float* randomAngleIndex;
	
	//	float travelDistance;

	float* stackdepthcolor;
	
	float angle;
	float deltaAngle;
	
	list<FractalRule*> ruleList;
	list<FractalRule*>::const_iterator ruleListIter;
		
	int firstTime;
	
	// this array is a running counter of the current angle values
	float angles[12];
	
	// these are the midi note values.
	float noteValues[12];
	
	NoteColorLookupTable note_color_table;				

	float attColor[3];

	SpiralFlower spiralFlower;

	float rotAngles[6];  // +,-,(,),*,&
	float rotVectors[6][3];  // +,-,(,),*,&
	
};

#endif

