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