Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 9, 2018, 1:06:05 PM (6 years ago)
Author:
wiesep
Message:

Updated programs and adjusted Material to work with GLSL>150

File:
1 edited

Legend:

Unmodified
Added
Removed
  • data/branches/Shader_HS18/programs/Example/GLSL150/ParticleGS_GenerateGS.glsl

    r12083 r12091  
    22
    33//
    4 // Explanation of different particle types
    5 //
    6 #define PT_LAUNCHER 0 //Firework Launcher - launches a PT_SHELL every so many seconds
    7 #define PT_SHELL    1 //Unexploded shell - flies from the origin and explodes into many PT_EMBERXs
    8 #define PT_EMBER1   2 //basic particle - after it's emitted from the shell, it dies
    9 #define PT_EMBER2   3 //after it's emitted, it explodes again into many PT_EMBER1s
    10 #define PT_EMBER3   4 //just a differently colored ember1
     4// Explanation of different particle types.
     5//
     6// Firework Launcher - launches a PT_SHELL every so many seconds.
     7#define PT_LAUNCHER 0
     8// Unexploded shell - flies from the origin and explodes into many PT_EMBERX's.
     9#define PT_SHELL    1
     10// Basic particle - after it's emitted from the shell, it dies.
     11#define PT_EMBER1   2
     12// After it's emitted, it explodes again into many PT_EMBER1's.
     13#define PT_EMBER2   3
     14// Just a different colored ember1.
     15#define PT_EMBER3   4
    1116#define P_SHELLLIFE 3.0
    1217#define P_EMBER1LIFE 2.5
     
    1419#define P_EMBER3LIFE 2.0
    1520
    16 //These two were originally shader params, but they caused runtime errors
     21// These two were originally shader params, but they caused runtime errors.
    1722#define NUM_EMBER_1S 30
    1823#define NUM_EMBER_2S 15
    1924#define NUM_EMBER_3S 10
    20 //This one was originally a variant, but this also causes runtime errors
     25// This one was originally a variant, but also causes runtime errors.
    2126//#define MAX_EMBER_2S 15.0
    2227
     28layout(points) in;
     29layout(points, max_vertices = 60) out;
     30
    2331in block {
    24         vec4    Pos;
    25         float   Timer;
    26     float       Type;
    27         vec3    Vel;
     32    vec3 Pos;
     33    float Timer;
     34    float Type;
     35    vec3 Vel;
    2836} FireworkData[];
    2937
    30 layout(points) in;
    31 layout(points, max_vertices = 1) out;
    32 
    33 uniform sampler1D randomTex;
     38// out vec3 outputPos;
     39// out float outputTimer;
     40// out float outputType;
     41// out vec3 outputVel;
     42
     43// out vec3 gl_Position;
     44out vec3 oPos;
     45out float oUv0; // Timer
     46out float oUv1; // Type
     47out vec3 oUv2;  // Velocity
     48
     49uniform sampler1D randomTexture;
    3450uniform vec3 frameGravity;
    3551uniform float globalTime;
    3652uniform float elapsedTime;
    3753uniform float secondsPerFirework;
    38 out vec4 colour;
     54
    3955//
    4056// Generic particle motion handler
    4157//
    42 
    4358void GSGenericHandler( vec3 Pos, vec3 Vel, float Timer, float Type,
    44                                                 float elapsedTime,
    45                                                 vec3 frameGravity)
    46 {
    47     gl_Position.xyz = Pos + (Vel * elapsedTime);
     59                       float elapsedTime,
     60                       vec3 frameGravity)
     61{
    4862    Vel += frameGravity;
    4963    Timer -= elapsedTime;
    50         if (Pos.y > -100)
    51         {
    52                 EmitVertex();//Pos : POSITION, Vel : TEXCOORD2, Timer : TEXCOORD0, Type : TEXCOORD1);
    53         }
     64
     65    if (Pos.y > -100)
     66    {
     67        oPos = Pos + (Vel * elapsedTime);
     68        oUv0 = Timer;
     69        oUv1 = Type;
     70        oUv2 = Vel;
     71        EmitVertex();
     72    }
    5473}
    5574
     
    6685// Launcher type particle handler
    6786//
    68 void GSLauncherHandler( vec3 Pos, vec3 Vel, float Timer, float Type, 
    69                                                 float elapsedTime,
    70                                                 float globalTime,
    71                                                 sampler1D randomTex,
    72                                                 float secondsPerFirework)
    73 {
    74     if(Timer <= 0)
    75     {
    76         vec3 vRandom = normalize( RandomDir( Type, globalTime, randomTex) );
    77                 //Give it more of an up bias
    78         vRandom = normalize(vRandom + vec3(0,2.5,0));
    79                
    80                 //time to emit a new SHELL
    81         gl_Position.xyz = Pos + Vel*elapsedTime;
    82         vec3 outputVel = Vel + vRandom*35.0;
    83         float  outputTimer = P_SHELLLIFE + vRandom.y*0.5;
    84         float outputType = PT_SHELL;
    85         EmitVertex();//(outputPos : POSITION, outputVel : TEXCOORD2, outputTimer : TEXCOORD0, outputType : TEXCOORD1);
    86        
    87         //reset our timer
    88         Timer = secondsPerFirework + vRandom.x*0.4;
     87void GSLauncherHandler( vec3 Pos, vec3 Vel, float Timer, float Type,
     88                        float elapsedTime,
     89                        float globalTime,
     90                        sampler1D randomTex,
     91                        float secondsPerFirework)
     92{
     93    if (Timer <= 0)
     94    {
     95        vec3 vRandom = normalize(RandomDir(Type, globalTime, randomTex));
     96        // Give it more of an up bias.
     97        vRandom = normalize(vRandom + vec3(0, 2.5, 0));
     98
     99        // Time to emit a new SHELL.
     100        oPos = Pos + Vel * elapsedTime;
     101        oUv2 = Vel + vRandom * 35.0;
     102        oUv0 = P_SHELLLIFE + vRandom.y * 0.5;
     103        oUv1 = PT_SHELL;
     104        EmitVertex();
     105
     106        // Reset our timer.
     107        Timer = secondsPerFirework + vRandom.x * 0.4;
    89108    }
    90109    else
     
    92111        Timer -= elapsedTime;
    93112    }
    94    
    95     //emit ourselves to keep us alive
    96     EmitVertex();//( Pos : POSITION, Vel : TEXCOORD2, Timer : TEXCOORD0, Type : TEXCOORD1);
     113
     114    // Emit ourselves to keep us alive.
     115    oPos = Pos;
     116    oUv2 = Vel;
     117    oUv0 = Timer;
     118    oUv1 = Type;
     119    EmitVertex();
    97120}
    98121
    99122//
    100123// Shell type particle handler
    101 //     
     124//
    102125void GSShellHandler( vec3 Pos, vec3 Vel, float Timer, float Type,
    103                                         float elapsedTime,
    104                                         float globalTime,
    105                                         sampler1D randomTex,
    106                                         vec3 frameGravity)
    107 {
    108     if(Timer <= 0)
    109     {
    110         vec3 outputPos;
    111                 vec3 outputVel;
    112                 float outputTimer;
    113                 float outputType;
    114                
     126                     float elapsedTime,
     127                     float globalTime,
     128                     sampler1D randomTex,
     129                     vec3 frameGravity)
     130{
     131    if (Timer <= 0)
     132    {
    115133        vec3 vRandom = vec3(0,0,0);
    116        
    117         //time to emit a series of new Ember1s 
    118         for(int i=0; i<NUM_EMBER_1S; i++)
     134
     135        // Time to emit a series of new Ember1s.
     136        for (int i = 0; i < NUM_EMBER_1S; i++)
    119137        {
    120             vRandom = normalize( RandomDir( Type+i, globalTime, randomTex ) );
    121             gl_Position.xyz = Pos + Vel*elapsedTime;
    122             outputVel = Vel + vRandom*15.0;
    123             outputTimer = P_EMBER1LIFE;
    124             outputType = PT_EMBER1;
    125             EmitVertex();//(outputPos : POSITION, outputTimer : TEXCOORD0, outputType : TEXCOORD1, outputVel : TEXCOORD2);
    126         }
    127        
    128         //find out how many Ember2s to emit
    129                 //Not doing this because it causes a runtime error
    130                 //int numEmber2s = abs(vRandom.x)*MAX_EMBER_2S;
    131         for(int i=0; i<NUM_EMBER_2S; i++)
    132         {
    133             vRandom = normalize( RandomDir( Type, globalTime, randomTex) );
    134             gl_Position.xyz = Pos + Vel*elapsedTime;
    135             outputVel = Vel + vRandom*10.0;
    136             outputTimer = P_EMBER2LIFE + 0.4*vRandom.x;
    137             outputType = PT_EMBER2;
    138             EmitVertex();//(outputPos : POSITION, outputVel : TEXCOORD2, outputTimer : TEXCOORD0, outputType : TEXCOORD1);
    139         }
    140        
    141     }
    142     else
    143     {
    144         GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity );
    145     }
    146 }
    147 
    148 //
    149 // Ember1 and Ember3 type particle handler
    150 //
    151 void GSEmber1Handler( vec3 Pos, vec3 Vel, float Timer, float Type,
    152                                                 float elapsedTime,
    153                                                 vec3 frameGravity)
    154 {
    155     if(Timer > 0)
    156     {
    157         GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity );
    158     }
    159 }
    160 
    161 //
    162 // Ember2 type particle handler
    163 //
    164 void GSEmber2Handler( vec3 Pos, vec3 Vel, float Timer, float Type,
    165                                                 float elapsedTime,
    166                                                 float globalTime,
    167                                                 sampler1D randomTex,
    168                                                 vec3 frameGravity)
    169 {
    170     if(Timer <= 0)
    171     {
    172                 vec3 outputPos;
    173                 vec3 outputVel;
    174                 float outputTimer;
    175                 float outputType;
    176    
    177         //time to emit a series of new Ember3s 
    178         for(int i=0; i<NUM_EMBER_3S; i++)
    179         {
    180             gl_Position.xyz = Pos + Vel*elapsedTime;
    181             outputVel = Vel + normalize( RandomDir( Type + i, globalTime, randomTex ) )*10.0;
    182             outputTimer = P_EMBER3LIFE;
    183             outputType = PT_EMBER3;
     138            vRandom = normalize(RandomDir(Type + i, globalTime, randomTex));
     139            oPos = Pos + Vel * elapsedTime;
     140            oUv2 = Vel + vRandom * 15.0;
     141            oUv0 = P_EMBER1LIFE;
     142            oUv1 = PT_EMBER1;
    184143            EmitVertex();
    185144        }
     145
     146        // Find out how many Ember2s to emit.
     147        // Not doing this because it causes a runtime error.
     148        //int numEmber2s = abs(vRandom.x)*MAX_EMBER_2S;
     149        for (int i = 0; i < NUM_EMBER_2S; i++)
     150        {
     151            vRandom = normalize(RandomDir(Type, globalTime, randomTex));
     152            oPos = Pos + Vel * elapsedTime;
     153            oUv2 = Vel + vRandom * 10.0;
     154            oUv0 = P_EMBER2LIFE + 0.4 * vRandom.x;
     155            oUv1 = PT_EMBER2;
     156            EmitVertex();
     157        }
     158
    186159    }
    187160    else
    188161    {
    189          GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity );
     162        GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity);
     163    }
     164}
     165
     166//
     167// Ember1 and Ember3 type particle handler.
     168//
     169void GSEmber1Handler( vec3 Pos, vec3 Vel, float Timer, float Type,
     170                      float elapsedTime,
     171                      vec3 frameGravity)
     172{
     173    if (Timer > 0)
     174    {
     175        GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity);
     176    }
     177}
     178
     179//
     180// Ember2 type particle handler.
     181//
     182void GSEmber2Handler( vec3 Pos, vec3 Vel, float Timer, float Type,
     183                      float elapsedTime,
     184                      float globalTime,
     185                      sampler1D randomTex,
     186                      vec3 frameGravity)
     187{
     188    if (Timer <= 0)
     189    {
     190        // Time to emit a series of new Ember3's.
     191        for (int i = 0; i < NUM_EMBER_3S; i++)
     192        {
     193            oPos = Pos + Vel * elapsedTime;
     194            oUv2 = Vel + normalize(RandomDir(Type + i, globalTime, randomTex)) * 10.0;
     195            oUv0 = P_EMBER3LIFE;
     196            oUv1 = PT_EMBER3;
     197            EmitVertex();
     198        }
     199    }
     200    else
     201    {
     202        GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity);
    190203    }
    191204}
     
    193206void main()
    194207{
    195         if( FireworkData[0].Type == PT_LAUNCHER )
    196         GSLauncherHandler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
    197                                                         elapsedTime, globalTime, randomTex, secondsPerFirework);
    198         else if ( FireworkData[0].Type == PT_SHELL )
    199         GSShellHandler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
    200                                                         elapsedTime, globalTime, randomTex, frameGravity);
    201         else if ( FireworkData[0].Type == PT_EMBER1 ||
    202               FireworkData[0].Type == PT_EMBER3 )
    203         GSEmber1Handler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
    204                                                         elapsedTime, frameGravity);
    205     else if( FireworkData[0].Type == PT_EMBER2 )
    206         GSEmber2Handler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
    207                                                         elapsedTime, globalTime, randomTex, frameGravity);
    208     colour = vec4(1.0,1.0,0.0,1.0);
    209         EndPrimitive();
    210 }
     208    if (FireworkData[0].Type == PT_LAUNCHER)
     209        GSLauncherHandler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
     210                           elapsedTime, globalTime, randomTexture, secondsPerFirework);
     211    else if (FireworkData[0].Type == PT_SHELL)
     212        GSShellHandler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
     213                        elapsedTime, globalTime, randomTexture, frameGravity);
     214    else if (FireworkData[0].Type == PT_EMBER1 ||
     215             FireworkData[0].Type == PT_EMBER3)
     216        GSEmber1Handler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
     217                         elapsedTime, frameGravity);
     218    else if (FireworkData[0].Type == PT_EMBER2)
     219        GSEmber2Handler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type,
     220                         elapsedTime, globalTime, randomTexture, frameGravity);
     221    EndPrimitive();
     222
     223    // // gl_Position.xyz = FireworkData[0].Pos;// + FireworkData[0].Vel * elapsedTime;
     224    // // gl_Position.w = 1;
     225    // gl_Position = FireworkData[0].Pos + 1;// + FireworkData[0].Vel * elapsedTime;
     226    // // gl_Position = Pos[0];// + FireworkData[0].Vel * elapsedTime;
     227    // //gl_Position = vec4(10, 10, 10, 1);
     228    // // oUv0 = P_SHELLLIFE + 0.5;
     229    // oUv0 = FireworkData[0].Timer;
     230    // // oUv0 = Timer[0];
     231    // oUv1 = FireworkData[0].Type;
     232    // // oUv1 = Type[0];
     233    // oUv2 = FireworkData[0].Vel;
     234    // // oUv2 = Vel[0];
     235    // //oUv2 = vec3(4, 5, 35.0);
     236    // EmitVertex();
     237    // EndPrimitive();
     238    // // // gl_Position = vec4(10, 20, 30, 1);
     239    // gl_Position = vec3(10, 20, 30);
     240    // oUv0 = P_EMBER3LIFE;
     241    // oUv1 = PT_SHELL;
     242    // oUv2 = vec3(40, 50, 60);
     243    // EmitVertex();
     244    // EndPrimitive();
     245}
Note: See TracChangeset for help on using the changeset viewer.