Obj Particles.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. namespace Game{
  5. /******************************************************************************/
  6. ObjParticles::~ObjParticles()
  7. {
  8. }
  9. ObjParticles::ObjParticles()
  10. {
  11. }
  12. /******************************************************************************/
  13. // MANAGE
  14. /******************************************************************************/
  15. void ObjParticles::create(Object &obj)
  16. {
  17. Particles *ps=null;
  18. if(Param *p=obj.findParam("particles")) // have Particles object specified
  19. {
  20. if(p->type==PARAM_STR)ps=ParticlesCache(p->asText());else
  21. if(p->type==PARAM_ID )ps=ParticlesCache(p->asID ());
  22. }
  23. if(ps)particles.create(*ps);else // create from particles
  24. { // otherwise check for all parameters manually
  25. if(Param *p=obj.findParam("Image"))
  26. {
  27. if(p->type==PARAM_STR)particles.image=p->asText();else
  28. if(p->type==PARAM_ID )particles.image=p->asID ();
  29. }
  30. if(Param *p=obj.findParam("Palette Image"))
  31. {
  32. if(p->type==PARAM_STR)particles.palette_image=p->asText();else
  33. if(p->type==PARAM_ID )particles.palette_image=p->asID ();
  34. }
  35. if(Param *p=obj.findParam("Image Frames X" ))particles.image_x_frames =Mid(p->asInt (), 1, 65535);else particles.image_x_frames=1;
  36. if(Param *p=obj.findParam("Image Frames Y" ))particles.image_y_frames =Mid(p->asInt (), 1, 65535);else particles.image_y_frames=1;
  37. if(Param *p=obj.findParam("Image Speed" ))particles.image_speed = p->asFlt () ;else particles.image_speed=1;
  38. if(Param *p=obj.findParam("Reborn" ))particles.reborn = p->asBool () ;else particles.reborn=true;
  39. if(Param *p=obj.findParam("Emitter Life" ))particles.emitter_life_max=Max(p->asFlt (), 0 );else particles.emitter_life_max=0;
  40. if(Param *p=obj.findParam("Fade In Time" ))particles.fade_in =Max(p->asFlt (), 0 );else particles.fade_in =1;
  41. if(Param *p=obj.findParam("Fade Out Time" ))particles.fade_out =Max(p->asFlt (), 0 );else particles.fade_out=1;
  42. if(Param *p=obj.findParam("Palette Mode" ))particles.palette ( p->asBool () );else particles.palette(true);
  43. if(Param *p=obj.findParam("Palette Index" ))particles.paletteIndex ( p->asBool () );else particles.paletteIndex(false);
  44. if(Param *p=obj.findParam("Smooth Fade" ))particles.smooth_fade = p->asBool () ;else particles.smooth_fade=false;
  45. if(Param *p=obj.findParam("Elements" ))particles.p.setNumZero (Max(p->asInt (), 0 ));else particles.p.setNumZero(40);
  46. if(Param *p=obj.findParam("Color" ))particles.color = p->asColor() ;else particles.color.set(158, 0, 0, 0);
  47. if(Param *p=obj.findParam("Glow" ))particles.glow =Mid(p->asInt (), 0, 255 );else particles.glow=0;
  48. if(Param *p=obj.findParam("Radius" ))particles.radius = p->asFlt () ;else particles.radius=0.048f;
  49. if(Param *p=obj.findParam("Radius Random" ))particles.radius_random =Max(p->asFlt (), 0 );else particles.radius_random=0;
  50. if(Param *p=obj.findParam("Radius Growth" ))particles.radius_growth =Max(p->asFlt (), 0 );else particles.radius_growth=1;
  51. if(Param *p=obj.findParam("Offset Range" ))particles.offset_range = p->asFlt () ;else particles.offset_range=0;
  52. if(Param *p=obj.findParam("Offset Speed" ))particles.offset_speed = p->asFlt () ;else particles.offset_speed=1;
  53. if(Param *p=obj.findParam("Life" ))particles.life =Max(p->asFlt (), 0 );else particles.life=1.31f;
  54. if(Param *p=obj.findParam("Life Random" ))particles.life_random =Max(p->asFlt (), 0 );else particles.life_random=0;
  55. if(Param *p=obj.findParam("Glue" ))particles.glue =Sat(p->asFlt () );else particles.glue=0;
  56. if(Param *p=obj.findParam("Velocity Damping" ))particles.damping =Sat(p->asFlt () );else particles.damping=0;
  57. if(Param *p=obj.findParam("Angular Velocity" ))particles.ang_vel = p->asFlt () ;else particles.ang_vel=0;
  58. if(Param *p=obj.findParam("Random Velocity" ))particles.vel_random = p->asFlt () ;else particles.vel_random=0;
  59. if(Param *p=obj.findParam("Initial Velocity X"))particles.vel_constant.x = p->asFlt () ;else particles.vel_constant.x=0;
  60. if(Param *p=obj.findParam("Initial Velocity Y"))particles.vel_constant.y = p->asFlt () ;else particles.vel_constant.y=0;
  61. if(Param *p=obj.findParam("Initial Velocity Z"))particles.vel_constant.z = p->asFlt () ;else particles.vel_constant.z=0;
  62. if(Param *p=obj.findParam("Acceleration X" ))particles.accel.x = p->asFlt () ;else particles.accel.x=0;
  63. if(Param *p=obj.findParam("Acceleration Y" ))particles.accel.y = p->asFlt () ;else particles.accel.y=0;
  64. if(Param *p=obj.findParam("Acceleration Z" ))particles.accel.z = p->asFlt () ;else particles.accel.z=0;
  65. if(Param *p=obj.findParam("Inside Source" ))particles.inside_shape = p->asBool () ;else particles.inside_shape=true;
  66. SHAPE_TYPE shape_type=SHAPE_NONE; if(Param *p=obj.findParam("Source Shape"))shape_type=p->asEnum(SHAPE_NONE);
  67. switch(shape_type)
  68. {
  69. default : particles.source(Ball(0.5f)); break; // SHAPE_BALL
  70. case SHAPE_POINT : particles.source(VecZero); break;
  71. case SHAPE_EDGE : particles.source(Edge(Vec(-0.5f, 0, 0), Vec(0.5f, 0, 0))); break;
  72. case SHAPE_RECT : particles.source(Rect(-0.5f, 0.5f)); break;
  73. case SHAPE_BOX : particles.source(Box(0.5f)); break;
  74. case SHAPE_OBOX : particles.source(OBox(Box(0.5f))); break;
  75. case SHAPE_CIRCLE : particles.source(Circle(0.5f)); break;
  76. case SHAPE_CAPSULE: particles.source(Capsule(0.3f, 1)); break;
  77. case SHAPE_TUBE : particles.source(Tube(0.3f, 1)); break;
  78. case SHAPE_TORUS : particles.source(Torus(0.3f, 0.1)); break;
  79. case SHAPE_CONE : particles.source(Cone(0.5f, 0, 1, Vec(0, -0.5f, 0))); break;
  80. case SHAPE_PYRAMID: particles.source(Pyramid(0.5f, 1, Vec(0, 0.5f, 0), Vec(0, -1, 0))); break;
  81. }
  82. }
  83. Flt scale =obj.scale();
  84. Matrix matrix=obj.matrixFinal();
  85. particles.matrix =matrix;
  86. particles.radius *=scale;
  87. particles.offset_range*=scale;
  88. particles.vel_random *=scale;
  89. particles.vel_constant*=matrix.orn();
  90. particles.accel *=matrix.orn();
  91. particles.resetFull();
  92. }
  93. /******************************************************************************/
  94. // GET / SET
  95. /******************************************************************************/
  96. Vec ObjParticles::pos ( ) {return particles.matrix.pos ;}
  97. Matrix ObjParticles::matrix( ) {return particles.matrix ;}
  98. void ObjParticles::pos (C Vec &pos ) { particles.matrix.pos=pos ;}
  99. void ObjParticles::matrix(C Matrix &matrix) { particles.matrix =matrix;}
  100. /******************************************************************************/
  101. // UPDATE
  102. /******************************************************************************/
  103. Bool ObjParticles::update()
  104. {
  105. particles.update();
  106. return true;
  107. }
  108. /******************************************************************************/
  109. // DRAW
  110. /******************************************************************************/
  111. UInt ObjParticles::drawPrepare()
  112. {
  113. return IndexToFlag(particles.renderMode()); // particles require additional render mode
  114. }
  115. void ObjParticles::drawBlend () {particles.draw();}
  116. void ObjParticles::drawPalette () {particles.draw();}
  117. void ObjParticles::drawPalette1() {particles.draw();}
  118. /******************************************************************************/
  119. // IO
  120. /******************************************************************************/
  121. Bool ObjParticles::save(File &f)
  122. {
  123. if(super::save(f))
  124. {
  125. f.cmpUIntV(0); // version
  126. if(particles.save(f, false))
  127. return f.ok();
  128. }
  129. return false;
  130. }
  131. Bool ObjParticles::load(File &f)
  132. {
  133. if(super::load(f))switch(f.decUIntV()) // version
  134. {
  135. case 0:
  136. {
  137. if(particles.load(f))
  138. if(f.ok())return true;
  139. }break;
  140. }
  141. return false;
  142. }
  143. /******************************************************************************/
  144. }}
  145. /******************************************************************************/