IMPORT3DS_PM.CPP
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 4k
Category:

OpenCV

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "impexp3ds.h"
  3. #include "import3ds_pm.h"
  4. import3ds_pm::import3ds_pm(scene *d,CListCtrl *l,char *file)
  5. {
  6. doc=d;
  7. lb=l;
  8. if (doc && lb)
  9. import(file,1);
  10. }
  11. void import3ds_pm::object3d(char *name,int nv,int nf,int ntc,float *local_axis)
  12. {
  13. int indx;
  14. LV_FINDINFO pFindInfo;
  15. pFindInfo.flags=LVFI_STRING;
  16. pFindInfo.psz=name;
  17. indx=lb->FindItem( &pFindInfo );
  18. if (indx!=-1)
  19. if (lb->GetItemState(indx,LVIS_SELECTED))
  20. {
  21. cobj=new object;
  22. cobj->smoothang=0.5;
  23. doc->nobj++;
  24. if (doc->obj0)
  25. cobj->next=doc->obj0;
  26. doc->obj0=cobj;
  27. strcpy(cobj->name,name);
  28. cobj->textcoord=ntc>0;
  29. if (nv)
  30. cobj->vt=new vtlist *[nv];
  31. if (nf)
  32. cobj->ft=new ftlist *[nf];
  33. cobj->nf=cobj->nrf=nf;
  34. cobj->nv=cobj->nrv=nv;
  35. v=f=t=0;
  36. }
  37. else cobj=0;
  38. }
  39. void import3ds_pm::vertex3(float *vec)
  40. {
  41. if (!cobj) return;
  42. cobj->vt[v]=new vtlist;
  43. cobj->vt[v]->pos.Vec(vec[0],vec[1],vec[2]);
  44. v++;
  45. }
  46. void import3ds_pm::text_coord(float *uv)
  47. {
  48. if (!cobj) return;
  49. cobj->vt[t]->tx[0]=uv[0];
  50. cobj->vt[t]->tx[1]=uv[1];
  51. t++;
  52. }
  53. void import3ds_pm::face3(unsigned short *fa)
  54. {
  55. if (!cobj) return;
  56. cobj->ft[f]=new ftlist;
  57. for(int i=0;i<3;i++)
  58. {
  59. if (fa[i]>=cobj->nv) 
  60. fa[i]=0;
  61. cobj->ft[f]->lv[i]=cobj->vt[fa[i]];
  62. facelist *tmp=new facelist;
  63. tmp->face=cobj->ft[f];
  64. tmp->next=cobj->vt[fa[i]]->faces;
  65. cobj->vt[fa[i]]->faces=tmp;
  66. }
  67. cobj->ft[f]->material=0;
  68. f++;
  69. }
  70. void import3ds_pm::camera(char *name, float *pos, float *target, float bank, float lens)
  71. {
  72. if (doc->ncamlib)
  73. {
  74. class camera *temp=new class camera[doc->ncamlib+1];
  75. memcpy(temp,doc->camlib,sizeof(class camera)*doc->ncamlib);
  76. delete doc->camlib;
  77. doc->camlib=temp;
  78. }
  79. else doc->camlib=new class camera;
  80. strcpy(doc->camlib[doc->ncamlib].name,name);
  81. doc->camlib[doc->ncamlib].Vp.Vec(pos[0],pos[1],pos[2]);
  82. doc->camlib[doc->ncamlib].Lp.Vec(target[0],target[1],target[2]);
  83. doc->camlib[doc->ncamlib].theta=lens;
  84. doc->ncamlib++;
  85. }
  86. void import3ds_pm::face_material(material *mat,int nf,unsigned short *faces)
  87. {
  88. if (!cobj) return;
  89. int m,n;
  90. for( m=0;m<doc->nmatlib;m++ )
  91. if (!strcmp(mat->name,doc->matlib[m].name))
  92. break;
  93. if (m==doc->nmatlib)
  94. {
  95. material *temp=new material[doc->nmatlib+1];
  96. memcpy(temp,doc->matlib,sizeof(material)*doc->nmatlib);
  97. delete doc->matlib;
  98. doc->matlib=temp;
  99. memcpy(&doc->matlib[doc->nmatlib],mat,sizeof(material));
  100. doc->matlib[doc->nmatlib].map_bump.rotation*=-1;
  101. doc->matlib[doc->nmatlib].map_bump.v_offset*=-1;
  102. doc->matlib[doc->nmatlib].map_opacity.rotation*=-1;
  103. doc->matlib[doc->nmatlib].map_opacity.v_offset*=-1;
  104. doc->matlib[doc->nmatlib].map_selfillum.rotation*=-1;
  105. doc->matlib[doc->nmatlib].map_selfillum.v_offset*=-1;
  106. doc->matlib[doc->nmatlib].map_texture1.rotation*=-1;
  107. doc->matlib[doc->nmatlib].map_texture1.v_offset*=-1;
  108. doc->nmatlib++;
  109. }
  110. for( n=0;n<nf;n++ )
  111. cobj->ft[faces[n]]->material=m;
  112. }
  113. void import3ds_pm::pointlight(char *name, float *pos,float *color)
  114. {
  115. if (doc->nlights)
  116. {
  117. light *tmp=new light[doc->nlights+1];
  118. memcpy(tmp,doc->lightlib,sizeof(light)*doc->nlights);
  119. delete doc->lightlib;
  120. doc->lightlib=tmp;
  121. }
  122. else doc->lightlib=new light;
  123. strcpy(doc->lightlib[doc->nlights].name,name);
  124. doc->lightlib[doc->nlights].type=0;
  125. doc->lightlib[doc->nlights].pos.Vec(pos[0],pos[1],pos[2]);
  126. doc->lightlib[doc->nlights].color.Vec(color[0],color[1],color[2]);
  127. doc->nlights++;
  128. }
  129. void import3ds_pm::spotlight(char *name, float *pos,float *target,float *color,float hotspot,float falloff)
  130. {
  131. if (doc->nlights)
  132. {
  133. light *tmp=new light[doc->nlights+1];
  134. memcpy(tmp,doc->lightlib,sizeof(light)*doc->nlights);
  135. delete doc->lightlib;
  136. doc->lightlib=tmp;
  137. }
  138. else doc->lightlib=new light;
  139. strcpy(doc->lightlib[doc->nlights].name,name);
  140. doc->lightlib[doc->nlights].type=1;
  141. doc->lightlib[doc->nlights].pos.Vec(pos[0],pos[1],pos[2]);
  142. doc->lightlib[doc->nlights].color.Vec(color[0],color[1],color[2]);
  143. doc->lightlib[doc->nlights].target.Vec(target[0],target[1],target[2]);
  144. doc->lightlib[doc->nlights].hotspot=(float)CosD(hotspot/2.0);
  145. doc->lightlib[doc->nlights].falloff=(float)CosD(falloff/2.0);
  146. doc->lightlib[doc->nlights].dir=doc->lightlib[doc->nlights].target-doc->lightlib[doc->nlights].pos;
  147. doc->lightlib[doc->nlights].dir.Normalize();
  148. doc->nlights++;
  149. }