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 >
Wrap
Text File
|
2004-11-12
|
10KB
|
280 lines
//--------------------------------------------------------------------------
// TMShaders
// Copyright (c) 2002 by Tools-Media Corp., All Right Reserved.
// Programmer: Tima Tcvetkov
//
// smd.fx
// Vertex Shaders for skining
//--------------------------------------------------------------------------
#ifndef __SMD_FX__
#define __SMD_FX__
void SmdSkinBone1( uniform bool bNeedNormal, uniform bool bNeedTangent ){
float4 k1,k2,k3;
int i1;
i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0];
k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1];
k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2];
float3 fPos;
fPos.x = dot(g_fVertexPosition,k1);
fPos.y = dot(g_fVertexPosition,k2);
fPos.z = dot(g_fVertexPosition,k3);
g_fVertexPosition.xyz = fPos;
if( bNeedNormal ){
//g_fNormal = g_fNormal * 2.0 - 1.0;
float3 fSkinnedNormal;
fSkinnedNormal.x = dot(g_fNormal,k1);
fSkinnedNormal.y = dot(g_fNormal,k2);
fSkinnedNormal.z = dot(g_fNormal,k3);
g_fNormal = fSkinnedNormal;
}
if( bNeedTangent ){
// g_fS = g_fS * 2.0 - 1.0;
// g_fT = g_fT * 2.0 - 1.0;
float3 fSkinnedS,fSkinnedT;
fSkinnedS.x = dot(g_fS,k1);
fSkinnedS.y = dot(g_fS,k2);
fSkinnedS.z = dot(g_fS,k3);
g_fS = fSkinnedS;
fSkinnedT.x = dot(g_fT,k1);
fSkinnedT.y = dot(g_fT,k2);
fSkinnedT.z = dot(g_fT,k3);
g_fT = fSkinnedT;
g_fSxT = g_fNormal;
}
}
void SmdSkinBone2( uniform bool bNeedNormal, uniform bool bNeedTangent ){
float4 k1,k2,k3;
int i1,i2;
i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
float3 fPos;
fPos.x = dot(g_fVertexPosition,k1);
fPos.y = dot(g_fVertexPosition,k2);
fPos.z = dot(g_fVertexPosition,k3);
g_fVertexPosition.xyz = fPos;
if( bNeedNormal ){
//g_fNormal = g_fNormal * 2.0 - 1.0;
float3 fSkinnedNormal;
fSkinnedNormal.x = dot(g_fNormal,k1);
fSkinnedNormal.y = dot(g_fNormal,k2);
fSkinnedNormal.z = dot(g_fNormal,k3);
g_fNormal = fSkinnedNormal;
}
if( bNeedTangent ){
//g_fS = g_fS * 2.0 - 1.0;
//g_fT = g_fT * 2.0 - 1.0;
float3 fSkinnedS,fSkinnedT;
fSkinnedS.x = dot(g_fS,k1);
fSkinnedS.y = dot(g_fS,k2);
fSkinnedS.z = dot(g_fS,k3);
g_fS = fSkinnedS;
fSkinnedT.x = dot(g_fT,k1);
fSkinnedT.y = dot(g_fT,k2);
fSkinnedT.z = dot(g_fT,k3);
g_fT = fSkinnedT;
g_fSxT = g_fNormal;
}
}
void SmdSkinBone3( uniform bool bNeedNormal, uniform bool bNeedTangent ){
float4 k1,k2,k3;
int i1,i2,i3;
i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
i3 = D3DCOLORtoUBYTE4(g_fFixedUser1.z);
k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
k1 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 0 ] + k1;
k2 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 1 ] + k2;
k3 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 2 ] + k3;
float3 fPos;
fPos.x = dot(g_fVertexPosition,k1);
fPos.y = dot(g_fVertexPosition,k2);
fPos.z = dot(g_fVertexPosition,k3);
g_fVertexPosition.xyz = fPos;
if( bNeedNormal ){
//g_fNormal = g_fNormal * 2.0 - 1.0;
float3 fSkinnedNormal;
fSkinnedNormal.x = dot(g_fNormal,k1);
fSkinnedNormal.y = dot(g_fNormal,k2);
fSkinnedNormal.z = dot(g_fNormal,k3);
g_fNormal = fSkinnedNormal;
}
if( bNeedTangent ){
//g_fS = g_fS * 2.0 - 1.0;
//g_fT = g_fT * 2.0 - 1.0;
float3 fSkinnedS,fSkinnedT;
fSkinnedS.x = dot(g_fS,k1);
fSkinnedS.y = dot(g_fS,k2);
fSkinnedS.z = dot(g_fS,k3);
g_fS = fSkinnedS;
fSkinnedT.x = dot(g_fT,k1);
fSkinnedT.y = dot(g_fT,k2);
fSkinnedT.z = dot(g_fT,k3);
g_fT = fSkinnedT;
g_fSxT = g_fNormal;
}
}
void SmdSkinBone4( uniform bool bNeedNormal, uniform bool bNeedTangent ){
float4 k1,k2,k3;
int i1,i2,i3,i4;
i1 = D3DCOLORtoUBYTE4(g_fFixedUser1.x);
i2 = D3DCOLORtoUBYTE4(g_fFixedUser1.y);
i3 = D3DCOLORtoUBYTE4(g_fFixedUser1.z);
i4 = D3DCOLORtoUBYTE4(g_fFixedUser1.w);
k1 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 0 ];
k2 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 1 ];
k3 = g_fFixedUser0.x * arraySMDMatricies[ i1 + 2 ];
k1 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 0 ] + k1;
k2 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 1 ] + k2;
k3 = g_fFixedUser0.y * arraySMDMatricies[ i2 + 2 ] + k3;
k1 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 0 ] + k1;
k2 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 1 ] + k2;
k3 = g_fFixedUser0.z * arraySMDMatricies[ i3 + 2 ] + k3;
k1 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 0 ] + k1;
k2 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 1 ] + k2;
k3 = g_fFixedUser0.w * arraySMDMatricies[ i4 + 2 ] + k3;
float3 fPos;
fPos.x = dot(g_fVertexPosition,k1);
fPos.y = dot(g_fVertexPosition,k2);
fPos.z = dot(g_fVertexPosition,k3);
g_fVertexPosition.xyz = fPos;
if( bNeedNormal ){
float3 fSkinnedNormal;
fSkinnedNormal.x = dot(g_fNormal,k1);
fSkinnedNormal.y = dot(g_fNormal,k2);
fSkinnedNormal.z = dot(g_fNormal,k3);
g_fNormal = fSkinnedNormal;
}
if( bNeedTangent){
float3 fSkinnedS,fSkinnedT;
fSkinnedS.x = dot(g_fS,k1);
fSkinnedS.y = dot(g_fS,k2);
fSkinnedS.z = dot(g_fS,k3);
g_fS = fSkinnedS;
fSkinnedT.x = dot(g_fT,k1);
fSkinnedT.y = dot(g_fT,k2);
fSkinnedT.z = dot(g_fT,k3);
g_fT = fSkinnedT;
g_fSxT = g_fNormal;
}
}
void SmdMorff( uniform bool bSkinNormal, uniform bool bSkinTangent ){
float3 fPosition;
fPosition = lerp(g_fVertexPosition.xyz,g_fFixedUser0.xyz,arraySMDMorffCoeff.x);
fPosition = lerp(fPosition,g_fFixedUser1.xyz,arraySMDMorffCoeff.y);
g_fVertexPosition.xyz = lerp(fPosition,g_fFixedUser2.xyz,arraySMDMorffCoeff.z);
g_fVertexPosition.w = 1.0f;
if( bSkinNormal ){
g_fNormal = lerp(g_fNormal,g_fFixedUser3.xyz,arraySMDMorffCoeff.x);
g_fNormal = lerp(g_fNormal,g_fFixedUser4.xyz,arraySMDMorffCoeff.y);
g_fNormal = lerp(g_fNormal,g_fFixedUser5.xyz,arraySMDMorffCoeff.z);
}
if( bSkinTangent ){
float3 sxt = lerp(g_fS,g_fT.xyz,arraySMDMorffCoeff.x);
sxt = lerp(sxt,g_fSxT.xyz,arraySMDMorffCoeff.y);
g_fS = lerp(sxt,g_fFixedUser6.xyz,arraySMDMorffCoeff.z);
g_fSxT = g_fNormal;
g_fT = cross(g_fSxT,g_fS);
}
}
/*
Loop skinning for VS20 and higher
*/
void SmdSkinAllBones( uniform bool bSkinNormal, uniform bool bSkinTangent ){
float4 k1,k2,k3;
k1 = 0.0f;
k2 = 0.0f;
k3 = 0.0f;
for( int i =0; i < constINumBones; i++ ){
int index = D3DCOLORtoUBYTE4(g_fFixedUser1[i]);
k1 = g_fFixedUser0[i] * arraySMDMatricies[ index + 0 ] + k1;
k2 = g_fFixedUser0[i] * arraySMDMatricies[ index + 1 ] + k2;
k3 = g_fFixedUser0[i] * arraySMDMatricies[ index + 2 ] + k3;
}
float3 fPos;
fPos.x = dot(g_fVertexPosition,k1);
fPos.y = dot(g_fVertexPosition,k2);
fPos.z = dot(g_fVertexPosition,k3);
g_fVertexPosition.xyz = fPos;
if( bSkinNormal ){
float3 fSkinnedNormal;
fSkinnedNormal.x = dot(g_fNormal,k1);
fSkinnedNormal.y = dot(g_fNormal,k2);
fSkinnedNormal.z = dot(g_fNormal,k3);
g_fNormal = fSkinnedNormal;
}
if( bSkinTangent ){
float3 fSkinnedS,fSkinnedT,fSkinnedSxT;
fSkinnedS.x = dot(g_fS,k1);
fSkinnedS.y = dot(g_fS,k2);
fSkinnedS.z = dot(g_fS,k3);
g_fS = fSkinnedS;
fSkinnedT.x = dot(g_fT,k1);
fSkinnedT.y = dot(g_fT,k2);
fSkinnedT.z = dot(g_fT,k3);
g_fT = fSkinnedT;
g_fSxT = g_fNormal;
}
}
#define SMD_DISSOLVE_TOP arraySMDDissolveCoeff.x
#define SMD_DISSOLVE_BOTTOM_MIN_TOP arraySMDDissolveCoeff.y
inline void SMDLerpAlphHeight(){
g_fColor0.a = (SMD_DISSOLVE_TOP - g_fVertexPosition.y) / SMD_DISSOLVE_BOTTOM_MIN_TOP;
}
void SmdSkinAlphaBone1( uniform bool bNeedNormal, uniform bool bNeedTangent ){
SmdSkinBone1(bNeedNormal,bNeedTangent);
SMDLerpAlphHeight();
}
void SmdSkinAlphaBone2( uniform bool bNeedNormal, uniform bool bNeedTangent ){
SmdSkinBone2(bNeedNormal,bNeedTangent);
SMDLerpAlphHeight();
}
void SmdSkinAlphaBone3( uniform bool bNeedNormal, uniform bool bNeedTangent ){
SmdSkinBone3(bNeedNormal,bNeedTangent);
SMDLerpAlphHeight();
}
void SmdSkinAlphaBone4( uniform bool bNeedNormal, uniform bool bNeedTangent ){
SmdSkinBone4(bNeedNormal,bNeedTangent);
SMDLerpAlphHeight();
}
void SmdSkinAlphaAllBones( uniform bool bNeedNormal, uniform bool bNeedTangent ){
SmdSkinAllBones(bNeedNormal,bNeedTangent);
SMDLerpAlphHeight();
}
#endif //__SMD_FX__