فهرست منبع

Included FountainParticles using MatLib

GLScene 2 سال پیش
والد
کامیت
10eb11bb1a

BIN
Examples/Demos/sprites/FoutainParticles.jpg


+ 20 - 0
Examples/Demos/sprites/fountainparticles/FountainParticlesD.dpr

@@ -0,0 +1,20 @@
+(*
+  Fountain Particles
+    2010-05-17 - modified for fired keyboards by Pavel Vassiliev
+    2005-06-09 - original code using four textures by Dave Gravel
+*)
+
+ program FountainParticlesD;
+
+uses
+  Forms,
+  fFountainD in 'fFountainD.pas' {Form1},
+  uFountainD in 'uFountainD.pas';
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.CreateForm(TForm1, Form1);
+  Application.Run;
+end.

+ 951 - 0
Examples/Demos/sprites/fountainparticles/FountainParticlesD.dproj

@@ -0,0 +1,951 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+    <PropertyGroup>
+        <ProjectGuid>{3C6D63FF-228C-4E49-AD7A-C670FFC34935}</ProjectGuid>
+        <MainSource>FountainParticlesD.dpr</MainSource>
+        <Base>True</Base>
+        <Config Condition="'$(Config)'==''">Debug</Config>
+        <TargetedPlatforms>1</TargetedPlatforms>
+        <AppType>Application</AppType>
+        <FrameworkType>VCL</FrameworkType>
+        <ProjectVersion>19.4</ProjectVersion>
+        <Platform Condition="'$(Platform)'==''">Win32</Platform>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+        <Base_Win32>true</Base_Win32>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+        <Base_Win64>true</Base_Win64>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
+        <Cfg_1>true</Cfg_1>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+        <Cfg_1_Win32>true</Cfg_1_Win32>
+        <CfgParent>Cfg_1</CfgParent>
+        <Cfg_1>true</Cfg_1>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
+        <Cfg_2>true</Cfg_2>
+        <CfgParent>Base</CfgParent>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
+        <Cfg_2_Win32>true</Cfg_2_Win32>
+        <CfgParent>Cfg_2</CfgParent>
+        <Cfg_2>true</Cfg_2>
+        <Base>true</Base>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base)'!=''">
+        <DCC_K>false</DCC_K>
+        <DCC_N>false</DCC_N>
+        <DCC_S>false</DCC_S>
+        <VerInfo_Locale>1049</VerInfo_Locale>
+        <DCC_E>false</DCC_E>
+        <DCC_F>false</DCC_F>
+        <SanitizedProjectName>FountainParticlesD</SanitizedProjectName>
+        <VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=</VerInfo_Keys>
+        <DCC_ImageBase>00400000</DCC_ImageBase>
+        <DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_Win32)'!=''">
+        <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
+        <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
+        <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
+        <VerInfo_Locale>1033</VerInfo_Locale>
+        <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+        <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
+        <VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(ModuleName);FileDescription=$(ModuleName);ProductName=$(ModuleName)</VerInfo_Keys>
+        <DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Base_Win64)'!=''">
+        <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
+        <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_1)'!=''">
+        <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+        <DCC_DebugInformation>0</DCC_DebugInformation>
+        <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+        <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+        <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
+        <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2)'!=''">
+        <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+        <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+        <DCC_Optimize>false</DCC_Optimize>
+    </PropertyGroup>
+    <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
+        <BT_BuildType>Debug</BT_BuildType>
+        <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
+        <AppDPIAwarenessMode>PerMonitor</AppDPIAwarenessMode>
+    </PropertyGroup>
+    <ItemGroup>
+        <DelphiCompile Include="$(MainSource)">
+            <MainSource>MainSource</MainSource>
+        </DelphiCompile>
+        <DCCReference Include="fFountainD.pas">
+            <Form>Form1</Form>
+        </DCCReference>
+        <DCCReference Include="uFountainD.pas"/>
+        <BuildConfiguration Include="Base">
+            <Key>Base</Key>
+        </BuildConfiguration>
+        <BuildConfiguration Include="Release">
+            <Key>Cfg_1</Key>
+            <CfgParent>Base</CfgParent>
+        </BuildConfiguration>
+        <BuildConfiguration Include="Debug">
+            <Key>Cfg_2</Key>
+            <CfgParent>Base</CfgParent>
+        </BuildConfiguration>
+    </ItemGroup>
+    <ProjectExtensions>
+        <Borland.Personality>Delphi.Personality.12</Borland.Personality>
+        <Borland.ProjectType/>
+        <BorlandProject>
+            <Delphi.Personality>
+                <Source>
+                    <Source Name="MainSource">FountainParticlesD.dpr</Source>
+                </Source>
+            </Delphi.Personality>
+            <Platforms>
+                <Platform value="Win32">True</Platform>
+                <Platform value="Win64">False</Platform>
+            </Platforms>
+            <Deployment Version="3">
+                <DeployFile LocalName="FountainParticlesD.exe" Configuration="Debug" Class="ProjectOutput">
+                    <Platform Name="Win32">
+                        <RemoteName>FountainParticlesD.exe</RemoteName>
+                        <Overwrite>true</Overwrite>
+                    </Platform>
+                </DeployFile>
+                <DeployClass Name="AdditionalDebugSymbols">
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidClasses">
+                    <Platform Name="Android">
+                        <RemoteDir>classes</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>classes</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidFileProvider">
+                    <Platform Name="Android">
+                        <RemoteDir>res\xml</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\xml</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidGDBServer">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeArmeabiFile">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeArmeabiv7aFile">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidLibnativeMipsFile">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\mips</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\mips</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidServiceOutput">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\arm64-v8a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidServiceOutput_Android32">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashImageDef">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashStyles">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="AndroidSplashStylesV21">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values-v21</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_Colors">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_DefaultAppIcon">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon144">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon192">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon36">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-ldpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-ldpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon48">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon72">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_LauncherIcon96">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon24">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-mdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon36">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-hdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon48">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon72">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_NotificationIcon96">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xxxhdpi</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage426">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-small</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-small</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage470">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-normal</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-normal</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage640">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-large</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-large</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_SplashImage960">
+                    <Platform Name="Android">
+                        <RemoteDir>res\drawable-xlarge</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\drawable-xlarge</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="Android_Strings">
+                    <Platform Name="Android">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>res\values</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DebugSymbols">
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DependencyFramework">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.framework</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="DependencyModule">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                        <Extensions>.dll;.bpl</Extensions>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Required="true" Name="DependencyPackage">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                        <Extensions>.dylib</Extensions>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                        <Extensions>.bpl</Extensions>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="File">
+                    <Platform Name="Android">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice32">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\Resources\StartUp\</RemoteDir>
+                        <Operation>0</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iOS_AppStore1024">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_AppIcon152">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_AppIcon167">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Launch2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_LaunchDark2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Notification40">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_Setting58">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPad_SpotLight80">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_AppIcon120">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_AppIcon180">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Launch2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Launch3x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_LaunchDark2x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_LaunchDark3x">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Notification40">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Notification60">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Setting58">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Setting87">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Spotlight120">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="iPhone_Spotlight80">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectAndroidManifest">
+                    <Platform Name="Android">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSDeviceDebug">
+                    <Platform Name="iOSDevice32">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSEntitlements">
+                    <Platform Name="iOSDevice32">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSInfoPList">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSLaunchScreen">
+                    <Platform Name="iOSDevice64">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
+                        <Operation>64</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectiOSResource">
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXDebug">
+                    <Platform Name="OSX64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXEntitlements">
+                    <Platform Name="OSX32">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>..\</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXInfoPList">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOSXResource">
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\Resources</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Required="true" Name="ProjectOutput">
+                    <Platform Name="Android">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\arm64-v8a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSDevice64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="iOSSimulator">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Linux64">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX32">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSX64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="OSXARM64">
+                        <RemoteDir>Contents\MacOS</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win32">
+                        <Operation>0</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectOutput_Android32">
+                    <Platform Name="Android64">
+                        <RemoteDir>library\lib\armeabi-v7a</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="ProjectUWPManifest">
+                    <Platform Name="Win32">
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="UWP_DelphiLogo150">
+                    <Platform Name="Win32">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <DeployClass Name="UWP_DelphiLogo44">
+                    <Platform Name="Win32">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                    <Platform Name="Win64">
+                        <RemoteDir>Assets</RemoteDir>
+                        <Operation>1</Operation>
+                    </Platform>
+                </DeployClass>
+                <ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
+                <ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
+                <ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
+            </Deployment>
+        </BorlandProject>
+        <ProjectFileVersion>12</ProjectFileVersion>
+    </ProjectExtensions>
+    <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
+    <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
+    <Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
+</Project>

BIN
Examples/Demos/sprites/fountainparticles/Textures/Par1.bmp


BIN
Examples/Demos/sprites/fountainparticles/Textures/Par2.bmp


BIN
Examples/Demos/sprites/fountainparticles/Textures/Par3.bmp


BIN
Examples/Demos/sprites/fountainparticles/Textures/Par4.bmp


+ 702 - 0
Examples/Demos/sprites/fountainparticles/fFountainD.dfm

