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

游戏引擎

开发平台:

Visual C++

  1. /* ObjectSkinnedMesh
  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 "engine.h"
  20. #include "bsp.h"
  21. #include "frustum.h"
  22. #include "material.h"
  23. #include "skinnedmesh.h"
  24. #include "ragdoll.h"
  25. #include "engine.h"
  26. #include "object.h"
  27. #include "objectskinnedmesh.h"
  28. float ObjectSkinnedMesh::skin_time_step = 1.0f / 25.0f;
  29. /*
  30.  */
  31. ObjectSkinnedMesh::ObjectSkinnedMesh(SkinnedMesh *skinnedmesh) : Object(OBJECT_SKINNEDMESH), skinnedmesh(skinnedmesh), ragdoll(NULL), skin_time(0.0) {
  32. materials = new Material*[getNumSurfaces()];
  33. opacities = new int[getNumSurfaces()];
  34. transparents = new int[getNumSurfaces()];
  35. frames = new int[getNumSurfaces()];
  36. }
  37. ObjectSkinnedMesh::ObjectSkinnedMesh(const char *name) : Object(OBJECT_SKINNEDMESH), ragdoll(NULL), skin_time(0.0)  {
  38. skinnedmesh = new SkinnedMesh(Engine::findFile(name));
  39. materials = new Material*[getNumSurfaces()];
  40. opacities = new int[getNumSurfaces()];
  41. transparents = new int[getNumSurfaces()];
  42. frames = new int[getNumSurfaces()];
  43. }
  44. ObjectSkinnedMesh::~ObjectSkinnedMesh() {
  45. delete materials;
  46. delete opacities;
  47. delete transparents;
  48. delete frames;
  49. }
  50. /*
  51.  */
  52. void ObjectSkinnedMesh::update(float ifps) {
  53. Object::update(ifps);
  54. if(ragdoll) {
  55. ragdoll->update();
  56. } else {
  57. skinnedmesh->setFrame(time * 10);
  58. }
  59. skin_time += ifps;
  60. if(skin_time > skin_time_step) {
  61. skinnedmesh->calculateSkin();
  62. while(skin_time > skin_time_step) skin_time -= skin_time_step;
  63. }
  64. }
  65. /*
  66.  */
  67. int ObjectSkinnedMesh::render(int t,int s) {
  68. int num_triangles = 0;
  69. enable();
  70. if(frame != Engine::frame) {
  71. for(int i = 0; i < getNumSurfaces(); i++) {
  72. frames[i] = Engine::frustum->inside(pos + getMin(i),pos + getMax(i)) ? Engine::frame : 0;
  73. }
  74. frame = Engine::frame;
  75. }
  76. if(t == RENDER_ALL) {
  77. for(int i = 0; i < getNumSurfaces(); i++) {
  78. if(frames[i] != Engine::frame) continue;
  79. num_triangles += skinnedmesh->render(false,i);
  80. }
  81. } else if(t == RENDER_OPACITY) {
  82. for(int i = 0; i < num_opacities; i++) {
  83. int j = opacities[i];
  84. if(frames[j] != Engine::frame) continue;
  85. if(!materials[j]->enable()) continue;
  86. materials[j]->bind();
  87. num_triangles += skinnedmesh->render(true,j);
  88. }
  89. } else if(t == RENDER_TRANSPARENT) {
  90. for(int i = 0; i < num_transparents; i++) {
  91. int j = transparents[i];
  92. if(frames[j] != Engine::frame) continue;
  93. if(!materials[j]->enable()) continue;
  94. materials[j]->bind();
  95. num_triangles += skinnedmesh->render(true,j);
  96. }
  97. }
  98. disable();
  99. return num_triangles;
  100. }
  101. /*
  102.  */
  103. void ObjectSkinnedMesh::findSilhouette(const vec4 &light,int s) {
  104. skinnedmesh->findSilhouette(light,s);
  105. }
  106. int ObjectSkinnedMesh::getNumIntersections(const vec3 &line0,const vec3 &line1,int s) {
  107. return skinnedmesh->getNumIntersections(line0,line1,s);
  108. }
  109. int ObjectSkinnedMesh::renderShadowVolume(int s) {
  110. return skinnedmesh->renderShadowVolume(s);
  111. }
  112. /*
  113.  */
  114. int ObjectSkinnedMesh::intersection(const vec3 &line0,const vec3 &line1,vec3 &point,vec3 &normal,int s) {
  115. if(ragdoll) return 0;
  116. return skinnedmesh->intersection(line0,line1,point,normal,s);
  117. }
  118. /*
  119.  */
  120. int ObjectSkinnedMesh::getNumSurfaces() {
  121. return skinnedmesh->getNumSurfaces();
  122. }
  123. const char *ObjectSkinnedMesh::getSurfaceName(int s) {
  124. return skinnedmesh->getSurfaceName(s);
  125. }
  126. int ObjectSkinnedMesh::getSurface(const char *name) {
  127. return skinnedmesh->getSurface(name);
  128. }
  129. /*
  130.  */
  131. int ObjectSkinnedMesh::getNumBones() {
  132. return skinnedmesh->getNumBones();
  133. }
  134. const char *ObjectSkinnedMesh::getBoneName(int b) {
  135. return skinnedmesh->getBoneName(b);
  136. }
  137. int ObjectSkinnedMesh::getBone(const char *name) {
  138. return skinnedmesh->getBone(name);
  139. }
  140. const mat4 &ObjectSkinnedMesh::getBoneTransform(int b) {
  141. return skinnedmesh->getBoneTransform(b);
  142. }
  143. /*
  144.  */
  145. const vec3 &ObjectSkinnedMesh::getMin(int s) {
  146. return skinnedmesh->getMin(s);
  147. }
  148. const vec3 &ObjectSkinnedMesh::getMax(int s) {
  149. return skinnedmesh->getMax(s);
  150. }
  151. const vec3 &ObjectSkinnedMesh::getCenter(int s) {
  152. return skinnedmesh->getCenter(s);
  153. }
  154. float ObjectSkinnedMesh::getRadius(int s) {
  155. return skinnedmesh->getRadius(s);
  156. }
  157. /*
  158.  */
  159. void ObjectSkinnedMesh::setRagDoll(RagDoll *ragdoll) {
  160. ragdoll->setTransform(transform);
  161. this->ragdoll = ragdoll;
  162. }
  163. /*
  164.  */
  165. void ObjectSkinnedMesh::set(const vec3 &p) {
  166. mat4 m;
  167. m.translate(p);
  168. if(ragdoll) ragdoll->set(m);
  169. else Object::set(m);
  170. }
  171. void ObjectSkinnedMesh::set(const mat4 &m) {
  172. if(ragdoll) ragdoll->set(m);
  173. else Object::set(m);
  174. }