/*
 * $Id: mesh.h,v 1.12 2002/07/19 20:33:28 msell Exp $
 *
 *
 * $Log: mesh.h,v $
 * Revision 1.12  2002/07/19 20:33:28  msell
 * #pragma once -> #ifndef
 *
 * Revision 1.11  2002/07/19 20:08:28  msell
 * Linux-porttausta
 *
 * Revision 1.10  2002/07/17 20:32:47  msell
 * Detail-optio toimii
 *
 * Revision 1.9  2002/07/15 15:22:08  msell
 * Parantelua
 *
 * Revision 1.8  2002/07/14 21:22:39  jkaarlas
 * skybox ja ukkojen säätö
 *
 * Revision 1.7  2002/07/10 17:13:44  msell
 * Törmäystarkastelun parantelua
 *
 * Revision 1.6  2002/07/07 17:53:21  msell
 * Legoukon alku
 *
 * Revision 1.5  2002/07/04 21:05:41  msell
 * Se toimii!! =)
 * Törmäystarkistukset siis
 *
 * Revision 1.4  2002/06/30 16:05:04  msell
 * Törmäyksien parantelua, transformaatioita mukana
 *
 * Revision 1.3  2002/06/26 22:30:29  jkaarlas
 * lisätty Vertexiin tekstuurikoordinaatit
 *
 * Revision 1.2  2002/06/24 14:12:15  msell
 * Nyt toimii sphere -> mesh -törmäykset, ihan tosi
 *
 * Revision 1.1  2002/06/20 22:50:12  msell
 * Meshit
 *
 *
 *
 * $Date: 2002/07/19 20:33:28 $
 *
 */

#ifndef __MESH_H_INCLUDED__
#define __MESH_H_INCLUDED__

#include "object.h"


#define X_AXIS 0
#define Y_AXIS 1
#define Z_AXIS 2


class Vertex{
public:
	float position[3];
	float oldposition[3];
	float normal[3];
  float texcoords[2];

	Vertex(void);
	Vertex(float x, float y, float z);
	Vertex(float x, float y, float z, float nx, float ny, float nz);
  
	void setTexCoords(float u, float v);
};


class Edge;

class Polygon{
public:
	float planenormal[3];
	float planedistance;
	bool smooth;
	bool realsmooth;

	int vertexcount;
	Vertex **vertices;
	int edgecount;
	Edge **edges;

	Polygon(void);
};



class Edge{
public:
	Vertex *v1, *v2;
	class Polygon *p1, *p2;
};



class Mesh{
public:
	int vertexcount;
	Vertex *vertices;

	int polygoncount;
	class Polygon *polygons;

	Edge *edges;
	int edgecount;


	Mesh(void);
	~Mesh(void);

	void createPlanes(void);
	void createVertexnormals(void);
	void createEdges(void);
	float calculateScale(float targetLength, int axis);
	void scale(float targetLength, int axis);
  void scale(float scale);
};



class MeshObject : public Object{
public:
	Mesh *mesh;

	MeshObject(Mesh *mesh);
};



class MeshAppearance : public Appearance{
private:
	Mesh *mesh;

public:
	MeshAppearance(Mesh *mesh);

	void draw(void);
};



//Geometry of sphere

class MeshShape : public Shape{
private:
	Mesh *mesh;

public:
	MeshShape(MeshObject *meshobject);
	MeshShape(Object *object, Mesh *mesh);

	float calculateMomentOfInertia(float *rotationvector);

	bool checkCollision(Object *target);

	bool checkCollisionPeer(SphereShape *target);
	bool checkCollisionPeer(MeshShape *target);

	friend class SphereShape;
};

#endif

