|
|
@@ -1,6 +1,6 @@
|
|
|
////////////////////////////////////////////////
|
|
|
//gl32 --Vlad Luta --
|
|
|
-//built on 2022-11-14
|
|
|
+//built on 2022-11-18
|
|
|
////////////////////////////////////////////////
|
|
|
|
|
|
#include "gl3d.h"
|
|
|
@@ -23766,7 +23766,6 @@ namespace tinygltf
|
|
|
//#include <cassert>
|
|
|
#ifndef TINYGLTF_NO_FS
|
|
|
#include <cstdio>
|
|
|
-#include <fstream>
|
|
|
#endif
|
|
|
#include <sstream>
|
|
|
|
|
|
@@ -25110,9 +25109,15 @@ namespace tinygltf
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+ //removed default write
|
|
|
+
|
|
|
bool ReadWholeFile(std::vector<unsigned char> *out, std::string *err,
|
|
|
const std::string &filepath, void *)
|
|
|
{
|
|
|
+ assert(0);
|
|
|
+
|
|
|
+ /*
|
|
|
+
|
|
|
#ifdef TINYGLTF_ANDROID_LOAD_FROM_ASSETS
|
|
|
if (asset_manager)
|
|
|
{
|
|
|
@@ -25204,11 +25209,19 @@ namespace tinygltf
|
|
|
|
|
|
return true;
|
|
|
#endif
|
|
|
+
|
|
|
+ */
|
|
|
+ return false;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+ //removed writing data
|
|
|
+
|
|
|
bool WriteWholeFile(std::string *err, const std::string &filepath,
|
|
|
const std::vector<unsigned char> &contents, void *)
|
|
|
{
|
|
|
+ assert(0);
|
|
|
+ /*
|
|
|
#ifdef _WIN32
|
|
|
#if defined(__GLIBCXX__) // mingw
|
|
|
int file_descriptor = _wopen(UTF8ToWchar(filepath).c_str(),
|
|
|
@@ -25243,7 +25256,7 @@ namespace tinygltf
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+ */
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -29683,9 +29696,14 @@ namespace tinygltf
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //removed writing data
|
|
|
+
|
|
|
static bool SerializeGltfBufferData(const std::vector<unsigned char> &data,
|
|
|
const std::string &binFilename)
|
|
|
{
|
|
|
+ assert(0);
|
|
|
+
|
|
|
+ /*
|
|
|
#ifdef _WIN32
|
|
|
#if defined(__GLIBCXX__) // mingw
|
|
|
int file_descriptor = _wopen(UTF8ToWchar(binFilename).c_str(),
|
|
|
@@ -29716,6 +29734,7 @@ namespace tinygltf
|
|
|
// size 0 will be still valid buffer data.
|
|
|
// write empty file.
|
|
|
}
|
|
|
+ */
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -30795,9 +30814,14 @@ namespace tinygltf
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ //removed writing data
|
|
|
+
|
|
|
static bool WriteGltfFile(const std::string &output,
|
|
|
const std::string &content)
|
|
|
{
|
|
|
+ assert(0);
|
|
|
+
|
|
|
+ /*
|
|
|
#ifdef _WIN32
|
|
|
#if defined(_MSC_VER)
|
|
|
std::ofstream gltfFile(UTF8ToWchar(output).c_str());
|
|
|
@@ -30817,6 +30841,8 @@ namespace tinygltf
|
|
|
if (!gltfFile.is_open()) return false;
|
|
|
#endif
|
|
|
return WriteGltfStream(gltfFile, content);
|
|
|
+ */
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void WriteBinaryGltfStream(std::ostream &stream,
|
|
|
@@ -30889,10 +30915,15 @@ namespace tinygltf
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //removed writing data
|
|
|
+
|
|
|
static void WriteBinaryGltfFile(const std::string &output,
|
|
|
const std::string &content,
|
|
|
const std::vector<unsigned char> &binBuffer)
|
|
|
{
|
|
|
+ assert(0);
|
|
|
+
|
|
|
+ /*
|
|
|
#ifdef _WIN32
|
|
|
#if defined(_MSC_VER)
|
|
|
std::ofstream gltfFile(UTF8ToWchar(output).c_str(), std::ios::binary);
|
|
|
@@ -30909,6 +30940,7 @@ namespace tinygltf
|
|
|
std::ofstream gltfFile(output.c_str(), std::ios::binary);
|
|
|
#endif
|
|
|
WriteBinaryGltfStream(gltfFile, content, binBuffer);
|
|
|
+ */
|
|
|
}
|
|
|
|
|
|
bool TinyGLTF::WriteGltfSceneToStream(Model *model, std::ostream &stream,
|
|
|
@@ -31261,6 +31293,21 @@ void gl3d::defaultErrorCallback(std::string err, void *userData)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+std::string gl3d::defaultReadEntireFile(const char* fileName, bool &couldNotOpen, void *userData)
|
|
|
+{
|
|
|
+ return "";
|
|
|
+}
|
|
|
+
|
|
|
+std::vector<char> gl3d::defaultReadEntireFileBinary(const char *fileName, bool &couldNotOpen, void *userData)
|
|
|
+{
|
|
|
+ return {};
|
|
|
+}
|
|
|
+
|
|
|
+bool gl3d::defaultFileExists(const char *fileName, void *userData)
|
|
|
+{
|
|
|
+ return {};
|
|
|
+}
|
|
|
+
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
|
@@ -31286,12 +31333,19 @@ void gl3d::defaultErrorCallback(std::string err, void *userData)
|
|
|
namespace gl3d
|
|
|
{
|
|
|
|
|
|
- std::string GpuTexture::loadTextureFromFile(const char *file, int quality, int channels)
|
|
|
+ std::string GpuTexture::loadTextureFromFile(const char *file, FileOpener &fileOpener, int quality, int channels)
|
|
|
{
|
|
|
-
|
|
|
- int w, h, nrChannels;
|
|
|
+
|
|
|
+ bool couldNotOpen = 0;
|
|
|
+ auto content = fileOpener.binary(file, couldNotOpen);
|
|
|
+ if (couldNotOpen)
|
|
|
+ {
|
|
|
+ return std::string("Could not open file: ") + file;
|
|
|
+ }
|
|
|
+
|
|
|
+ int w=0, h=0, nrChannels=0;
|
|
|
stbi_set_flip_vertically_on_load(true);
|
|
|
- unsigned char *data = stbi_load(file, &w, &h, &nrChannels, channels);
|
|
|
+ unsigned char *data = stbi_load_from_memory((unsigned char*)content.data(), content.size(), &w, &h, &nrChannels, channels);
|
|
|
|
|
|
if (!data)
|
|
|
{
|
|
|
@@ -31701,7 +31755,7 @@ namespace gl3d
|
|
|
#pragma region Shader
|
|
|
#define GL3D_LOAD_SHADERS_FROM_HEADER_ONLY
|
|
|
|
|
|
-#include <fstream>
|
|
|
+
|
|
|
#include <unordered_map>
|
|
|
|
|
|
namespace gl3d
|
|
|
@@ -34096,7 +34150,7 @@ namespace gl3d
|
|
|
|
|
|
};
|
|
|
|
|
|
- GLint createShaderFromFile(const char* source, GLenum shaderType, ErrorReporter &errorReporter)
|
|
|
+ GLint createShaderFromFile(const char* source, GLenum shaderType, ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
std::string newFileName;
|
|
|
std::string strSource = source;
|
|
|
@@ -34122,46 +34176,31 @@ namespace gl3d
|
|
|
|
|
|
#else
|
|
|
|
|
|
- GLint createShaderFromFile(const char* source, GLenum shaderType, ErrorReporter &errorReporter)
|
|
|
+ GLint createShaderFromFile(const char* name, GLenum shaderType, ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
- std::ifstream file;
|
|
|
- file.open(source);
|
|
|
+ bool err = 0;
|
|
|
+ auto fileContent = fileOpener(name, err);
|
|
|
|
|
|
- if (!file.is_open())
|
|
|
+ if (err)
|
|
|
{
|
|
|
- errorReporter.callErrorCallback(std::string("Error openning file: ") + source);
|
|
|
+ errorReporter.callErrorCallback(std::string("Error openning file: ") + name);
|
|
|
return 0;
|
|
|
}
|
|
|
-
|
|
|
- GLint size = 0;
|
|
|
- file.seekg(0, file.end);
|
|
|
- size = file.tellg();
|
|
|
- file.seekg(0, file.beg);
|
|
|
-
|
|
|
- char* fileContent = new char[size+1] {};
|
|
|
-
|
|
|
- file.read(fileContent, size);
|
|
|
-
|
|
|
-
|
|
|
- file.close();
|
|
|
-
|
|
|
- auto rez = createShaderFromData(fileContent, shaderType, errorReporter);
|
|
|
-
|
|
|
- delete[] fileContent;
|
|
|
+ auto rez = createShaderFromData(fileContent.c_str(), shaderType, errorReporter);
|
|
|
|
|
|
return rez;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
- bool Shader::loadShaderProgramFromFile(const char *vertexShader, const char *fragmentShader, ErrorReporter &errorReporter)
|
|
|
+ bool Shader::loadShaderProgramFromFile(const char *vertexShader, const char *fragmentShader,
|
|
|
+ ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
|
|
|
- auto vertexId = createShaderFromFile(vertexShader, GL_VERTEX_SHADER, errorReporter);
|
|
|
- auto fragmentId = createShaderFromFile(fragmentShader, GL_FRAGMENT_SHADER, errorReporter);
|
|
|
+ auto vertexId = createShaderFromFile(vertexShader, GL_VERTEX_SHADER, errorReporter, fileOpener);
|
|
|
+ auto fragmentId = createShaderFromFile(fragmentShader, GL_FRAGMENT_SHADER, errorReporter, fileOpener);
|
|
|
|
|
|
|
|
|
if (vertexId == 0 || fragmentId == 0)
|
|
|
@@ -34208,12 +34247,12 @@ namespace gl3d
|
|
|
}
|
|
|
|
|
|
bool Shader::loadShaderProgramFromFile(const char *vertexShader, const char *geometryShader, const char *fragmentShader,
|
|
|
- ErrorReporter &errorReporter)
|
|
|
+ ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
|
|
|
- auto vertexId = createShaderFromFile(vertexShader, GL_VERTEX_SHADER, errorReporter);
|
|
|
- auto geometryId = createShaderFromFile(geometryShader, GL_GEOMETRY_SHADER, errorReporter);
|
|
|
- auto fragmentId = createShaderFromFile(fragmentShader, GL_FRAGMENT_SHADER, errorReporter);
|
|
|
+ auto vertexId = createShaderFromFile(vertexShader, GL_VERTEX_SHADER, errorReporter, fileOpener);
|
|
|
+ auto geometryId = createShaderFromFile(geometryShader, GL_GEOMETRY_SHADER, errorReporter, fileOpener);
|
|
|
+ auto fragmentId = createShaderFromFile(fragmentShader, GL_FRAGMENT_SHADER, errorReporter, fileOpener);
|
|
|
|
|
|
if (vertexId == 0 || fragmentId == 0 || geometryId == 0)
|
|
|
{
|
|
|
@@ -34323,12 +34362,12 @@ namespace gl3d
|
|
|
|
|
|
|
|
|
//todo move
|
|
|
- std::string LightShader::create(ErrorReporter &errorReporter)
|
|
|
+ std::string LightShader::create(ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
std::string error = "";
|
|
|
|
|
|
#pragma region brdf texture
|
|
|
- error += brdfTexture.loadTextureFromFile("resources/BRDFintegrationMap.png", TextureLoadQuality::leastPossible, 3);
|
|
|
+ error += brdfTexture.loadTextureFromFile("resources/BRDFintegrationMap.png", fileOpener, TextureLoadQuality::leastPossible, 3);
|
|
|
glBindTexture(GL_TEXTURE_2D, brdfTexture.id);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
|
@@ -34338,7 +34377,7 @@ namespace gl3d
|
|
|
|
|
|
if (!error.empty()) { error += "\n"; };
|
|
|
|
|
|
- prePass.shader.loadShaderProgramFromFile("shaders/deferred/zPrePass.vert", "shaders/deferred/zPrePass.frag", errorReporter);
|
|
|
+ prePass.shader.loadShaderProgramFromFile("shaders/deferred/zPrePass.vert", "shaders/deferred/zPrePass.frag", errorReporter, fileOpener);
|
|
|
prePass.u_transform = getUniform(prePass.shader.id, "u_transform", errorReporter);
|
|
|
prePass.u_albedoSampler = getUniform(prePass.shader.id, "u_albedoSampler", errorReporter);
|
|
|
prePass.u_hasTexture = getUniform(prePass.shader.id, "u_hasTexture", errorReporter);
|
|
|
@@ -34348,7 +34387,7 @@ namespace gl3d
|
|
|
|
|
|
|
|
|
pointShadowShader.shader.loadShaderProgramFromFile("shaders/shadows/pointShadow.vert",
|
|
|
- "shaders/shadows/pointShadow.geom", "shaders/shadows/pointShadow.frag", errorReporter);
|
|
|
+ "shaders/shadows/pointShadow.geom", "shaders/shadows/pointShadow.frag", errorReporter, fileOpener);
|
|
|
pointShadowShader.u_albedoSampler = getUniform(pointShadowShader.shader.id, "u_albedoSampler", errorReporter);
|
|
|
pointShadowShader.u_farPlane = getUniform(pointShadowShader.shader.id, "u_farPlane", errorReporter);
|
|
|
pointShadowShader.u_hasTexture = getUniform(pointShadowShader.shader.id, "u_hasTexture", errorReporter);
|
|
|
@@ -34362,7 +34401,8 @@ namespace gl3d
|
|
|
|
|
|
|
|
|
|
|
|
- geometryPassShader.loadShaderProgramFromFile("shaders/deferred/geometryPass.vert", "shaders/deferred/geometryPass.frag", errorReporter);
|
|
|
+ geometryPassShader.loadShaderProgramFromFile("shaders/deferred/geometryPass.vert",
|
|
|
+ "shaders/deferred/geometryPass.frag", errorReporter, fileOpener);
|
|
|
//geometryPassShader.bind();
|
|
|
|
|
|
u_transform = getUniform(geometryPassShader.id, "u_transform", errorReporter);
|
|
|
@@ -34387,7 +34427,8 @@ namespace gl3d
|
|
|
glShaderStorageBlockBinding(geometryPassShader.id, u_jointTransforms, internal::JointsTransformBlockBinding); //todo define or enums for this
|
|
|
|
|
|
|
|
|
- lightingPassShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/deferred/lightingPass.frag", errorReporter);
|
|
|
+ lightingPassShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/deferred/lightingPass.frag",
|
|
|
+ errorReporter, fileOpener);
|
|
|
lightingPassShader.bind();
|
|
|
|
|
|
light_u_normals = getUniform(lightingPassShader.id, "u_normals", errorReporter);
|
|
|
@@ -34791,13 +34832,12 @@ namespace gl3d
|
|
|
}
|
|
|
|
|
|
|
|
|
- void LoadedModelData::load(const char *file, ErrorReporter &errorReporter, float scale)
|
|
|
+ void LoadedModelData::load(const char *file, ErrorReporter &errorReporter, FileOpener &fileOpener, float scale)
|
|
|
{
|
|
|
- stbi_set_flip_vertically_on_load(true);
|
|
|
+ stbi_set_flip_vertically_on_load(true); //gltf and obj files hold textures flipped diferently...
|
|
|
bool shouldFlipUVs = 0;
|
|
|
|
|
|
-
|
|
|
- loader.LoadFile(file, errorReporter, &shouldFlipUVs);
|
|
|
+ loader.LoadFile(file, errorReporter, fileOpener, &shouldFlipUVs);
|
|
|
|
|
|
//parse path
|
|
|
path = file;
|
|
|
@@ -35209,31 +35249,31 @@ namespace gl3d
|
|
|
*this = GraphicModel{};
|
|
|
}
|
|
|
|
|
|
- void SkyBoxLoaderAndDrawer::createGpuData(ErrorReporter &errorReporter, GLuint frameBuffer)
|
|
|
+ void SkyBoxLoaderAndDrawer::createGpuData(ErrorReporter &errorReporter, FileOpener &fileOpener, GLuint frameBuffer)
|
|
|
{
|
|
|
- normalSkyBox.shader.loadShaderProgramFromFile("shaders/skyBox/skyBox.vert", "shaders/skyBox/skyBox.frag", errorReporter);
|
|
|
+ normalSkyBox.shader.loadShaderProgramFromFile("shaders/skyBox/skyBox.vert", "shaders/skyBox/skyBox.frag", errorReporter, fileOpener);
|
|
|
normalSkyBox.samplerUniformLocation = getUniform(normalSkyBox.shader.id, "u_skybox", errorReporter);
|
|
|
normalSkyBox.modelViewUniformLocation = getUniform(normalSkyBox.shader.id, "u_viewProjection", errorReporter);
|
|
|
normalSkyBox.u_ambient = getUniform(normalSkyBox.shader.id, "u_ambient", errorReporter);
|
|
|
normalSkyBox.u_skyBoxPresent = getUniform(normalSkyBox.shader.id, "u_skyBoxPresent", errorReporter);
|
|
|
|
|
|
- hdrtoCubeMap.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/hdrToCubeMap.frag", errorReporter);
|
|
|
+ hdrtoCubeMap.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/hdrToCubeMap.frag", errorReporter, fileOpener);
|
|
|
hdrtoCubeMap.u_equirectangularMap = getUniform(hdrtoCubeMap.shader.id, "u_equirectangularMap", errorReporter);
|
|
|
hdrtoCubeMap.modelViewUniformLocation = getUniform(hdrtoCubeMap.shader.id, "u_viewProjection", errorReporter);
|
|
|
|
|
|
- convolute.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/convolute.frag", errorReporter);
|
|
|
+ convolute.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/convolute.frag", errorReporter, fileOpener);
|
|
|
convolute.u_environmentMap = getUniform(convolute.shader.id, "u_environmentMap", errorReporter);
|
|
|
convolute.modelViewUniformLocation = getUniform(convolute.shader.id, "u_viewProjection", errorReporter);
|
|
|
convolute.u_sampleQuality = getUniform(convolute.shader.id, "u_sampleQuality", errorReporter);
|
|
|
|
|
|
- preFilterSpecular.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/preFilterSpecular.frag", errorReporter);
|
|
|
+ preFilterSpecular.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert", "shaders/skyBox/preFilterSpecular.frag", errorReporter, fileOpener);
|
|
|
preFilterSpecular.modelViewUniformLocation = getUniform(preFilterSpecular.shader.id, "u_viewProjection", errorReporter);
|
|
|
preFilterSpecular.u_environmentMap = getUniform(preFilterSpecular.shader.id, "u_environmentMap", errorReporter);
|
|
|
preFilterSpecular.u_roughness = getUniform(preFilterSpecular.shader.id, "u_roughness", errorReporter);
|
|
|
preFilterSpecular.u_sampleCount = getUniform(preFilterSpecular.shader.id, "u_sampleCount", errorReporter);
|
|
|
|
|
|
atmosphericScatteringShader.shader.loadShaderProgramFromFile("shaders/skyBox/hdrToCubeMap.vert",
|
|
|
- "shaders/skyBox/atmosphericScattering.frag", errorReporter);
|
|
|
+ "shaders/skyBox/atmosphericScattering.frag", errorReporter, fileOpener);
|
|
|
atmosphericScatteringShader.u_lightPos = getUniform(atmosphericScatteringShader.shader.id, "u_lightPos", errorReporter);
|
|
|
atmosphericScatteringShader.u_g = getUniform(atmosphericScatteringShader.shader.id, "u_g", errorReporter);
|
|
|
atmosphericScatteringShader.u_color1 = getUniform(atmosphericScatteringShader.shader.id, "u_color1", errorReporter);
|
|
|
@@ -35261,7 +35301,8 @@ namespace gl3d
|
|
|
|
|
|
}
|
|
|
|
|
|
- void SkyBoxLoaderAndDrawer::loadTexture(const char *names[6], SkyBox &skyBox, ErrorReporter &errorReporter, GLuint frameBuffer)
|
|
|
+ void SkyBoxLoaderAndDrawer::loadTexture(const char *names[6], SkyBox &skyBox, ErrorReporter &errorReporter, FileOpener &fileOpener,
|
|
|
+ GLuint frameBuffer)
|
|
|
{
|
|
|
skyBox = {};
|
|
|
|
|
|
@@ -35270,11 +35311,22 @@ namespace gl3d
|
|
|
|
|
|
for (unsigned int i = 0; i < 6; i++)
|
|
|
{
|
|
|
- int w, h, nrChannels;
|
|
|
- unsigned char *data;
|
|
|
+ int w=0, h=0, nrChannels=0;
|
|
|
+ unsigned char *data=0;
|
|
|
|
|
|
stbi_set_flip_vertically_on_load(false);
|
|
|
- data = stbi_load(names[i], &w, &h, &nrChannels, 3);
|
|
|
+
|
|
|
+
|
|
|
+ bool couldNotOpen = 0;
|
|
|
+ auto content = fileOpener.binary(names[i], couldNotOpen);
|
|
|
+ if (couldNotOpen)
|
|
|
+ {
|
|
|
+ errorReporter.callErrorCallback(std::string("Could not open file: ") + names[i]);
|
|
|
+ glDeleteTextures(1, &skyBox.texture);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = stbi_load_from_memory((unsigned char*)content.data(), content.size(), &w, &h, &nrChannels, 3);
|
|
|
|
|
|
if (data)
|
|
|
{
|
|
|
@@ -35305,17 +35357,26 @@ namespace gl3d
|
|
|
createConvolutedAndPrefilteredTextureData(skyBox, frameBuffer);
|
|
|
}
|
|
|
|
|
|
- void SkyBoxLoaderAndDrawer::loadTexture(const char *name, SkyBox &skyBox, ErrorReporter &errorReporter,
|
|
|
+ void SkyBoxLoaderAndDrawer::loadTexture(const char *name, SkyBox &skyBox, ErrorReporter &errorReporter, FileOpener &fileOpener,
|
|
|
GLuint frameBuffer, int format)
|
|
|
{
|
|
|
skyBox = {};
|
|
|
|
|
|
- int width, height, nrChannels;
|
|
|
- unsigned char *data;
|
|
|
-
|
|
|
+ int width=0, height=0, nrChannels=0;
|
|
|
+ unsigned char *data=0;
|
|
|
|
|
|
stbi_set_flip_vertically_on_load(false);
|
|
|
- data = stbi_load(name, &width, &height, &nrChannels, 3);
|
|
|
+
|
|
|
+ bool couldNotOpen = 0;
|
|
|
+ auto content = fileOpener.binary(name, couldNotOpen);
|
|
|
+ if (couldNotOpen)
|
|
|
+ {
|
|
|
+ errorReporter.callErrorCallback(std::string("Could not open file: ") + name);
|
|
|
+ glDeleteTextures(1, &skyBox.texture);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = stbi_load_from_memory((unsigned char *)content.data(), content.size(), &width, &height, &nrChannels, 3);
|
|
|
|
|
|
if (!data) { errorReporter.callErrorCallback(std::string("err loading ") + name); return; }
|
|
|
|
|
|
@@ -35470,15 +35531,27 @@ namespace gl3d
|
|
|
|
|
|
}
|
|
|
|
|
|
- void SkyBoxLoaderAndDrawer::loadHDRtexture(const char *name, ErrorReporter &errorReporter, SkyBox &skyBox, GLuint frameBuffer)
|
|
|
+ void SkyBoxLoaderAndDrawer::loadHDRtexture(const char *name, ErrorReporter &errorReporter,
|
|
|
+ FileOpener &fileOpener, SkyBox &skyBox, GLuint frameBuffer)
|
|
|
{
|
|
|
skyBox = {};
|
|
|
|
|
|
- int width, height, nrChannels;
|
|
|
- float *data;
|
|
|
+ int width=0, height=0, nrChannels=0;
|
|
|
+ float *data=0;
|
|
|
|
|
|
stbi_set_flip_vertically_on_load(true);
|
|
|
- data = stbi_loadf(name, &width, &height, &nrChannels, 0);
|
|
|
+
|
|
|
+ bool couldNotOpen = 0;
|
|
|
+ auto content = fileOpener.binary(name, couldNotOpen);
|
|
|
+ if (couldNotOpen)
|
|
|
+ {
|
|
|
+ errorReporter.callErrorCallback(std::string("Could not open file: ") + name);
|
|
|
+ glDeleteTextures(1, &skyBox.texture);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ data = stbi_loadf_from_memory((unsigned char *)content.data(), content.size(), &width, &height, &nrChannels, 3);
|
|
|
+
|
|
|
if (!data) { errorReporter.callErrorCallback(std::string("err loading ") + name); return; }
|
|
|
|
|
|
|
|
|
@@ -35855,13 +35928,13 @@ namespace gl3d
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
|
- errorReporter.callErrorCallback(internal.lightShader.create(errorReporter));
|
|
|
+ errorReporter.callErrorCallback(internal.lightShader.create(errorReporter, fileOpener));
|
|
|
vao.createVAOs();
|
|
|
- internal.skyBoxLoaderAndDrawer.createGpuData(errorReporter, frameBuffer);
|
|
|
+ internal.skyBoxLoaderAndDrawer.createGpuData(errorReporter, fileOpener, frameBuffer);
|
|
|
|
|
|
|
|
|
internal.showNormalsProgram.shader.loadShaderProgramFromFile("shaders/showNormals.vert",
|
|
|
- "shaders/showNormals.geom", "shaders/showNormals.frag", errorReporter);
|
|
|
+ "shaders/showNormals.geom", "shaders/showNormals.frag", errorReporter, fileOpener);
|
|
|
|
|
|
//todo error report here + make this work :)))
|
|
|
internal.showNormalsProgram.modelTransformLocation = glGetUniformLocation(internal.showNormalsProgram.shader.id, "u_modelTransform");
|
|
|
@@ -35879,16 +35952,16 @@ namespace gl3d
|
|
|
//defaultTexture.loadTextureFromMemory(textureData, 2, 2, 4, TextureLoadQuality::leastPossible);
|
|
|
|
|
|
internal.gBuffer.create(x, y, errorReporter, frameBuffer);
|
|
|
- internal.ssao.create(x, y, errorReporter, frameBuffer);
|
|
|
- postProcess.create(x, y, errorReporter, frameBuffer);
|
|
|
+ internal.ssao.create(x, y, errorReporter, fileOpener, frameBuffer);
|
|
|
+ postProcess.create(x, y, errorReporter, fileOpener, frameBuffer);
|
|
|
directionalShadows.create(frameBuffer);
|
|
|
spotShadows.create(frameBuffer);
|
|
|
pointShadows.create(frameBuffer);
|
|
|
- renderDepthMap.create(errorReporter, frameBuffer);
|
|
|
- antiAlias.create(x, y, errorReporter);
|
|
|
+ renderDepthMap.create(errorReporter, fileOpener, frameBuffer);
|
|
|
+ antiAlias.create(x, y, errorReporter, fileOpener);
|
|
|
adaptiveResolution.create(x, y);
|
|
|
|
|
|
- internal.pBRtextureMaker.init(errorReporter);
|
|
|
+ internal.pBRtextureMaker.init(errorReporter, fileOpener);
|
|
|
}
|
|
|
|
|
|
ErrorCallback_t *Renderer3D::setErrorCallback(ErrorCallback_t *errorCallback, void *userData)
|
|
|
@@ -36113,7 +36186,8 @@ namespace gl3d
|
|
|
|
|
|
if (!mat.map_Pr.empty())
|
|
|
{
|
|
|
- renderer.errorReporter.callErrorCallback(roughness.loadTextureFromFile(std::string(path + mat.map_Pr).c_str(), dontSet, 1));
|
|
|
+ renderer.errorReporter.callErrorCallback(
|
|
|
+ roughness.loadTextureFromFile(std::string(path + mat.map_Pr).c_str(), renderer.fileOpener, dontSet, 1));
|
|
|
glBindTexture(GL_TEXTURE_2D, roughness.id);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
@@ -36122,7 +36196,8 @@ namespace gl3d
|
|
|
GpuTexture metallic{};
|
|
|
if (!mat.map_Pm.empty())
|
|
|
{
|
|
|
- renderer.errorReporter.callErrorCallback(metallic.loadTextureFromFile(std::string(path + mat.map_Pm).c_str(), dontSet, 1));
|
|
|
+ renderer.errorReporter.callErrorCallback(metallic.loadTextureFromFile(
|
|
|
+ std::string(path + mat.map_Pm).c_str(), renderer.fileOpener, dontSet, 1));
|
|
|
glBindTexture(GL_TEXTURE_2D, metallic.id);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
@@ -36131,7 +36206,8 @@ namespace gl3d
|
|
|
GpuTexture ambientOcclusion{};
|
|
|
if (!mat.map_Ka.empty())
|
|
|
{
|
|
|
- renderer.errorReporter.callErrorCallback(ambientOcclusion.loadTextureFromFile(std::string(path + mat.map_Ka).c_str(), dontSet, 1));
|
|
|
+ renderer.errorReporter.callErrorCallback(ambientOcclusion.loadTextureFromFile(
|
|
|
+ std::string(path + mat.map_Ka).c_str(), renderer.fileOpener, dontSet, 1));
|
|
|
glBindTexture(GL_TEXTURE_2D, ambientOcclusion.id);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
|
|
@@ -36299,7 +36375,7 @@ namespace gl3d
|
|
|
{
|
|
|
|
|
|
objl::Loader loader;
|
|
|
- if (!loader.LoadMaterials(file, errorReporter))
|
|
|
+ if (!loader.LoadMaterials(file, errorReporter, fileOpener))
|
|
|
{
|
|
|
errorReporter.callErrorCallback("err loading: " + file);
|
|
|
return {};
|
|
|
@@ -36634,7 +36710,7 @@ namespace gl3d
|
|
|
Model Renderer3D::loadModel(std::string path, GLuint frameBuffer, float scale)
|
|
|
{
|
|
|
|
|
|
- gl3d::LoadedModelData model(path.c_str(), errorReporter, scale);
|
|
|
+ gl3d::LoadedModelData model(path.c_str(), errorReporter, fileOpener, scale);
|
|
|
if(model.loader.LoadedMeshes.empty())
|
|
|
{
|
|
|
errorReporter.callErrorCallback("err loading " + path);
|
|
|
@@ -40876,21 +40952,21 @@ namespace gl3d
|
|
|
SkyBox Renderer3D::loadSkyBox(const char *names[6], GLuint frameBuffer)
|
|
|
{
|
|
|
SkyBox skyBox = {};
|
|
|
- internal.skyBoxLoaderAndDrawer.loadTexture(names, skyBox, errorReporter, frameBuffer);
|
|
|
+ internal.skyBoxLoaderAndDrawer.loadTexture(names, skyBox, errorReporter, fileOpener, frameBuffer);
|
|
|
return skyBox;
|
|
|
}
|
|
|
|
|
|
SkyBox Renderer3D::loadSkyBox(const char *name, int format)
|
|
|
{
|
|
|
SkyBox skyBox = {};
|
|
|
- internal.skyBoxLoaderAndDrawer.loadTexture(name, skyBox, errorReporter, format);
|
|
|
+ internal.skyBoxLoaderAndDrawer.loadTexture(name, skyBox, errorReporter, fileOpener, format);
|
|
|
return skyBox;
|
|
|
}
|
|
|
|
|
|
SkyBox Renderer3D::loadHDRSkyBox(const char *name, GLuint frameBuffer)
|
|
|
{
|
|
|
SkyBox skyBox = {};
|
|
|
- internal.skyBoxLoaderAndDrawer.loadHDRtexture(name, errorReporter, skyBox, frameBuffer);
|
|
|
+ internal.skyBoxLoaderAndDrawer.loadHDRtexture(name, errorReporter, fileOpener, skyBox, frameBuffer);
|
|
|
return skyBox;
|
|
|
}
|
|
|
|
|
|
@@ -40911,7 +40987,8 @@ namespace gl3d
|
|
|
return a + f * (b - a);
|
|
|
}
|
|
|
|
|
|
- void Renderer3D::InternalStruct::SSAO::create(int w, int h, ErrorReporter &errorReporter, GLuint frameBuffer)
|
|
|
+ void Renderer3D::InternalStruct::SSAO::create(int w, int h, ErrorReporter &errorReporter,
|
|
|
+ FileOpener &fileOpener, GLuint frameBuffer)
|
|
|
{
|
|
|
std::uniform_real_distribution<float> randomFloats(0.0f, 1.0f);
|
|
|
std::uniform_real_distribution<float> randomFloatsSmaller(0.1f, 0.9f); //avoid ssao artefacts
|
|
|
@@ -40971,7 +41048,7 @@ namespace gl3d
|
|
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ssaoColorBuffer, 0);
|
|
|
|
|
|
|
|
|
- shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/ssao/ssao.frag", errorReporter);
|
|
|
+ shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/ssao/ssao.frag", errorReporter, fileOpener);
|
|
|
|
|
|
|
|
|
u_projection = getUniform(shader.id, "u_projection", errorReporter);
|
|
|
@@ -40992,7 +41069,7 @@ namespace gl3d
|
|
|
glUniformBlockBinding(shader.id, u_SSAODATA, internal::SSAODataBlockBinding);
|
|
|
|
|
|
//blur
|
|
|
- blurShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/ssao/blur.frag", errorReporter);
|
|
|
+ blurShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/ssao/blur.frag", errorReporter, fileOpener);
|
|
|
|
|
|
glGenFramebuffers(1, &blurBuffer);
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, blurBuffer);
|
|
|
@@ -41027,7 +41104,7 @@ namespace gl3d
|
|
|
|
|
|
}
|
|
|
|
|
|
- void Renderer3D::PostProcess::create(int w, int h, ErrorReporter &errorReporter, GLuint frameBuffer)
|
|
|
+ void Renderer3D::PostProcess::create(int w, int h, ErrorReporter &errorReporter, FileOpener &fileOpener, GLuint frameBuffer)
|
|
|
{
|
|
|
glGenFramebuffers(1, &fbo);
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
|
@@ -41057,7 +41134,8 @@ namespace gl3d
|
|
|
|
|
|
|
|
|
|
|
|
- postProcessShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/postProcess.frag", errorReporter);
|
|
|
+ postProcessShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/postProcess.frag",
|
|
|
+ errorReporter, fileOpener);
|
|
|
u_colorTexture = getUniform(postProcessShader.id, "u_colorTexture", errorReporter);
|
|
|
u_bloomTexture = getUniform(postProcessShader.id, "u_bloomTexture", errorReporter);
|
|
|
u_bloomNotBluredTexture = getUniform(postProcessShader.id, "u_bloomNotBluredTexture", errorReporter);
|
|
|
@@ -41069,30 +41147,30 @@ namespace gl3d
|
|
|
u_ssao = getUniform(postProcessShader.id, "u_ssao", errorReporter);
|
|
|
|
|
|
|
|
|
- gausianBLurShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/gausianBlur.frag", errorReporter);
|
|
|
+ gausianBLurShader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/gausianBlur.frag", errorReporter, fileOpener);
|
|
|
u_toBlurcolorInput = getUniform(gausianBLurShader.id, "u_toBlurcolorInput", errorReporter);
|
|
|
u_horizontal = getUniform(gausianBLurShader.id, "u_horizontal", errorReporter);
|
|
|
u_mip = getUniform(gausianBLurShader.id, "u_mip", errorReporter);
|
|
|
u_texel = getUniform(gausianBLurShader.id, "u_texel", errorReporter);
|
|
|
|
|
|
- filterShader.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/filter.frag", errorReporter);
|
|
|
+ filterShader.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/filter.frag", errorReporter, fileOpener);
|
|
|
filterShader.u_exposure = getUniform(filterShader.shader.id, "u_exposure", errorReporter);
|
|
|
filterShader.u_texture = getUniform(filterShader.shader.id, "u_texture", errorReporter);
|
|
|
filterShader.u_tresshold = getUniform(filterShader.shader.id, "u_tresshold", errorReporter);
|
|
|
|
|
|
- addMips.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/addMips.frag", errorReporter);
|
|
|
+ addMips.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/addMips.frag", errorReporter, fileOpener);
|
|
|
addMips.u_mip = getUniform(addMips.shader.id, "u_mip", errorReporter);
|
|
|
addMips.u_texture= getUniform(addMips.shader.id, "u_texture", errorReporter);
|
|
|
|
|
|
- addMipsBlur.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/addMipsBlur.frag", errorReporter);
|
|
|
+ addMipsBlur.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/addMipsBlur.frag", errorReporter, fileOpener);
|
|
|
addMipsBlur.u_mip = getUniform(addMipsBlur.shader.id, "u_mip", errorReporter);
|
|
|
addMipsBlur.u_texture = getUniform(addMipsBlur.shader.id, "u_texture", errorReporter);
|
|
|
|
|
|
- filterDown.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/filterDown.frag", errorReporter);
|
|
|
+ filterDown.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/filterDown.frag", errorReporter, fileOpener);
|
|
|
filterDown.u_mip = getUniform(filterDown.shader.id, "u_mip", errorReporter);
|
|
|
filterDown.u_texture = getUniform(filterDown.shader.id, "u_texture", errorReporter);
|
|
|
|
|
|
- chromaticAberation.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/chromaticAberation.frag", errorReporter);
|
|
|
+ chromaticAberation.shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/postProcess/chromaticAberation.frag", errorReporter, fileOpener);
|
|
|
chromaticAberation.u_finalColorTexture = getUniform(chromaticAberation.shader.id, "u_finalColorTexture", errorReporter);
|
|
|
chromaticAberation.u_windowSize = getUniform(chromaticAberation.shader.id, "u_windowSize", errorReporter);
|
|
|
chromaticAberation.u_strength = getUniform(chromaticAberation.shader.id, "u_strength", errorReporter);
|
|
|
@@ -41187,9 +41265,9 @@ namespace gl3d
|
|
|
|
|
|
}
|
|
|
|
|
|
- void Renderer3D::InternalStruct::PBRtextureMaker::init(ErrorReporter &errorReporter)
|
|
|
+ void Renderer3D::InternalStruct::PBRtextureMaker::init(ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
- shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/modelLoader/mergePBRmat.frag", errorReporter);
|
|
|
+ shader.loadShaderProgramFromFile("shaders/drawQuads.vert", "shaders/modelLoader/mergePBRmat.frag", errorReporter, fileOpener);
|
|
|
glGenFramebuffers(1, &fbo);
|
|
|
}
|
|
|
|
|
|
@@ -41203,7 +41281,7 @@ namespace gl3d
|
|
|
|
|
|
skyBoxLoaderAndDrawer.draw(viewProjMat, s,
|
|
|
lightShader.lightPassUniformBlockCpuData.exposure,
|
|
|
- lightShader.lightPassUniformBlockCpuData.ambientLight);
|
|
|
+ s.color);
|
|
|
}
|
|
|
|
|
|
void Renderer3D::InternalStruct::renderSkyBoxBefore(Camera& c, SkyBox& s)
|
|
|
@@ -41216,7 +41294,7 @@ namespace gl3d
|
|
|
|
|
|
skyBoxLoaderAndDrawer.drawBefore(viewProjMat, s,
|
|
|
lightShader.lightPassUniformBlockCpuData.exposure,
|
|
|
- lightShader.lightPassUniformBlockCpuData.ambientLight);
|
|
|
+ s.color);
|
|
|
}
|
|
|
|
|
|
//todo use the max w h to create it
|
|
|
@@ -41419,11 +41497,11 @@ namespace gl3d
|
|
|
}
|
|
|
|
|
|
|
|
|
- void Renderer3D::AntiAlias::create(int w, int h, ErrorReporter &errorReporter)
|
|
|
+ void Renderer3D::AntiAlias::create(int w, int h, ErrorReporter &errorReporter, FileOpener &fileOpener)
|
|
|
{
|
|
|
|
|
|
shader.loadShaderProgramFromFile("shaders/drawQuads.vert",
|
|
|
- "shaders/aa/fxaa.frag", errorReporter);
|
|
|
+ "shaders/aa/fxaa.frag", errorReporter, fileOpener);
|
|
|
u_texture = getUniform(shader.id, "u_texture", errorReporter);
|
|
|
|
|
|
u_FXAAData = glGetUniformBlockIndex(shader.id, "u_FXAAData");
|
|
|
@@ -41436,14 +41514,14 @@ namespace gl3d
|
|
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
|
|
|
|
|
noAAshader.loadShaderProgramFromFile("shaders/drawQuads.vert",
|
|
|
- "shaders/aa/noaa.frag", errorReporter);
|
|
|
+ "shaders/aa/noaa.frag", errorReporter, fileOpener);
|
|
|
noAAu_texture = getUniform(noAAshader.id, "u_texture", errorReporter);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
- void Renderer3D::RenderDepthMap::create(ErrorReporter &errorReporter, GLuint frameBuffer)
|
|
|
+ void Renderer3D::RenderDepthMap::create(ErrorReporter &errorReporter, FileOpener &fileOpener, GLuint frameBuffer)
|
|
|
{
|
|
|
glGenFramebuffers(1, &fbo);
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
|
|
|
@@ -41464,7 +41542,7 @@ namespace gl3d
|
|
|
}
|
|
|
|
|
|
shader.loadShaderProgramFromFile
|
|
|
- ("shaders/drawQuads.vert", "shaders/drawDepth.frag", errorReporter);
|
|
|
+ ("shaders/drawQuads.vert", "shaders/drawDepth.frag", errorReporter, fileOpener);
|
|
|
u_depth = getUniform(shader.id, "u_depth", errorReporter);
|
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
|