From 9a1b59a73e5aeeddc5351fb208866ddee1956ec8 Mon Sep 17 00:00:00 2001 From: Jonas Strandstedt Date: Fri, 10 Oct 2014 11:29:16 +0200 Subject: [PATCH 1/2] Intermediate commit --- ext/ghoul | 2 +- include/openspace/abuffer/abuffer.h | 15 +- include/openspace/abuffer/abufferdynamic.h | 3 - include/openspace/engine/openspaceengine.h | 3 + include/openspace/rendering/renderengine.h | 4 + openspace.cfg | 4 +- shaders/ABuffer/abufferAddToBuffer.hglsl | 2 +- shaders/ABuffer/abufferResolveFragment.glsl | 23 +- shaders/ABuffer/abufferStruct.hglsl | 1 - src/abuffer/abuffer.cpp | 325 ++++++++------------ src/engine/openspaceengine.cpp | 36 ++- src/interaction/interactionhandler.cpp | 7 + src/rendering/renderablevolume.cpp | 6 +- src/rendering/renderengine.cpp | 15 +- 14 files changed, 226 insertions(+), 220 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index cec683e244..3691eec2c5 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit cec683e244ab02a4454d07f7406a5c837a4a6f97 +Subproject commit 3691eec2c5fbd52ea45d43374814487c2c647960 diff --git a/include/openspace/abuffer/abuffer.h b/include/openspace/abuffer/abuffer.h index 8ee0cf253d..1c31bcfe17 100644 --- a/include/openspace/abuffer/abuffer.h +++ b/include/openspace/abuffer/abuffer.h @@ -64,10 +64,10 @@ protected: void generateShaderSource(); bool updateShader(); - std::string openspaceHeaders(); - std::string openspaceSamplerCalls(); - std::string openspaceSamplers(); - std::string openspaceTransferFunction(); + void openspaceHeaders(); + void openspaceSamplerCalls(); + void openspaceSamplers(); + void openspaceTransferFunction(); unsigned int _width, _height, _totalPixels; @@ -75,8 +75,6 @@ private: GLuint _screenQuad; bool _validShader; - std::string _fragmentShaderPath; - ghoul::filesystem::File* _fragmentShaderFile; ghoul::opengl::ProgramObject* _resolveShader; std::vector > _volumes; @@ -84,13 +82,8 @@ private: std::vector _samplerFiles; std::vector _samplers; - // Development functionality to update shader for changes in several files - std::vector _shaderFiles; - float _volumeStepFactor; - - }; // ABuffer } // openspace diff --git a/include/openspace/abuffer/abufferdynamic.h b/include/openspace/abuffer/abufferdynamic.h index 23959f08f1..4d3b91ce59 100644 --- a/include/openspace/abuffer/abufferdynamic.h +++ b/include/openspace/abuffer/abufferdynamic.h @@ -51,9 +51,6 @@ private: GLuint _fragmentBuffer; GLuint _fragmentTexture; - - - }; // ABufferDynamic } // openspace diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index 4973bb4606..4470939a4f 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -36,6 +36,7 @@ #include //#include +#include #include #include #include @@ -75,6 +76,7 @@ public: InteractionHandler& interactionHandler(); RenderEngine& renderEngine(); scripting::ScriptEngine& scriptEngine(); + ghoul::filesystem::CacheManager& cacheManager(); // SGCT callbacks bool initializeGL(); @@ -103,6 +105,7 @@ private: InteractionHandler _interactionHandler; RenderEngine _renderEngine; scripting::ScriptEngine _scriptEngine; + ghoul::filesystem::CacheManager* _cacheManager; ghoul::cmdparser::CommandlineParser _commandlineParser; #ifdef OPENSPACE_VIDEO_EXPORT bool _doVideoExport; diff --git a/include/openspace/rendering/renderengine.h b/include/openspace/rendering/renderengine.h index 8859f7a0c1..79682a95cf 100644 --- a/include/openspace/rendering/renderengine.h +++ b/include/openspace/rendering/renderengine.h @@ -57,6 +57,8 @@ public: void render(); void postDraw(); + void takeScreenshot(); + void serialize(std::vector& dataStream, size_t& offset); void deserialize(const std::vector& dataStream, size_t& offset); @@ -75,6 +77,8 @@ private: SceneGraph* _sceneGraph; ABuffer* _abuffer; + bool _takeScreenshot; + void generateGlslConfig(); }; diff --git a/openspace.cfg b/openspace.cfg index 24fcdc1837..2da2931978 100644 --- a/openspace.cfg +++ b/openspace.cfg @@ -3,11 +3,11 @@ return { SGCT = "${BASE_PATH}/config/sgct", SCRIPTS = "${BASE_PATH}/scripts", SHADERS = "${BASE_PATH}/shaders", + SHADERS_GENERATED = "${SHADERS}/generated", OPENSPACE_DATA = "${BASE_PATH}/openspace-data", TESTDIR = "${BASE_PATH}/src/tests", CONFIG = "${BASE_PATH}/config", - CACHE = "${BASE_PATH}/cache", - TEMPORARY = "${BASE_PATH}/tmp" + CACHE = "${BASE_PATH}/cache" }, SpiceKernel = { Time = "${OPENSPACE_DATA}/spice/naif0010.tls", diff --git a/shaders/ABuffer/abufferAddToBuffer.hglsl b/shaders/ABuffer/abufferAddToBuffer.hglsl index f930813941..6bf1624a8a 100644 --- a/shaders/ABuffer/abufferAddToBuffer.hglsl +++ b/shaders/ABuffer/abufferAddToBuffer.hglsl @@ -22,7 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include <${SHADERS}/ABuffer/constants.hglsl> +#include <${SHADERS_GENERATED}/constants.hglsl> #if ABUFFER_IMPLEMENTATION == ABUFFER_SINGLE_LINKED layout (binding = 0, r32ui) uniform uimage2D anchorPointerTexture; diff --git a/shaders/ABuffer/abufferResolveFragment.glsl b/shaders/ABuffer/abufferResolveFragment.glsl index 3c9abf186b..1a3411be7e 100644 --- a/shaders/ABuffer/abufferResolveFragment.glsl +++ b/shaders/ABuffer/abufferResolveFragment.glsl @@ -24,10 +24,13 @@ #version 430 + + // ================================================================================ // Settings // ================================================================================ -#pragma openspace insert SETTINGS +//#pragma openspace insert SETTINGS +#include <${SHADERS_GENERATED}/ABufferSettings.hglsl>:notrack // Select type of depth calculations #define PSCDEPTH 1 @@ -79,7 +82,8 @@ out vec4 out_color; // Headers, // volume and transferfunctions uniforms // ================================================================================ -#pragma openspace insert HEADERS +//#pragma openspace insert HEADERS +#include <${SHADERS_GENERATED}/ABufferHeaders.hglsl>:notrack // ================================================================================ // The ABuffer specific includes and definitions @@ -221,7 +225,11 @@ vec4 calculate_final_color(uint frag_count) { vec4 color = vec4(0); for(int k = 0; k < max_iterations && final_color.a < ALPHA_LIMIT && k < LOOP_LIMIT; ++k) { -#pragma openspace insert SAMPLERCALLS +// #pragma openspace insert SAMPLERCALLS +#include <${SHADERS_GENERATED}/ABufferSamplerCalls.hglsl>:notrack + + + } @@ -253,9 +261,13 @@ vec4 calculate_final_color(uint frag_count) { // Transferfunction visualizer // ================================================================================ #ifdef VISUALIZE_TRANSFERFUNCTIONS -#pragma openspace insert TRANSFERFUNC +// #pragma openspace insert TRANSFERFUNC +#include <${SHADERS_GENERATED}/ABufferTransferFunctionVisualizer.hglsl>:notrack #endif + + + // if(frag_count == 0) { // final_color = vec4(0.5,0.5,0.5,1.0); // } else if(frag_count == 1) { @@ -300,7 +312,8 @@ void main() { // ================================================================================ // The samplers implementations // ================================================================================ -#pragma openspace insert SAMPLERS +//#pragma openspace insert SAMPLERS +#include <${SHADERS_GENERATED}/ABufferSamplers.hglsl>:notrack diff --git a/shaders/ABuffer/abufferStruct.hglsl b/shaders/ABuffer/abufferStruct.hglsl index 5c510c4bd0..5dfde0b978 100644 --- a/shaders/ABuffer/abufferStruct.hglsl +++ b/shaders/ABuffer/abufferStruct.hglsl @@ -31,7 +31,6 @@ // #define ABUFFER_DYNAMIC 3 // #define ABUFFER_IMPLEMENTATION ABUFFER_SINGLE_LINKED - //======================================================================================== // ABufferStruct_t declaration //======================================================================================== diff --git a/src/abuffer/abuffer.cpp b/src/abuffer/abuffer.cpp index 74cd43521d..3498c7afba 100644 --- a/src/abuffer/abuffer.cpp +++ b/src/abuffer/abuffer.cpp @@ -34,12 +34,14 @@ #include namespace { - std::string _loggerCat = "ABuffer"; -std::string padGeneratedString(const std::string& content) { - std::string _content_ = "// GENERATED CONTENT\n" + content + "\n// END GENERATED CONTENT"; - return _content_; -} + const std::string generatedSettingsPath = "${SHADERS_GENERATED}/ABufferSettings.hglsl"; + const std::string generatedHeadersPath = "${SHADERS_GENERATED}/ABufferHeaders.hglsl"; + const std::string generatedSamplerCallsPath = "${SHADERS_GENERATED}/ABufferSamplerCalls.hglsl"; + const std::string generatedTransferFunctionVisualizerPath = "${SHADERS_GENERATED}/ABufferTransferFunctionVisualizer.hglsl"; + const std::string generatedSamplersPath = "${SHADERS_GENERATED}/ABufferSamplers.hglsl"; + + const std::string _loggerCat = "ABuffer"; } @@ -51,49 +53,37 @@ ABuffer::ABuffer() : _validShader(false), _resolveShader(nullptr) { _width = xSize; _height = ySize; _totalPixels = _width * _height; - const std::string fragmentShaderSourcePath = absPath("${SHADERS}/ABuffer/abufferResolveFragment.glsl"); - _fragmentShaderFile = new ghoul::filesystem::File(fragmentShaderSourcePath, true); - _fragmentShaderPath = fragmentShaderSourcePath.substr(0, fragmentShaderSourcePath.length()-4) + "gglsl"; } ABuffer::~ABuffer() { - if(_fragmentShaderFile) - delete _fragmentShaderFile; if(_resolveShader) delete _resolveShader; - + for(auto file: _samplerFiles) { delete file; } - for(auto file: _shaderFiles) { - delete file; - } } bool ABuffer::initializeABuffer() { // ============================ // SHADERS // ============================ - auto shaderCallback = [this](const ghoul::filesystem::File& file) { - _validShader = false; - }; - _fragmentShaderFile->setCallback(shaderCallback); - - // Development functionality to update shader for changes in several files - auto addFunc = [this, shaderCallback](const std::string& path) { - ghoul::filesystem::File* f = new ghoul::filesystem::File(path, false); - f->setCallback(shaderCallback); - _shaderFiles.push_back(f); + auto shaderCallback = [this](ghoul::opengl::ProgramObject* program) { + // Error for visibility in log + LERROR(program->name() << " invalidated"); + _validShader = false; }; - addFunc("${SHADERS}/ABuffer/constants.hglsl"); - addFunc("${SHADERS}/ABuffer/abufferSort.hglsl"); - addFunc("${SHADERS}/ABuffer/abufferAddToBuffer.hglsl"); - addFunc("${SHADERS}/ABuffer/abufferStruct.hglsl"); - addFunc("${SHADERS}/PowerScaling/powerScaling_fs.hglsl"); - addFunc("${SHADERS}/PowerScaling/powerScaling_fs.hglsl"); - addFunc("${SHADERS}/PowerScaling/powerScaling_vs.hglsl"); - addFunc("${SHADERS}/PowerScaling/powerScalingMath.hglsl"); + + generateShaderSource(); + _resolveShader = ghoul::opengl::ProgramObject::Build( + "ABufferResolve", + "${SHADERS}/ABuffer/abufferResolveVertex.glsl", + "${SHADERS}/ABuffer/abufferResolveFragment.glsl", + shaderCallback); + + if (!_resolveShader) + return false; // ============================ // GEOMETRY (quad) @@ -122,38 +112,40 @@ bool ABuffer::initializeABuffer() { void ABuffer::resolve() { if( ! _validShader) { - _validShader = true; - generateShaderSource(); + SleepEx(0, TRUE); + //generateShaderSource(); updateShader(); + _validShader = true; } - if(_resolveShader) { - _resolveShader->activate(); - int startAt = 0; - for(int i = 0; i < _volumes.size(); ++i) { - glActiveTexture(GL_TEXTURE0 + i); - _volumes.at(i).second->bind(); - startAt = i + 1; - } - for(int i = 0; i < _transferFunctions.size(); ++i) { - glActiveTexture(GL_TEXTURE0 + startAt + i); - _transferFunctions.at(i).second->bind(); - } + if (!_resolveShader) + return; - // Decrease stepsize in volumes if right click is pressed - // TODO: Let the interactionhandler handle this - int val = sgct::Engine::getMouseButton(0, SGCT_MOUSE_BUTTON_RIGHT); - float volumeStepFactor = (val) ? 0.2: 1.0; - if(volumeStepFactor != _volumeStepFactor) { - _volumeStepFactor = volumeStepFactor; - _resolveShader->setUniform("volumeStepFactor", _volumeStepFactor); - } - - glBindVertexArray(_screenQuad); - glDrawArrays(GL_TRIANGLES, 0, 6); - - _resolveShader->deactivate(); + _resolveShader->activate(); + int startAt = 0; + for(int i = 0; i < _volumes.size(); ++i) { + glActiveTexture(GL_TEXTURE0 + i); + _volumes.at(i).second->bind(); + startAt = i + 1; } + for(int i = 0; i < _transferFunctions.size(); ++i) { + glActiveTexture(GL_TEXTURE0 + startAt + i); + _transferFunctions.at(i).second->bind(); + } + + // Decrease stepsize in volumes if right click is pressed + // TODO: Let the interactionhandler handle this + int val = sgct::Engine::getMouseButton(0, SGCT_MOUSE_BUTTON_RIGHT); + float volumeStepFactor = (val) ? 0.2: 1.0; + if(volumeStepFactor != _volumeStepFactor) { + _volumeStepFactor = volumeStepFactor; + _resolveShader->setUniform("volumeStepFactor", _volumeStepFactor); + } + + glBindVertexArray(_screenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + _resolveShader->deactivate(); } void ABuffer::addVolume(const std::string& tag,ghoul::opengl::Texture* volume) { @@ -182,33 +174,19 @@ int ABuffer::addSamplerfile(const std::string& filename) { } bool ABuffer::updateShader() { - - using ghoul::opengl::ShaderObject; - using ghoul::opengl::ProgramObject; - ProgramObject* resolveShader = ProgramObject::Build("ABuffer resolve", - "${SHADERS}/ABuffer/abufferResolveVertex.glsl", - _fragmentShaderPath); - - if( ! resolveShader) { - LERROR("Resolve shader not updated"); - return false; - } - - int startAt = 0; - for(int i = 0; i < _volumes.size(); ++i) { - resolveShader->setUniform(_volumes.at(i).first, i); - startAt = i + 1; + bool s = _resolveShader->rebuildFromFile(); + if (s) { + int startAt = 0; + for (int i = 0; i < _volumes.size(); ++i) { + _resolveShader->setUniform(_volumes.at(i).first, i); + startAt = i + 1; + } + for (int i = 0; i < _transferFunctions.size(); ++i) { + _resolveShader->setUniform(_transferFunctions.at(i).first, startAt + i); + } + LINFO("Successfully updated shader!"); } - for(int i = 0; i < _transferFunctions.size(); ++i) { - resolveShader->setUniform(_transferFunctions.at(i).first, startAt + i); - } - - if(_resolveShader) - delete _resolveShader; - - _resolveShader = resolveShader; - LDEBUG("Successfully updated shader!"); - return true; + return s; } void ABuffer::generateShaderSource() { @@ -225,156 +203,123 @@ void ABuffer::generateShaderSource() { _samplers.at(i) = source; } - std::string line, source = ""; - std::ifstream fragmentShaderFile(_fragmentShaderFile->path()); - if(fragmentShaderFile.is_open()) { - while(std::getline(fragmentShaderFile, line)) { - if(line == "#pragma openspace insert HEADERS") { - line = padGeneratedString(openspaceHeaders()); - } else if(line == "#pragma openspace insert SAMPLERCALLS") { - line = padGeneratedString(openspaceSamplerCalls()); - } else if(line == "#pragma openspace insert SAMPLERS") { - line = padGeneratedString(openspaceSamplers()); - } else if(line == "#pragma openspace insert SETTINGS") { - line = padGeneratedString(settings()); - } else if(line == "#pragma openspace insert TRANSFERFUNC") { - line = padGeneratedString(openspaceTransferFunction()); - } - source += line + "\n"; - } - } - fragmentShaderFile.close(); - - std::ofstream fragmentShaderOut(_fragmentShaderPath); - fragmentShaderOut << source; - fragmentShaderOut.close(); + LDEBUG("Generating shader includes"); + openspaceHeaders(); + openspaceSamplerCalls(); + openspaceSamplers(); + settings(); + openspaceTransferFunction(); } -std::string ABuffer::openspaceHeaders() { - - std::string headers; - headers += "#define MAX_VOLUMES " + std::to_string(_samplers.size()) + "\n"; - headers += "#define MAX_TF " + std::to_string(_transferFunctions.size()) + "\n"; - +void ABuffer::openspaceHeaders() { + std::ofstream f(absPath(generatedHeadersPath)); + f << "#define MAX_VOLUMES " << std::to_string(_samplers.size()) << "\n" + << "#define MAX_TF " << std::to_string(_transferFunctions.size()) << "\n"; for (int i = 0; i < _volumes.size(); ++i) { - headers += "uniform sampler3D " + _volumes.at(i).first + ";\n"; + f << "uniform sampler3D " << _volumes.at(i).first << ";\n"; } for (int i = 0; i < _transferFunctions.size(); ++i) { - headers += "uniform sampler1D " + _transferFunctions.at(i).first + ";\n"; + f << "uniform sampler1D " << _transferFunctions.at(i).first << ";\n"; } for (int i = 0; i < _samplers.size(); ++i) { auto found = _samplers.at(i).find_first_of('{'); - if(found!=std::string::npos) { - headers += _samplers.at(i).substr(0, found) + ";\n"; + if (found != std::string::npos) { + f << _samplers.at(i).substr(0, found) << ";\n"; } } - if(_volumes.size() < 1) - return headers; + if (_volumes.size() < 1) { + f.close(); + return; + } size_t maxLoop = 0; - headers += "const vec3 volume_dim[] = {\n"; + f << "const vec3 volume_dim[] = {\n"; for (int i = 0; i < _volumes.size(); ++i) { glm::size3_t size = _volumes.at(i).second->dimensions(); - for(int k = 0; k < 3; ++k) + for (int k = 0; k < 3; ++k) maxLoop = glm::max(maxLoop, size[k]); - headers += " vec3(" + std::to_string(size[0]) + ".0," + std::to_string(size[1]) + ".0," - + std::to_string(size[2]) + ".0),\n"; + f << " vec3(" << std::to_string(size[0]) << ".0," + std::to_string(size[1]) << ".0," + << std::to_string(size[2]) + ".0),\n"; } - headers += "};\n"; + f << "};\n"; - headers += "#define LOOP_LIMIT " + std::to_string(maxLoop) + "\n"; + f << "#define LOOP_LIMIT " + std::to_string(maxLoop) + "\n"; - headers += "float volumeStepSize[] = {\n"; + f << "float volumeStepSize[] = {\n"; for (int i = 0; i < _volumes.size(); ++i) { glm::size3_t size = _volumes.at(i).second->dimensions(); - headers += " stepSize,\n"; + f << " stepSize,\n"; } - headers += "};\n"; + f << "};\n"; - headers += "float volumeStepSizeOriginal[] = {\n"; + f << "float volumeStepSizeOriginal[] = {\n"; for (int i = 0; i < _volumes.size(); ++i) { glm::size3_t size = _volumes.at(i).second->dimensions(); - headers += " stepSize,\n"; + f << " stepSize,\n"; } - headers += "};\n"; + f << "};\n"; - return headers; + f.close(); } -std::string ABuffer::openspaceSamplerCalls() { - std::string samplercalls; +void ABuffer::openspaceSamplerCalls() { + std::ofstream f(absPath(generatedSamplerCallsPath)); for (int i = 0; i < _samplers.size(); ++i) { - auto found1 = _samplers.at(i).find_first_not_of("vec4 "); - auto found2 = _samplers.at(i).find_first_of("(",found1); - if(found1 != std::string::npos && found2 != std::string::npos) { + auto found2 = _samplers.at(i).find_first_of("(", found1); + if (found1 != std::string::npos && found2 != std::string::npos) { std::string functionName = _samplers.at(i).substr(found1, found2 - found1); - samplercalls += "#ifndef SKIP_VOLUME_"+std::to_string(i)+"\n"; - samplercalls += "if((currentVolumeBitmask & (1 << " + std::to_string(i) + ")) == "+std::to_string(1 << i)+") {\n"; - samplercalls += " vec4 c = " + functionName + "(final_color,volume_position[" + std::to_string(i) + "]);\n"; - // samplercalls += " if(c.a < 0.1) { \n"; - // samplercalls += " if( volumeStepSize[" + std::to_string(i) + "] < 16.0*volumeStepSizeOriginal[" + std::to_string(i) + "]) \n"; - // samplercalls += " volumeStepSize[" + std::to_string(i) + "] *= 2.0; \n"; - // samplercalls += " } else {\n"; - // samplercalls += " //volume_position[" + std::to_string(i) + "] -= volume_direction[" + std::to_string(i) + "]*volumeStepSize[" + std::to_string(i) + "];\n"; - // samplercalls += " volumeStepSize[" + std::to_string(i) + "] = volumeStepSizeOriginal[" + std::to_string(i) + "]; \n"; - // samplercalls += " //c = " + functionName + "(final_color,volume_position[" + std::to_string(i) + "]);\n"; - // samplercalls += " } \n"; - // samplercalls += " if(c.a > EPSILON)\n"; - samplercalls += " blendStep(final_color, c, volumeStepSize[" + std::to_string(i) + "]);\n"; - // samplercalls += " blendStep(final_color, c, stepSize);\n"; - // samplercalls += " float aaa = volume_length[i]/myMaxSteps;\n"; - samplercalls += " volume_position[" + std::to_string(i) + "] += volume_direction[" + std::to_string(i) + "]*volumeStepSize[" + std::to_string(i) + "];\n"; - // float aaa = ray[v].w/myMaxSteps; - // pos[v] += vec4(ray[v].xyz*vec3(aaa),aaa); - // samplercalls += " volume_position[" + std::to_string(i) + "] += volume_direction[" + std::to_string(i) + "]*volumeStepSize[" + std::to_string(i) + "];\n"; - samplercalls += "}\n"; - samplercalls += "#endif\n"; + f << "#ifndef SKIP_VOLUME_" << std::to_string(i) << "\n" + << "if((currentVolumeBitmask & (1 << " << std::to_string(i) << ")) == " << std::to_string(1 << i) << ") {\n" + << " vec4 c = " << functionName << "(final_color,volume_position[" << std::to_string(i) << "]);\n" + << " blendStep(final_color, c, volumeStepSize[" << std::to_string(i) << "]);\n" + << " volume_position[" << std::to_string(i) << "] += volume_direction[" << std::to_string(i) << "]*volumeStepSize[" << std::to_string(i) << "];\n" + << "}\n" + << "#endif\n"; } - - } - return samplercalls; + f.close(); } -std::string ABuffer::openspaceSamplers() { - std::string samplers; - for (int i = 0; i < _samplers.size(); ++i) { - samplers += _samplers.at(i) + "\n"; +void ABuffer::openspaceSamplers() { + + std::ofstream f(absPath(generatedSamplersPath)); + for (auto sampler : _samplers) { + f << sampler << std::endl; } - return samplers; + f.close(); } -std::string ABuffer::openspaceTransferFunction() { - std::string tf; - tf += "float showfunc_size = 20.0;\n"; - tf += "float SCREEN_HEIGHTf = float(SCREEN_HEIGHT);\n"; - tf += "float SCREEN_WIDTHf = float(SCREEN_WIDTH);\n"; - for(int i = 0; i < _transferFunctions.size(); ++i) { - tf += "if( gl_FragCoord.y > SCREEN_HEIGHTf-showfunc_size*"+std::to_string(i+1)+ - " && gl_FragCoord.y < SCREEN_HEIGHTf-showfunc_size*"+std::to_string(i)+") {\n"; - tf += " float normalizedIntensity = gl_FragCoord.x / (SCREEN_WIDTHf-1) ;\n"; - tf += " vec4 tfc = texture("+ _transferFunctions.at(i).first +", normalizedIntensity);\n"; - tf += " final_color = tfc;\n"; - tf += " float cmpf = SCREEN_HEIGHTf-showfunc_size*"+std::to_string(i+1)+" + tfc.a*showfunc_size;\n"; - tf += " if(gl_FragCoord.y > cmpf) {\n"; - tf += " final_color = vec4(0,0,0,0);\n"; - tf += " } else {\n"; - tf += " final_color.a = 1.0;\n"; - tf += " }\n"; - tf += "} else if(ceil(gl_FragCoord.y) == SCREEN_HEIGHTf - showfunc_size*"+std::to_string(i+1)+") {\n"; - tf += " const float intensity = 0.4;\n"; - tf += " final_color = vec4(intensity,intensity,intensity,1.0);\n"; - tf += "}\n"; +void ABuffer::openspaceTransferFunction() { + std::ofstream f(absPath(generatedTransferFunctionVisualizerPath)); + f << "float showfunc_size = 20.0;\n" + << "float SCREEN_HEIGHTf = float(SCREEN_HEIGHT);\n" + << "float SCREEN_WIDTHf = float(SCREEN_WIDTH);\n"; + for (int i = 0; i < _transferFunctions.size(); ++i) { + f << "if( gl_FragCoord.y > SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i + 1) + << " && gl_FragCoord.y < SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i) << ") {\n" + << " float normalizedIntensity = gl_FragCoord.x / (SCREEN_WIDTHf-1) ;\n" + << " vec4 tfc = texture(" << _transferFunctions.at(i).first << ", normalizedIntensity);\n" + << " final_color = tfc;\n" + << " float cmpf = SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i + 1) << " + tfc.a*showfunc_size;\n" + << " if(gl_FragCoord.y > cmpf) {\n" + << " final_color = vec4(0,0,0,0);\n" + << " } else {\n" + << " final_color.a = 1.0;\n" + << " }\n" + << "} else if(ceil(gl_FragCoord.y) == SCREEN_HEIGHTf - showfunc_size*" << std::to_string(i + 1) << ") {\n" + << " const float intensity = 0.4;\n" + << " final_color = vec4(intensity,intensity,intensity,1.0);\n" + << "}\n"; } - - return tf; + f.close(); } void ABuffer::invalidateABuffer() { + LDEBUG("Shader invalidated"); _validShader = false; } diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 72001b7977..51e1eddf2f 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -43,6 +43,9 @@ #include #include +#include +#include + using namespace ghoul::filesystem; using namespace ghoul::logging; @@ -68,6 +71,7 @@ OpenSpaceEngine* OpenSpaceEngine::_engine = nullptr; OpenSpaceEngine::OpenSpaceEngine(std::string programName) : _commandlineParser(programName, true) + , _cacheManager(nullptr) { } @@ -76,6 +80,8 @@ OpenSpaceEngine::~OpenSpaceEngine() SpiceManager::deinitialize(); Time::deinitialize(); DeviceIdentifier::deinit(); + if (_cacheManager) + delete _cacheManager; FileSystem::deinitialize(); LogManager::deinitialize(); } @@ -184,7 +190,23 @@ bool OpenSpaceEngine::create(int argc, char** argv, LERROR("Loading of configuration file '" << configurationFilePath << "' failed"); return false; } - + + // make sure cache is registered, false since we don't want to override + FileSys.registerPathToken("${CACHE}", "${BASE_PATH}/cache", false); + + // Create directories that doesn't exsist + auto tokens = FileSys.tokens(); + for (auto token : tokens) { + if (!FileSys.directoryExists(token)) { + std::string p = absPath(token); + LDEBUG("Directory '" << p <<"' does not exsist, creating."); + FileSys.createDirectory(p, true); + } + } + + // Create the cachemanager + _engine->_cacheManager = new ghoul::filesystem::CacheManager(absPath("${CACHE}")); + // Determining SGCT configuration file LDEBUG("Determining SGCT configuration file"); std::string sgctConfigurationPath = _sgctDefaultConfigFile; @@ -347,6 +369,11 @@ ScriptEngine& OpenSpaceEngine::scriptEngine() return _scriptEngine; } +ghoul::filesystem::CacheManager& OpenSpaceEngine::cacheManager() { + assert(_cacheManager != nullptr); + return *_cacheManager; +} + bool OpenSpaceEngine::initializeGL() { return _renderEngine.initializeGL(); @@ -401,9 +428,12 @@ void OpenSpaceEngine::postDraw() glm::quat rot2 = glm::quat(euler2); _interactionHandler->orbit(rot); _interactionHandler->rotate(rot2); - if(_doVideoExport) - sgct::Engine::instance()->takeScreenshot(); + if(_doVideoExport) + _renderEngine.takeScreenshot(); #endif + + _renderEngine.postDraw(); + #ifdef FLARE_ONLY _flare->postDraw(); #endif diff --git a/src/interaction/interactionhandler.cpp b/src/interaction/interactionhandler.cpp index a707c6c0e7..1773f15d0d 100644 --- a/src/interaction/interactionhandler.cpp +++ b/src/interaction/interactionhandler.cpp @@ -382,6 +382,13 @@ void InteractionHandler::keyboardCallback(int key, int action) { OsEng.renderEngine().camera()->setScaling(s); } } + + // Screenshot + if (action == SGCT_PRESS && key == SGCT_KEY_PRINT_SCREEN) { + OsEng.renderEngine().takeScreenshot(); + } + + /* if (key == '1') { SceneGraphNode* node = getSceneGraphNode("sun"); diff --git a/src/rendering/renderablevolume.cpp b/src/rendering/renderablevolume.cpp index 7ecaf4274f..7a367e283b 100644 --- a/src/rendering/renderablevolume.cpp +++ b/src/rendering/renderablevolume.cpp @@ -148,8 +148,10 @@ ghoul::opengl::Texture* RenderableVolume::loadVolume( std::stringstream ss; ss << "." << dimensions[0] << "x" << dimensions[1] << "x" << dimensions[2] << "." << modelString << "." << variableCacheString << ".cache"; - std::string cachepath = filepath + ss.str(); - if( cache && FileSys.fileExists(cachepath)) { + + std::string cachepath; // = filepath + ss.str(); + OsEng.cacheManager().getCachedFile(filepath, ss.str(), cachepath, true); + if (cache && FileSys.fileExists(cachepath)) { FILE* file = fopen (cachepath.c_str(), "rb"); diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 5f851f141a..8fab61aa09 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -72,6 +72,7 @@ RenderEngine::RenderEngine() : _mainCamera(nullptr) , _sceneGraph(nullptr) , _abuffer(nullptr) + , _takeScreenshot(false) { } @@ -298,6 +299,18 @@ void RenderEngine::render() } +void RenderEngine::postDraw() { + if (_takeScreenshot) { + sgct::Engine::instance()->takeScreenshot(); + _takeScreenshot = false; + } +} + +void RenderEngine::takeScreenshot() { + _takeScreenshot = true; +} + + SceneGraph* RenderEngine::sceneGraph() { // TODO custom assert (ticket #5) @@ -499,7 +512,7 @@ void RenderEngine::generateGlslConfig() { // TODO: Make this file creation dynamic and better in every way // TODO: If the screen size changes it is enough if this file is regenerated to // recompile all necessary files - std::ofstream os(absPath("${SHADERS}/ABuffer/constants.hglsl")); + std::ofstream os(absPath("${SHADERS_GENERATED}/constants.hglsl")); os << "#define SCREEN_WIDTH " << xSize << "\n" << "#define SCREEN_HEIGHT " << ySize << "\n" << "#define MAX_LAYERS " << ABuffer::MAX_LAYERS << "\n" From 7ef5295bb7108809b9581fe05486e875f7b6ea5f Mon Sep 17 00:00:00 2001 From: Jonas Strandstedt Date: Fri, 17 Oct 2014 14:50:40 +0200 Subject: [PATCH 2/2] Added ABuffer reinitialization - Fixed so ABuffer reinitializes properly (could probably be optimized by not resizing of smaller than before) - Now setting size properly from window dimensions - SGCT side-by-side stereo working --- ext/ghoul | 2 +- include/openspace/abuffer/abuffer.h | 5 ++ .../openspace/abuffer/abufferSingleLinked.h | 2 + include/openspace/abuffer/abuffer_i.h | 1 + include/openspace/abuffer/abufferdynamic.h | 2 + include/openspace/abuffer/abufferfixed.h | 2 + shaders/ABuffer/abufferAddToBuffer.hglsl | 6 +-- src/abuffer/abuffer.cpp | 47 ++++++++++++------- src/abuffer/abufferSingleLinked.cpp | 32 ++++++++----- src/abuffer/abufferdynamic.cpp | 4 ++ src/abuffer/abufferfixed.cpp | 4 ++ src/rendering/renderengine.cpp | 31 ++++++------ 12 files changed, 87 insertions(+), 51 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index 3691eec2c5..a2f137941a 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit 3691eec2c5fbd52ea45d43374814487c2c647960 +Subproject commit a2f137941a5eae85b620674eb90407bb5be349df diff --git a/include/openspace/abuffer/abuffer.h b/include/openspace/abuffer/abuffer.h index 1c31bcfe17..aa12cb63f5 100644 --- a/include/openspace/abuffer/abuffer.h +++ b/include/openspace/abuffer/abuffer.h @@ -49,6 +49,7 @@ public: ABuffer(); virtual ~ABuffer(); virtual void resolve(); + virtual bool reinitialize(); void addVolume(const std::string& tag,ghoul::opengl::Texture* volume); void addTransferFunction(const std::string& tag,ghoul::opengl::Texture* transferFunction); @@ -58,6 +59,7 @@ public: protected: virtual std::string settings() = 0; + virtual bool reinitializeInternal() = 0; bool initializeABuffer(); @@ -72,6 +74,9 @@ protected: unsigned int _width, _height, _totalPixels; private: + + void updateDimensions(); + GLuint _screenQuad; bool _validShader; diff --git a/include/openspace/abuffer/abufferSingleLinked.h b/include/openspace/abuffer/abufferSingleLinked.h index c348abee52..efedb34228 100644 --- a/include/openspace/abuffer/abufferSingleLinked.h +++ b/include/openspace/abuffer/abufferSingleLinked.h @@ -41,6 +41,8 @@ public: virtual void postRender(); virtual std::string settings(); +protected: + virtual bool reinitializeInternal(); private: diff --git a/include/openspace/abuffer/abuffer_i.h b/include/openspace/abuffer/abuffer_i.h index 04a8e4277c..b6e568deae 100644 --- a/include/openspace/abuffer/abuffer_i.h +++ b/include/openspace/abuffer/abuffer_i.h @@ -31,6 +31,7 @@ class ABuffer_I { public: virtual ~ABuffer_I() {}; virtual bool initialize() = 0; + virtual bool reinitialize() = 0; virtual void clear() = 0; virtual void preRender() = 0; diff --git a/include/openspace/abuffer/abufferdynamic.h b/include/openspace/abuffer/abufferdynamic.h index 4d3b91ce59..81732e77a8 100644 --- a/include/openspace/abuffer/abufferdynamic.h +++ b/include/openspace/abuffer/abufferdynamic.h @@ -41,6 +41,8 @@ public: virtual void postRender(); virtual std::string settings(); +protected: + virtual bool reinitializeInternal(); private: diff --git a/include/openspace/abuffer/abufferfixed.h b/include/openspace/abuffer/abufferfixed.h index cc211e0b57..46d1b37a8c 100644 --- a/include/openspace/abuffer/abufferfixed.h +++ b/include/openspace/abuffer/abufferfixed.h @@ -41,6 +41,8 @@ public: virtual void postRender(); virtual std::string settings(); +protected: + virtual bool reinitializeInternal(); private: diff --git a/shaders/ABuffer/abufferAddToBuffer.hglsl b/shaders/ABuffer/abufferAddToBuffer.hglsl index 6bf1624a8a..fc5bcf2c27 100644 --- a/shaders/ABuffer/abufferAddToBuffer.hglsl +++ b/shaders/ABuffer/abufferAddToBuffer.hglsl @@ -34,9 +34,9 @@ layout (binding = 0, offset = 0) uniform atomic_uint atomicCounterBuffer; layout (binding = 0, r32ui) uniform uimage2D anchorPointerTexture; layout (binding = 1, rgba32ui) uniform uimageBuffer fragmentTexture; - #define _MAX_LAYERS_ 64 - #define _SCREEN_WIDTH_ 1280 - #define _SCREEN_HEIGHT_ 720 + #define _MAX_LAYERS_ MAX_LAYERS + #define _SCREEN_WIDTH_ SCREEN_WIDTH + #define _SCREEN_HEIGHT_ SCREEN_HEIGHT #endif ABufferStruct_t createGeometryFragment(vec4 fragColor, vec4 position, float z = gl_FragCoord.z) { diff --git a/src/abuffer/abuffer.cpp b/src/abuffer/abuffer.cpp index 3498c7afba..45adb1274a 100644 --- a/src/abuffer/abuffer.cpp +++ b/src/abuffer/abuffer.cpp @@ -48,11 +48,7 @@ namespace { namespace openspace { ABuffer::ABuffer() : _validShader(false), _resolveShader(nullptr) { - int x1, xSize, y1, ySize; - sgct::Engine::instance()->getActiveWindowPtr()->getCurrentViewportPixelCoords(x1, y1, xSize, ySize); - _width = xSize; - _height = ySize; - _totalPixels = _width * _height; + updateDimensions(); } ABuffer::~ABuffer() { @@ -71,7 +67,6 @@ bool ABuffer::initializeABuffer() { // ============================ auto shaderCallback = [this](ghoul::opengl::ProgramObject* program) { // Error for visibility in log - LERROR(program->name() << " invalidated"); _validShader = false; }; @@ -110,10 +105,17 @@ bool ABuffer::initializeABuffer() { return true; } +bool ABuffer::reinitialize() { + + // set the total resolution for all viewports + updateDimensions(); + return reinitializeInternal(); +} + void ABuffer::resolve() { if( ! _validShader) { SleepEx(0, TRUE); - //generateShaderSource(); + generateShaderSource(); updateShader(); _validShader = true; } @@ -184,7 +186,10 @@ bool ABuffer::updateShader() { for (int i = 0; i < _transferFunctions.size(); ++i) { _resolveShader->setUniform(_transferFunctions.at(i).first, startAt + i); } - LINFO("Successfully updated shader!"); + LINFO("Successfully updated ABuffer resolve shader!"); + } + else { + LWARNING("Couldn't update ABuffer resolve shader"); } return s; } @@ -215,7 +220,7 @@ void ABuffer::openspaceHeaders() { std::ofstream f(absPath(generatedHeadersPath)); f << "#define MAX_VOLUMES " << std::to_string(_samplers.size()) << "\n" - << "#define MAX_TF " << std::to_string(_transferFunctions.size()) << "\n"; + << "#define MAX_TF " << _transferFunctions.size() << "\n"; for (int i = 0; i < _volumes.size(); ++i) { f << "uniform sampler3D " << _volumes.at(i).first << ";\n"; } @@ -246,7 +251,7 @@ void ABuffer::openspaceHeaders() { } f << "};\n"; - f << "#define LOOP_LIMIT " + std::to_string(maxLoop) + "\n"; + f << "#define LOOP_LIMIT " << maxLoop << "\n"; f << "float volumeStepSize[] = {\n"; for (int i = 0; i < _volumes.size(); ++i) { @@ -272,11 +277,11 @@ void ABuffer::openspaceSamplerCalls() { auto found2 = _samplers.at(i).find_first_of("(", found1); if (found1 != std::string::npos && found2 != std::string::npos) { std::string functionName = _samplers.at(i).substr(found1, found2 - found1); - f << "#ifndef SKIP_VOLUME_" << std::to_string(i) << "\n" - << "if((currentVolumeBitmask & (1 << " << std::to_string(i) << ")) == " << std::to_string(1 << i) << ") {\n" - << " vec4 c = " << functionName << "(final_color,volume_position[" << std::to_string(i) << "]);\n" - << " blendStep(final_color, c, volumeStepSize[" << std::to_string(i) << "]);\n" - << " volume_position[" << std::to_string(i) << "] += volume_direction[" << std::to_string(i) << "]*volumeStepSize[" << std::to_string(i) << "];\n" + f << "#ifndef SKIP_VOLUME_" << i << "\n" + << "if((currentVolumeBitmask & (1 << " << i << ")) == " << std::to_string(1 << i) << ") {\n" + << " vec4 c = " << functionName << "(final_color,volume_position[" << i << "]);\n" + << " blendStep(final_color, c, volumeStepSize[" << i << "]);\n" + << " volume_position[" << i << "] += volume_direction[" << i << "]*volumeStepSize[" << i << "];\n" << "}\n" << "#endif\n"; } @@ -299,18 +304,18 @@ void ABuffer::openspaceTransferFunction() { << "float SCREEN_HEIGHTf = float(SCREEN_HEIGHT);\n" << "float SCREEN_WIDTHf = float(SCREEN_WIDTH);\n"; for (int i = 0; i < _transferFunctions.size(); ++i) { - f << "if( gl_FragCoord.y > SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i + 1) + f << "if( gl_FragCoord.y > SCREEN_HEIGHTf-showfunc_size*" << i + 1 << " && gl_FragCoord.y < SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i) << ") {\n" << " float normalizedIntensity = gl_FragCoord.x / (SCREEN_WIDTHf-1) ;\n" << " vec4 tfc = texture(" << _transferFunctions.at(i).first << ", normalizedIntensity);\n" << " final_color = tfc;\n" - << " float cmpf = SCREEN_HEIGHTf-showfunc_size*" << std::to_string(i + 1) << " + tfc.a*showfunc_size;\n" + << " float cmpf = SCREEN_HEIGHTf-showfunc_size*" << i + 1 << " + tfc.a*showfunc_size;\n" << " if(gl_FragCoord.y > cmpf) {\n" << " final_color = vec4(0,0,0,0);\n" << " } else {\n" << " final_color.a = 1.0;\n" << " }\n" - << "} else if(ceil(gl_FragCoord.y) == SCREEN_HEIGHTf - showfunc_size*" << std::to_string(i + 1) << ") {\n" + << "} else if(ceil(gl_FragCoord.y) == SCREEN_HEIGHTf - showfunc_size*" << i + 1 << ") {\n" << " const float intensity = 0.4;\n" << " final_color = vec4(intensity,intensity,intensity,1.0);\n" << "}\n"; @@ -323,5 +328,11 @@ void ABuffer::invalidateABuffer() { _validShader = false; } +void ABuffer::updateDimensions() { + _width = sgct::Engine::instance()->getActiveWindowPtr()->getXFramebufferResolution(); + _height = sgct::Engine::instance()->getActiveWindowPtr()->getYFramebufferResolution(); + _totalPixels = _width * _height; +} + } // openspace \ No newline at end of file diff --git a/src/abuffer/abufferSingleLinked.cpp b/src/abuffer/abufferSingleLinked.cpp index 37d96745c1..b671f35d3c 100644 --- a/src/abuffer/abufferSingleLinked.cpp +++ b/src/abuffer/abufferSingleLinked.cpp @@ -59,10 +59,22 @@ bool ABufferSingleLinked::initialize() { // BUFFERS // ============================ glGenTextures(1, &_anchorPointerTexture); + glGenBuffers(1, &_anchorPointerTextureInitializer); + glGenBuffers(1, &_atomicCounterBuffer); + glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, _atomicCounterBuffer); + glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), NULL, GL_DYNAMIC_COPY); + glGenBuffers(1, &_fragmentBuffer); + glGenTextures(1, &_fragmentTexture); + + reinitialize(); + + return initializeABuffer(); +} + +bool ABufferSingleLinked::reinitializeInternal() { glBindTexture(GL_TEXTURE_2D, _anchorPointerTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, _width, _height, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, NULL); - glGenBuffers(1, &_anchorPointerTextureInitializer); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _anchorPointerTextureInitializer); glBufferData(GL_PIXEL_UNPACK_BUFFER, _totalPixels * sizeof(GLuint), NULL, GL_STATIC_DRAW); @@ -71,22 +83,16 @@ bool ABufferSingleLinked::initialize() { glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); - glGenBuffers(1, &_atomicCounterBuffer); - glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, _atomicCounterBuffer); - glBufferData(GL_ATOMIC_COUNTER_BUFFER, sizeof(GLuint), NULL, GL_DYNAMIC_COPY); - - glGenBuffers(1, &_fragmentBuffer); glBindBuffer(GL_TEXTURE_BUFFER, _fragmentBuffer); - glBufferData(GL_TEXTURE_BUFFER, MAX_LAYERS*_totalPixels*sizeof(GLfloat)*4, NULL, GL_DYNAMIC_COPY); + glBufferData(GL_TEXTURE_BUFFER, MAX_LAYERS*_totalPixels*sizeof(GLfloat) * 4, NULL, GL_DYNAMIC_COPY); - glGenTextures(1, &_fragmentTexture); - glBindTexture(GL_TEXTURE_BUFFER, _fragmentTexture); - glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32UI, _fragmentBuffer); - glBindTexture(GL_TEXTURE_BUFFER, 0); + glBindTexture(GL_TEXTURE_BUFFER, _fragmentTexture); + glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32UI, _fragmentBuffer); + glBindTexture(GL_TEXTURE_BUFFER, 0); - glBindImageTexture(1, _fragmentTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32UI); + glBindImageTexture(1, _fragmentTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32UI); - return initializeABuffer(); + return true; } void ABufferSingleLinked::clear() { diff --git a/src/abuffer/abufferdynamic.cpp b/src/abuffer/abufferdynamic.cpp index 3ec7051f8e..695ac52c80 100644 --- a/src/abuffer/abufferdynamic.cpp +++ b/src/abuffer/abufferdynamic.cpp @@ -89,6 +89,10 @@ bool ABufferDynamic::initialize() { return initializeABuffer(); } +bool ABufferDynamic::reinitializeInternal() { + return false; +} + void ABufferDynamic::clear() { glBindBuffer(GL_PIXEL_UNPACK_BUFFER, _anchorPointerTextureInitializer); glBindTexture(GL_TEXTURE_2D, _anchorPointerTexture); diff --git a/src/abuffer/abufferfixed.cpp b/src/abuffer/abufferfixed.cpp index 4f1693a269..008582cb5c 100644 --- a/src/abuffer/abufferfixed.cpp +++ b/src/abuffer/abufferfixed.cpp @@ -97,6 +97,10 @@ bool ABufferFixed::initialize() { return initializeABuffer(); } +bool ABufferFixed::reinitializeInternal() { + return false; +} + void ABufferFixed::clear() { // Bind texture initializer diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 8fab61aa09..db61ae4c0b 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -185,15 +185,17 @@ bool RenderEngine::initializeGL() void RenderEngine::postSynchronizationPreDraw() { sgct_core::SGCTNode * thisNode = sgct_core::ClusterManager::instance()->getThisNodePtr(); - for (unsigned int i = 0; i < thisNode->getNumberOfWindows(); i++) - if (sgct::Engine::instance()->getWindowPtr(i)->isWindowResized()) - generateGlslConfig(); - // Move time forward. - //_runtimeData->advanceTimeBy(1, DAY); - - //_runtimeData->advanceTimeBy(1, HOUR); - //_runtimeData->advanceTimeBy(30, MINUTE); - //_runtimeData->advanceTimeBy(1, MILLISECOND); + bool updateAbuffer = false; + for (unsigned int i = 0; i < thisNode->getNumberOfWindows(); i++) { + if (sgct::Engine::instance()->getWindowPtr(i)->isWindowResized()) { + updateAbuffer = true; + break; + } + } + if (updateAbuffer) { + generateGlslConfig(); + _abuffer->reinitialize(); + } // converts the quaternion used to rotation matrices _mainCamera->compileViewRotationMatrix(); @@ -202,13 +204,13 @@ void RenderEngine::postSynchronizationPreDraw() _sceneGraph->update({Time::ref().currentTime()}); _mainCamera->setCameraDirection(glm::vec3(0, 0, -1)); _sceneGraph->evaluate(_mainCamera); + + _abuffer->clear(); } void RenderEngine::render() { // SGCT resets certain settings - //glEnable(GL_DEPTH_TEST); - //glEnable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); @@ -232,7 +234,6 @@ void RenderEngine::render() // render the scene starting from the root node - _abuffer->clear(); _abuffer->preRender(); _sceneGraph->render({*_mainCamera, psc()}); _abuffer->postRender(); @@ -504,10 +505,8 @@ ABuffer* RenderEngine::abuffer() const { void RenderEngine::generateGlslConfig() { LDEBUG("Generating GLSLS config, expect shader recompilation"); - int x1, xSize, y1, ySize; - sgct::Engine::instance()-> - getActiveWindowPtr()-> - getCurrentViewportPixelCoords(x1, y1, xSize, ySize); + int xSize = sgct::Engine::instance()->getActiveWindowPtr()->getXFramebufferResolution();; + int ySize = sgct::Engine::instance()->getActiveWindowPtr()->getYFramebufferResolution();; // TODO: Make this file creation dynamic and better in every way // TODO: If the screen size changes it is enough if this file is regenerated to