int StyleUVW ; // 0 = specular reflection, 1 = diffuse reflection, 2 = use model vertex coordinates for uvw.
float4x4 WorldViewProj;
float4x4 World;
float3 CameraPos;

// Vertex Shader
void VS( 
	in float4 VPos	: POSITION,
	in float3 VNorm	: NORMAL,
	in float3 VTex  : TEXCOORD0,
	out float4 outPos	: POSITION,
	out float4 outTex	: TEXCOORD0 )
{
	// vertex position from model-space to view-space
    outPos = mul( VPos, WorldViewProj );
	
	if ( StyleUVW == 0 )
	{
		// create ray from camera position to the vertex, in world space
		float4 worldPos = mul(float4(VPos.x, VPos.y, VPos.z, 1.0), World);
		float3 view = CameraPos - worldPos.xyz;
		
		float4 normWorld = normalize(mul(float4(VNorm.x, VNorm.y, VNorm.z, 0.0), World));	// TODO: when objects are scaled non-uniform we need to multiply by WorldInverseTranspose instead
		
		// compute the reflection vector, and assign it to texcoord 0		
		outTex.xyz = reflect( -normalize(view), normWorld.xyz );
	}
	else if ( StyleUVW == 1 )
	{
		// just use the normal for the reflection vector
		outTex.xyz = normalize(VNorm);
	}
	else if ( StyleUVW == 2 )
	{
		// use vertex-coordinates for texture coordinates
		outTex.xyz = VPos.xyz;
	}
}