flo_render 0.3.1

Streaming API for rendering graphics on hardware
Documentation
#include <metal_stdlib>

#import "./bindings/metal_vertex2d.h"
#import "rasterizer.metal"

vertex RasterizerData simple_vertex(
      uint        vertex_id [[ vertex_id ]],
      constant    matrix_float4x4 *transform      [[ buffer(VertexInputIndexMatrix )]],
      constant    MetalVertex2D   *vertices       [[ buffer(VertexInputIndexVertices) ]]) {
    uchar4 byte_color   = vertices[vertex_id].color;
    float4 color        = float4(byte_color[0], byte_color[1], byte_color[2], byte_color[3]);
    color[0]            /= 255.0;
    color[1]            /= 255.0;
    color[2]            /= 255.0;
    color[3]            /= 255.0;

    float4 position     = float4(vertices[vertex_id].pos[0], vertices[vertex_id].pos[1], 0.0, 1.0) * *transform;
    float2 tex_coord    = vertices[vertex_id].tex_coord;
    float2 paper_coord  = float2((position[0]+1.0)/2.0, 1.0-((position[1]+1.0)/2.0));

    RasterizerData data;

    data.v_Position     = position;
    data.v_Color        = color;
    data.v_TexCoord     = tex_coord;
    data.v_PaperCoord   = paper_coord;

    return data;
}

fragment float4 simple_fragment(
      RasterizerData in [[stage_in]]) {
    return in.v_Color;
}

fragment float4 simple_eraser_multisample_fragment(
      RasterizerData            in [[stage_in]],
      metal::texture2d_ms<half> eraser_texture [[ texture(FragmentIndexEraseTexture) ]]) {
    float4 color = apply_eraser(in.v_Color, in.v_PaperCoord, eraser_texture);
    return color;
}

fragment float4 simple_clip_mask_multisample_fragment(
      RasterizerData            in [[stage_in]],
      metal::texture2d_ms<half> clip_mask_texture [[ texture(FragmentIndexClipMaskTexture) ]]) {
    float4 color = apply_clip_mask(in.v_Color, in.v_PaperCoord, clip_mask_texture);
    return color;
}

fragment float4 simple_eraser_clip_mask_multisample_fragment(
      RasterizerData            in [[stage_in]],
      metal::texture2d_ms<half> eraser_texture [[ texture(FragmentIndexEraseTexture) ]],
      metal::texture2d_ms<half> clip_mask_texture [[ texture(FragmentIndexClipMaskTexture) ]]) {
    float4 color = apply_eraser(in.v_Color, in.v_PaperCoord, eraser_texture);
    color = apply_clip_mask(color, in.v_PaperCoord, clip_mask_texture);
    return color;
}