@@ -0,0 +1,702 @@
+object Form1: TForm1
+  Left = 216
+  Top = 3
+  Caption = 'Fountain Particles'
+  ClientHeight = 645
+  ClientWidth = 886
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  Menu = MainMenu1
+  Position = poScreenCenter
+  OnCreate = FormCreate
+  OnMouseWheel = FormMouseWheel
+  TextHeight = 13
+  object GLSceneViewer1: TGLSceneViewer
+    Left = 0
+    Top = 0
+    Width = 678
+    Height = 626
+    Camera = Cam
+    VSync = vsmSync
+    Buffer.FogEnvironment.FogStart = 25.000000000000000000
+    Buffer.FogEnvironment.FogEnd = 25.000000000000000000
+    Buffer.BackgroundColor = clBlack
+    Buffer.ContextOptions = [roDoubleBuffer, roStencilBuffer, roRenderToWindow]
+    FieldOfView = 147.915893554687500000
+    PenAsTouch = False
+    Align = alClient
+    OnMouseDown = GLSceneViewer1MouseDown
+    OnMouseMove = GLSceneViewer1MouseMove
+    TabOrder = 0
+  end
+  object Panel1: TPanel
+    Left = 678
+    Top = 0
+    Width = 208
+    Height = 626
+    Align = alRight
+    BevelOuter = bvNone
+    TabOrder = 1
+    object Panel2: TPanel
+      Left = 0
+      Top = 545
+      Width = 208
+      Height = 81
+      Align = alBottom
+      TabOrder = 0
+      object Label1: TLabel
+        Left = 6
+        Top = 6
+        Width = 61
+        Height = 13
+        Caption = 'Color Start'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'MS Sans Serif'
+        Font.Style = [fsBold]
+        ParentFont = False
+      end
+      object Label2: TLabel
+        Left = 96
+        Top = 6
+        Width = 56
+        Height = 13
+        Caption = 'Color End'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'MS Sans Serif'
+        Font.Style = [fsBold]
+        ParentFont = False
+      end
+      object Label3: TLabel
+        Left = 6
+        Top = 62
+        Width = 71
+        Height = 13
+        Caption = 'BackGround'
+        Font.Charset = DEFAULT_CHARSET
+        Font.Color = clWindowText
+        Font.Height = -11
+        Font.Name = 'MS Sans Serif'
+        Font.Style = [fsBold]
+        ParentFont = False
+      end
+      object PStartColor: TPanel
+        Left = 8
+        Top = 24
+        Width = 73
+        Height = 17
+        Color = clRed
+        Ctl3D = True
+        DoubleBuffered = False
+        ParentBackground = False
+        ParentCtl3D = False
+        ParentDoubleBuffered = False
+        TabOrder = 0
+        OnClick = PStartColorClick
+      end
+      object PEndColor: TPanel
+        Left = 96
+        Top = 24
+        Width = 73
+        Height = 17
+        Color = clYellow
+        ParentBackground = False
+        TabOrder = 1
+        OnClick = PEndColorClick
+      end
+      object PBackColor: TPanel
+        Left = 96
+        Top = 58
+        Width = 73
+        Height = 17
+        Color = clBlack
+        ParentBackground = False
+        TabOrder = 2
+        OnClick = PBackColorClick
+      end
+    end
+    object PageControl1: TPageControl
+      Left = 0
+      Top = 0
+      Width = 208
+      Height = 545
+      ActivePage = TabSheet1
+      Align = alClient
+      Font.Charset = DEFAULT_CHARSET
+      Font.Color = clWindowText
+      Font.Height = -11
+      Font.Name = 'MS Sans Serif'
+      Font.Style = [fsBold]
+      ParentFont = False
+      TabOrder = 1
+      object TabSheet1: TTabSheet
+        Caption = 'Fontaine Setting'
+        object Label14: TLabel
+          Left = 8
+          Top = 472
+          Width = 105
+          Height = 13
+          Caption = 'Particles Size Max'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label13: TLabel
+          Left = 8
+          Top = 432
+          Width = 102
+          Height = 13
+          Caption = 'Particles Size Min'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label12: TLabel
+          Left = 8
+          Top = 392
+          Width = 74
+          Height = 13
+          Caption = 'Times Factor'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label11: TLabel
+          Left = 8
+          Top = 352
+          Width = 62
+          Height = 13
+          Caption = 'Life Factor'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label10: TLabel
+          Left = 8
+          Top = 312
+          Width = 64
+          Height = 13
+          Caption = 'Angle Start'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label9: TLabel
+          Left = 8
+          Top = 272
+          Width = 73
+          Height = 13
+          Caption = 'Velocity Max'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label8: TLabel
+          Left = 8
+          Top = 232
+          Width = 70
+          Height = 13
+          Caption = 'Velocity Min'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label7: TLabel
+          Left = 8
+          Top = 192
+          Width = 77
+          Height = 13
+          Caption = 'Max Particles'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label6: TLabel
+          Left = 8
+          Top = 152
+          Width = 29
+          Height = 13
+          Caption = 'Floor'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label5: TLabel
+          Left = 8
+          Top = 112
+          Width = 94
+          Height = 13
+          Caption = 'Bounding Factor'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label4: TLabel
+          Left = 8
+          Top = 72
+          Width = 77
+          Height = 13
+          Caption = 'Particle Mass'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object Label15: TLabel
+          Left = 8
+          Top = 32
+          Width = 33
+          Height = 13
+          Caption = 'Scale'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+        end
+        object EdPSizeMax: TEdit
+          Left = 8
+          Top = 488
+          Width = 129
+          Height = 21
+          TabOrder = 0
+          Text = '130'
+          OnChange = EdPSizeMaxChange
+        end
+        object EdPSizeMin: TEdit
+          Left = 8
+          Top = 448
+          Width = 129
+          Height = 21
+          TabOrder = 1
+          Text = '110'
+          OnChange = EdPSizeMinChange
+        end
+        object EdTimesFact: TEdit
+          Left = 8
+          Top = 408
+          Width = 129
+          Height = 21
+          TabOrder = 2
+          Text = '0.00005'
+          OnChange = EdTimesFactChange
+        end
+        object EdLifeFact: TEdit
+          Left = 8
+          Top = 368
+          Width = 129
+          Height = 21
+          TabOrder = 3
+          Text = '0.025'
+          OnChange = EdLifeFactChange
+        end
+        object EdAngleStart: TEdit
+          Left = 8
+          Top = 328
+          Width = 129
+          Height = 21
+          TabOrder = 4
+          Text = '360'
+          OnChange = EdAngleStartChange
+        end
+        object EdVelMax: TEdit
+          Left = 8
+          Top = 288
+          Width = 129
+          Height = 21
+          TabOrder = 5
+          Text = '15'
+          OnChange = EdVelMaxChange
+        end
+        object EdVelMin: TEdit
+          Left = 8
+          Top = 248
+          Width = 129
+          Height = 21
+          TabOrder = 6
+          Text = '5'
+          OnChange = EdVelMinChange
+        end
+        object EdMaxP: TEdit
+          Left = 8
+          Top = 208
+          Width = 129
+          Height = 21
+          TabOrder = 7
+          Text = '60'
+          OnChange = EdMaxPChange
+        end
+        object EdFloor: TEdit
+          Left = 8
+          Top = 168
+          Width = 129
+          Height = 21
+          TabOrder = 8
+          Text = '0.0'
+          OnChange = EdFloorChange
+        end
+        object EdBound: TEdit
+          Left = 8
+          Top = 128
+          Width = 129
+          Height = 21
+          TabOrder = 9
+          Text = '100.0'
+          OnChange = EdBoundChange
+        end
+        object EdMass: TEdit
+          Left = 8
+          Top = 88
+          Width = 129
+          Height = 21
+          TabOrder = 10
+          Text = '5.0'
+          OnChange = EdMassChange
+        end
+        object CheckActived: TCheckBox
+          Left = 0
+          Top = 8
+          Width = 65
+          Height = 17
+          Caption = 'Actived'
+          Checked = True
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+          State = cbChecked
+          TabOrder = 11
+          OnClick = CheckActivedClick
+        end
+        object CheckBound: TCheckBox
+          Left = 72
+          Top = 8
+          Width = 73
+          Height = 17
+          Caption = 'Bounding'
+          Font.Charset = DEFAULT_CHARSET
+          Font.Color = clWindowText
+          Font.Height = -11
+          Font.Name = 'MS Sans Serif'
+          Font.Style = [fsBold]
+          ParentFont = False
+          TabOrder = 12
+          OnClick = CheckBoundClick
+        end
+        object TrackBar1: TTrackBar
+          Left = 0
+          Top = 48
+          Width = 150
+          Height = 15
+          Min = 1
+          PageSize = 1
+          Position = 2
+          TabOrder = 13
+          ThumbLength = 12
+          OnChange = TrackBar1Change
+        end
+      end
+      object TabSheet2: TTabSheet
+        Caption = 'Fontaine Style'
+        ImageIndex = 1
+        object Panel3: TPanel
+          Left = 0
+          Top = 0
+          Width = 200
+          Height = 517
+          Align = alClient
+          TabOrder = 0
+          ExplicitHeight = 513
+          object RadioButton1: TRadioButton
+            Left = 8
+            Top = 16
+            Width = 73
+            Height = 17
+            Caption = 'Style Fire'
+            Checked = True
+            TabOrder = 0
+            TabStop = True
+            OnClick = RadioButtonClick
+          end
+          object RadioButton2: TRadioButton
+            Left = 8
+            Top = 40
+            Width = 81
+            Height = 17
+            Caption = 'Style Water'
+            TabOrder = 1
+            OnClick = RadioButtonClick
+          end
+          object RadioButton3: TRadioButton
+            Left = 8
+            Top = 64
+            Width = 73
+            Height = 17
+            Caption = 'Style Ball'
+            TabOrder = 2
+            OnClick = RadioButtonClick
+          end
+        end
+      end
+    end
+  end
+  object StatusBar1: TStatusBar
+    Left = 0
+    Top = 626
+    Width = 886
+    Height = 19
+    Panels = <>
+  end
+  object GLScene1: TGLScene
+    Left = 32
+    Top = 36
+    object Scene: TGLDummyCube
+      CubeSize = 1.000000000000000000
+      object GLTorus1: TGLTorus
+        Material.MaterialLibrary = GLMatlibColors
+        Material.LibMaterialName = 'G'
+        MajorRadius = 1.500000000000000000
+        MinorRadius = 0.250000000000000000
+        StopAngle = 360.000000000000000000
+        Parts = [toSides, toStartDisk, toStopDisk]
+      end
+      object GLPlane1: TGLPlane
+        Material.MaterialLibrary = GLMatlibColors
+        Material.LibMaterialName = 'B'
+        Position.Coordinates = {0000000000000000000080C00000803F}
+        Height = 20.000000000000000000
+        Width = 20.000000000000000000
+      end
+    end
+    object Light: TGLLightSource
+      Ambient.Color = {BEC0403FBEC0403FBEC0403F0000803F}
+      ConstAttenuation = 1.000000000000000000
+      Position.Coordinates = {0000000000000000000020410000803F}
+      LightStyle = lsOmni
+      Specular.Color = {BEC0403FBEC0403FBEC0403F0000803F}
+      SpotCutOff = 180.000000000000000000
+      SpotDirection.Coordinates = {000000000000803F0000000000000000}
+    end
+    object Cam: TGLCamera
+      DepthOfView = 1000.000000000000000000
+      FocalLength = 90.000000000000000000
+      TargetObject = Scene
+      Position.Coordinates = {0000000000007041000040400000803F}
+      Direction.Coordinates = {000000000000803F0000000000000000}
+      Up.Coordinates = {00000000000000000000803F00000000}
+    end
+  end
+  object GLCadencer1: TGLCadencer
+    Scene = GLScene1
+    MaxDeltaTime = 0.020000000000000000
+    FixedDeltaTime = 0.016500000000000000
+    SleepLength = 0
+    OnProgress = GLCadencer1Progress
+    Left = 24
+    Top = 124
+  end
+  object Timer1: TTimer
+    OnTimer = Timer1Timer
+    Left = 360
+    Top = 52
+  end
+  object ColorDialog1: TColorDialog
+    Left = 172
+    Top = 288
+  end
+  object MainMenu1: TMainMenu
+    Left = 226
+    Top = 44
+    object File1: TMenuItem
+      Caption = 'File'
+      object Texture1: TMenuItem
+        Caption = 'Texture...'
+        OnClick = Texture1Click
+      end
+      object Close1: TMenuItem
+        Caption = 'Close'
+        OnClick = Close1Click
+      end
+    end
+  end
+  object OpenPictureDialog1: TOpenPictureDialog
+    Filter = 'Bitmaps (*.bmp)|*.bmp'
+    Left = 226
+    Top = 124
+  end
+  object GLMatlibColors: TGLMaterialLibrary
+    Materials = <
+      item
+        Name = 'C'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {0000803F00000000000000000000803F}
+        Material.BackProperties.Diffuse.Color = {0000803F00000000000000000000803F}
+        Material.BackProperties.Emission.Color = {0000803F00000000000000000000803F}
+        Material.BackProperties.Specular.Color = {0000803F00000000000000000000803F}
+        Material.FrontProperties.Ambient.Color = {0000803F00000000000000000000803F}
+        Material.FrontProperties.Diffuse.Color = {0000803F00000000000000000000803F}
+        Material.FrontProperties.Emission.Color = {0000803F00000000000000000000803F}
+        Material.FrontProperties.Specular.Color = {0000803F00000000000000000000803F}
+      end
+      item
+        Name = 'Csh'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {0000803F0000803E000000000000803F}
+        Material.BackProperties.Diffuse.Color = {0000803F0000803E000000000000803F}
+        Material.BackProperties.Emission.Color = {0000803F0000803E000000000000803F}
+        Material.BackProperties.Specular.Color = {0000803F0000803E000000000000803F}
+        Material.FrontProperties.Emission.Color = {CDCC0C3FEC51B83DEC51B83D0000803F}
+      end
+      item
+        Name = 'D'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {0000803F0000003F000000000000803F}
+        Material.BackProperties.Diffuse.Color = {0000803F0000003F000000000000803F}
+        Material.BackProperties.Emission.Color = {0000803F0000003F000000000000803F}
+        Material.BackProperties.Specular.Color = {0000803F0000003F000000000000803F}
+        Material.FrontProperties.Ambient.Color = {0000803F0000003F000000000000803F}
+        Material.FrontProperties.Diffuse.Color = {0000803F0000003F000000000000803F}
+        Material.FrontProperties.Emission.Color = {0000803F0000003F000000000000803F}
+        Material.FrontProperties.Specular.Color = {0000803F0000003F000000000000803F}
+      end
+      item
+        Name = 'Dsh'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {8FC2353F6666263FB81E853E0000803F}
+        Material.BackProperties.Diffuse.Color = {8FC2353F6666263FB81E853E0000803F}
+        Material.BackProperties.Emission.Color = {8FC2353F6666263FB81E853E0000803F}
+        Material.BackProperties.Specular.Color = {8FC2353F6666263FB81E853E0000803F}
+        Material.FrontProperties.Emission.Color = {0AD7633FD7A3F03ECDCC4C3E0000803F}
+      end
+      item
+        Name = 'E'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {0000803F0000803F000000000000803F}
+        Material.BackProperties.Diffuse.Color = {0000803F0000803F000000000000803F}
+        Material.BackProperties.Emission.Color = {0000803F0000803F000000000000803F}
+        Material.BackProperties.Specular.Color = {0000803F0000803F000000000000803F}
+        Material.FrontProperties.Ambient.Color = {0000803F0000803F000000000000803F}
+        Material.FrontProperties.Diffuse.Color = {0000803F0000803F000000000000803F}
+        Material.FrontProperties.Emission.Color = {0000803F0000803F000000000000803F}
+        Material.FrontProperties.Specular.Color = {0000803F0000803F000000000000803F}
+      end
+      item
+        Name = 'F'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {000000000000003F000000000000803F}
+        Material.BackProperties.Diffuse.Color = {000000000000003F000000000000803F}
+        Material.BackProperties.Emission.Color = {000000000000003F000000000000803F}
+        Material.BackProperties.Specular.Color = {000000000000003F000000000000803F}
+        Material.FrontProperties.Ambient.Color = {000000000000003F000000000000803F}
+        Material.FrontProperties.Diffuse.Color = {000000000000003F000000000000803F}
+        Material.FrontProperties.Emission.Color = {000000000000003F000000000000803F}
+        Material.FrontProperties.Specular.Color = {000000000000003F000000000000803F}
+      end
+      item
+        Name = 'Fsh'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {000000000000003F0000003F0000803F}
+        Material.BackProperties.Diffuse.Color = {000000000000003F0000003F0000803F}
+        Material.BackProperties.Emission.Color = {000000000000003F0000003F0000803F}
+        Material.BackProperties.Specular.Color = {000000000000003F0000003F0000803F}
+        Material.FrontProperties.Emission.Color = {0AD7A33E48E1FA3E1F85EB3E0000803F}
+      end
+      item
+        Name = 'G'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.BackProperties.Diffuse.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.BackProperties.Emission.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.BackProperties.Specular.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.FrontProperties.Ambient.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.FrontProperties.Diffuse.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.FrontProperties.Emission.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+        Material.FrontProperties.Specular.Color = {ACC8483E9A99193FCDCC4C3F0000803F}
+      end
+      item
+        Name = 'Gsh'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {938C0C3EDCD6D63E938E0E3F0000803F}
+        Material.BackProperties.Diffuse.Color = {938C0C3EDCD6D63E938E0E3F0000803F}
+        Material.BackProperties.Emission.Color = {938C0C3EDCD6D63E938E0E3F0000803F}
+        Material.BackProperties.Specular.Color = {938C0C3EDCD6D63E938E0E3F0000803F}
+        Material.FrontProperties.Emission.Color = {AE47613ED7A3303F52B85E3F0000803F}
+      end
+      item
+        Name = 'A'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {00000000000000000000803F0000803F}
+        Material.BackProperties.Diffuse.Color = {00000000000000000000803F0000803F}
+        Material.BackProperties.Emission.Color = {00000000000000000000803F0000803F}
+        Material.BackProperties.Specular.Color = {00000000000000000000803F0000803F}
+        Material.FrontProperties.Diffuse.Color = {00000000000000000000803F0000803F}
+        Material.FrontProperties.Emission.Color = {00000000000000000000803F0000803F}
+        Material.FrontProperties.Specular.Color = {00000000000000000000803F0000803F}
+      end
+      item
+        Name = 'Ash'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {938C0C3E938C0C3E938E0E3F0000803F}
+        Material.BackProperties.Diffuse.Color = {938C0C3E938C0C3E938E0E3F0000803F}
+        Material.BackProperties.Emission.Color = {938C0C3E938C0C3E938E0E3F0000803F}
+        Material.BackProperties.Specular.Color = {938C0C3E938C0C3E938E0E3F0000803F}
+        Material.FrontProperties.Emission.Color = {9A99993E9A99993E0000803F0000803F}
+      end
+      item
+        Name = 'B'
+        Tag = 0
+        Material.BackProperties.Ambient.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.BackProperties.Diffuse.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.BackProperties.Emission.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.BackProperties.Specular.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.FrontProperties.Ambient.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.FrontProperties.Diffuse.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.FrontProperties.Emission.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+        Material.FrontProperties.Specular.Color = {A19E9E3ECFBC3C3EA19E9E3E0000803F}
+      end>
+    Left = 165
+    Top = 183
+  end
+end

