summaryrefslogtreecommitdiff
path: root/src/libultra_code_O2/guLookAtHilite.c
diff options
context:
space:
mode:
authorRandom <28494085+Random06457@users.noreply.github.com>2020-10-03 17:22:44 +0200
committerGitHub <noreply@github.com>2020-10-03 11:22:44 -0400
commit174af7384d1cfcbf15da02d9069bf02bdc433c20 (patch)
treee4fb18346f71047c123ec4d34a80ae7e4d8ab9ea /src/libultra_code_O2/guLookAtHilite.c
parent6136ee6debd570a63fc695a6f4664553303f2324 (diff)
libultra cleanup (#215)
* cleanup libultra * fixes - use quotes instead of <> for includes - add macros for zelda specific thread priorities - fix Makefile - properly format the remaining pfs structs * fix button macros + add CHECK_BTN_ANY/CHECK_BTN_ALL * remove ULTRA_ABS * fix includes * update z_player.c/z_lib.c + run format.sh * merge upstream/master * fix include in En_Goroiwa * fix includes
Diffstat (limited to 'src/libultra_code_O2/guLookAtHilite.c')
-rw-r--r--src/libultra_code_O2/guLookAtHilite.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/libultra_code_O2/guLookAtHilite.c b/src/libultra_code_O2/guLookAtHilite.c
new file mode 100644
index 000000000..4af14abae
--- /dev/null
+++ b/src/libultra_code_O2/guLookAtHilite.c
@@ -0,0 +1,152 @@
+#include "global.h"
+
+#define FTOFRAC8(x) ((s32)MIN(((x) * (128.0f)), 127.0f) & 0xff)
+
+/**
+ * guLookAtHiliteF
+ * This function creates the viewing matrix (floating point) and sets the LookAt/Hilite structures
+ **/
+void guLookAtHiliteF(f32 mf[4][4], LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt,
+ f32 xUp, f32 yUp, f32 zUp, f32 xl1, f32 yl1, f32 zl1, /* light 1 direction */
+ f32 xl2, f32 yl2, f32 zl2, /* light 2 direction */
+ s32 hiliteWidth, s32 hiliteHeight) /* size of hilite texture */
+{
+ f32 length, xLook, yLook, zLook, xRight, yRight, zRight, xHilite, yHilite, zHilite;
+
+ guMtxIdentF(mf);
+
+ xLook = xAt - xEye;
+ yLook = yAt - yEye;
+ zLook = zAt - zEye;
+ length = -1.0 / sqrtf(xLook * xLook + yLook * yLook + zLook * zLook);
+ xLook *= length;
+ yLook *= length;
+ zLook *= length;
+
+ xRight = yUp * zLook - zUp * yLook;
+ yRight = zUp * xLook - xUp * zLook;
+ zRight = xUp * yLook - yUp * xLook;
+ length = 1.0 / sqrtf(xRight * xRight + yRight * yRight + zRight * zRight);
+ xRight *= length;
+ yRight *= length;
+ zRight *= length;
+
+ xUp = yLook * zRight - zLook * yRight;
+ yUp = zLook * xRight - xLook * zRight;
+ zUp = xLook * yRight - yLook * xRight;
+ length = 1.0 / sqrtf(xUp * xUp + yUp * yUp + zUp * zUp);
+ xUp *= length;
+ yUp *= length;
+ zUp *= length;
+
+ /* hilite vectors */
+
+ length = 1.0 / sqrtf(xl1 * xl1 + yl1 * yl1 + zl1 * zl1);
+ xl1 *= length;
+ yl1 *= length;
+ zl1 *= length;
+
+ xHilite = xl1 + xLook;
+ yHilite = yl1 + yLook;
+ zHilite = zl1 + zLook;
+
+ length = sqrtf(xHilite * xHilite + yHilite * yHilite + zHilite * zHilite);
+
+ if (length > 0.1) {
+ length = 1.0 / length;
+ xHilite *= length;
+ yHilite *= length;
+ zHilite *= length;
+
+ h->h.x1 = hiliteWidth * 4 + (xHilite * xRight + yHilite * yRight + zHilite * zRight) * hiliteWidth * 2;
+
+ h->h.y1 = hiliteHeight * 4 + (xHilite * xUp + yHilite * yUp + zHilite * zUp) * hiliteHeight * 2;
+ } else {
+ h->h.x1 = hiliteWidth * 2;
+ h->h.y1 = hiliteHeight * 2;
+ }
+
+ length = 1.0 / sqrtf(xl2 * xl2 + yl2 * yl2 + zl2 * zl2);
+ xl2 *= length;
+ yl2 *= length;
+ zl2 *= length;
+
+ xHilite = xl2 + xLook;
+ yHilite = yl2 + yLook;
+ zHilite = zl2 + zLook;
+ length = sqrtf(xHilite * xHilite + yHilite * yHilite + zHilite * zHilite);
+ if (length > 0.1) {
+ length = 1.0 / length;
+ xHilite *= length;
+ yHilite *= length;
+ zHilite *= length;
+
+ h->h.x2 = hiliteWidth * 4 + (xHilite * xRight + yHilite * yRight + zHilite * zRight) * hiliteWidth * 2;
+
+ h->h.y2 = hiliteHeight * 4 + (xHilite * xUp + yHilite * yUp + zHilite * zUp) * hiliteHeight * 2;
+ } else {
+ h->h.x2 = hiliteWidth * 2;
+ h->h.y2 = hiliteHeight * 2;
+ }
+
+ /* 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;
+}
+
+/**
+ * guLookAtHilite
+ * This function creates the viewing matrix (fixed point) and sets the LookAt/Hilite structures
+ * Same args as previous function
+ **/
+void guLookAtHilite(Mtx* m, LookAt* l, Hilite* h, f32 xEye, f32 yEye, f32 zEye, f32 xAt, f32 yAt, f32 zAt, f32 xUp,
+ f32 yUp, f32 zUp, f32 xl1, f32 yl1, f32 zl1, f32 xl2, f32 yl2, f32 zl2, s32 hiliteWidth,
+ s32 hiliteHeight) {
+ f32 mf[4][4];
+
+ guLookAtHiliteF(mf, l, h, xEye, yEye, zEye, xAt, yAt, zAt, xUp, yUp, zUp, xl1, yl1, zl1, xl2, yl2, zl2, hiliteWidth,
+ hiliteHeight);
+
+ guMtxF2L(mf, m);
+}