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;i filename[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