diff options
author | hnOsmium0001 <[email protected]> | 2022-04-09 13:29:41 -0700 |
---|---|---|
committer | hnOsmium0001 <[email protected]> | 2022-04-09 13:29:41 -0700 |
commit | 906557f094e407ce21d429ef647bc75fe3179cf1 (patch) | |
tree | 5e6aaed6537a0328318b6cd6561f6a76bf8aa27d /source/Shader.cpp | |
parent | e47a98793e58a5dbbe76bfed27e59408e43538e4 (diff) |
More work on editor
Diffstat (limited to 'source/Shader.cpp')
-rw-r--r-- | source/Shader.cpp | 142 |
1 files changed, 58 insertions, 84 deletions
diff --git a/source/Shader.cpp b/source/Shader.cpp index 72b679e..a2d1c97 100644 --- a/source/Shader.cpp +++ b/source/Shader.cpp @@ -1,34 +1,27 @@ #include "Shader.hpp" +#include "AppConfig.hpp" #include "ScopeGuard.hpp" +#include "Utils.hpp" +#include <imgui.h> #include <cstddef> -#include <fstream> -#include <iostream> -#include <sstream> +#include <cstdlib> +#include <filesystem> #include <utility> +namespace fs = std::filesystem; using namespace std::literals::string_literals; using namespace std::literals::string_view_literals; +void ShaderDetails::ShowInspector() { +} + Shader::~Shader() { glDeleteProgram(mHandle); } namespace ProjectBrussel_UNITY_ID { -Shader::ErrorCode LoadFile(std::string& out, const char* filePath) { - std::ifstream ifs(filePath); - if (!ifs) { - return Shader::FileIOFailed; - } - - std::stringstream buf; - buf << ifs.rdbuf(); - out = buf.str(); - - return Shader::Success; -} - // Grabs section [begin, end) Shader::ErrorCode CreateShader(GLuint& out, const char* src, int beginIdx, int endIdx, GLenum type) { out = glCreateShader(type); @@ -135,69 +128,6 @@ Shader::ErrorCode Shader::InitFromSources(const ShaderSources& sources) { return Success; } -Shader::ErrorCode Shader::InitFromFiles(const ShaderFilePaths& files) { - using namespace ProjectBrussel_UNITY_ID; - - if (IsValid()) { - return ShaderAlreadyCreated; - } - - GLuint program = glCreateProgram(); - ScopeGuard sg = [&]() { glDeleteProgram(program); }; - - GLuint vertex = 0; - DEFER { glDeleteShader(vertex); }; - if (files.vertex) { - std::string src; - CATCH_ERROR(LoadFile(src, files.vertex)); - CATCH_ERROR(CreateShader(vertex, src, GL_VERTEX_SHADER)); - glAttachShader(program, vertex); - } - - GLuint geometry = 0; - DEFER { glDeleteShader(geometry); }; - if (files.geometry) { - std::string src; - CATCH_ERROR(LoadFile(src, files.geometry)); - CATCH_ERROR(CreateShader(geometry, src, GL_GEOMETRY_SHADER)); - glAttachShader(program, geometry); - } - - GLuint tessControl = 0; - DEFER { glDeleteShader(tessControl); }; - if (files.tessControl) { - std::string src; - CATCH_ERROR(LoadFile(src, files.tessControl)); - CATCH_ERROR(CreateShader(tessControl, src, GL_TESS_CONTROL_SHADER)); - glAttachShader(program, tessControl); - } - - GLuint tessEval = 0; - DEFER { glDeleteShader(tessEval); }; - if (files.tessEval) { - std::string src; - CATCH_ERROR(LoadFile(src, files.tessEval)); - CATCH_ERROR(CreateShader(tessEval, src, GL_TESS_EVALUATION_SHADER)); - glAttachShader(program, tessEval); - } - - GLuint fragment = 0; - DEFER { glDeleteShader(fragment); }; - if (files.fragment) { - std::string src; - CATCH_ERROR(LoadFile(src, files.fragment)); - CATCH_ERROR(CreateShader(fragment, src, GL_FRAGMENT_SHADER)); - glAttachShader(program, fragment); - } - - CATCH_ERROR(LinkShaderProgram(program)); - - sg.Dismiss(); - mHandle = program; - - return Success; -} - Shader::ErrorCode Shader::InitFromSource(std::string_view source) { using namespace ProjectBrussel_UNITY_ID; @@ -315,14 +245,17 @@ Shader::ErrorCode Shader::InitFromSource(std::string_view source) { return Success; } -Shader::ErrorCode Shader::InitFromFile(const char* filePath) { - std::string src; - CATCH_ERROR(ProjectBrussel_UNITY_ID::LoadFile(src, filePath)); +#undef CATCH_ERROR - return InitFromSource(src); +void Shader::GatherDetailsIfAbsent() { + if (mDetails) return; + + mDetails = std::make_unique<ShaderDetails>(); } -#undef CATCH_ERROR +const ShaderDetails* Shader::GetDetails() const { + return mDetails.get(); +} GLuint Shader::GetProgram() const { return mHandle; @@ -331,3 +264,44 @@ GLuint Shader::GetProgram() const { bool Shader::IsValid() const { return mHandle != 0; } + +void ShaderManager::DiscoverShaders() { + mShaders.clear(); + + auto path = AppConfig::assetDirPath / "Shaders"; + for (auto& item : fs::directory_iterator(path)) { + if (item.is_regular_file() && item.path().extension() == ".glsl") { + auto file = Utils::OpenCstdioFile(item.path(), Utils::Read); + if (!file) continue; + + fseek(file, 0, SEEK_END); + auto fileSize = ftell(file); + rewind(file); + + // Also add \0 ourselves + auto buffer = std::make_unique<char[]>(fileSize + 1); + fread(buffer.get(), fileSize, 1, file); + fclose(file); + buffer[fileSize] = '\0'; + std::string_view source(buffer.get(), fileSize); + + RcPtr shader(new Shader()); + auto err = shader->InitFromSource(source); + if (err != Shader::Success) { + continue; + } + + auto shaderName = item.path().stem().string(); + mShaders.insert(shaderName, std::move(shader)); + } + } +} + +Shader* ShaderManager::FindShader(std::string_view name) { + auto iter = mShaders.find(name); + if (iter != mShaders.end()) { + return iter.value().Get(); + } else { + return nullptr; + } +} |