home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / plugin / volfog / volfog.cpp next >
Encoding:
C/C++ Source or Header  |  2000-03-21  |  7.5 KB  |  377 lines

  1. #include "../../lib/Fly3D.h"
  2. #include "volfog.h"
  3.  
  4. fogsphere_desc cd_fogsphere;
  5. fogbox_desc cd_fogbox;
  6.  
  7. BOOL APIENTRY DllMain(HINSTANCE hModule, 
  8.                       DWORD  ul_reason_for_call, 
  9.                       LPVOID lpReserved)
  10. {    
  11.     switch( ul_reason_for_call ) 
  12.     {
  13.     case DLL_PROCESS_ATTACH:
  14.     case DLL_THREAD_ATTACH:
  15.     case DLL_THREAD_DETACH:
  16.     case DLL_PROCESS_DETACH:
  17.         break;
  18.     }
  19.     return TRUE;
  20. }
  21.  
  22. __declspec( dllexport )
  23. int num_classes()
  24. {
  25.     return 2;
  26. }
  27.  
  28. __declspec( dllexport )
  29. class_desc *get_class_desc(int i)
  30. {
  31.     switch(i)
  32.     {
  33.     case 0:
  34.         return &cd_fogsphere;
  35.     case 1:
  36.         return &cd_fogbox;
  37.     default: return 0;
  38.     }
  39. }
  40.  
  41. __declspec( dllexport )
  42. int fly_message(int msg,int param,void *data)
  43. {
  44.     return 1;
  45. }
  46.  
  47. void apply_fog_sphere(void *data,bsp_object *e)
  48. {
  49.     fogsphere *fs=(fogsphere *)data;
  50.     if (e->type==TYPE_STATIC_MESH)
  51.     {
  52.         static_mesh *so=(static_mesh *)e;
  53.         if (so->objmesh->lastdraw<flyengine->cur_frame_base)
  54.             return;
  55.         int i;
  56.         for( i=0;i<so->objmesh->nf;i++ )
  57.             if(so->objmesh->faces[i]->lm!=-1)
  58.             {
  59.             light_map *fm=flyengine->fm[so->objmesh->faces[i]->lm];
  60.             if (fm->lastupdate!=flyengine->cur_step)
  61.                 {
  62.                 fs->fog_map(fm);
  63.                 fm->lastupdate=flyengine->cur_step;
  64.                 }
  65.             }
  66.     }
  67. }
  68.  
  69. void fogsphere::fog_map(light_map *fm)
  70. {
  71.     vector point;
  72.     int i,j;
  73.     unsigned char *uc,factor;
  74.     float fi=1.0f/fm->sizex,fj=1.0f/fm->sizey,fy=fj*0.5f;
  75.     vector v1=fm->d0+fm->d1*(fi*0.5f),v2=fm->d1*fi;
  76.     
  77.     for( j=0;j<fm->sizey;j++,fy+=fj )
  78.     {
  79.     uc=&fm->bmp[j*fm->bytesx];
  80.     point.x = v1.x + fm->d2.x*fy;
  81.     point.y = v1.y + fm->d2.y*fy;
  82.     point.z = v1.z + fm->d2.z*fy;
  83.     for( i=0;i<fm->sizex;i++,point+=v2 )
  84.         {
  85.         if (fogmode==0)
  86.             if (fog_intersect(point,factor))
  87.                 {
  88.                 *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  89.                 *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  90.                 *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  91.                 *(uc++)=factor;
  92.                 }
  93.             else uc+=4;
  94.         else if (fogmode==1)
  95.             {
  96.             vector d=point-pos;
  97.             if (d.length()<fogradius)
  98.                 {
  99.                 *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  100.                 *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  101.                 *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  102.                 *(uc++)=127;
  103.                 }
  104.             else uc+=4;
  105.             }
  106.         else 
  107.             {
  108.             *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  109.             *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  110.             *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  111.             *(uc++)=127;
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. int fogsphere::fog_intersect(vector& point,unsigned char& factor)
  118. {
  119.     float a,b,c,d,z,x1,x2;
  120.     
  121.     vector ro=flyengine->cam->pos-pos;
  122.     vector rd=point-flyengine->cam->pos;
  123.     
  124.     d=rd.length();
  125.     rd/=d;
  126.  
  127.     a=rd.x*rd.x + rd.y*rd.y + rd.z*rd.z;
  128.     b=2.0f*(ro.x*rd.x + ro.y*rd.y + ro.z*rd.z);
  129.     c=ro.x*ro.x + ro.y*ro.y + ro.z*ro.z - fogradius*fogradius;
  130.  
  131.     a*=2.0f;
  132.     z=b*b-2.0f*a*c;
  133.     if (z<=0.0f)
  134.        return 0;
  135.     z=(float)sqrt(z);
  136.     x1=(-b+z)/a;
  137.     x2=(-b-z)/a;
  138.  
  139.     if (x1>d) x1=d;
  140.     else if (x1<0.0f) x1=0.0f;
  141.     if (x2>d) x2=d;
  142.     else if (x2<0.0f) x2=0.0f;
  143.  
  144.     z=(float)fabs(x2-x1)*254.0f/fogdepth;
  145.     if (z>255.0f) 
  146.         factor=255;
  147.     else factor=(unsigned char)z;
  148.  
  149.     return 1;
  150. }
  151.  
  152. int fogsphere::step(int dt)
  153. {
  154.     if (directx->mpmode!=FLYMP_SERVER && flyengine->cam)
  155.         flyengine->apply_bsp(flyengine->bsp,pos,fogrange,this,apply_fog_sphere);
  156.     return 0;
  157. }
  158.  
  159. void apply_fog_box(void *data,bsp_object *e)
  160. {
  161.     fogbox *fb=(fogbox *)data;
  162.     if (e->type==TYPE_STATIC_MESH)
  163.     {
  164.         static_mesh *so=(static_mesh *)e;
  165.         if (so->objmesh->lastdraw<flyengine->cur_frame_base)
  166.             return;
  167.         int i;
  168.         for( i=0;i<so->objmesh->nf;i++ )
  169.             if(so->objmesh->faces[i]->lm!=-1)
  170.             {
  171.             light_map *fm=flyengine->fm[so->objmesh->faces[i]->lm];
  172.             if (fm->lastupdate!=flyengine->cur_step)
  173.                 {
  174.                 fb->fog_map(fm);
  175.                 fm->lastupdate=flyengine->cur_step;
  176.                 }
  177.             }
  178.     }
  179. }
  180.  
  181. void fogbox::fog_map(light_map *fm)
  182. {
  183.     vector point;
  184.     int i,j;
  185.     unsigned char *uc,factor;
  186.     float fi=1.0f/fm->sizex,fj=1.0f/fm->sizey,fy=fj*0.5f;
  187.     vector v1=fm->d0+fm->d1*(fi*0.5f),v2=fm->d1*fi;
  188.     
  189.     for( j=0;j<fm->sizey;j++,fy+=fj )
  190.     {
  191.     uc=&fm->bmp[j*fm->bytesx];
  192.     point.x = v1.x + fm->d2.x*fy;
  193.     point.y = v1.y + fm->d2.y*fy;
  194.     point.z = v1.z + fm->d2.z*fy;
  195.     for( i=0;i<fm->sizex;i++,point+=v2 )
  196.         {
  197.         if (fogmode==0)
  198.             if (fog_intersect(point,factor))
  199.                 {
  200.                 *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  201.                 *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  202.                 *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  203.                 *(uc++)=factor;
  204.                 }
  205.             else uc+=4;
  206.         else if (fogmode==1)
  207.             {
  208.             vector d=point-pos;
  209.             if (fabs(d.x)<fogsizex &&
  210.                 fabs(d.y)<fogsizey &&
  211.                 fabs(d.z)<fogsizez )
  212.                 {
  213.                 *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  214.                 *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  215.                 *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  216.                 *(uc++)=127;
  217.                 }
  218.             else uc+=4;
  219.             }
  220.         else 
  221.             {
  222.             *(uc++)=(unsigned char)(fogcolor.x*255.0f);
  223.             *(uc++)=(unsigned char)(fogcolor.y*255.0f);
  224.             *(uc++)=(unsigned char)(fogcolor.z*255.0f);
  225.             *(uc++)=127;
  226.             }
  227.         }
  228.     }
  229. }
  230.  
  231. int fogbox::fog_intersect(vector& point,unsigned char& factor)
  232. {
  233.     vector rd=point-flyengine->cam->pos;
  234.     float d=rd.length();
  235.     rd/=d;
  236.     float x1,x2;
  237.  
  238.     if (bb.ray_intersect(flyengine->cam->pos,rd,x1,x2)==0)
  239.         return 0;
  240.  
  241.     if (x1>d) x1=d;
  242.     else if (x1<0.0f) x1=0.0f;
  243.     if (x2>d) x2=d;
  244.     else if (x2<0.0f) x2=0.0f;
  245.  
  246.     d=(float)fabs(x2-x1)*255.0f/fogdepth;
  247.     if (d>255.0f) 
  248.         factor=255;
  249.     else factor=(unsigned char)d;
  250. /*
  251.     static vector p1,p2,v;
  252.     p1=flyengine->cam->pos+rd*x1,
  253.     p2=flyengine->cam->pos+rd*x2;
  254.     v=p2-p1;
  255.     factor=
  256.         (float)sqrt(v.x*v.x+v.y*v.y) *
  257.         (bb.max.z-(p1.z+p2.z)/2.0f) /
  258.         (fogsizez * fogdepth) * 510.0f; 
  259.     if (factor>255.0f) factor=255.0f;
  260. */
  261.     return 1;
  262. }
  263.  
  264. int fogbox::step(int dt)
  265. {
  266.     if (directx->mpmode!=FLYMP_SERVER && flyengine->cam)
  267.     {
  268.         bb.min=bb.max=pos;
  269.         bb.min.x-=fogsizex;
  270.         bb.min.y-=fogsizey;
  271.         bb.min.z-=fogsizez;
  272.         bb.max.x+=fogsizex;
  273.         bb.max.y+=fogsizey;
  274.         bb.max.z+=fogsizez;
  275.         bbdiag=(bb.max-bb.min).length();
  276.         flyengine->apply_bsp(flyengine->bsp,pos,fogrange,this,apply_fog_box);
  277.     }
  278.     return 0;
  279. }
  280.  
  281. bsp_object *fogsphere::clone()
  282. {
  283.     fogsphere *tmp=new fogsphere;
  284.     *tmp=*this;
  285.     tmp->source=this;
  286.     return tmp;
  287. }
  288.  
  289. int fogsphere::get_custom_param_desc(int i,param_desc *pd)
  290. {
  291.     if (pd!=0)
  292.     switch(i)
  293.     {
  294.     case 0:
  295.         pd->type='f';
  296.         pd->data=&fogradius;
  297.         strcpy(pd->name,"fogradius");
  298.         break;
  299.     case 1:
  300.         pd->type='f';
  301.         pd->data=&fogrange;
  302.         strcpy(pd->name,"fogrange");
  303.         break;
  304.     case 2:
  305.         pd->type='f';
  306.         pd->data=&fogdepth;
  307.         strcpy(pd->name,"fogdepth");
  308.         break;
  309.     case 3:
  310.         pd->type='c';
  311.         pd->data=&fogcolor;
  312.         strcpy(pd->name,"fogcolor");
  313.         break;
  314.     case 4:
  315.         pd->type='i';
  316.         pd->data=&fogmode;
  317.         strcpy(pd->name,"fogmode");
  318.         break;
  319.     }
  320.     return 5;
  321. }
  322.  
  323. bsp_object *fogbox::clone()
  324. {
  325.     fogbox *tmp=new fogbox;
  326.     *tmp=*this;
  327.     tmp->source=this;
  328.     return tmp;
  329. }
  330.  
  331. int fogbox::get_custom_param_desc(int i,param_desc *pd)
  332. {
  333.     if (pd!=0)
  334.     switch(i)
  335.     {
  336.     case 0:
  337.         pd->type='f';
  338.         pd->data=&fogsizex;
  339.         strcpy(pd->name,"fogsizex");
  340.         break;
  341.     case 1:
  342.         pd->type='f';
  343.         pd->data=&fogsizey;
  344.         strcpy(pd->name,"fogsizey");
  345.         break;
  346.     case 2:
  347.         pd->type='f';
  348.         pd->data=&fogsizez;
  349.         strcpy(pd->name,"fogsizez");
  350.         break;
  351.     case 3:
  352.         pd->type='c';
  353.         pd->data=&fogcolor;
  354.         strcpy(pd->name,"fogcolor");
  355.         break;
  356.     case 4:
  357.         pd->type='f';
  358.         pd->data=&fogrange;
  359.         strcpy(pd->name,"fogrange");
  360.         break;
  361.     case 5:
  362.         pd->type='f';
  363.         pd->data=&fogdepth;
  364.         strcpy(pd->name,"fogdepth");
  365.         break;
  366.     case 6:
  367.         pd->type='i';
  368.         pd->data=&fogmode;
  369.         strcpy(pd->name,"fogmode");
  370.         break;
  371.     }
  372.     return 7;
  373. }
  374.  
  375.  
  376.  
  377.