home *** CD-ROM | disk | FTP | other *** search
/ NVIDIA Tech Demo: DAWN / NVIDIA_demo.iso / Dawn.exe / Disk1 / data1.cab / Program_Executable_Files / shaders / finalLeavesWingsb1bv1m5.vp30 < prev    next >
Encoding:
Text File  |  2003-02-11  |  4.5 KB  |  108 lines

  1. // v2fConnector.HPOS is set to be the homogenous space coordinate
  2. // v2f.diffCol is set to be the texture coordinate
  3. // v2f.worldEyeDir is set to be the eye direction (from eye) in world space
  4. // v2f.worldTanMatrixX is set to be the tangentMatrix X-row in world space
  5. // v2f.worldTanMatrixY is set to be the tangentMatrix Y-row in world space
  6. // v2f.worldTanMatrixZ is set to be the tangentMatrix Z-row in world space
  7. // v2f.SkinSilouetteVec is set to be the skin silouette vector
  8. // InverseTransposes not used, as we assume no nonuniform scales.
  9.  
  10.  
  11. // vecMul(matrix, float3) multiplies like a vector instead of point (no translate)
  12. float3 vecMul(const float4x4 matrix, const float3 vec){
  13.     return(float3(dot(vec, matrix._11_12_13),
  14.                   dot(vec, matrix._21_22_23),
  15.                   dot(vec, matrix._31_32_33)));
  16. }
  17.  
  18. struct a2vConnector : application2vertex {
  19.     float4 coord;
  20.     float4 normal;
  21.     float4 tangent;
  22.     float3 coordMorph0;
  23.     float4 normalMorph0;
  24.     float3 coordMorph1;
  25.     float4 normalMorph1;
  26.     float3 coordMorph2;
  27.     float4 normalMorph2;
  28.     float3 coordMorph3;
  29.     float4 normalMorph3;
  30.     float3 coordMorph4;
  31.     float4 normalMorph4;
  32.     float boneWeight0;
  33.     float boneIndex0;
  34.     float4 diffCol;
  35. };
  36.  
  37. struct v2fConnector : vertex2fragment {
  38.   float4 HPOS        :HPOS;
  39.     float4 diffCol    :TEX0;
  40.     float3 worldEyeDir    :TEX1;
  41.     float3 worldTanMatrixX    :TEX5;
  42.     float3 worldTanMatrixY    :TEX6;
  43.     float3 worldTanMatrixZ    :TEX7;
  44.     float4 SkinSilouetteVec    :TEX2;
  45. };
  46.  
  47. v2fConnector main(a2vConnector a2v,
  48.                   const uniform float morphWeight0,
  49.                   const uniform float morphWeight1,
  50.                   const uniform float morphWeight2,
  51.                   const uniform float morphWeight3,
  52.                   const uniform float morphWeight4,
  53.                   const uniform float4x4 model[1],
  54.                   const uniform float4 globalCamPos,
  55.                   const uniform float4x4 viewProj){
  56.     v2fConnector v2f;
  57.  
  58.     v2f.diffCol = a2v.diffCol;
  59.  
  60.     float4 objectCoord = a2v.coord;
  61.     objectCoord.xyz = objectCoord.xyz + morphWeight0 * a2v.coordMorph0;
  62.     objectCoord.xyz = objectCoord.xyz + morphWeight1 * a2v.coordMorph1;
  63.     objectCoord.xyz = objectCoord.xyz + morphWeight2 * a2v.coordMorph2;
  64.     objectCoord.xyz = objectCoord.xyz + morphWeight3 * a2v.coordMorph3;
  65.     objectCoord.xyz = objectCoord.xyz + morphWeight4 * a2v.coordMorph4;
  66.     float4x4 worldSkinMatrix;
  67.     worldSkinMatrix[0] = a2v.boneWeight0.x * model[a2v.boneIndex0.x][0];
  68.     worldSkinMatrix[1] = a2v.boneWeight0.x * model[a2v.boneIndex0.x][1];
  69.     worldSkinMatrix[2] = a2v.boneWeight0.x * model[a2v.boneIndex0.x][2];
  70.     worldSkinMatrix[3] = a2v.boneWeight0.x * model[a2v.boneIndex0.x][3];
  71.     float4 worldCoord = mul(worldSkinMatrix, objectCoord);
  72.     float4 worldEyePos = globalCamPos;
  73.     float3 worldEyeDir = normalize(worldCoord.xyz - worldEyePos.xyz);
  74.     v2f.worldEyeDir = worldEyeDir;
  75.  
  76.     float4 objectNormal = a2v.normal;
  77.     objectNormal = objectNormal + morphWeight0 * a2v.normalMorph0;
  78.     objectNormal = objectNormal + morphWeight1 * a2v.normalMorph1;
  79.     objectNormal = objectNormal + morphWeight2 * a2v.normalMorph2;
  80.     objectNormal = objectNormal + morphWeight3 * a2v.normalMorph3;
  81.     objectNormal = objectNormal + morphWeight4 * a2v.normalMorph4;
  82.     objectNormal = normalize(objectNormal);
  83.     float3 worldNormal = vecMul(worldSkinMatrix, objectNormal);
  84.     worldNormal = normalize(worldNormal);
  85.     float3 objectTangent = a2v.tangent.xyz;
  86.     objectTangent = normalize(objectTangent - dot(objectTangent, objectNormal) * objectNormal);
  87.     float3 worldTangent = vecMul(worldSkinMatrix, objectTangent);
  88.     worldTangent = normalize(worldTangent);
  89.     float3 worldBinormal = a2v.tangent.w * normalize(cross(worldNormal, worldTangent));
  90.     float3 worldTanMatrixX = float3(worldTangent.x, worldBinormal.x, worldNormal.x);
  91.     v2f.worldTanMatrixX = worldTanMatrixX;
  92.  
  93.     float3 worldTanMatrixY = float3(worldTangent.y, worldBinormal.y, worldNormal.y);
  94.     v2f.worldTanMatrixY = worldTanMatrixY;
  95.  
  96.     float3 worldTanMatrixZ = float3(worldTangent.z, worldBinormal.z, worldNormal.z);
  97.     v2f.worldTanMatrixZ = worldTanMatrixZ;
  98.  
  99.     float4 skinSilouetteVec;
  100.     skinSilouetteVec.x = 1.0-dot(worldNormal, -worldEyeDir);
  101.     skinSilouetteVec.y = skinSilouetteVec.x*skinSilouetteVec.x;
  102.     v2f.SkinSilouetteVec = skinSilouetteVec;
  103.  
  104.     float4 hpos = mul(viewProj, worldCoord);
  105.     v2f.HPOS = hpos;
  106.  
  107.     return v2f;
  108. }