Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  7.3
  4.  *
  5.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  21.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  22.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25.  
  26. #ifndef _M_XFORM_H
  27. #define _M_XFORM_H
  28.  
  29.  
  30. #include "main/compiler.h"
  31. #include "main/glheader.h"
  32. #include "math/m_matrix.h"
  33. #include "math/m_vector.h"
  34.  
  35. #ifdef USE_X86_ASM
  36. #define _XFORMAPI _ASMAPI
  37. #define _XFORMAPIP _ASMAPIP
  38. #else
  39. #define _XFORMAPI
  40. #define _XFORMAPIP *
  41. #endif
  42.  
  43.  
  44. extern void
  45. _math_init_transformation(void);
  46. extern void
  47. init_c_cliptest(void);
  48.  
  49. /* KW: Clip functions now do projective divide as well.  The projected
  50.  * coordinates are very useful to us because they let us cull
  51.  * backfaces and eliminate vertices from lighting, fogging, etc
  52.  * calculations.  Despite the fact that this divide could be done one
  53.  * day in hardware, we would still have a reason to want to do it here
  54.  * as long as those other calculations remain in software.
  55.  *
  56.  * Clipping is a convenient place to do the divide on x86 as it should be
  57.  * possible to overlap with integer outcode calculations.
  58.  *
  59.  * There are two cases where we wouldn't want to do the divide in cliptest:
  60.  *    - When we aren't clipping.  We still might want to cull backfaces
  61.  *      so the divide should be done elsewhere.  This currently never
  62.  *      happens.
  63.  *
  64.  *    - When culling isn't likely to help us, such as when the GL culling
  65.  *      is disabled and we not lighting or are only lighting
  66.  *      one-sided.  In this situation, backface determination provides
  67.  *      us with no useful information.  A tricky case to detect is when
  68.  *      all input data is already culled, although hopefully the
  69.  *      application wouldn't turn on culling in such cases.
  70.  *
  71.  * We supply a buffer to hold the [x/w,y/w,z/w,1/w] values which
  72.  * are the result of the projection.  This is only used in the
  73.  * 4-vector case - in other cases, we just use the clip coordinates
  74.  * as the projected coordinates - they are identical.
  75.  *
  76.  * This is doubly convenient because it means the Win[] array is now
  77.  * of the same stride as all the others, so I can now turn map_vertices
  78.  * into a straight-forward matrix transformation, with asm acceleration
  79.  * automatically available.
  80.  */
  81.  
  82. /* Vertex buffer clipping flags
  83.  */
  84. #define CLIP_RIGHT_SHIFT        0
  85. #define CLIP_LEFT_SHIFT         1
  86. #define CLIP_TOP_SHIFT          2
  87. #define CLIP_BOTTOM_SHIFT       3
  88. #define CLIP_NEAR_SHIFT         4
  89. #define CLIP_FAR_SHIFT          5
  90.  
  91. #define CLIP_RIGHT_BIT   0x01
  92. #define CLIP_LEFT_BIT    0x02
  93. #define CLIP_TOP_BIT     0x04
  94. #define CLIP_BOTTOM_BIT  0x08
  95. #define CLIP_NEAR_BIT    0x10
  96. #define CLIP_FAR_BIT     0x20
  97. #define CLIP_USER_BIT    0x40
  98. #define CLIP_CULL_BIT    0x80
  99. #define CLIP_FRUSTUM_BITS    0x3f
  100.  
  101.  
  102. typedef GLvector4f * (_XFORMAPIP clip_func)( GLvector4f *vClip,
  103.                                              GLvector4f *vProj,
  104.                                              GLubyte clipMask[],
  105.                                              GLubyte *orMask,
  106.                                              GLubyte *andMask,
  107.                                              GLboolean viewport_z_clip );
  108.  
  109. typedef void (*dotprod_func)( GLfloat *out,
  110.                               GLuint out_stride,
  111.                               CONST GLvector4f *coord_vec,
  112.                               CONST GLfloat plane[4] );
  113.  
  114. typedef void (*vec_copy_func)( GLvector4f *to,
  115.                                CONST GLvector4f *from );
  116.  
  117.  
  118.  
  119. /*
  120.  * Functions for transformation of normals in the VB.
  121.  */
  122. typedef void (_NORMAPIP normal_func)( CONST GLmatrix *mat,
  123.                                       GLfloat scale,
  124.                                       CONST GLvector4f *in,
  125.                                       CONST GLfloat lengths[],
  126.                                       GLvector4f *dest );
  127.  
  128.  
  129. /* Flags for selecting a normal transformation function.
  130.  */
  131. #define NORM_RESCALE   0x1              /* apply the scale factor */
  132. #define NORM_NORMALIZE 0x2              /* normalize */
  133. #define NORM_TRANSFORM 0x4              /* apply the transformation matrix */
  134. #define NORM_TRANSFORM_NO_ROT 0x8       /* apply the transformation matrix */
  135.  
  136.  
  137.  
  138.  
  139. /* KW: New versions of the transform function allow a mask array
  140.  *     specifying that individual vector transform should be skipped
  141.  *     when the mask byte is zero.  This is always present as a
  142.  *     parameter, to allow a unified interface.
  143.  */
  144. typedef void (_XFORMAPIP transform_func)( GLvector4f *to_vec,
  145.                                           CONST GLfloat m[16],
  146.                                           CONST GLvector4f *from_vec );
  147.  
  148.  
  149. extern dotprod_func  _mesa_dotprod_tab[5];
  150. extern vec_copy_func _mesa_copy_tab[0x10];
  151. extern vec_copy_func _mesa_copy_clean_tab[5];
  152. extern clip_func     _mesa_clip_tab[5];
  153. extern clip_func     _mesa_clip_np_tab[5];
  154. extern normal_func   _mesa_normal_tab[0xf];
  155.  
  156. /* Use of 2 layers of linked 1-dimensional arrays to reduce
  157.  * cost of lookup.
  158.  */
  159. extern transform_func *_mesa_transform_tab[5];
  160.  
  161.  
  162.  
  163. #define TransformRaw( to, mat, from ) \
  164.    ( _mesa_transform_tab[(from)->size][(mat)->type]( to, (mat)->m, from ), \
  165.      (to) )
  166.  
  167.  
  168. #endif
  169.