/////////////
// GLOBALS //
/////////////
cbuffer MatrixBuffer : register(b0)
{
	matrix knochenMatrix[128];
};

// The projection and view matrix
cbuffer Kamera : register(b1)
{
	matrix view;
	matrix projection;
}

//////////////                                                                          
// TYPEDEFS //                                                                          
//////////////                                                                          
struct VertexInputType
{
	float4 position : POSITION;
	float2 tex : TEXCOORD0;
	float3 normal : NORMAL;
	uint knochen : KNOCHEN_ID0;
	uint id : VERTEX_ID0;
};

struct PixelInputType
{
	float4 worldPos : POSITION;
	float4 position : SV_POSITION;
	float2 tex : TEXCOORD0;
	float3 normal : TEXCOORD1;
};

////////////////////////////////////////////////////////////////////////////////
// Vertex Shader                                                                
////////////////////////////////////////////////////////////////////////////////
PixelInputType TextureVertexShader(VertexInputType input)
{
	//return input;                                                                     
	PixelInputType output;
	output.normal = normalize(mul(input.normal, (float3x3)knochenMatrix[input.knochen]));

	// Change the position vector to be 4 units for proper matrix calculations.         
	input.position.w = 1.0f;

	// Store the texture coordinates for the pixel shader.                              
	output.tex = input.tex;

	// Calculate the position of the vertex against the world, view, and projection matrices. 
	output.worldPos = mul(input.position, knochenMatrix[input.knochen]);
	output.position = mul(output.worldPos, view);
	output.position = mul(output.position, projection);

	return output;
}