polygon.c revision 7c652d77220610ecc19aaefa20876216b035e961
17c652d77220610ecc19aaefa20876216b035e961Brian Paul/* $Id: polygon.c,v 1.10 2000/03/13 18:31:51 brianp Exp $ */
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
5fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Version:  3.3
6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
77c652d77220610ecc19aaefa20876216b035e961Brian Paul * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg *
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER
29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h"
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else
31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "image.h"
34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h"
35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "macros.h"
36fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "polygon.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "types.h"
39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif
40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
43fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
44fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CullFace( GLenum mode )
45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
46fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
47afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCullFace");
48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glCullFace %s\n", gl_lookup_enum_by_nr(mode));
51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode!=GL_FRONT && mode!=GL_BACK && mode!=GL_FRONT_AND_BACK) {
53afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gl_error( ctx, GL_INVALID_ENUM, "glCullFace" );
54afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
55afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
56afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
57afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Polygon.CullFaceMode = mode;
58afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->NewState |= NEW_POLYGON;
59afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
60afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Driver.CullFace)
61afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.CullFace( ctx, mode );
62afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
63afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
64afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
65afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
66fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
67fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_FrontFace( GLenum mode )
68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
69fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFrontFace");
71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glFrontFace %s\n", gl_lookup_enum_by_nr(mode));
74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
75afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (mode!=GL_CW && mode!=GL_CCW) {
76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gl_error( ctx, GL_INVALID_ENUM, "glFrontFace" );
77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
7914f8b8b5c3316117651eef2c705da37e3047d472Keith Whitwell
80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Polygon.FrontFace = mode;
8199f16d01dd508ccac9d37488bf83a7aed5c05832Brian Paul   ctx->Polygon.FrontBit = (GLboolean) (mode == GL_CW);
8214f8b8b5c3316117651eef2c705da37e3047d472Keith Whitwell   ctx->NewState |= NEW_POLYGON;
83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Driver.FrontFace)
85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Driver.FrontFace( ctx, mode );
86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
90fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
91fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PolygonMode( GLenum face, GLenum mode )
92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
93fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonMode");
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glPolygonMode %s %s\n",
98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	      gl_lookup_enum_by_nr(face),
99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg	      gl_lookup_enum_by_nr(mode));
100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (face!=GL_FRONT && face!=GL_BACK && face!=GL_FRONT_AND_BACK) {
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(face)" );
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else if (mode!=GL_POINT && mode!=GL_LINE && mode!=GL_FILL) {
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      gl_error( ctx, GL_INVALID_ENUM, "glPolygonMode(mode)" );
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (face==GL_FRONT || face==GL_FRONT_AND_BACK) {
111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Polygon.FrontMode = mode;
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (face==GL_BACK || face==GL_FRONT_AND_BACK) {
114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Polygon.BackMode = mode;
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Compute a handy "shortcut" value: */
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->TriangleCaps &= ~DD_TRI_UNFILLED;
119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Polygon.Unfilled = GL_FALSE;
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Polygon.FrontMode!=GL_FILL || ctx->Polygon.BackMode!=GL_FILL) {
122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->Polygon.Unfilled = GL_TRUE;
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->TriangleCaps |= DD_TRI_UNFILLED;
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->NewState |= (NEW_POLYGON | NEW_RASTER_OPS);
127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Driver.PolygonMode) {
129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      (*ctx->Driver.PolygonMode)( ctx, face, mode );
130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * NOTE:  stipple pattern has already been unpacked.
137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
138fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
1397c652d77220610ecc19aaefa20876216b035e961Brian Paul_mesa_PolygonStipple( const GLubyte *pattern )
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
141fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonStipple");
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glPolygonStipple\n");
146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1477c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_unpack_polygon_stipple(pattern, ctx->PolygonStipple, &ctx->Unpack);
148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (ctx->Polygon.StippleFlag) {
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      ctx->NewState |= NEW_RASTER_OPS;
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
152e5ed37fa4ed1cf2323b50d96eafb1dc00c1d6d42Keith Whitwell
153e5ed37fa4ed1cf2323b50d96eafb1dc00c1d6d42Keith Whitwell   if (ctx->Driver.PolygonStipple)
1547c652d77220610ecc19aaefa20876216b035e961Brian Paul      ctx->Driver.PolygonStipple( ctx, (const GLubyte *) ctx->PolygonStipple );
155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
159fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
160fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GetPolygonStipple( GLubyte *dest )
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
162fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glGetPolygonStipple\n");
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1687c652d77220610ecc19aaefa20876216b035e961Brian Paul   _mesa_pack_polygon_stipple(ctx->PolygonStipple, dest, &ctx->Pack);
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
173fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
174fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PolygonOffset( GLfloat factor, GLfloat units )
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
176fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffset");
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&VERBOSE_API)
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      fprintf(stderr, "glPolygonOffset %f %f\n", factor, units);
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Polygon.OffsetFactor = factor;
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   ctx->Polygon.OffsetUnits = units;
184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
186fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
187fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid
188fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_PolygonOffsetEXT( GLfloat factor, GLfloat bias )
189fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul{
190ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul   GET_CURRENT_CONTEXT(ctx);
191ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glPolygonOffsetEXT");
192ed30dfa1264ec8875a3162c3c8778bc703bf11d5Brian Paul   _mesa_PolygonOffset(factor, bias * ctx->Visual->DepthMaxF );
193fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul}
194fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
195