aboutsummaryrefslogtreecommitdiff
path: root/source/Shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Shader.cpp')
-rw-r--r--source/Shader.cpp142
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;
+ }
+}