13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Mesa 3-D graphics library
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Version:  3.5
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the "Software"),
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * to deal in the Software without restriction, including without limitation
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Software is furnished to do so, subject to the following conditions:
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice shall be included
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * in all copies or substantial portions of the Software.
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * New (3.1) transformation code written by Keith Whitwell.
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Note - respects the stride of the output vector.
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void TAG(dotprod_vec2)( GLfloat *out,
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       GLuint outstride,
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLvector4f *coord_vec,
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLfloat plane[4] )
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint stride = coord_vec->stride;
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLfloat *coord = coord_vec->start;
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint count = coord_vec->count;
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint i;
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const GLfloat plane0 = plane[0], plane1 = plane[1], plane3 = plane[3];
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(out,outstride)) {
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      *out = (coord[0] * plane0 +
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[1] * plane1 +
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      plane3);
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void TAG(dotprod_vec3)( GLfloat *out,
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       GLuint outstride,
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLvector4f *coord_vec,
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLfloat plane[4] )
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint stride = coord_vec->stride;
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLfloat *coord = coord_vec->start;
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint count = coord_vec->count;
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint i;
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const GLfloat plane0 = plane[0], plane1 = plane[1], plane2 = plane[2];
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const GLfloat plane3 = plane[3];
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(out,outstride)) {
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      *out = (coord[0] * plane0 +
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[1] * plane1 +
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[2] * plane2 +
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      plane3);
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void TAG(dotprod_vec4)( GLfloat *out,
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       GLuint outstride,
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLvector4f *coord_vec,
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			       const GLfloat plane[4] )
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint stride = coord_vec->stride;
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLfloat *coord = coord_vec->start;
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint count = coord_vec->count;
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   GLuint i;
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const GLfloat plane0 = plane[0], plane1 = plane[1], plane2 = plane[2];
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const GLfloat plane3 = plane[3];
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(out,outstride)) {
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      *out = (coord[0] * plane0 +
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[1] * plane1 +
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[2] * plane2 +
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      coord[3] * plane3);
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void TAG(init_dotprod)( void )
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   _mesa_dotprod_tab[2] = TAG(dotprod_vec2);
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   _mesa_dotprod_tab[3] = TAG(dotprod_vec3);
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   _mesa_dotprod_tab[4] = TAG(dotprod_vec4);
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
103