render_engine 0.1.0-alpha.3

A Metal-based 3D rendering engine for macOS
#include <metal_stdlib>
using namespace metal;

#include "shader_types.h"

constant bool is_instanced [[function_constant(0)]];
constant bool use_vertex_color [[function_constant(1)]];

struct Uniforms {
    float4x4 viewProjectionMatrix;
    float4x4 modelMatrix;
};

struct InstanceData {
    float4x4 modelMatrix;
    float4 color;
};

vertex VertexOut vertex_main(
    VertexIn vertexIn [[stage_in]],
    constant Uniforms &uniforms [[buffer(1)]],
    constant InstanceData *instanceData [[buffer(2)]],
    uint vertexID [[vertex_id]],
    uint instanceID [[instance_id]]
) {
    VertexOut out;

    float4x4 modelMatrix;
    if (is_instanced) {
        modelMatrix = instanceData[instanceID].modelMatrix;
    } else {
        modelMatrix = uniforms.modelMatrix;
    }

    float4 worldPosition = modelMatrix * float4(vertexIn.position, 1.0);
    out.position = uniforms.viewProjectionMatrix * worldPosition;
    out.color = use_vertex_color ? vertexIn.color : (is_instanced ? instanceData[instanceID].color : float4(1.0));

    return out;
}