diff --git a/CMakeLists.txt b/CMakeLists.txt index efea014..6a83b8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,8 +114,8 @@ target_precompile_headers(Engine if(MSVC) set(_CRT_SECURE_NO_WARNINGS) - target_compile_options(Engine PUBLIC /Zi /MP14 /W4 /DEBUG "/WX-") - target_compile_options(Editor PUBLIC /Zi /MP14 /W4 /DEBUG "/WX-") + target_compile_options(Engine PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG "/WX-") + target_compile_options(Editor PUBLIC /std:c++20 /Zi /MP14 /W4 /DEBUG "/WX-") target_sources(Engine INTERFACE $ $ diff --git a/res/shaders/ForwardPlus.slang b/res/shaders/ForwardPlus.slang index 709c9d0..ecac115 100644 --- a/res/shaders/ForwardPlus.slang +++ b/res/shaders/ForwardPlus.slang @@ -63,6 +63,6 @@ float4 fragmentMain( PointLight pointLight = pointLights[j]; result += pointLight.illuminate(materialParams, brdf); } - return float4(result, 1.0f); + return float4(result + float3(0.4f, 0.4f, 0), 0.7f); } diff --git a/res/shaders/lib/BRDF.slang b/res/shaders/lib/BRDF.slang index 9bb21c1..0cc3c3a 100644 --- a/res/shaders/lib/BRDF.slang +++ b/res/shaders/lib/BRDF.slang @@ -8,11 +8,20 @@ interface IBRDF struct BlinnPhong : IBRDF { float3 baseColor; - float metallic = 0; - float3 normal = float3(0, 0, 1); - float specular = 0.5; - float roughness = 0.5; - float sheen = 1.f; + float metallic; + float3 normal; + float specular; + float roughness; + float sheen; + + __init() + { + metallic = 0; + normal = float3(0, 0, 1); + specular = 0.5; + roughness = 0.5; + sheen = 1; + } float3 evaluate(float3 viewDir_TS, float3 lightDir_TS, float3 lightColor) { diff --git a/src/Editor/main.cpp b/src/Editor/main.cpp index d20f463..3b953d2 100644 --- a/src/Editor/main.cpp +++ b/src/Editor/main.cpp @@ -19,7 +19,6 @@ extern AssetRegistry* instance; int main() { - std::string outputPath = "C:/Users/Dynamitos/TrackClearGame"; std::string cmakePath = "C:/Users/Dynamitos/TrackClearGame/cmake"; std::string gameName = "TrackClear"; diff --git a/src/Engine/Concepts.h b/src/Engine/Concepts.h index fab95fd..657c337 100644 --- a/src/Engine/Concepts.h +++ b/src/Engine/Concepts.h @@ -6,11 +6,11 @@ namespace Seele template concept invocable = std::invocable; -template -concept serializable = requires(const T t, Archive& a) +template +concept serializable = requires(const T& t, Archive& a) { t.save(a); -} && requires(T t, Archive& a) +} && requires(T& t, Archive& a) { t.load(a); }; diff --git a/src/Engine/Containers/Map.h b/src/Engine/Containers/Map.h index 249e858..8136b64 100644 --- a/src/Engine/Containers/Map.h +++ b/src/Engine/Containers/Map.h @@ -2,6 +2,8 @@ #include #include "Array.h" #include "Pair.h" +#include "Serialization/Serialization.h" + namespace Seele { template operator[](k) = v; + } + } private: void verifyTree() { diff --git a/src/Engine/Material/Material.cpp b/src/Engine/Material/Material.cpp index 4ebf122..8dd326d 100644 --- a/src/Engine/Material/Material.cpp +++ b/src/Engine/Material/Material.cpp @@ -54,7 +54,8 @@ void Material::save(ArchiveBuffer& buffer) const MaterialInterface::save(buffer); Serialization::save(buffer, materialName); Serialization::save(buffer, layout->getSetIndex()); - Serialization::save2(buffer, brdf); + Serialization::save(buffer, codeExpressions); + Serialization::save(buffer, brdf); const auto& bindings = layout->getBindings(); Serialization::save(buffer, bindings.size()); for (const auto& binding : bindings) @@ -74,7 +75,8 @@ void Material::load(ArchiveBuffer& buffer) Serialization::load(buffer, materialName); uint32 setIndex; Serialization::load(buffer, setIndex); - Serialization::load2(buffer, brdf); + Serialization::load(buffer, codeExpressions); + Serialization::load(buffer, brdf); uint64 numBindings; Serialization::load(buffer, numBindings); layout = graphics->createDescriptorLayout(); diff --git a/src/Engine/Material/ShaderExpression.cpp b/src/Engine/Material/ShaderExpression.cpp index 53cfaed..9440a35 100644 --- a/src/Engine/Material/ShaderExpression.cpp +++ b/src/Engine/Material/ShaderExpression.cpp @@ -6,13 +6,41 @@ using namespace Seele; +void ExpressionInput::save(ArchiveBuffer& buffer) const +{ + Serialization::save(buffer, source); + Serialization::save(buffer, type); +} + +void ExpressionInput::load(ArchiveBuffer& buffer) +{ + Serialization::load(buffer, source); + Serialization::load(buffer, type); +} + +void ExpressionOutput::save(ArchiveBuffer& buffer) const +{ + Serialization::save(buffer, name); + Serialization::save(buffer, type); +} + +void ExpressionOutput::load(ArchiveBuffer& buffer) +{ + Serialization::load(buffer, name); + Serialization::load(buffer, type); +} + void ShaderExpression::save(ArchiveBuffer& buffer) const { + Serialization::save(buffer, inputs); + Serialization::save(buffer, output); Serialization::save(buffer, key); } void ShaderExpression::load(ArchiveBuffer& buffer) { + Serialization::load(buffer, inputs); + Serialization::load(buffer, output); Serialization::load(buffer, key); } @@ -378,86 +406,13 @@ void SampleExpression::load(ArchiveBuffer& buffer) ShaderExpression::load(buffer); } -void Serialization::save(ArchiveBuffer& buffer, const PShaderExpression& parameter) +void MaterialNode::save(ArchiveBuffer& buffer) const { - Serialization::save(buffer, parameter->getIdentifier()); - parameter->save(buffer); + Serialization::save(buffer, profile); + Serialization::save(buffer, variables); } - -void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parameter) +void MaterialNode::load(ArchiveBuffer& buffer) { - uint64 identifier = 0; - Serialization::load(buffer, identifier); - switch (identifier) - { - case FloatParameter::IDENTIFIER: - parameter = new FloatParameter(); - break; - case VectorParameter::IDENTIFIER: - parameter = new VectorParameter(); - break; - case TextureParameter::IDENTIFIER: - parameter = new TextureParameter(); - break; - case SamplerParameter::IDENTIFIER: - parameter = new SamplerParameter(); - break; - case CombinedTextureParameter::IDENTIFIER: - parameter = new CombinedTextureParameter(); - break; - case ConstantExpression::IDENTIFIER: - parameter = new ConstantExpression(); - break; - case AddExpression::IDENTIFIER: - parameter = new AddExpression(); - break; - case SubExpression::IDENTIFIER: - parameter = new SubExpression(); - break; - case MulExpression::IDENTIFIER: - parameter = new MulExpression(); - break; - case SwizzleExpression::IDENTIFIER: - parameter = new SwizzleExpression(); - break; - case SampleExpression::IDENTIFIER: - parameter = new SampleExpression(); - break; - default: - throw std::runtime_error("Unknown Identifier"); - } - parameter->load(buffer); -} - -void Serialization::save(ArchiveBuffer& buffer, const PShaderParameter& parameter) -{ - Serialization::save(buffer, parameter->getIdentifier()); - parameter->save(buffer); -} - -void Serialization::load(ArchiveBuffer& buffer, PShaderParameter& parameter) -{ - uint64 identifier = 0; - Serialization::load(buffer, identifier); - switch (identifier) - { - case FloatParameter::IDENTIFIER: - parameter = new FloatParameter(); - break; - case VectorParameter::IDENTIFIER: - parameter = new VectorParameter(); - break; - case TextureParameter::IDENTIFIER: - parameter = new TextureParameter(); - break; - case SamplerParameter::IDENTIFIER: - parameter = new SamplerParameter(); - break; - case CombinedTextureParameter::IDENTIFIER: - parameter = new CombinedTextureParameter(); - break; - default: - throw std::runtime_error("Unknown Identifier"); - } - parameter->load(buffer); + Serialization::load(buffer, profile); + Serialization::load(buffer, variables); } \ No newline at end of file diff --git a/src/Engine/Material/ShaderExpression.h b/src/Engine/Material/ShaderExpression.h index 68a92cf..ccdeb88 100644 --- a/src/Engine/Material/ShaderExpression.h +++ b/src/Engine/Material/ShaderExpression.h @@ -20,11 +20,15 @@ struct ExpressionInput { int source; ExpressionType type = ExpressionType::UNKNOWN; + void save(ArchiveBuffer& buffer) const; + void load(ArchiveBuffer& buffer); }; struct ExpressionOutput { std::string name; ExpressionType type = ExpressionType::UNKNOWN; + void save(ArchiveBuffer& buffer) const; + void load(ArchiveBuffer& buffer); }; DECLARE_REF(ShaderExpression); struct ShaderExpression @@ -206,17 +210,97 @@ struct MaterialNode std::string profile; Map variables; MaterialNode() {} - virtual ~MaterialNode() {} - virtual std::string evaluate() const { return ""; } + ~MaterialNode() {} void save(ArchiveBuffer& buffer) const; void load(ArchiveBuffer& buffer); }; -DEFINE_REF(MaterialNode) -namespace Serialization +template<> +static void Serialization::save(ArchiveBuffer& buffer, const PShaderExpression& parameter) { - void save(ArchiveBuffer& buffer, const PShaderExpression& parameter); - void load(ArchiveBuffer& buffer, PShaderExpression& parameter); - void save(ArchiveBuffer& buffer, const PShaderParameter& parameter); - void load(ArchiveBuffer& buffer, PShaderParameter& parameter); -} // namespace Serialization + Serialization::save(buffer, parameter->getIdentifier()); + parameter->save(buffer); +} + +template<> +static void Serialization::load(ArchiveBuffer& buffer, PShaderExpression& parameter) +{ + uint64 identifier = 0; + Serialization::load(buffer, identifier); + switch (identifier) + { + case FloatParameter::IDENTIFIER: + parameter = new FloatParameter(); + break; + case VectorParameter::IDENTIFIER: + parameter = new VectorParameter(); + break; + case TextureParameter::IDENTIFIER: + parameter = new TextureParameter(); + break; + case SamplerParameter::IDENTIFIER: + parameter = new SamplerParameter(); + break; + case CombinedTextureParameter::IDENTIFIER: + parameter = new CombinedTextureParameter(); + break; + case ConstantExpression::IDENTIFIER: + parameter = new ConstantExpression(); + break; + case AddExpression::IDENTIFIER: + parameter = new AddExpression(); + break; + case SubExpression::IDENTIFIER: + parameter = new SubExpression(); + break; + case MulExpression::IDENTIFIER: + parameter = new MulExpression(); + break; + case SwizzleExpression::IDENTIFIER: + parameter = new SwizzleExpression(); + break; + case SampleExpression::IDENTIFIER: + parameter = new SampleExpression(); + break; + default: + throw std::runtime_error("Unknown Identifier"); + } + parameter->load(buffer); +} + +template<> +static void Serialization::save(ArchiveBuffer& buffer, const PShaderParameter& parameter) +{ + Serialization::save(buffer, parameter->getIdentifier()); + parameter->save(buffer); +} + +template<> +static void Serialization::load(ArchiveBuffer& buffer, PShaderParameter& parameter) +{ + uint64 identifier = 0; + Serialization::load(buffer, identifier); + switch (identifier) + { + case FloatParameter::IDENTIFIER: + parameter = new FloatParameter(); + break; + case VectorParameter::IDENTIFIER: + parameter = new VectorParameter(); + break; + case TextureParameter::IDENTIFIER: + parameter = new TextureParameter(); + break; + case SamplerParameter::IDENTIFIER: + parameter = new SamplerParameter(); + break; + case CombinedTextureParameter::IDENTIFIER: + parameter = new CombinedTextureParameter(); + break; + default: + throw std::runtime_error("Unknown Identifier"); + } + parameter->load(buffer); +} + +DEFINE_REF(MaterialNode) } // namespace Seele diff --git a/src/Engine/Math/Vector.h b/src/Engine/Math/Vector.h index e810180..21f0494 100644 --- a/src/Engine/Math/Vector.h +++ b/src/Engine/Math/Vector.h @@ -8,7 +8,7 @@ #include #pragma warning(pop) #include -#include "Serialization/ArchiveBuffer.h" +#include "Serialization/Serialization.h" namespace Seele { diff --git a/src/Engine/Serialization/ArchiveBuffer.h b/src/Engine/Serialization/ArchiveBuffer.h index 1ac820c..20ed243 100644 --- a/src/Engine/Serialization/ArchiveBuffer.h +++ b/src/Engine/Serialization/ArchiveBuffer.h @@ -33,151 +33,4 @@ private: uint64 position = 0; Array memory; }; -namespace Serialization -{ - template - static void save(ArchiveBuffer& buffer, const T& type) - { - buffer.writeBytes(&type, sizeof(type)); - } - template - static void load(ArchiveBuffer& buffer, T& type) - { - buffer.readBytes(&type, sizeof(type)); - } - template - static void save(ArchiveBuffer& buffer, const T& type) - { - buffer.writeBytes(&type, sizeof(type)); - } - template - static void load(ArchiveBuffer& buffer, T& type) - { - buffer.readBytes(&type, sizeof(type)); - } - template - static void save(ArchiveBuffer& buffer, const T& type) - { - buffer.writeBytes(&type, sizeof(type)); - } - template - static void load(ArchiveBuffer& buffer, T& type) - { - buffer.readBytes(&type, sizeof(type)); - } - template - static void save2(ArchiveBuffer& buffer, const T& type) requires(serializable) - { - type.save(buffer); - } - template - static void load2(ArchiveBuffer& buffer, T& type) requires(serializable) - { - type.load(buffer); - } - //template - //static void save(ArchiveBuffer& buffer, const T& type) - //{ - // type->save(buffer); - //} - //template - //static void load(ArchiveBuffer& buffer, T& type) - //{ - // type->load(buffer); - //} - static void save(ArchiveBuffer& buffer, const std::string& type) - { - uint64 length = type.size(); - buffer.writeBytes(&length, sizeof(uint64)); - buffer.writeBytes(type.data(), type.size() * sizeof(char)); - } - static void load(ArchiveBuffer& buffer, std::string& type) - { - uint64 length = 0; - buffer.readBytes(&length, sizeof(uint64)); - type.resize(length); - buffer.readBytes(type.data(), length * sizeof(char)); - } - //template - //static void save(ArchiveBuffer& buffer, const RefPtr& ptr) - //{ - // Serialization::save(buffer, *ptr.getHandle()); - //} - //template - //static void load(ArchiveBuffer& buffer, RefPtr& ptr) - //{ - // Serialization::load(buffer, *ptr.getHandle()); - //} - template - static void save(ArchiveBuffer& buffer, const Array& type) - { - uint64 length = type.size(); - buffer.writeBytes(&length, sizeof(uint64)); - buffer.writeBytes(type.data(), sizeof(T) * type.size()); - } - template - static void load(ArchiveBuffer& buffer, Array& type) - { - uint64 length = 0; - buffer.readBytes(&length, sizeof(uint64)); - type.resize(length); - buffer.readBytes(type.data(), sizeof(T) * type.size()); - } - template - static void save(ArchiveBuffer& buffer, const Array& type) - { - uint64 length = type.size(); - buffer.writeBytes(&length, sizeof(uint64)); - buffer.writeBytes(type.data(), sizeof(T) * type.size()); - } - template - static void load(ArchiveBuffer& buffer, Array& type) - { - uint64 length = 0; - buffer.readBytes(&length, sizeof(uint64)); - type.resize(length); - buffer.readBytes(type.data(), sizeof(T) * type.size()); - } - template - static void save(ArchiveBuffer& buffer, const StaticArray& type) - { - buffer.writeBytes(type.data(), sizeof(T) * N); - } - template - static void load(ArchiveBuffer& buffer, StaticArray& type) - { - buffer.readBytes(type.data(), sizeof(T) * N); - } - template - static void save(ArchiveBuffer& buffer, const StaticArray& type) - { - buffer.writeBytes(type.data(), sizeof(T) * N); - } - template - static void load(ArchiveBuffer& buffer, StaticArray& type) - { - buffer.readBytes(type.data(), sizeof(T) * N); - } - template - static void save(ArchiveBuffer& buffer, const Array& type) requires (!std::is_integral_v && !std::is_floating_point_v) - { - uint64 length = type.size(); - buffer.writeBytes(&length, sizeof(uint64)); - for (const auto& x : type) - { - save(buffer, x); - } - } - template - static void load(ArchiveBuffer& buffer, Array& type) - { - uint64 length = 0; - buffer.readBytes(&length, sizeof(uint64)); - type.resize(length); - for (auto& x : type) - { - load(buffer, x); - } - } -} // namespace Serialization } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Serialization/CMakeLists.txt b/src/Engine/Serialization/CMakeLists.txt index 13d9b13..de25c58 100644 --- a/src/Engine/Serialization/CMakeLists.txt +++ b/src/Engine/Serialization/CMakeLists.txt @@ -1,9 +1,11 @@ target_sources(Engine PRIVATE ArchiveBuffer.h - ArchiveBuffer.cpp) + ArchiveBuffer.cpp + Serialization.h) target_sources(Engine PUBLIC FILE_SET HEADERS FILES - ArchiveBuffer.h) \ No newline at end of file + ArchiveBuffer.h + Serialization.h) \ No newline at end of file diff --git a/src/Engine/Serialization/Serialization.h b/src/Engine/Serialization/Serialization.h new file mode 100644 index 0000000..2481979 --- /dev/null +++ b/src/Engine/Serialization/Serialization.h @@ -0,0 +1,112 @@ +#pragma once +#include "ArchiveBuffer.h" + +namespace Seele +{ +namespace Serialization +{ + template + static void save(ArchiveBuffer& buffer, const T& type) + { + buffer.writeBytes(&type, sizeof(type)); + } + template + static void load(ArchiveBuffer& buffer, T& type) + { + buffer.readBytes(&type, sizeof(type)); + } + template + static void save(ArchiveBuffer& buffer, const T& type) + { + buffer.writeBytes(&type, sizeof(type)); + } + template + static void load(ArchiveBuffer& buffer, T& type) + { + buffer.readBytes(&type, sizeof(type)); + } + template + static void save(ArchiveBuffer& buffer, const T& type) + { + buffer.writeBytes(&type, sizeof(type)); + } + template + static void load(ArchiveBuffer& buffer, T& type) + { + buffer.readBytes(&type, sizeof(type)); + } + template + static void save(ArchiveBuffer& buffer, const T& type) requires(serializable) + { + type.save(buffer); + } + template + static void load(ArchiveBuffer& buffer, T& type) requires(serializable) + { + type.load(buffer); + } + template + static void save(ArchiveBuffer& buffer, const RefPtr& ptr); + template + static void load(ArchiveBuffer& buffer, RefPtr& ptr); + static void save(ArchiveBuffer& buffer, const std::string& type) + { + uint64 length = type.size(); + buffer.writeBytes(&length, sizeof(uint64)); + buffer.writeBytes(type.data(), type.size() * sizeof(char)); + } + static void load(ArchiveBuffer& buffer, std::string& type) + { + uint64 length = 0; + buffer.readBytes(&length, sizeof(uint64)); + type.resize(length); + buffer.readBytes(type.data(), length * sizeof(char)); + } + template + static void save(ArchiveBuffer& buffer, const Array& type) requires (std::is_integral_v || std::is_floating_point_v) + { + uint64 length = type.size(); + buffer.writeBytes(&length, sizeof(uint64)); + buffer.writeBytes(type.data(), sizeof(T) * type.size()); + } + template + static void load(ArchiveBuffer& buffer, Array& type) requires (std::is_integral_v || std::is_floating_point_v) + { + uint64 length = 0; + buffer.readBytes(&length, sizeof(uint64)); + type.resize(length); + buffer.readBytes(type.data(), sizeof(T) * type.size()); + } + template + static void save(ArchiveBuffer& buffer, const StaticArray& type) requires (std::is_integral_v || std::is_floating_point_v) + { + buffer.writeBytes(type.data(), sizeof(T) * N); + } + template + static void load(ArchiveBuffer& buffer, StaticArray& type) requires (std::is_integral_v || std::is_floating_point_v) + { + buffer.readBytes(type.data(), sizeof(T) * N); + } + template + static void save(ArchiveBuffer& buffer, const Array& type) + { + uint64 length = type.size(); + buffer.writeBytes(&length, sizeof(uint64)); + for (const auto& x : type) + { + save(buffer, x); + } + } + template + static void load(ArchiveBuffer& buffer, Array& type) + { + uint64 length = 0; + buffer.readBytes(&length, sizeof(uint64)); + type.resize(length); + for (auto& x : type) + { + load(buffer, x); + } + } +} // namespace Serialization +} // namespace Seele \ No newline at end of file