+ 425 - 0
Examples/Demos/sprites/fountainparticles/fFountainD.pas

@@ -0,0 +1,425 @@
+unit fFountainD;
+
+interface
+
+uses
+  Winapi.Windows,
+  Winapi.Messages,
+  System.SysUtils,
+  System.Variants,
+  System.Classes,
+  System.Math,
+  Vcl.Graphics,
+  Vcl.Controls,
+  Vcl.Forms,
+  Vcl.Dialogs,
+  Vcl.StdCtrls,
+  Vcl.Imaging.Jpeg,
+  Vcl.ExtCtrls,
+  Vcl.Menus,
+  Vcl.ExtDlgs,
+  Vcl.ComCtrls,
+
+  GLS.VectorTypes,
+  GLS.Texture,
+  GLS.Cadencer,
+  GLS.SceneViewer,
+  GLS.Scene,
+  GLS.Objects,
+  GLS.VectorGeometry,
+  GLS.GeomObjects,
+  GLS.Coordinates,
+  GLS.BaseClasses,
+
+
+  uFountainD, GLS.Material;
+
+type
+  TForm1 = class( TForm )
+    GLScene1: TGLScene;
+    GLSceneViewer1: TGLSceneViewer;
+    GLCadencer1: TGLCadencer;
+    Cam: TGLCamera;
+    Scene: TGLDummyCube;
+    Light: TGLLightSource;
+    Timer1: TTimer;
+    Panel1: TPanel;
+    ColorDialog1: TColorDialog;
+    Panel2: TPanel;
+    Label1: TLabel;
+    PStartColor: TPanel;
+    Label2: TLabel;
+    PEndColor: TPanel;
+    PBackColor: TPanel;
+    Label3: TLabel;
+    MainMenu1: TMainMenu;
+    File1: TMenuItem;
+    PageControl1: TPageControl;
+    TabSheet1: TTabSheet;
+    EdPSizeMax: TEdit;
+    Label14: TLabel;
+    EdPSizeMin: TEdit;
+    Label13: TLabel;
+    EdTimesFact: TEdit;
+    Label12: TLabel;
+    EdLifeFact: TEdit;
+    Label11: TLabel;
+    EdAngleStart: TEdit;
+    Label10: TLabel;
+    EdVelMax: TEdit;
+    Label9: TLabel;
+    EdVelMin: TEdit;
+    Label8: TLabel;
+    EdMaxP: TEdit;
+    Label7: TLabel;
+    EdFloor: TEdit;
+    Label6: TLabel;
+    EdBound: TEdit;
+    EdMass: TEdit;
+    Label5: TLabel;
+    Label4: TLabel;
+    CheckActived: TCheckBox;
+    CheckBound: TCheckBox;
+    Close1: TMenuItem;
+    TabSheet2: TTabSheet;
+    Panel3: TPanel;
+    RadioButton1: TRadioButton;
+    RadioButton2: TRadioButton;
+    RadioButton3: TRadioButton;
+    GLPlane1: TGLPlane;
+    GLTorus1: TGLTorus;
+    TrackBar1: TTrackBar;
+    Label15: TLabel;
+    OpenPictureDialog1: TOpenPictureDialog;
+    Texture1: TMenuItem;
+    StatusBar1: TStatusBar;
+    GLMatlibColors: TGLMaterialLibrary;
+    procedure FormCreate( Sender: TObject );
+    procedure GLCadencer1Progress( Sender: TObject; const deltaTime, newTime: Double );
+    procedure GLSceneViewer1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
+    procedure GLSceneViewer1MouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
+    procedure Timer1Timer( Sender: TObject );
+    procedure FormMouseWheel( Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean );
+    procedure PStartColorClick(Sender: TObject);
+    procedure PEndColorClick(Sender: TObject);
+    procedure CheckActivedClick(Sender: TObject);
+    procedure PBackColorClick(Sender: TObject);
+    procedure CheckBoundClick(Sender: TObject);
+    procedure EdMassChange(Sender: TObject);
+    procedure EdBoundChange(Sender: TObject);
+    procedure EdFloorChange(Sender: TObject);
+    procedure EdMaxPChange(Sender: TObject);
+    procedure EdVelMinChange(Sender: TObject);
+    procedure EdVelMaxChange(Sender: TObject);
+    procedure EdAngleStartChange(Sender: TObject);
+    procedure EdLifeFactChange(Sender: TObject);
+    procedure EdTimesFactChange(Sender: TObject);
+    procedure EdPSizeMinChange(Sender: TObject);
+    procedure EdPSizeMaxChange(Sender: TObject);
+    procedure Close1Click(Sender: TObject);
+    procedure RadioButtonClick(Sender: TObject);
+    procedure TrackBar1Change(Sender: TObject);
+    procedure Texture1Click(Sender: TObject);
+  private
+    my, mx : integer;
+    path : string;
+  public
+     
+  end;
+
+var
+  GLFountainDummy : TGLFountainDummy;
+
+var
+  Form1: TForm1;
+
+implementation
+
+{$R *.dfm}
+
+procedure TForm1.FormCreate( Sender: TObject );
+begin
+  SetCurrentDir( ExtractFilePath( ParamStr(0) ) );
+  path := ExtractFilePath( ParamStr(0) );
+
+
+  OpenPictureDialog1.InitialDir := path + 'Textures\';
+
+//  GLPlane1.Material.Texture.Disabled := False;
+
+  GLFountainDummy := TGLFountainDummy(Scene.AddNewChild(TGLFountainDummy));
+  with GLFountainDummy do
+  begin
+    Material.Texture.Image.LoadFromFile( path + 'Textures\Par1.bmp' );
+    Scale.X := 0.15; Scale.Y := 0.15; Scale.Z := 0.15;
+    Direction.X := 0; Direction.Y := 1; Direction.Z := 0;
+    Up.X := 0; Up.Y := 0; Up.Z := 1;
+    Position.Z := -3;
+    Actived := True;
+    Bounding := False;
+    ParticleMass := 5.0;
+    BoundingFactor := 100.0;
+    Floor := 0.0;
+    MaxParticles := 60;
+    VelocityMin := 5;
+    VelocityMax := 15;
+    AngleInit := 360;
+    LifeFactor := 0.025;
+    TimesFactor := 0.00005;
+    ParticlesSizeMin := 110;
+    ParticlesSizeMax := 130;
+    ColorStart := PStartColor.Color;
+    ColorEnd := PEndColor.Color;
+  end;
+  TrackBar1.OnChange( self );
+
+   PStartColor.Color := clRed;
+end;
+
+procedure TForm1.GLCadencer1Progress( Sender: TObject; const deltaTime, newTime: Double );
+begin
+  GLSceneViewer1.Invalidate;
+end;
+
+procedure TForm1.GLSceneViewer1MouseDown( Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer );
+begin
+  my := y;
+  mx := x;
+end;
+
+procedure TForm1.GLSceneViewer1MouseMove( Sender: TObject; Shift: TShiftState; X, Y: Integer );
+begin
+  if ssright in shift then
+    Cam.MoveAroundTarget( my-y, mx-x );
+  my := y;
+  mx := x;
+end;
+
+procedure TForm1.Timer1Timer( Sender: TObject );
+begin
+  Caption:=Format('%.2f FPS Fountain Particles', [GLSceneViewer1.FramesPerSecond]);
+  GLSceneViewer1.ResetPerformanceMonitor;
+end;
+
+procedure TForm1.FormMouseWheel( Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean );
+begin
+  Cam.AdjustDistanceToTarget( Power( 1.1, WheelDelta / 120 ) );
+end;
+
+procedure TForm1.PStartColorClick(Sender: TObject);
+begin
+  if ColorDialog1.Execute then
+  begin
+    GLFountainDummy.ColorStart := ColorDialog1.Color;
+    PStartColor.Color := ColorDialog1.Color;
+  end;
+end;
+
+procedure TForm1.PEndColorClick(Sender: TObject);
+begin
+  if ColorDialog1.Execute then
+  begin
+    PEndColor.Color := ColorDialog1.Color;
+    GLFountainDummy.ColorEnd := ColorDialog1.Color;
+  end;
+end;
+
+procedure TForm1.PBackColorClick(Sender: TObject);
+begin
+  if ColorDialog1.Execute then
+  begin
+    PBackColor.Color := ColorDialog1.Color;
+    GLSceneViewer1.Buffer.BackgroundColor := ColorDialog1.Color;
+  end;
+end;
+
+//------------------------------------------------
+// Activate
+//------------------------------------------------
+procedure TForm1.CheckActivedClick(Sender: TObject);
+begin
+  if CheckActived.Checked then
+    GLFountainDummy.Actived := True else
+    GLFountainDummy.Actived := False;
+end;
+
+procedure TForm1.CheckBoundClick(Sender: TObject);
+begin
+  if CheckBound.Checked then
+    GLFountainDummy.Bounding := True else
+    GLFountainDummy.Bounding := False;
+end;
+
+procedure TForm1.EdMassChange(Sender: TObject);
+begin
+  GLFountainDummy.ParticleMass := StrToFloat( EdMass.Text );
+end;
+
+procedure TForm1.EdBoundChange(Sender: TObject);
+begin
+  GLFountainDummy.BoundingFactor := StrToFloat( EdBound.Text );
+end;
+
+procedure TForm1.EdFloorChange(Sender: TObject);
+begin
+  GLFountainDummy.Floor := StrToFloat( EdFloor.Text );
+end;
+
+procedure TForm1.EdMaxPChange(Sender: TObject);
+begin
+  GLFountainDummy.MaxParticles := StrToInt( EdMaxP.Text );
+end;
+
+procedure TForm1.EdVelMinChange(Sender: TObject);
+begin
+  GLFountainDummy.VelocityMin := StrToInt( EdVelMin.Text );
+end;
+
+procedure TForm1.EdVelMaxChange(Sender: TObject);
+begin
+  GLFountainDummy.VelocityMax := StrToInt( EdVelMax.Text );
+end;
+
+procedure TForm1.EdAngleStartChange(Sender: TObject);
+begin
+  GLFountainDummy.AngleInit := StrToInt( EdAngleStart.Text );
+end;
+
+procedure TForm1.EdLifeFactChange(Sender: TObject);
+begin
+  GLFountainDummy.LifeFactor := StrToFloat( EdLifeFact.Text );
+end;
+
+procedure TForm1.EdTimesFactChange(Sender: TObject);
+begin
+  GLFountainDummy.TimesFactor := StrToFloat( EdTimesFact.Text );
+end;
+
+procedure TForm1.EdPSizeMinChange(Sender: TObject);
+begin
+  GLFountainDummy.ParticlesSizeMin := StrToInt( EdPSizeMin.Text );
+end;
+
+procedure TForm1.EdPSizeMaxChange(Sender: TObject);
+begin
+  GLFountainDummy.ParticlesSizeMax := StrToInt( EdPSizeMax.Text );
+end;
+
+procedure TForm1.TrackBar1Change(Sender: TObject);
+begin
+  with GLFountainDummy do
+  begin
+    Scale.X := TrackBar1.Position / 10;
+    Scale.Y := TrackBar1.Position / 10;
+    Scale.Z := TrackBar1.Position / 10;
+  end;
+end;
+
+procedure TForm1.Texture1Click(Sender: TObject);
+begin
+  if OpenPictureDialog1.Execute then
+  begin
+    if ( OpenPictureDialog1.FileName <> '' ) then
+    begin
+      GLFountainDummy.Material.Texture.Image.LoadFromFile( OpenPictureDialog1.FileName );
+    end;
+  end;
+  SetCurrentDir( ExtractFilePath( ParamStr(0) ) );
+end;
+
+//---------------------------------------------------
+// Particle Styles
+//---------------------------------------------------
+procedure TForm1.RadioButtonClick(Sender: TObject);
+var
+  val: integer;
+begin
+  val := 0;
+  if RadioButton1.Checked then
+    val := 0 else
+  if RadioButton2.Checked then
+    val := 1 else
+  if RadioButton3.Checked then
+    val := 2;
+  case val of
+    0: begin
+         with GLFountainDummy do
+         begin
+           Material.Texture.Image.LoadFromFile( path + 'Textures\Par1.bmp' );
+           Position.Z := -3;
+           Actived := True;
+           Bounding := False;
+           ParticleMass := 5.0;
+           BoundingFactor := 100.0;
+           Floor := 0.0;
+           MaxParticles := 60;
+           VelocityMin := 5;
+           VelocityMax := 15;
+           AngleInit := 360;
+           LifeFactor := 0.025;
+           TimesFactor := 0.00005;
+           ParticlesSizeMin := 110;
+           ParticlesSizeMax := 130;
+           PStartColor.Color := $0000FF;
+           ColorStart := PStartColor.Color;
+           PEndColor.Color := $00FFFF;
+           ColorEnd := PEndColor.Color;
+         end;
+       end;
+    1: begin
+         with GLFountainDummy do
+         begin
+           Material.Texture.Image.LoadFromFile( path + 'Textures\Par2.bmp' );
+           Position.Z := -3;
+           Actived := True;
+           Bounding := False;
+           ParticleMass := 1.0;
+           BoundingFactor := 100.0;
+           Floor := 0.0;
+           MaxParticles := 500;
+           VelocityMin := 20;
+           VelocityMax := 20;
+           AngleInit := 360;
+           LifeFactor := 0.003;
+           TimesFactor := 0.009;
+           ParticlesSizeMin := 30;
+           ParticlesSizeMax := 40;
+           PStartColor.Color := $FFFFFF;
+           ColorStart := PStartColor.Color;
+           PEndColor.Color := clFuchsia;
+           ColorEnd := PEndColor.Color;
+         end;
+       end;
+    2: begin
+         with GLFountainDummy do
+         begin
+           Material.Texture.Image.LoadFromFile( path + 'Textures\Par3.bmp' );
+           Position.Z := -3;
+           Actived := True;
+           Bounding := True;
+           ParticleMass := 10.0;
+           BoundingFactor := 75.0;
+           Floor := 0.0;
+           MaxParticles := 500;
+           VelocityMin := 19;
+           VelocityMax := 20;
+           AngleInit := 360;
+           LifeFactor := 0.005;
+           TimesFactor := 0.005;
+           ParticlesSizeMin := 10;
+           ParticlesSizeMax := 20;
+           PStartColor.Color := $00FF00;
+           ColorStart := PStartColor.Color;
+           PEndColor.Color := $00FF00;
+           ColorEnd := PEndColor.Color;
+         end;
+       end;
+     end;
+end;
+
+procedure TForm1.Close1Click(Sender: TObject);
+begin
+  Close;
+end;
+
+end.

