#include "common_vs_fxc.h" const float4x3 cModelView : register(SHADER_SPECIFIC_CONST_0); const float4x4 cProj : register(SHADER_SPECIFIC_CONST_3); // derivative of catmull rom spline courtesy of calc float4 DCatmullRomSpline ( float4 a, float4 b, float4 c, float4 d, float t ) { return 0.5 *( c - a + t * ( 2 * a - 5 * b + 4 * c - d + t * (3 * b - a - 3 * c + d ) ) + t * ( 2 * a - 5 * b + 4 * c - d + 2 * ( t * ( 3 * b - a - 3 * c + d ) ) ) ); } float3 DCatmullRomSpline3 ( float3 a, float3 b, float3 c, float3 d, float t ) { return 0.5 *( c - a + t * ( 2 * a - 5 * b + 4 * c - d + t * (3 * b - a - 3 * c + d ) ) + t * ( 2 * a - 5 * b + 4 * c - d + 2 * ( t * ( 3 * b - a - 3 * c + d ) ) ) ); } float4 CatmullRomSpline( float4 a, float4 b, float4 c, float4 d, float t ) { return b + 0.5 * t * ( c - a + t * ( 2 * a - 5 * b + 4 * c - d + t * ( -a + 3 * b -3 * c + d ) ) ); } struct VS_INPUT { // This is all of the stuff that we ever use. float4 vTint : COLOR; float4 vParms : POSITION; // T V side_id float4 vSplinePt0 : TEXCOORD0; // x y z rad float4 vSplinePt1 : TEXCOORD1; // x y z rad float4 vSplinePt2 : TEXCOORD2; // x y z rad float4 vSplinePt3 : TEXCOORD3; // x y z rad }; struct VS_OUTPUT { float4 projPos : POSITION; float2 texCoord0 : TEXCOORD0; float2 texCoord1 : TEXCOORD1; float4 argbcolor : COLOR; float4 blendfactor0 : TEXCOORD2; float4 vScreenPos : TEXCOORD7; }; VS_OUTPUT main( const VS_INPUT v ) { VS_OUTPUT o; float4 posrad = CatmullRomSpline( v.vSplinePt0, v.vSplinePt1, v.vSplinePt2, v.vSplinePt3, v.vParms.x ); float3 v2p = ( posrad.xyz - cEyePos ); float3 tangent=DCatmullRomSpline3( v.vSplinePt0, v.vSplinePt1, v.vSplinePt2, v.vSplinePt3, v.vParms.x ); float3 ofs = normalize( cross(v2p, normalize( tangent) ) ); posrad.xyz += ofs * ( posrad.w * ( v.vParms.z - .5 ) ); o.projPos = mul( float4(posrad.xyz, 1.0f), cViewProj ); o.texCoord0 = o.texCoord1 = float2( (1-v.vParms.z), v.vParms.y); o.argbcolor = v.vTint; o.blendfactor0 = float4(0,0,0,0); o.vScreenPos = float4(0,0,0,0); return o; }