Ooops
January 24, 2021, 01:06:36 PM

Author Topic: [bb] Lotus Particle System R2 - Part 2 by N [ 1+ years ago ]  (Read 729 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Lotus Particle System R2 - Part 2
Author : N
Posted : 1+ years ago

Description : This is part 2 of the source code (since it's too large to go into one entry, as Rob pointed out).  For part 1: <a href="codearcs1d1b.html?code=1654" >Lotus Particle System R2 - Part 1[/url]

In the interest of furthering the potential usefulness of Lotus R2 (I will try to document some of it later, just don't expect it overnight), I'm releasing it into the public domain.

Hopefully this will help those people who are particularly hateful of licenses (can't blame'em considering I loathe anything longer than 100 lines).

Anywho, feel free to use and abuse.  I'll add a comment when I begin documenting the source.  (No guarantee that it will work with the DIMs arranged in the order they're in, however I don't think there will be a problem with them).

Media for Lotus R2 is laid out like so:
Code: [Select]
particles.png
_________________
| 0 | 1 | 2 | 3 |
|___|___|___|___|
| 4 | 5 | 6 | 7 |
|___|___|___|___|

Where numbers indicate the indices of particle cells (textures).  These cells are individual particles or animation frames (depending on which Load function you use).

The Graph functionality allows you to have keyframe'd values (color and size were all that were finished last I checked) instead of linearly interpolating between two values.

The public domain license does not apply to the existing archive of Lotus R2.  That is to say, all media, samples, the editor, etc. are still under the license they were originally released under. [/i]

Code :
Code: BlitzBasic
  1. Function DrawLotusParticle( P.LotusParticle, TPivot )
  2.         If P <> Null Then
  3.                
  4.                 If PCull > 0 Then
  5.                         CameraProject gLotusCamera, PPositionX, PPositionY, PPositionZ
  6.                         If ProjectedZ() <= 0 Then Return
  7.                         PX = ProjectedX()
  8.                         If PX < -75 Or PX > gWidth+75 Then Return
  9.                         PY = ProjectedY()
  10.                         If PY < 0 Or PY > gHeight+75 Then Return
  11.                 EndIf
  12.                
  13.                 LFrom# = PLife/PLifeSpan
  14.                 LTo# = 1.0 - LFrom#
  15.                
  16.                 PositionEntity gLotusParticlePivot,PPositionX,PPositionY,PPositionZ
  17.                 RotateEntity gLotusParticlePivot,PAngleX,PAngleY,0
  18.                
  19.                 Gr.LotusGraph = PColorGraph
  20.                 If Gr <> Null Then
  21.                         If GrKeys-1 <= 0 Then Gr = Null
  22.                 EndIf
  23.                
  24.                 If Gr = Null Then
  25.                         If PRange <> 0 Then
  26.                                 A# = Max(PAlphaFrom*LFrom + PAlphaTo*LTo,1.0-(EntityDistance(gLotusCamera,gLotusParticlePivot)/PRange))
  27.                         Else
  28.                                 A# = PAlphaFrom*LFrom + PAlphaTo*LTo
  29.                         EndIf
  30.                         R = PRedFrom*LFrom + PRedTo*LTo
  31.                         G = PGreenFrom*LFrom + PGreenTo*LTo
  32.                         B = PBlueFrom*LFrom + PBlueTo*LTo
  33.                 Else
  34.                         AccumulateGraphArray( Gr )
  35.                         Pivot# = GrWidth * LTo
  36.                         Front = -1
  37.                         Behind = -1
  38.                         For N = 0 To GrKeys - 1
  39.                                 If gGraphArray( N, 0 ) >= Pivot Then
  40.                                         Behind = N-1
  41.                                         Front = N
  42.                                         Exit
  43.                                 EndIf
  44.                         Next
  45.                        
  46.                         If Front = - 1 Then
  47.                                 Front = GrKeys-1
  48.                                 Behind = 0
  49.                         EndIf
  50.                        
  51.                         Behind = Min( Behind, 0 )
  52.                         Front = Max( Front, GrKeys - 1 )
  53.                        
  54.                         VFrom# = 1.0-ReturnedY#( Pivot#, gGraphArray( Behind, 0 ), gGraphArray( Behind, 1 )*10, gGraphArray( Front, 0 ), gGraphArray( Front, 1 )*10 )/10
  55.                         VTo# = 1.0 - VFrom
  56.                        
  57.                         If PRange > 0 Then
  58.                                 A# = Max(PAlphaFrom*VFrom + PAlphaTo*VTo,1.0-(EntityDistance(gLotusCamera,gLotusParticlePivot)/PRange))
  59.                         Else
  60.                                 A# = PAlphaFrom*VFrom + PAlphaTo*VTo
  61.                         EndIf
  62.                        
  63.                         R = PRedFrom*VFrom + PRedTo*VTo
  64.                         G = PGreenFrom*VFrom + PGreenTo*VTo
  65.                         B = PBlueFrom*VFrom + PBlueTo*VTo
  66.                 EndIf
  67.                
  68.                 Gr.LotusGraph = PSizeGraph
  69.                 If Gr <> Null Then
  70.                         If GrKeys-1 <= 0 Then Gr = Null
  71.                 EndIf
  72.                
  73.                 If Gr = Null Then
  74.                         SizeX# = PSizeFromX*LFrom+PSizeToX*LTo
  75.                         SizeY# = PSizeFromY*LFrom+PSizeToY*LTo
  76.                         SizeZ# = PSizeFromZ*LFrom+PSizeToZ*LTo
  77.                 Else
  78.                         AccumulateGraphArray( Gr )
  79.                         Pivot# = GrWidth * LTo
  80.                         Front = -1
  81.                         Behind = -1
  82.                         For N = 0 To GrKeys - 1
  83.                                 If gGraphArray( N, 0 ) >= Pivot Then
  84.                                         Behind = N-1
  85.                                         Front = N
  86.                                         Exit
  87.                                 EndIf
  88.                         Next
  89.                        
  90.                         If Front = - 1 Then
  91.                                 Front = GrKeys-1
  92.                                 Behind = 0
  93.                         EndIf
  94.                        
  95.                         Behind = Min( Behind, 0 )
  96.                         Front = Max( Front, GrKeys - 1 )
  97.                        
  98.                         VFrom# = 1.0-ReturnedY#( Pivot#, gGraphArray( Behind, 0 ), gGraphArray( Behind, 1 )*10, gGraphArray( Front, 0 ), gGraphArray( Front, 1 )*10 )/10
  99.                         VTo# = 1.0 - VFrom
  100.                        
  101.                         SizeX# = PSizeFromX*VFrom+PSizeToX*VTo
  102.                         SizeY# = PSizeFromY*VFrom+PSizeToY*VTo
  103.                         SizeZ# = PSizeFromZ*VFrom+PSizeToZ*VTo
  104.                 EndIf
  105.                
  106.                 If PHidden = False And A > 0 And SizeX > 0 And SizeY > 0 And SizeZ > 0 Then
  107.                         T.LotusTexture = PTexture
  108.                        
  109.                         If T <> Null Then
  110.                                 Select PBlendMode
  111.                                         Case 1
  112.                                                 Surface = TAlpha
  113.                                         Case 2
  114.                                                 Surface = TMultiply
  115.                                         Case 3
  116.                                                 Surface = TAdd
  117.                                 End Select
  118.                                 If Surface = 0 Then Surface = gLotusNullTextureAlpha
  119.                         Else
  120.                                 Surface = TAlpha
  121.                         EndIf
  122.                        
  123.                         If Surface <> 0 Then
  124.                                 If PWaveRadiusX <> 0 Or PWaveRadiusY <> 0 Or PWaveRadiusZ <> 0 Then
  125.                                         MoveEntity gLotusParticlePivot,(gSine(Int((PLifeBegan+(PLifeSpan-PLife))*PWaveSpeedX) Mod 359)*PWaveRadiusX)*LFrom,(gCosine(Int((PLifeBegan+(PLifeSpan-PLife))*PWaveSpeedY) Mod 359)*PWaveRadiusY)*LFrom,(gCosine(Int((PLifeBegan+(PLifeSpan-PLife))*PWaveSpeedZ) Mod 359)*PWaveRadiusZ)*LFrom
  126.                                 EndIf
  127.                                
  128.                                 Select PViewMode
  129.                                         Case 1          ;; Always Facing
  130.                                                 PointEntity gLotusParticlePivot,gLotusCamera,PAngleZ
  131.                                         Case 2
  132.                                                 TurnEntity gLotusParticlePivot,0,0,PAngleZ
  133.                                         Case 3          ;; X-facing
  134.                                                 PositionEntity TPivot,PPositionX,PPositionY,PPositionZ
  135.                                                 RotateEntity TPivot,PAngleX,PAngleY,0
  136.                                                 EntityParent gLotusParticlePivot,TPivot,1
  137.                                                 TurnEntity TPivot,0,DeltaYaw(gLotusParticlePivot,gLotusCamera),0
  138.                                                 EntityParent gLotusParticlePivot,0,1
  139.                                                 TurnEntity gLotusParticlePivot,0,0,PAngleZ
  140.                                         Case 4          ;; Y-facing
  141.                                                 PositionEntity TPivot,PPositionX,PPositionY,PPositionZ
  142.                                                 RotateEntity TPivot,0,PAngleY,0
  143.                                                 EntityParent gLotusParticlePivot,TPivot,1
  144.                                                 TurnEntity TPivot,DeltaPitch(gLotusParticlePivot,gLotusCamera),0,0
  145.                                                 EntityParent gLotusParticlePivot,0,1
  146.                                                 TurnEntity gLotusParticlePivot,0,0,PAngleZ
  147.                                 End Select
  148.                                
  149.                                 If PRollMode => 1 And PRollMode <= 3 Then
  150.                                         AlignToVector gLotusParticlePivot,PLastPositionX-PPositionX,PLastPositionY-PPositionY,PLastPositionZ-PPositionZ,PRollMode,1
  151.                                 EndIf
  152.                                
  153.                                 If PAnimated >= True Then
  154.                                         PFrame = (TRows*TColumns)*LTo
  155.                                 EndIf
  156.                                 Rows = 0
  157.                                 Columns = 0
  158.                                 Frame = PFrame
  159.                                 While Frame >= TColumns
  160.                                         Rows = Rows + 1
  161.                                         Frame = Frame - TColumns
  162.                                 Wend
  163.                                 Columns = PFrame Mod TColumns
  164.                                
  165.                                 eU# = Columns*TUStep
  166.                                 eV# = Rows*TVStep
  167.  
  168.                                 Select PParticleMesh
  169.                                         Case cP_QUAD
  170.                                                 TFormPoint -SizeX,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  171.                                                 V = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV)
  172.                                                 PVertex = V
  173.                                                
  174.                                                 TFormPoint SizeX,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  175.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV)
  176.                                                
  177.                                                 TFormPoint SizeX,-SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  178.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV+TVStep)
  179.                                                
  180.                                                 TFormPoint -SizeX,-SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  181.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV+TVStep)
  182.                                                
  183.                                                 AddTriangle Surface,V,V+1,V+2
  184.                                                 AddTriangle Surface,V+2,V+3,V
  185.                                                
  186.                                                 For N = 0 To 3
  187.                                                         VertexColor Surface,V+N,R,G,B,A
  188.                                                 Next
  189.                                                
  190.                                         Case cP_TRIANGLE
  191.                                                 TFormPoint -SizeX,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  192.                                                 V = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV)
  193.                                                 PVertex = V
  194.                                                
  195.                                                 TFormPoint SizeX*3,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  196.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep-TUStep*2,eV)
  197.                                                
  198.                                                 TFormPoint -SizeX,-SizeY*3,0,gLotusParticlePivot,gLotusParticleMesh
  199.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV+TVStep*2)
  200.                                                
  201.                                                 AddTriangle Surface,V,V+1,V+2
  202.                                                
  203.                                                 For N = 0 To 2
  204.                                                         VertexColor Surface,V+N,R,G,B,A
  205.                                                 Next
  206.                                        
  207.                                         Case cP_TRAIL,cP_TRAILVERTICAL
  208.                                                 If PParticleMesh = 2 Then
  209.                                                         TFormPoint -SizeX,0,0,gLotusParticlePivot,gLotusParticleMesh
  210.                                                         V = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV+LTo*TVStep)
  211.                                                         PVertex = V
  212.                                                         TFormPoint SizeX,0,0,gLotusParticlePivot,gLotusParticleMesh
  213.                                                         AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV+LTo*TVStep)
  214.                                                 Else
  215.                                                         TFormPoint 0,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  216.                                                         V = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV+LTo*TVStep)
  217.                                                         PVertex = V
  218.                                                         TFormPoint 0,-SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  219.                                                         AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV+LTo*TVStep)
  220.                                                 EndIf
  221.                                                
  222.                                                 If PPrevious <> Null Then
  223.                                                         If PTexture = PPreviousTexture And PPreviousParticleMesh = PParticleMesh And PPreviousVertex > -1 And PPreviousBlendMode = PBlendMode Then
  224.                                                                 AddTriangle Surface,V,V+1,PPreviousVertex+1
  225.                                                                 AddTriangle Surface,PPreviousVertex+1,PPreviousVertex,V
  226.                                                         EndIf
  227.                                                 EndIf
  228.                                                
  229.                                                 For N = 0 To 1
  230.                                                         VertexColor Surface,V+N,R,G,B,A
  231.                                                 Next
  232.                                        
  233.                                         Case cP_DENT
  234.                                                 TFormPoint -SizeX,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  235.                                                 V = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV)
  236.                                                
  237.                                                 TFormPoint SizeX,SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  238.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV)
  239.                                                
  240.                                                 TFormPoint SizeX,-SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  241.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU,eV+TVStep)
  242.                                                
  243.                                                 TFormPoint -SizeX,-SizeY,0,gLotusParticlePivot,gLotusParticleMesh
  244.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep,eV+TVStep)
  245.                                                
  246.                                                 TFormPoint 0,0,-SizeZ,gLotusParticlePivot,gLotusParticleMesh
  247.                                                 AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),eU+TUStep*.5,eV+tVStep*.5)
  248.                                                
  249.                                                 AddTriangle Surface,V,V+1,V+4
  250.                                                 AddTriangle Surface,V+1,V+2,V+4
  251.                                                 AddTriangle Surface,V+2,V+3,V+4
  252.                                                 AddTriangle Surface,V+3,V,V+4
  253.                                                
  254.                                                 For N = 0 To 4
  255.                                                         VertexColor Surface,V+N,R,G,B,A
  256.                                                 Next
  257.                                        
  258.                                         Default
  259.                                                 PVertex = CountVertices(Surface)
  260.                                                 For N = 1 To CountSurfaces(PParticleMesh)
  261.                                                         V = CountVertices(Surface)
  262.                                                         S = GetSurface(PParticleMesh,N)
  263.                                                         For eV = 0 To CountVertices(S)-1
  264.                                                                 TFormPoint VertexX(S,eV)*SizeX,VertexY(S,eV)*SizeY,VertexZ(S,eV)*SizeZ,gLotusParticlePivot,gLotusParticleMesh
  265.                                                                 nV = AddVertex(Surface,TFormedX(),TFormedY(),TFormedZ(),VertexU(S,eV),VertexV(S,eV))
  266.                                                                 VertexColor Surface,nV,R,G,B,A
  267.                                                         Next
  268.                                                        
  269.                                                         For eT = 0 To CountTriangles(S)-1
  270.                                                                 eV0 = TriangleVertex(S,eT,0)
  271.                                                                 eV1 = TriangleVertex(S,eT,1)
  272.                                                                 eV2 = TriangleVertex(S,eT,2)
  273.                                                                 AddTriangle Surface,V+eV0,V+eV1,V+eV2
  274.                                                         Next
  275.                                                 Next
  276.                                                
  277.                                                 S = 0
  278.                                 End Select
  279.                                 gLotusParticlesDrawn = gLotusParticlesDrawn + 1
  280.                         Else
  281.                                 PVertex = -1
  282.                         EndIf
  283.                 Else
  284.                         PVertex = -1
  285.                 EndIf
  286.         Else
  287.                 Return False
  288.         EndIf
  289.         Return True
  290. End Function
  291.  
  292.  
  293. ;; PARTICLE
  294. Function CreateParticle(Emitter)
  295.         If EmitterExists( Emitter ) = 0 Then Return False
  296.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  297.         If E = Null Then Return False
  298.         ORoll# = EntityRoll( Emitter )
  299.         OPitch# = EntityPitch( Emitter )
  300.         OYaw# = EntityYaw( Emitter )
  301.         RotateEntity Emitter, OPitch, OYaw, 0
  302.         For Emission = 1 To EEmissionRate
  303. ;               If EBlendMode = 3 Then Stop
  304.                 gLotusParticleCount = gLotusParticleCount + 1
  305.                 P.LotusParticle = New LotusParticle
  306.                
  307.                 PParent = E
  308.                 PTrail = ETrail
  309.                 PChild = EChild
  310.                
  311. ;               PLastPosition = New LotusVector
  312. ;               PPosition = New LotusVector
  313.                
  314.                 RndRad# = Rnd(0,ECylinderX)
  315.                 RndAng% = Rand(359)
  316.                 ET# = MilliSecs()
  317.                 gTempLotusVectorX = gSine(RndAng)*RndRad + (gSine(ET*ECircleSpeedX Mod 359)*ECircleRadiusX)+Rnd(-ECubeX,ECubeX)
  318.                 gTempLotusVector = Rnd(ECylinderZ,ECylinderY) + gSine(ET*ECircleSpeedY Mod 359)*ECircleRadiusY+Rnd(-ECubeY,ECubeY)
  319.                 gTempLotusVectorY = gCosine(RndAng)*RndRad + (gCosine(ET*ECircleSpeedZ Mod 359)*ECircleRadiusZ)+Rnd(-ECubeZ,ECubeZ)
  320.                 LotusVec_TFormPoint gTempLotusVector,EEntity,0
  321. ;               LotusVec_TFormedB PPosition
  322.                 PPositionX = TFormedX()
  323.                 PPositionY = TFormedY()
  324.                 PPositionZ = TFormedZ()
  325.                
  326. ;               PTranslation = LotusVec_Copy(ETranslation)
  327.                 gTempLotusVectorX = Rnd(-ETranslationJitterX*ETranslationJitterDown,ETranslationJitterX*ETranslationJitterUp)
  328.                 gTempLotusVectorY = Rnd(-ETranslationJitterY*ETranslationJitterDown,ETranslationJitterY*ETranslationJitterUp)
  329.                 gTempLotusVector = Rnd(-ETranslationJitterZ*ETranslationJitterDown,ETranslationJitterZ*ETranslationJitterUp)
  330.                 PTranslationX = ETranslationX + gTempLotusVectorX
  331.                 PTranslationY = ETranslationY + gTempLotusVectorY
  332.                 PTranslationZ = ETranslationZ + gTempLotusVector
  333. ;               LotusVec_Add(PTranslation,gTempLotusVector)
  334.                
  335. ;               PAngle = New LotusVector
  336.                
  337.                 PVelocityDecay = EVelocityDecay
  338.                
  339.                 gTempLotusVectorX = Rnd(-ERandomRotationX,ERandomRotationX)
  340.                 gTempLotusVectorY = Rnd(-ERandomRotationY,ERandomRotationY)
  341.                 gTempLotusVector = Rnd(-ERandomRotationZ,ERandomRotationZ)
  342.                 PAngleX = OPitch + gTempLotusVectorX
  343.                 PAngleY = OYaw + gTempLotusVectorY
  344.                 PAngleZ = ORoll + gTempLotusVector
  345.                
  346. ;               PVelocity = LotusVec_Copy(EVelocity)
  347.                 gTempLotusVectorX = Rnd(-EVelocityJitterX*EVelocityJitterDown,EVelocityJitterX*EVelocityJitterUp)
  348.                 gTempLotusVectorY = Rnd(-EVelocityJitterY*EVelocityJitterDown,EVelocityJitterY*EVelocityJitterUp)
  349.                 gTempLotusVector = Rnd(-EVelocityJitterZ*EVelocityJitterDown,EVelocityJitterZ*EVelocityJitterUp)
  350.                 POVelocityX = EVelocityX + gTempLotusVectorX
  351.                 POVelocityY = EVelocityY + gTempLotusVectorY
  352.                 POVelocityZ = EVelocityZ + gTempLotusVector
  353.                 RotateEntity gLotusParticlePivot,PAngleX,PAngleY,0,1
  354.                 TFormVector POVelocityX,POVelocityY,POVelocityZ,gLotusParticlePivot,0
  355.                 PVelocityX = TFormedX()
  356.                 PVelocityY = TFormedY()
  357.                 PVelocityZ = TFormedZ()
  358. ;               LotusVec_Add(PVelocity,gTempLotusVector)
  359. ;               PAngleVelocity = LotusVec_Copy(EAngleVelocity)
  360. ;               PAcceleration = LotusVec_Copy(EAcceleration)
  361. ;               PAngleAcceleration = LotusVec_Copy(EAngleAcceleration)
  362.                 PAngleVelocityX = EAngleVelocityX
  363.                 PAngleVelocityY = EAngleVelocityY
  364.                 PAngleVelocityZ = EAngleVelocityZ
  365.                 PAccelerationX = EAccelerationX
  366.                 PAccelerationY = EAccelerationY
  367.                 PAccelerationZ = EAccelerationZ
  368.                 gTempLotusVectorX = Rnd(-ESizeJitterX*ESizeJitterDown,ESizeJitterX*ESizeJitterUp)
  369.                 gTempLotusVectorY = Rnd(-ESizeJitterY*ESizeJitterDown,ESizeJitterY*ESizeJitterUp)
  370.                 gTempLotusVector = Rnd(-ESizeJitterZ*ESizeJitterDown,ESizeJitterZ*ESizeJitterUp)
  371.                 If ESizeJitterUniform Then
  372.                         S# = (gTempLotusVectorX+gTempLotusVectorY+gTempLotusVector)/3
  373.                         gTempLotusVectorX = S
  374.                         gTempLotusVectorY = S
  375.                         gTempLotusVector = S
  376.                 EndIf
  377. ;               PSizeFrom = LotusVec_Copy(ESizeFrom)
  378.                 PSizeFromX = ESizeFromX + gTempLotusVectorX
  379.                 PSizeFromY = ESizeFromY + gTempLotusVectorY
  380.                 PSizeFromZ = ESizeFromZ + gTempLotusVector
  381.                
  382. ;               PSizeTo = LotusVec_Copy(ESizeTo)
  383.                 PSizeToX = ESizeToX + gTempLotusVectorX
  384.                 PSizeToY = ESizeToY + gTempLotusVectorY
  385.                 PSizeToZ = ESizeToZ + gTempLotusVector
  386.                
  387. ;               PWaveRadius = LotusVec_Copy(EWaveRadius)
  388. ;               PWaveSpeed = LotusVec_Copy(EWaveSpeed)
  389.                 PWaveRadiusX = EWaveRadiusX
  390.                 PWaveRadiusY = EWaveRadiusY
  391.                 PWaveRadiusZ = EWaveRadiusZ
  392.                 PWaveSpeedX = EWaveSpeedX
  393.                 PWaveSpeedY = EWaveSpeedY
  394.                 PWaveSpeedZ = EWaveSpeedZ
  395.                
  396.                 If Float(EColorJitterRed + EColorJitterBlue + EColorJitterGreen) + EColorJitterAlpha <> 0 Then
  397.                         If EColorJitterUniform = False Then
  398.                                 RR = Rand(-EColorJitterRed*EColorJitterDown,EColorJitterRed*EColorJitterUp)
  399.                                 RG = Rand(-EColorJitterGreen*EColorJitterDown,EColorJitterGreen*EColorJitterUp)
  400.                                 RB = Rand(-EColorJitterBlue*EColorJitterDown,EColorJitterBlue*EColorJitterUp)
  401.                         Else
  402.                                 C = (EColorJitterRed+EColorJitterGreen+EColorJitterBlue)/3
  403.                                 C = Rand(-C*EColorJitterDown,C*EColorJitterDown)
  404.                                 RR = C
  405.                                 RG = C
  406.                                 RB = C
  407.                         EndIf
  408.                         RA# = Rnd(-EColorJitterAlpha*EColorJitterDown,EColorJitterAlpha*EColorJitterUp)
  409.                 EndIf
  410.                
  411.                 PRedFrom = ERedFrom + RR
  412.                 PGreenFrom = EGreenFrom + RG
  413.                 PBlueFrom = EBlueFrom + RB
  414.                 PAlphaFrom = EAlphaFrom + RA
  415.                
  416.                 PRedTo = ERedTo + RR
  417.                 PGreenTo = EGreenTo + RG
  418.                 PBlueTo = EBlueTo + RB
  419.                 PAlphaTo = EAlphaTo + RA
  420.                
  421.                 PLifeSpan = ELifeSpan + Rand(-ELifeSpanJitter*ELifeSpanJitterDown,ELifeSpanJitter*ELifeSpanJitterUp)
  422.                 PLife = PLifeSpan
  423.                 PLifeBegan = MilliSecs()
  424.                 PTexture = ETexture
  425.                 PBlendMode = EBlendMode
  426.                 PParticleMesh = EParticleMesh
  427.                 PPrevious = ELatest
  428.                 ELatest = P
  429.                 PVertex = -1
  430.                 PViewMode = EViewMode
  431.                 PLifeMode = ELifeMode
  432.                 PChildMode = EChildMode
  433.                 PDraw = 1
  434.                 PFrozen = EFrozen
  435.                 PHidden = EHidden
  436.                 PFrame = EFrame
  437.                 PAnimated = EAnimated
  438.                 PGravity = EGravity + Rnd(-EGravityJitter*EGravityJitterDown,EGravityJitter*EGravityJitterUp)
  439.                 PGravityEnabled = EGravityEnabled
  440.                 PWeight = EWeight
  441.                 PRollMode = ERollMode  
  442.                 PRange = ERange
  443.                 PCull = ECull
  444.                 PSorting = ESorting
  445.                 PSizeGraph = ESizeGraph
  446.                 PColorGraph = EColorGraph
  447.                 PBounce = EBounce
  448.                 PBounceDecay = EBounceDecay
  449.                 PBounceMax = EBounceMax
  450.                 PMinY = EMinY
  451.                 PBounceSound = EBounceSound
  452.                 PSplineMesh = ESplineMesh
  453.                 PBounceSoundRange = EBounceSoundRange
  454.                 PDeflectorsAffect = EDeflectorsAffect
  455.                
  456.                 If PBlendMode = 1 And PSorting => 1 Then
  457.                         gLotusAlphaParticleCount = gLotusAlphaParticleCount + 1
  458.                 EndIf
  459.                
  460. ;               If PBlendMode = 1 Then
  461. ;                       Insert P Before First LotusParticle
  462. ;               ElseIf PBlendMode = 3 Then
  463. ;                       Insert P After Last LotusParticle
  464. ;               EndIf
  465.         Next
  466.        
  467.         If P <> Null Then
  468.                 If PChild <> Null Then
  469.                         If PChildWaitB <= 0 And PChildMode <> 1 Then
  470.                                 ax# = EntityPitch(PChildEntity,1)
  471.                                 ay# = EntityYaw(PChildEntity,1)
  472.                                 az# = EntityRoll(PChildEntity,1)
  473.                                 RotateEntity PChildEntity,PAngleX,PAngleY,PAngleZ,1
  474.                                 PositionEntity PChildEntity,PPositionX,PPositionY,PPositionZ,1
  475.                                 CreateParticle(PChildEntity)
  476.                                 RotateEntity PChildEntity,ax,ay,az,1
  477.                                 PositionEntity PChildEntity,PChildPositionX,PChildPositionY,PChildPositionZ,1
  478.                         EndIf
  479.                 EndIf
  480.         EndIf
  481.        
  482.         RotateEntity Emitter, OPitch, OYaw, ORoll
  483. End Function
  484.  
  485. Function KillParticle(P.LotusParticle)
  486.         If P = Null Then Return False
  487.         gLotusParticleCount = gLotusParticleCount - 1
  488.         If PBlendMode = 1 Then gLotusAlphaParticleCount = gLotusAlphaParticleCount - 1
  489.        
  490.         If PChild <> Null Then
  491.                         If PChildWaitB <= 0 And PChildMode <> 1 Then
  492.                                 RotateEntity PChildEntity,PAngleX,PAngleY,PAngleZ,1
  493.                                 PositionEntity PChildEntity,PPositionX,PPositionY,PPositionZ,1
  494.                                 CreateParticle(PChildEntity)
  495.                                 RotateEntity PChildEntity,PChildAngleX,PChildAngleY,PChildAngleZ,1
  496.                                 PositionEntity PChildEntity,PChildPositionX,PChildPositionY,PChildPositionZ,1
  497.                         EndIf
  498.                 EndIf
  499.        
  500.         Delete P
  501. End Function
  502.  
  503. Function ClearParticles()
  504.         Delete Each LotusParticle
  505. End Function
  506.  
  507.  
  508. ;; GRAPH
  509.  
  510. Function CreateGraph()
  511.         G.LotusGraph = New LotusGraph
  512.         GBank = CreateBank( 0 )
  513.         GKeys = 0
  514.         Return Handle(G)
  515. End Function
  516.  
  517. Function AddGraphPoint( Graph, X#, Y# )
  518.         G.LotusGraph = Object.LotusGraph( Graph )
  519.         If G = Null Then Return False
  520.         Dim gGraphArray( GKeys, 1 )
  521.         For N = 0 To GKeys-1
  522.                 gGraphArray( N, 0 ) = PeekFloat( GBank, N*8-1 )
  523.                 gGraphArray( N, 1 ) = PeekFloat( GBank, N*8+4-1 )
  524.         Next
  525.         gGraphArray( GKeys, 0 ) = X
  526.         gGraphArray( GKeys, 1 ) = Y
  527.         DebugLog "Adding "+gGraphArray( GKeys, 0 )+","+gGraphArray( GKeys, 1 )+" to graph "+Graph
  528.         InsertionSort( GKeys )
  529.         If gLotusDebugInfo Then
  530.                 DebugLog ""
  531.                 DebugLog "----GRAPH REPORT-----"
  532.                 For N = 0 To GKeys
  533.                         DebugLog gGraphArray( N, 0 ) + "  ,    "+gGraphArray( N, 1 )
  534.                 Next
  535.                 DebugLog "---------------------------"
  536.                 DebugLog ""
  537.         EndIf
  538.         GKeys = GKeys + 1
  539.         ResizeBank GBank, GKeys*8
  540.         For N = 0 To GKeys - 1
  541.                 PokeFloat( GBank, N*8-1, gGraphArray( N, 0 ) )
  542.                 PokeFloat( GBank, N*8+4-1, gGraphArray( N, 1 ) )
  543.         Next
  544.         GWidth = gGraphArray( GKeys-1, 0 )
  545.         DebugLog "Resized graph to "+GWidth
  546. End Function
  547.  
  548. Function RemoveGraphPoint( Graph, X#, Range# = 0 )
  549.         G.LotusGraph = Object.LotusGraph( Graph )
  550.         If G = Null Then Return False
  551.         Dim gGraphArray( GKeys-2, 1 )
  552.         For N = 0 To GKeys-1
  553.                 eX# = PeekFloat( GBank, N*8-1 )
  554.                 If (eX > X+Range And eX < X-Range) Or Found = True Then
  555.                         gGraphArray( C, 0 ) = eX
  556.                         gGraphArray( C, 1 ) = PeekFloat( GBank, N*8+4-1 )
  557.                         C = C + 1
  558.                 Else
  559.                         Found = True
  560.                 EndIf
  561.         Next
  562.         InsertionSort( GKeys-2 )
  563.         GKeys = GKeys - 1
  564.         ResizeBank GBank, GKeys*8
  565.         For N = 0 To GKeys - 1
  566.                 PokeFloat( GBank, N*8-1, gGraphArray( N, 0 ) )
  567.                 PokeFloat( GBank, N*8+4-1, gGraphArray( N, 1 ) )
  568.         Next
  569.         GWidth = gGraphArray( GKeys-1, 0 )
  570.         DebugLog "Resized graph to "+GWidth
  571. End Function
  572.  
  573. Function AccumulateGraphArray( G.LotusGraph )
  574.         If G = Null Then Return False
  575.         Dim gGraphArray( GKeys-1, 1 )
  576.         For N = 0 To GKeys-1
  577.                 gGraphArray( N, 0 ) = PeekFloat( GBank, N*8-1 )
  578.                 gGraphArray( N, 1 ) = PeekFloat( GBank, N*8+4-1 )
  579.         Next
  580. End Function
  581.  
  582. Function FreeGraph( Graph )
  583.         G.LotusGraph = Object.LotusGraph( Graph )
  584.         If G = Null Then Return False
  585.         FreeBank GBank
  586.         Delete G
  587. End Function
  588.  
  589.  
  590. Function SetLotusCamera(Camera)
  591.         gLotusCamera = Camera
  592. End Function
  593.  
  594. Function StartEmitter( Emitter, ActiveSpan = -2, FreeEmitterOnEnd=0 )
  595.         If EmitterExists( Emitter ) = 0 Then Return False
  596.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  597.         If E = Null Then Return False
  598.         If ActiveSpan > -2 Then
  599.                 SetEmitterActiveSpan Emitter,ActiveSpan
  600.         EndIf
  601.         EActive = EActiveSpan
  602.         EEmit = 1
  603.        
  604.         If EEmitSound <> 0 Then EEmitSoundChannel = PlaySound( EEmitSound )
  605.        
  606.         EFreeOnEndActive = FreeEmitterOnEnd
  607. End Function
  608.  
  609. Function StopEmitter( Emitter )
  610.         If EmitterExists( Emitter ) = 0 Then Return False
  611.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  612.         If E = Null Then Return False
  613.         If EEmitSoundChannel <> 0 And ELoopEmitSound >= 1 Then StopChannel( EEmitSoundChannel )
  614.         EEmit = 0
  615.         EActive = -1
  616. End Function
  617.  
  618. Function SetEmitterLifespan(Emitter,Lifespan,Jitter%=0,Up%=1,Down%=1)
  619.         If EmitterExists( Emitter ) = 0 Then Return False
  620.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  621.         If E = Null Then Return False
  622.         ELifespan = Lifespan
  623.         ELifeSpanJitter = Jitter%
  624.         ELifeSpanJitterUp% = Up%
  625.         ELifeSpanJitterDown% = Down%
  626. End Function
  627.  
  628. Function SetEmitterActiveSpan( Emitter, Active=-1 )
  629.         If EmitterExists( Emitter ) = 0 Then Return False
  630.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  631.         If E = Null Then Return False
  632.         EActiveSpan = Active
  633. End Function
  634.  
  635. Function SetEmitterPosition(Emitter,X#,Y#,Z#)   ;; Backwards compatibility
  636.         If EmitterExists( Emitter ) = 0 Then Return False
  637.         PositionEntity Emitter,X,Y,Z
  638. End Function
  639.  
  640. Function SetEmitterAngle(Emitter,Pitch#,Yaw#,Roll#)     ;; Backwards compatibility
  641.         If EmitterExists( Emitter ) = 0 Then Return False
  642.         RotateEntity Emitter,Pitch,Yaw,Roll
  643. End Function
  644.  
  645. Function SetEmitterTranslation(Emitter,X#,Y#,Z#)
  646.         If EmitterExists( Emitter ) = 0 Then Return False
  647.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  648.         If E = Null Then Return False
  649.         ETranslationX = X
  650.         ETranslationY = Y
  651.         ETranslationZ = Z
  652.         Return True
  653. End Function
  654.  
  655. Function SetEmitterVelocity(Emitter,X#,Y#,Z#)
  656.         If EmitterExists( Emitter ) = 0 Then Return False
  657.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  658.         If E = Null Then Return False
  659.         EVelocityX = X
  660.         EVelocityY = Y
  661.         EVelocityZ = Z
  662.         Return True
  663. End Function
  664.  
  665. Function SetEmitterVelocityDecay(Emitter,Decay#=0)
  666.         If EmitterExists( Emitter ) = 0 Then Return False
  667.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  668.         If E = Null Then Return False
  669.         EVelocityDecay = Decay
  670. End Function
  671.  
  672. Function SetEmitterAcceleration(Emitter,X#,Y#,Z#)
  673.         If EmitterExists( Emitter ) = 0 Then Return False
  674.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  675.         If E = Null Then Return False
  676.         EAccelerationX = X
  677.         EAccelerationY = Y
  678.         EAccelerationZ = Z
  679. End Function
  680.  
  681. Function SetEmitterAngleVelocity(Emitter,Pitch#,Yaw#,Roll#)
  682.         If EmitterExists( Emitter ) = 0 Then Return False
  683.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  684.         If E = Null Then Return False
  685.         EAngleVelocityX = Pitch
  686.         EAngleVelocityY = Yaw
  687.         EAngleVelocityZ = Roll
  688. End Function
  689.  
  690. Function SetEmitterAngleAcceleration(Emitter,Pitch#,Yaw#,Roll#)
  691.         If EmitterExists( Emitter ) = 0 Then Return False
  692.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  693.         If E = Null Then Return False
  694.         EAngleAccelerationX = Pitch
  695.         EAngleAccelerationY = Yaw
  696.         EAngleAccelerationZ = Roll
  697. End Function
  698.  
  699. Function SetEmitterTranslationJitter(Emitter,X#,Y#,Z#,Up%=1,Down%=1)
  700.         If EmitterExists( Emitter ) = 0 Then Return False
  701.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  702.         If E = Null Then Return False
  703.         ETranslationJitterX = X
  704.         ETranslationJitterY = Y
  705.         ETranslationJitterZ = Z
  706.         ETranslationJitterUp = Up
  707.         ETranslationJitterDown = Down
  708. End Function
  709.  
  710. Function SetEmitterVelocityJitter(Emitter,X#,Y#,Z#,Up%=1,Down%=1)
  711.         If EmitterExists( Emitter ) = 0 Then Return False
  712.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  713.         If E = Null Then Return False
  714.         EVelocityJitterX = X
  715.         EVelocityJitterY = Y
  716.         EVelocityJitterZ = Z
  717.         EVelocityJitterUp = Up
  718.         EVelocityJitterDown = Down
  719. End Function
  720.  
  721. Function SetEmitterColorFrom(Emitter,Red=255,Green=255,Blue=255,Alpha#=1)
  722.         If EmitterExists( Emitter ) = 0 Then Return False
  723.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName$(Emitter)))
  724.         If E <> Null Then
  725.                 ERedFrom = Red
  726.                 EGreenFrom = Green
  727.                 EBlueFrom = Blue
  728.                 EAlphaFrom = Alpha
  729.         Else
  730.                 Return False
  731.         EndIf
  732.         Return True
  733. End Function
  734.  
  735. Function SetEmitterColorTo(Emitter,Red=255,Green=255,Blue=255,Alpha#=1)
  736.         If EmitterExists( Emitter ) = 0 Then Return False
  737.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName$(Emitter)))
  738.         If E <> Null Then
  739.                 ERedTo = Red
  740.                 EGreenTo = Green
  741.                 EBlueTo = Blue
  742.                 EAlphaTo = Alpha
  743.         Else
  744.                 Return False
  745.         EndIf
  746.         Return True
  747. End Function
  748.  
  749. Function SetEmitterColorJitter(Emitter,Red%=0,Green%=0,Blue%=0,Alpha#=0,Uniform%=1,Up%=1,Down%=1)
  750.         If EmitterExists( Emitter ) = 0 Then Return False
  751.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  752.         If E = Null Then Return False
  753.         EColorJitterRed = Red
  754.         EColorJitterGreen = Green
  755.         EColorJitterBlue = Blue
  756.         EColorJitterAlpha = Alpha
  757.         EColorJitterUniform = Uniform
  758.         EColorJitterUp = Up
  759.         EColorJitterDown = Down
  760. End Function
  761.  
  762. Function SetEmitterColor(Emitter,Red=255,Green=255,Blue=255,Alpha#=1)
  763.         If EmitterExists( Emitter ) = 0 Then Return False
  764.         SetEmitterColorFrom Emitter,Red,Green,Blue,Alpha
  765.         SetEmitterColorTo Emitter,Red,Green,Blue,Alpha
  766. End Function
  767.  
  768. Function SetEmitterSizeFrom(Emitter,X#=1,Y#=1,Z#=1)
  769.         If EmitterExists( Emitter ) = 0 Then Return False
  770.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  771.         If E = Null Then Return False
  772.         ESizeFromX = X
  773.         ESizeFromY = Y
  774.         ESizeFromZ = Z
  775. End Function
  776.  
  777. Function SetEmitterSizeTo(Emitter,X#=1,Y#=1,Z#=1)
  778.         If EmitterExists( Emitter ) = 0 Then Return False
  779.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  780.         If E = Null Then Return False
  781.         ESizeToX = X
  782.         ESizeToY = Y
  783.         ESizeToZ = Z
  784. End Function
  785.  
  786. Function SetEmitterSizeJitter(Emitter,X#=0,Y#=0,Z#=0,Uniform%=1,Up%=1,Down%=1)
  787.         If EmitterExists( Emitter ) = 0 Then Return False
  788.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  789.         If E = Null Then Return False
  790.         ESizeJitterX = X
  791.         ESizeJitterY = Y
  792.         ESizeJitterZ = Z
  793.         ESizeJitterUniform = Uniform
  794.         ESizeJitterUp = Up
  795.         ESizeJitterDown = Down
  796. End Function
  797.  
  798. Function SetEmitterSize(Emitter,X#=1,Y#=1,Z#=1)
  799.         If EmitterExists( Emitter ) = 0 Then Return False
  800.         SetEmitterSizeFrom Emitter,X,Y,Z
  801.         SetEmitterSizeTo Emitter,X,Y,Z
  802. End Function
  803.  
  804. Function SetEmitterBlend(Emitter,Blend=1)
  805.         If EmitterExists( Emitter ) = 0 Then Return False
  806.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  807.         If E = Null Then Return False
  808.         EBlendMode = Blend
  809. End Function
  810.  
  811. Function SetEmitterRandomRotation(Emitter,PitchRange#=0,YawRange#=0,RollRange#=0)
  812.         If EmitterExists( Emitter ) = 0 Then Return False
  813.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  814.         If E = Null Then Return False
  815.         ERandomRotationX = PitchRange
  816.         ERandomRotationY = YawRange
  817.         ERandomRotationZ = RollRange
  818. End Function
  819.  
  820. Function SetEmitterParticleMesh(Emitter,Mesh=0)
  821.         If EmitterExists( Emitter ) = 0 Then Return False
  822.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  823.         If E = Null Then Return False
  824.         EParticleMesh = Mesh
  825. End Function
  826.  
  827. Function SetEmitterRoll(Emitter,Roll#=0)
  828.         If EmitterExists( Emitter ) = 0 Then Return False
  829.         RotateEntity Emitter,EntityPitch(Emitter,False),EntityYaw(Emitter,False),Roll
  830. End Function
  831.  
  832. Function SetEmitterAutoEmit(Emitter,Emit=1)
  833.         If EmitterExists( Emitter ) = 0 Then Return False
  834.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  835.         If E = Null Then Return False
  836.         EEmit = Emit
  837.         If Emit Then EActive = -1
  838. End Function
  839.  
  840. Function SetEmitterTrail(Emitter,TrailEmitter=0)
  841.         If EmitterExists( Emitter ) = 0 Then Return False
  842.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  843.         If E = Null Then Return False
  844.         If TrailEmitter <> 0 Then
  845.                 Trail.LotusEmitter = Object.LotusEmitter(Int(EntityName(TrailEmitter)))
  846.         Else
  847.                 Trail.LotusEmitter = Null
  848.         EndIf
  849.        
  850.         ETrail = Trail
  851. End Function
  852.  
  853. Function SetEmitterChild(Emitter,ChildEmitter=0)
  854.         If EmitterExists( Emitter ) = 0 Then Return False
  855.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  856.         If E = Null Then Return False
  857.         If ChildEmitter <> 0 Then
  858.                 Child.LotusEmitter = Object.LotusEmitter(Int(EntityName(ChildEmitter)))
  859.         Else
  860.                 Child.LotusEmitter = Null
  861.         EndIf
  862.        
  863.         EChild = Child
  864.         If Child <> Null Then ChildParent = E
  865. End Function
  866.  
  867. Function SetEmitterParent(Emitter,ParentEmitter=0)
  868.         If EmitterExists( Emitter ) = 0 Then Return False
  869.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  870.         If E = Null Then Return False
  871.         If ParentEmitter <> 0 Then
  872.                 Parent.LotusEmitter = Object.LotusEmitter(Int(EntityName(ParentEmitter)))
  873.         Else
  874.                 Parent.LotusEmitter = Null
  875.         EndIf
  876.        
  877.         EParent = Parent
  878.         If Parent <> Null Then ParentChild = E
  879. End Function
  880.  
  881. Function SetEmitterBox(Emitter,X#=0,Y#=0,Z#=0)
  882.         If EmitterExists( Emitter ) = 0 Then Return False
  883.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  884.         If E = Null Then Return False
  885.         ECubeX = X
  886.         ECubeY = Y
  887.         ECubeZ = Z
  888. End Function
  889.  
  890. Function SetEmitterCylinder(Emitter,Radius#=0,Top#=0,Bottom#=0)
  891.         If EmitterExists( Emitter ) = 0 Then Return False
  892.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  893.         If E = Null Then Return False
  894.         ECylinderX = Radius
  895.         ECylinderY = Top
  896.         ECylinderZ = Bottom
  897. End Function
  898.  
  899. Function SetEmitterRadius(Emitter,Radius#=0,InnerRadius# = 0,YRadius# = 0)
  900.         If EmitterExists( Emitter ) = 0 Then Return False
  901.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  902.         If E = Null Then Return False
  903.         ERadius = Radius
  904.         EInnerRadius = InnerRadius
  905.         If YRadius# = 0 Then YRadius# = Radius#
  906.         EYRadius# = YRadius
  907. End Function
  908.  
  909. Function SetEmitterWaveSpeed(Emitter,X#=1,Y#=1,Z#=1)
  910.         If EmitterExists( Emitter ) = 0 Then Return False
  911.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  912.         If E = Null Then Return False
  913.         EWaveSpeedX = Abs X
  914.         EWaveSpeedY = Abs Y
  915.         EWaveSpeedZ = Abs Z
  916. End Function
  917.  
  918. Function SetEmitterWaveRadius(Emitter,X#=0,Y#=0,Z#=0)
  919.         If EmitterExists( Emitter ) = 0 Then Return False
  920.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  921.         If E = Null Then Return False
  922.         EWaveRadiusX = X
  923.         EWaveRadiusY = Y
  924.         EWaveRadiusZ = Z
  925. End Function
  926.  
  927. Function SetEmitterEmissionRate(Emitter,Amount%=1)
  928.         If EmitterExists( Emitter ) = 0 Then Return False
  929.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  930.         If E = Null Then Return False
  931.         EEmissionRate = Amount
  932. End Function
  933.  
  934. Function SetEmitterViewMode(Emitter,Mode%=1)
  935.         If EmitterExists( Emitter ) = 0 Then Return False
  936.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  937.         If E = Null Then Return False
  938.         EViewMode = Mode
  939. End Function
  940.  
  941. Function SetEmitterLifeMode(Emitter,Mode%=1)
  942.         If EmitterExists( Emitter ) = 0 Then Return False
  943.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  944.         If E = Null Then Return False
  945.         ELifeMode = Max(Min(Mode,1),3)
  946. End Function
  947.  
  948. Function SetEmitterChildMode(Emitter,Mode%=1)
  949.         If EmitterExists( Emitter ) = 0 Then Return False
  950.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  951.         If E = Null Then Return False
  952.         EChildMode = Mode
  953. End Function
  954.  
  955. Function SetEmitterWaitSpan(Emitter,Span%=1,Jitter%=0)
  956.         If EmitterExists( Emitter ) = 0 Then Return False
  957.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  958.         If E = Null Then Return False
  959.         EWaitSpan = Min(Span,1)
  960.         EDWaitSpan = Min(Span,1)
  961.         EWaitSpanJitter = Jitter
  962. End Function
  963.  
  964. Function SetEmitterCircleSpeed(Emitter,X#,Y#,Z#)
  965.         If EmitterExists( Emitter ) = 0 Then Return False
  966.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  967.         If E = Null Then Return False
  968.         ECircleSpeedX = Abs X
  969.         ECircleSpeedY = Abs Y
  970.         ECircleSpeedZ = Abs Z
  971. End Function
  972.  
  973. Function SetEmitterCircleRadius(Emitter,X#,Y#,Z#)
  974.         If EmitterExists( Emitter ) = 0 Then Return False
  975.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  976.         If E = Null Then Return False
  977.         ECircleRadiusX = X
  978.         ECircleRadiusY = Y
  979.         ECircleRadiusZ = Z
  980. End Function
  981.  
  982. Function SetEmitterRadii(Emitter,X#,Y#,Z#)      ;; Backwards compatibility
  983.         Return SetEmitterCircleRadius(Emitter,X,Y,Z)
  984. End Function
  985.  
  986. Function SetEmitterRadiiSpeed(Emitter,X#,Y#,Z#) ;; Backwards compatibility
  987.         Return SetEmitterCircleSpeed(Emitter,X,Y,Z)
  988. End Function
  989.  
  990. Function FreezeEmitter(Emitter,Recursive% = True)
  991.         If EmitterExists( Emitter ) = 0 Then Return False
  992.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  993.         While E <> Null
  994.                 EFrozen = True
  995.                 T.LotusEmitter = ETrail
  996.                 If T <> Null And Recursive = True Then TFrozen = True
  997.                 For P.LotusParticle = Each LotusParticle
  998.                         If PParent = E Or (PParent = T And Recursive) Then
  999.                                 PFrozen = True
  1000.                         EndIf
  1001.                 Next
  1002.                 If EEmitSoundChannel <> 0 Then PauseChannel( EEmitSoundChannel )
  1003.                 If Recursive Then
  1004.                         E = EChild
  1005.                         If E <> Null Then T = ETrail
  1006.                 Else
  1007.                         E = Null
  1008.                 EndIf
  1009.         Wend
  1010. End Function
  1011.  
  1012. Function UnFreezeEmitter(Emitter,Recursive% = True)
  1013.         If EmitterExists( Emitter ) = 0 Then Return False
  1014.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1015.         While E <> Null
  1016.                 EFrozen = False
  1017.                 T.LotusEmitter = ETrail
  1018.                 If T <> Null And Recursive = True Then TFrozen = False
  1019.                 For P.LotusParticle = Each LotusParticle
  1020.                         If PParent = E Or (PParent = T And Recursive) Then
  1021.                                 If PLifeMode = 2 And PFrozen = True Then
  1022.                                         PLifeBegan = MilliSecs()-(PLifeSpan-PLife)
  1023.                                 EndIf
  1024.                                 PFrozen = False
  1025.                         EndIf
  1026.                 Next
  1027.                 If EEmitSoundChannel <> 0 Then ResumeChannel( EEmitSoundChannel )
  1028.                 If Recursive Then
  1029.                         E = EChild
  1030.                         If E <> Null Then T = ETrail
  1031.                 Else
  1032.                         E = Null
  1033.                 EndIf
  1034.         Wend
  1035. End Function
  1036.  
  1037. Function HideEmitter(Emitter,Recursive% = True)
  1038.         If EmitterExists( Emitter ) = 0 Then Return False
  1039.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter))) 
  1040.         While E <> Null
  1041.                 T.LotusEmitter = ETrail
  1042.                 EHidden = True
  1043.                 If T <> Null And Recursive = True Then THidden = True
  1044.                 For P.LotusParticle = Each LotusParticle
  1045.                         If PParent = E Or (PParent = T And Recursive = True) Then
  1046.                                 PHidden = True
  1047.                         EndIf
  1048.                 Next
  1049.                 If Recursive Then
  1050.                         E = EChild
  1051.                         If E <> Null Then T = ETrail
  1052.                 Else
  1053.                         E = Null
  1054.                 EndIf
  1055.         Wend
  1056. End Function
  1057.  
  1058. Function ShowEmitter(Emitter,Recursive% = True)
  1059.         If EmitterExists( Emitter ) = 0 Then Return False
  1060.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter))) 
  1061.         While E <> Null
  1062.                 T.LotusEmitter = ETrail
  1063.                 EHidden = False
  1064.                 If T <> Null And Recursive = True Then THidden = False
  1065.                 For P.LotusParticle = Each LotusParticle
  1066.                         If PParent = E Or (PParent = T And Recursive = True) Then
  1067.                                 PHidden = False
  1068.                         EndIf
  1069.                 Next
  1070.                 If Recursive Then
  1071.                         E = EChild
  1072.                         If E <> Null Then T = ETrail
  1073.                 Else
  1074.                         E = Null
  1075.                 EndIf
  1076.         Wend
  1077. End Function
  1078.  
  1079. Function SetEmitterGravity(Emitter,Gravity#=0,Enabled=1)
  1080.         If EmitterExists( Emitter ) = 0 Then Return False
  1081.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1082.         If E = Null Then Return False
  1083.         EGravity = Gravity
  1084.         EGravityEnabled = Min(Max(Enabled,1),0)
  1085. End Function
  1086.  
  1087. Function SetEmitterGravityJitter(Emitter,GravityJitter#=0,Up=1,Down=1)
  1088.         If EmitterExists( Emitter ) = 0 Then Return False
  1089.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1090.         If E = Null Then Return False
  1091.         EGravityJitter# = GravityJitter
  1092.         EGravityJitterUp = Up
  1093.         EGravityJitterDown = Down
  1094. End Function
  1095.  
  1096. Function SetEmitterWeight(Emitter,Weight#=0)
  1097.         If EmitterExists( Emitter ) = 0 Then Return False
  1098.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1099.         If E = Null Then Return False
  1100.         EWeight = Weight
  1101. End Function
  1102.  
  1103. Function SetEmitterRollMode(Emitter,Mode%=0)
  1104.         If EmitterExists( Emitter ) = 0 Then Return False
  1105.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1106.         If E = Null Then Return False
  1107.         ERollMode = Mode
  1108. End Function
  1109.  
  1110. Function SetEmitterViewRange(Emitter,Range#=0)
  1111.         If EmitterExists( Emitter ) = 0 Then Return False
  1112.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1113.         If E = Null Then Return False
  1114.         ERange# = Range#
  1115. End Function
  1116.  
  1117. Function SetEmitterCulling(Emitter,Enabled=0)
  1118.         If EmitterExists( Emitter ) = 0 Then Return False
  1119.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1120.         If E = Null Then Return False
  1121.         ECull = Enabled
  1122. End Function
  1123.  
  1124. Function SetEmitterSorting(Emitter,Enabled=0)
  1125.         If EmitterExists( Emitter ) = 0 Then Return False
  1126.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1127.         If E = Null Then Return False
  1128.         ESorting = Enabled
  1129. End Function
  1130.  
  1131. Function SetEmitterColorGraph(Emitter, Graph)
  1132.         If EmitterExists( Emitter ) = 0 Then Return False
  1133.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1134.         If E = Null Then Return False
  1135.         EColorGraph = Object.LotusGraph( Graph )
  1136. End Function
  1137.  
  1138. Function SetEmitterSizeGraph(Emitter, Graph)
  1139.         If EmitterExists( Emitter ) = 0 Then Return False
  1140.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1141.         If E = Null Then Return False
  1142.         ESizeGraph = Object.LotusGraph( Graph )
  1143. End Function
  1144.  
  1145. Function SetEmitterBounce(Emitter, MinY#, Bounce%=-1, BounceDecay#=.25, MaximumBounces%=-1)
  1146.         If EmitterExists( Emitter ) = 0 Then Return False
  1147.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1148.         If E = Null Then Return False
  1149.         EMinY = MinY
  1150.         If Bounce > -1 Then EBounce = Bounce
  1151.         EBounceDecay = BounceDecay
  1152.         If MaximumBounces > -1 Then EBounceMax = MaximumBounces
  1153. End Function
  1154.  
  1155. Function SetEmitterEmissionSound(Emitter, Sound, Loop = 0, Range# = 100)
  1156.         If EmitterExists( Emitter ) = 0 Then Return False
  1157.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1158.         If E = Null Then Return False
  1159.         If EEmitSound <> Sound Then
  1160.                 If EEmitSoundChannel <> 0 Then
  1161.                         StopChannel EEmitSoundChannel
  1162.                         EEmitSoundChannel = 0
  1163.                 EndIf
  1164.         EndIf
  1165.         EEmitSound = Sound
  1166.         ELoopEmitSound = Loop
  1167.         EEmitSoundRange = 100
  1168. End Function
  1169.  
  1170. Function SetEmitterBounceSound(Emitter, Sound, Range# = 100)
  1171.         If EmitterExists( Emitter ) = 0 Then Return False
  1172.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1173.         If E = Null Then Return False
  1174.         EBounceSound = Sound
  1175.         EBounceSoundRange = Range
  1176. End Function
  1177.  
  1178. Function SetEmitterSplineMesh( Emitter, Mesh=0 )
  1179.         If EmitterExists( Emitter ) = 0 Then Return False
  1180.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1181.         If E = Null Then Return False
  1182.         ESplineMesh = Mesh
  1183. End Function
  1184.  
  1185. Function SetEmitterDeflectorsAffect( Emitter, Enabled=1 )
  1186.         If EmitterExists( Emitter ) = 0 Then Return False
  1187.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1188.         If E = Null Then Return False
  1189.         EDeflectorsAffect = Enabled
  1190. End Function
  1191.  
  1192. Function EnableDeflectors( Emitter )
  1193.         If EmitterExists( Emitter ) = 0 Then Return False
  1194.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1195.         If E = Null Then Return False
  1196.         EDeflectorsAffect = True
  1197. End Function
  1198.  
  1199. Function DisableDeflectors( Emitter )
  1200.         If EmitterExists( Emitter ) = 0 Then Return False
  1201.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1202.         If E = Null Then Return False
  1203.         EDeflectorsAffect = False
  1204. End Function
  1205.  
  1206. Function EmitterActive( Emitter )
  1207.         If EmitterExists( Emitter ) = 0 Then Return False
  1208.         E.LotusEmitter = Object.LotusEmitter(Int(EntityName(Emitter)))
  1209.         If E = Null Then Return False
  1210.         Return EEmit
  1211. End Function
  1212.  
  1213. Function LoadASCIIEmitters( Path$ )
  1214.         i.XMLNode = ReadXML(Path)
  1215.                 f.XMLNode = i
  1216.                
  1217.                 While f <> Null
  1218.                         ParseLPXML(f)
  1219.                         f = XMLNextNode(f)
  1220.                 Wend
  1221.                
  1222.                 XMLDeleteNode(i)
  1223.                
  1224.                 Return 1
  1225. End Function
  1226.  
  1227. Function ParseLPXML(i.xmlNode)
  1228. End Function


Comments :


Wayne(Posted 1+ years ago)

 The html to part one should be:<a href="codearcs1d1b.html?code=1654#" target="_blank">http://www.blitzbasic.com/codearcs/codearcs.php?code=1654#[/url]Nice work, checking it out.


Mikele(Posted 1+ years ago)

 Thanks Noel for amazing library but could you explain how can i use "graph" things ?


N(Posted 1+ years ago)

 Think of them as a keyframe system.For example:
Code: [Select]
SetEmitterColorFrom( emt, 255, 0, 0, 1 ) ; Start color = blue
SetEmitterColorTo( emt, 0, 255, 0, 1 ) ; End color = green

Graph = CreateGraph( )
AddGraphPoint( Graph, 0, 0 ) ; Starting point 0 uses red
AddGraphPoint( Graph, 5, 1 ) ; Middle point 5 uses green
AddGraphPoint( Graph, 10, 0 ) ; End point 10 uses red
SetEmitterColorGraph( emt, Graph ) ; Use the graph
The idea here is that 0 is the starting keyframe, 5 is halfway through, and 10 is the end.  The highest X is always the ending in the graph.  Y denotes the value between the From and To values of the corresponding component the graph is assigned to.For example, if you had a graph with Y points like this:1.5010The interpolation would be something like this:End valueMiddle valueStart valueEnd valueStart value


Mikele(Posted 1+ years ago)

 Ahh... ok. Thank you!BTW. SetEmitterRadius function don't work.You can change lines:
Code: [Select]
gTempLotusVectorX = gSine(RndAng)*RndRad + (gSine(ET*ECircleSpeedX Mod 359)*ECircleRadiusX)+Rnd(-ECubeX,ECubeX)
gTempLotusVector = Rnd(ECylinderZ,ECylinderY) + gSine(ET*ECircleSpeedY Mod 359)*ECircleRadiusY+Rnd(-ECubeY,ECubeY)
gTempLotusVectorY = gCosine(RndAng)*RndRad + (gCosine(ET*ECircleSpeedZ Mod 359)*ECircleRadiusZ)+Rnd(-ECubeZ,ECubeZ)
to
Code: [Select]
RRad# = Rnd(EInnerRadius,ERadius)
gTempLotusVectorX = gSine(RndAng)*RndRad + (gSine(ET*RRad Mod 359)*RRad) + (gSine(ET*ECircleSpeedX Mod 359)*ECircleRadiusX)+Rnd(-ECubeX,ECubeX)
gTempLotusVector =Rnd(-EYRadius,EYRadius) + Rnd(ECylinderZ,ECylinderY) + gSine(ET*ECircleSpeedY Mod 359)*ECircleRadiusY+Rnd(-ECubeY,ECubeY)
gTempLotusVectorY = (gCosine(ET*RRad Mod 359)*RRad) + gCosine(RndAng)*RndRad + (gCosine(ET*ECircleSpeedZ Mod 359)*ECircleRadiusZ)+Rnd(-ECubeZ,ECubeZ)
and now Radius, InnerRadius & YRadius works for me.


N(Posted 1+ years ago)

 Included the fix.  Can't test it as I no longer have Blitz3D, but I'll take your word for it. [/i]

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal