blob: 14e24805e875b88bdf836552db86460c6217b88a [file] [log] [blame]
#include <metal_stdlib>
using namespace metal;
template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
return lhs * vec<T, N>(rhs);
}
template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
return vec<T, M>(lhs) * rhs;
}
struct VertexInput {
float4 position;
float3 normal;
float4 tangent;
float2 texcoord;
uint4 joints;
float4 weights;
float4 instance0;
float4 instance1;
float4 instance2;
float4 instance3;
float4 instanceColor;
};
struct VertexOutput {
float4 position;
float3 worldPos;
float3 view;
float2 texcoord;
float2 texcoord2;
float4 color;
float4 instanceColor;
float3 normal;
float3 tangent;
float3 bitangent;
};
struct Camera {
/* 0x0000 */ float4x4 projection;
/* 0x0040 */ float4x4 inverseProjection;
/* 0x0080 */ float4x4 view;
/* 0x00c0 */ packed_float3 position;
/* 0x00cc */ float time;
/* 0x00d0 */ float2 outputSize;
/* 0x00d8 */ float zNear;
/* 0x00dc */ float zFar;
};
struct Joints {
/* 0x0000 */ float4x4 matrices[1];
};
struct tint_symbol_1 {
float4 position [[attribute(0)]];
float3 normal [[attribute(1)]];
float4 tangent [[attribute(2)]];
float2 texcoord [[attribute(3)]];
uint4 joints [[attribute(6)]];
float4 weights [[attribute(7)]];
float4 instance0 [[attribute(8)]];
float4 instance1 [[attribute(9)]];
float4 instance2 [[attribute(10)]];
float4 instance3 [[attribute(11)]];
float4 instanceColor [[attribute(12)]];
};
struct tint_symbol_2 {
float3 worldPos [[user(locn0)]];
float3 view [[user(locn1)]];
float2 texcoord [[user(locn2)]];
float2 texcoord2 [[user(locn3)]];
float4 color [[user(locn4)]];
float4 instanceColor [[user(locn5)]];
float3 normal [[user(locn6)]];
float3 tangent [[user(locn7)]];
float3 bitangent [[user(locn8)]];
float4 position [[position]];
};
float4x4 getInstanceMatrix(VertexInput input) {
return float4x4(input.instance0, input.instance1, input.instance2, input.instance3);
}
float4x4 getSkinMatrix(VertexInput input, const device Joints* const tint_symbol_4, const device Joints* const tint_symbol_5) {
float4x4 const joint0 = ((*(tint_symbol_4)).matrices[input.joints[0]] * (*(tint_symbol_5)).matrices[input.joints[0]]);
float4x4 const joint1 = ((*(tint_symbol_4)).matrices[input.joints[1]] * (*(tint_symbol_5)).matrices[input.joints[1]]);
float4x4 const joint2 = ((*(tint_symbol_4)).matrices[input.joints[2]] * (*(tint_symbol_5)).matrices[input.joints[2]]);
float4x4 const joint3 = ((*(tint_symbol_4)).matrices[input.joints[3]] * (*(tint_symbol_5)).matrices[input.joints[3]]);
float4x4 const skinMatrix = ((((joint0 * input.weights[0]) + (joint1 * input.weights[1])) + (joint2 * input.weights[2])) + (joint3 * input.weights[3]));
return skinMatrix;
}
VertexOutput vertexMain_inner(VertexInput input, const device Joints* const tint_symbol_6, const device Joints* const tint_symbol_7, const constant Camera* const tint_symbol_8) {
VertexOutput output = {};
float4x4 const modelMatrix = getSkinMatrix(input, tint_symbol_6, tint_symbol_7);
output.normal = normalize(float4(((modelMatrix * float4(input.normal, 0.0f)))).xyz);
output.tangent = normalize(float4(((modelMatrix * float4(float4(input.tangent).xyz, 0.0f)))).xyz);
output.bitangent = (cross(output.normal, output.tangent) * input.tangent[3]);
output.color = float4(1.0f);
output.texcoord = input.texcoord;
output.instanceColor = input.instanceColor;
float4 const modelPos = (modelMatrix * input.position);
output.worldPos = float4(modelPos).xyz;
output.view = ((*(tint_symbol_8)).position - float4(modelPos).xyz);
output.position = (((*(tint_symbol_8)).projection * (*(tint_symbol_8)).view) * modelPos);
return output;
}
vertex tint_symbol_2 vertexMain(const device Joints* tint_symbol_9 [[buffer(1)]], const device Joints* tint_symbol_10 [[buffer(2)]], const constant Camera* tint_symbol_11 [[buffer(0)]], tint_symbol_1 tint_symbol [[stage_in]]) {
VertexInput const tint_symbol_3 = {.position=tint_symbol.position, .normal=tint_symbol.normal, .tangent=tint_symbol.tangent, .texcoord=tint_symbol.texcoord, .joints=tint_symbol.joints, .weights=tint_symbol.weights, .instance0=tint_symbol.instance0, .instance1=tint_symbol.instance1, .instance2=tint_symbol.instance2, .instance3=tint_symbol.instance3, .instanceColor=tint_symbol.instanceColor};
VertexOutput const inner_result = vertexMain_inner(tint_symbol_3, tint_symbol_9, tint_symbol_10, tint_symbol_11);
tint_symbol_2 wrapper_result = {};
wrapper_result.position = inner_result.position;
wrapper_result.worldPos = inner_result.worldPos;
wrapper_result.view = inner_result.view;
wrapper_result.texcoord = inner_result.texcoord;
wrapper_result.texcoord2 = inner_result.texcoord2;
wrapper_result.color = inner_result.color;
wrapper_result.instanceColor = inner_result.instanceColor;
wrapper_result.normal = inner_result.normal;
wrapper_result.tangent = inner_result.tangent;
wrapper_result.bitangent = inner_result.bitangent;
return wrapper_result;
}