rts_glOBJ.h 2.41 KB
#ifndef RTS_GLOBJ_H
#define RTS_GLOBJ_H

#include "objJedi.h"
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <list>

using namespace std;

#define BUFSIZE 20000

#define OBJ_NOT_SELECTED		0x0000
#define OBJ_SELECTED			0x0001
#define OBJ_SELECTED_PRIMITIVES	0x0002

#define RTS_GLOBJ_SINGLE_NEW_SELECTION	0
#define RTS_GLOBJ_SINGLE_ADD_SELECTION	1
#define RTS_GLOBJ_SINGLE_SUB_SELECTION  2

#define RTS_GLOBJ_MULTI_NEW_SELECTION	3
#define RTS_GLOBJ_MULTI_ADD_SELECTION	4
#define RTS_GLOBJ_MULTI_SUB_SELECTION	5

class rts_glOBJ : public rtsOBJ
{
private:
	int is_selected;			//the object, or part of the object, is selected
	list<unsigned int> selected_primitives;

	//rendering variables
	GLint dl;
	bool dl_valid;				//true if the display list is valid
	
	OBJint f_CreateDisplayList();

	void f_RenderPointList(unsigned int pointlist);
	void f_RenderLineStrip(unsigned int line);
	void f_RenderFace(unsigned int face);

	OBJint f_RenderTexCoord(vertex_texture &texcoord);
	OBJint f_RenderNormal(vertex_normal &normal);
	OBJint f_RenderVertex(vertex_position &v);
	OBJint f_RenderPrimitive(unsigned int id);

	void SelectMultipleHits(GLuint* buffer, unsigned int num_hits);
	void SelectClosestHit(GLuint* buffer, unsigned int num_hits);
	void SelectPrimitive(unsigned int primitive);
	void UnselectMultipleHits(GLuint* buffer, unsigned int num_hits);
	void UnselectClosestHit(GLuint* buffer, unsigned int num_hits);
	void UnselectPrimitive(unsigned int primitive);
	
public:
	//constructors
	//basic
	rts_glOBJ()
	{
		is_selected = false;
		dl_valid = false;
		cout<<selected_primitives.size()<<endl;
	}
	//assignment
	rts_glOBJ& operator=(const rtsOBJ& obj)
	{
		CopyOBJ(obj);
		is_selected = false;
		dl_valid = false;
		return *this;
	}
	//copy
	rts_glOBJ(const rtsOBJ& obj)
	{
		CopyOBJ(obj);
		is_selected = false;
		dl_valid = false;
		//return *this;
	}

	OBJint glRender();
	OBJint glRenderSelected();
	void Invalidate(){dl_valid = false;}			//invalidate the display list

	//return true of the object is currently selected
	int selected(){return is_selected;};
	//unsigned int getSelected(unsigned int i = 0){return selected_primitives[i];}
	void Pick(unsigned int x, unsigned int y, unsigned int size_x, unsigned int size_y, unsigned int picktype = RTS_GLOBJ_SINGLE_NEW_SELECTION);
	rts_glOBJ GetSelected();
	void ExpandSelection();
	
};

#endif