coeng

annotate src/test.cc @ 8:8cce82794f90

seems to work nicely
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 15 Feb 2015 05:14:20 +0200
parents af24cfbdf9b6
children 305c8f6abef1
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include <assert.h>
nuclear@6 4 #include <vector>
nuclear@0 5
nuclear@8 6 #include "opengl.h"
nuclear@0 7 #ifndef __APPLE__
nuclear@0 8 #include <GL/glut.h>
nuclear@0 9 #else
nuclear@0 10 #include <GLUT/glut.h>
nuclear@0 11 #endif
nuclear@0 12
nuclear@8 13 #include "objfile.h"
nuclear@8 14 #include "mesh.h"
nuclear@6 15 #include "gobj.h"
nuclear@6 16 #include "co_xform.h"
nuclear@6 17 #include "co_dbgvis.h"
nuclear@8 18 #include "co_mesh.h"
nuclear@8 19 #include "co_phys.h"
nuclear@6 20 #include "sim.h"
nuclear@6 21
nuclear@0 22 static bool init();
nuclear@0 23 static void cleanup();
nuclear@0 24 static void display();
nuclear@0 25 static void idle();
nuclear@0 26 static void reshape(int x, int y);
nuclear@0 27 static void keyb(unsigned char key, int x, int y);
nuclear@0 28 static void mouse(int bn, int st, int x, int y);
nuclear@0 29 static void motion(int x, int y);
nuclear@8 30 static Mesh *load_mesh(const char *fname);
nuclear@0 31
nuclear@8 32 float cam_theta, cam_phi = 25, cam_dist = 10;
nuclear@6 33
nuclear@6 34 std::vector<GObject*> objects;
nuclear@6 35 SimWorld simworld;
nuclear@6 36
nuclear@0 37
nuclear@0 38 int main(int argc, char **argv)
nuclear@0 39 {
nuclear@0 40 glutInit(&argc, argv);
nuclear@0 41 glutInitWindowSize(800, 600);
nuclear@0 42 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
nuclear@0 43 glutCreateWindow("component system test");
nuclear@0 44
nuclear@0 45 glutDisplayFunc(display);
nuclear@7 46 glutIdleFunc(idle);
nuclear@0 47 glutReshapeFunc(reshape);
nuclear@0 48 glutKeyboardFunc(keyb);
nuclear@0 49 glutMouseFunc(mouse);
nuclear@0 50 glutMotionFunc(motion);
nuclear@0 51
nuclear@0 52 if(!init()) {
nuclear@0 53 return 1;
nuclear@0 54 }
nuclear@0 55 atexit(cleanup);
nuclear@0 56
nuclear@0 57 glutMainLoop();
nuclear@0 58 return 0;
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 static bool init()
nuclear@0 62 {
nuclear@8 63 init_opengl();
nuclear@8 64
nuclear@0 65 glEnable(GL_DEPTH_TEST);
nuclear@0 66 glEnable(GL_CULL_FACE);
nuclear@0 67
nuclear@6 68 glEnable(GL_LIGHTING);
nuclear@6 69 glEnable(GL_LIGHT0);
nuclear@6 70 float ldir[] = {-1, 1, 2, 0};
nuclear@6 71 glLightfv(GL_LIGHT0, GL_POSITION, ldir);
nuclear@6 72
nuclear@8 73 GObject *obj;
nuclear@8 74
nuclear@8 75 Mesh *mesh = load_mesh("lucy.obj");
nuclear@8 76 if(!mesh) {
nuclear@8 77 return false;
nuclear@8 78 }
nuclear@8 79
nuclear@8 80 obj = new GObject;
nuclear@6 81 obj->add_component(new CoXForm);
nuclear@6 82 obj->add_component(new CoPRS);
nuclear@8 83 obj->add_component(new CoMesh);
nuclear@8 84 gobj_co_prs(obj)->pos = Vector3(-3, 0, 0);
nuclear@8 85 gobj_co_mesh(obj)->mesh = mesh;
nuclear@6 86 objects.push_back(obj);
nuclear@6 87
nuclear@6 88 obj = new GObject;
nuclear@6 89 obj->add_component(new CoSphereVis);
nuclear@6 90 obj->add_component(new CoXForm);
nuclear@6 91 obj->add_component(new CoPRS);
nuclear@8 92 gobj_co_prs(obj)->pos = Vector3(3, 3, 0);
nuclear@8 93 obj->add_component(new CoRigid);
nuclear@8 94 obj->add_component(new CoCollider);
nuclear@8 95 gobj_co_collider(obj)->shape = new Sphere;
nuclear@6 96 objects.push_back(obj);
nuclear@8 97 simworld.add_object(obj);
nuclear@8 98
nuclear@8 99 obj = new GObject;
nuclear@8 100 obj->add_component(new CoXForm);
nuclear@8 101 obj->add_component(new CoPRS);
nuclear@8 102 obj->add_component(new CoRigid);
nuclear@8 103 obj->add_component(new CoCollider);
nuclear@8 104 gobj_co_collider(obj)->shape = new Plane;
nuclear@8 105 gobj_co_rigid(obj)->set_fixed(true);
nuclear@8 106 objects.push_back(obj);
nuclear@8 107 simworld.add_object(obj);
nuclear@6 108
nuclear@0 109 return true;
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 static void cleanup()
nuclear@0 113 {
nuclear@8 114 for(size_t i=0; i<objects.size(); i++) {
nuclear@8 115 delete objects[i];
nuclear@8 116 }
nuclear@8 117 objects.clear();
nuclear@0 118 }
nuclear@0 119
nuclear@6 120 static void update()
nuclear@6 121 {
nuclear@6 122 static unsigned int prev_upd;
nuclear@6 123 unsigned int msec = glutGet(GLUT_ELAPSED_TIME);
nuclear@6 124 float dt = (float)(msec - prev_upd) / 1000.0f;
nuclear@6 125 prev_upd = msec;
nuclear@6 126
nuclear@6 127 for(size_t i=0; i<objects.size(); i++) {
nuclear@6 128 objects[i]->update(dt);
nuclear@6 129 }
nuclear@6 130 }
nuclear@6 131
nuclear@0 132 static void display()
nuclear@0 133 {
nuclear@6 134 update();
nuclear@6 135
nuclear@0 136 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
nuclear@0 137
nuclear@6 138 glMatrixMode(GL_MODELVIEW);
nuclear@6 139 glLoadIdentity();
nuclear@6 140 glTranslatef(0, 0, -cam_dist);
nuclear@6 141 glRotatef(cam_phi, 1, 0, 0);
nuclear@6 142 glRotatef(cam_theta, 0, 1, 0);
nuclear@8 143 glTranslatef(0, -0.5, 0);
nuclear@6 144
nuclear@6 145 float floor_col[] = {0.2, 0.8, 0.2, 1};
nuclear@6 146 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, floor_col);
nuclear@6 147
nuclear@6 148 glBegin(GL_QUADS);
nuclear@6 149 glNormal3f(0, 1, 0);
nuclear@6 150 glVertex3f(-10, 0, 10);
nuclear@6 151 glVertex3f(10, 0, 10);
nuclear@6 152 glVertex3f(10, 0, -10);
nuclear@6 153 glVertex3f(-10, 0, -10);
nuclear@6 154 glEnd();
nuclear@6 155
nuclear@8 156 float obj_col[] = {0.9, 0.9, 0.9, 1};
nuclear@8 157 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, obj_col);
nuclear@8 158
nuclear@6 159 for(size_t i=0; i<objects.size(); i++) {
nuclear@8 160 objects[i]->draw();
nuclear@6 161 }
nuclear@6 162
nuclear@0 163 glutSwapBuffers();
nuclear@0 164 assert(glGetError() == GL_NO_ERROR);
nuclear@0 165 }
nuclear@0 166
nuclear@0 167 static void idle()
nuclear@0 168 {
nuclear@0 169 glutPostRedisplay();
nuclear@0 170 }
nuclear@0 171
nuclear@0 172 static void reshape(int x, int y)
nuclear@0 173 {
nuclear@0 174 glViewport(0, 0, x, y);
nuclear@0 175
nuclear@2 176 glMatrixMode(GL_PROJECTION);
nuclear@0 177 glLoadIdentity();
nuclear@0 178 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
nuclear@0 179 }
nuclear@0 180
nuclear@0 181 static void keyb(unsigned char key, int x, int y)
nuclear@0 182 {
nuclear@0 183 switch(key) {
nuclear@0 184 case 27:
nuclear@0 185 exit(0);
nuclear@0 186 }
nuclear@0 187 }
nuclear@0 188
nuclear@6 189 static bool bnstate[16];
nuclear@0 190 static int prev_x, prev_y;
nuclear@0 191
nuclear@0 192 static void mouse(int bn, int st, int x, int y)
nuclear@0 193 {
nuclear@6 194 bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN;
nuclear@6 195 prev_x = x;
nuclear@6 196 prev_y = y;
nuclear@0 197 }
nuclear@0 198
nuclear@0 199 static void motion(int x, int y)
nuclear@0 200 {
nuclear@6 201 int dx = x - prev_x;
nuclear@6 202 int dy = y - prev_y;
nuclear@6 203 prev_x = x;
nuclear@6 204 prev_y = y;
nuclear@6 205
nuclear@6 206 if(bnstate[0]) {
nuclear@6 207 cam_theta += dx * 0.5;
nuclear@6 208 cam_phi += dy * 0.5;
nuclear@6 209
nuclear@6 210 if(cam_phi < -90) cam_phi = -90;
nuclear@6 211 if(cam_phi > 90) cam_phi = 90;
nuclear@6 212
nuclear@6 213 glutPostRedisplay();
nuclear@6 214 }
nuclear@6 215 if(bnstate[2]) {
nuclear@6 216 cam_dist += dy * 0.1;
nuclear@6 217
nuclear@6 218 if(cam_dist < 0.0) cam_dist = 0.0;
nuclear@6 219 }
nuclear@0 220 }
nuclear@8 221
nuclear@8 222 static Mesh *load_mesh(const char *fname)
nuclear@8 223 {
nuclear@8 224 struct objfile *objf = objf_load(fname);
nuclear@8 225 if(!objf) {
nuclear@8 226 return 0;
nuclear@8 227 }
nuclear@8 228 int nverts = objf_vertex_count(objf);
nuclear@8 229
nuclear@8 230 Mesh *m = new Mesh;
nuclear@8 231 m->set_attrib_data(MESH_ATTR_VERTEX, 3, nverts, objf_vertices(objf));
nuclear@8 232 m->set_attrib_data(MESH_ATTR_NORMAL, 3, nverts, objf_normals(objf));
nuclear@8 233 m->set_attrib_data(MESH_ATTR_TEXCOORD, 2, nverts, objf_texcoords(objf));
nuclear@8 234 objf_free(objf);
nuclear@8 235 return m;
nuclear@8 236 }