9 #include <gmath/gmath.h>
14 #define MAX_NUM_SPAWNS 4
18 static void cleanup();
19 static void display();
20 static void reshape(int x, int y);
21 static void keydown(unsigned char key, int x, int y);
22 static void keyup(unsigned char key, int x, int y);
23 static void mouse(int bn, int st, int x, int y);
24 static void motion(int x, int y);
27 static std::vector<Mesh*> meshes;
28 static Mesh *mesh_head;
31 static int win_width, win_height;
32 static float cam_theta, cam_phi = 25, cam_dist = 8;
33 static float head_rz, head_rx; /* rot angles x, z axis */
34 static Mat4 head_xform;
36 int main(int argc, char **argv)
38 glutInit(&argc, argv);
39 glutInitWindowSize(800, 600);
40 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
41 glutCreateWindow("hair test");
43 /* for the keydown, keyup functions to work */
44 glutSetKeyRepeat(GLUT_KEY_REPEAT_OFF);
46 glutDisplayFunc(display);
47 glutReshapeFunc(reshape);
48 glutKeyboardFunc(keydown);
49 glutKeyboardUpFunc(keyup);
51 glutMotionFunc(motion);
67 glEnable(GL_DEPTH_TEST);
68 glEnable(GL_CULL_FACE);
69 glEnable(GL_COLOR_MATERIAL);
71 glEnable(GL_LIGHTING);
74 glClearColor(0.5, 0.5, 0.5, 1);
75 meshes = load_meshes("data/head.fbx");
77 fprintf(stderr, "Failed to load mesh.\n");
81 for(size_t i=0; i<meshes.size(); i++) {
82 meshes[i]->calc_bbox();
84 Vec3 v0 = meshes[i]->bbox.v0;
85 Vec3 v1 = meshes[i]->bbox.v1;
87 printf("mesh: %s\n", meshes[i]->name.c_str());
88 printf("AABB mesh %d: v0: (%f, %f, %f) v1: (%f, %f, %f)\n",
89 (int)i, v0.x, v0.y, v0.z, v1.x, v1.y, v1.z);
91 meshes[i]->update_vbo(MESH_ALL);
93 printf("num vertices: %d num triangles: %d\n",
94 (int)meshes[i]->vertices.size(),
95 (int)meshes[i]->indices.size() / 3);
97 if(meshes[i]->name == "head") {
98 mesh_head = meshes[i];
102 fprintf(stderr, "Failed to find the head mesh.\n");
106 if(!hair.init(mesh_head, MAX_NUM_SPAWNS, THRESH)) {
107 fprintf(stderr, "Failed to initialize hair\n");
114 static void cleanup()
116 for(size_t i=0; i<meshes.size(); i++) {
121 static void display()
123 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
125 head_xform = Mat4::identity;
126 head_xform.rotate_x(gph::deg_to_rad(head_rx));
127 head_xform.rotate_z(-gph::deg_to_rad(head_rz));
129 glMatrixMode(GL_MODELVIEW);
131 glTranslatef(0, 0, -cam_dist);
132 glRotatef(cam_phi, 1, 0, 0);
133 glRotatef(cam_theta, 0, 1, 0);
135 glMultMatrixf(head_xform[0]);
137 for(size_t i=0; i<meshes.size(); i++) {
141 hair.set_transform(head_xform);
145 assert(glGetError() == GL_NO_ERROR);
148 static void reshape(int x, int y)
150 glViewport(0, 0, x, y);
154 glMatrixMode(GL_PROJECTION);
156 gluPerspective(50.0, (float)x / (float)y, 0.5, 500.0);
159 static bool hpressed;
160 static void keydown(unsigned char key, int /*x*/, int /*y*/)
174 static void keyup(unsigned char key, int /*x*/, int /*y*/)
189 static void mouse(int bn, int st, int x, int y)
191 bnstate[bn] = st == GLUT_DOWN;
196 static void motion(int x, int y)
203 if(!dx && !dy) return;
210 if(head_rx < -45) head_rx = -45;
211 if(head_rx > 45) head_rx = 45;
213 if(head_rz < -90) head_rz = -90;
214 if(head_rz > 90) head_rx = 90;
219 cam_theta += dx * 0.5;
222 if(cam_phi < -90) cam_phi = -90;
223 if(cam_phi > 90) cam_phi = 90;
226 cam_dist += dy * 0.1;
227 if(cam_dist < 0) cam_dist = 0;