+ 815 - 0
Examples/Demos/sprites/fountainparticles/uFountainD.pas

@@ -0,0 +1,815 @@
+unit uFountainD;
+
+interface
+
+uses
+  Winapi.Windows,
+  Winapi.Messages,
+  Winapi.OpenGL,
+  Winapi.OpenGLext,
+  System.SysUtils,
+  System.Variants,
+  System.Classes,
+  Vcl.Graphics,
+  Vcl.Controls,
+  Vcl.Forms,
+  Vcl.Dialogs,
+  Vcl.StdCtrls,
+  Vcl.ComCtrls,
+  Vcl.ExtCtrls,
+  Vcl.Imaging.Jpeg,
+
+  GLS.PersistentClasses,
+  GLS.Scene,
+  GLS.Objects,
+  GLS.VectorGeometry,
+  GLS.Texture,
+  GLS.VectorTypes,
+  GLS.RenderContextInfo;
+
+const
+  F_GRAVITY = 9.81;
+
+  // ---------------------------------------------------------------------
+  // TFctCondition
+  // ---------------------------------------------------------------------
+type
+  TFctCondition = function(const ptCondition: Pointer): Boolean;
+  TpNode = ^TNode;
+
+  TNode = record
+    Info: Pointer;
+    Next: TpNode;
+  end;
+
+const
+  SIZE_NODE = SizeOf(TNode);
+
+  // ---------------------------------------------------------------------
+  // TListSPTR
+  // ---------------------------------------------------------------------
+type
+  TListSPTR = class
+  private
+    Head: TpNode;
+    Final: TpNode;
+    Current: TpNode;
+    Count: Cardinal;
+    SizeInfo: Cardinal;
+  public
+    constructor Create(_SizeInfo: Cardinal);
+    destructor Destroy; override;
+    function Add(New: Pointer): Boolean;
+    function CurrentModify(Modification: Pointer): Boolean;
+    function DeleteIf(FctCondition: TFctCondition): integer;
+    function DeleteCurrent: Boolean;
+    procedure Clear;
+    function GetNbCount: Cardinal;
+    function GetCurrent(Information: Pointer): Boolean;
+    function GetFirst(Information: Pointer): Boolean;
+    function GetLast(Information: Pointer): Boolean;
+    function GetNext(Information: Pointer): Boolean;
+  end;
+
+  // ---------------------------------------------------------------------
+  // TParticle
+  // ---------------------------------------------------------------------
+type
+  pParticle = ^TParticle;
+
+  TParticle = record
+    Pos: TAffineVector;
+    Accel: TAffineVector;
+    Velocity: single;
+    Times: double;
+    Life: single;
+    AngleStart: single;
+    Bounding: integer;
+    Width: single;
+    Color: TAffineVector;
+    ColorDiff: TAffineVector;
+  end;
+
+const
+  SIZE_STR_PARTICLE = SizeOf(TParticle);
+
+  // ---------------------------------------------------------------------
+  // TGLFountainDummy
+  // ---------------------------------------------------------------------
+type
+  TGLFountainDummy = class(TGLImmaterialSceneObject)
+  protected
+    FActived: Boolean;
+    FNbParticles: integer;
+    FMaxParticles: integer;
+    FVelocityMax: integer;
+    FVelocityMin: integer;
+    FAngleStart: integer;
+    FFloor: single;
+    FFountainSize: single;
+    FParticlesSizeMax: integer;
+    FParticlesSizeMin: integer;
+    FBoundingFactor: single;
+    FParticleMass: single;
+    FTimesFactor: double;
+    FLifeFactor: single;
+    FBounding: Boolean;
+    FColorStart: longint;
+    FColorEnd: longint;
+    FNewTime: double;
+    FDeltaTime: double;
+    function GetActived: Boolean;
+    procedure SetActived(const Activ: Boolean);
+    function GetNbParticles: integer;
+    function GetMaxParticles: integer;
+    procedure SetMaxParticles(const Max: integer);
+    function GetVelocityMax: integer;
+    procedure SetVelocityMax(const VeloMax: integer);
+    function GetVelocityMin: integer;
+    procedure SetVelocityMin(const VeloMin: integer);
+    function GetAngleStart: integer;
+    procedure SetAngleStart(const AngleS: integer);
+    function GetFloor: single;
+    procedure SetFloor(const TheFloor: single);
+    function GetFountainSize: single;
+    procedure SetFountainSize(const FountainSize: single);
+    function GetParticlesSizeMax: integer;
+    procedure SetParticlesSizeMax(const PartMax: integer);
+    function GetParticlesSizeMin: integer;
+    procedure SetParticlesSizeMin(const PartMin: integer);
+    function GetBoundingFact: single;
+    procedure SetBoundingFact(const BoundSize: single);
+    function GetParticlesMass: single;
+    procedure SetParticlesMass(const Mass: single);
+    function GetTimesFactor: double;
+    procedure SetTimesFactor(const TimesFact: double);
+    function GetLifeFactor: single;
+    procedure SetLifeFactor(const LifeFact: single);
+    function GetBounding: Boolean;
+    procedure SetBounding(const Bound: Boolean);
+    function GetColorStart: longint;
+    procedure SetColorStart(const ColStart: longint);
+    function GetColorEnd: longint;
+    procedure SetColorEnd(const ColEnd: longint);
+  private
+    LsParticles: TListSPTR;
+    TabCos, TabSin: array [0 .. 360] of double;
+    RD, GD, BD, RF, GF, BF: Byte;
+    procedure initFountain;
+    function AddParticle: Boolean;
+    procedure DeleteParticle;
+    procedure CalculBoundPosParticles;
+    procedure CalculPosParticles;
+    procedure DrawParticles(rci: TGLRenderContextInfo);
+    procedure Animation(rci: TGLRenderContextInfo);
+    procedure UpdateFountain;
+  public
+    procedure DoRender(var rci: TGLRenderContextInfo; renderSelf, renderChildren: Boolean);
+      override;
+    // procedure DoProgress( const progressTime : TGLProgressTimes ); override;
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  published
+    property Actived: Boolean read FActived write SetActived;
+    property NbParticles: integer read GetNbParticles;
+    property MaxParticles: integer read GetMaxParticles write SetMaxParticles;
+    property VelocityMax: integer read GetVelocityMax write SetVelocityMax;
+    property VelocityMin: integer read GetVelocityMin write SetVelocityMin;
+    property AngleInit: integer read GetAngleStart write SetAngleStart;
+    property Floor: single read GetFloor write SetFloor;
+    property ParticlesSizeMax: integer read GetParticlesSizeMax write SetParticlesSizeMax;
+    property ParticlesSizeMin: integer read GetParticlesSizeMin write SetParticlesSizeMin;
+    property BoundingFactor: single read GetBoundingFact write SetBoundingFact;
+    property ParticleMass: single read GetParticlesMass write SetParticlesMass;
+    property TimesFactor: double read GetTimesFactor write SetTimesFactor;
+    property LifeFactor: single read GetLifeFactor write SetLifeFactor;
+    property Bounding: Boolean read GetBounding write SetBounding;
+    property ColorStart: longint read GetColorStart write SetColorStart;
+    property ColorEnd: longint read GetColorEnd write SetColorEnd;
+  end;
+
+// ================================================================
+implementation
+// ================================================================
+
+// ---------------------------------------------------------------
+// TListSPTR
+// ---------------------------------------------------------------
+constructor TListSPTR.Create(_SizeInfo: Cardinal);
+begin
+  inherited Create;
+  Clear;
+  SizeInfo := _SizeInfo;
+end;
+
+destructor TListSPTR.Destroy;
+begin
+  inherited Destroy;
+  Clear;
+end;
+
+function TListSPTR.Add(New: Pointer): Boolean;
+var
+  p: TpNode;
+begin
+  GetMem(p, SIZE_NODE);
+  FillChar(p^, SIZE_NODE, 0);
+  Result := p <> Nil;
+  if (Result) then
+  begin
+    GetMem(p^.Info, SizeInfo);
+    FillChar(p^.Info^, SizeInfo, 0);
+    Result := (p^.Info <> nil);
+    if (Result) then
+    begin
+      p^.Next := Head;
+      Head := p;
+      Current := p;
+      Move(New^, p^.Info^, SizeInfo);
+      Inc(Count);
+    end;
+  end
+end;
+
+function TListSPTR.CurrentModify(Modification: Pointer): Boolean;
+begin
+  Result := (Current <> nil) and (Modification <> nil);
+  if Result then
+    Move(Modification^, Current^.Info^, SizeInfo);
+end;
+
+function TListSPTR.DeleteCurrent: Boolean;
+var
+  p: TpNode;
+  pContinue: TpNode;
+Begin
+  Result := (Current <> nil) and (Count > 0);
+  if Result then
+  begin
+    p := Current;
+    if (p = Head) then
+    begin
+      Head := p^.Next;
+      Current := Current^.Next;
+      FreeMem(p^.Info, SizeInfo);
+      FreeMem(p, SIZE_NODE);
+      Dec(Count);
+    end
+    else
+    begin
+      pContinue := Head;
+      while (pContinue <> nil) and (pContinue^.Next <> p) do
+        pContinue := pContinue^.Next;
+      if (pContinue <> nil) then
+      begin
+        pContinue^.Next := p^.Next;
+        Current := Current^.Next;
+        FreeMem(p^.Info, SizeInfo);
+        FreeMem(p, SIZE_NODE);
+        Dec(Count);
+      end;
+    end;
+  end;
+end;
+
+function TListSPTR.DeleteIf(FctCondition: TFctCondition): integer;
+var
+  p, GCurrent: TpNode;
+begin
+  Result := 0;
+  GCurrent := Current;
+  p := Head;
+  while (p <> nil) do
+  begin
+    if FctCondition(p^.Info) then
+    begin
+      Current := p;
+      DeleteCurrent;
+      p := Current;
+      Inc(Result);
+    end
+    else
+      p := p^.Next;
+  end;
+  Current := GCurrent;
+end;
+
+procedure TListSPTR.Clear;
+var
+  pAClean: TpNode;
+begin
+  if (Head <> nil) then
+  begin
+    while (Head <> nil) do
+    begin
+      pAClean := Head;
+      Head := pAClean^.Next;
+      FreeMem(pAClean^.Info, SizeInfo);
+      FreeMem(pAClean, SIZE_NODE);
+    end;
+  end;
+  Head := nil;
+  Final := nil;
+  Current := nil;
+  Count := 0;
+end;
+
+function TListSPTR.GetNbCount: Cardinal;
+begin
+  Result := Count;
+end;
+
+function TListSPTR.GetCurrent(Information: Pointer): Boolean;
+Begin
+  Result := (Head <> nil) and (Information <> nil) and (Current <> nil);
+  if Result then
+    Move(Current^.Info^, Information^, SizeInfo);
+end;
+
+function TListSPTR.GetFirst(Information: Pointer): Boolean;
+begin
+  Result := (Head <> nil) and (Information <> nil);
+  if Result then
+  begin
+    Move(Head^.Info^, Information^, SizeInfo);
+    Current := Head;
+  end;
+end;
+
+function TListSPTR.GetLast(Information: Pointer): Boolean;
+begin
+  Result := (Final <> nil) and (Information <> nil);
+  if Result then
+  begin
+    Move(Final^.Info^, Information^, SizeInfo);
+    Current := Final;
+  end;
+end;
+
+function TListSPTR.GetNext(Information: Pointer): Boolean;
+begin
+  Result := (Count > 0) and (Current^.Next <> nil) and (Information <> nil);
+  if Result then
+  begin
+    Move(Current^.Next^.Info^, Information^, SizeInfo);
+    Current := Current^.Next;
+  end;
+end;
+
+// -------------------------------------------------
+// TGLFountainDummy
+// -------------------------------------------------
+constructor TGLFountainDummy.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FNewTime := 0.0;
+  FDeltaTime := 0.0;
+  FActived := True;
+  FNbParticles := 0;
+  FMaxParticles := 500;
+  FVelocityMin := 14;
+  FVelocityMax := 15;
+  FAngleStart := 360;
+  FFloor := 0.0;
+  FFountainSize := 0.2;
+  FParticlesSizeMin := 20;
+  FParticlesSizeMax := 40;
+  FBoundingFactor := 55;
+  FParticleMass := 5.0;
+  FTimesFactor := 0.005;
+  FLifeFactor := 0.005;
+  FBounding := False;
+  SetColorStart($FF0000);
+  SetColorEnd($FF0000);
+  initFountain;
+end;
+
+procedure TGLFountainDummy.initFountain;
+var
+  i: integer;
+begin
+  for i := 0 to 360 do
+  begin
+    TabCos[i] := Cos(i);
+    TabSin[i] := Sin(i);
+  end;
+  Randomize;
+  LsParticles := TListSPTR.Create(SIZE_STR_PARTICLE);
+end;
+
+procedure TGLFountainDummy.UpdateFountain;
+begin
+  FNbParticles := 0;
+  if assigned(LsParticles) then
+    LsParticles.Free;
+  initFountain;
+  NotifyChange(self);
+end;
+
+function TGLFountainDummy.AddParticle: Boolean;
+var
+  PTime: TParticle;
+begin
+  Result := (FActived) and (NbParticles < FMaxParticles);
+  if Result then
+  begin
+    with PTime do
+    begin
+      Pos.X := 0.0;
+      Pos.Y := FFloor;
+      Pos.Z := 0.0;
+      AngleStart := Random(FAngleStart);
+      Velocity := (Random(FVelocityMax - FVelocityMin) + FVelocityMin) * 0.1;
+      Accel.X := TabCos[Round(AngleStart)] * Velocity * FFountainSize;
+      Accel.Y := 0.0;
+      Accel.Z := TabSin[Round(AngleStart)] * Velocity * FFountainSize;
+      Times := 0.0;
+      Life := 1.0;
+      if FBounding then
+        Bounding := 0
+      else
+        Bounding := 1;
+      Width := (Random(FParticlesSizeMax - FParticlesSizeMin) + FParticlesSizeMin) * 0.1;
+      Color := AffineVectorMake(RD Div 255, GD Div 255, BD Div 255);
+      ColorDiff := AffineVectorMake((RF - RD) / (1 / FLifeFactor) / 255,
+        (GF - GD) / (1 / FLifeFactor) / 255, (BF - BD) / (1 / FLifeFactor) / 255);
+    end;
+    Result := LsParticles.Add(@PTime);
+    if Result then
+      Inc(FNbParticles);
+  end;
+end;
+
+procedure TGLFountainDummy.DeleteParticle;
+  function LifeCheckParticle(const Particle: Pointer): Boolean;
+  begin
+    Result := (TParticle(Particle^).Bounding > 0) and (TParticle(Particle^).Life <= 0)
+  end;
+
+begin
+  if (FActived) then
+    FNbParticles := FNbParticles - LsParticles.DeleteIf(@LifeCheckParticle);
+end;
+
+procedure TGLFountainDummy.CalculBoundPosParticles;
+var
+  RoadParticle: TParticle;
+  BoundFactor: single;
+begin
+  if (FActived) then
+  begin
+    if LsParticles.GetFirst(@RoadParticle) then
+      repeat
+        with RoadParticle do
+        begin
+          if (Pos.Y < FFloor) then
+          begin
+            if (Life > 0) then
+            begin
+              Times := 0.0;
+              BoundFactor := (Velocity * FBoundingFactor * 0.01);
+              Velocity := Velocity - BoundFactor;
+              Pos.X := Pos.X + Accel.X - BoundFactor;
+              Pos.Z := Pos.Z + Accel.Z - BoundFactor;
+              Pos.Y := FFloor;
+              Inc(Bounding);
+            end
+          end
+          else
+          begin
+            if Bounding > 0 then
+              Life := Life - FLifeFactor;
+            Pos.X := Pos.X + Accel.X;
+            Pos.Y := (Pos.Y + Times + Velocity) - (F_GRAVITY + FParticleMass) * Sqr(Times);
+            Pos.Z := Pos.Z + Accel.Z;
+          end;
+          Color := VectorAdd(Color, ColorDiff);
+          Times := Times + FTimesFactor;
+        end;
+        LsParticles.CurrentModify(@RoadParticle);
+      until not LsParticles.GetNext(@RoadParticle);
+  end;
+end;
+
+procedure TGLFountainDummy.CalculPosParticles;
+var
+  RoadParticle: TParticle;
+begin
+  if (FActived) then
+  begin
+    if LsParticles.GetFirst(@RoadParticle) then
+      repeat
+        with RoadParticle do
+        begin
+          if (Pos.Y >= FFloor) then
+          begin
+            Life := Life - FLifeFactor;
+            Pos.X := Pos.X + Accel.X;
+            Pos.Y := (Pos.Y + Times + Velocity) - (F_GRAVITY + FParticleMass) * Sqr(Times);
+            Pos.Z := Pos.Z + Accel.Z;
+          end
+          else
+            Life := Life - FLifeFactor;
+          Color := VectorAdd(Color, ColorDiff);
+          Times := Times + FTimesFactor;
+        end;
+        LsParticles.CurrentModify(@RoadParticle);
+      Until Not LsParticles.GetNext(@RoadParticle);
+  end;
+end;
+
+procedure TGLFountainDummy.DrawParticles(rci: TGLRenderContextInfo);
+var
+  RoadParticle: TParticle;
+  GMatrix: array [0 .. 15] of GlFloat;
+  VRight, VUp: TVector3f;
+begin
+  if LsParticles.GetFirst(@RoadParticle) then
+    repeat
+      with RoadParticle do
+      begin
+        glGetFloatv(GL_MODELVIEW_MATRIX, @GMatrix);
+        VRight := AffineVectorMake(GMatrix[00], GMatrix[04], GMatrix[08]);
+        VUp := AffineVectorMake(GMatrix[01], GMatrix[05], GMatrix[09]);
+        NormalizeVector(VRight);
+        NormalizeVector(VUp);
+        ScaleVector(VRight, Width / 2);
+        ScaleVector(VUp, Width / 2);
+        glColor4f(Color.X, Color.Y, Color.Z, Life);
+        glbegin(GL_QUADS);
+        glTexCoord2f(0, 0);
+        glVertex3d(Pos.X - (VRight.X + VUp.X), Pos.Y - (VRight.Y + VUp.Y),
+          Pos.Z - (VRight.Z + VUp.Z));
+        glTexCoord2f(1, 0);
+        glVertex3d(Pos.X + (VRight.X - VUp.X), Pos.Y + (VRight.Y - VUp.Y),
+          Pos.Z + (VRight.Z - VUp.Z));
+        glTexCoord2f(1, 1);
+        glVertex3d(Pos.X + (VRight.X + VUp.X), Pos.Y + (VRight.Y + VUp.Y),
+          Pos.Z + (VRight.Z + VUp.Z));
+        glTexCoord2f(0, 1);
+        glVertex3d(Pos.X - (VRight.X - VUp.X), Pos.Y - (VRight.Y - VUp.Y),
+          Pos.Z - (VRight.Z - VUp.Z));
+        glend();
+      end;
+      LsParticles.CurrentModify(@RoadParticle);
+    Until Not LsParticles.GetNext(@RoadParticle);
+end;
+
+procedure TGLFountainDummy.Animation(rci: TGLRenderContextInfo);
+begin
+  AddParticle;
+  DeleteParticle;
+  if FBounding then
+    CalculBoundPosParticles
+  else
+    CalculPosParticles;
+  glPushMatrix;
+  glEnable(GL_TEXTURE_2D);
+  glBindTexture(GL_TEXTURE_2D, Material.Texture.Handle);
+  glDepthMask(0); // false
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+  glCullFace(GL_BACK);
+  glEnable(GL_CULL_FACE);
+  glDisable(GL_LIGHTING);
+  DrawParticles(rci);
+  glDisable(GL_TEXTURE_2D);
+  glDisable(GL_BLEND);
+  glDepthMask(1); // true
+  glEnable(GL_LIGHTING);
+  glDisable(GL_CULL_FACE);
+  glPopMatrix;
+end;
+
+function TGLFountainDummy.GetActived: Boolean;
+begin
+  Result := FActived;
+end;
+
+procedure TGLFountainDummy.SetActived(const Activ: Boolean);
+begin
+  FActived := Activ;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetNbParticles: integer;
+begin
+  Result := FNbParticles;
+end;
+
+function TGLFountainDummy.GetMaxParticles: integer;
+begin
+  Result := FMaxParticles;
+end;
+
+procedure TGLFountainDummy.SetMaxParticles(const Max: integer);
+begin
+  FMaxParticles := Max;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetVelocityMax: integer;
+begin
+  Result := FVelocityMax;
+end;
+
+procedure TGLFountainDummy.SetVelocityMax(const VeloMax: integer);
+begin
+  if (VeloMax > FVelocityMin) then
+    FVelocityMax := VeloMax
+  else
+    FVelocityMax := FVelocityMin + 1;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetVelocityMin: integer;
+begin
+  Result := FVelocityMin;
+end;
+
+procedure TGLFountainDummy.SetVelocityMin(const VeloMin: integer);
+begin
+  if (VeloMin < FVelocityMax) then
+    FVelocityMin := VeloMin
+  else
+    FVelocityMin := FVelocityMax - 1;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetAngleStart: integer;
+begin
+  Result := FVelocityMin;
+end;
+
+procedure TGLFountainDummy.SetAngleStart(const AngleS: integer);
+begin
+  if (AngleS >= 0) and (AngleS <= 360) then
+    FAngleStart := AngleS
+  else
+    FAngleStart := 360;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetFloor: single;
+begin
+  Result := FFloor;
+end;
+
+procedure TGLFountainDummy.SetFloor(const TheFloor: single);
+begin
+  FFloor := TheFloor;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetFountainSize: single;
+begin
+  Result := FFountainSize;
+end;
+
+procedure TGLFountainDummy.SetFountainSize(const FountainSize: single);
+begin
+  FFountainSize := FountainSize;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetParticlesSizeMax: integer;
+begin
+  Result := FParticlesSizeMax;
+end;
+
+procedure TGLFountainDummy.SetParticlesSizeMax(const PartMax: integer);
+begin
+  if (PartMax > FParticlesSizeMin) then
+    FParticlesSizeMax := PartMax
+  else
+    FParticlesSizeMax := FParticlesSizeMin + 1;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetParticlesSizeMin: integer;
+begin
+  Result := FParticlesSizeMin;
+end;
+
+procedure TGLFountainDummy.SetParticlesSizeMin(const PartMin: integer);
+begin
+  if (PartMin < FParticlesSizeMax) then
+    FParticlesSizeMin := PartMin
+  else
+    FParticlesSizeMin := FParticlesSizeMax - 1;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetBoundingFact: single;
+begin
+  Result := FBoundingFactor;
+end;
+
+procedure TGLFountainDummy.SetBoundingFact(const BoundSize: single);
+begin
+  if (BoundSize >= 0) and (BoundSize <= 100) then
+    FBoundingFactor := BoundSize
+  else
+    FBoundingFactor := 100;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetParticlesMass: single;
+begin
+  Result := FParticleMass;
+end;
+
+procedure TGLFountainDummy.SetParticlesMass(const Mass: single);
+begin
+  FParticleMass := Mass;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetTimesFactor: double;
+begin
+  Result := FTimesFactor;
+end;
+
+procedure TGLFountainDummy.SetTimesFactor(const TimesFact: double);
+begin
+  FTimesFactor := TimesFact;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetLifeFactor: single;
+begin
+  Result := FLifeFactor;
+end;
+
+procedure TGLFountainDummy.SetLifeFactor(const LifeFact: single);
+begin
+  if LifeFact > 0 then
+    FLifeFactor := LifeFact
+  else
+    FLifeFactor := 0.005;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetBounding: Boolean;
+begin
+  Result := FBounding;
+end;
+
+procedure TGLFountainDummy.SetBounding(const Bound: Boolean);
+begin
+  FBounding := Bound;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetColorStart: longint;
+begin
+  Result := FColorStart;
+end;
+
+procedure TGLFountainDummy.SetColorStart(const ColStart: longint);
+begin
+  FColorStart := ColStart;
+  RD := FColorStart;
+  GD := FColorStart Shr 8;
+  BD := FColorStart Shr 16;
+  UpdateFountain;
+end;
+
+function TGLFountainDummy.GetColorEnd: longint;
+begin
+  Result := FColorEnd;
+end;
+
+procedure TGLFountainDummy.SetColorEnd(const ColEnd: longint);
+begin
+  FColorEnd := ColEnd;
+  RF := FColorEnd;
+  GF := FColorEnd Shr 8;
+  BF := FColorEnd Shr 16;
+  UpdateFountain;
+end;
+
+procedure TGLFountainDummy.DoRender(var rci: TGLRenderContextInfo;
+  renderSelf, renderChildren: Boolean);
+begin
+  Animation(rci);
+  if renderChildren then
+    self.renderChildren(0, Count - 1, rci);
+end;
+
+destructor TGLFountainDummy.Destroy;
+begin
+  FNbParticles := 0;
+  LsParticles.Free;
+  DeleteChildren;
+  inherited Destroy;
+end;
+
+// -----------------------------------------------------------------------------
+initialization
+
+// ---------------------------------------------------------------------
+
+RegisterClass(TGLFountainDummy);
+
+end.

