Program Listing for File materialBuilder.h

↰ Return to documentation for file (PrismEngine/src/materialBuilder.h)

#pragma once
#include <string>
#include <optional>
#include <vector>
#include <filesystem>
#include <array>
#include "scene.h"
#include "meshComponent.h"
#include "materialComponent.h"
#include "textureStorage.h"
#include "assetSpec.h"

namespace prism {
    namespace render {

        struct MaterialBuilder {

            struct MaterialData {
                std::optional<assets::AssetSpec> albedo;
                std::optional<assets::AssetSpec> normal;
                std::optional<assets::AssetSpec> metallic;
                std::optional<assets::AssetSpec> roughness;
                std::optional<assets::AssetSpec> ambient;
                std::optional<assets::AssetSpec> emission;
                std::optional<assets::AssetSpec> height;

                float metallicScalar = 1.0f;
                float roughnessScalar = 1.0f;
                float ambientScalar = 1.0f;
                float emissionScalar = 1.0f;
                float heightScalar = 1.0f;
            };

            std::vector<MaterialData> materialsData;

            float globalMetallicScalar = 1.0f;
            float globalRoughnessScalar = 1.0f;
            float globalEmissionScalar = 1.0f;
            float globalAmbientScalar = 1.0f;
            float globalHeightScalar = 1.0f;

            prism::scene::Scene& scene;
            prism::PGC::L1::TextureStorage& storage;

            MaterialBuilder(prism::scene::Scene& scene, prism::PGC::L1::TextureStorage& storage);


            MaterialBuilder& size(uint16_t size);

            MaterialBuilder& forMesh(prism::scene::MeshComponent& mesh);

            MaterialBuilder& forMesh(prism::scene::Entity entity);




            MaterialBuilder& copyAll(prism::scene::MaterialComponent material);

            MaterialBuilder& copy(prism::scene::MaterialComponent material, uint16_t subMaterialId);



            MaterialBuilder& albedo(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& albedo(uint16_t subMaterialId, std::array<unsigned char, 4> rgba);

            MaterialBuilder& normal(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& normal(uint16_t subMaterialId, std::array<unsigned char, 4> rgba);

            MaterialBuilder& mrao(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& mrao(uint16_t subMaterialId, std::array<unsigned char, 4> rgba);

            MaterialBuilder& mraoh(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& mraoh(uint16_t subMaterialId, std::array<unsigned char, 4> rgba);



            MaterialBuilder& metallic(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& metallic(uint16_t subMaterialId, float metallic);

            MaterialBuilder& metallic(float metallic);



            MaterialBuilder& roughness(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& roughness(uint16_t subMaterialId, float roughness);

            MaterialBuilder& roughness(float roughness);



            MaterialBuilder& ambientOcclusion(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& ambientOcclusion(uint16_t subMaterialId, float ambient);

            MaterialBuilder& ambientOcclusion(float ambient);



            MaterialBuilder& emission(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& emission(uint16_t subMaterialId, std::array<unsigned char, 4> rgba);

            MaterialBuilder& emission(uint16_t subMaterialId, float emission);

            MaterialBuilder& emission(float emission);



            MaterialBuilder& height(uint16_t subMaterialId, std::filesystem::path filename);

            MaterialBuilder& height(uint16_t subMaterialId, float height);

            MaterialBuilder& height(float height);


            prism::scene::MaterialComponent complete();
        };

    } // namespace render
} // namespace prism