source: GTP/trunk/App/Demos/Illum/Shark3D/version164x12u/IllumDemo/bin/res/levelutil/shader/prog/d3d9_hlsl/partic_d3d9_hlsl_vs2x0.s3d_shadercode_run @ 2196

Revision 2196, 6.1 KB checked in by szirmay, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14#include \
15    <levelutil/shader/prog/d3d9_hlsl/include_stddef_d3d9_hlsl.s3d_shadercode_run>
16
17///////////////////////////////////////////////////////////////////////////////
18
19struct VS_INPUT
20{
21    float4 posObj: POSITION;
22    float3 normalObj: NORMAL;
23    S3D_BONE_DECL_STD(boneWgh, boneSubscr)
24    float4 diffuse: COLOR0;
25    float2 mainTexCoord: TEXCOORD0;
26};
27
28struct VS_OUTPUT
29{
30    float4 posScr: POSITION;
31    float2 mainTexCoord: TEXCOORD0;
32    float4 diffuse: COLOR0;
33    float4 specular: COLOR1;
34    float fogCoord: TEXCOORD2;
35};
36
37///////////////////////////////////////////////////////////////////////////////
38
39const float4x4 projMat;
40
41S3D_MATBONE_DECL_STD(matBone)
42
43const float4 mtrlPower;
44const float4 mtrlEmissive;
45
46#ifdef S3D_LIGHT_CNT
47const s3d_StdProgLight lightArray[S3D_LIGHT_CNT];
48const int activeLights;
49#endif
50
51float4 anim;        // Animation time between 0 and 1
52float4 colorAlpha;  // Color and alpha factor
53float4 param;       // x=Particle radius, y=Move-along-normal-factor
54float4 moveLin;     // Linear movement vector
55float4 moveQuadr;   // Quadratic movement vector
56float4 moveVari;    // Variation amount, see below
57float4 moveJiggle;  // Jiggle amount vector, see below.
58float4 shrink;      // x=fadeIn, y=fadeOut, z=flickerAmp, w=flickerVel
59float4 other;       // x=asyncFactor, y=repeat, z=jiggleVel, w=unused
60
61///////////////////////////////////////////////////////////////////////////////
62// Seed values:
63
64float4 seedVariX = float4(8576, 6968, 8285, 1375);
65float4 seedVariY = float4(9257, 7911, 4491, 4178);
66float4 seedVariZ = float4(9621, 7416, 9166, 1405);
67float4 seedJiggleX = float4(9809, 4760, 6104, 3046);
68float4 seedJiggleY = float4(7590, 5729, 8471, 1556);
69float4 seedJiggleZ = float4(9904, 0636, 4127, 5254);
70float4 seedAnim = float4(8891, 1068, 3747, 5529);
71float4 seedRotU = float4(3147, 0722, 3324, 7158);
72float4 seedRotV = float4(7020, 4337, 7956, 1530);
73
74///////////////////////////////////////////////////////////////////////////////
75// Utility functions:
76
77float quickSin(float phase)
78{
79    float rel = frac(phase) - 0.5;
80    float val = - 16 * rel * (0.5 - abs(rel));
81    return val;
82}
83
84///////////////////////////////////////////////////////////////////////////////
85// Vertexshader
86// Profile: 2x0
87
88VS_OUTPUT main(VS_INPUT input)
89{
90    VS_OUTPUT output = (VS_OUTPUT)0;
91   
92    float animRandom =  dot(input.posObj, seedAnim);
93    float anim = frac(other.x * animRandom + other.y * anim.x);
94   
95    // The movement direction is varied by a pseudo-random value.
96    float3 variRandom;
97    variRandom.x = dot(input.posObj, seedVariX);
98    variRandom.y = dot(input.posObj, seedVariY);
99    variRandom.z = dot(input.posObj, seedVariZ);
100    float3 variUnit = (2 * frac(variRandom) - 1);
101    float3 variDelta = variUnit * moveVari.xyz;
102
103    // The particles jiggle in direction of a pseudo-random value.
104    float3 jiggleRandom;
105    jiggleRandom.x = dot(input.posObj, seedJiggleX);
106    jiggleRandom.y = dot(input.posObj, seedJiggleY);
107    jiggleRandom.z = dot(input.posObj, seedJiggleZ);
108    float3 jiggleUnit = (2 * frac(jiggleRandom) - 1);
109    float3 jiggleDelta = jiggleUnit * moveJiggle * quickSin(anim * other.z);
110   
111    // Move particle in object coordinates:
112    float3 moveTot = moveLin.xyz;           // Move into constant direction
113    moveTot += input.normalObj * param.y;   // Move along normal vector
114    moveTot += anim * moveQuadr.xyz;        // Move along a quadratic curve
115    moveTot += variDelta;                   // Move into a random direction
116    float4 posObj = input.posObj;
117    posObj.xyz += anim * moveTot;           // Add move
118    posObj.xyz += jiggleDelta;              // Jitter
119
120    // Transformation from object into view coordinates:
121    float4x4 matBoneFinal;
122    S3D_BONE_TRANSF_STD(
123            matBoneFinal, matBone, input.boneWgh, input.boneSubscr);
124    // Transform vectors by matBoneFinal
125    float4 posView = mul(posObj, matBoneFinal);
126   
127    // Calculate effective particle radius.
128    // This includes fading in, fading out and flickering.
129    float fadeIn = anim * shrink.x;
130    float fadeOut = (1 - anim) * shrink.y;
131    float fade = min(1, min(fadeIn, fadeOut));
132    float flicker = 1 - shrink.z * quickSin(anim * shrink.w);
133    float radius = param.x * flicker * fade;
134   
135    // Until now we only have the particle center.
136    // Now we alculate the corner coordinates.
137    // The particle is rotated by a pseudo-random angle:
138    float2 rotRandom;
139    rotRandom.x = dot(input.posObj, seedRotU);
140    rotRandom.y = dot(input.posObj, seedRotV);
141    float2 rotDir = normalize(frac(rotRandom) - float2(0.5, 0.5));
142    float2 rotU = radius * 1.4142 * rotDir;
143    float2 rotV = float2(- rotU.y, rotU.x);
144    float2 coord = (input.mainTexCoord.xy - float2(0.5, 0.5));
145    posView.xy += rotU * coord.x + rotV * coord.y;
146
147    // Projection:
148    output.posScr = mul(posView, projMat);
149    output.mainTexCoord = input.mainTexCoord;
150    output.fogCoord = posView.z / posView.w;
151
152    // Calculate vertex color:
153#ifdef S3D_LIGHT_CNT
154    float4 colDiffuse = mtrlEmissive;
155    float4 colSpecular = 0;
156    for(int i = 0; i < activeLights; i++)
157    {
158        s3d_ColPair lightCol = s3d_calcPointLightTerm(
159                posView.xyz, 0, mtrlPower.w, lightArray[i]);
160        colDiffuse.rgb += lightCol.diffuse.rgb;
161        colSpecular.rgb += lightCol.specular.rgb;
162    }
163    output.diffuse = colDiffuse * colorAlpha * input.diffuse;
164    output.specular = colSpecular;
165#else
166    output.diffuse = colorAlpha * input.diffuse;
167    output.specular = 0;
168#endif
169
170    return output;
171}
172
173///////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.