r_segs.c
上传用户:xuyinpeng
上传日期:2021-05-12
资源大小:455k
文件大小:19k
源码类别:

射击游戏

开发平台:

Visual C++

  1. // Emacs style mode select   -*- C++ -*- 
  2. //-----------------------------------------------------------------------------
  3. //
  4. // $Id:$
  5. //
  6. // Copyright (C) 1993-1996 by id Software, Inc.
  7. //
  8. // This source is available for distribution and/or modification
  9. // only under the terms of the DOOM Source Code License as
  10. // published by id Software. All rights reserved.
  11. //
  12. // The source is distributed in the hope that it will be useful,
  13. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
  15. // for more details.
  16. //
  17. // $Log:$
  18. //
  19. // DESCRIPTION:
  20. // All the clipping: columns, horizontal spans, sky columns.
  21. //
  22. //-----------------------------------------------------------------------------
  23. static const char
  24. rcsid[] = "$Id: r_segs.c,v 1.3 1997/01/29 20:10:19 b1 Exp $";
  25. #include <stdlib.h>
  26. #include "i_system.h"
  27. #include "doomdef.h"
  28. #include "doomstat.h"
  29. #include "r_local.h"
  30. #include "r_sky.h"
  31. void WriteDebug( char *);
  32. // OPTIMIZE: closed two sided lines as single sided
  33. // True if any of the segs textures might be visible.
  34. boolean segtextured;
  35. // False if the back side is the same plane.
  36. boolean markfloor;
  37. boolean markceiling;
  38. boolean maskedtexture;
  39. int toptexture;
  40. int bottomtexture;
  41. int midtexture;
  42. angle_t rw_normalangle;
  43. // angle to line origin
  44. int rw_angle1;
  45. //
  46. // regular wall
  47. //
  48. int rw_x;
  49. int rw_stopx;
  50. angle_t rw_centerangle;
  51. fixed_t rw_offset;
  52. fixed_t rw_distance;
  53. fixed_t rw_scale;
  54. fixed_t rw_scalestep;
  55. fixed_t rw_midtexturemid;
  56. fixed_t rw_toptexturemid;
  57. fixed_t rw_bottomtexturemid;
  58. int worldtop;
  59. int worldbottom;
  60. int worldhigh;
  61. int worldlow;
  62. fixed_t pixhigh;
  63. fixed_t pixlow;
  64. fixed_t pixhighstep;
  65. fixed_t pixlowstep;
  66. fixed_t topfrac;
  67. fixed_t topstep;
  68. fixed_t bottomfrac;
  69. fixed_t bottomstep;
  70. lighttable_t** walllights;
  71. short* maskedtexturecol;
  72. //
  73. // R_RenderMaskedSegRange
  74. //
  75. void
  76. R_RenderMaskedSegRange
  77. ( drawseg_t* ds,
  78.   int x1,
  79.   int x2 )
  80. {
  81.     unsigned index;
  82.     column_t* col;
  83.     int lightnum;
  84.     int texnum;
  85.     
  86.     // Calculate light table.
  87.     // Use different light tables
  88.     //   for horizontal / vertical / diagonal. Diagonal?
  89.     // OPTIMIZE: get rid of LIGHTSEGSHIFT globally
  90.     curline = ds->curline;
  91.     frontsector = curline->frontsector;
  92.     backsector = curline->backsector;
  93.     texnum = texturetranslation[curline->sidedef->midtexture];
  94.     lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT)+extralight;
  95.     if (curline->v1->y == curline->v2->y)
  96. lightnum--;
  97.     else if (curline->v1->x == curline->v2->x)
  98. lightnum++;
  99.     if (lightnum < 0)
  100. walllights = scalelight[0];
  101.     else if (lightnum >= LIGHTLEVELS)
  102. walllights = scalelight[LIGHTLEVELS-1];
  103.     else
  104. walllights = scalelight[lightnum];
  105.     maskedtexturecol = ds->maskedtexturecol;
  106.     rw_scalestep = ds->scalestep;
  107.     spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep;
  108.     mfloorclip = ds->sprbottomclip;
  109.     mceilingclip = ds->sprtopclip;
  110.     
  111.     // find positioning
  112.     if (curline->linedef->flags & ML_DONTPEGBOTTOM)
  113.     {
  114. dc_texturemid = frontsector->floorheight > backsector->floorheight
  115.     ? frontsector->floorheight : backsector->floorheight;
  116. dc_texturemid = dc_texturemid + textureheight[texnum] - viewz;
  117.     }
  118.     else
  119.     {
  120. dc_texturemid =frontsector->ceilingheight<backsector->ceilingheight
  121.     ? frontsector->ceilingheight : backsector->ceilingheight;
  122. dc_texturemid = dc_texturemid - viewz;
  123.     }
  124.     dc_texturemid += curline->sidedef->rowoffset;
  125.     if (fixedcolormap)
  126. dc_colormap = fixedcolormap;
  127.     
  128.     // draw the columns
  129.     for (dc_x = x1 ; dc_x <= x2 ; dc_x++)
  130.     {
  131. // calculate lighting
  132. if (maskedtexturecol[dc_x] != MAXSHORT)
  133. {
  134.     if (!fixedcolormap)
  135.     {
  136. index = spryscale>>LIGHTSCALESHIFT;
  137. if (index >=  MAXLIGHTSCALE )
  138.     index = MAXLIGHTSCALE-1;
  139. dc_colormap = walllights[index];
  140.     }
  141.     sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale);
  142.     dc_iscale = 0xffffffffu / (unsigned)spryscale;
  143.     
  144.     // draw the texture
  145.     col = (column_t *)( 
  146. (byte *)R_GetColumn(texnum,maskedtexturecol[dc_x]) -3);
  147.     R_DrawMaskedColumn (col);
  148.     maskedtexturecol[dc_x] = MAXSHORT;
  149. }
  150. spryscale += rw_scalestep;
  151.     }
  152. }
  153. //
  154. // R_RenderSegLoop
  155. // Draws zero, one, or two textures (and possibly a masked
  156. //  texture) for walls.
  157. // Can draw or mark the starting pixel of floor and ceiling
  158. //  textures.
  159. // CALLED: CORE LOOPING ROUTINE.
  160. //
  161. #define HEIGHTBITS 12
  162. #define HEIGHTUNIT (1<<HEIGHTBITS)
  163. void R_RenderSegLoop (void)
  164. {
  165.     angle_t angle;
  166.     unsigned index;
  167.     int yl;
  168.     int yh;
  169.     int mid;
  170.     fixed_t texturecolumn;
  171.     int top;
  172.     int bottom;
  173.     //texturecolumn = 0; // shut up compiler warning
  174.     for ( ; rw_x < rw_stopx ; rw_x++)
  175.     {
  176. // mark floor / ceiling areas
  177. yl = (topfrac+HEIGHTUNIT-1)>>HEIGHTBITS;
  178. // no space above wall?
  179. if (yl < ceilingclip[rw_x]+1)
  180.     yl = ceilingclip[rw_x]+1;
  181. if (markceiling)
  182. {
  183.     top = ceilingclip[rw_x]+1;
  184.     bottom = yl-1;
  185.     if (bottom >= floorclip[rw_x])
  186. bottom = floorclip[rw_x]-1;
  187.     if (top <= bottom)
  188.     {
  189. ceilingplane->top[rw_x] = top;
  190. ceilingplane->bottom[rw_x] = bottom;
  191.     }
  192. }
  193. yh = bottomfrac>>HEIGHTBITS;
  194. if (yh >= floorclip[rw_x])
  195.     yh = floorclip[rw_x]-1;
  196. if (markfloor)
  197. {
  198.     top = yh+1;
  199.     bottom = floorclip[rw_x]-1;
  200.     if (top <= ceilingclip[rw_x])
  201. top = ceilingclip[rw_x]+1;
  202.     if (top <= bottom)
  203.     {
  204. floorplane->top[rw_x] = top;
  205. floorplane->bottom[rw_x] = bottom;
  206.     }
  207. }
  208. // texturecolumn and lighting are independent of wall tiers
  209. if (segtextured)
  210. {
  211.     // calculate texture offset
  212.     angle = (rw_centerangle + xtoviewangle[rw_x])>>ANGLETOFINESHIFT;
  213.     texturecolumn = rw_offset-FixedMul(finetangent[angle],rw_distance);
  214.     texturecolumn >>= FRACBITS;
  215.     // calculate lighting
  216.     index = rw_scale>>LIGHTSCALESHIFT;
  217.     if (index >=  MAXLIGHTSCALE )
  218. index = MAXLIGHTSCALE-1;
  219.     dc_colormap = walllights[index];
  220.     dc_x = rw_x;
  221.     dc_iscale = 0xffffffffu / (unsigned)rw_scale;
  222. }
  223. // draw the wall tiers
  224. if (midtexture)
  225. {
  226.     // single sided line
  227.     dc_yl = yl;
  228.     dc_yh = yh;
  229.     dc_texturemid = rw_midtexturemid;
  230.     dc_source = R_GetColumn(midtexture,texturecolumn);
  231.     colfunc ();
  232.     ceilingclip[rw_x] = viewheight;
  233.     floorclip[rw_x] = -1;
  234. }
  235. else
  236. {
  237.     // two sided line
  238.     if (toptexture)
  239.     {
  240. // top wall
  241. mid = pixhigh>>HEIGHTBITS;
  242. pixhigh += pixhighstep;
  243. if (mid >= floorclip[rw_x])
  244.     mid = floorclip[rw_x]-1;
  245. if (mid >= yl)
  246. {
  247.     dc_yl = yl;
  248.     dc_yh = mid;
  249.     dc_texturemid = rw_toptexturemid;
  250.     dc_source = R_GetColumn(toptexture,texturecolumn);
  251.     colfunc ();
  252.     ceilingclip[rw_x] = mid;
  253. }
  254. else
  255.     ceilingclip[rw_x] = yl-1;
  256.     }
  257.     else
  258.     {
  259. // no top wall
  260. if (markceiling)
  261.     ceilingclip[rw_x] = yl-1;
  262.     }
  263.     if (bottomtexture)
  264.     {
  265. // bottom wall
  266. mid = (pixlow+HEIGHTUNIT-1)>>HEIGHTBITS;
  267. pixlow += pixlowstep;
  268. // no space above wall?
  269. if (mid <= ceilingclip[rw_x])
  270.     mid = ceilingclip[rw_x]+1;
  271. if (mid <= yh)
  272. {
  273.     dc_yl = mid;
  274.     dc_yh = yh;
  275.     dc_texturemid = rw_bottomtexturemid;
  276.     dc_source = R_GetColumn(bottomtexture,
  277.     texturecolumn);
  278.     colfunc ();
  279.     floorclip[rw_x] = mid;
  280. }
  281. else
  282.     floorclip[rw_x] = yh+1;
  283.     }
  284.     else
  285.     {
  286. // no bottom wall
  287. if (markfloor)
  288.     floorclip[rw_x] = yh+1;
  289.     }
  290.     if (maskedtexture)
  291.     {
  292. // save texturecol
  293. //  for backdrawing of masked mid texture
  294. maskedtexturecol[rw_x] = texturecolumn;
  295.     }
  296. }
  297. rw_scale += rw_scalestep;
  298. topfrac += topstep;
  299. bottomfrac += bottomstep;
  300.     }
  301. }
  302. //
  303. // R_StoreWallRange
  304. // A wall segment will be drawn
  305. //  between start and stop pixels (inclusive).
  306. //
  307. void R_StoreWallRange( int start, int stop )
  308.    {
  309.     fixed_t hyp;
  310.     fixed_t sineval;
  311.     angle_t distangle, offsetangle;
  312.     fixed_t vtop;
  313.     int lightnum;
  314.     // don't overflow and crash
  315.     if (ds_p == &drawsegs[MAXDRAWSEGS])
  316.         return;
  317. #ifdef RANGECHECK
  318.     if (start > stop)
  319.        {
  320.         int hold;
  321.         hold = start;
  322.         start = stop;
  323.         stop = hold;
  324.         //WriteDebug("R_StoreWallRange ASS BACKWARDS...n");
  325.        }
  326.     if (start >= viewwidth)
  327.        {
  328.         WriteDebug("R_StoreWallRange start >= viewwidth...n");
  329.         return;
  330.        }
  331.         //I_Error ("Bad R_StoreWallRange: %i to %i : %i ", start , stop, viewwidth);
  332. #endif
  333.     sidedef = curline->sidedef;
  334.     linedef = curline->linedef;
  335.     // mark the segment as visible for auto map
  336.     linedef->flags |= ML_MAPPED;
  337.     
  338.     // calculate rw_distance for scale calculation
  339.     rw_normalangle = curline->angle + ANG90;
  340.     offsetangle = abs(rw_normalangle-rw_angle1);
  341.     
  342.     if (offsetangle > ANG90)
  343.         offsetangle = ANG90;
  344.     distangle = ANG90 - offsetangle;
  345.     hyp = R_PointToDist (curline->v1->x, curline->v1->y);
  346.     sineval = finesine[distangle>>ANGLETOFINESHIFT];
  347.     rw_distance = FixedMul (hyp, sineval);
  348.     ds_p->x1 = rw_x = start;
  349.     ds_p->x2 = stop;
  350.     ds_p->curline = curline;
  351.     rw_stopx = stop+1;
  352.     
  353.     // calculate scale at both ends and step
  354.     ds_p->scale1 = rw_scale = 
  355. R_ScaleFromGlobalAngle (viewangle + xtoviewangle[start]);
  356.     
  357.     if (stop > start )
  358.        {
  359.         ds_p->scale2 = R_ScaleFromGlobalAngle (viewangle + xtoviewangle[stop]);
  360.         ds_p->scalestep = rw_scalestep = (ds_p->scale2 - rw_scale) / (stop-start);
  361.        }
  362.     else
  363.        {
  364. // UNUSED: try to fix the stretched line bug
  365. #if 0
  366. if (rw_distance < FRACUNIT/2)
  367. {
  368.     fixed_t trx,try;
  369.     fixed_t gxt,gyt;
  370.     trx = curline->v1->x - viewx;
  371.     try = curline->v1->y - viewy;
  372.     gxt = FixedMul(trx,viewcos); 
  373.     gyt = -FixedMul(try,viewsin); 
  374.     ds_p->scale1 = FixedDiv(projection, gxt-gyt)<<detailshift;
  375. }
  376. #endif
  377.         ds_p->scale2 = ds_p->scale1;
  378.        }
  379.     
  380.     // calculate texture boundaries
  381.     //  and decide if floor / ceiling marks are needed
  382.     worldtop = frontsector->ceilingheight - viewz;
  383.     worldbottom = frontsector->floorheight - viewz;
  384.     midtexture = toptexture = bottomtexture = maskedtexture = 0;
  385.     ds_p->maskedtexturecol = NULL;
  386.     if (!backsector)
  387.        {
  388.         // single sided line
  389.         midtexture = texturetranslation[sidedef->midtexture];
  390.         // a single sided line is terminal, so it must mark ends
  391.         markfloor = markceiling = true;
  392.         if (linedef->flags & ML_DONTPEGBOTTOM)
  393.            {
  394.             vtop = frontsector->floorheight +
  395.             textureheight[sidedef->midtexture];
  396.             // bottom of texture at bottom
  397.             rw_midtexturemid = vtop - viewz;
  398.            }
  399.         else
  400.            {
  401.             // top of texture at top
  402.             rw_midtexturemid = worldtop;
  403.            }
  404.         rw_midtexturemid += sidedef->rowoffset;
  405.         ds_p->silhouette = SIL_BOTH;
  406.         ds_p->sprtopclip = screenheightarray;
  407.         ds_p->sprbottomclip = negonearray;
  408.         ds_p->bsilheight = MAXINT;
  409.         ds_p->tsilheight = MININT;
  410.        }
  411.     else
  412.        {
  413.         // two sided line
  414.         ds_p->sprtopclip = ds_p->sprbottomclip = NULL;
  415.         ds_p->silhouette = 0;
  416.         if (frontsector->floorheight > backsector->floorheight)
  417.            {
  418.             ds_p->silhouette = SIL_BOTTOM;
  419.             ds_p->bsilheight = frontsector->floorheight;
  420.            }
  421.         else
  422.         if (backsector->floorheight > viewz)
  423.            {
  424.             ds_p->silhouette = SIL_BOTTOM;
  425.             ds_p->bsilheight = MAXINT;
  426.             // ds_p->sprbottomclip = negonearray;
  427.            }
  428.         if (frontsector->ceilingheight < backsector->ceilingheight)
  429.            {
  430.             ds_p->silhouette |= SIL_TOP;
  431.             ds_p->tsilheight = frontsector->ceilingheight;
  432.            }
  433.         else
  434.         if (backsector->ceilingheight < viewz)
  435.            {
  436.             ds_p->silhouette |= SIL_TOP;
  437.             ds_p->tsilheight = MININT;
  438.             // ds_p->sprtopclip = screenheightarray;
  439.            }
  440.         if (backsector->ceilingheight <= frontsector->floorheight)
  441.            {
  442.             ds_p->sprbottomclip = negonearray;
  443.             ds_p->bsilheight = MAXINT;
  444.             ds_p->silhouette |= SIL_BOTTOM;
  445.            }
  446.         if (backsector->floorheight >= frontsector->ceilingheight)
  447.            {
  448.             ds_p->sprtopclip = screenheightarray;
  449.             ds_p->tsilheight = MININT;
  450.             ds_p->silhouette |= SIL_TOP;
  451.            }
  452.         worldhigh = backsector->ceilingheight - viewz;
  453.         worldlow = backsector->floorheight - viewz;
  454.         // hack to allow height changes in outdoor areas
  455.         if (frontsector->ceilingpic == skyflatnum && backsector->ceilingpic == skyflatnum)
  456.            {
  457.             worldtop = worldhigh;
  458.            }
  459.         if (worldlow != worldbottom || backsector->floorpic != frontsector->floorpic || backsector->lightlevel != frontsector->lightlevel)
  460.            {
  461.             markfloor = true;
  462.            }
  463.         else
  464.            {
  465.             // same plane on both sides
  466.             markfloor = false;
  467.            }
  468.         if (worldhigh != worldtop || backsector->ceilingpic != frontsector->ceilingpic || backsector->lightlevel != frontsector->lightlevel)
  469.            {
  470.             markceiling = true;
  471.            }
  472.         else
  473.            {
  474.             // same plane on both sides
  475.             markceiling = false;
  476.            }
  477.         if (backsector->ceilingheight <= frontsector->floorheight || backsector->floorheight >= frontsector->ceilingheight)
  478.            {
  479.             // closed door
  480.             markceiling = markfloor = true;
  481.            }
  482.         if (worldhigh < worldtop)
  483.            {
  484.             // top texture
  485.             toptexture = texturetranslation[sidedef->toptexture];
  486.             if (linedef->flags & ML_DONTPEGTOP)
  487.                {
  488.                 // top of texture at top
  489.                 rw_toptexturemid = worldtop;
  490.                }
  491.             else
  492.                {
  493.                 vtop = backsector->ceilingheight + textureheight[sidedef->toptexture];
  494.                 // bottom of texture
  495.                 rw_toptexturemid = vtop - viewz;
  496.                }
  497.            }
  498.         if (worldlow > worldbottom)
  499.            {
  500.             // bottom texture
  501.             bottomtexture = texturetranslation[sidedef->bottomtexture];
  502.             if (linedef->flags & ML_DONTPEGBOTTOM )
  503.                {
  504.                 // bottom of texture at bottom
  505.                 // top of texture at top
  506.                 rw_bottomtexturemid = worldtop;
  507.                }
  508.             else // top of texture at top
  509.                 rw_bottomtexturemid = worldlow;
  510.            }
  511.         rw_toptexturemid += sidedef->rowoffset;
  512.         rw_bottomtexturemid += sidedef->rowoffset;
  513.         // allocate space for masked texture tables
  514.         if (sidedef->midtexture)
  515.            {
  516.             // masked midtexture
  517.             maskedtexture = true;
  518.             ds_p->maskedtexturecol = maskedtexturecol = lastopening - rw_x;
  519.             lastopening += rw_stopx - rw_x;
  520.            }
  521.        }
  522.     
  523.     // calculate rw_offset (only needed for textured lines)
  524.     segtextured = midtexture | toptexture | bottomtexture | maskedtexture;
  525.     if (segtextured)
  526.        {
  527.         offsetangle = rw_normalangle-rw_angle1;
  528.         if (offsetangle > ANG180)
  529.             offsetangle = (offsetangle * -1);
  530.         if (offsetangle > ANG90)
  531.             offsetangle = ANG90;
  532.         sineval = finesine[offsetangle >>ANGLETOFINESHIFT];
  533.         rw_offset = FixedMul (hyp, sineval);
  534.         if (rw_normalangle-rw_angle1 < ANG180)
  535.             rw_offset = -rw_offset;
  536.         rw_offset += sidedef->textureoffset + curline->offset;
  537.         rw_centerangle = ANG90 + viewangle - rw_normalangle;
  538.         // calculate light table
  539.         //  use different light tables
  540.         //  for horizontal / vertical / diagonal
  541.         // OPTIMIZE: get rid of LIGHTSEGSHIFT globally
  542.         if (!fixedcolormap)
  543.            {
  544.             lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT)+extralight;
  545.             if (curline->v1->y == curline->v2->y)
  546.                 lightnum--;
  547.             else
  548.             if (curline->v1->x == curline->v2->x)
  549.                 lightnum++;
  550.             if (lightnum < 0)
  551.                 walllights = scalelight[0];
  552.             else
  553.             if (lightnum >= LIGHTLEVELS)
  554.                 walllights = scalelight[LIGHTLEVELS-1];
  555.             else
  556.                 walllights = scalelight[lightnum];
  557.            }
  558.        }
  559.     
  560.     // if a floor / ceiling plane is on the wrong side
  561.     //  of the view plane, it is definitely invisible
  562.     //  and doesn't need to be marked.
  563.     
  564.   
  565.     if (frontsector->floorheight >= viewz)
  566.        {
  567.         // above view plane
  568.         markfloor = false;
  569.        }
  570.     
  571.     if (frontsector->ceilingheight <= viewz && frontsector->ceilingpic != skyflatnum)
  572.        {
  573.         // below view plane
  574.         markceiling = false;
  575.        }
  576.     
  577.     // calculate incremental stepping values for texture edges
  578.     worldtop >>= 4;
  579.     worldbottom >>= 4;
  580.     topstep = -FixedMul (rw_scalestep, worldtop);
  581.     topfrac = (centeryfrac>>4) - FixedMul (worldtop, rw_scale);
  582.     bottomstep = -FixedMul (rw_scalestep,worldbottom);
  583.     bottomfrac = (centeryfrac>>4) - FixedMul (worldbottom, rw_scale);
  584.     if (backsector)
  585.        {
  586.         worldhigh >>= 4;
  587.         worldlow >>= 4;
  588.         if (worldhigh < worldtop)
  589.            {
  590.             pixhigh = (centeryfrac>>4) - FixedMul (worldhigh, rw_scale);
  591.             pixhighstep = -FixedMul (rw_scalestep,worldhigh);
  592.            }
  593.         if (worldlow > worldbottom)
  594.            {
  595.             pixlow = (centeryfrac>>4) - FixedMul (worldlow, rw_scale);
  596.             pixlowstep = -FixedMul (rw_scalestep,worldlow);
  597.            }
  598.        }
  599.     
  600.     // render it
  601.     if (markceiling)
  602. ceilingplane = R_CheckPlane (ceilingplane, rw_x, rw_stopx-1);
  603.     
  604.     if (markfloor)
  605. floorplane = R_CheckPlane (floorplane, rw_x, rw_stopx-1);
  606.     R_RenderSegLoop ();
  607.     
  608.     // save sprite clipping info
  609.     if ( ((ds_p->silhouette & SIL_TOP) || maskedtexture) && !ds_p->sprtopclip)
  610.        {
  611.         memcpy (lastopening, ceilingclip+start, 2*(rw_stopx-start));
  612.         ds_p->sprtopclip = lastopening - start;
  613.         lastopening += rw_stopx - start;
  614.        }
  615.     
  616.     if ( ((ds_p->silhouette & SIL_BOTTOM) || maskedtexture) && !ds_p->sprbottomclip)
  617.        {
  618.         memcpy (lastopening, floorclip+start, 2*(rw_stopx-start));
  619.         ds_p->sprbottomclip = lastopening - start;
  620.         lastopening += rw_stopx - start;
  621.        }
  622.     if (maskedtexture && !(ds_p->silhouette&SIL_TOP))
  623.        {
  624.         ds_p->silhouette |= SIL_TOP;
  625.         ds_p->tsilheight = MININT;
  626.        }
  627.     if (maskedtexture && !(ds_p->silhouette&SIL_BOTTOM))
  628.        {
  629.         ds_p->silhouette |= SIL_BOTTOM;
  630.         ds_p->bsilheight = MAXINT;
  631.        }
  632.     ds_p++;
  633.    }