+ 15 - 3
Examples/Demos/sprites/sprites.groupproj

@@ -9,6 +9,9 @@
         <Projects Include="caterpillar\CaterpillarC.cbproj">
             <Dependencies/>
         </Projects>
+        <Projects Include="fountainparticles\FountainParticlesD.dproj">
+            <Dependencies/>
+        </Projects>
         <Projects Include="imposter\ImposterD.dproj">
             <Dependencies/>
         </Projects>
@@ -47,6 +50,15 @@
     <Target Name="CaterpillarC:Make">
         <MSBuild Projects="caterpillar\CaterpillarC.cbproj" Targets="Make"/>
     </Target>
+    <Target Name="FountainParticlesD">
+        <MSBuild Projects="fountainparticles\FountainParticlesD.dproj"/>
+    </Target>
+    <Target Name="FountainParticlesD:Clean">
+        <MSBuild Projects="fountainparticles\FountainParticlesD.dproj" Targets="Clean"/>
+    </Target>
+    <Target Name="FountainParticlesD:Make">
+        <MSBuild Projects="fountainparticles\FountainParticlesD.dproj" Targets="Make"/>
+    </Target>
     <Target Name="ImposterD">
         <MSBuild Projects="imposter\ImposterD.dproj"/>
     </Target>
@@ -84,13 +96,13 @@
         <MSBuild Projects="particles\ParticlesC.cbproj" Targets="Make"/>
     </Target>
     <Target Name="Build">
