From 0a8d43d47bb8eae0a4b14713a74c4ca186e38575 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Fri, 30 Apr 2021 20:47:33 +0100 Subject: [PATCH] Add nehe08 sample --- CMakeLists.txt | 1 + samples/nehe08/main.c | 239 +++++++++++++++++++++++++++++++ samples/nehe08/pvr-texture.c | 176 +++++++++++++++++++++++ samples/nehe08/romdisk/glass.pvr | Bin 0 -> 32800 bytes 4 files changed, 416 insertions(+) create mode 100644 samples/nehe08/main.c create mode 100644 samples/nehe08/pvr-texture.c create mode 100644 samples/nehe08/romdisk/glass.pvr diff --git a/CMakeLists.txt b/CMakeLists.txt index 8578f94..5b04ceb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,6 +132,7 @@ gen_sample(nehe05 samples/nehe05/main.c) gen_sample(nehe06 samples/nehe06/main.c) gen_sample(nehe06_vq samples/nehe06_vq/main.c) gen_sample(nehe06_4444twid samples/nehe06_4444twid/main.c) +gen_sample(nehe08 samples/nehe08/main.c samples/nehe08/pvr-texture.c) gen_sample(ortho2d samples/ortho2d/main.c) gen_sample(paletted samples/paletted/main.c) gen_sample(paletted_pcx samples/paletted_pcx/main.c) diff --git a/samples/nehe08/main.c b/samples/nehe08/main.c new file mode 100644 index 0000000..fb7ff6f --- /dev/null +++ b/samples/nehe08/main.c @@ -0,0 +1,239 @@ +/* + KallistiOS 2.0.0 + + nehe08.c + (c)2021 Luke Benstead + (c)2014 Josh Pearson + (c)2001 Benoit Miller + (c)2000 Jeff Molofee +*/ + +#ifdef __DREAMCAST__ +#include +#endif + +#include +#include +#include + +/* Simple OpenGL example to demonstrate blending and lighting. + + Essentially the same thing as NeHe's lesson08 code. + To learn more, go to http://nehe.gamedev.net/. + + DPAD controls the cube rotation, button A & B control the depth + of the cube, button X toggles filtering, and button Y toggles alpha + blending. +*/ + +static GLfloat xrot; /* X Rotation */ +static GLfloat yrot; /* Y Rotation */ +static GLfloat xspeed; /* X Rotation Speed */ +static GLfloat yspeed; /* Y Rotation Speed */ +static GLfloat z = -5.0f; /* Depth Into The Screen */ + +static GLuint filter; /* Which Filter To Use */ +static GLuint texture[2]; /* Storage For Two Textures */ + +/* Load a PVR texture - located in pvr-texture.c */ +extern GLuint glTextureLoadPVR(char *fname, unsigned char isMipMapped, unsigned char glMipMap); + +void draw_gl(void) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + glTranslatef(0.0f, 0.0f, z); + + glRotatef(xrot, 1.0f, 0.0f, 0.0f); + glRotatef(yrot, 0.0f, 1.0f, 0.0f); + + glBindTexture(GL_TEXTURE_2D, texture[filter]); + + glBegin(GL_QUADS); + /* Front Face */ + glNormal3f(0.0f, 0.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + /* Back Face */ + glNormal3f(0.0f, 0.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(1.0f, -1.0f, -1.0f); + /* Top Face */ + glNormal3f(0.0f, 1.0f, 0.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(1.0f, 1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(1.0f, 1.0f, -1.0f); + /* Bottom Face */ + glNormal3f(0.0f, -1.0f, 0.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(1.0f, -1.0f, -1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + /* Right face */ + glNormal3f(1.0f, 0.0f, 0.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(1.0f, -1.0f, -1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(1.0f, 1.0f, -1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(1.0f, -1.0f, 1.0f); + /* Left Face */ + glNormal3f(-1.0f, 0.0f, 0.0f); + glTexCoord2f(0.0f, 0.0f); + glVertex3f(-1.0f, -1.0f, -1.0f); + glTexCoord2f(1.0f, 0.0f); + glVertex3f(-1.0f, -1.0f, 1.0f); + glTexCoord2f(1.0f, 1.0f); + glVertex3f(-1.0f, 1.0f, 1.0f); + glTexCoord2f(0.0f, 1.0f); + glVertex3f(-1.0f, 1.0f, -1.0f); + glEnd(); + + xrot += xspeed; + yrot += yspeed; +} + +#ifdef __DREAMCAST__ +extern uint8 romdisk[]; +KOS_INIT_ROMDISK(romdisk); +#endif + +int main(int argc, char **argv) { +#ifdef __DREAMCAST__ + maple_device_t *cont; + cont_state_t *state; +#endif + + GLboolean xp = GL_FALSE; + GLboolean yp = GL_FALSE; + GLboolean blend = GL_FALSE; + + printf("nehe08 beginning\n"); + + /* Get basic stuff initialized */ + glKosInit(); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0f, 640.0f / 480.0f, 0.1f, 100.0f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_TEXTURE_2D); + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.5f); + glClearDepth(1.0f); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + + glColor4f(1.0f, 1.0f, 1.0f, 0.5); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + + /* Enable Lighting and GL_LIGHT0 */ + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + /* Set up the textures */ + texture[0] = glTextureLoadPVR("/rd/glass.pvr", 0, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + texture[1] = glTextureLoadPVR("/rd/glass.pvr", 0, 0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + while(1) { +#ifdef __DREAMCAST__ + cont = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); + + /* Check key status */ + state = (cont_state_t *)maple_dev_status(cont); + + if(!state) { + printf("Error reading controller\n"); + break; + } + + if(state->buttons & CONT_START) + break; + + if(state->buttons & CONT_A) + z -= 0.02f; + + if(state->buttons & CONT_B) + z += 0.02f; + + if((state->buttons & CONT_X) && !xp) { + xp = GL_TRUE; + filter += 1; + + if(filter > 1) + filter = 0; + } + + if(!(state->buttons & CONT_X)) + xp = GL_FALSE; + + if((state->buttons & CONT_Y) && !yp) { + yp = GL_TRUE; + blend = !blend; + } + + if(!(state->buttons & CONT_Y)) + yp = GL_FALSE; + + if(state->buttons & CONT_DPAD_UP) + xspeed -= 0.01f; + + if(state->buttons & CONT_DPAD_DOWN) + xspeed += 0.01f; + + if(state->buttons & CONT_DPAD_LEFT) + yspeed -= 0.01f; + + if(state->buttons & CONT_DPAD_RIGHT) + yspeed += 0.01f; +#endif + + /* Switch to the blended polygon list if needed */ + if(blend) { + glEnable(GL_BLEND); + glDepthMask(0); + } + else { + glDisable(GL_BLEND); + glDepthMask(1); + } + + /* Draw the GL "scene" */ + draw_gl(); + + /* Finish the frame */ + glKosSwapBuffers(); + } + + return 0; +} + diff --git a/samples/nehe08/pvr-texture.c b/samples/nehe08/pvr-texture.c new file mode 100644 index 0000000..c9d5f92 --- /dev/null +++ b/samples/nehe08/pvr-texture.c @@ -0,0 +1,176 @@ +/* + KallistiOS 2.0.0 + + pvr-texture.c + (c)2014 Josh PH3NOM Pearson + + Load A PVR Texture to the PVR using Open GL +*/ +#include +#include +#include + +#include "GL/gl.h" +#include "GL/glu.h" +#include "GL/glkos.h" +#include "GL/glext.h" + +#define PVR_HDR_SIZE 0x20 +#define MAX(x, y) ((x > y) ? x : y) + +static GLuint PVR_TextureHeight(unsigned char *HDR); +static GLuint PVR_TextureWidth(unsigned char *HDR); +static GLuint PVR_TextureFormat(unsigned char *HDR); + +static GLuint _glGetMipmapLevelCount(GLuint width, GLuint height) { + return 1 + floor(log2(MAX(width, height))); +} + +static GLuint _glGetMipmapDataSize(GLuint width, GLuint height) { + GLuint size = 0; + + GLuint i = 0; + + for(; i < _glGetMipmapLevelCount(width, height); ++i) { + size += (width * height * 2); + + if(width > 1) { + width /= 2; + } + + if(height > 1) { + height /= 2; + } + } + + return size; +} + +/* Load a PVR texture file into memory, and then bind the texture to Open GL. + fname is the name of the PVR texture file to be opened and read. + isMipMapped should be passed as 1 if the texture contains MipMap levels, 0 otherwise. + glMipMap should be passed as 1 if Open GL should calculate the Mipmap levels, 0 otherwise */ +GLuint glTextureLoadPVR(char *fname, unsigned char isMipMapped, unsigned char glMipMap) { + FILE *tex = NULL; + uint16_t *TEX0 = NULL; + uint8_t HDR[PVR_HDR_SIZE]; + GLuint texID, texSize, texW, texH, texFormat; + + /* Open the PVR texture file, and get its file size */ + tex = fopen(fname, "rb"); + + if(tex == NULL) { + printf("FILE READ ERROR: %s\n", fname); + + while(1); + } + + fseek(tex, 0, SEEK_END); + texSize = ftell(tex) - PVR_HDR_SIZE; + fseek(tex, 0, SEEK_SET); + + /* Read in the PVR texture file header */ + fread(HDR, 1, PVR_HDR_SIZE, tex); + + /* Extract some information from the PVR texture file header */ + texW = PVR_TextureWidth(HDR); + texH = PVR_TextureHeight(HDR); + texFormat = PVR_TextureFormat(HDR); + + /* Allocate Some Memory for the texture. If we are using Open GL to build the MipMap, + we need to allocate enough space to hold the MipMap texture levels. */ + if(!isMipMapped && glMipMap) + TEX0 = malloc(_glGetMipmapDataSize(texW, texH)); + else + TEX0 = malloc(texSize); + + fread(TEX0, 1, texSize, tex); /* Read in the PVR texture data */ + + /* Generate and bind a texture as normal for Open GL */ + glGenTextures(1, &texID); + glBindTexture(GL_TEXTURE_2D, texID); + + if(texFormat != GL_UNSIGNED_SHORT_5_6_5) + glCompressedTexImage2DARB(GL_TEXTURE_2D, + 0, + texFormat, + texW, + texH, + 0, + texSize, + TEX0); + else { + fprintf(stderr, "%x\n", texFormat); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGB, + texW, texH, + 0, + GL_RGB, + texFormat, + TEX0); + if(!isMipMapped && glMipMap) + glGenerateMipmapEXT(GL_TEXTURE_2D); + } + + free(TEX0); + + return texID; +} + +static GLuint PVR_TextureFormat(unsigned char *HDR) { + GLuint color = (GLuint)HDR[PVR_HDR_SIZE - 8]; + GLuint format = (GLuint)HDR[PVR_HDR_SIZE - 7]; + + GLboolean twiddled = format == 0x01; + GLboolean compressed = (format == 0x10 || format == 0x03); + + if(compressed) { + if(twiddled) { + switch(color) { + case 0x0: { + return GL_COMPRESSED_ARGB_1555_VQ_TWID_KOS; + } break; + case 0x01: { + return GL_COMPRESSED_RGB_565_VQ_TWID_KOS; + } break; + case 0x02: { + return GL_COMPRESSED_ARGB_4444_VQ_TWID_KOS; + } + break; + default: + fprintf(stderr, "Invalid texture format"); + return 0; + } + } else { + switch(color) { + case 0: { + return GL_COMPRESSED_ARGB_1555_VQ_KOS; + } break; + case 1: { + return GL_COMPRESSED_RGB_565_VQ_KOS; + } break; + case 2: { + return GL_COMPRESSED_ARGB_4444_VQ_KOS; + } + break; + default: + fprintf(stderr, "Invalid texture format"); + return 0; + } + } + } else { + if(color == 1) { + return GL_UNSIGNED_SHORT_5_6_5; + } + return 0; + } +} + +static GLuint PVR_TextureWidth(unsigned char *HDR) { + return (GLuint)HDR[PVR_HDR_SIZE - 4] | HDR[PVR_HDR_SIZE - 3] << 8; +} + +static GLuint PVR_TextureHeight(unsigned char *HDR) { + return (GLuint)HDR[PVR_HDR_SIZE - 2] | HDR[PVR_HDR_SIZE - 1] << 8; +} diff --git a/samples/nehe08/romdisk/glass.pvr b/samples/nehe08/romdisk/glass.pvr new file mode 100644 index 0000000000000000000000000000000000000000..3f81ec09096ab1d1c85261746dc03fcd55d8e37e GIT binary patch literal 32800 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 bH(iGgs{`IM8P}j0zIqYTZ-D&Mf6MrPIRRsY literal 0 HcmV?d00001