www.pudn.com > 3DEDITOR.rar > OBJECT.H


#include "tree.h" 
#include "ChunkFile.h" 
struct mapping 
{ 
	char filename[256]; 
	short int type,amount,options; 
	float filtering; 
	float u_scale,v_scale,u_offset,v_offset; 
	float rotation; 
	int piclibindx; 
}; 
 
class material 
{ 
public: 
	float refraction; 
	float reflection; 
	float ambient[4]; 
	float diffuse[4]; 
	float specular[4]; 
	float shininess; 
	float shininess_strength; 
	float transparency; 
	float transparency_falloff; 
	float reflect_blur; 
	short int material_type; 
	float self_illum; 
 
	char name[256]; 
 
	struct mapping  
		map_texture1,map_texture2, 
		map_opacity,map_bump,map_specular, 
		map_shininess,map_selfillum,map_reflection; 
 
	material() 
	{ 
		memset(this,0,sizeof(material)); 
		refraction=1; 
	} 
}; 
 
class ray 
{ 
public: 
	int depth; 
	vector ro,rd,at; 
}; 
 
class light 
{ 
public: 
	char name[256]; 
	int type; 
	vector color,pos,target,dir; 
	float hotspot,falloff; 
}; 
 
class facelist 
{ 
public: 
	void *face; 
	facelist *next; 
	facelist() { next=0; } 
	~facelist() { if (next) delete next; } 
}; 
 
class ctlist 
{ 
public: 
	unsigned short nfv,mat1,mat2; 
	char i1,i2; 
	float weight; 
	float dtx[2]; 
	vector d; 
	int vert1,vert2, 
		vert3,vert4, 
		face1,face2, 
		face3,face4, 
		face5,face6; 
 
	int *fv; 
	ctlist *next,*prev; 
 
	ctlist() {  next=0; prev=0; fv=0; nfv=0; }; 
	~ctlist() { if (next) delete next; if (fv) delete fv; }; 
}; 
 
class vtlist 
{ 
public: 
	vector pos; 
	vector normal; 
	float tx[2]; 
	int flag; 
	facelist *faces; 
 
	bool esta_na_borda(); 
	int num_faces(); 
 
	vtlist() { faces=0; }; 
	~vtlist() { if (faces) delete faces; }; 
}; 
 
class ftlist : public tree_elem 
{ 
public: 
	vector normal; 
	ftlist *lf[3]; 
	vtlist *lv[3]; 
	int flag; 
	unsigned short material,group; 
 
	virtual void get_bbox(boundbox *b); 
	virtual void get_center(vector *center); 
	virtual void get_normal(vector *n); 
	virtual int ray_intersect(vector& ro,vector& rd,vector& ip,float& dist); 
	int is_inside(vector& ip); 
	void compute_nuv(int tx,vector& IntPoint,vector& N,float& tx_u, float& tx_v); 
	void compute_dudv(vector& ip,float u,float v,vector &dU, vector &dV); 
}; 
  
class element 
{ 
public: 
	int elem, ncoef, cur_ncoef,  
		nf, nv, nrf, nrv; 
	ctlist *coef, *cur_coef; 
 
	element() 
	{ 
		cur_ncoef=-1; 
		cur_coef=0; 
		coef=0;  
		ncoef=0; 
	} 
}; 
 
class object  
{ 
public: 
	char name[256]; 
 
	vtlist **vt; 
	ftlist **ft; 
	 
	int nv, nf, nrf, nrv, nelem; 
	element *elem; 
 
	int cur_ncoef,ncoef,textcoord; 
 
	double smoothang; 
	vector bbox1,bbox2; 
 
	object *next; 
 