-        <CallTarget Targets="CaterpillarD;CaterpillarC;ImposterD;ImposterC;ParticlesD;ParticlesC"/>
+        <CallTarget Targets="CaterpillarD;CaterpillarC;FountainParticlesD;ImposterD;ImposterC;ParticlesD;ParticlesC"/>
     </Target>
     <Target Name="Clean">
-        <CallTarget Targets="CaterpillarD:Clean;CaterpillarC:Clean;ImposterD:Clean;ImposterC:Clean;ParticlesD:Clean;ParticlesC:Clean"/>
+        <CallTarget Targets="CaterpillarD:Clean;CaterpillarC:Clean;FountainParticlesD:Clean;ImposterD:Clean;ImposterC:Clean;ParticlesD:Clean;ParticlesC:Clean"/>
     </Target>
     <Target Name="Make">
-        <CallTarget Targets="CaterpillarD:Make;CaterpillarC:Make;ImposterD:Make;ImposterC:Make;ParticlesD:Make;ParticlesC:Make"/>
+        <CallTarget Targets="CaterpillarD:Make;CaterpillarC:Make;FountainParticlesD:Make;ImposterD:Make;ImposterC:Make;ParticlesD:Make;ParticlesC:Make"/>
     </Target>
     <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/>
 </Project>

