2
0

GXS.LinePFX.pas 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXS.LinePFX;
  5. (* A PFX whose particles are lines *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. Winapi.OpenGL,
  10. Winapi.OpenGLext,
  11. System.Classes,
  12. System.SysUtils,
  13. Stage.VectorTypes,
  14. GXS.PersistentClasses,
  15. Stage.VectorGeometry,
  16. GXS.ParticleFX,
  17. GXS.Texture,
  18. GXS.Color,
  19. GXS.RenderContextInfo,
  20. GXS.Context;
  21. type
  22. // Linear particle.
  23. TgxLineParticle = class (TgxParticle)
  24. private
  25. FDirection : TAffineVector;
  26. FLength : Single;
  27. protected
  28. public
  29. procedure WriteToFiler(writer : TgxVirtualWriter); override;
  30. procedure ReadFromFiler(reader : TgxVirtualReader); override;
  31. { Direction of the line. }
  32. property Direction : TAffineVector read FDirection write FDirection;
  33. { Length of the line }
  34. property Length : Single read FLength write FLength;
  35. end;
  36. { Polygonal particles FX manager.
  37. The particles of this manager are made of N-face regular polygon with
  38. a core and edge color. No texturing is available.
  39. If you render large particles and don't have T&L acceleration, consider
  40. using TgxPointLightPFXManager. }
  41. TgxLinePFXManager = class (TgxLifeColoredPFXManager)
  42. private
  43. Fvx, Fvy : TAffineVector; // NOT persistent
  44. FNvx, FNvy : TAffineVector; // NOT persistent
  45. FDefaultLength : Single;
  46. protected
  47. function StoreDefaultLength : Boolean;
  48. function TexturingMode : Cardinal; override;
  49. procedure InitializeRendering(var rci: TgxRenderContextInfo); override;
  50. procedure BeginParticles(var rci: TgxRenderContextInfo); override;
  51. procedure RenderParticle(var rci: TgxRenderContextInfo; aParticle : TgxParticle); override;
  52. procedure EndParticles(var rci: TgxRenderContextInfo); override;
  53. procedure FinalizeRendering(var rci: TgxRenderContextInfo); override;
  54. public
  55. constructor Create(aOwner : TComponent); override;
  56. destructor Destroy; override;
  57. class function ParticlesClass : TgxParticleClass; override;
  58. function CreateParticle : TgxParticle; override;
  59. published
  60. property DefaultLength : Single read FDefaultLength write FDefaultLength stored StoreDefaultLength;
  61. property ParticleSize;
  62. property ColorInner;
  63. property ColorOuter;
  64. property LifeColors;
  65. end;
  66. // ------------------------------------------------------------------
  67. implementation
  68. // ------------------------------------------------------------------
  69. // ------------------
  70. // ------------------ TgxLinePFXManager ------------------
  71. // ------------------
  72. constructor TgxLinePFXManager.Create(aOwner : TComponent);
  73. begin
  74. inherited;
  75. FDefaultLength:=1;
  76. end;
  77. destructor TgxLinePFXManager.Destroy;
  78. begin
  79. inherited Destroy;
  80. end;
  81. class function TgxLinePFXManager.ParticlesClass : TgxParticleClass;
  82. begin
  83. Result:=TgxLineParticle;
  84. end;
  85. function TgxLinePFXManager.CreateParticle : TgxParticle;
  86. begin
  87. Result:=inherited CreateParticle;
  88. TgxLineParticle(Result).FLength:=DefaultLength;
  89. end;
  90. function TgxLinePFXManager.TexturingMode : Cardinal;
  91. begin
  92. Result:=0;
  93. end;
  94. procedure TgxLinePFXManager.InitializeRendering(var rci: TgxRenderContextInfo);
  95. var
  96. i : Integer;
  97. matrix : TMatrix4f;
  98. begin
  99. inherited;
  100. glGetFloatv(GL_MODELVIEW_MATRIX, @matrix);
  101. for i:=0 to 2 do begin
  102. Fvx.V[i]:=matrix.V[i].X;
  103. Fvy.V[i]:=matrix.V[i].Y;
  104. end;
  105. FNvx:=VectorNormalize(Fvx);
  106. FNvy:=VectorNormalize(Fvy);
  107. end;
  108. procedure TgxLinePFXManager.BeginParticles(var rci: TgxRenderContextInfo);
  109. begin
  110. ApplyBlendingMode(rci);
  111. end;
  112. procedure TgxLinePFXManager.RenderParticle(var rci: TgxRenderContextInfo; aParticle : TgxParticle);
  113. var
  114. lifeTime, sizeScale, fx, fy, f : Single;
  115. inner, outer : TgxColorVector;
  116. pos, dir, start, stop, dv : TAffineVector;
  117. begin
  118. lifeTime:=CurrentTime-aParticle.CreationTime;
  119. ComputeColors(lifeTime, inner, outer);
  120. if ComputeSizeScale(lifeTime, sizeScale) then
  121. sizeScale:=sizeScale*ParticleSize
  122. else sizeScale:=ParticleSize;
  123. pos:=aParticle.Position;
  124. with TgxLineParticle(aParticle) do begin
  125. dir:=VectorNormalize(aParticle.Velocity);
  126. f:=Length*0.5;
  127. end;
  128. start:=VectorCombine(pos, dir, 1, f);
  129. stop:=VectorCombine(pos, dir, 1, -f);
  130. fx:=VectorDotProduct(dir, FNvy)*sizeScale;
  131. fy:=-VectorDotProduct(dir, FNvx)*sizeScale;
  132. dv:=VectorCombine(Fvx, Fvy, fx, fy);
  133. glBegin(GL_TRIANGLE_FAN);
  134. glColor4fv(@inner);
  135. glVertex3fv(@start);
  136. glColor4fv(@outer);
  137. glVertex3f(start.X+dv.X, start.Y+dv.Y, start.Z+dv.Z);
  138. glVertex3f(stop.X+dv.X, stop.Y+dv.Y, stop.Z+dv.Z);
  139. glColor4fv(@inner);
  140. glVertex3fv(@stop);
  141. glColor4fv(@outer);
  142. glVertex3f(stop.X-dv.X, stop.Y-dv.Y, stop.Z-dv.Z);
  143. glVertex3f(start.X-dv.X, start.Y-dv.Y, start.Z-dv.Z);
  144. glEnd;
  145. end;
  146. procedure TgxLinePFXManager.EndParticles(var rci: TgxRenderContextInfo);
  147. begin
  148. UnapplyBlendingMode(rci);
  149. end;
  150. procedure TgxLinePFXManager.FinalizeRendering(var rci: TgxRenderContextInfo);
  151. begin
  152. inherited;
  153. end;
  154. function TgxLinePFXManager.StoreDefaultLength : Boolean;
  155. begin
  156. Result:=(FDefaultLength<>1);
  157. end;
  158. // ------------------
  159. // ------------------ TgxLineParticle ------------------
  160. // ------------------
  161. procedure TgxLineParticle.WriteToFiler(writer : TgxVirtualWriter);
  162. begin
  163. inherited WriteToFiler(writer);
  164. with writer do begin
  165. WriteInteger(0); // Archive Version 0
  166. Write(FDirection, SizeOf(FDirection));
  167. WriteFloat(FLength);
  168. end;
  169. end;
  170. procedure TgxLineParticle.ReadFromFiler(reader : TgxVirtualReader);
  171. var
  172. archiveVersion : integer;
  173. begin
  174. inherited ReadFromFiler(reader);
  175. archiveVersion:=reader.ReadInteger;
  176. if archiveVersion=0 then with reader do begin
  177. Read(FDirection, SizeOf(FDirection));
  178. FLength:=ReadFloat;
  179. end else RaiseFilerException(archiveVersion);
  180. end;
  181. // ------------------------------------------------------------------
  182. initialization
  183. // ------------------------------------------------------------------
  184. RegisterClasses([TgxLineParticle, TgxLinePFXManager]);
  185. end.