// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/ui/lib/escher/paper/paper_renderer_static_config.h"

namespace escher {
// List of all the shader paths used by PaperRenderer.
const std::vector<std::string> kPaperRendererShaderPaths = {
    "shaders/model_renderer/main.frag",
    "shaders/model_renderer/main.vert",
    "shaders/model_renderer/default_position.vert",
    "shaders/model_renderer/shadow_map_generation.frag",
    "shaders/model_renderer/shadow_map_lighting.frag",
    "shaders/model_renderer/wobble_position.vert",
    "shaders/paper/common/use.glsl",
    "shaders/paper/frag/main_ambient_light.frag",
    "shaders/paper/frag/main_point_light.frag",
    "shaders/paper/vert/compute_model_space_position.vert",
    "shaders/paper/vert/compute_world_space_position.vert",
    "shaders/paper/vert/main_shadow_volume_extrude.vert",
    "shaders/paper/vert/vertex_attributes.vert"};

const std::vector<std::string> kPaperRendererShaderSpirvPaths = {};

const ShaderProgramData kAmbientLightProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, "shaders/paper/frag/main_ambient_light.frag"}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_UV", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        // TODO(ES-153): currently required by main.vert.
        {"NO_SHADOW_LIGHTING_PASS", "1"},
    }),
};

const ShaderProgramData kNoLightingProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, "shaders/model_renderer/main.frag"}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_UV", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        // TODO(ES-153): currently required by main.vert.
        {"NO_SHADOW_LIGHTING_PASS", "1"},
    }),
};

const ShaderProgramData kPointLightProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, "shaders/paper/frag/main_point_light.frag"}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_UV", "1"},
        {"USE_PAPER_SHADER_POINT_LIGHT", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        {"SHADOW_VOLUME_POINT_LIGHTING", "1"},
    }),
};

const ShaderProgramData kPointLightFalloffProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, "shaders/paper/frag/main_point_light.frag"}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_UV", "1"},
        {"USE_PAPER_SHADER_POINT_LIGHT", "1"},
        {"USE_PAPER_SHADER_POINT_LIGHT_FALLOFF", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        {"SHADOW_VOLUME_POINT_LIGHTING", "1"},
    }),
};

const ShaderProgramData kShadowVolumeGeometryProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, ""}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_BLEND_WEIGHT_1", "1"},
        {"USE_PAPER_SHADER_POINT_LIGHT", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        {"SHADOW_VOLUME_EXTRUSION", "1"},
    }),
};

const ShaderProgramData kShadowVolumeGeometryDebugProgramData = {
    .source_files = {{ShaderStage::kVertex, "shaders/model_renderer/main.vert"},
                     {ShaderStage::kFragment, "shaders/model_renderer/main.frag"}},
    .args = ShaderVariantArgs({
        {"USE_ATTRIBUTE_BLEND_WEIGHT_1", "1"},
        {"USE_PAPER_SHADER_POINT_LIGHT", "1"},
        {"USE_PAPER_SHADER_PUSH_CONSTANTS", "1"},
        {"SHADOW_VOLUME_EXTRUSION", "1"},
    }),
};
}  // namespace escher
