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

游戏引擎

开发平台:

Visual C++

  1. /* ObjectParticles
  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 "material.h"
  22. #include "particles.h"
  23. #include "object.h"
  24. #include "fog.h"
  25. #include "objectparticles.h"
  26. ObjectParticles::ObjectParticles(Particles *particles) : Object(OBJECT_PARTICLES), particles(particles), off_time(-1.0f) {
  27. materials = new Material*[getNumSurfaces()];
  28. opacities = new int[getNumSurfaces()];
  29. transparents = new int[getNumSurfaces()];
  30. pos = Particles::OFF;
  31. }
  32. ObjectParticles::~ObjectParticles() {
  33. delete materials;
  34. delete opacities;
  35. delete transparents;
  36. }
  37. /*
  38.  */
  39. void ObjectParticles::update(float ifps) {
  40. Object::update(ifps);
  41. if(off_time > 0.0 && time > off_time) particles->set(Particles::OFF);
  42. else particles->set(pos);
  43. particles->update(ifps);
  44. min = particles->getMin() - pos;
  45. max = particles->getMax() - pos;
  46. center = particles->getCenter() - pos;
  47. updatePos(pos);
  48. }
  49. /*
  50.  */
  51. void ObjectParticles::setOffTime(float time) {
  52. this->time = 0;
  53. off_time = time;
  54. }
  55. /*
  56.  */
  57. int ObjectParticles::render(int t,int s) {
  58. int num_triangles = 0;
  59. frame = Engine::frame;
  60. if(t == RENDER_TRANSPARENT) {
  61. if(num_transparents) {
  62. if(materials[0]->enable()) {
  63. float min_density = 1.0;
  64. Engine::fog_color = vec4(1.0,1.0,1.0,1.0); // without fog
  65. for(int i = 0; i < Engine::num_visible_fogs; i++) {
  66. float density = Engine::visible_fogs[i]->getDensity(pos);
  67. if(min_density > density) {
  68. Engine::fog_color = vec4(Engine::visible_fogs[i]->color,density);
  69. min_density = density;
  70. }
  71. }
  72. materials[0]->bind();
  73. num_triangles = particles->render();
  74. }
  75. }
  76. }
  77. return num_triangles;
  78. }
  79. /*
  80.  */
  81. void ObjectParticles::findSilhouette(const vec4 &light,int s) {
  82. }
  83. int ObjectParticles::getNumIntersections(const vec3 &line0,const vec3 &line1,int s) {
  84. return 0;
  85. }
  86. int ObjectParticles::renderShadowVolume(int s) {
  87. return 0;
  88. }
  89. /*
  90.  */
  91. int ObjectParticles::intersection(const vec3 &line0,const vec3 &line1,vec3 &point,vec3 &normal,int s) {
  92. return 0;
  93. }
  94. /*
  95.  */
  96. int ObjectParticles::getNumSurfaces() {
  97. return 1;
  98. }
  99. const char *ObjectParticles::getSurfaceName(int s) {
  100. return "particles";
  101. }
  102. int ObjectParticles::getSurface(const char *name) {
  103. return 0;
  104. }
  105. /*
  106.  */
  107. const vec3 &ObjectParticles::getMin(int s) {
  108. return min;
  109. }
  110. const vec3 &ObjectParticles::getMax(int s) {
  111. return max;
  112. }
  113. const vec3 &ObjectParticles::getCenter(int s) {
  114. return center;
  115. }
  116. float ObjectParticles::getRadius(int s) {
  117. return particles->getRadius();
  118. }