home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 April / Gamestar_72_2005-04_dvd.iso / Dema / Liquidator / Liquidator.tma / data / renderer / sfx.fx < prev    next >
Text File  |  2004-12-10  |  20KB  |  523 lines

  1. #ifndef __SFX_FX__
  2. #define __SFX_FX__
  3.  
  4. #define MESHARRAY_FADE_RANGE     arrayMeshArrayData[vsc_mesharray_const].x
  5. #define MESHARRAY_FADE_DISTANCE  arrayMeshArrayData[vsc_mesharray_const].y
  6.  
  7. #define MESHARRAY_CAM_POS        arrayMeshArrayData[vsc_mesharray_campos].xyz
  8.  
  9. //#define MESHARRAY_IN_INDEX       g_fFixedUser0.w
  10. #define MESHARRAY_IN_S           g_fFixedUser0.xyz
  11.  
  12. int Float2Int(float v)
  13. {
  14.   //return D3DCOLORtoUBYTE4((v + 0.2f)/ 255.001953f );
  15.   return floor(v);
  16. }
  17.  
  18. float GetDistanceFraction(float fDist, float fFadeDist, float fFadeRange){
  19.   float fFraction = (fDist - fFadeDist) / fFadeRange;
  20.   return clamp(fFraction, 0.0f, 1.0f);
  21. }
  22.  
  23. void MeshArrayTransform( uniform bool m_bNeedNormal, uniform bool m_bNeedTangent ){
  24.   int index = Float2Int(g_fFixedUser0.w);
  25.   float3 color = arrayMeshArrayData[index + vsc_mesharray_data + 3];
  26.   g_fColor0.xyz += color;
  27.   //g_fVertexLightColor.xyz += color;;
  28.   
  29.   float4 k1 = arrayMeshArrayData[index + vsc_mesharray_data];
  30.   float4 k2 = arrayMeshArrayData[index + vsc_mesharray_data + 1];
  31.   float4 k3 = arrayMeshArrayData[index + vsc_mesharray_data + 2];
  32.   float3 fPos;
  33.   g_fVertexPosition.w   = 1.0f;//1.0f;
  34.   fPos.x = dot(g_fVertexPosition, k1);
  35.   fPos.y = dot(g_fVertexPosition, k2);
  36.   fPos.z = dot(g_fVertexPosition, k3);
  37.   g_fVertexPosition.xyz = fPos;
  38.  
  39.   float fLenght = length(MESHARRAY_CAM_POS - g_fVertexPosition.xyz);
  40.   float fFadeDistance = MESHARRAY_FADE_DISTANCE;
  41.   float fFadeRange = MESHARRAY_FADE_RANGE;
  42.   float fFraction = GetDistanceFraction(fLenght, fFadeDistance, fFadeRange);// (fLenght - fCullDistance) / fFadeDistance;
  43.   g_fColor0.w = lerp( g_fColor0.w, 0.005f, fFraction);
  44.   
  45.   if (m_bNeedNormal) {
  46.       float3 fArrayNormal;
  47.       fArrayNormal.x = dot(g_fNormal, k1);
  48.     fArrayNormal.y = dot(g_fNormal, k2);
  49.     fArrayNormal.z = dot(g_fNormal, k3);    
  50.     g_fNormal = fArrayNormal;
  51.     //g_fNormal = normalize(g_fNormal);
  52.   }
  53.   if (m_bNeedTangent) {
  54.       float3 fArrayS;
  55.       fArrayS.x = dot(MESHARRAY_IN_S, k1);
  56.     fArrayS.y = dot(MESHARRAY_IN_S, k2);
  57.     fArrayS.z = dot(MESHARRAY_IN_S, k3);    
  58.   
  59.     g_fS = fArrayS;
  60.     g_fT = normalize(cross(g_fS, g_fNormal));  
  61.     g_fSxT = g_fNormal;
  62.   }
  63.   
  64. }
  65.  
  66.  
  67. #define VEGETATION_BEND_FACTOR    arrayVegetationData[vsc_vegetation_const].x
  68. #define VEGETATION_TIME           arrayVegetationData[vsc_vegetation_const].y
  69. #define VEGETATION_FADE_RANGE     arrayVegetationData[vsc_vegetation_const].z
  70. #define VEGETATION_FADE_DISTANCE  arrayVegetationData[vsc_vegetation_const].w
  71.  
  72. #define VEGETATION_CAM_POS        arrayVegetationData[vsc_vegetation_campos].xyz
  73.  
  74. //#define VEGETATION_IN_INDEX       g_fFixedUser0.x
  75. #define VEGETATION_IN_BEND        g_fFixedUser0.y
  76.  
  77.  
  78. void VegetationTransform( uniform bool m_bNeedNormal, uniform bool m_bNeedTangent ){
  79.   int index = Float2Int(g_fFixedUser0.x);
  80.   float3 posOffset = arrayVegetationData[index + vsc_vegetation_data];
  81.   g_fVertexPosition.xyz = g_fVertexPosition.xyz + posOffset;
  82.   g_fVertexPosition.w   = 1.0f;
  83.   float3 avmSumLight = arrayVegetationData[index + vsc_vegetation_data + 1];
  84.   g_fColor1.xyz += avmSumLight;
  85.   float fPhase = 6.2831853071795864f * (VEGETATION_TIME * 0.5f + (g_fVertexPosition.x + g_fVertexPosition.z) / 10.0f);
  86.   float s,c;    
  87.   sincos(fPhase,s,c);
  88.   float fBend = VEGETATION_BEND_FACTOR * VEGETATION_IN_BEND;
  89.   g_fVertexPosition.x += fBend * s;
  90.   g_fVertexPosition.z += fBend * c;
  91.   float fLenght = length(VEGETATION_CAM_POS - g_fVertexPosition.xyz);
  92.   float fFadeDistance = VEGETATION_FADE_DISTANCE;
  93.   float fFadeRange    = VEGETATION_FADE_RANGE;
  94.   float fFraction = GetDistanceFraction(fLenght, fFadeDistance, fFadeRange);// (fLenght - fCullDistance) / fFadeDistance;
  95.   g_fColor0.w = lerp( g_fColor0.w, 0.005f, fFraction);
  96. }
  97.  
  98. float2 CalculateVertexOffset(in float2 vTexCoord, in float fPolarity) 
  99.   float2 offset = -2.0f * vTexCoord + 1.0f;
  100.   offset.x *= fPolarity;
  101.   return offset;
  102. }
  103.  
  104. void AureolTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  105.   
  106.   float fRadius = arrayAureolData[vsc_aureol_bbconst].x;
  107.   float fPolarity = arrayAureolData[vsc_aureol_bbconst].z;
  108.   float2 offset = fRadius * CalculateVertexOffset(g_fTexCoords[0].xy, fPolarity);
  109.  
  110.   float co = arrayAureolData[vsc_aureol_bbconst2].x;
  111.   float si = arrayAureolData[vsc_aureol_bbconst2].y;
  112.  
  113.   float3 offSetRot;
  114.   offSetRot.x = offset.x * co - offset.y * si;
  115.   offSetRot.y = offset.x * si + offset.y * co;
  116.   offSetRot.z = 0.0f;
  117.   
  118.   float3 viewOffset;
  119.   viewOffset.x = dot((float3)arrayAureolData[vsc_sfx_matViewInv4x3+0], offSetRot);
  120.   viewOffset.y = dot((float3)arrayAureolData[vsc_sfx_matViewInv4x3+1], offSetRot);
  121.   viewOffset.z = dot((float3)arrayAureolData[vsc_sfx_matViewInv4x3+2], offSetRot);
  122.   
  123.   g_fVertexPosition.xyz = arrayAureolData[vsc_aureol_origin].xyz + viewOffset.xyz;
  124.   g_fVertexPosition.w = 1.0f;
  125.  
  126.   float fFade = arrayAureolData[vsc_aureol_bbconst].y;
  127.   g_fColor0 = arrayAureolData[vsc_aureol_diffuse] * fFade;
  128. }
  129.  
  130.  
  131. void ProjectorTransform( uniform bool m_bNeedNormal, uniform bool m_bNeedTangent ){
  132.   float fHalfWidth = arrayProjectorData[vsc_projector_bbconst].x;
  133.   float3 eyePos;
  134.   eyePos.x = arrayProjectorData[vsc_sfx_matViewInv4x3+0].w;
  135.   eyePos.y = arrayProjectorData[vsc_sfx_matViewInv4x3+1].w;
  136.   eyePos.z = arrayProjectorData[vsc_sfx_matViewInv4x3+2].w;
  137.  
  138.   float3 up     = arrayProjectorData[vsc_projector_up];
  139.   float3 origin = arrayProjectorData[vsc_projector_origin];
  140.   float3 vEyeObjDir = eyePos - origin;
  141.   float3 right  = fHalfWidth * normalize( cross(up, vEyeObjDir) );
  142.  
  143.   float  fPolarity = arrayProjectorData[vsc_projector_bbconst].z;
  144.   float2 offset = CalculateVertexOffset(g_fTexCoords[0].xy, fPolarity);
  145.  
  146.   g_fVertexPosition.xyz = origin + offset.x * right + offset.y  * up;
  147.   g_fVertexPosition.w   = 1.0f;
  148.  
  149.   float fFade = arrayProjectorData[vsc_projector_bbconst].y;
  150.   g_fColor0 = arrayProjectorData[vsc_projector_diffuse] * fFade;
  151. }
  152.  
  153. void LensFlareTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  154.   float fPolarity = arrayLensFlareData[vsc_lensflare_bbconst].z;
  155.   float fRadius = arrayLensFlareData[vsc_lensflare_bbconst].x;
  156.   float3 offset;
  157.   offset.xy = fRadius * CalculateVertexOffset(g_fTexCoords[0].xy, fPolarity);
  158.   offset.z = 0.0f;
  159.   float3 viewOffset;
  160.   viewOffset.x = dot((float3)arrayLensFlareData[vsc_sfx_matViewInv4x3+0], offset);
  161.   viewOffset.y = dot((float3)arrayLensFlareData[vsc_sfx_matViewInv4x3+1], offset);
  162.   viewOffset.z = dot((float3)arrayLensFlareData[vsc_sfx_matViewInv4x3+2], offset);
  163.   
  164.   g_fVertexPosition.xyz = arrayLensFlareData[vsc_lensflare_origin].xyz + viewOffset.xyz;
  165.   g_fVertexPosition.w = 1.0f;
  166.  
  167.   float fFade = arrayLensFlareData[vsc_lensflare_bbconst].y;
  168.   g_fColor0 = arrayLensFlareData[vsc_lensflare_diffuse] * fFade;
  169. }
  170.  
  171.  
  172. void LightingTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  173.    
  174. #define vsc_lightning_startwidth      arrayLightingData[vsc_lightning_const1].xxxx
  175. #define vsc_lightning_endwidth        arrayLightingData[vsc_lightning_const1].yyyy
  176. #define vsc_lightning_half            arrayLightingData[vsc_lightning_const1].zzzz
  177. #define vsc_lightning_one             arrayLightingData[vsc_lightning_const1].wwww
  178.  
  179. #define vsc_lightning_numsegments     arrayLightingData[vsc_lightning_const2].xxxx
  180. #define vsc_lightning_srtradius       arrayLightingData[vsc_lightning_const2].yyyy
  181. #define vsc_lightning_midradius       arrayLightingData[vsc_lightning_const2].zzzz
  182. #define vsc_lightning_endradius       arrayLightingData[vsc_lightning_const2].wwww
  183.  
  184. #define in_pos                        g_fFixedUser0
  185. #define in_part                       g_fFixedUser1.x
  186. #define in_flag                       g_fFixedUser1.y
  187.  
  188.    float3 tmp0,tmp1,tmp2; 
  189.    
  190.    tmp1.x = arrayLightingData[vsc_lightning_const2].z - arrayLightingData[vsc_lightning_const2].y;
  191.    tmp1.y = arrayLightingData[vsc_lightning_const2].w - arrayLightingData[vsc_lightning_const2].z;
  192.    
  193.    tmp0.x = ( g_fFixedUser1.x >= 0.5f ) ? 1.0f : 0.0f;
  194.    tmp0.y = 1.0f - tmp0.x;
  195.    
  196.    //
  197.    tmp2.x = arrayLightingData[vsc_lightning_const2].z * tmp0.x;
  198.    tmp2.x =  arrayLightingData[vsc_lightning_const2].y * tmp0.y + tmp2.x;
  199. //
  200.    tmp1.y = tmp1.y * tmp0.x;
  201.    tmp1.x =  tmp1.x * tmp0.y + tmp1.y;
  202. //
  203.    tmp2.y = -0.5f * tmp0.x + in_part;
  204.    tmp2.y = tmp2.y * tmp1.x;
  205.    tmp2.y = tmp2.y + tmp2.y;
  206. //
  207.    tmp0.x = tmp2.x + tmp2.y;
  208.    tmp0.y = -tmp0.x;
  209.  
  210.    //tmp2.x = dot( arrayLightingData[vsc_lightning_const2].zy,tmp0.xy);
  211.    //tmp1.x = dot(tmp1.xy,tmp0.xy);
  212.     
  213.    //tmp2.y =  ( ( (-0.5 * tmp0.x) + g_fFixedUser1.x) * tmp1.x) * 2.0;
  214.    
  215.    //tmp0.x = tmp2.x + tmp2.y;
  216.    //tmp0.y = -tmp0.x;
  217.    
  218.    float3 vecPos,vDxyz,vDeltaCPS,vp,vDepth,vDxyzNormal; 
  219.    
  220.    vecPos = min(g_fFixedUser0, (float3)tmp0.x);
  221.    vecPos = max(vecPos,(float3)tmp0.y);  
  222.    
  223.    
  224.    vDxyz = arrayLightingData[vsc_lightning_endpos] - arrayLightingData[vsc_lightning_startpos];
  225.    vDeltaCPS = arrayLightingData[vsc_lightning_campos] - vDxyz;
  226.    
  227.    vp = normalize(cross(vDxyz,vDeltaCPS));
  228.    vDepth = normalize(cross(vDxyz,vp));
  229.    vDxyzNormal = normalize(vDxyz);
  230.    
  231.    tmp0.x = dot(vDxyzNormal,vecPos);
  232.    tmp1 = (-vDxyzNormal * (float3)tmp0.x) + vecPos;
  233.    tmp0.x = dot(vDepth, tmp1);
  234.    tmp1 = (-vDepth * (float3)tmp0.x) + tmp1;
  235.    
  236.    tmp0.x = lerp(arrayLightingData[vsc_lightning_const1].x,arrayLightingData[vsc_lightning_const1].y,g_fFixedUser1.x);
  237.    
  238.    tmp2.x =  g_fFixedUser1.y - 0.5f;
  239.    tmp1 = ((vp * (float3)tmp0.x) * (float3)tmp2.x) + tmp1;
  240.    
  241.    tmp2 =  lerp(arrayLightingData[vsc_lightning_startpos],arrayLightingData[vsc_lightning_endpos],(float3)g_fFixedUser1.x);
  242.    
  243.    g_fVertexPosition.xyz = tmp1 + tmp2;
  244.    g_fVertexPosition.w = 1.0f;
  245.    
  246.    g_fTexCoords[0].xy =  g_fFixedUser1.yx;
  247.    g_fTexCoords[0].z = 0.0f;
  248.    g_fTexCoords[0].w = 1.0f;
  249.    g_fColor0 = lerp( arrayLightingData[vsc_lightning_startcolor],arrayLightingData[vsc_lightning_endcolor],(float4)g_fFixedUser1.x);
  250. }
  251.  
  252. //--------------------------------------------------------------------------
  253. // Particle systems
  254. // ~~~~~~~~~~~~~~~~
  255.  
  256. void CalculateParticlePosAndVelocity(in float fDeltaTime, out float3 pos, out float3 vel)
  257. {
  258.   float3 pos0               = g_fFixedUser1.xyz;
  259.   float3 vel0               = g_fFixedUser2.xyz;
  260.   float  fCloneKefficient   = arrayParticlesData[vsc_particles_const2].z;
  261.   float3 gravity            = arrayParticlesData[vsc_particles_const3].xyz;
  262.   
  263.   vel = vel0 + gravity * fDeltaTime;
  264.   pos = vel0 * fDeltaTime + pos0 + gravity * fDeltaTime * fDeltaTime * 0.5f + vel * fCloneKefficient;
  265. }
  266.  
  267. void CalculateParticlePos(in float fDeltaTime, out float3 pos) 
  268. {
  269.   float3 vel;
  270.   CalculateParticlePosAndVelocity(fDeltaTime, pos, vel);
  271. }
  272.  
  273. float CalculateParticleRadius(in float fFraction) {
  274.   float fStartRadius      = arrayParticlesData[vsc_particles_const2].x;
  275.   float fEndRadius        = arrayParticlesData[vsc_particles_const2].y;
  276.  
  277.   return lerp(fStartRadius, fEndRadius, fFraction);
  278. }
  279.  
  280. float4 CalculateParticleColor(in float fFraction) {
  281.   float4 startColor = g_fFixedUser3;
  282.   float4 endColor   = g_fFixedUser4;
  283.   return lerp(startColor, endColor, fFraction);
  284. }
  285.  
  286. //--------------------------------------------------------------------------
  287.  
  288. void ParticleAxisBillBoardTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  289.   float fCurrentTime      = arrayParticlesData[vsc_particles_const3].w;
  290.   float fTime0            = g_fFixedUser0.x;
  291.   float fDeltaTime        = fCurrentTime - fTime0;
  292.   float fLiveTime         = g_fFixedUser0.y - fTime0;
  293.   
  294.   float fFraction         = fDeltaTime / fLiveTime;
  295.   
  296.   float3 vel;
  297.   float3 origin;
  298.   CalculateParticlePosAndVelocity(fDeltaTime, origin, vel);
  299.   
  300.   g_fColor0 = CalculateParticleColor(fFraction);
  301.   
  302.   float fPolarity = arrayParticlesData[vsc_particles_const2].w;
  303.   float2 offset = CalculateVertexOffset(g_fTexCoords[0].xy, fPolarity);
  304.  
  305.   float3 eyePos;
  306.   eyePos.x = arrayParticlesData[vsc_sfx_matViewInv4x3+0].w;
  307.   eyePos.y = arrayParticlesData[vsc_sfx_matViewInv4x3+1].w;
  308.   eyePos.z = arrayParticlesData[vsc_sfx_matViewInv4x3+2].w;
  309.   
  310.   float fRadius = CalculateParticleRadius(fFraction);
  311.   
  312.   float3 up     = 0.5f * fRadius * normalize(vel);
  313.   float3 vEyeObjDir = eyePos - origin;
  314.   float3 right  = 0.5f * fRadius * normalize( cross(vEyeObjDir, up) );
  315.   
  316.   g_fVertexPosition.xyz = origin + offset.x * right + offset.y  * up;
  317.   g_fVertexPosition.w   = 1.0f;
  318.   
  319. }
  320.  
  321. //--------------------------------------------------------------------------
  322.  
  323. void ParticleBillBoardTransform( uniform bool bNeedNormal, uniform bool bNeedTangent){
  324.  
  325.   float fCurrentTime      = arrayParticlesData[vsc_particles_const3].w;
  326.   float fTime0            = g_fFixedUser0.x;
  327.   float fDeltaTime        = fCurrentTime - fTime0;
  328.   float fLiveTime         = g_fFixedUser0.y - fTime0;
  329.   float fFraction         = fDeltaTime / fLiveTime;
  330.  
  331.   CalculateParticlePos(fDeltaTime, g_fVertexPosition.xyz);
  332.   g_fVertexPosition.w = 1.0f;
  333.   g_fColor0 = CalculateParticleColor(fFraction);
  334.   
  335.   float fRadius = CalculateParticleRadius(fFraction);
  336.   float3 offset;
  337.   float fPolarity = arrayParticlesData[vsc_particles_const2].w;
  338.   offset.xy = fRadius * 0.5f * CalculateVertexOffset(g_fTexCoords[0].xy, fPolarity);
  339.   offset.z = 0.0f;
  340.   
  341.   float3 viewOffset;
  342.   viewOffset.x = dot((float3)arrayParticlesData[vsc_sfx_matViewInv4x3+0], offset);
  343.   viewOffset.y = dot((float3)arrayParticlesData[vsc_sfx_matViewInv4x3+1], offset);
  344.   viewOffset.z = dot((float3)arrayParticlesData[vsc_sfx_matViewInv4x3+2], offset);
  345.   
  346.   g_fVertexPosition.xyz += viewOffset.xyz;
  347. }
  348.  
  349. //--------------------------------------------------------------------------
  350.  
  351. void ParticlePointSpriteTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  352.   
  353.   float fCurrentTime      = arrayParticlesData[vsc_particles_const3].w;
  354.   float fTime0            = g_fFixedUser0.x;
  355.   float fDeltaTime        = fCurrentTime - fTime0;
  356.   float fLiveTime         = g_fFixedUser0.y - fTime0;
  357.   float fFraction         = fDeltaTime / fLiveTime;
  358.  
  359.   CalculateParticlePos(fDeltaTime, g_fVertexPosition.xyz);
  360.   g_fVertexPosition.w = 1.0f;
  361.  
  362.   g_fColor0 = CalculateParticleColor(fFraction);
  363.  
  364.   float4 fWRow;
  365.   fWRow.x = matProjection[0][3];
  366.   fWRow.y = matProjection[1][3];
  367.   fWRow.z = matProjection[2][3];
  368.   fWRow.w = matProjection[3][3];
  369.   
  370.   float fRadius = CalculateParticleRadius(fFraction);
  371.   float fViewPortScale = arrayParticlesData[vsc_particles_const2].w;
  372.   g_fPSize = (fRadius * fViewPortScale) / dot(g_fVertexPosition, fWRow);
  373.  
  374.   g_fTexCoords[0].xyz = 0.0f;
  375.   g_fTexCoords[0].w = 1.0f;
  376. }
  377.  
  378. void GrassTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  379.  
  380.  
  381.     float3 r_tmp,r_n,r_tan,r_bend;
  382.     float4 r_splineX,r_splineY,r_splineZ,r_nProj;
  383.     float4 r_bendProjected,ru,r_pos,r_u;
  384.     
  385.     r_n = cross(g_fFixedUser1,g_fFixedUser2);
  386.     r_bend = arrayGrassData[vsc_grass_bend];
  387.     
  388.     float3x4 rMat;
  389.     rMat[0] = arrayGrassData[vsc_grass_dynamicbendmatrix0];
  390.     rMat[1] = arrayGrassData[vsc_grass_dynamicbendmatrix1];
  391.     rMat[2] = arrayGrassData[vsc_grass_dynamicbendmatrix2];
  392.     
  393.     r_tmp.xyz = mul(rMat,g_fFixedUser0);
  394.     
  395.     r_tmp.y = -r_tmp.y;
  396.     r_bend = r_tmp * (float3)arrayGrassData[vsc_grass_bendparameters].x + r_bend;
  397.     
  398.     r_bendProjected.x = dot(r_bend,g_fFixedUser1);
  399.     r_bendProjected.y = dot(r_bend,g_fFixedUser2);
  400.     
  401.     r_bendProjected.xy = clamp(r_bendProjected.xy,-arrayGrassData[vsc_grass_bendparameters].yy,arrayGrassData[vsc_grass_bendparameters].yy);
  402.     r_bendProjected.zw = max(r_bendProjected.xy,-r_bendProjected.xy);
  403.     r_bendProjected.z  = max(r_bendProjected.z,-r_bendProjected.w);
  404.  
  405.     r_splineX = arrayGrassData[vsc_grass_spline0] * (float4)r_bendProjected.x;
  406.     r_splineY = arrayGrassData[vsc_grass_spline1] * (float4)r_bendProjected.y;
  407.     r_splineZ = arrayGrassData[vsc_grass_spline2];
  408.     
  409.     r_u.x = 1.0f;
  410.     r_u.y = g_fFixedUser4.x * g_fFixedUser4.x;
  411.     r_u.zw = g_fFixedUser4.x;
  412.     r_u.xw = r_u.yxxx * r_u.zxxx;
  413.     
  414.     r_pos.x = dot(r_u,r_splineX);
  415.     r_pos.y = dot(r_u,r_splineY);
  416.     r_pos.z = dot(r_u,r_splineZ);
  417.     r_pos.w = 1.0f;
  418.     r_pos.xyz = (float3)r_pos * (float3)g_fFixedUser4.z;
  419.             
  420.     r_tmp = (r_n * (float3)r_pos.z) + g_fFixedUser0;
  421.     r_tmp = (g_fFixedUser1 * (float3)r_pos.x) + r_tmp;
  422.     r_pos.xyz = (g_fFixedUser2 * (float3)r_pos.y) + r_tmp;
  423.  
  424.    r_nProj.y = dot((float3)arrayGrassData[vsc_grass_worldmatrix0],r_n);
  425.    r_nProj.x = dot((float3)arrayGrassData[vsc_grass_worldmatrix1],-r_n);
  426.    r_nProj.z = 0.0f;    
  427.    r_nProj.w = 1.0f;    
  428.  
  429.   float r_projRadius;
  430.   float r_projScale;
  431.     
  432.   r_projRadius =  g_fFixedUser4.y * arrayGrassData[vsc_grass_shaderparameters].x;
  433.   r_projScale = rsqrt( dot((float3)r_nProj,(float3)r_nProj)) * r_projRadius;
  434.   r_nProj = r_nProj * r_projScale;
  435.   
  436.   float4 r_outPos;
  437.   float4x4 rViewMatrix;
  438.   rViewMatrix[0] = arrayGrassData[vsc_grass_projectionmatrix0];
  439.   rViewMatrix[1] = arrayGrassData[vsc_grass_projectionmatrix1];
  440.   rViewMatrix[2] = arrayGrassData[vsc_grass_projectionmatrix2];
  441.   rViewMatrix[3] = arrayGrassData[vsc_grass_projectionmatrix3];    
  442.   r_outPos = mul(rViewMatrix,r_pos);
  443.   
  444.   g_fVertexPosition = (r_nProj * arrayGrassData[vsc_grass_constants].yyxx) +  r_outPos;
  445.   
  446.   g_fTexCoords[0].xy = g_fFixedUser3.xy;
  447.   g_fTexCoords[0].z = 0.0f;
  448.   g_fTexCoords[0].w = 1.0f;
  449.   g_fColor0 = arrayGrassData[vsc_grass_diffuse];
  450.   
  451.  
  452. }
  453. void SurfaceTransform( uniform bool bNeedNormal, uniform bool bNeedTangent  ){
  454.   if( bNeedNormal ){
  455.     g_fNormal = normalize(g_fNormal);
  456.   }
  457.   if( bNeedTangent ){
  458.     g_fSxT = normalize(g_fNormal - cross(g_fS,g_fT));    
  459.   }
  460. }
  461. void ShiningHClipTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  462.     
  463.  float4 rPos;
  464.  rPos.xyz = arrayShiningData[vsc_position];
  465.  rPos.w = 1.0f;
  466.  
  467.  float4x4 rViewMat;
  468.  rViewMat[0] = arrayShiningData[vsc_vmat0+0];
  469.  rViewMat[1] = arrayShiningData[vsc_vmat0+1];
  470.  rViewMat[2] = arrayShiningData[vsc_vmat0+2];
  471.  rViewMat[3] = arrayShiningData[vsc_vmat0+3];
  472.  
  473.  rPos = mul(rViewMat,rPos);
  474.  
  475.  float2 rTmpPos = g_fFixedUser0.xy * arrayShiningData[vsc_constshine].zw; 
  476.  float2 rTmp1 = g_fFixedUser2.xx * arrayShiningData[vsc_constshine].yy + g_fFixedUser2.yy * arrayShiningData[vsc_constshine].xx;
  477.  rPos.xy = rTmpPos * rTmp1 + rPos.xy;
  478.  
  479.  //float2 rTmpPos,rTmp1;
  480.  //rTmpPos = g_fFixedUser0.xy * arrayShiningData[vsc_constshine].zw;
  481.  
  482.  //rTmp1 = dot( g_fFixedUser2.yx,arrayShiningData[vsc_constshine].xy);
  483.  //rPos.xy = rTmpPos * rTmp1 + rPos.xy;
  484.  //float4x4 rViewMat;
  485.  rViewMat[0] = arrayShiningData[vsc_pmat0+0];
  486.  rViewMat[1] = arrayShiningData[vsc_pmat0+1];
  487.  rViewMat[2] = arrayShiningData[vsc_pmat0+2];
  488.  rViewMat[3] = arrayShiningData[vsc_pmat0+3];
  489.  
  490.  g_fVertexPosition = mul(rViewMat,rPos );
  491.  
  492.  g_fColor0 = lerp( arrayShiningData[vsc_startshinediffuse],arrayShiningData[vsc_endshinediffuse],(float4)g_fFixedUser1.x);
  493.  g_fTexCoords[0].xy = g_fFixedUser1.xy;
  494.  g_fTexCoords[0].z = 0.0f;
  495.  g_fTexCoords[0].w = 1.0f; 
  496.  
  497. }
  498. void MarkTransform( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  499.  
  500.  float4x4 rViewMat;
  501.  rViewMat[0] = arrayMarkData[vsc_mark_wrldmtx+0];
  502.  rViewMat[1] = arrayMarkData[vsc_mark_wrldmtx+1];
  503.  rViewMat[2] = arrayMarkData[vsc_mark_wrldmtx+2];
  504.  rViewMat[3] = arrayMarkData[vsc_mark_wrldmtx+3];
  505.  
  506.  g_fVertexPosition = mul(rViewMat,g_fVertexPosition);
  507.  g_fVertexPosition.w = 1.0f;
  508.  g_fVertexPosition.xyz = ((arrayMarkData[vsc_mark_eyepos] - g_fVertexPosition) * (float3)arrayMarkData[vsc_mark_bbconst].y) + (float3)g_fVertexPosition;
  509.  g_fColor0 = lerp( arrayMarkData[vsc_mark_startcolor] ,arrayMarkData[vsc_mark_endcolor],(float4)arrayMarkData[vsc_mark_bbconst].x);
  510. }
  511. void ExtenedMeshDoffuse( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  512.  g_fColor0 = arrayMarkData[vsc_mark_bbconst];    
  513. }
  514. #endif //__SFX_FX__
  515.  
  516.  
  517.  
  518.  
  519.  
  520.  
  521.  
  522.