#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
-#include <GL/glut.h>
#include <cgmath/cgmath.h>
-#include "mesh.h"
+#include "miniglut.h"
+#include "level.h"
enum {
KEY_F1 = GLUT_KEY_F1 | 0x100,
static void skeyup(int key, int x, int y);
static void mouse(int bn, int st, int x, int y);
static void motion(int x, int y);
-
+static unsigned int nextpow2(unsigned int x);
static long start_time;
{' ', 0}
};
-static struct scenefile scn;
+static struct level lvl;
+
+static unsigned int tex;
+static int tex_width, tex_height;
+static int tex_intfmt;
+static float tex_xform[16];
+
int main(int argc, char **argv)
{
{
glEnable(GL_CULL_FACE);
+ /*
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
+ */
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ tex_intfmt = GL_RGB16F;
- if(load_scenefile(&scn, "data/testlvl.obj") == -1) {
+ if(load_level(&lvl, "data/test.lvl") == -1) {
return -1;
}
static void cleanup(void)
{
- destroy_scenefile(&scn);
+ destroy_level(&lvl);
+
+ glDeleteTextures(1, &tex);
}
#define WALK_SPEED 3.0f
static void display(void)
{
- struct mesh *mesh;
-
update();
+ render();
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, fb.width, fb.height, GL_RGB, GL_FLOAT, fb.pixels);
+ glEnable(GL_TEXTURE_2D);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex2f(-1, -1);
+ glTexCoord2f(1, 0);
+ glVertex2f(1, -1);
+ glTexCoord2f(1, 1);
+ glVertex2f(1, 1);
+ glTexCoord2f(0, 1);
+ glVertex2f(-1, 1);
+ glEnd();
+
+ /*
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(pxform);
- mesh = scn.meshlist;
- while(mesh) {
- float col[4];
- col[0] = mesh->mtl.color.x;
- col[1] = mesh->mtl.color.y;
- col[2] = mesh->mtl.color.z;
- col[3] = 1.0f;
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
-
- draw_mesh(mesh);
- mesh = mesh->next;
- }
+ draw_level(&lvl);
+ */
glutSwapBuffers();
assert(glGetError() == GL_NO_ERROR);
static void reshape(int x, int y)
{
+ /*
+ float proj[16];
+
+ cgm_mperspective(proj, cgm_deg_to_rad(50.0f), (float)x / (float)y, 0.5, 500.0);
+
glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
+ glLoadMatrixf(proj);
+ */
+
+ if(x > tex_width || y > tex_height) {
+ tex_width = nextpow2(x);
+ tex_height = nextpow2(y);
+
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexImage2D(GL_TEXTURE_2D, 0, tex_intfmt, tex_width, tex_height, 0, GL_RGB, GL_FLOAT, 0);
+ }
+ fbsize(x, y);
+ cgm_mscaling(tex_xform, (float)x / tex_width, (float)y / tex_height, 1.0f);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadMatrixf(tex_xform);
}
static void keyb(int key, int press)
if(cam_phi > M_PI) cam_phi = M_PI;
}
}
+
+static unsigned int nextpow2(unsigned int x)
+{
+ x--;
+ x |= x >> 1;
+ x |= x >> 2;
+ x |= x >> 4;
+ x |= x >> 8;
+ x |= x >> 16;
+ return x + 1;
+}