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

  1. //--------------------------------------------------------------------------
  2. //  TMShaders
  3. //  Copyright (c) 2002 by Tools-Media Corp., All Right Reserved.
  4. //  Programmer: Tima Tcvetkov
  5. //
  6. //  smd.fx
  7. //  Vertex Shaders for skining
  8. //--------------------------------------------------------------------------
  9. #ifndef __SMD_FX__
  10. #define __SMD_FX__
  11.  
  12. void SmdSkinBone1( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  13.    float4 k1,k2,k3;
  14.    int i1;
  15.    i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
  16.    k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0];
  17.    k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1];
  18.    k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2];
  19.  
  20.    float3 fPos;
  21.    fPos.x = dot(g_fVertexPosition,k1);
  22.    fPos.y = dot(g_fVertexPosition,k2);
  23.    fPos.z = dot(g_fVertexPosition,k3);
  24.    g_fVertexPosition.xyz = fPos;
  25.    
  26.    if( bNeedNormal ){
  27.       //g_fNormal = g_fNormal * 2.0 - 1.0;                     
  28.       float3 fSkinnedNormal;
  29.       fSkinnedNormal.x = dot(g_fNormal,k1);
  30.       fSkinnedNormal.y = dot(g_fNormal,k2);
  31.       fSkinnedNormal.z = dot(g_fNormal,k3);    
  32.       g_fNormal = fSkinnedNormal;
  33.    }
  34.    if( bNeedTangent ){
  35.      // g_fS = g_fS * 2.0 - 1.0;                     
  36.      // g_fT = g_fT * 2.0 - 1.0;                     
  37.       float3 fSkinnedS,fSkinnedT;
  38.       fSkinnedS.x = dot(g_fS,k1);
  39.       fSkinnedS.y = dot(g_fS,k2);
  40.       fSkinnedS.z = dot(g_fS,k3);    
  41.       g_fS = fSkinnedS;
  42.       fSkinnedT.x = dot(g_fT,k1);
  43.       fSkinnedT.y = dot(g_fT,k2);
  44.       fSkinnedT.z = dot(g_fT,k3);    
  45.       g_fT = fSkinnedT;
  46.       g_fSxT = g_fNormal;
  47.    }    
  48. }
  49. void SmdSkinBone2( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  50.    float4 k1,k2,k3;
  51.    
  52.    int i1,i2;
  53.    i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
  54.    i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
  55.    
  56.    k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
  57.    k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
  58.    k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
  59.    k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
  60.    k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
  61.    k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
  62.    float3 fPos;
  63.    fPos.x = dot(g_fVertexPosition,k1);
  64.    fPos.y = dot(g_fVertexPosition,k2);
  65.    fPos.z = dot(g_fVertexPosition,k3);
  66.    g_fVertexPosition.xyz = fPos;
  67.    
  68.    if( bNeedNormal ){
  69.       //g_fNormal = g_fNormal * 2.0 - 1.0;                     
  70.       float3 fSkinnedNormal;
  71.       fSkinnedNormal.x = dot(g_fNormal,k1);
  72.       fSkinnedNormal.y = dot(g_fNormal,k2);
  73.       fSkinnedNormal.z = dot(g_fNormal,k3);    
  74.       g_fNormal = fSkinnedNormal;
  75.    }
  76.    if( bNeedTangent ){
  77.       //g_fS = g_fS * 2.0 - 1.0;                     
  78.       //g_fT = g_fT * 2.0 - 1.0;                     
  79.       float3 fSkinnedS,fSkinnedT;
  80.       fSkinnedS.x = dot(g_fS,k1);
  81.       fSkinnedS.y = dot(g_fS,k2);
  82.       fSkinnedS.z = dot(g_fS,k3);    
  83.       g_fS = fSkinnedS;
  84.       fSkinnedT.x = dot(g_fT,k1);
  85.       fSkinnedT.y = dot(g_fT,k2);
  86.       fSkinnedT.z = dot(g_fT,k3);    
  87.       g_fT = fSkinnedT;
  88.       g_fSxT = g_fNormal;
  89.    }    
  90. }
  91. void SmdSkinBone3( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  92.    float4 k1,k2,k3;
  93.    int i1,i2,i3;
  94.    i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
  95.    i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
  96.    i3 = D3DCOLORtoUBYTE4(g_fFixedUser1.z);
  97.    
  98.    k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
  99.    k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
  100.    k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
  101.    k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
  102.    k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
  103.    k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
  104.    k1 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 0 ] + k1;
  105.    k2 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 1 ] + k2;
  106.    k3 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 2 ] + k3; 
  107.    float3 fPos;
  108.    fPos.x = dot(g_fVertexPosition,k1);
  109.    fPos.y = dot(g_fVertexPosition,k2);
  110.    fPos.z = dot(g_fVertexPosition,k3);
  111.    g_fVertexPosition.xyz = fPos;
  112.    
  113.    if( bNeedNormal ){
  114.       //g_fNormal = g_fNormal * 2.0 - 1.0;                     
  115.       float3 fSkinnedNormal;
  116.       fSkinnedNormal.x = dot(g_fNormal,k1);
  117.       fSkinnedNormal.y = dot(g_fNormal,k2);
  118.       fSkinnedNormal.z = dot(g_fNormal,k3);    
  119.       g_fNormal = fSkinnedNormal;
  120.    }
  121.    if( bNeedTangent ){
  122.       //g_fS = g_fS * 2.0 - 1.0;                     
  123.       //g_fT = g_fT * 2.0 - 1.0;                     
  124.       float3 fSkinnedS,fSkinnedT;
  125.       fSkinnedS.x = dot(g_fS,k1);
  126.       fSkinnedS.y = dot(g_fS,k2);
  127.       fSkinnedS.z = dot(g_fS,k3);    
  128.       g_fS = fSkinnedS;
  129.       fSkinnedT.x = dot(g_fT,k1);
  130.       fSkinnedT.y = dot(g_fT,k2);
  131.       fSkinnedT.z = dot(g_fT,k3);    
  132.       g_fT = fSkinnedT;
  133.       g_fSxT = g_fNormal;
  134.    }    
  135. }
  136. void SmdSkinBone4( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  137.    
  138.    float4 k1,k2,k3;
  139.    int i1,i2,i3,i4; 
  140.    i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
  141.    i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
  142.    i3 = D3DCOLORtoUBYTE4(g_fFixedUser1.z);
  143.    i4 = D3DCOLORtoUBYTE4(g_fFixedUser1.w);
  144.  
  145.    k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
  146.    k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
  147.    k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
  148.    k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
  149.    k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
  150.    k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
  151.    k1 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 0 ] + k1;
  152.    k2 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 1 ] + k2;
  153.    k3 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 2 ] + k3; 
  154.    k1 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 0 ] + k1;
  155.    k2 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 1 ] + k2;
  156.    k3 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 2 ] + k3;
  157.    float3 fPos;
  158.    fPos.x = dot(g_fVertexPosition,k1);
  159.    fPos.y = dot(g_fVertexPosition,k2);
  160.    fPos.z = dot(g_fVertexPosition,k3);
  161.    g_fVertexPosition.xyz = fPos;
  162.    
  163.    if( bNeedNormal ){
  164.       float3 fSkinnedNormal;
  165.       fSkinnedNormal.x = dot(g_fNormal,k1);
  166.       fSkinnedNormal.y = dot(g_fNormal,k2);
  167.       fSkinnedNormal.z = dot(g_fNormal,k3);    
  168.       g_fNormal = fSkinnedNormal;
  169.    }
  170.    if( bNeedTangent){
  171.       float3 fSkinnedS,fSkinnedT;
  172.       fSkinnedS.x = dot(g_fS,k1);
  173.       fSkinnedS.y = dot(g_fS,k2);
  174.       fSkinnedS.z = dot(g_fS,k3);    
  175.       g_fS = fSkinnedS;
  176.       fSkinnedT.x = dot(g_fT,k1);
  177.       fSkinnedT.y = dot(g_fT,k2);
  178.       fSkinnedT.z = dot(g_fT,k3);    
  179.       g_fT = fSkinnedT;
  180.       g_fSxT = g_fNormal;
  181.    }    
  182. }
  183. void SmdMorff( uniform bool bSkinNormal, uniform bool bSkinTangent ){
  184.     
  185.        
  186.     float3 fPosition;
  187.     fPosition              = lerp(g_fVertexPosition.xyz,g_fFixedUser0.xyz,arraySMDMorffCoeff.x);
  188.     fPosition              = lerp(fPosition,g_fFixedUser1.xyz,arraySMDMorffCoeff.y);
  189.     g_fVertexPosition.xyz = lerp(fPosition,g_fFixedUser2.xyz,arraySMDMorffCoeff.z);
  190.     g_fVertexPosition.w = 1.0f;
  191.     
  192.     if( bSkinNormal ){
  193.       g_fNormal = lerp(g_fNormal,g_fFixedUser3.xyz,arraySMDMorffCoeff.x);
  194.       g_fNormal = lerp(g_fNormal,g_fFixedUser4.xyz,arraySMDMorffCoeff.y);
  195.       g_fNormal = lerp(g_fNormal,g_fFixedUser5.xyz,arraySMDMorffCoeff.z);
  196.     }
  197.     if( bSkinTangent ){
  198.       
  199.       float3 sxt = lerp(g_fS,g_fT.xyz,arraySMDMorffCoeff.x);
  200.       sxt = lerp(sxt,g_fSxT.xyz,arraySMDMorffCoeff.y);
  201.       g_fS = lerp(sxt,g_fFixedUser6.xyz,arraySMDMorffCoeff.z);
  202.       
  203.       g_fSxT = g_fNormal;
  204.       g_fT = cross(g_fSxT,g_fS);
  205.     }
  206. }
  207. /*
  208.   Loop skinning for VS20 and higher
  209. */
  210. void SmdSkinAllBones( uniform bool bSkinNormal, uniform bool bSkinTangent ){
  211.    
  212.    float4 k1,k2,k3;
  213.    k1 = 0.0f;
  214.    k2 = 0.0f;
  215.    k3 = 0.0f;
  216.    
  217.    for( int i =0; i < constINumBones; i++ ){
  218.      int index = D3DCOLORtoUBYTE4(g_fFixedUser1[i]);
  219.      k1 = g_fFixedUser0[i] * arraySMDMatricies[ index + 0 ] + k1;
  220.      k2 = g_fFixedUser0[i] * arraySMDMatricies[ index + 1 ] + k2;
  221.      k3 = g_fFixedUser0[i] * arraySMDMatricies[ index + 2 ] + k3;
  222.    }       
  223.    
  224.    float3 fPos;
  225.    fPos.x = dot(g_fVertexPosition,k1);
  226.    fPos.y = dot(g_fVertexPosition,k2);
  227.    fPos.z = dot(g_fVertexPosition,k3);
  228.    g_fVertexPosition.xyz = fPos;
  229.    
  230.    if( bSkinNormal ){
  231.       float3 fSkinnedNormal;
  232.       fSkinnedNormal.x = dot(g_fNormal,k1);
  233.       fSkinnedNormal.y = dot(g_fNormal,k2);
  234.       fSkinnedNormal.z = dot(g_fNormal,k3);     
  235.       g_fNormal = fSkinnedNormal;
  236.    }
  237.    if( bSkinTangent ){
  238.       float3 fSkinnedS,fSkinnedT,fSkinnedSxT;
  239.       fSkinnedS.x = dot(g_fS,k1);
  240.       fSkinnedS.y = dot(g_fS,k2);
  241.       fSkinnedS.z = dot(g_fS,k3);
  242.       g_fS = fSkinnedS;
  243.       
  244.       fSkinnedT.x = dot(g_fT,k1);
  245.       fSkinnedT.y = dot(g_fT,k2);
  246.       fSkinnedT.z = dot(g_fT,k3);
  247.       g_fT = fSkinnedT;
  248.       
  249.       g_fSxT = g_fNormal;
  250.       
  251.    }
  252. }
  253. #define SMD_DISSOLVE_TOP arraySMDDissolveCoeff.x
  254. #define SMD_DISSOLVE_BOTTOM_MIN_TOP arraySMDDissolveCoeff.y
  255.  
  256. inline void SMDLerpAlphHeight(){
  257.   g_fColor0.a = (SMD_DISSOLVE_TOP - g_fVertexPosition.y) / SMD_DISSOLVE_BOTTOM_MIN_TOP;
  258. }
  259. void SmdSkinAlphaBone1( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  260.     SmdSkinBone1(bNeedNormal,bNeedTangent);
  261.     SMDLerpAlphHeight();
  262. }
  263. void SmdSkinAlphaBone2( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  264.     SmdSkinBone2(bNeedNormal,bNeedTangent);
  265.     SMDLerpAlphHeight();
  266. }
  267. void SmdSkinAlphaBone3( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  268.     SmdSkinBone3(bNeedNormal,bNeedTangent);
  269.     SMDLerpAlphHeight();
  270. }
  271. void SmdSkinAlphaBone4( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  272.     SmdSkinBone4(bNeedNormal,bNeedTangent);
  273.     SMDLerpAlphHeight();
  274. }
  275. void SmdSkinAlphaAllBones( uniform bool bNeedNormal, uniform bool bNeedTangent ){
  276.     SmdSkinAllBones(bNeedNormal,bNeedTangent);
  277.     SMDLerpAlphHeight();
  278. }
  279.  
  280. #endif //__SMD_FX__