// __author__ = Juan Carlos De Abreu (jcabreur@gmail.com)

#ifndef DATA_SYSTEM_FUNCTIONS11_H__
#define DATA_SYSTEM_FUNCTIONS11_H__

#include "DataTypes/Data.h"
#include "../Base/Memory/SmartPointer.h"

BEGIN_TEG_NAMESPACE();

// System functions to create a sceneNode.
SmartPointer<IData> model(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> Light(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> group(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> scale(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> rotate(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> translate(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> camera(std::vector<SmartPointer<IData>> params);

// System function to create a timer.
SmartPointer<IData> timer(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> stopAllTimers(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> pauseAllTimers(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> startAllTimers(std::vector<SmartPointer<IData>> params);


// System function to add another file.
SmartPointer<IData> include(std::vector<SmartPointer<IData>> params);

// System function to set the a key function.
SmartPointer<IData> setKeyFunc(std::vector<SmartPointer<IData>> params);

// System function to set the raster functions.
SmartPointer<IData> InitializeRaster(std::vector< SmartPointer<IData> > params);
SmartPointer<IData> SetRasterButtonFunc(std::vector< SmartPointer<IData> > params);
SmartPointer<IData> IsRasterButtonPressed(std::vector< SmartPointer<IData> > params);
SmartPointer<IData> GetRasterPosition(std::vector< SmartPointer<IData>> params);
SmartPointer<IData> GetRasterOrientation(std::vector< SmartPointer<IData> > params);

// System function to detect collision between two GeometryNodes.
SmartPointer<IData> collisionDetection(std::vector<SmartPointer<IData>> params);

// Utilities functions.
SmartPointer<IData> print(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> clone(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> exit(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> material(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> getMaterial(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> TYPE(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> Reset(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> help(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> version(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> getMousePos(std::vector<SmartPointer<IData>> params);

// Math functions.
SmartPointer<IData> sin(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> cos(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> tan(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> log(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> exp(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> abs(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> sqrt(std::vector<SmartPointer<IData>> params);

SmartPointer<IData> rand(std::vector<SmartPointer<IData>> params);

// Functions to cast a value to a specific type.
SmartPointer<IData> toInt(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> toBool(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> toFloat(std::vector<SmartPointer<IData>> params);
SmartPointer<IData> toString(std::vector<SmartPointer<IData>> params);

END_TEG_NAMESPACE();

#endif  // DATA_SYSTEM_FUNCTIONS11_H__
