Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // d_edge.c
  21.  
  22. #include "quakedef.h"
  23. #include "d_local.h"
  24.  
  25. static int      miplevel;
  26.  
  27. float           scale_for_mip;
  28. int                     screenwidth;
  29. int                     ubasestep, errorterm, erroradjustup, erroradjustdown;
  30. int                     vstartscan;
  31.  
  32. // FIXME: should go away
  33. extern void                     R_RotateBmodel (void);
  34. extern void                     R_TransformFrustum (void);
  35.  
  36. vec3_t          transformed_modelorg;
  37.  
  38. /*
  39. ==============
  40. D_DrawPoly
  41.  
  42. ==============
  43. */
  44. void D_DrawPoly (void)
  45. {
  46. // this driver takes spans, not polygons
  47. }
  48.  
  49.  
  50. /*
  51. =============
  52. D_MipLevelForScale
  53. =============
  54. */
  55. int D_MipLevelForScale (float scale)
  56. {
  57.         int             lmiplevel;
  58.  
  59.         if (scale >= d_scalemip[0] )
  60.                 lmiplevel = 0;
  61.         else if (scale >= d_scalemip[1] )
  62.                 lmiplevel = 1;
  63.         else if (scale >= d_scalemip[2] )
  64.                 lmiplevel = 2;
  65.         else
  66.                 lmiplevel = 3;
  67.  
  68.         if (lmiplevel < d_minmip)
  69.                 lmiplevel = d_minmip;
  70.  
  71.         return lmiplevel;
  72. }
  73.  
  74.  
  75. /*
  76. ==============
  77. D_DrawSolidSurface
  78. ==============
  79. */
  80.  
  81. // FIXME: clean this up
  82.  
  83. void D_DrawSolidSurface (surf_t *surf, int color)
  84. {
  85.         espan_t *span;
  86.         byte    *pdest;
  87.         int             u, u2, pix;
  88.        
  89.         pix = (color<<24) | (color<<16) | (color<<8) | color;
  90.         for (span=surf->spans ; span ; span=span->pnext)
  91.         {
  92.                 pdest = (byte *)d_viewbuffer + screenwidth*span->v;
  93.                 u = span->u;
  94.                 u2 = span->u + span->count - 1;
  95.                 ((byte *)pdest)[u] = pix;
  96.  
  97.                 if (u2 - u < 8)
  98.                 {
  99.                         for (u++ ; u <= u2 ; u++)
  100.                                 ((byte *)pdest)[u] = pix;
  101.                 }
  102.                 else
  103.                 {
  104.                         for (u++ ; u & 3 ; u++)
  105.                                 ((byte *)pdest)[u] = pix;
  106.  
  107.                         u2 -= 4;
  108.                         for ( ; u <= u2 ; u+=4)
  109.                                 *(int *)((byte *)pdest + u) = pix;
  110.                         u2 += 4;
  111.                         for ( ; u <= u2 ; u++)
  112.                                 ((byte *)pdest)[u] = pix;
  113.                 }
  114.         }
  115. }
  116.  
  117.  
  118. /*
  119. ==============
  120. D_CalcGradients
  121. ==============
  122. */
  123. void D_CalcGradients (msurface_t *pface)
  124. {
  125.         mplane_t        *pplane;
  126.         float           mipscale;
  127.         vec3_t          p_temp1;
  128.         vec3_t          p_saxis, p_taxis;
  129.         float           t;
  130.  
  131.         pplane = pface->plane;
  132.  
  133.         mipscale = 1.0 / (float)(1 << miplevel);
  134.  
  135.         TransformVector (pface->texinfo->vecs[0], p_saxis);
  136.         TransformVector (pface->texinfo->vecs[1], p_taxis);
  137.  
  138.         t = xscaleinv * mipscale;
  139.         d_sdivzstepu = p_saxis[0] * t;
  140.         d_tdivzstepu = p_taxis[0] * t;
  141.  
  142.         t = yscaleinv * mipscale;
  143.         d_sdivzstepv = -p_saxis[1] * t;
  144.         d_tdivzstepv = -p_taxis[1] * t;
  145.  
  146.         d_sdivzorigin = p_saxis[2] * mipscale - xcenter * d_sdivzstepu -
  147.                         ycenter * d_sdivzstepv;
  148.         d_tdivzorigin = p_taxis[2] * mipscale - xcenter * d_tdivzstepu -
  149.                         ycenter * d_tdivzstepv;
  150.  
  151.         VectorScale (transformed_modelorg, mipscale, p_temp1);
  152.  
  153.         t = 0x10000*mipscale;
  154.         sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) -
  155.                         ((pface->texturemins[0] << 16) >> miplevel)
  156.                         + pface->texinfo->vecs[0][3]*t;
  157.         tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) -
  158.                         ((pface->texturemins[1] << 16) >> miplevel)
  159.                         + pface->texinfo->vecs[1][3]*t;
  160.  
  161. //
  162. // -1 (-epsilon) so we never wander off the edge of the texture
  163. //
  164.         bbextents = ((pface->extents[0] << 16) >> miplevel) - 1;
  165.         bbextentt = ((pface->extents[1] << 16) >> miplevel) - 1;
  166. }
  167.  
  168.  
  169. /*
  170. ==============
  171. D_DrawSurfaces
  172. ==============
  173. */
  174. void D_DrawSurfaces (void)
  175. {
  176.         surf_t                  *s;
  177.         msurface_t              *pface;
  178.         surfcache_t             *pcurrentcache;
  179.         vec3_t                  world_transformed_modelorg;
  180.         vec3_t                  local_modelorg;
  181.  
  182.         currententity = &cl_entities[0];
  183.         TransformVector (modelorg, transformed_modelorg);
  184.         VectorCopy (transformed_modelorg, world_transformed_modelorg);
  185.  
  186. // TODO: could preset a lot of this at mode set time
  187.         if (r_drawflat.value)
  188.         {
  189.                 for (s = &surfaces[1] ; s<surface_p ; s++)
  190.                 {
  191.                         if (!s->spans)
  192.                                 continue;
  193.  
  194.                         d_zistepu = s->d_zistepu;
  195.                         d_zistepv = s->d_zistepv;
  196.                         d_ziorigin = s->d_ziorigin;
  197.  
  198.                         D_DrawSolidSurface (s, (int)s->data & 0xFF);
  199.                         D_DrawZSpans (s->spans);
  200.                 }
  201.         }
  202.         else
  203.         {
  204.                 for (s = &surfaces[1] ; s<surface_p ; s++)
  205.                 {
  206.                         if (!s->spans)
  207.                                 continue;
  208.  
  209.                         r_drawnpolycount++;
  210.  
  211.                         d_zistepu = s->d_zistepu;
  212.                         d_zistepv = s->d_zistepv;
  213.                         d_ziorigin = s->d_ziorigin;
  214.  
  215.                         if (s->flags & SURF_DRAWSKY)
  216.                         {
  217.                                 if (!r_skymade)
  218.                                 {
  219.                                         R_MakeSky ();
  220.                                 }
  221.  
  222.                                 D_DrawSkyScans8 (s->spans);
  223.                                 D_DrawZSpans (s->spans);
  224.                         }
  225.                         else if (s->flags & SURF_DRAWBACKGROUND)
  226.                         {
  227.                         // set up a gradient for the background surface that places it
  228.                         // effectively at infinity distance from the viewpoint
  229.                                 d_zistepu = 0;
  230.                                 d_zistepv = 0;
  231.                                 d_ziorigin = -0.9;
  232.  
  233.                                 D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
  234.                                 D_DrawZSpans (s->spans);
  235.                         }
  236.                         else if (s->flags & SURF_DRAWTURB)
  237.                         {
  238.                                 pface = s->data;
  239.                                 miplevel = 0;
  240.                                 cacheblock = (pixel_t *)
  241.                                                 ((byte *)pface->texinfo->texture +
  242.                                                 pface->texinfo->texture->offsets[0]);
  243.                                 cachewidth = 64;
  244.  
  245.                                 if (s->insubmodel)
  246.                                 {
  247.                                 // FIXME: we don't want to do all this for every polygon!
  248.                                 // TODO: store once at start of frame
  249.                                         currententity = s->entity;      //FIXME: make this passed in to
  250.                                                                                                 // R_RotateBmodel ()
  251.                                         VectorSubtract (r_origin, currententity->origin,
  252.                                                         local_modelorg);
  253.                                         TransformVector (local_modelorg, transformed_modelorg);
  254.  
  255.                                         R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  256.                                                                                 // make entity passed in
  257.                                 }
  258.  
  259.                                 D_CalcGradients (pface);
  260.                                 Turbulent8 (s->spans);
  261.                                 D_DrawZSpans (s->spans);
  262.  
  263.                                 if (s->insubmodel)
  264.                                 {
  265.                                 //
  266.                                 // restore the old drawing state
  267.                                 // FIXME: we don't want to do this every time!
  268.                                 // TODO: speed up
  269.                                 //
  270.                                         currententity = &cl_entities[0];
  271.                                         VectorCopy (world_transformed_modelorg,
  272.                                                                 transformed_modelorg);
  273.                                         VectorCopy (base_vpn, vpn);
  274.                                         VectorCopy (base_vup, vup);
  275.                                         VectorCopy (base_vright, vright);
  276.                                         VectorCopy (base_modelorg, modelorg);
  277.                                         R_TransformFrustum ();
  278.                                 }
  279.                         }
  280.                         else
  281.                         {
  282.                                 if (s->insubmodel)
  283.                                 {
  284.                                 // FIXME: we don't want to do all this for every polygon!
  285.                                 // TODO: store once at start of frame
  286.                                         currententity = s->entity;      //FIXME: make this passed in to
  287.                                                                                                 // R_RotateBmodel ()
  288.                                         VectorSubtract (r_origin, currententity->origin, local_modelorg);
  289.                                         TransformVector (local_modelorg, transformed_modelorg);
  290.  
  291.                                         R_RotateBmodel ();      // FIXME: don't mess with the frustum,
  292.                                                                                 // make entity passed in
  293.                                 }
  294.  
  295.                                 pface = s->data;
  296.                                 miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
  297.                                 * pface->texinfo->mipadjust);
  298.  
  299.                         // FIXME: make this passed in to D_CacheSurface
  300.                                 pcurrentcache = D_CacheSurface (pface, miplevel);
  301.  
  302.                                 cacheblock = (pixel_t *)pcurrentcache->data;
  303.                                 cachewidth = pcurrentcache->width;
  304.  
  305.                                 D_CalcGradients (pface);
  306.  
  307.                                 (*d_drawspans) (s->spans);
  308.  
  309.                                 D_DrawZSpans (s->spans);
  310.  
  311.                                 if (s->insubmodel)
  312.                                 {
  313.                                 //
  314.                                 // restore the old drawing state
  315.                                 // FIXME: we don't want to do this every time!
  316.                                 // TODO: speed up
  317.                                 //
  318.                                         currententity = &cl_entities[0];
  319.                                         VectorCopy (world_transformed_modelorg,
  320.                                                                 transformed_modelorg);
  321.                                         VectorCopy (base_vpn, vpn);
  322.                                         VectorCopy (base_vup, vup);
  323.                                         VectorCopy (base_vright, vright);
  324.                                         VectorCopy (base_modelorg, modelorg);
  325.                                         R_TransformFrustum ();
  326.                                 }
  327.                         }
  328.                 }
  329.         }
  330. }
  331.  
  332.