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

游戏引擎

开发平台:

Visual C++

  1. /* ObjectMesh
  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 "frustum.h"
  20. #include "material.h"
  21. #include "mesh.h"
  22. #include "engine.h"
  23. #include "object.h"
  24. #include "objectmesh.h"
  25. ObjectMesh::ObjectMesh(Mesh *mesh) : Object(OBJECT_MESH), mesh(mesh) {
  26. materials = new Material*[getNumSurfaces()];
  27. opacities = new int[getNumSurfaces()];
  28. transparents = new int[getNumSurfaces()];
  29. frames = new int[getNumSurfaces()];
  30. }
  31. ObjectMesh::ObjectMesh(const char *name) : Object(OBJECT_MESH) {
  32. mesh = Engine::loadMesh(name);
  33. materials = new Material*[getNumSurfaces()];
  34. opacities = new int[getNumSurfaces()];
  35. transparents = new int[getNumSurfaces()];
  36. frames = new int[getNumSurfaces()];
  37. }
  38. ObjectMesh::~ObjectMesh() {
  39. delete materials;
  40. delete opacities;
  41. delete transparents;
  42. delete frames;
  43. }
  44. /*
  45.  */
  46. int ObjectMesh::render(int t,int s) {
  47. int num_triangles = 0;
  48. enable();
  49. if(frame != Engine::frame) {
  50. if(is_identity) {
  51. for(int i = 0; i < getNumSurfaces(); i++) {
  52. frames[i] = Engine::frustum->inside(pos + getMin(i),pos + getMax(i)) ? Engine::frame : 0;
  53. }
  54. } else {
  55. for(int i = 0; i < getNumSurfaces(); i++) {
  56. frames[i] = Engine::frustum->inside(pos + getCenter(i),getRadius(i)) ? Engine::frame : 0;
  57. }
  58. }
  59. frame = Engine::frame;
  60. }
  61. if(t == RENDER_ALL) {
  62. for(int i = 0; i < getNumSurfaces(); i++) {
  63. if(frames[i] != Engine::frame) continue;
  64. num_triangles += mesh->render(false,i);
  65. }
  66. } else if(t == RENDER_OPACITY) {
  67. for(int i = 0; i < num_opacities; i++) {
  68. int j = opacities[i];
  69. if(frames[j] != Engine::frame) continue;
  70. if(!materials[j]->enable()) continue;
  71. materials[j]->bind();
  72. num_triangles += mesh->render(true,j);
  73. }
  74. } else if(t == RENDER_TRANSPARENT) {
  75. for(int i = 0; i < num_transparents; i++) {
  76. int j = transparents[i];
  77. if(frames[j] != Engine::frame) continue;
  78. if(!materials[j]->enable()) continue;
  79. materials[j]->bind();
  80. num_triangles += mesh->render(true,j);
  81. }
  82. }
  83. disable();
  84. return num_triangles;
  85. }
  86. /*
  87.  */
  88. void ObjectMesh::findSilhouette(const vec4 &light,int s) {
  89. mesh->findSilhouette(light,s);
  90. }
  91. int ObjectMesh::getNumIntersections(const vec3 &line0,const vec3 &line1,int s) {
  92. return mesh->getNumIntersections(line0,line1,s);
  93. }
  94. int ObjectMesh::renderShadowVolume(int s) {
  95. return mesh->renderShadowVolume(s);
  96. }
  97. /*
  98.  */
  99. int ObjectMesh::intersection(const vec3 &line0,const vec3 &line1,vec3 &point,vec3 &normal,int s) {
  100. return mesh->intersection(line0,line1,point,normal,s);
  101. }
  102. /*
  103.  */
  104. int ObjectMesh::getNumSurfaces() {
  105. return mesh->getNumSurfaces();
  106. }
  107. const char *ObjectMesh::getSurfaceName(int s) {
  108. return mesh->getSurfaceName(s);
  109. }
  110. int ObjectMesh::getSurface(const char *name) {
  111. return mesh->getSurface(name);
  112. }
  113. /*
  114.  */
  115. const vec3 &ObjectMesh::getMin(int s) {
  116. return mesh->getMin(s);
  117. }
  118. const vec3 &ObjectMesh::getMax(int s) {
  119. return mesh->getMax(s);
  120. }
  121. const vec3 &ObjectMesh::getCenter(int s) {
  122. return mesh->getCenter(s);
  123. }
  124. float ObjectMesh::getRadius(int s) {
  125. return mesh->getRadius(s);
  126. }