www.pudn.com > 3DEDITOR.rar > EXPORT3DS.CPP


#include "stdafx.h" 
 
#include  
#include  
#include  
#include "impexp3ds.h" 
 
export3ds::export3ds(char *filename, float scale, material *matlib, int nmatlib) 
{ 
	m_fp=fopen(filename,"wb"); 
	if(m_fp==NULL) 
		return; 
 
	M3DMAGIC_bpatch=WriteChunk(M3DMAGIC, 0); 
	M3DMAGIC_size=SizeofChunk; 
 
	WriteChunk(M3D_VERSION, SizeofChunk+sizeof(long)); 
	WriteLong(4); 
	M3DMAGIC_size+=SizeofChunk+sizeof(long); 
 
	WriteChunk(MASTER_SCALE, SizeofChunk+sizeof(float)); 
	WriteFloat(scale); 
	M3DMAGIC_size+=SizeofChunk+sizeof(float); 
 
	WriteMData_Ini(matlib, nmatlib); 
} 
 
export3ds::~export3ds() 
{ 
	if(m_fp!=NULL) 
		close(NULL, 0, NULL, 0); 
} 
 
void export3ds::close(camera *camlib, int ncamlib, light *lightlib, int nlights) 
{ 
	M3DMAGIC_size+=WriteMData_Fim(camlib, ncamlib, lightlib, nlights); 
	WritePatch(M3DMAGIC_bpatch, M3DMAGIC_size); 
	fclose(m_fp); 
	m_fp=NULL; 
} 
 
long export3ds::WriteChunk(unsigned short id, long size) 
{ 
	long retval; 
 
	WriteUShort(id); 
	retval=ftell(m_fp); 
	WriteULong((unsigned long) size); 
 
	return retval; 
} 
 
long export3ds::WritePatch(long location, long data) 
{ 
	long current=ftell(m_fp); 
	fseek(m_fp, location, SEEK_SET); 
	WriteLong(data); 
	fseek(m_fp, current, SEEK_SET); 
 
	return current; 
} 
 
void export3ds::WriteMData_Ini(material *matlib, int nmatlib) 
{ 
	MDATA_bpatch=WriteChunk(MDATA, 0); 
	MDATA_size=SizeofChunk; 
	MDATA_size+=WriteMeshVersion(2L); 
	MDATA_size+=WriteMatEntries(matlib, nmatlib); 
} 
 
long export3ds::WriteMData_Fim(camera *camlib, int ncamlib, light *lightlib, int nlights) 
{ 
	if(nlights) 
		MDATA_size+=WriteLights(lightlib, nlights); 
		 
	if(ncamlib) 
		MDATA_size+=WriteCameras(camlib, ncamlib); 
 
	WritePatch(MDATA_bpatch, MDATA_size); 
 
	return MDATA_size; 
} 
 
long export3ds::WriteLights(light *lightlib, int nlights) 
{ 
	long size=0, bpatch, itemSize; 
	int i; 
	 
	for(i=0;ifilename[0]==0) 
		return 0; 
 
	long size=0, bpatch; 
 
	bpatch=WriteChunk(id , 0); 
	size=SizeofChunk; 
 
	WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short)); 
	WriteShort(m->amount); 
	size+=SizeofChunk+sizeof(short); 
 
	size+=WriteChunkString(MAPP_FILENAME, m->filename); 
 
	WriteChunk(MAPP_OPTIONS, SizeofChunk+sizeof(short)); 
	WriteShort(m->options); 
	size+=SizeofChunk+sizeof(short); 
 
	WriteChunk(MAPP_FILTERING, SizeofChunk+sizeof(float)); 
	WriteFloat(m->filtering); 
	size+=SizeofChunk+sizeof(float); 
 
	WriteChunk(MAPP_U_SCALE, SizeofChunk+sizeof(float)); 
	WriteFloat(m->u_scale); 
	size+=SizeofChunk+sizeof(float); 
 
	WriteChunk(MAPP_V_SCALE, SizeofChunk+sizeof(float)); 
	WriteFloat(m->v_scale); 
	size+=SizeofChunk+sizeof(float); 
 
	WriteChunk(MAPP_U_OFFSET, SizeofChunk+sizeof(float)); 
	WriteFloat(m->u_offset); 
	size+=SizeofChunk+sizeof(float); 
 
	WriteChunk(MAPP_V_OFFSET, SizeofChunk+sizeof(float)); 
	WriteFloat(-m->v_offset); 
	size+=SizeofChunk+sizeof(float); 
 
	WriteChunk(MAPP_ROTATION, SizeofChunk+sizeof(float)); 
	WriteFloat(-m->rotation); 
	size+=SizeofChunk+sizeof(float); 
 
	WritePatch(bpatch, size); 
 
	return size; 
} 
 
long export3ds::WriteMatEntries(material *matlib, int nmatlib) 
{ 
	const long SizeofColor=SizeofChunk+3; 
 
	long size=0, itemSize, bpatch; 
 
	for(int i=0;i