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.0
  4.  *
  5.  * Copyright (C) 1999-2007  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. #include "main/glheader.h"
  26. #include "main/colormac.h"
  27. #include "main/feedback.h"
  28. #include "main/macros.h"
  29.  
  30. #include "s_context.h"
  31. #include "s_feedback.h"
  32. #include "s_triangle.h"
  33.  
  34.  
  35.  
  36. static void
  37. feedback_vertex(struct gl_context * ctx, const SWvertex * v, const SWvertex * pv)
  38. {
  39.    GLfloat win[4];
  40.    const GLfloat *vtc = v->attrib[FRAG_ATTRIB_TEX0];
  41.    const GLfloat *color = v->attrib[FRAG_ATTRIB_COL0];
  42.  
  43.    win[0] = v->attrib[FRAG_ATTRIB_WPOS][0];
  44.    win[1] = v->attrib[FRAG_ATTRIB_WPOS][1];
  45.    win[2] = v->attrib[FRAG_ATTRIB_WPOS][2] / ctx->DrawBuffer->_DepthMaxF;
  46.    win[3] = 1.0F / v->attrib[FRAG_ATTRIB_WPOS][3];
  47.  
  48.    _mesa_feedback_vertex(ctx, win, color, vtc);
  49. }
  50.  
  51.  
  52. /*
  53.  * Put triangle in feedback buffer.
  54.  */
  55. void
  56. _swrast_feedback_triangle(struct gl_context *ctx, const SWvertex *v0,
  57.                           const SWvertex *v1, const SWvertex *v2)
  58. {
  59.    if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
  60.       _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN);
  61.       _mesa_feedback_token(ctx, (GLfloat) 3); /* three vertices */
  62.  
  63.       if (ctx->Light.ShadeModel == GL_SMOOTH) {
  64.          feedback_vertex(ctx, v0, v0);
  65.          feedback_vertex(ctx, v1, v1);
  66.          feedback_vertex(ctx, v2, v2);
  67.       }
  68.       else {
  69.          feedback_vertex(ctx, v0, v2);
  70.          feedback_vertex(ctx, v1, v2);
  71.          feedback_vertex(ctx, v2, v2);
  72.       }
  73.    }
  74. }
  75.  
  76.  
  77. void
  78. _swrast_feedback_line(struct gl_context *ctx, const SWvertex *v0,
  79.                       const SWvertex *v1)
  80. {
  81.    GLenum token = GL_LINE_TOKEN;
  82.    SWcontext *swrast = SWRAST_CONTEXT(ctx);
  83.  
  84.    if (swrast->StippleCounter == 0)
  85.       token = GL_LINE_RESET_TOKEN;
  86.  
  87.    _mesa_feedback_token(ctx, (GLfloat) (GLint) token);
  88.  
  89.    if (ctx->Light.ShadeModel == GL_SMOOTH) {
  90.       feedback_vertex(ctx, v0, v0);
  91.       feedback_vertex(ctx, v1, v1);
  92.    }
  93.    else {
  94.       feedback_vertex(ctx, v0, v1);
  95.       feedback_vertex(ctx, v1, v1);
  96.    }
  97.  
  98.    swrast->StippleCounter++;
  99. }
  100.  
  101.  
  102. void
  103. _swrast_feedback_point(struct gl_context *ctx, const SWvertex *v)
  104. {
  105.    _mesa_feedback_token(ctx, (GLfloat) (GLint) GL_POINT_TOKEN);
  106.    feedback_vertex(ctx, v, v);
  107. }
  108.  
  109.  
  110. void
  111. _swrast_select_triangle(struct gl_context *ctx, const SWvertex *v0,
  112.                         const SWvertex *v1, const SWvertex *v2)
  113. {
  114.    if (!_swrast_culltriangle(ctx, v0, v1, v2)) {
  115.       const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
  116.  
  117.       _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  118.       _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  119.       _mesa_update_hitflag( ctx, v2->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  120.    }
  121. }
  122.  
  123.  
  124. void
  125. _swrast_select_line(struct gl_context *ctx, const SWvertex *v0, const SWvertex *v1)
  126. {
  127.    const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
  128.    _mesa_update_hitflag( ctx, v0->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  129.    _mesa_update_hitflag( ctx, v1->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  130. }
  131.  
  132.  
  133. void
  134. _swrast_select_point(struct gl_context *ctx, const SWvertex *v)
  135. {
  136.    const GLfloat zs = 1.0F / ctx->DrawBuffer->_DepthMaxF;
  137.    _mesa_update_hitflag( ctx, v->attrib[FRAG_ATTRIB_WPOS][2] * zs );
  138. }
  139.