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


#include "stdafx.h" 
 
#include  
#include  
#include  
#include "impexp3ds.h" 
 
int import3ds::read_chunk() 
{ 
	int i=0; 
 
	i+=fread(&chunkid,1,2,fp); 
	i+=fread(&chunklen,1,4,fp); 
	if (i!=6) 
		return 0; 
	chunklen-=6; 
	filepos+=6; 
	 
	return 1; 
} 
 
void import3ds::jump_chunk() 
{ 
	fseek(fp,chunklen,SEEK_CUR); 
	filepos+=chunklen; 
} 
 
void import3ds::load_chunk() 
{ 
	if (chunk) 
		delete chunk; 
	chunk=new char[chunklen]; 
	filepos+=chunklen; 
	fread(chunk,chunklen,1,fp); 
} 
 
void import3ds::load_string(char *str) 
{ 
	int a=0; 
	while( str[a++]=fgetc(fp) ) 
		; 
	chunklen-=a; 
	filepos+=a; 
} 
 
void import3ds::load_object() 
{ 
	char objname[256]; 
 
	load_string(objname); 
	read_chunk(); 
	switch(chunkid) 
	{ 
		case 0x4600: 
		{ 
			load_light(objname); 
			break; 
		} 
		case 0x4700: 
		{ 
			load_chunk(); 
			camera(objname, (float *)chunk,(float *)&chunk[12], *((float *)&chunk[24]), *((float *)&chunk[28])); 
			break; 
		} 
		case 0x4100: 
		{ 
			if (object_name(objname)) 
				load_mesh(objname); 
			else jump_chunk(); 
			break; 
		} 
		default: 
			jump_chunk(); 
	} 
} 
 
void import3ds::load_mesh(char *objname) 
{ 
	int nvert=0,nfaces=0,ntextcoord=0,nfacematerial=0; 
	char *vert=0,*faces=0,*textcoord=0,*facematerial=0; 
	float local_axis[12]={ 1,0,0, 0,1,0, 0,0,1, 0,0,0 }; 
	int a,fpos=filepos+chunklen; 
	while( fileposu_scale=1.0; 
	m->v_scale=1.0; 
	m->u_offset=0.0; 
	m->v_offset=0.0; 
	m->rotation=0.0; 
 
	while( fileposamount=*((short int *)chunk); 
			break; 
		case 0xA300: 
			load_string(m->filename); 
			break; 
		case 0xA351: 
			load_chunk(); 
			m->options=*((short int *)chunk); 
			break; 
		case 0xA353: 
			load_chunk(); 
			m->filtering=*((float *)chunk); 
			break; 
		case 0xA354: 
			load_chunk(); 
			m->u_scale=*((float *)chunk); 
			break; 
		case 0xA356: 
			load_chunk(); 
			m->v_scale=*((float *)chunk); 
			break; 
		case 0xA358: 
			load_chunk(); 
			m->u_offset=*((float *)chunk); 
			break; 
		case 0xA35A: 
			load_chunk(); 
			m->v_offset=*((float *)chunk); 
			break; 
		case 0xA35C: 
			load_chunk(); 
			m->rotation=*((float *)chunk); 
			break; 
		default: 
			jump_chunk(); 
		} 
	} 
} 
 
void import3ds::load_material() 
{ 
	int fpos=filepos+chunklen; 
	while( filepos