/*********************************************************************//**
*	\brief Simulace lana.
*	Trida pouziva standardni system simulacec pomoci pruzin. Funkci teto
*	tridy je vytvoreni dat na zaklade grafu, ze ktereho vytvori lano.
*	Vykreslovani probiha pomoci vertex array.
*
*	\author Michal Jirous
*	\date 20.12.2008
*	\file rope_simul.h
**********************************************************************/


#ifndef __ROPE_SIMUL_H__
#define __ROPE_SIMUL_H__

#include "spring_def.h"
#include <vector>
#include "node.h"


/** @brief Specialni uzel lana, ktery obsahuje informaci, jestli uzel muze menit pozici. */
struct ropenode_t : public GraphNode<alg::Point*>
{
	bool moveable;	/*!< @brief Udava moznost smeni pozice. */
	ropenode_t()	{ moveable = true; }	/*!< Konstruktor inicializuje moznost pohybu na true. */
};

/** @brief Trida fyzikalniho lana. */
class CRopeSimul : public SpringSystemBase
{
	bool determineRopeNodes( std::list<GraphNode<Point*>*> &ropeNodeList, GraphNode<Point*>* node );
	virtual bool mass_user_update( Mass *pMass, float dt );
public:
	CRopeSimul();			/*!< Konstruktor inicializuje data. */
	virtual ~CRopeSimul();	/*!< Destruktor dealokuje data. */

	/** @brief Funkce vytvori data noveho lana. */
	void create( float consistency, float friction, float default_points_distance, ropenode_t *root, float length_balance_add );
	virtual void draw();	/*!< Vykresleni lana pomoci vertex array a typu GL_LINE_STRIP. */
};


#endif