+ 1 - 1
Examples/Demos/utilities/GLInfo/fGLInfosD.dfm

@@ -21950,7 +21950,7 @@ object MainForm: TMainForm
           65207769746820414349442050726F20372E3000000000000000000000000000
           0000000000000000000000000000000000000000000000000000000000000000
           0000000000000000000000000000000000000000000000000000000000000000
-          0000}
+          000000000000000000000000000000000000000000000000000000000000}
       end>
     Left = 320
     Top = 24

+ 15 - 3
Examples/Demos/utilities/utilities.groupproj

@@ -6,6 +6,9 @@
         <Projects Include="ArchiveEdit\ArchiveEditD.dproj">
             <Dependencies/>
         </Projects>
+        <Projects Include="GLInfo\GLInfosD.dproj">
+            <Dependencies/>
+        </Projects>
         <Projects Include="fontgen\FontgenD.dproj">
             <Dependencies/>
         </Projects>
@@ -53,6 +56,15 @@
     <Target Name="ArchiveEditD:Make">
         <MSBuild Projects="ArchiveEdit\ArchiveEditD.dproj" Targets="Make"/>
     </Target>
+    <Target Name="GLInfosD">
+        <MSBuild Projects="GLInfo\GLInfosD.dproj"/>
+    </Target>
+    <Target Name="GLInfosD:Clean">
+        <MSBuild Projects="GLInfo\GLInfosD.dproj" Targets="Clean"/>
+    </Target>
+    <Target Name="GLInfosD:Make">
+        <MSBuild Projects="GLInfo\GLInfosD.dproj" Targets="Make"/>
+    </Target>
     <Target Name="FontgenD">
         <MSBuild Projects="fontgen\FontgenD.dproj"/>
     </Target>
