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++;
}