main.cpp
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Mesh Viewer
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include <stdio.h>
  20. #include "glapp.h"
  21. #include "font.h"
  22. #include "mathlib.h"
  23. #include "meshvbo.h"
  24. #include "texture.h"
  25. #define WIDTH 1024
  26. #define HEIGHT 768
  27. class GLAppMain : public GLApp {
  28. public:
  29. int init(const char *name);
  30. void idle();
  31. void render();
  32. int pause;
  33. int wireframe;
  34. float psi,phi;
  35. vec3 camera;
  36. vec3 speed;
  37. mat4 modelview;
  38. mat4 projection;
  39. Font *font;
  40. Mesh *mesh;
  41. float radius;
  42. vec3 center;
  43. int num_triangles;
  44. char texture_name[1024];
  45. Texture *texture;
  46. };
  47. /*
  48.  */
  49. int GLAppMain::init(const char *name) {
  50. // check hardware
  51. checkExtension("GL_ARB_vertex_buffer_object");
  52. pause = 0;
  53. wireframe = 0;
  54. psi = 90;
  55. phi = 20;
  56. camera = vec3(0,5,2);
  57. speed = vec3(0,0,0);
  58. // opengl
  59. glEnable(GL_DEPTH_TEST);
  60. glDepthFunc(GL_LESS);
  61. glEnable(GL_CULL_FACE);
  62. glCullFace(GL_BACK);
  63. glEnable(GL_NORMALIZE);
  64. // font
  65. font = new Font();
  66. if(name) {
  67. mesh = new MeshVBO(name);
  68. radius = mesh->getRadius();
  69. center = mesh->getCenter();
  70. num_triangles = 0;
  71. for(int i = 0; i < mesh->getNumSurfaces(); i++) num_triangles += mesh->getNumTriangles(i);
  72. } else {
  73. char name[1024];
  74. if(selectFile("select 3d file",name)) {
  75. mesh = new MeshVBO(name);
  76. radius = mesh->getRadius();
  77. center = mesh->getCenter();
  78. num_triangles = 0;
  79. for(int i = 0; i < mesh->getNumSurfaces(); i++) num_triangles += mesh->getNumTriangles(i);
  80. } else {
  81. exit();
  82. }
  83. }
  84. texture = NULL;
  85. error();
  86. return 1;
  87. }
  88. /*
  89.  */
  90. void GLAppMain::render() {
  91. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  92. glMatrixMode(GL_PROJECTION);
  93.     glLoadMatrixf(projection);
  94.     glMatrixMode(GL_MODELVIEW);
  95. glLoadMatrixf(modelview);
  96. glEnable(GL_LIGHTING);
  97. glEnable(GL_LIGHT0);
  98. glLightfv(GL_LIGHT0,GL_POSITION,vec4(camera,1));
  99. if(texture) {
  100. texture->enable();
  101. texture->bind();
  102. }
  103. glScalef(2.0 / radius,2.0 / radius,2.0 / radius);
  104. glTranslatef(-center.x,-center.y,-center.z);
  105. glColor3f(1,1,1);
  106. if(wireframe) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  107. mesh->render();
  108. if(wireframe) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  109. if(texture) texture->disable();
  110. glDisable(GL_LIGHTING);
  111. float step = pow(10,(int)log10(radius));
  112. for(int i = 0; i <= 20; i++) {
  113. if(i == 10) glColor3f(0.6,0.6,0.6);
  114. else glColor3f(0.9,0.9,0.9);
  115. glBegin(GL_LINES);
  116. glVertex3fv(vec3(i - 10,-10,0) * step);
  117. glVertex3fv(vec3(i - 10,10,0) * step);
  118. glEnd();
  119. glBegin(GL_LINES);
  120. glVertex3fv(vec3(-10,i - 10,0) * step);
  121. glVertex3fv(vec3(10,i - 10,0) * step);
  122. glEnd();
  123. }
  124. error();
  125. // info
  126. glColor3f(0.25,1.0,0.01);
  127. font->enable(800,600);
  128. font->printf(10,10,"fps: %.0f",fps);
  129. font->disable();
  130. glColor3f(0.81,1.0,0.11);
  131. font->enable(1024,768);
  132. font->printf(10,40,"'f' - load skinned meshn't' - load texturen'l' - wireframentriangles %dnMtriangles per second %.1fnmin %g %g %gnmax %g %g %g",
  133. num_triangles,(float)num_triangles * fps / 1000000.0,
  134. mesh->getMin().x,mesh->getMin().y,mesh->getMin().z,
  135. mesh->getMax().x,mesh->getMax().y,mesh->getMax().z);
  136. font->disable();
  137. glColor3f(1,1,1);
  138. }
  139. /*
  140.  */
  141. void GLAppMain::idle() {
  142. // keyboard events
  143. if(keys[KEY_ESC]) exit();
  144. if(keys[(int)'l']) {
  145. wireframe = !wireframe;
  146. keys[(int)'l'] = 0;
  147. }
  148. if(keys[(int)'f']) {
  149. char name[1024];
  150. if(selectFile("select 3d file",name)) {
  151. delete mesh;
  152. mesh = new MeshVBO(name);
  153. radius = mesh->getRadius();
  154. center = mesh->getCenter();
  155. if(texture) delete texture;
  156. texture = NULL;
  157. }
  158. keys[(int)'f'] = 0;
  159. }
  160. num_triangles = 0;
  161. for(int i = 0; i < mesh->getNumSurfaces(); i++) num_triangles += mesh->getNumTriangles(i);
  162. if(keys[(int)'t']) {
  163. if(selectFile("select texture",texture_name)) {
  164. if(texture) delete texture;
  165. texture = new Texture(texture_name);
  166. }
  167. keys[(int)'t'] = 0;
  168. }
  169. if(keys[(int)'r']) {
  170. if(texture) {
  171. delete texture;
  172. texture = new Texture(texture_name);
  173. }
  174. }
  175. // camera movement
  176. static int look = 0;
  177. if(!look && mouseButton & BUTTON_LEFT) {
  178. setCursor(windowWidth / 2,windowHeight / 2);
  179. mouseX = windowWidth / 2;
  180. mouseY = windowHeight / 2;
  181. look = 1;
  182. }
  183. if(mouseButton & BUTTON_RIGHT) look = 0;
  184. if(look) {
  185. showCursor(0);
  186. static float count = 0;
  187. count += ifps;
  188. if(count > 1.0 / 60.0) {
  189. psi += (mouseX - windowWidth / 2) * 0.2;
  190. phi += (mouseY - windowHeight / 2) * 0.2;
  191. if(phi < -89) phi = -89;
  192. if(phi > 89) phi = 89;
  193. setCursor(windowWidth / 2,windowHeight / 2);
  194. count -= 1.0 / 60.0;
  195. }
  196. } else showCursor(1);
  197. if(keys[KEY_UP] || keys[(int)'w']) speed.x += 40 * ifps;
  198. if(keys[KEY_DOWN] || keys[(int)'s']) speed.x -= 40 * ifps;
  199. if(keys[KEY_LEFT] || keys[(int)'a']) speed.y -= 40 * ifps;
  200. if(keys[KEY_RIGHT] || keys[(int)'d']) speed.y += 40 * ifps;
  201. if(keys[KEY_SHIFT]) speed.z += 40 * ifps;
  202. if(keys[KEY_CTRL]) speed.z -= 40 * ifps;
  203. speed -= speed * 5 * ifps;
  204. vec3 dir = (quat(vec3(0,0,1),-psi) * quat(vec3(0,1,0),phi)).to_matrix() * vec3(1,0,0);
  205. vec3 x,y,z;
  206. x = dir;
  207. y.cross(dir,vec3(0,0,1));
  208. y.normalize();
  209. z.cross(y,x);
  210. camera += (x * speed.x + y * speed.y + z * speed.z) * ifps;
  211. modelview.look_at(camera,camera + dir,vec3(0,0,1));
  212. projection.perspective(45,(float)windowWidth / (float)windowHeight,0.1,100);
  213. }
  214. /*
  215.  */
  216. int main(int argc,char **argv) {
  217. GLAppMain *glApp = new GLAppMain;
  218. int w = WIDTH;
  219. int h = HEIGHT;
  220. int fs = 0;
  221. for(int i = 1; i < argc; i++) {
  222. if(!strcmp(argv[i],"-fs")) fs = 1;
  223. else if(!strcmp(argv[i],"-w")) sscanf(argv[++i],"%d",&w);
  224. else if(!strcmp(argv[i],"-h")) sscanf(argv[++i],"%d",&h);
  225. }
  226. if(!glApp->setVideoMode(w,h,fs)) return 0;
  227. glApp->setTitle("Mesh Viewer http://frustum.org");
  228. if(!glApp->init(argc > 1 ? argv[1] : NULL)) return 0;
  229. glApp->main();
  230. delete glApp;
  231. return 0;
  232. }