/************************************************************************** * * * Copyright (C) 1994, Silicon Graphics, Inc. * * * * These coded instructions, statements, and computer programs contain * * unpublished proprietary information of Silicon Graphics, Inc., and * * are protected by Federal copyright law. They may not be disclosed * * to third parties or copied or duplicated in any form, in whole or * * in part, without the prior written consent of Silicon Graphics, Inc. * * * **************************************************************************/ /* Minor modifications */ #include #define FTOFRAC8(x) ((int) MIN(((x) * (128.0)), 127.0) & 0xff) void guLookAtReflectF(float mf[4][4], LookAt *l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, float yUp, float zUp) { float len, xLook, yLook, zLook, xRight, yRight, zRight; guMtxIdentF(mf); xLook = xAt - xEye; yLook = yAt - yEye; zLook = zAt - zEye; /* Negate because positive Z is behind us: */ len = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook); xLook *= len; yLook *= len; zLook *= len; /* Right = Up x Look */ xRight = yUp * zLook - zUp * yLook; yRight = zUp * xLook - xUp * zLook; zRight = xUp * yLook - yUp * xLook; len = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight); xRight *= len; yRight *= len; zRight *= len; /* Up = Look x Right */ xUp = yLook * zRight - zLook * yRight; yUp = zLook * xRight - xLook * zRight; zUp = xLook * yRight - yLook * xRight; len = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp); xUp *= len; yUp *= len; zUp *= len; /* reflectance vectors = Up and Right */ l->l[0].l.dir[0] = FTOFRAC8(xRight); l->l[0].l.dir[1] = FTOFRAC8(yRight); l->l[0].l.dir[2] = FTOFRAC8(zRight); l->l[1].l.dir[0] = FTOFRAC8(xUp); l->l[1].l.dir[1] = FTOFRAC8(yUp); l->l[1].l.dir[2] = FTOFRAC8(zUp); l->l[0].l.col[0] = 0x00; l->l[0].l.col[1] = 0x00; l->l[0].l.col[2] = 0x00; l->l[0].l.pad1 = 0x00; l->l[0].l.colc[0] = 0x00; l->l[0].l.colc[1] = 0x00; l->l[0].l.colc[2] = 0x00; l->l[0].l.pad2 = 0x00; l->l[1].l.col[0] = 0x00; l->l[1].l.col[1] = 0x80; l->l[1].l.col[2] = 0x00; l->l[1].l.pad1 = 0x00; l->l[1].l.colc[0] = 0x00; l->l[1].l.colc[1] = 0x80; l->l[1].l.colc[2] = 0x00; l->l[1].l.pad2 = 0x00; mf[0][0] = xRight; mf[1][0] = yRight; mf[2][0] = zRight; mf[3][0] = -(xEye * xRight + yEye * yRight + zEye * zRight); mf[0][1] = xUp; mf[1][1] = yUp; mf[2][1] = zUp; mf[3][1] = -(xEye * xUp + yEye * yUp + zEye * zUp); mf[0][2] = xLook; mf[1][2] = yLook; mf[2][2] = zLook; mf[3][2] = -(xEye * xLook + yEye * yLook + zEye * zLook); mf[0][3] = 0; mf[1][3] = 0; mf[2][3] = 0; mf[3][3] = 1; } void guLookAtReflect(Mtx *m, LookAt *l, float xEye, float yEye, float zEye, float xAt, float yAt, float zAt, float xUp, float yUp, float zUp) { float mf[4][4]; guLookAtReflectF(mf, l, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp); guMtxF2L(mf, m); }