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

游戏引擎

开发平台:

Visual C++

  1. /* Skinned 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 "skinnedmesh.h"
  24. #include "texture.h"
  25. #define WIDTH 1024
  26. #define HEIGHT 768
  27. /*
  28.  */
  29. class GLAppMain : public GLApp {
  30. public:
  31. int init(const char *name);
  32. void idle();
  33. void render();
  34. int pause;
  35. int wireframe;
  36. float time;
  37. float psi,phi;
  38. vec3 camera;
  39. vec3 speed;
  40. mat4 modelview;
  41. mat4 projection;
  42. Font *font;
  43. SkinnedMesh *mesh;
  44. float radius;
  45. vec3 center;
  46. Texture *texture;
  47. };
  48. /*
  49.  */
  50. int GLAppMain::init(const char *name) {
  51. time = 0;
  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 = new Font();
  65. if(name) {
  66. mesh = new SkinnedMesh(name);
  67. radius = mesh->getRadius();
  68. center = mesh->getCenter();
  69. } else {
  70. char name[1024];
  71. if(selectFile("select Skinned Mesh file",name)) {
  72. mesh = new SkinnedMesh(name);
  73. radius = mesh->getRadius();
  74. center = mesh->getCenter();
  75. } else {
  76. exit();
  77. }
  78. }
  79. texture = NULL;
  80. error();
  81. return 1;
  82. }
  83. /*
  84.  */
  85. void GLAppMain::render() {
  86. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  87. glMatrixMode(GL_PROJECTION);
  88.     glLoadMatrixf(projection);
  89.     glMatrixMode(GL_MODELVIEW);
  90. glLoadMatrixf(modelview);
  91. glEnable(GL_LIGHTING);
  92. glEnable(GL_LIGHT0);
  93. glLightfv(GL_LIGHT0,GL_POSITION,vec4(camera,1));
  94. if(texture) {
  95. texture->enable();
  96. texture->bind();
  97. }
  98. glScalef(2.0 / radius,2.0 / radius,2.0 / radius);
  99. glTranslatef(-center.x,-center.y,-center.z);
  100. glColor3f(1,1,1);
  101. if(wireframe) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  102. mesh->render();
  103. if(wireframe) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  104. if(texture) texture->disable();
  105. glDisable(GL_LIGHTING);
  106. float step = pow(10,(int)log10(radius));
  107. for(int i = 0; i <= 20; i++) {
  108. if(i == 10) glColor3f(0.6,0.6,0.6);
  109. else glColor3f(0.9,0.9,0.9);
  110. glBegin(GL_LINES);
  111. glVertex3fv(vec3(i - 10,-10,0) * step);
  112. glVertex3fv(vec3(i - 10,10,0) * step);
  113. glEnd();
  114. glBegin(GL_LINES);
  115. glVertex3fv(vec3(-10,i - 10,0) * step);
  116. glVertex3fv(vec3(10,i - 10,0) * step);
  117. glEnd();
  118. }
  119. error();
  120. // info
  121. glColor3f(0.25,1.0,0.01);
  122. font->enable(800,600);
  123. font->printf(10,10,"fps: %.0f",fps);
  124. font->disable();
  125. glColor3f(0.81,1.0,0.11);
  126. font->enable(1024,768);
  127. font->printf(15,45,"'f' - load skinned meshn't' - load texturen'l' - wireframencenter %.1f %.1f %.1fnradius %0.1f",
  128. center.x,center.y,center.z,radius);
  129. font->disable();
  130. glColor3f(1,1,1);
  131. }
  132. /*
  133.  */
  134. void GLAppMain::idle() {
  135. if(!pause) time += ifps;
  136. mesh->setFrame(time * 15.0);
  137. // keyboard events
  138. if(keys[KEY_ESC]) exit();
  139. if(keys[(int)' ']) {
  140. pause = !pause;
  141. keys[(int)' '] = 0;
  142. }
  143. if(keys[(int)'l']) {
  144. wireframe = !wireframe;
  145. keys[(int)'l'] = 0;
  146. }
  147. if(keys[(int)'f']) {
  148. char name[1024];
  149. if(selectFile("select Skinned Mesh file",name)) {
  150. delete mesh;
  151. mesh = new SkinnedMesh(name);
  152. radius = mesh->getRadius();
  153. center = mesh->getCenter();
  154. if(texture) delete texture;
  155. texture = NULL;
  156. time = 0;
  157. }
  158. keys[(int)'f'] = 0;
  159. }
  160. if(keys[(int)'t']) {
  161. char name[1024];
  162. if(selectFile("select texture",name)) {
  163. if(texture) delete texture;
  164. texture = new Texture(name);
  165. }
  166. keys[(int)'t'] = 0;
  167. }
  168. // camera movement
  169. static int look = 0;
  170. if(!look && mouseButton & BUTTON_LEFT) {
  171. setCursor(windowWidth / 2,windowHeight / 2);
  172. mouseX = windowWidth / 2;
  173. mouseY = windowHeight / 2;
  174. look = 1;
  175. }
  176. if(mouseButton & BUTTON_RIGHT) look = 0;
  177. if(look) {
  178. showCursor(0);
  179. static float count = 0;
  180. count += ifps;
  181. if(count > 1.0 / 60.0) {
  182. psi += (mouseX - windowWidth / 2) * 0.2;
  183. phi += (mouseY - windowHeight / 2) * 0.2;
  184. if(phi < -89) phi = -89;
  185. if(phi > 89) phi = 89;
  186. setCursor(windowWidth / 2,windowHeight / 2);
  187. count -= 1.0 / 60.0;
  188. }
  189. } else showCursor(1);
  190. if(keys[KEY_UP] || keys[(int)'w']) speed.x += 40 * ifps;
  191. if(keys[KEY_DOWN] || keys[(int)'s']) speed.x -= 40 * ifps;
  192. if(keys[KEY_LEFT] || keys[(int)'a']) speed.y -= 40 * ifps;
  193. if(keys[KEY_RIGHT] || keys[(int)'d']) speed.y += 40 * ifps;
  194. if(keys[KEY_SHIFT]) speed.z += 40 * ifps;
  195. if(keys[KEY_CTRL]) speed.z -= 40 * ifps;
  196. speed -= speed * 5 * ifps;
  197. vec3 dir = (quat(vec3(0,0,1),-psi) * quat(vec3(0,1,0),phi)).to_matrix() * vec3(1,0,0);
  198. vec3 x,y,z;
  199. x = dir;
  200. y.cross(dir,vec3(0,0,1));
  201. y.normalize();
  202. z.cross(y,x);
  203. camera += (x * speed.x + y * speed.y + z * speed.z) * ifps;
  204. modelview.look_at(camera,camera + dir,vec3(0,0,1));
  205. projection.perspective(45,(float)windowWidth / (float)windowHeight,0.1,100);
  206. }
  207. /*
  208.  */
  209. int main(int argc,char **argv) {
  210. GLAppMain *glApp = new GLAppMain;
  211. int w = WIDTH;
  212. int h = HEIGHT;
  213. int fs = 0;
  214. for(int i = 1; i < argc; i++) {
  215. if(!strcmp(argv[i],"-fs")) fs = 1;
  216. else if(!strcmp(argv[i],"-w")) sscanf(argv[++i],"%d",&w);
  217. else if(!strcmp(argv[i],"-h")) sscanf(argv[++i],"%d",&h);
  218. }
  219. if(!glApp->setVideoMode(w,h,fs)) return 0;
  220. glApp->setTitle("Skinned Mesh Viewer http://frustum.org");
  221. if(!glApp->init(argc > 1 ? argv[1] : NULL)) return 0;
  222. glApp->main();
  223. delete glApp;
  224. return 0;
  225. }