	void Serialize(ChunkFile& ar, bool); 
	void check_links(); 
	void check_edges(); 
	void reset(); 
	void compute_normals(); 
	void build_edge_tree(); 
	void fix_normals(); 
	void fix_node_normal(ftlist *node); 
	int find_face_edge(int f,int i,int& g,int& j); 
	void change_index(int i, int j); 
	void Implode(); 
	void Explode(); 
	void DelDupFace(); 
	void DelDupVert(); 
	void DelInvFace(); 
	void DelFace(ftlist **f); 
	float FindNextEdge(int group,int& f1,int& i1,int &f2,int& i2); 
	void CompactHoles(); 
	void CompressEdge(float weight,int f1,int i1,int f2,int i2); 
	void Compress(); 
	void rebuild_normals(int v1); 
	int AddCoef(int e); 
	int DelCoef(int e); 
	int AddCoef(); 
	int DelCoef(); 
	void ApagaVertNaAresta(); 
	bool EstaNaAresta(float *, float *, float *); 
	void juntaface(ftlist *, int, int); 
	void compute_bbox(); 
	void invert_normal(ftlist *node); 
	void invert_node_normal(ftlist *node); 
	void count_node(ftlist *node,int e); 
	void count_elements(); 
 
	object()  
		{  
		vt=0; ft=0; 
		nv=0; nf=0; 
		nrf=0; nrv=0; 
		elem=0; nelem=0; 
		next=0;  
		smoothang=0.5; 
		textcoord=false; 
		}; 
	~object() { reset(); if (next) delete next; }; 
}; 
 
class scene 
{ 
public: 
	int nmatlib, nmatlib_ant; 
	material *matlib; 
 
	int ncamlib, ncamlib_ant; 
	camera *camlib; 
	 
	int npiclib; 
	picture *piclib; 
	 
	int nobj, nobj_ant; 
	object *obj0; 
 
	int nlights, nlights_ant,headlight,shadows,backface,textinterp,fog; 
	light *lightlib; 
	vector amblight,headlightpos,background; 
 
	int inuse,maxdepth,minfaces, 
		startwinsize,raysonly; 
 
	float bboxdiag; 
	vector bbox1,bbox2,bboxC; 
 
	int nf,nv,ncoef,cur_ncoef,last_mat; 
 
	octree_node *oc; 
	 
	int find_image(char *name); 
	void load_images(); 
	void ComputeBBoxes(void); 
	int import(char *file,CListCtrl *lb); 
	int export(char *file); 
	void reset(); 
	int AddCoef(); 
	int DelCoef(); 
 
	void build_octree(int min,int depth); 
	int should_antialiase(picture *p,int x,int y,int factor); 
	void compute_color(ftlist *ft,vector& ip,vector& n,vector& view,float u,float v,vector& color); 
	void SelectMaterial(material *mat,int texture); 
	void calc_uv(float &, float &, struct mapping *); 
	void shoot_ray(ray *r,vector& color); 
	void trace_ray(camera *cam,picture *p,int x,int y,int ray_depth,vector& color); 
	picture *ray_trace(camera *cam,int& sx,int& sy,int ray_depth,int maxdepth,int minfaces,int antialiase,int antialiase_factor); 
 
	scene()  
		{ 
		oc=0; 
		fog=0; 
		lightlib=0; 
		nlights=0; 
		inuse=0; 
		nobj=0; 
		obj0=0; 
		matlib=0; 
		ncamlib=0; 
		camlib=0; 
		npiclib=0; 
		piclib=0; 
		matlib=new material; 
		nmatlib=1; 
		memset(&matlib[0],0,sizeof(material)); 
		matlib[0].refraction=1; 
		strcpy(matlib[0].name,"Default"); 
		matlib[0].diffuse[0]=matlib[0].diffuse[1]=matlib[0].diffuse[2]=(float)0.8; 
		matlib[0].ambient[0]=matlib[0].ambient[1]=matlib[0].ambient[2]=(float)0.3; 
		matlib[0].specular[0]=matlib[0].specular[1]=matlib[0].specular[2]=(float)1.0; 
		amblight.Vec((float)0.3,(float)0.3,(float)0.3); 
		headlight=1; 
		background.Vec(0,0,0); 
		textinterp=0; 
		backface=1; 
		} 
	 
	~scene() 
		{ 
		reset(); 
		} 
}; 
 
int operator ==(ftlist &f1, ftlist &f2);