home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / swrast / s_points.cpp < prev    next >
C/C++ Source or Header  |  2002-06-15  |  7KB  |  279 lines

  1. /* $Id: s_points.c,v 1.19 2002/06/15 03:03:11 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  4.1
  6.  *
  7.  * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  23.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  */
  26.  
  27.  
  28. #include "glheader.h"
  29. #include "colormac.h"
  30. #include "context.h"
  31. #include "macros.h"
  32. #include "mmath.h"
  33. #include "texstate.h"
  34. #include "s_context.h"
  35. #include "s_feedback.h"
  36. #include "s_points.h"
  37. #include "s_span.h"
  38.  
  39.  
  40.  
  41. #define RGBA       0x1
  42. #define INDEX      0x2
  43. #define SMOOTH     0x4
  44. #define TEXTURE    0x8
  45. #define SPECULAR  0x10
  46. #define LARGE     0x20
  47. #define ATTENUATE 0x40
  48. #define SPRITE    0x80
  49.  
  50.  
  51. /*
  52.  * CI points with size == 1.0
  53.  */
  54. #define FLAGS (INDEX)
  55. #define NAME size1_ci_point
  56. #include "s_pointtemp.h"
  57.  
  58.  
  59. /*
  60.  * General CI points.
  61.  */
  62. #define FLAGS (INDEX | LARGE)
  63. #define NAME general_ci_point
  64. #include "s_pointtemp.h"
  65.  
  66.  
  67. /*
  68.  * Antialiased CI points.
  69.  */
  70. #define FLAGS (INDEX | SMOOTH)
  71. #define NAME antialiased_ci_point
  72. #include "s_pointtemp.h"
  73.  
  74.  
  75. /*
  76.  * Distance attenuated, general CI points.
  77.  */
  78. #define FLAGS (INDEX | ATTENUATE)
  79. #define NAME atten_general_ci_point
  80. #include "s_pointtemp.h"
  81.  
  82.  
  83. /*
  84.  * RGBA points with size == 1.0
  85.  */
  86. #define FLAGS (RGBA)
  87. #define NAME size1_rgba_point
  88. #include "s_pointtemp.h"
  89.  
  90.  
  91. /*
  92.  * General RGBA points.
  93.  */
  94. #define FLAGS (RGBA | LARGE)
  95. #define NAME general_rgba_point
  96. #include "s_pointtemp.h"
  97.  
  98.  
  99. /*
  100.  * Antialiased RGBA points.
  101.  */
  102. #define FLAGS (RGBA | SMOOTH)
  103. #define NAME antialiased_rgba_point
  104. #include "s_pointtemp.h"
  105.  
  106.  
  107. /*
  108.  * Textured RGBA points.
  109.  */
  110. #define FLAGS (RGBA | LARGE | TEXTURE | SPECULAR)
  111. #define NAME textured_rgba_point
  112. #include "s_pointtemp.h"
  113.  
  114.  
  115. /*
  116.  * Antialiased points with texture mapping.
  117.  */
  118. #define FLAGS (RGBA | SMOOTH | TEXTURE | SPECULAR)
  119. #define NAME antialiased_tex_rgba_point
  120. #include "s_pointtemp.h"
  121.  
  122.  
  123. /*
  124.  * Distance attenuated, general RGBA points.
  125.  */
  126. #define FLAGS (RGBA | ATTENUATE)
  127. #define NAME atten_general_rgba_point
  128. #include "s_pointtemp.h"
  129.  
  130.  
  131. /*
  132.  * Distance attenuated, textured RGBA points.
  133.  */
  134. #define FLAGS (RGBA | ATTENUATE | TEXTURE | SPECULAR)
  135. #define NAME atten_textured_rgba_point
  136. #include "s_pointtemp.h"
  137.  
  138.  
  139. /*
  140.  * Distance attenuated, antialiased points with or without texture mapping.
  141.  */
  142. #define FLAGS (RGBA | ATTENUATE | TEXTURE | SMOOTH)
  143. #define NAME atten_antialiased_rgba_point
  144. #include "s_pointtemp.h"
  145.  
  146.  
  147. /*
  148.  * Sprite (textured point)
  149.  */
  150. #define FLAGS (RGBA | SPRITE)
  151. #define NAME sprite_point
  152. #include "s_pointtemp.h"
  153.  
  154.  
  155. #define FLAGS (RGBA | ATTENUATE | SPRITE)
  156. #define NAME atten_sprite_point
  157. #include "s_pointtemp.h"
  158.  
  159.  
  160.  
  161. void _swrast_add_spec_terms_point( GLcontext *ctx,
  162.                    const SWvertex *v0 )
  163. {
  164.    SWvertex *ncv0 = (SWvertex *)v0;
  165.    GLchan c[1][4];
  166.    COPY_CHAN4( c[0], ncv0->color );
  167.    ACC_3V( ncv0->color, ncv0->specular );
  168.    SWRAST_CONTEXT(ctx)->SpecPoint( ctx, ncv0 );
  169.    COPY_CHAN4( ncv0->color, c[0] );
  170. }
  171.  
  172.  
  173.  
  174. /* record the current point function name */
  175. #ifdef DEBUG
  176.  
  177. static const char *pntFuncName = NULL;
  178.  
  179. #define USE(pntFunc)                   \
  180. do {                                   \
  181.     pntFuncName = #pntFunc;            \
  182.     /*printf("%s\n", pntFuncName);*/   \
  183.     swrast->Point = pntFunc;           \
  184. } while (0)
  185.  
  186. #else
  187.  
  188. #define USE(pntFunc)  swrast->Point = pntFunc
  189.  
  190. #endif
  191.  
  192.  
  193. /*
  194.  * Examine the current context to determine which point drawing function
  195.  * should be used.
  196.  */
  197. void
  198. _swrast_choose_point( GLcontext *ctx )
  199. {
  200.    SWcontext *swrast = SWRAST_CONTEXT(ctx);
  201.    GLboolean rgbMode = ctx->Visual.rgbMode;
  202.  
  203.    if (ctx->RenderMode==GL_RENDER) {
  204.       if (ctx->Point.PointSprite) {
  205.          /* GL_NV_point_sprite */
  206.          /* XXX this might not be good enough */
  207.          if (ctx->Point._Attenuated)
  208.             USE(atten_sprite_point);
  209.          else
  210.             USE(sprite_point);
  211.       }
  212.       else if (ctx->Point.SmoothFlag) {
  213.          /* Smooth points */
  214.          if (rgbMode) {
  215.             if (ctx->Point._Attenuated || ctx->VertexProgram.PointSizeEnabled) {
  216.                USE(atten_antialiased_rgba_point);
  217.             }
  218.             else if (ctx->Texture._EnabledUnits) {
  219.                USE(antialiased_tex_rgba_point);
  220.             }
  221.             else {
  222.                USE(antialiased_rgba_point);
  223.             }
  224.          }
  225.          else {
  226.             USE(antialiased_ci_point);
  227.          }
  228.       }
  229.       else if (ctx->Point._Attenuated || ctx->VertexProgram.PointSizeEnabled) {
  230.          if (rgbMode) {
  231.             if (ctx->Texture._EnabledUnits) {
  232.                if (ctx->Point.SmoothFlag) {
  233.                   USE(atten_antialiased_rgba_point);
  234.                }
  235.                else {
  236.                   USE(atten_textured_rgba_point);
  237.                }
  238.             }
  239.             else {
  240.                USE(atten_general_rgba_point);
  241.             }
  242.          }
  243.          else {
  244.             /* ci, atten */
  245.             USE(atten_general_ci_point);
  246.          }
  247.       }
  248.       else if (ctx->Texture._EnabledUnits && rgbMode) {
  249.          /* textured */
  250.          USE(textured_rgba_point);
  251.       }
  252.       else if (ctx->Point.Size != 1.0) {
  253.          /* large points */
  254.          if (rgbMode) {
  255.             USE(general_rgba_point);
  256.          }
  257.          else {
  258.             USE(general_ci_point);
  259.          }
  260.       }
  261.       else {
  262.          /* single pixel points */
  263.          if (rgbMode) {
  264.             USE(size1_rgba_point);
  265.          }
  266.          else {
  267.             USE(size1_ci_point);
  268.          }
  269.       }
  270.    }
  271.    else if (ctx->RenderMode==GL_FEEDBACK) {
  272.       USE(_mesa_feedback_point);
  273.    }
  274.    else {
  275.       /* GL_SELECT mode */
  276.       USE(_mesa_select_point);
  277.    }
  278. }
  279.