@@ -144,13 +156,13 @@
         <MSBuild Projects="ScreenSaver\ScreenSaverC.cbproj" Targets="Make"/>
     </Target>
     <Target Name="Build">
-        <CallTarget Targets="ArchiveEditD;FontgenD;FontgenC;HTFViewerD;JoystickD;KeymapD;LanguageD;RecorderD;TerrainPackD;ScreenSaverD;ScreenSaverC"/>
+        <CallTarget Targets="ArchiveEditD;GLInfosD;FontgenD;FontgenC;HTFViewerD;JoystickD;KeymapD;LanguageD;RecorderD;TerrainPackD;ScreenSaverD;ScreenSaverC"/>
     </Target>
     <Target Name="Clean">
-        <CallTarget Targets="ArchiveEditD:Clean;FontgenD:Clean;FontgenC:Clean;HTFViewerD:Clean;JoystickD:Clean;KeymapD:Clean;LanguageD:Clean;RecorderD:Clean;TerrainPackD:Clean;ScreenSaverD:Clean;ScreenSaverC:Clean"/>
+        <CallTarget Targets="ArchiveEditD:Clean;GLInfosD:Clean;FontgenD:Clean;FontgenC:Clean;HTFViewerD:Clean;JoystickD:Clean;KeymapD:Clean;LanguageD:Clean;RecorderD:Clean;TerrainPackD:Clean;ScreenSaverD:Clean;ScreenSaverC:Clean"/>
     </Target>
     <Target Name="Make">
-        <CallTarget Targets="ArchiveEditD:Make;FontgenD:Make;FontgenC:Make;HTFViewerD:Make;JoystickD:Make;KeymapD:Make;LanguageD:Make;RecorderD:Make;TerrainPackD:Make;ScreenSaverD:Make;ScreenSaverC:Make"/>
+        <CallTarget Targets="ArchiveEditD:Make;GLInfosD:Make;FontgenD:Make;FontgenC:Make;HTFViewerD:Make;JoystickD:Make;KeymapD:Make;LanguageD:Make;RecorderD:Make;TerrainPackD:Make;ScreenSaverD:Make;ScreenSaverC:Make"/>
     </Target>
     <Import Project="$(BDS)\Bin\CodeGear.Group.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')"/>
 </Project>