aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/media/SampleRenderer/4/shaders/vertex/staticmesh_simple.cg
blob: e0ee877831add9b2fdfc4e939c8e84cda1241b38 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <config.cg>
#include <globals.cg>
#include <tessellation.cg>

VertexOut  vmain(__in(float4,      localSpacePosition, POSITION)
                 __in_opt(float3,  localSpaceNormal,   NORMAL)
                 __in_opt(float4,  localSpaceTangent,  SEMANTIC_TANGENT)
                 __in_opt(float4,  vertexTexcoord0,    TEXCOORD0)
                 __in_opt(float4,  vertexTexcoord1,    TEXCOORD1)
                 __in_opt(float4,  vertexTexcoord2,    TEXCOORD2)
                 __in_opt(float4,  vertexTexcoord3,    TEXCOORD3)
                 __in_opt(half4,   vertexColor,        COLOR)
               #if RENDERER_INSTANCED
                 , __in(float4,   instanceTCol0,        SEMANTIC_INSTANCE_T)
                 , __in(float4,   instanceTCol1,        SEMANTIC_INSTANCE_X)
                 , __in(float4,   instanceTCol2,        SEMANTIC_INSTANCE_Y)
                 , __in(float4,   instanceTCol3,        SEMANTIC_INSTANCE_Z)
                 __in_opt(float2, instanceUVOffset,    SEMANTIC_INSTANCE_UV)
                 __in_opt(float3, instanceLocalOffset, SEMANTIC_INSTANCE_LOCAL)
               #endif
               #if RENDERER_DISPLACED
                 __in_opt(uint,   vertexFlagsDisp,     SEMANTIC_DISPLACEMENT_FLAGS)
               #endif
                )
{
	VertexOut vout;

	float4x4 modelMatrix;
#if RENDERER_INSTANCED
	modelMatrix = mul(g_modelMatrix, transpose(float4x4(instanceTCol0, instanceTCol1, instanceTCol2, instanceTCol3)));
#else
	modelMatrix = g_modelMatrix;
#endif

	float4x4 mvm                   = mul(g_viewMatrix, modelMatrix);
	float4x4 mvpm                  = mul(g_projMatrix, mvm);
	vout.screenSpacePosition       = mul(mvpm, localSpacePosition);

	vout.params.worldSpacePosition = mul(modelMatrix, localSpacePosition).xyz;
	vout.params.worldSpaceNormal   = normalize(mul(modelMatrix, float4(localSpaceNormal,  0)).xyz);
	vout.params.worldSpaceTangent  = normalize(mul(modelMatrix, float4(localSpaceTangent.xyz, 0)).xyz);
	vout.params.worldSpaceBinormal = cross(vout.params.worldSpaceNormal, vout.params.worldSpaceTangent) * localSpaceTangent.w;

#if RENDERER_INSTANCED
	vout.params.texcoord0   = vertexTexcoord0 + float4(instanceUVOffset, 0, 0);
#else
	vout.params.texcoord0   = vertexTexcoord0;
#endif
	vout.params.texcoord1   = vertexTexcoord1;
	vout.params.texcoord2   = vertexTexcoord2;
#if !defined (RENDERER_WIN8ARM)		
	vout.params.texcoord3   = vertexTexcoord3;
#endif	
	vout.params.color       = vertexColor;

#if RENDERER_DISPLACED
	vout.localPosition       = localSpacePosition;
#if RENDERER_INSTANCED
	vout.localPosition      += instanceLocalOffset;
#endif
	vout.flagsDisp           = vertexFlagsDisp;
	vout.modelMatrix[0]      = modelMatrix[0];
	vout.modelMatrix[1]      = modelMatrix[1];
	vout.modelMatrix[2]      = modelMatrix[2];
	vout.modelMatrix[3]      = modelMatrix[3];
#endif

	return vout;
}