ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

t_dd_imm_vapi.h
Go to the documentation of this file.
00001 
00002 /*
00003  * Mesa 3-D graphics library
00004  * Version:  3.5
00005  *
00006  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
00007  *
00008  * Permission is hereby granted, free of charge, to any person obtaining a
00009  * copy of this software and associated documentation files (the "Software"),
00010  * to deal in the Software without restriction, including without limitation
00011  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00012  * and/or sell copies of the Software, and to permit persons to whom the
00013  * Software is furnished to do so, subject to the following conditions:
00014  *
00015  * The above copyright notice and this permission notice shall be included
00016  * in all copies or substantial portions of the Software.
00017  *
00018  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00019  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00020  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
00021  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
00022  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
00023  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00024  *
00025  * Authors:
00026  *    Gareth Hughes <gareth@valinux.com>
00027  *    Keith Whitwell <keithw@valinux.com>
00028  */
00029 
00030 /* Template for immediate mode vertex functions.
00031  */
00032 
00033 #define DBG 0
00034 
00035 #define VERTEX( ox, oy, oz, ow )
00036 do {
00037    GET_CURRENT_VERTEX;
00038    GLfloat w;
00039    GLuint mask;
00040    const GLfloat * const m = ctx->_ModelProjectMatrix.m;
00041 
00042    if (DO_FULL_MATRIX) {
00043       VERTEX_CLIP(0) = m[0] * ox + m[4] * oy + m[8]  * oz + m[12] * ow;
00044       VERTEX_CLIP(1) = m[1] * ox + m[5] * oy + m[9]  * oz + m[13] * ow;
00045       VERTEX_CLIP(2) = m[2] * ox + m[6] * oy + m[10] * oz + m[14] * ow;
00046       VERTEX_CLIP(3) = m[3] * ox + m[7] * oy + m[11] * oz + m[15] * ow;
00047       w = VERTEX_CLIP(3);
00048    }
00049    else if (DO_NOROT_MATRIX) {
00050       VERTEX_CLIP(0) = m[0] * ox                          + m[12] * ow;
00051       VERTEX_CLIP(1) =             m[5] * oy              + m[13] * ow;
00052       VERTEX_CLIP(2) =                         m[10] * oz + m[14] * ow;
00053       VERTEX_CLIP(3) =                                              ow;
00054       w = ow;
00055    } 
00056    else {
00057       ASSERT (DO_IDENTITY_MATRIX);
00058       VERTEX_CLIP(0) = ox;
00059       VERTEX_CLIP(1) = oy;
00060       VERTEX_CLIP(2) = oz;
00061       VERTEX_CLIP(3) = ow;
00062       w = ow;
00063    }
00064 
00065    mask = 0;
00066    if (DO_CLIP_TEST) {
00067       if ( VERTEX_CLIP(0) >  w ) mask |= CLIP_RIGHT_BIT;
00068       if ( VERTEX_CLIP(0) < -w ) mask |= CLIP_LEFT_BIT;
00069       if ( VERTEX_CLIP(1) >  w ) mask |= CLIP_TOP_BIT;
00070       if ( VERTEX_CLIP(1) < -w ) mask |= CLIP_BOTTOM_BIT;
00071       if ( VERTEX_CLIP(2) >  w ) mask |= CLIP_FAR_BIT;
00072       if ( VERTEX_CLIP(2) < -w ) mask |= CLIP_NEAR_BIT;
00073       VERTEX_MASK(v) = mask;
00074    }
00075 
00076    if (!mask) {
00077       if (HAVE_VERTEX_WIN) {
00078      if (!HAVE_HW_VIEWPORT) {
00079         const GLfloat *s = GET_VIEWPORT_MATRIX();
00080         if (HAVE_W && HAVE_HW_DIVIDE) {
00081            VERTEX_WIN( 0 ) = s[0]  * VERTEX_CLIP( 0 ) + s[12];
00082            VERTEX_WIN( 1 ) = s[5]  * VERTEX_CLIP( 1 ) + s[13];
00083            VERTEX_WIN( 2 ) = s[10] * VERTEX_CLIP( 2 ) + s[14];
00084            VERTEX_WIN( 3 ) = w;
00085         }
00086         else {
00087            const GLfloat oow = 1.0/w; /* possibly opt away */
00088            VERTEX_WIN( 0 ) = s[0]  * VERTEX_CLIP( 0 ) * oow + s[12];
00089            VERTEX_WIN( 1 ) = s[5]  * VERTEX_CLIP( 1 ) * oow + s[13];
00090            VERTEX_WIN( 2 ) = s[10] * VERTEX_CLIP( 2 ) * oow + s[14];
00091            if (HAVE_W)
00092           VERTEX_WIN( 3 ) = oow;
00093         }
00094      }
00095      else if (HAVE_W && HAVE_HW_DIVIDE) {
00096         if (!VERTEX_WIN_IS_VERTEX_CLIP) {
00097            VERTEX_WIN( 0 ) = VERTEX_CLIP( 0 );
00098            VERTEX_WIN( 1 ) = VERTEX_CLIP( 1 );
00099            VERTEX_WIN( 2 ) = VERTEX_CLIP( 2 );
00100            VERTEX_WIN( 3 ) = w;
00101         }
00102      }
00103      else {
00104         const GLfloat oow = 1.0/w; /* possibly opt away */
00105         VERTEX_WIN( 0 ) = VERTEX_CLIP( 0 ) * oow;
00106         VERTEX_WIN( 1 ) = VERTEX_CLIP( 1 ) * oow;
00107         VERTEX_WIN( 2 ) = VERTEX_CLIP( 2 ) * oow;
00108         if (HAVE_W)
00109            VERTEX_WIN( 3 ) = oow;
00110      }
00111       }
00112    } else if (!FALLBACK_OR_CLIPPING) {
00113       SET_CLIPPING();       /* transition to clipping */
00114    }
00115 
00116    COPY_VERTEX_FROM_CURRENT;
00117    BUILD_PRIM_FROM_VERTEX;
00118 }
00119 
00120 /* Let the compiler optimize away the constant operations:
00121  */
00122 static void VTAG(Vertex2f)( GLfloat ox, GLfloat oy )
00123 {
00124    /* Cliptest on clip[2] could also be eliminated...
00125     */
00126    VERTEX( ox, oy, 0, 1 );
00127 }
00128 
00129 static void VTAG(Vertex2fv)( const GLfloat *obj )
00130 {
00131    /* Cliptest on clip[2] could also be eliminated...
00132     */
00133    VERTEX( obj[0], obj[1], 0, 1 );
00134 }
00135 
00136 static void VTAG(Vertex3f)( GLfloat ox, GLfloat oy, GLfloat oz )
00137 {
00138    VERTEX( ox, oy, oz, 1 );
00139 }
00140 
00141 static void VTAG(Vertex3fv)( const GLfloat *obj )
00142 {
00143    VERTEX( obj[0], obj[1], obj[2], 1 );
00144 }
00145 
00146 static void VTAG(Vertex4f)( GLfloat ox, GLfloat oy, GLfloat oz, GLfloat ow )
00147 {
00148    VERTEX( ox, oy, oz, ow );
00149 }
00150 
00151 static void VTAG(Vertex4fv)( const GLfloat *obj )
00152 {
00153    VERTEX( obj[0], obj[1], obj[2], obj[3] );
00154 }
00155 
00156 
00157 #undef DO_FULL_MATRIX
00158 #undef VTAG
00159 #undef VERTEX

Generated on Sun May 27 2012 04:20:47 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.