home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / MesaDLL / polygon.cpp < prev    next >
C/C++ Source or Header  |  2002-10-24  |  6KB  |  206 lines

  1. /* $Id: polygon.c,v 1.25 2002/10/24 23:57:21 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 "imports.h"
  30. #include "context.h"
  31. #include "image.h"
  32. #include "enums.h"
  33. #include "macros.h"
  34. #include "polygon.h"
  35. #include "mtypes.h"
  36.  
  37.  
  38. void
  39. _mesa_CullFace( GLenum mode )
  40. {
  41.    GET_CURRENT_CONTEXT(ctx);
  42.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  43.  
  44.    if (MESA_VERBOSE&VERBOSE_API)
  45.       _mesa_debug(ctx, "glCullFace %s\n", _mesa_lookup_enum_by_nr(mode));
  46.  
  47.    if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
  48.       _mesa_error( ctx, GL_INVALID_ENUM, "glCullFace" );
  49.       return;
  50.    }
  51.  
  52.    if (ctx->Polygon.CullFaceMode == mode)
  53.       return;
  54.  
  55.    FLUSH_VERTICES(ctx, _NEW_POLYGON);
  56.    ctx->Polygon.CullFaceMode = mode;
  57.  
  58.    if (ctx->Driver.CullFace)
  59.       ctx->Driver.CullFace( ctx, mode );
  60. }
  61.  
  62.  
  63.  
  64. void
  65. _mesa_FrontFace( GLenum mode )
  66. {
  67.    GET_CURRENT_CONTEXT(ctx);
  68.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  69.  
  70.    if (MESA_VERBOSE&VERBOSE_API)
  71.       _mesa_debug(ctx, "glFrontFace %s\n", _mesa_lookup_enum_by_nr(mode));
  72.  
  73.    if (mode!=GL_CW && mode!=GL_CCW) {
  74.       _mesa_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
  75.       return;
  76.    }
  77.  
  78.    if (ctx->Polygon.FrontFace == mode)
  79.       return;
  80.  
  81.    FLUSH_VERTICES(ctx, _NEW_POLYGON);
  82.    ctx->Polygon.FrontFace = mode;
  83.  
  84.    ctx->Polygon._FrontBit = (GLboolean) (mode == GL_CW);
  85.  
  86.    if (ctx->Driver.FrontFace)
  87.       ctx->Driver.FrontFace( ctx, mode );
  88. }
  89.  
  90.  
  91.  
  92. void
  93. _mesa_PolygonMode( GLenum face, GLenum mode )
  94. {
  95.    GET_CURRENT_CONTEXT(ctx);
  96.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  97.  
  98.    if (MESA_VERBOSE&VERBOSE_API)
  99.       _mesa_debug(ctx, "glPolygonMode %s %s\n",
  100.                   _mesa_lookup_enum_by_nr(face),
  101.                   _mesa_lookup_enum_by_nr(mode));
  102.  
  103.    if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
  104.       _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
  105.       return;
  106.    }
  107.  
  108.    switch (face) {
  109.    case GL_FRONT:
  110.       if (ctx->Polygon.FrontMode == mode)
  111.      return;
  112.       FLUSH_VERTICES(ctx, _NEW_POLYGON);
  113.       ctx->Polygon.FrontMode = mode;
  114.       break;
  115.    case GL_FRONT_AND_BACK:
  116.       if (ctx->Polygon.FrontMode == mode &&
  117.       ctx->Polygon.BackMode == mode)
  118.      return;
  119.       FLUSH_VERTICES(ctx, _NEW_POLYGON);
  120.       ctx->Polygon.FrontMode = mode;
  121.       ctx->Polygon.BackMode = mode;
  122.       break;
  123.    case GL_BACK:
  124.       if (ctx->Polygon.BackMode == mode)
  125.      return;
  126.       FLUSH_VERTICES(ctx, _NEW_POLYGON);
  127.       ctx->Polygon.BackMode = mode;
  128.       break;
  129.    default:
  130.       _mesa_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
  131.       return;
  132.    }
  133.  
  134.    ctx->_TriangleCaps &= ~DD_TRI_UNFILLED;
  135.    if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL)
  136.       ctx->_TriangleCaps |= DD_TRI_UNFILLED;
  137.  
  138.    if (ctx->Driver.PolygonMode) {
  139.       (*ctx->Driver.PolygonMode)( ctx, face, mode );
  140.    }
  141. }
  142.  
  143.  
  144.  
  145. void
  146. _mesa_PolygonStipple( const GLubyte *pattern )
  147. {
  148.    GET_CURRENT_CONTEXT(ctx);
  149.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  150.  
  151.    if (MESA_VERBOSE&VERBOSE_API)
  152.       _mesa_debug(ctx, "glPolygonStipple\n");
  153.  
  154.    FLUSH_VERTICES(ctx, _NEW_POLYGONSTIPPLE);
  155.    _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
  156.  
  157.    if (ctx->Driver.PolygonStipple)
  158.       ctx->Driver.PolygonStipple( ctx, (const GLubyte *) ctx->PolygonStipple );
  159. }
  160.  
  161.  
  162.  
  163. void
  164. _mesa_GetPolygonStipple( GLubyte *dest )
  165. {
  166.    GET_CURRENT_CONTEXT(ctx);
  167.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  168.  
  169.    if (MESA_VERBOSE&VERBOSE_API)
  170.       _mesa_debug(ctx, "glGetPolygonStipple\n");
  171.  
  172.    _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
  173. }
  174.  
  175.  
  176.  
  177. void
  178. _mesa_PolygonOffset( GLfloat factor, GLfloat units )
  179. {
  180.    GET_CURRENT_CONTEXT(ctx);
  181.    ASSERT_OUTSIDE_BEGIN_END(ctx);
  182.  
  183.    if (MESA_VERBOSE&VERBOSE_API)
  184.       _mesa_debug(ctx, "glPolygonOffset %f %f\n", factor, units);
  185.  
  186.    if (ctx->Polygon.OffsetFactor == factor &&
  187.        ctx->Polygon.OffsetUnits == units)
  188.       return;
  189.  
  190.    FLUSH_VERTICES(ctx, _NEW_POLYGON);
  191.    ctx->Polygon.OffsetFactor = factor;
  192.    ctx->Polygon.OffsetUnits = units;
  193.  
  194.    if (ctx->Driver.PolygonOffset)
  195.       ctx->Driver.PolygonOffset( ctx, factor, units );
  196. }
  197.  
  198.  
  199.  
  200. void
  201. _mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
  202. {
  203.    GET_CURRENT_CONTEXT(ctx);
  204.    _mesa_PolygonOffset(factor, bias * ctx->DepthMaxF );
  205. }
  206.