fyrox-impl 0.36.2

Feature-rich, easy-to-use, 2D/3D game engine with a scene editor. Like Godot, but in Rust.
Documentation
(
    name: "Standard2DShader",

    resources: [
        (
            name: "diffuseTexture",
            kind: Texture(kind: Sampler2D, fallback: White),
            binding: 0
        ),
        (
            name: "fyrox_instanceData",
            kind: PropertyGroup([
                // Autogenerated
            ]),
            binding: 0
        ),
        (
            name: "fyrox_lightData",
            kind: PropertyGroup([
                // Autogenerated
            ]),
            binding: 1
        ),
        (
            name: "fyrox_lightsBlock",
            kind: PropertyGroup([
                // Autogenerated
            ]),
            binding: 2
        ),
    ],

    passes: [
        (
            name: "Forward",
            draw_parameters: DrawParameters(
                cull_face: None,
                color_write: ColorMask(
                    red: true,
                    green: true,
                    blue: true,
                    alpha: true,
                ),
                depth_write: true,
                stencil_test: None,
                depth_test: Some(LessOrEqual),
                blend: Some(BlendParameters(
                    func: BlendFunc(
                        sfactor: SrcAlpha,
                        dfactor: OneMinusSrcAlpha,
                        alpha_sfactor: SrcAlpha,
                        alpha_dfactor: OneMinusSrcAlpha,
                    ),
                    equation: BlendEquation(
                        rgb: Add,
                        alpha: Add
                    )
                )),
                stencil_op: StencilOp(
                    fail: Keep,
                    zfail: Keep,
                    zpass: Keep,
                    write_mask: 0xFFFF_FFFF,
                ),
                scissor_box: None
            ),
            vertex_shader:
               r#"
                layout(location = 0) in vec3 vertexPosition;
                layout(location = 1) in vec2 vertexTexCoord;
                layout(location = 2) in vec4 vertexColor;

                out vec2 texCoord;
                out vec4 color;
                out vec3 fragmentPosition;

                void main()
                {
                    texCoord = vertexTexCoord;
                    fragmentPosition = (fyrox_instanceData.worldMatrix * vec4(vertexPosition, 1.0)).xyz;
                    gl_Position = fyrox_instanceData.worldViewProjection * vec4(vertexPosition, 1.0);
                    color = vertexColor;
                }
               "#,

           fragment_shader:
               r#"
                out vec4 FragColor;

                in vec2 texCoord;
                in vec4 color;
                in vec3 fragmentPosition;

                void main()
                {
                    vec3 lighting = fyrox_lightData.ambientLightColor.xyz;
                    for(int i = 0; i < min(fyrox_lightsBlock.lightCount, 16); ++i) {
                        // "Unpack" light parameters.
                        float halfHotspotAngleCos = fyrox_lightsBlock.lightsParameters[i].x;
                        float halfConeAngleCos = fyrox_lightsBlock.lightsParameters[i].y;
                        vec3 lightColor = fyrox_lightsBlock.lightsColorRadius[i].xyz;
                        float radius = fyrox_lightsBlock.lightsColorRadius[i].w;
                        vec3 lightPosition = fyrox_lightsBlock.lightsPosition[i];
                        vec3 direction = fyrox_lightsBlock.lightsDirection[i];

                        // Calculate lighting.
                        vec3 toFragment = fragmentPosition - lightPosition;
                        float distance = length(toFragment);
                        vec3 toFragmentNormalized = toFragment / distance;
                        float distanceAttenuation = S_LightDistanceAttenuation(distance, radius);
                        float spotAngleCos = dot(toFragmentNormalized, direction);
                        float directionalAttenuation = smoothstep(halfConeAngleCos, halfHotspotAngleCos, spotAngleCos);
                        lighting += lightColor * (distanceAttenuation * directionalAttenuation);
                    }

                    FragColor = vec4(lighting, 1.0) * color * S_SRGBToLinear(texture(diffuseTexture, texCoord));
                }
               "#,
        )
    ],
)