From 3286158e3c884979a38b8b0b8b48752f16d2482c Mon Sep 17 00:00:00 2001 From: Kyle K Date: Wed, 13 Oct 2010 00:27:02 -0500 Subject: Cleanups --- sdl/GL_todo.txt | 5 + sdl/Makefile | 7 +- sdl/gltools.c | 522 +++++++++++++++++++++++++++++++++++++++++++++++ sdl/gltools.h | 32 +++ sdl/math3d.c | 614 ++++++++------------------------------------------------ sdl/math3d.h | 74 +++---- sdl/pyramid.c | 10 +- 7 files changed, 681 insertions(+), 583 deletions(-) create mode 100644 sdl/GL_todo.txt create mode 100644 sdl/gltools.c create mode 100644 sdl/gltools.h diff --git a/sdl/GL_todo.txt b/sdl/GL_todo.txt new file mode 100644 index 0000000..3a59826 --- /dev/null +++ b/sdl/GL_todo.txt @@ -0,0 +1,5 @@ +- cast a shadow +- create camera struct/class and walk with arrow keys, gluLookAt() ? +- extend m3d +- enable fog +- xbox controller diff --git a/sdl/Makefile b/sdl/Makefile index 5ba8c06..0ea6faa 100644 --- a/sdl/Makefile +++ b/sdl/Makefile @@ -1,5 +1,5 @@ PROG = pyramid -OBJS = $(PROG).o math3d.o +OBJS = $(PROG).o math3d.o gltools.o CC = gcc DBGFLAGS = -g -O0 ifdef DEBUG @@ -16,11 +16,14 @@ SDL_image_LDFLAGS := $(shell pkg-config --libs SDL_image) $(PROG): $(OBJS) $(CC) $(LDFLAGS) $(SDL_LDFLAGS) $(SDL_image_LDFLAGS) $(OBJS) -o $(PROG) -$(PROG).o: $(PROG).c math3d.h +$(PROG).o: $(PROG).c math3d.h gltools.h $(CC) -c $(CFLAGS) $(SDL_CFLAGS) $(SDL_image_CFLAGS) $(PROG).c math3d.o: math3d.c math3d.h $(CC) -c $(CFLAGS) math3d.c + +gltools.o: gltools.c gltools.h math3d.h + $(CC) -c $(CFLAGS) gltools.c .PHONY: clean diff --git a/sdl/gltools.c b/sdl/gltools.c new file mode 100644 index 0000000..db456af --- /dev/null +++ b/sdl/gltools.c @@ -0,0 +1,522 @@ +#include "math3d.h" +#include "gltools.h" + +GLint gltWriteTGA(const char *szFileName) +{ + FILE *pFile; /* file pointer */ + TGAHEADER tgaHeader; /* tga file header */ + unsigned long lImageSize; /* size in bytes of image */ + GLbyte *pBits = NULL; /* pointer to bits */ + GLint iViewport[4]; /* viewport in pixels */ + GLenum lastBuffer; /* storage for the current read buffer setting */ + + /* get the viewport dimensions */ + glGetIntegerv(GL_VIEWPORT, iViewport); + + /* how big is the image going to be (targas are tightly packed) */ + lImageSize = iViewport[2] * 3 * iViewport[3]; + + /* allocate block, if this doesn't work, go home */ + pBits = (GLbyte *) malloc(lImageSize); + if (pBits == NULL) + { + perror("malloc"); + return 0; + } + + /* read bits from color buffer */ + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glPixelStorei(GL_PACK_ROW_LENGTH, 0); + glPixelStorei(GL_PACK_SKIP_ROWS, 0); + glPixelStorei(GL_PACK_SKIP_PIXELS, 0); + + /* get the current read buffer setting and save it, switch to + * the front buffer and do the read operation, finally, restore + * the read buffer state + */ + glGetIntegerv(GL_READ_BUFFER, (GLint *) &lastBuffer); + glReadBuffer(GL_FRONT); + glReadPixels(0, 0, iViewport[2], iViewport[3], GL_BGR_EXT, + GL_UNSIGNED_BYTE, pBits); + glReadBuffer(lastBuffer); + + /* initialize the targa header */ + tgaHeader.identsize = 0; + tgaHeader.colorMapType = 0; + tgaHeader.imageType = 2; + tgaHeader.colorMapStart = 0; + tgaHeader.colorMapLength = 0; + tgaHeader.colorMapBits = 0; + tgaHeader.xstart = 0; + tgaHeader.ystart = 0; + tgaHeader.width = iViewport[2]; + tgaHeader.height = iViewport[3]; + tgaHeader.bits = 24; + tgaHeader.descriptor = 0; + + /* attempt to open the file */ + pFile = fopen(szFileName, "wb"); + if (pFile == NULL) + { + perror("fopen"); + free(pBits); /* free buffer and return error */ + return 0; + } + + /* write the header */ + fwrite(&tgaHeader, sizeof(TGAHEADER), 1, pFile); + + /* write the image data */ + fwrite(pBits, lImageSize, 1, pFile); + + /* free temporary buffer and close the file */ + free(pBits); + fclose(pFile); + + return 1; +} + +GLbyte *gltLoadTGA(const char *szFileName, GLint *iWidth, GLint *iHeight, + GLint *iComponents, GLenum *eFormat) +{ + FILE *pFile; /* file pointer */ + TGAHEADER tgaHeader; /* TGA file header */ + unsigned long lImageSize; /* size in bytes of image */ + short sDepth; /* pixel depth; */ + GLbyte *pBits = NULL; /* pointer to bits */ + + /* default/failed values */ + *iWidth = 0; + *iHeight = 0; + *eFormat = GL_BGR_EXT; + *iComponents = GL_RGB8; + + /* attempt to open the file */ + pFile = fopen(szFileName, "rb"); + if (pFile == NULL) + { + perror("fopen"); + return 0; + } + + /* read in header (binary) */ + fread(&tgaHeader, 18 /* sizeof(TGAHEADER) */, 1, pFile); + + /* get width, height, and depth of texture */ + *iWidth = tgaHeader.width; + *iHeight = tgaHeader.height; + sDepth = tgaHeader.bits / 8; + + /* put some validity checks here, very simply, i only understand + * or care about 8, 24, or 32 bit targas + */ + if (tgaHeader.bits != 8 && tgaHeader.bits != 24 && tgaHeader.bits != 32) + return NULL; + + /* calculate size of image buffer */ + lImageSize = tgaHeader.width * tgaHeader.height * sDepth; + + /* allocate memory and check for success */ + pBits = (GLbyte *) malloc(lImageSize * sizeof(GLbyte)); + if (pBits == NULL) + { + perror("malloc"); + return NULL; + } + + /* read in the bits */ + /* check for read error, this should catch rle or other */ + /* weird formats that i don't want to recognize */ + if (fread(pBits, lImageSize, 1, pFile) != 1) + { + perror("fread"); + free(pBits); + return NULL; + } + + /* set opengl format expected */ + switch (sDepth) + { + case 3: /* most likely case */ + *eFormat = GL_BGR_EXT; + *iComponents = GL_RGB8; + break; + case 4: + *eFormat = GL_BGRA_EXT; + *iComponents = GL_RGBA8; + break; + case 1: + *eFormat = GL_LUMINANCE; + *iComponents = GL_LUMINANCE8; + break; + } + + /* done with file */ + fclose(pFile); + + /* return pointer to image data */ + return pBits; +} + +void gltDrawUnitAxes(void) +{ + GLUquadricObj *pObj; /* temporary, used for quadrics */ + + /* measurements */ + float fAxisRadius = 0.025f; + float fAxisHeight = 1.0f; + float fArrowRadius = 0.06f; + float fArrowHeight = 0.1f; + + /* setup the quadric object */ + pObj = gluNewQuadric(); + gluQuadricDrawStyle(pObj, GLU_FILL); + gluQuadricNormals(pObj, GLU_SMOOTH); + gluQuadricOrientation(pObj, GLU_OUTSIDE); + gluQuadricTexture(pObj, GLU_FALSE); + + /* draw the blue z axis first with arrowed head */ + glColor3f(0.0f, 0.0f, 1.0f); + gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); + glPushMatrix(); + glTranslatef(0.0f, 0.0f, 1.0f); + gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); + glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); + glPopMatrix(); + + /* draw the red x axis 2nd with arrowed head */ + glColor3f(1.0f, 0.0f, 0.0f); + glPushMatrix(); + glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); + glPushMatrix(); + glTranslatef(0.0f, 0.0f, 1.0f); + gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); + glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); + glPopMatrix(); + glPopMatrix(); + + /* draw the green y axis 3rd with arrowed head */ + glColor3f(0.0f, 1.0f, 0.0f); + glPushMatrix(); + glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); + gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); + glPushMatrix(); + glTranslatef(0.0f, 0.0f, 1.0f); + gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); + glRotatef(180.0f, 1.0f, 0.0f, 0.0f); + gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); + glPopMatrix(); + glPopMatrix(); + + /* white sphere at origin */ + glColor3f(1.0f, 1.0f, 1.0f); + gluSphere(pObj, 0.05f, 15, 15); + + /* delete the quadric */ + gluDeleteQuadric(pObj); +} + +/* draw a torus (doughnut), using the current 1d texture for light shading */ +/* this funct accepts 4x4 trans matrix to be applied to the vertices */ +void gltDrawTorus(GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, + GLint numMinor) +{ + M3DVector3f vNormal; + double majorStep = 2.0f * M3D_PI / numMajor; + double minorStep = 2.0f * M3D_PI / numMinor; + int i, j; + + for (i = 0; i < numMajor; ++i) + { + double a0 = i * majorStep; + double a1 = a0 + majorStep; + GLfloat x0 = (GLfloat) cos(a0); + GLfloat y0 = (GLfloat) sin(a0); + GLfloat x1 = (GLfloat) cos(a1); + GLfloat y1 = (GLfloat) sin(a1); + + glBegin(GL_TRIANGLE_STRIP); + for (j = 0; j <= numMinor; ++j) + { + double b = j * minorStep; + GLfloat c = (GLfloat) cos(b); + GLfloat r = minorRadius * c + majorRadius; + GLfloat z = minorRadius * (GLfloat) sin(b); + + glTexCoord2f((float) (i) / (float) (numMajor), (float) (j) \ + / (float) (numMinor)); + vNormal[0] = x0 * c; + vNormal[1] = y0 * c; + vNormal[2] = z / minorRadius; + m3dNormalizeVectorf(vNormal); + glNormal3fv(vNormal); + glVertex3f(x0 * r, y0 * r, z); + + glTexCoord2f((float) (i + 1) / (float) (numMajor), (float) (j) \ + / (float) (numMinor)); + vNormal[0] = x1 * c; + vNormal[1] = y1 * c; + vNormal[2] = z / minorRadius; + m3dNormalizeVectorf(vNormal); + glNormal3fv(vNormal); + glVertex3f(x1 * r, y1 * r, z); + } + glEnd(); + } +} + +/* this function just specifically draws the jet */ +/* FIXME: needs to accepts parameters of location and lightning */ +void DrawJet(int nShadow) +{ + M3DVector3f vNormal; + + /* nose cone, set material color, note we only have to set to black + * for the shadow once + */ + if (nShadow == 0) + glColor3ub(128, 128, 128); + else + glColor3ub(0, 0, 0); + + /* nose cone, points straight down, set material color */ + /* follow few lines use manual approach */ + glBegin(GL_TRIANGLES); + glNormal3f(0.0f, -1.0f, 0.0f); + glNormal3f(0.0f, -1.0f, 0.0f); + glVertex3f(0.0f, 0.0f, 60.0f); + glVertex3f(-15.0f, 0.0f, 30.0f); + glVertex3f(15.0f, 0.0f, 30.0f); + + /* verticies for this panel */ + { + M3DVector3f vPoints[3] = { {15.0f, 0.0f, 30.0f} + , + {0.0f, 15.0f, 30.0f} + , + {0.0f, 0.0f, 60.0f} + }; + + /* calculate the normal for the plane */ + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 0.0f, 60.0f} + , + {0.0f, 15.0f, 30.0f} + , + {-15.0f, 0.0f, 30.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + /* body of the plane */ + { + M3DVector3f vPoints[3] = { {-15.0f, 0.0f, 30.0f} + , + {0.0f, 15.0f, 30.0f} + , + {0.0f, 0.0f, -56.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 0.0f, -56.0f} + , + {0.0f, 15.0f, 30.0f} + , + {15.0f, 0.0f, 30.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + glNormal3f(0.0f, -1.0f, 0.0f); + glVertex3f(15.0f, 0.0f, 30.0f); + glVertex3f(-15.0f, 0.0f, 30.0f); + glVertex3f(0.0f, 0.0f, -56.0f); + + /* left wing, large triangle for bottom of wing */ + { + M3DVector3f vPoints[3] = { {0.0f, 2.0f, 27.0f} + , + {-60.0f, 2.0f, -8.0f} + , + {60.0f, 2.0f, -8.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {60.0f, 2.0f, -8.0f} + , + {0.0f, 7.0f, -8.0f} + , + {0.0f, 2.0f, 27.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {60.0f, 2.0f, -8.0f} + , + {-60.0f, 2.0f, -8.0f} + , + {0.0f, 7.0f, -8.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 2.0f, 27.0f} + , + {0.0f, 7.0f, -8.0f} + , + {-60.0f, 2.0f, -8.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + /* tail section */ + /* bottom of back fin */ + glNormal3f(0.0f, -1.0f, 0.0f); + glVertex3f(-30.0f, -0.50f, -57.0f); + glVertex3f(30.0f, -0.50f, -57.0f); + glVertex3f(0.0f, -0.50f, -40.0f); + + { + M3DVector3f vPoints[3] = { {0.0f, -0.5f, -40.0f} + , + {30.0f, -0.5f, -57.0f} + , + {0.0f, 4.0f, -57.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 4.0f, -57.0f} + , + {-30.0f, -0.5f, -57.0f} + , + {0.0f, -0.5f, -40.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {30.0f, -0.5f, -57.0f} + , + {-30.0f, -0.5f, -57.0f} + , + {0.0f, 4.0f, -57.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 0.5f, -40.0f} + , + {3.0f, 0.5f, -57.0f} + , + {0.0f, 25.0f, -65.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {0.0f, 25.0f, -65.0f} + , + {-3.0f, 0.5f, -57.0f} + , + {0.0f, 0.5f, -40.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + { + M3DVector3f vPoints[3] = { {3.0f, 0.5f, -57.0f} + , + {-3.0f, 0.5f, -57.0f} + , + {0.0f, 25.0f, -65.0f} + }; + + m3dFindNormalf(vNormal, vPoints[0], vPoints[1], vPoints[2]); + glNormal3fv(vNormal); + glVertex3fv(vPoints[0]); + glVertex3fv(vPoints[1]); + glVertex3fv(vPoints[2]); + } + + glEnd(); +} + diff --git a/sdl/gltools.h b/sdl/gltools.h new file mode 100644 index 0000000..b960abd --- /dev/null +++ b/sdl/gltools.h @@ -0,0 +1,32 @@ +#ifndef _GLTOOLS_H_ +#define _GLTOOLS_H_ + +/* this is the targa header, pragmas are needed to do the voodoo magic */ +/* http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/ */ +#pragma pack(1) +typedef struct +{ + GLbyte identsize; /* Size of id field that follows header (0) */ + GLbyte imageType; /* 0 = none, 1 = indexed, 2 = rgb, 3 = grey, +8 = rle */ + GLbyte colorMapType; /* 0 = none, 1 = paletted */ + unsigned short colorMapStart; /* first colour map entry */ + unsigned short colorMapLength; /* number of colors */ + unsigned char colorMapBits; /* bits per palette entry */ + unsigned short xstart; /* image x origin */ + unsigned short ystart; /* image y origin */ + unsigned short width; /* width in pixels */ + unsigned short height; /* height in pixels */ + GLbyte bits; /* bits per pixel (8 16, 24, 32) */ + GLbyte descriptor; /* image descriptor */ +} TGAHEADER; +#pragma pack(1) + +/* function prototypes */ +GLint gltWriteTGA(const char *); +GLbyte *gltLoadTGA(const char *, GLint *, GLint *, GLint *, GLenum *); +void gltDrawUnitAxes(void); +void gltDrawTorus(GLfloat, GLfloat, GLint, GLint); +void DrawJet(int); + +#endif + diff --git a/sdl/math3d.c b/sdl/math3d.c index 7baad85..53e0fff 100644 --- a/sdl/math3d.c +++ b/sdl/math3d.c @@ -1,8 +1,8 @@ -/* revision 5 */ +/* revision 6 */ -/* @2009 Kamil Kaminski +/* @2010 Kamil Kaminski * - * this code is not yet endian aware + * this code is not yet endian aware, and it won't be, screw powerpc * the style of the syntax is original k&r except there's \n * after the opening { and extra space after if statement, * and for/while loops @@ -10,7 +10,7 @@ #include "math3d.h" -void m3dFindNormal(M3DVector3f result, const M3DVector3f point1, +void m3dFindNormalf(M3DVector3f result, const M3DVector3f point1, const M3DVector3f point2, const M3DVector3f point3) { M3DVector3f v1, v2; @@ -27,10 +27,22 @@ void m3dFindNormal(M3DVector3f result, const M3DVector3f point1, v2[2] = point2[2] - point3[2]; /* take the cross product of the two vectors to get the normal vector */ - m3dCrossProduct(result, v1, v2); + m3dCrossProductf(result, v1, v2); } -void m3dLoadIdentity44(M3DMatrix44f m) /* 4x4 float */ + +void m3dLoadIdentity33f(M3DMatrix33f m) +{ + /* don't be fooled, this is still column major */ + static M3DMatrix33f identity = { 1.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 1.0f }; + + memcpy(m, identity, sizeof(M3DMatrix33f)); +} + + +void m3dLoadIdentity44f(M3DMatrix44f m) /* 4x4 float */ { /* don't be fooled, this is still column major */ static M3DMatrix44f identity = { 1.0f, 0.0f, 0.0f, 0.0f, @@ -41,8 +53,35 @@ void m3dLoadIdentity44(M3DMatrix44f m) /* 4x4 float */ memcpy(m, identity, sizeof(M3DMatrix44f)); } +/* calculate the plane equation of the plane that the three specified points lay in + * the points are given in clockwise winding order, with normal pointing out of clockwise face + * planeEq contains the a, b, c, and d of the plane equation coefficients + */ +void m3dGetPlaneEquationf(M3DVector4f planeEq, const M3DVector3f p1, + const M3DVector3f p2, const M3DVector3f p3) +{ + /* get two vectors... do the cross product */ + M3DVector3f v1, v2; + + /* v1 = p3 - p1 */ + v1[0] = p3[0] - p1[0]; + v1[1] = p3[1] - p1[1]; + v1[2] = p3[2] - p1[2]; + + /* v2 = p2 - p1 */ + v2[0] = p2[0] - p1[0]; + v2[1] = p2[1] - p1[1]; + v2[2] = p2[2] - p1[2]; + + /* unit normal to plane - Not sure which is the best way here */ + m3dCrossProductf(planeEq, v1, v2); + m3dNormalizeVectorf(planeEq); + /* back substitute to get d */ + planeEq[3] = -(planeEq[0] * p3[0] + planeEq[1] * p3[1] + planeEq[2] * p3[2]); +} + /* creates a 4x4 rotation matrix, takes radians not degrees */ -void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z) +void m3dRotationMatrix44f(M3DMatrix44f m, float angle, float x, float y, float z) { float mag, s, c; float xx, yy, zz, xy, yz, zx, xs, ys, zs, one_c; @@ -55,7 +94,7 @@ void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z) /* identity matrix */ if (mag == 0.0f) { - m3dLoadIdentity44(m); + m3dLoadIdentity44f(m); return; } @@ -101,373 +140,50 @@ void m3dRotationMatrix44(M3DMatrix44f m, float angle, float x, float y, float z) #undef M } -/* draw a torus (doughnut), using the current 1d texture for light shading */ -/* this funct accepts 4x4 trans matrix to be applied to the vertices */ -void gltDrawTorus(GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, - GLint numMinor) -{ - M3DVector3f vNormal; - double majorStep = 2.0f * M3D_PI / numMajor; - double minorStep = 2.0f * M3D_PI / numMinor; - int i, j; - - for (i = 0; i < numMajor; ++i) - { - double a0 = i * majorStep; - double a1 = a0 + majorStep; - GLfloat x0 = (GLfloat) cos(a0); - GLfloat y0 = (GLfloat) sin(a0); - GLfloat x1 = (GLfloat) cos(a1); - GLfloat y1 = (GLfloat) sin(a1); - - glBegin(GL_TRIANGLE_STRIP); - for (j = 0; j <= numMinor; ++j) - { - double b = j * minorStep; - GLfloat c = (GLfloat) cos(b); - GLfloat r = minorRadius * c + majorRadius; - GLfloat z = minorRadius * (GLfloat) sin(b); - - glTexCoord2f((float) (i) / (float) (numMajor), (float) (j) \ - / (float) (numMinor)); - vNormal[0] = x0 * c; - vNormal[1] = y0 * c; - vNormal[2] = z / minorRadius; - m3dNormalizeVector(vNormal); - glNormal3fv(vNormal); - glVertex3f(x0 * r, y0 * r, z); - - glTexCoord2f((float) (i + 1) / (float) (numMajor), (float) (j) \ - / (float) (numMinor)); - vNormal[0] = x1 * c; - vNormal[1] = y1 * c; - vNormal[2] = z / minorRadius; - m3dNormalizeVector(vNormal); - glNormal3fv(vNormal); - glVertex3f(x1 * r, y1 * r, z); - } - glEnd(); - } -} - -/* this function just specifically draws the jet */ -/* FIXME needs to accepts parameters of location and lightning */ -void DrawJet(int nShadow) -{ - M3DVector3f vNormal; - - /* nose cone, set material color, note we only have to set to black - * for the shadow once - */ - if (nShadow == 0) - glColor3ub(128, 128, 128); - else - glColor3ub(0, 0, 0); - - /* nose cone, points straight down, set material color */ - /* follow few lines use manual approach */ - glBegin(GL_TRIANGLES); - glNormal3f(0.0f, -1.0f, 0.0f); - glNormal3f(0.0f, -1.0f, 0.0f); - glVertex3f(0.0f, 0.0f, 60.0f); - glVertex3f(-15.0f, 0.0f, 30.0f); - glVertex3f(15.0f, 0.0f, 30.0f); - - /* verticies for this panel */ - { - M3DVector3f vPoints[3] = { {15.0f, 0.0f, 30.0f} - , - {0.0f, 15.0f, 30.0f} - , - {0.0f, 0.0f, 60.0f} - }; - - /* calculate the normal for the plane */ - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 0.0f, 60.0f} - , - {0.0f, 15.0f, 30.0f} - , - {-15.0f, 0.0f, 30.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - /* body of the plane */ - { - M3DVector3f vPoints[3] = { {-15.0f, 0.0f, 30.0f} - , - {0.0f, 15.0f, 30.0f} - , - {0.0f, 0.0f, -56.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 0.0f, -56.0f} - , - {0.0f, 15.0f, 30.0f} - , - {15.0f, 0.0f, 30.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - glNormal3f(0.0f, -1.0f, 0.0f); - glVertex3f(15.0f, 0.0f, 30.0f); - glVertex3f(-15.0f, 0.0f, 30.0f); - glVertex3f(0.0f, 0.0f, -56.0f); - - /* left wing, large triangle for bottom of wing */ - { - M3DVector3f vPoints[3] = { {0.0f, 2.0f, 27.0f} - , - {-60.0f, 2.0f, -8.0f} - , - {60.0f, 2.0f, -8.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {60.0f, 2.0f, -8.0f} - , - {0.0f, 7.0f, -8.0f} - , - {0.0f, 2.0f, 27.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {60.0f, 2.0f, -8.0f} - , - {-60.0f, 2.0f, -8.0f} - , - {0.0f, 7.0f, -8.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 2.0f, 27.0f} - , - {0.0f, 7.0f, -8.0f} - , - {-60.0f, 2.0f, -8.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - /* tail section */ - /* bottom of back fin */ - glNormal3f(0.0f, -1.0f, 0.0f); - glVertex3f(-30.0f, -0.50f, -57.0f); - glVertex3f(30.0f, -0.50f, -57.0f); - glVertex3f(0.0f, -0.50f, -40.0f); - - { - M3DVector3f vPoints[3] = { {0.0f, -0.5f, -40.0f} - , - {30.0f, -0.5f, -57.0f} - , - {0.0f, 4.0f, -57.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 4.0f, -57.0f} - , - {-30.0f, -0.5f, -57.0f} - , - {0.0f, -0.5f, -40.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {30.0f, -0.5f, -57.0f} - , - {-30.0f, -0.5f, -57.0f} - , - {0.0f, 4.0f, -57.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 0.5f, -40.0f} - , - {3.0f, 0.5f, -57.0f} - , - {0.0f, 25.0f, -65.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {0.0f, 25.0f, -65.0f} - , - {-3.0f, 0.5f, -57.0f} - , - {0.0f, 0.5f, -40.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - { - M3DVector3f vPoints[3] = { {3.0f, 0.5f, -57.0f} - , - {-3.0f, 0.5f, -57.0f} - , - {0.0f, 25.0f, -65.0f} - }; - - m3dFindNormal(vNormal, vPoints[0], vPoints[1], vPoints[2]); - glNormal3fv(vNormal); - glVertex3fv(vPoints[0]); - glVertex3fv(vPoints[1]); - glVertex3fv(vPoints[2]); - } - - glEnd(); -} - -void gltDrawUnitAxes(void) +/* create a projection to "squish" an object into the plane. + * use m3dGetPlaneEquationf(planeEq, point1, point2, point3); to get a plane equation + */ +void m3dMakePlanarShadowMatrixf(M3DMatrix44f proj, const M3DVector4f planeEq, + const M3DVector3f vLightPos) { - GLUquadricObj *pObj; /* temporary, used for quadrics */ - - /* measurements */ - float fAxisRadius = 0.025f; - float fAxisHeight = 1.0f; - float fArrowRadius = 0.06f; - float fArrowHeight = 0.1f; - - /* setup the quadric object */ - pObj = gluNewQuadric(); - gluQuadricDrawStyle(pObj, GLU_FILL); - gluQuadricNormals(pObj, GLU_SMOOTH); - gluQuadricOrientation(pObj, GLU_OUTSIDE); - gluQuadricTexture(pObj, GLU_FALSE); - - /* draw the blue z axis first with arrowed head */ - glColor3f(0.0f, 0.0f, 1.0f); - gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); - glPushMatrix(); - glTranslatef(0.0f, 0.0f, 1.0f); - gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); - glRotatef(180.0f, 1.0f, 0.0f, 0.0f); - gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); - glPopMatrix(); - - /* draw the red x axis 2nd with arrowed head */ - glColor3f(1.0f, 0.0f, 0.0f); - glPushMatrix(); - glRotatef(90.0f, 0.0f, 1.0f, 0.0f); - gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); - glPushMatrix(); - glTranslatef(0.0f, 0.0f, 1.0f); - gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); - glRotatef(180.0f, 0.0f, 1.0f, 0.0f); - gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); - glPopMatrix(); - glPopMatrix(); - - /* draw the green y axis 3rd with arrowed head */ - glColor3f(0.0f, 1.0f, 0.0f); - glPushMatrix(); - glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); - gluCylinder(pObj, fAxisRadius, fAxisRadius, fAxisHeight, 10, 1); - glPushMatrix(); - glTranslatef(0.0f, 0.0f, 1.0f); - gluCylinder(pObj, fArrowRadius, 0.0f, fArrowHeight, 10, 1); - glRotatef(180.0f, 1.0f, 0.0f, 0.0f); - gluDisk(pObj, fAxisRadius, fArrowRadius, 10, 1); - glPopMatrix(); - glPopMatrix(); - - /* white sphere at origin */ - glColor3f(1.0f, 1.0f, 1.0f); - gluSphere(pObj, 0.05f, 15, 15); - - /* delete the quadric */ - gluDeleteQuadric(pObj); + /* these just make the code below easier to read */ + float a = planeEq[0]; + float b = planeEq[1]; + float c = planeEq[2]; + float d = planeEq[3]; + + float dx = -vLightPos[0]; + float dy = -vLightPos[1]; + float dz = -vLightPos[2]; + + /* now build the projection matrix */ + proj[0] = b * dy + c * dz; + proj[1] = -a * dy; + proj[2] = -a * dz; + proj[3] = 0.0; + + proj[4] = -b * dx; + proj[5] = a * dx + c * dz; + proj[6] = -b * dz; + proj[7] = 0.0; + + proj[8] = -c * dx; + proj[9] = -c * dy; + proj[10] = a * dx + b * dy; + proj[11] = 0.0; + + proj[12] = -d * dx; + proj[13] = -d * dy; + proj[14] = -d * dz; + proj[15] = a * dx + b * dy + c * dz; + /* shadow matrix ready */ } #define A(row,col) a[(col<<2)+row] #define B(row,col) b[(col<<2)+row] #define P(row,col) product[(col<<2)+row] -void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, +void m3dMatrixMultiply44f(M3DMatrix44f product, const M3DMatrix44f a, const M3DMatrix44f b) { int i; @@ -485,165 +201,3 @@ void m3dMatrixMultiply44(M3DMatrix44f product, const M3DMatrix44f a, #undef B #undef P - -/*************************************************************/ -/* unrelated functions that do not have much to do with math */ -/* */ -/*************************************************************/ - -GLint gltWriteTGA(const char *szFileName) -{ - FILE *pFile; /* file pointer */ - TGAHEADER tgaHeader; /* tga file header */ - unsigned long lImageSize; /* size in bytes of image */ - GLbyte *pBits = NULL; /* pointer to bits */ - GLint iViewport[4]; /* viewport in pixels */ - GLenum lastBuffer; /* storage for the current read buffer setting */ - - /* get the viewport dimensions */ - glGetIntegerv(GL_VIEWPORT, iViewport); - - /* how big is the image going to be (targas are tightly packed) */ - lImageSize = iViewport[2] * 3 * iViewport[3]; - - /* allocate block, if this doesn't work, go home */ - pBits = (GLbyte *) malloc(lImageSize); - if (pBits == NULL) - { - perror("malloc"); - return 0; - } - - /* read bits from color buffer */ - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glPixelStorei(GL_PACK_ROW_LENGTH, 0); - glPixelStorei(GL_PACK_SKIP_ROWS, 0); - glPixelStorei(GL_PACK_SKIP_PIXELS, 0); - - /* get the current read buffer setting and save it, switch to - * the front buffer and do the read operation, finally, restore - * the read buffer state - */ - glGetIntegerv(GL_READ_BUFFER, (GLint *) &lastBuffer); - glReadBuffer(GL_FRONT); - glReadPixels(0, 0, iViewport[2], iViewport[3], GL_BGR_EXT, - GL_UNSIGNED_BYTE, pBits); - glReadBuffer(lastBuffer); - - /* initialize the targa header */ - tgaHeader.identsize = 0; - tgaHeader.colorMapType = 0; - tgaHeader.imageType = 2; - tgaHeader.colorMapStart = 0; - tgaHeader.colorMapLength = 0; - tgaHeader.colorMapBits = 0; - tgaHeader.xstart = 0; - tgaHeader.ystart = 0; - tgaHeader.width = iViewport[2]; - tgaHeader.height = iViewport[3]; - tgaHeader.bits = 24; - tgaHeader.descriptor = 0; - - /* attempt to open the file */ - pFile = fopen(szFileName, "wb"); - if (pFile == NULL) - { - perror("fopen"); - free(pBits); /* free buffer and return error */ - return 0; - } - - /* write the header */ - fwrite(&tgaHeader, sizeof(TGAHEADER), 1, pFile); - - /* write the image data */ - fwrite(pBits, lImageSize, 1, pFile); - - /* free temporary buffer and close the file */ - free(pBits); - fclose(pFile); - - return 1; -} - -GLbyte *gltLoadTGA(const char *szFileName, GLint *iWidth, GLint *iHeight, - GLint *iComponents, GLenum *eFormat) -{ - FILE *pFile; /* file pointer */ - TGAHEADER tgaHeader; /* TGA file header */ - unsigned long lImageSize; /* size in bytes of image */ - short sDepth; /* pixel depth; */ - GLbyte *pBits = NULL; /* pointer to bits */ - - /* default/failed values */ - *iWidth = 0; - *iHeight = 0; - *eFormat = GL_BGR_EXT; - *iComponents = GL_RGB8; - - /* attempt to open the file */ - pFile = fopen(szFileName, "rb"); - if (pFile == NULL) - { - perror("fopen"); - return 0; - } - - /* read in header (binary) */ - fread(&tgaHeader, 18 /* sizeof(TGAHEADER) */, 1, pFile); - - /* get width, height, and depth of texture */ - *iWidth = tgaHeader.width; - *iHeight = tgaHeader.height; - sDepth = tgaHeader.bits / 8; - - /* put some validity checks here, very simply, i only understand - * or care about 8, 24, or 32 bit targas - */ - if (tgaHeader.bits != 8 && tgaHeader.bits != 24 && tgaHeader.bits != 32) - return NULL; - - /* calculate size of image buffer */ - lImageSize = tgaHeader.width * tgaHeader.height * sDepth; - - /* allocate memory and check for success */ - pBits = (GLbyte *) malloc(lImageSize * sizeof(GLbyte)); - if (pBits == NULL) - { - perror("malloc"); - return NULL; - } - - /* read in the bits */ - /* check for read error, this should catch rle or other */ - /* weird formats that i don't want to recognize */ - if (fread(pBits, lImageSize, 1, pFile) != 1) - { - perror("fread"); - free(pBits); - return NULL; - } - - /* set opengl format expected */ - switch (sDepth) - { - case 3: /* most likely case */ - *eFormat = GL_BGR_EXT; - *iComponents = GL_RGB8; - break; - case 4: - *eFormat = GL_BGRA_EXT; - *iComponents = GL_RGBA8; - break; - case 1: - *eFormat = GL_LUMINANCE; - *iComponents = GL_LUMINANCE8; - break; - } - - /* done with file */ - fclose(pFile); - - /* return pointer to image data */ - return pBits; -} diff --git a/sdl/math3d.h b/sdl/math3d.h index ed72e56..4ebe092 100644 --- a/sdl/math3d.h +++ b/sdl/math3d.h @@ -16,44 +16,24 @@ #define m3dRadToDeg(x) ((x)*M3D_INV_PI_DIV_180) typedef float M3DMatrix44f[16]; /* 4x4 matrix */ +typedef float M3DMatrix33f[9]; /* 3x3 matrix */ +typedef float M3DVector4f[4]; /* vector of 4 floats */ typedef float M3DVector3f[3]; /* vector of 3 floats */ typedef float M3DVector2f[2]; /* vector of 2 floats */ -/* this is the targa header, pragmas are needed to do the voodoo magic */ -/* http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/ */ -#pragma pack(1) -typedef struct -{ - GLbyte identsize; /* Size of id field that follows header (0) */ - GLbyte imageType; /* 0 = none, 1 = indexed, 2 = rgb, 3 = grey, +8 = rle */ - GLbyte colorMapType; /* 0 = none, 1 = paletted */ - unsigned short colorMapStart; /* first colour map entry */ - unsigned short colorMapLength; /* number of colors */ - unsigned char colorMapBits; /* bits per palette entry */ - unsigned short xstart; /* image x origin */ - unsigned short ystart; /* image y origin */ - unsigned short width; /* width in pixels */ - unsigned short height; /* height in pixels */ - GLbyte bits; /* bits per pixel (8 16, 24, 32) */ - GLbyte descriptor; /* image descriptor */ -} TGAHEADER; -#pragma pack(1) - /* math function prototypes */ -void m3dFindNormal(M3DVector3f, const M3DVector3f, const M3DVector3f, +void m3dFindNormalf(M3DVector3f, const M3DVector3f, const M3DVector3f, const M3DVector3f); -void m3dLoadIdentity44(M3DMatrix44f); -void m3dRotationMatrix44(M3DMatrix44f, float, float, float, float); -void gltDrawTorus(GLfloat, GLfloat, GLint, GLint); -void DrawJet(int); -void gltDrawUnitAxes(void); -void m3dMatrixMultiply44(M3DMatrix44f, const M3DMatrix44f, const M3DMatrix44f); - -/* other function prototypes */ -GLint gltWriteTGA(const char *); -GLbyte *gltLoadTGA(const char *, GLint *, GLint *, GLint *, GLenum *); - -static inline void m3dCrossProduct(M3DVector3f result, const M3DVector3f u, +void m3dLoadIdentity33f(M3DMatrix33f m); +void m3dLoadIdentity44f(M3DMatrix44f); +void m3dGetPlaneEquationf(M3DVector4f planeEq, const M3DVector3f p1, + const M3DVector3f p2, const M3DVector3f p3); +void m3dRotationMatrix44f(M3DMatrix44f, float, float, float, float); +void m3dMakePlanarShadowMatrixf(M3DMatrix44f proj, const M3DVector4f planeEq, + const M3DVector3f vLightPos); +void m3dMatrixMultiply44f(M3DMatrix44f, const M3DMatrix44f, const M3DMatrix44f); + +static inline void m3dCrossProductf(M3DVector3f result, const M3DVector3f u, const M3DVector3f v) { result[0] = u[1] * v[2] - v[1] * u[2]; @@ -61,38 +41,37 @@ static inline void m3dCrossProduct(M3DVector3f result, const M3DVector3f u, result[2] = u[0] * v[1] - v[0] * u[1]; } -static inline void m3dTransformVector3(M3DVector3f vOut, const M3DVector3f v, +static inline void m3dTransformVector3f(M3DVector3f vOut, const M3DVector3f v, const M3DMatrix44f m) { - vOut[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12]; /* * v[3]; */ - vOut[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13]; /* * v[3]; */ - vOut[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14]; /* * v[3]; */ - /* vOut[3] = m[3] * v[0] + m[7] * v[1] + m[11] * v[2] + m[15] * v[3]; */ + vOut[0] = m[0] * v[0] + m[4] * v[1] + m[8] * v[2] + m[12]; + vOut[1] = m[1] * v[0] + m[5] * v[1] + m[9] * v[2] + m[13]; + vOut[2] = m[2] * v[0] + m[6] * v[1] + m[10] * v[2] + m[14]; } -static inline void m3dScaleVector3(M3DVector3f v, float scale) +static inline void m3dScaleVector3f(M3DVector3f v, float scale) { v[0] *= scale; v[1] *= scale; v[2] *= scale; } -static inline float m3dGetVectorLengthSquared(const M3DVector3f u) +static inline float m3dGetVectorLengthSquaredf(const M3DVector3f u) { return (u[0] * u[0]) + (u[1] * u[1]) + (u[2] * u[2]); } -static inline float m3dGetVectorLength(const M3DVector3f u) +static inline float m3dGetVectorLengthf(const M3DVector3f u) { - return (float) (sqrt((double) (m3dGetVectorLengthSquared(u)))); + return (float) (sqrt((double) (m3dGetVectorLengthSquaredf(u)))); } -static inline void m3dNormalizeVector(M3DVector3f u) +static inline void m3dNormalizeVectorf(M3DVector3f u) { - m3dScaleVector3(u, 1.0f / m3dGetVectorLength(u)); + m3dScaleVector3f(u, 1.0f / m3dGetVectorLengthf(u)); } -static inline void m3dTranslateMatrix44(M3DMatrix44f m, float x, float y, +static inline void m3dTranslateMatrix44f(M3DMatrix44f m, float x, float y, float z) { m[12] += x; @@ -100,7 +79,7 @@ static inline void m3dTranslateMatrix44(M3DMatrix44f m, float x, float y, m[14] += z; } -static inline void m3dScaleMatrix44(M3DMatrix44f m, float x, float y, float z) +static inline void m3dScaleMatrix44f(M3DMatrix44f m, float x, float y, float z) { m[0] *= x; m[5] *= y; @@ -120,10 +99,11 @@ static inline void m3dScaleMatrix44(M3DMatrix44f m, float x, float y, float z) } \ } -static inline void m3dTransposeMatrix44(M3DMatrix44f dst, +static inline void m3dTransposeMatrix44f(M3DMatrix44f dst, const M3DMatrix44f src) { TRANSPOSE44(dst, src); } #endif + diff --git a/sdl/pyramid.c b/sdl/pyramid.c index 418547d..ab98494 100644 --- a/sdl/pyramid.c +++ b/sdl/pyramid.c @@ -9,6 +9,7 @@ #include /* for some reason order of the headers matters */ #include "math3d.h" +#include "gltools.h" #include #define FRAMES_PER_SECOND 300 @@ -60,6 +61,7 @@ static void SetupRC() glEnable(GL_LIGHTING); /* setup and enable light 0 */ + /* ambient RGBA intensity of the entire scene */ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteLight); glLightfv(GL_LIGHT0, GL_AMBIENT, sourceLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, sourceLight); @@ -231,7 +233,7 @@ static void render(void) glVertex3fv(vCorners[4]); /* front face */ - m3dFindNormal(vNormal, vCorners[0], vCorners[4], vCorners[3]); + m3dFindNormalf(vNormal, vCorners[0], vCorners[4], vCorners[3]); glNormal3fv(vNormal); glTexCoord2f(0.5f, 1.0f); glVertex3fv(vCorners[0]); @@ -241,7 +243,7 @@ static void render(void) glVertex3fv(vCorners[3]); /* left face */ - m3dFindNormal(vNormal, vCorners[0], vCorners[1], vCorners[4]); + m3dFindNormalf(vNormal, vCorners[0], vCorners[1], vCorners[4]); glNormal3fv(vNormal); glTexCoord2f(0.5f, 1.0f); glVertex3fv(vCorners[0]); @@ -251,7 +253,7 @@ static void render(void) glVertex3fv(vCorners[4]); /* back face */ - m3dFindNormal(vNormal, vCorners[0], vCorners[2], vCorners[1]); + m3dFindNormalf(vNormal, vCorners[0], vCorners[2], vCorners[1]); glNormal3fv(vNormal); glTexCoord2f(0.5f, 1.0f); glVertex3fv(vCorners[0]); @@ -261,7 +263,7 @@ static void render(void) glVertex3fv(vCorners[1]); /* right face */ - m3dFindNormal(vNormal, vCorners[0], vCorners[3], vCorners[2]); + m3dFindNormalf(vNormal, vCorners[0], vCorners[3], vCorners[2]); glNormal3fv(vNormal); glTexCoord2f(0.5f, 1.0f); glVertex3fv(vCorners[0]); -- cgit v1.2.3