home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 22 / PC Actual CD 22.iso / SHARE / prog / POVRAY / EXPLODE.ZIP / EXPLODE.INC < prev    next >
Encoding:
Text File  |  1997-03-10  |  11.4 KB  |  259 lines

  1. // **********************************************************
  2. // OBJECT EXPLODER INCLUDE FILE FOR PERSISTENCE OF VISION 3.x
  3. // **********************************************************
  4. //
  5. // Created by Chris Colefax, March 1997
  6. //
  7. // See "Explode.txt" for more information.
  8. //
  9. // **********************************************************
  10.  
  11. // CHECK EXPLODE OBJECT AND CLOCK
  12. // ******************************
  13.    #declare _EX_tempver = version #version 3.0
  14.    #ifndef (explode_object) #warning "No object specified for explosion!\n" #else
  15.    #ifndef (explode_clock) #declare explode_clock = clock #end
  16.    #if (explode_clock <= 0) object {explode_object} #else
  17.  
  18. // DETERMINE OBJECT DIMENSIONS
  19. // ***************************
  20.    #ifdef  (object_center) #declare _EX_ocentre   = object_center * <1, 1, 1> #end
  21.    #ifdef  (object_centre) #declare _EX_ocentre   = object_centre * <1, 1, 1> #end
  22.    #ifdef  (object_size)   #declare _EX_osize     = object_size   * <1, 1, 1> #end
  23.    #ifndef (object_hollow) #declare object_hollow = true #end
  24.  
  25. // DETERMINE OBJECT SIZE IF NOT SPECIFIED
  26. // **************************************
  27.    #ifdef (_EX_ocentre) #ifndef (_EX_osize)
  28.          #ifdef (object_corner1)
  29.             #declare _EX_osize = 2 * (_EX_ocentre - object_corner1)
  30.          #else #ifdef (object_corner2)
  31.             #declare _EX_osize = 2 * (_EX_ocentre - object_corner2)
  32.          #else #declare _EX_osize = <2, 2, 2>
  33.    #end #end #end
  34.  
  35. // DETERMINE OBJECT CENTRE IF NOT SPECIFIED
  36. // ****************************************
  37.    #else #ifdef (_EX_osize)
  38.       #ifdef (object_corner1)
  39.          #declare _EX_ocentre = object_corner1 + (_EX_osize / 2)
  40.       #else #ifdef (object_corner2)
  41.          #declare _EX_ocentre = object_corner2 - (_EX_osize / 2)
  42.          #else #declare _EX_ocentre = <0, 0, 0>
  43.       #end #end
  44.  
  45. // DETERMINE OBJECT CENTRE & SIZE IF NEITHER SPECIFIED
  46. // ***************************************************
  47.    #else #ifdef (object_corner1) #ifdef (object_corner2)
  48.       #declare _EX_ocentre = (object_corner1 + object_corner2) / 2
  49.       #declare _EX_osize   =  object_corner1 - object_corner2
  50.    #else
  51.       #declare _EX_ocentre = <0, 0, 0>
  52.       #declare _EX_osize   = 2 * object_corner1
  53.    #end #else
  54.       #ifdef (object_corner2)
  55.          #declare _EX_ocentre = <0, 0, 0>
  56.          #declare _EX_osize   = 2 * object_corner2
  57.       #else
  58.          #declare _EX_ocentre = <0, 0, 0>
  59.          #declare _EX_osize   = <2, 2, 2>
  60.    #end #end #end #end
  61.    #declare _EX_osize = <abs(_EX_osize.x), abs(_EX_osize.y), abs(_EX_osize.z)>
  62.  
  63. // DETERMINE PARTICLE PARAMETERS
  64. // *****************************
  65.    #ifdef (particle_res)
  66.       #declare _EX_pres = particle_res * <1, 1, 1>
  67.       #declare _EX_pres = <abs(int(_EX_pres.x)), abs(int(_EX_pres.y)), abs(int(_EX_pres.z))>
  68.       #if (_EX_pres.x < 1) #declare _EX_pres = <1, _EX_pres.y, _EX_pres.z> #end
  69.       #if (_EX_pres.y < 1) #declare _EX_pres = <_EX_pres.x, 1, _EX_pres.z> #end
  70.       #if (_EX_pres.z < 1) #declare _EX_pres = <_EX_pres.x, _EX_pres.y, 1> #end
  71.    #else
  72.       #declare _EX_pres = <3, 3, 3>
  73.    #end
  74.  
  75.    #ifndef (particle_object)  #declare particle_object  = box {<-.5, -.5, -.5>, <.5, .5, .5>}  #end
  76.    #ifndef (particle_texture) #declare particle_texture = texture {pigment {rgb <.5, .5, .5>}} #end
  77.    #declare _EX_gridsize    = _EX_osize / _EX_pres
  78.    #declare _EX_gridstart   = _EX_ocentre + (_EX_gridsize / 2) - (_EX_osize / 2)
  79.    #declare _EX_gridstop    = _EX_ocentre + (_EX_osize / 2)
  80.    #declare _EX_pobject = object {particle_object scale _EX_gridsize}
  81.  
  82. // DETERMINE EXPLOSION PARAMETERS
  83. // ******************************
  84.    #ifdef (exp_location) #declare _EX_eloc = exp_location * <1, 1, 1>
  85.       #else #declare _EX_eloc = <0, 0, 0> #end
  86.    #ifdef (exp_spin) #declare _EX_spin = exp_spin * <1, 1, 1>
  87.       #else #declare _EX_spin = <0, 0, 0> #end
  88.    #ifndef (exp_strength) #declare exp_strength = 10 #end
  89.    #ifndef (exp_falloff)  #declare exp_falloff  =  0 #end
  90.    #ifndef (exp_gravity)  #declare exp_gravity  =  0 #end
  91.    #ifndef (exp_sky) #declare exp_sky = y
  92.       #else #declare exp_sky = vnormalize(exp_sky) #end
  93.    #declare _EX_grav = -exp_sky * abs(exp_gravity)
  94.  
  95. // DETERMINE GROUND PARAMETERS
  96. // ***************************
  97.    #ifndef (ground_plane) #declare ground_plane = false
  98.       #else #if (ground_plane != false)
  99.          #ifndef (ground_dist) #declare ground_dist = 0 #end
  100.          #ifndef (ground_reflection) #declare ground_reflection = 0
  101.             #else #declare ground_reflection = abs(ground_reflection) #end
  102.          #ifndef (max_bounces) #declare max_bounces = 1
  103.             #else #declare max_bounces = abs(max_bounces) #end
  104.          #if (exp_sky.y != 1)
  105.             #declare _EX_wrotx = degrees(atan2(vlength(exp_sky * <1, 0, 1>), exp_sky.y))
  106.             #declare _EX_wroty = degrees(atan2(exp_sky.x, exp_sky.z))
  107.             #declare _EX_grav  = -y * abs(exp_gravity)
  108.    #end #end #end
  109.  
  110. // DETERMINE TURBULENCE (RANDOMNESS) PARAMETERS
  111. // ********************************************
  112.    #ifndef (exp_turb) #declare exp_turb = 0
  113.       #else #if (exp_turb != 0)
  114.          #ifdef (exp_seed) #declare _EX_rand = seed(exp_seed)
  115.             #else #declare _EX_rand = seed(0) #end
  116.          #ifndef (scale_turb) #declare _EX_sturb = exp_turb
  117.             #else #declare _EX_sturb = scale_turb * exp_turb #end
  118.          #ifndef (rotate_turb) #declare _EX_rturb = exp_turb
  119.             #else #declare _EX_rturb = rotate_turb * exp_turb #end
  120.          #ifndef (vel_turb) #declare _EX_vturb = exp_turb
  121.             #else #declare _EX_vturb = vel_turb * exp_turb #end
  122.          #ifndef (dir_turb) #declare _EX_dturb = exp_turb
  123.             #else #declare _EX_dturb = dir_turb * exp_turb #end
  124.          #ifndef (spin_turb) #declare _EX_spturb = exp_turb
  125.             #else #declare _EX_spturb = spin_turb * exp_turb #end
  126.    #end #end
  127.  
  128. // CREATE EXPLOSION
  129. // ****************
  130.    union {
  131.       #declare _EX_gridx = _EX_gridstart.x #while (_EX_gridx < _EX_gridstop.x)
  132.          #declare _EX_gridy = _EX_gridstart.y #while (_EX_gridy < _EX_gridstop.y)
  133.             #declare _EX_gridz = _EX_gridstart.z #while (_EX_gridz < _EX_gridstop.z)
  134.  
  135. // CREATE PARTICLE FROM ORIGINAL OBJECT
  136. // ************************************
  137.    #if (exp_turb = 0)
  138.       #declare _EX_pscale  = <1, 1, 1>
  139.       #declare _EX_protate = <0, 0, 0>
  140.    #else
  141.       #declare _EX_pscale  = 1 + ((<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_sturb * 2)
  142.       #declare _EX_protate = (1 + ((<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_rturb)) * 360
  143.    #end
  144.    #declare _EX_ptrans = <_EX_gridx, _EX_gridy, _EX_gridz>
  145.  
  146.    #declare _EX_particle = #if (object_hollow = false)
  147.       intersection {object {explode_object}
  148.          object {_EX_pobject scale _EX_pscale * 1.01 rotate _EX_protate
  149.             translate _EX_ptrans texture {particle_texture}}
  150.    #else object {explode_object #end
  151.       clipped_by {_EX_pobject scale _EX_pscale * 1.02 rotate _EX_protate
  152.          translate _EX_ptrans}
  153.       translate -_EX_ptrans}
  154.  
  155. // CALCULATE INITIAL PARTICLE VELOCITY
  156. // ***********************************
  157.    #if (exp_strength = 0) #if (exp_turb = 0)
  158.       #declare _EX_pvel = <0, 0, 0>
  159.       #else
  160.          #declare _EX_pvel = (<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_gridsize * _EX_vturb * 2
  161.       #end
  162.    #else
  163.       #declare _EX_pvel = _EX_ptrans - _EX_eloc
  164.       #if (exp_falloff = 0)
  165.          #declare _EX_pvel = vnormalize(_EX_pvel) * exp_strength
  166.       #else
  167.          #declare _EX_pvel = vnormalize(_EX_pvel) * pow(.25, vlength(_EX_pvel) / exp_falloff) * exp_strength
  168.       #end
  169.       #if (exp_turb != 0)
  170.          #declare _EX_pvel = _EX_pvel * (1 + ((<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_vturb * 2))
  171.          #declare _EX_pvel = vrotate(_EX_pvel, (<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_dturb * 360)
  172.       #end
  173.    #end
  174.  
  175. // CALCULATE PARTICLE LOCATION & SPIN
  176. // **********************************
  177.    #if (ground_plane = false)
  178.       object {_EX_particle
  179.       #if (exp_strength != 0 & vlength(_EX_spin) != 0)
  180.          #declare _EX_pspin = _EX_spin * vlength(_EX_pvel) / exp_strength
  181.          #if (exp_turb != 0) #declare _EX_pspin = _EX_pspin * (1 + ((<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_spturb * 2)) #end
  182.          rotate _EX_pspin * explode_clock * 360
  183.       #end
  184.       translate _EX_ptrans + (_EX_pvel * explode_clock) + (.5 * _EX_grav * explode_clock * explode_clock)
  185.       }
  186.  
  187. // ROTATE VECTORS IF SKY IS NOT +Y
  188. // *******************************
  189.    #else #if (exp_sky.y = 1)
  190.       #declare _EX_iloc = _EX_ptrans
  191.       #declare _EX_ivel = _EX_pvel
  192.    #else
  193.       #declare _EX_iloc = vrotate(vrotate(_EX_ptrans, -y * _EX_wroty), -x * _EX_wrotx)
  194.       #declare _EX_ivel = vrotate(vrotate(_EX_pvel,   -y * _EX_wroty), -x * _EX_wrotx)
  195.    #end
  196.  
  197. // SHIFT IF GROUND DISTANCE IS NOT 0
  198. // *********************************
  199.    #if (ground_dist != 0) #declare _EX_iloc = _EX_iloc - ground_dist #end
  200.  
  201. // CREATE PARTICLE IF ABOVE GROUND
  202. // *******************************
  203.    #if (_EX_iloc.y >= 0)
  204.  
  205. // CALCULATE PARTICLE POSITION
  206. // ***************************
  207.    #declare _EX_cclk = explode_clock
  208.    #declare _EX_iclk = 0 #declare _EX_fclk = 0 #declare _EX_bounces = 0
  209.    #declare _EX_cloc = _EX_iloc + (_EX_ivel * _EX_cclk) + (.5 * _EX_grav * _EX_cclk * _EX_cclk)
  210.    #while (_EX_cloc.y < 0)
  211.  
  212. // CALCULATE TIME OF INTERSECTION WITH GROUND PLANE
  213. // ************************************************
  214.    #if (_EX_grav.y = 0) #declare _EX_iclk = _EX_iloc.y / -_EX_ivel.y
  215.       #else #declare _EX_iclk = (-_EX_ivel.y - sqrt (_EX_ivel.y * _EX_ivel.y - (2 * _EX_grav.y * _EX_iloc.y))) / _EX_grav.y #end
  216.  
  217.    #declare _EX_iloc = _EX_iloc + (_EX_ivel * _EX_iclk) + (.5 * _EX_grav * _EX_iclk * _EX_iclk)
  218.    #declare _EX_ivel = (_EX_ivel + (_EX_grav * _EX_iclk)) * <1, -ground_reflection, 1>
  219.    #declare _EX_fclk = _EX_fclk + _EX_iclk
  220.  
  221. // CHECK IF PARTICLE HAS STOPPED MOVING
  222. // ************************************
  223.    #if (ground_reflection = 0 | _EX_bounces >= max_bounces)
  224.       #declare _EX_cloc = _EX_iloc * <1, 0, 1>
  225.       #declare _EX_cclk = 0
  226.    #else
  227.       #declare _EX_cclk = _EX_cclk - _EX_iclk
  228.       #declare _EX_bounces = _EX_bounces + 1
  229.       #declare _EX_cloc = _EX_iloc + (_EX_ivel * _EX_cclk) + (.5 * _EX_grav * _EX_cclk * _EX_cclk)
  230.    #end #end
  231.    #declare _EX_fclk = _EX_fclk + _EX_cclk
  232.    #declare _EX_ploc = _EX_cloc
  233.  
  234. // UNDO GROUND DISTANCE SHIFT AND SKY VECTOR ROTATION
  235. // **************************************************
  236.    #if (ground_dist != 0) #declare _EX_ploc = _EX_ploc + ground_dist #end
  237.    #if (exp_sky.y != 1)   #declare _EX_ploc = vrotate(vrotate(_EX_ploc, x * _EX_wrotx), y * _EX_wroty) #end
  238.  
  239. // SPIN PARTICLE
  240. // *************
  241.    object {_EX_particle
  242.       #if (exp_strength != 0 & vlength(_EX_spin) != 0)
  243.          #declare _EX_pspin = _EX_spin * vlength(_EX_pvel) / exp_strength
  244.          #if (exp_turb != 0) #declare _EX_pspin = _EX_pspin * (1 + ((<rand(_EX_rand), rand(_EX_rand), rand(_EX_rand)> - .5) * _EX_spturb * 2)) #end
  245.          rotate _EX_pspin * _EX_fclk * 360
  246.       #end
  247.    translate _EX_ploc}
  248.    #end #end
  249.  
  250. // LOOP THROUGH PARTICLE GRID
  251. // **************************
  252.          #declare _EX_gridz = _EX_gridz + _EX_gridsize.z #end
  253.       #declare _EX_gridy = _EX_gridy + _EX_gridsize.y #end
  254.    #declare _EX_gridx = _EX_gridx + _EX_gridsize.x #end
  255.    }
  256.  
  257.    #end #end
  258.    #version _EX_tempver
  259.