mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
787 lines
16 KiB
787 lines
16 KiB
/*
|
|
** Copyright 1991, Silicon Graphics, Inc.
|
|
** All Rights Reserved.
|
|
**
|
|
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
|
|
** the contents of this file may not be disclosed to third parties, copied or
|
|
** duplicated in any form, in whole or in part, without the prior written
|
|
** permission of Silicon Graphics, Inc.
|
|
**
|
|
** RESTRICTED RIGHTS LEGEND:
|
|
** Use, duplication or disclosure by the Government is subject to restrictions
|
|
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
|
|
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
|
|
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
|
|
** rights reserved under the Copyright Laws of the United States.
|
|
**
|
|
** Transformation procedures.
|
|
**
|
|
** $Revision: 1.38 $
|
|
** $Date: 1993/11/29 20:34:48 $
|
|
*/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#include "mips.h"
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** Note: These xform routines must allow for the case where the result
|
|
** vector is equal to the source vector.
|
|
*/
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has y=0, z=0 and w=1.
|
|
*/
|
|
|
|
void FASTCALL __glXForm1(__GLcoord *res, const __GLfloat v[1], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat mat00, mat01, mat02, mat03;
|
|
__GLfloat mat30, mat31, mat32, mat33;
|
|
__GLfloat xm00, xm01, xm02, xm03;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
mat03 = m->matrix[0][3];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
mat33 = m->matrix[3][3];
|
|
|
|
xm00 = x * mat00;
|
|
xm01 = x * mat01;
|
|
xm02 = x * mat02;
|
|
xm03 = x * mat03;
|
|
|
|
xm00 += mat30;
|
|
xm01 += mat31;
|
|
xm02 += mat32;
|
|
xm03 += mat33;
|
|
|
|
res->x = xm00;
|
|
res->y = xm01;
|
|
res->z = xm02;
|
|
res->w = xm03;
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has z=0 and w=1
|
|
*/
|
|
|
|
void FASTCALL __glXForm2(__GLcoord *res, const __GLfloat v[2], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat mat00, mat01, mat02, mat03;
|
|
__GLfloat mat10, mat11, mat12, mat13;
|
|
__GLfloat mat30, mat31, mat32, mat33;
|
|
__GLfloat xm00, xm01, xm02, xm03;
|
|
__GLfloat ym10, ym11, ym12, ym13;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
mat03 = m->matrix[0][3];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
mat13 = m->matrix[1][3];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
mat33 = m->matrix[3][3];
|
|
|
|
xm00 = x * mat00;
|
|
xm01 = x * mat01;
|
|
xm02 = x * mat02;
|
|
xm03 = x * mat03;
|
|
|
|
ym10 = y * mat10;
|
|
ym11 = y * mat11;
|
|
ym12 = y * mat12;
|
|
ym13 = y * mat13;
|
|
|
|
xm00 += mat30;
|
|
xm01 += mat31;
|
|
xm02 += mat32;
|
|
xm03 += mat33;
|
|
|
|
xm00 += ym10;
|
|
xm01 += ym11;
|
|
xm02 += ym12;
|
|
xm03 += ym13;
|
|
|
|
res->x = xm00;
|
|
res->y = xm01;
|
|
res->z = xm02;
|
|
res->w = xm03;
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has w=1.
|
|
*/
|
|
|
|
void FASTCALL __glXForm3(__GLcoord *res, const __GLfloat v[3], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat mat00, mat01, mat02, mat03;
|
|
__GLfloat mat10, mat11, mat12, mat13;
|
|
__GLfloat mat20, mat21, mat22, mat23;
|
|
__GLfloat mat30, mat31, mat32, mat33;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
mat03 = m->matrix[0][3];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
mat13 = m->matrix[1][3];
|
|
|
|
mat20 = m->matrix[2][0];
|
|
mat21 = m->matrix[2][1];
|
|
mat22 = m->matrix[2][2];
|
|
mat23 = m->matrix[2][3];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
mat33 = m->matrix[3][3];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
mat03 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
mat12 *= y;
|
|
mat13 *= y;
|
|
|
|
mat20 *= z;
|
|
mat21 *= z;
|
|
mat22 *= z;
|
|
mat23 *= z;
|
|
|
|
mat00 += mat10;
|
|
mat01 += mat11;
|
|
mat02 += mat12;
|
|
mat03 += mat13;
|
|
|
|
mat20 += mat30;
|
|
mat21 += mat31;
|
|
mat22 += mat32;
|
|
mat23 += mat33;
|
|
|
|
res->x = mat00 + mat20;
|
|
res->y = mat01 + mat21;
|
|
res->z = mat02 + mat22;
|
|
res->w = mat03 + mat23;
|
|
}
|
|
|
|
/*
|
|
** Full 4x4 transformation.
|
|
*/
|
|
|
|
void FASTCALL __glXForm4(__GLcoord *res, const __GLfloat v[4], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat w = v[3];
|
|
|
|
__GLfloat mat00, mat01, mat02, mat03;
|
|
__GLfloat mat10, mat11, mat12, mat13;
|
|
__GLfloat mat20, mat21, mat22, mat23;
|
|
__GLfloat mat30, mat31, mat32, mat33;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
mat03 = m->matrix[0][3];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
mat13 = m->matrix[1][3];
|
|
|
|
mat20 = m->matrix[2][0];
|
|
mat21 = m->matrix[2][1];
|
|
mat22 = m->matrix[2][2];
|
|
mat23 = m->matrix[2][3];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
mat33 = m->matrix[3][3];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
mat03 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
mat12 *= y;
|
|
mat13 *= y;
|
|
|
|
mat20 *= z;
|
|
mat21 *= z;
|
|
mat22 *= z;
|
|
mat23 *= z;
|
|
|
|
if (w != ((__GLfloat) 1.0)) {
|
|
mat30 *= w;
|
|
mat31 *= w;
|
|
mat32 *= w;
|
|
mat33 *= w;
|
|
}
|
|
|
|
mat00 += mat10;
|
|
mat01 += mat11;
|
|
mat02 += mat12;
|
|
mat03 += mat13;
|
|
|
|
mat20 += mat30;
|
|
mat21 += mat31;
|
|
mat22 += mat32;
|
|
mat23 += mat33;
|
|
|
|
res->x = mat00 + mat20;
|
|
res->y = mat01 + mat21;
|
|
res->z = mat02 + mat22;
|
|
res->w = mat03 + mat23;
|
|
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has y=0, z=0 and w=1. The w column of the matrix is [0 0 0 1].
|
|
*/
|
|
|
|
void FASTCALL __glXForm1_W(__GLcoord *res, const __GLfloat v[1], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat mat00, mat01, mat02;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
|
|
res->x = mat00 + mat30;
|
|
res->y = mat01 + mat31;
|
|
res->z = mat02 + mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has z=0 and w=1. The w column of the matrix is [0 0 0 1].
|
|
*/
|
|
|
|
void FASTCALL __glXForm2_W(__GLcoord *res, const __GLfloat v[2], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat mat00, mat01, mat02;
|
|
__GLfloat mat10, mat11, mat12;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
mat12 *= y;
|
|
|
|
mat00 += mat30;
|
|
mat01 += mat31;
|
|
mat02 += mat32;
|
|
|
|
res->x = mat00 + mat10;
|
|
res->y = mat01 + mat11;
|
|
res->z = mat02 + mat12;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has w=1. The w column of the matrix is [0 0 0 1].
|
|
*/
|
|
|
|
void FASTCALL __glXForm3_W(__GLcoord *res, const __GLfloat v[3], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat mat00, mat01, mat02;
|
|
__GLfloat mat10, mat11, mat12;
|
|
__GLfloat mat20, mat21, mat22;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
|
|
mat20 = m->matrix[2][0];
|
|
mat21 = m->matrix[2][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
mat12 *= y;
|
|
|
|
mat20 *= z;
|
|
mat21 *= z;
|
|
mat22 *= z;
|
|
|
|
mat00 += mat30;
|
|
mat01 += mat31;
|
|
mat02 += mat32;
|
|
|
|
mat10 += mat20;
|
|
mat11 += mat21;
|
|
mat12 += mat22;
|
|
|
|
res->x = mat00 + mat10;
|
|
res->y = mat01 + mat11;
|
|
res->z = mat02 + mat12;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Full 4x4 transformation. The w column of the matrix is [0 0 0 1].
|
|
*/
|
|
|
|
void FASTCALL __glXForm4_W(__GLcoord *res, const __GLfloat v[4], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat w = v[3];
|
|
__GLfloat mat00, mat01, mat02;
|
|
__GLfloat mat10, mat11, mat12;
|
|
__GLfloat mat20, mat21, mat22;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat02 = m->matrix[0][2];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat12 = m->matrix[1][2];
|
|
|
|
mat20 = m->matrix[2][0];
|
|
mat21 = m->matrix[2][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat02 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
mat12 *= y;
|
|
|
|
mat20 *= z;
|
|
mat21 *= z;
|
|
mat22 *= z;
|
|
|
|
if (w != ((__GLfloat) 1.0)) {
|
|
mat30 *= w;
|
|
mat31 *= w;
|
|
mat32 *= w;
|
|
}
|
|
|
|
mat00 += mat10;
|
|
mat01 += mat11;
|
|
mat02 += mat12;
|
|
|
|
mat20 += mat30;
|
|
mat21 += mat31;
|
|
mat22 += mat32;
|
|
|
|
res->x = mat00 + mat20;
|
|
res->y = mat01 + mat21;
|
|
res->z = mat02 + mat22;
|
|
res->w = w;
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has y=0, z=0 and w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . . 0 0 |
|
|
** | . . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm1_2DW(__GLcoord *res, const __GLfloat v[1], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat mat00, mat01;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
|
|
res->x = mat00 + mat30;
|
|
res->y = mat01 + mat31;
|
|
res->z = mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has z=0 and w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . . 0 0 |
|
|
** | . . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm2_2DW(__GLcoord *res, const __GLfloat v[2],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat mat00, mat01;
|
|
__GLfloat mat10, mat11;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
|
|
mat00 += mat30;
|
|
mat01 += mat31;
|
|
|
|
res->x = mat00 + mat10;
|
|
res->y = mat01 + mat11;
|
|
res->z = mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . . 0 0 |
|
|
** | . . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm3_2DW(__GLcoord *res, const __GLfloat v[3],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat mat00, mat01;
|
|
__GLfloat mat10, mat11;
|
|
__GLfloat mat30, mat31;
|
|
__GLfloat mat22, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat22 *= z;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
|
|
mat00 += mat30;
|
|
mat01 += mat31;
|
|
|
|
res->x = mat00 + mat10;
|
|
res->y = mat01 + mat11;
|
|
res->z = mat22 + mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Full 4x4 transformation.
|
|
**
|
|
** The matrix looks like:
|
|
** | . . 0 0 |
|
|
** | . . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm4_2DW(__GLcoord *res, const __GLfloat v[4],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat w = v[3];
|
|
__GLfloat mat00, mat01, mat22;
|
|
__GLfloat mat10, mat11;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat01 = m->matrix[0][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat10 = m->matrix[1][0];
|
|
mat11 = m->matrix[1][1];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat01 *= x;
|
|
mat22 *= z;
|
|
|
|
mat10 *= y;
|
|
mat11 *= y;
|
|
|
|
if (w != ((__GLfloat) 1.0)) {
|
|
mat32 *= w;
|
|
}
|
|
|
|
mat00 += mat30;
|
|
mat01 += mat31;
|
|
|
|
res->x = mat00 + mat10;
|
|
res->y = mat01 + mat11;
|
|
res->z = mat22 + mat32;
|
|
res->w = w;
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has y=0, z=0 and w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . 0 0 0 |
|
|
** | 0 . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm1_2DNRW(__GLcoord *res, const __GLfloat v[1], const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat mat00, mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
|
|
res->x = mat00 + mat30;
|
|
res->y = mat31;
|
|
res->z = mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has z=0 and w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . 0 0 0 |
|
|
** | 0 . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm2_2DNRW(__GLcoord *res, const __GLfloat v[2],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat mat00, mat30;
|
|
__GLfloat mat11, mat31;
|
|
__GLfloat mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat11 *= y;
|
|
res->x = mat00 + mat30;
|
|
res->y = mat11 + mat31;
|
|
res->z = mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Avoid some transformation computations by knowing that the incoming
|
|
** vertex has w=1.
|
|
**
|
|
** The matrix looks like:
|
|
** | . 0 0 0 |
|
|
** | 0 . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm3_2DNRW(__GLcoord *res, const __GLfloat v[3],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat mat00, mat11, mat22;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat11 *= y;
|
|
mat22 *= z;
|
|
|
|
res->x = mat00 + mat30;
|
|
res->y = mat11 + mat31;
|
|
res->z = mat22 + mat32;
|
|
res->w = ((__GLfloat) 1.0);
|
|
}
|
|
|
|
/*
|
|
** Full 4x4 transformation.
|
|
**
|
|
** The matrix looks like:
|
|
** | . 0 0 0 |
|
|
** | 0 . 0 0 |
|
|
** | 0 0 . 0 |
|
|
** | . . . 1 |
|
|
*/
|
|
|
|
void FASTCALL __glXForm4_2DNRW(__GLcoord *res, const __GLfloat v[4],
|
|
const __GLmatrix *m)
|
|
{
|
|
__GLfloat x = v[0];
|
|
__GLfloat y = v[1];
|
|
__GLfloat z = v[2];
|
|
__GLfloat w = v[3];
|
|
__GLfloat mat00, mat11, mat22;
|
|
__GLfloat mat30, mat31, mat32;
|
|
|
|
mat00 = m->matrix[0][0];
|
|
mat11 = m->matrix[1][1];
|
|
mat22 = m->matrix[2][2];
|
|
|
|
mat30 = m->matrix[3][0];
|
|
mat31 = m->matrix[3][1];
|
|
mat32 = m->matrix[3][2];
|
|
|
|
mat00 *= x;
|
|
mat11 *= y;
|
|
mat22 *= z;
|
|
|
|
|
|
|
|
if (w != ((__GLfloat) 1.0)) {
|
|
mat30 *= w;
|
|
mat31 *= w;
|
|
mat32 *= w;
|
|
}
|
|
|
|
res->x = mat00 + mat30;
|
|
res->y = mat11 + mat31;
|
|
res->z = mat22 + mat32;
|
|
res->w = w;
|
|
}
|
|
|