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


#include "stdafx.h" 
#include "impexp3ds.h" 
#include "import3ds_pm.h" 
 
 
import3ds_pm::import3ds_pm(scene *d,CListCtrl *l,char *file) 
{ 
	doc=d; 
	lb=l; 
	if (doc && lb) 
		import(file,1); 
} 
 
void import3ds_pm::object3d(char *name,int nv,int nf,int ntc,float *local_axis) 
{ 
	int indx; 
 
	LV_FINDINFO pFindInfo; 
	pFindInfo.flags=LVFI_STRING; 
	pFindInfo.psz=name; 
	indx=lb->FindItem( &pFindInfo ); 
 
	if (indx!=-1) 
	if (lb->GetItemState(indx,LVIS_SELECTED)) 
	{ 
	cobj=new object; 
	cobj->smoothang=0.5; 
	doc->nobj++; 
 
	if (doc->obj0) 
		cobj->next=doc->obj0; 
	doc->obj0=cobj; 
	 
	strcpy(cobj->name,name); 
 
	cobj->textcoord=ntc>0; 
 
	if (nv) 
		cobj->vt=new vtlist *[nv]; 
 
	if (nf) 
		cobj->ft=new ftlist *[nf]; 
 
	cobj->nf=cobj->nrf=nf; 
	cobj->nv=cobj->nrv=nv; 
	v=f=t=0; 
	} 
	else cobj=0; 
} 
 
void import3ds_pm::vertex3(float *vec) 
{ 
	if (!cobj) return; 
	cobj->vt[v]=new vtlist; 
	cobj->vt[v]->pos.Vec(vec[0],vec[1],vec[2]); 
	v++; 
} 
 
void import3ds_pm::text_coord(float *uv) 
{ 
	if (!cobj) return; 
 
	cobj->vt[t]->tx[0]=uv[0]; 
	cobj->vt[t]->tx[1]=uv[1]; 
 
	t++; 
} 
 
void import3ds_pm::face3(unsigned short *fa) 
{ 
	if (!cobj) return; 
	cobj->ft[f]=new ftlist; 
 
	for(int i=0;i<3;i++) 
	{ 
		if (fa[i]>=cobj->nv)  
			fa[i]=0; 
		cobj->ft[f]->lv[i]=cobj->vt[fa[i]]; 
		facelist *tmp=new facelist; 
		tmp->face=cobj->ft[f]; 
		tmp->next=cobj->vt[fa[i]]->faces; 
		cobj->vt[fa[i]]->faces=tmp; 
	} 
	cobj->ft[f]->material=0; 
	f++; 
} 
 
void import3ds_pm::camera(char *name, float *pos, float *target, float bank, float lens) 
{ 
	if (doc->ncamlib) 
	{ 
		class camera *temp=new class camera[doc->ncamlib+1]; 
		memcpy(temp,doc->camlib,sizeof(class camera)*doc->ncamlib); 
		delete doc->camlib; 
		doc->camlib=temp; 
	} 
	else doc->camlib=new class camera; 
	strcpy(doc->camlib[doc->ncamlib].name,name); 
	doc->camlib[doc->ncamlib].Vp.Vec(pos[0],pos[1],pos[2]); 
	doc->camlib[doc->ncamlib].Lp.Vec(target[0],target[1],target[2]); 
	doc->camlib[doc->ncamlib].theta=lens; 
	doc->ncamlib++; 
} 
 
void import3ds_pm::face_material(material *mat,int nf,unsigned short *faces) 
{ 
	if (!cobj) return; 
	int m,n; 
 
	for( m=0;mnmatlib;m++ ) 
		if (!strcmp(mat->name,doc->matlib[m].name)) 
			break; 
	if (m==doc->nmatlib) 
	{ 
		material *temp=new material[doc->nmatlib+1]; 
		memcpy(temp,doc->matlib,sizeof(material)*doc->nmatlib); 
		delete doc->matlib; 
		doc->matlib=temp; 
		memcpy(&doc->matlib[doc->nmatlib],mat,sizeof(material)); 
		 
		doc->matlib[doc->nmatlib].map_bump.rotation*=-1; 
		doc->matlib[doc->nmatlib].map_bump.v_offset*=-1; 
		doc->matlib[doc->nmatlib].map_opacity.rotation*=-1; 
		doc->matlib[doc->nmatlib].map_opacity.v_offset*=-1; 
		doc->matlib[doc->nmatlib].map_selfillum.rotation*=-1; 
		doc->matlib[doc->nmatlib].map_selfillum.v_offset*=-1; 
		doc->matlib[doc->nmatlib].map_texture1.rotation*=-1; 
		doc->matlib[doc->nmatlib].map_texture1.v_offset*=-1; 
 
		doc->nmatlib++; 
	} 
 
	for( n=0;nft[faces[n]]->material=m; 
} 
 
void import3ds_pm::pointlight(char *name, float *pos,float *color) 
{ 
	if (doc->nlights) 
	{ 
		light *tmp=new light[doc->nlights+1]; 
		memcpy(tmp,doc->lightlib,sizeof(light)*doc->nlights); 
		delete doc->lightlib; 
		doc->lightlib=tmp; 
	} 
	else doc->lightlib=new light; 
	 
	strcpy(doc->lightlib[doc->nlights].name,name); 
	doc->lightlib[doc->nlights].type=0; 
	doc->lightlib[doc->nlights].pos.Vec(pos[0],pos[1],pos[2]); 
	doc->lightlib[doc->nlights].color.Vec(color[0],color[1],color[2]); 
	doc->nlights++; 
} 
 
void import3ds_pm::spotlight(char *name, float *pos,float *target,float *color,float hotspot,float falloff) 
{ 
	if (doc->nlights) 
	{ 
		light *tmp=new light[doc->nlights+1]; 
		memcpy(tmp,doc->lightlib,sizeof(light)*doc->nlights); 
		delete doc->lightlib; 
		doc->lightlib=tmp; 
	} 
	else doc->lightlib=new light; 
 
	strcpy(doc->lightlib[doc->nlights].name,name); 
	doc->lightlib[doc->nlights].type=1; 
	doc->lightlib[doc->nlights].pos.Vec(pos[0],pos[1],pos[2]); 
	doc->lightlib[doc->nlights].color.Vec(color[0],color[1],color[2]); 
	doc->lightlib[doc->nlights].target.Vec(target[0],target[1],target[2]); 
	doc->lightlib[doc->nlights].hotspot=(float)CosD(hotspot/2.0); 
	doc->lightlib[doc->nlights].falloff=(float)CosD(falloff/2.0); 
	doc->lightlib[doc->nlights].dir=doc->lightlib[doc->nlights].target-doc->lightlib[doc->nlights].pos; 
	doc->lightlib[doc->nlights].dir.Normalize(); 
	doc->nlights++; 
}