📄 3dsexport.cpp
字号:
#include "../Fly3D.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();
}
void export3ds::close()
{
if(m_fp==NULL)
return;
M3DMAGIC_size+=WriteMData_Fim();
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()
{
WritePatch(MDATA_bpatch, MDATA_size);
return MDATA_size;
}
long export3ds::WriteMeshVersion(long version)
{
WriteChunk(MESH_VERSION, SizeofChunk+sizeof(long));
WriteLong(version);
return SizeofChunk+sizeof(long);
}
long export3ds::WriteChunkString(unsigned short id, char *buffer)
{
long size;
size=SizeofChunk+strlen(buffer)+1;
WriteChunk(id, size);
WriteString(buffer);
return size;
}
void export3ds::WriteString(char *buffer)
{
unsigned int j;
for(j=0;j<strlen(buffer);j++)
WriteByte(buffer[j]);
WriteByte('\0');
}
long export3ds::WriteChunkMapping(unsigned short id, struct mapping *m)
{
if(m->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<nmatlib;i++)
{
itemSize=0;
bpatch=WriteChunk(MAT_ENTRY, 0);
itemSize+=SizeofChunk;
itemSize+=WriteChunkString(MAT_NAME, matlib[i].name);
WriteChunk(MAT_AMBIENT, SizeofChunk+SizeofColor);
WriteColor(matlib[i].ambient);
itemSize+=SizeofChunk+SizeofColor;
WriteChunk(MAT_DIFFUSE, SizeofChunk+SizeofColor);
WriteColor(matlib[i].diffuse);
itemSize+=SizeofChunk+SizeofColor;
WriteChunk(MAT_SPECULAR, SizeofChunk+SizeofColor);
WriteColor(matlib[i].specular);
itemSize+=SizeofChunk+SizeofColor;
WriteChunk(MAT_SHININESS, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].shininess*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_SHININESS_STRENGTH, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].shininess_strength*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_TRANSPARENCY, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].transparency*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_TRANSPARENCY_FALLOFF, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].transparency_falloff*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_REFLECT_BLUR, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].reflect_blur*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_SELF_ILLUM, SizeofChunk*2+sizeof(short));
WriteChunk(INT_PERCENTAGE, SizeofChunk+sizeof(short));
WriteShort((short)(matlib[i].self_illum*100.0));
itemSize+=SizeofChunk*2+sizeof(short);
WriteChunk(MAT_SHADING, SizeofChunk+sizeof(short));
WriteShort(matlib[i].material_type);
itemSize+=SizeofChunk+sizeof(short);
itemSize+=WriteChunkMapping(MAT_MAP_TEXTURE1, &matlib[i].map_texture1);
itemSize+=WriteChunkMapping(MAT_MAP_SPECULAR, &matlib[i].map_specular);
itemSize+=WriteChunkMapping(MAT_MAP_OPACITY, &matlib[i].map_opacity);
itemSize+=WriteChunkMapping(MAT_MAP_REFLECTION, &matlib[i].map_reflection);
itemSize+=WriteChunkMapping(MAT_MAP_BUMP, &matlib[i].map_bump);
itemSize+=WriteChunkMapping(MAT_MAP_TEXTURE2, &matlib[i].map_texture2);
itemSize+=WriteChunkMapping(MAT_MAP_SHININESS, &matlib[i].map_shininess);
itemSize+=WriteChunkMapping(MAT_MAP_SELFILLUM, &matlib[i].map_selfillum);
WritePatch(bpatch, itemSize);
size+=itemSize;
}
return size;
}
long export3ds::WriteColor(float c[3])
{
WriteChunk(COLOR_24, SizeofChunk+sizeof(unsigned char)*3);
WriteUByte((unsigned char) (c[0]*255.0+0.5));
WriteUByte((unsigned char) (c[1]*255.0+0.5));
WriteUByte((unsigned char) (c[2]*255.0+0.5));
return SizeofChunk+sizeof(unsigned char)*3;
}
void export3ds::WriteNamedObject(
char *name, float *vert, float *textcoord,
unsigned short nv, unsigned short *faces,
unsigned short nf, unsigned short *mat,
int lmat, material *matlib,float *local_axis)
{
long bpatch, itemSize;
char nameI[64];
if(m_fp==NULL)
return;
strcpy(nameI, name);
bpatch=WriteChunk(NAMED_OBJECT, 0);
WriteString(nameI);
itemSize=SizeofChunk+strlen(nameI)+1;
itemSize+=WriteTriObject(vert, textcoord, nv, faces, nf, mat, lmat, matlib, local_axis);
WritePatch(bpatch, itemSize);
MDATA_size+=itemSize;
}
long export3ds::WriteTextCoord(float *textcoord, unsigned short nv)
{
long size=0;
if(textcoord)
{
size=SizeofChunk+sizeof(unsigned short)+
(nv*sizeof(float)*2);
WriteChunk(TEXT_COORD, size);
WriteUShort(nv);
for(unsigned short i=0;i<nv;i++)
{
WriteFloat(textcoord[2*i]);
WriteFloat(-textcoord[2*i+1]);
}
}
return size;
}
long export3ds::WriteTriObject(float *vert, float *textcoord, unsigned short nv, unsigned short *faces, unsigned short nf, unsigned short *mat, int lmat, material *matlib,float *local_axis)
{
long size=0;
long tripatch;
tripatch=WriteChunk(N_TRI_OBJECT, 0);
size+=SizeofChunk;
size+=WritePointArray(vert, nv);
size+=WriteTextCoord(textcoord, nv);
size+=WriteFaceArray(faces, nf, mat, lmat, matlib);
long itemSize=SizeofChunk+sizeof(float)*12;
WriteChunk(LOCAL_AXIS, itemSize);
for(int i=0;i<12;i++)
if (local_axis)
WriteFloat(local_axis[i]);
else if (i==0 || i==4 || i==8)
WriteFloat(1.0f);
else WriteFloat(0.0f);
size+=itemSize;
WritePatch(tripatch, size);
return size;
}
long export3ds::WritePointArray(float *vert, unsigned short nv)
{
long size=SizeofChunk+sizeof(unsigned short)+
sizeof(float)*3*nv;
WriteChunk(POINT_ARRAY, size);
WriteUShort(nv);
for(unsigned short i=0; i<nv;i++)
{
WriteFloat(vert[3*i]);
WriteFloat(vert[3*i+1]);
WriteFloat(vert[3*i+2]);
}
return size;
}
long export3ds::WriteMaterial(unsigned short *mat, int lmat, material *matlib)
{
long size=0, itemSize;
int i=0, j;
while(i<lmat)
{
itemSize=SizeofChunk+
strlen(matlib[mat[i]].name)+1+
sizeof(unsigned short)+
(sizeof(short)*mat[i+1]);
size+=itemSize;
WriteChunk(MSH_MAT_GROUP, itemSize);
WriteString(matlib[mat[i]].name);
WriteUShort((unsigned short)mat[i+1]);
for(j=0;j<mat[i+1];j++)
WriteUShort(mat[i+1+j+1]);
i+=2+mat[i+1];
}
return size;
}
long export3ds::WriteFaceArray(unsigned short *faces, unsigned short nf, unsigned short *mat, int lmat, material *matlib)
{
long size=0, bpatch;
unsigned short i;
bpatch=WriteChunk(FACE_ARRAY, 0);
WriteUShort((unsigned short)nf);
size=SizeofChunk+sizeof(unsigned short)+
(4*sizeof(unsigned short)*nf);
for(i=0;i<nf;i++)
{
WriteUShort(faces[i*3]);
WriteUShort(faces[i*3+1]);
WriteUShort(faces[i*3+2]);
WriteUShort((unsigned short)7);
}
long itemSize=SizeofChunk+sizeof(unsigned long)*nf;
WriteChunk(SMOOTH_GROUP, itemSize);
for(i=0;i<nf;i++)
WriteULong(1);
size+=itemSize;
size+=WriteMaterial(mat, lmat, matlib);
WritePatch(bpatch, size);
return size;
}
void export3ds::WriteUShort(unsigned short d)
{
fwrite(&d, sizeof(unsigned short), 1, m_fp);
}
void export3ds::WriteULong(unsigned long d)
{
fwrite(&d, sizeof(unsigned long), 1, m_fp);
}
void export3ds::WriteLong(long d)
{
fwrite(&d, sizeof(long), 1, m_fp);
}
void export3ds::WriteByte(char d)
{
fwrite(&d, sizeof(char), 1, m_fp);
}
void export3ds::WriteFloat(float d)
{
fwrite(&d, sizeof(float), 1, m_fp);
}
void export3ds::WriteShort(short d)
{
fwrite(&d, sizeof(short), 1, m_fp);
}
void export3ds::WriteUByte(unsigned char d)
{
fwrite(&d, sizeof(unsigned char), 1, m_fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -