diff --git a/include/openspace/abuffer/abuffer.h b/include/openspace/abuffer/abuffer.h index f8e1550a29..1e69977821 100644 --- a/include/openspace/abuffer/abuffer.h +++ b/include/openspace/abuffer/abuffer.h @@ -55,7 +55,7 @@ public: ABuffer(); virtual ~ABuffer(); - virtual void resolve(); + virtual void resolve(float blackoutFactor); virtual bool initialize() = 0; virtual bool reinitialize(); diff --git a/include/openspace/abuffer/abufferframebuffer.h b/include/openspace/abuffer/abufferframebuffer.h index c348c777f6..604c5fa5d6 100644 --- a/include/openspace/abuffer/abufferframebuffer.h +++ b/include/openspace/abuffer/abufferframebuffer.h @@ -36,6 +36,8 @@ public: virtual ~ABufferFramebuffer(); virtual bool initialize(); + void resolve(float blackoutFactor); + virtual void clear(); virtual void preRender(); virtual void postRender(); diff --git a/shaders/ABuffer/abufferResolveFragment.glsl b/shaders/ABuffer/abufferResolveFragment.glsl index d9e45834f9..dc6fedcb07 100644 --- a/shaders/ABuffer/abufferResolveFragment.glsl +++ b/shaders/ABuffer/abufferResolveFragment.glsl @@ -56,6 +56,8 @@ const float stepSize = 0.01; const float samplingRate = 1.0; uniform float ALPHA_LIMIT = 0.99; +uniform float blackoutFactor = 0.0; + // Math defintions #define M_E 2.7182818284590452354 @@ -307,7 +309,7 @@ void main() { out_color = vec4(texCoord,0.0,1.0); int frag_count = build_local_fragments_list(); sort_fragments_list(frag_count); - out_color = calculate_final_color(frag_count); + out_color = blackoutFactor * calculate_final_color(frag_count); } // ================================================================================ diff --git a/src/abuffer/abuffer.cpp b/src/abuffer/abuffer.cpp index 700413430d..8367e0660b 100644 --- a/src/abuffer/abuffer.cpp +++ b/src/abuffer/abuffer.cpp @@ -55,20 +55,17 @@ namespace openspace { ABuffer::ABuffer() : _validShader(false) , _resolveShader(nullptr) - , _volumeStepFactor(0.0f) + , _volumeStepFactor(0.f) { updateDimensions(); } ABuffer::~ABuffer() { - - if(_resolveShader) - delete _resolveShader; + delete _resolveShader; - for(auto file: _samplerFiles) { + for (auto file: _samplerFiles) delete file; - } } bool ABuffer::initializeABuffer() { @@ -88,14 +85,14 @@ bool ABuffer::initializeABuffer() { if (!_resolveShader) return false; _resolveShader->setProgramObjectCallback(shaderCallback); + // Remove explicit callback and use programobject isDirty instead ---abock -#ifndef __APPLE__ // ============================ // GEOMETRY (quad) // ============================ const GLfloat size = 1.0f; - const GLfloat vertex_data[] = { // square of two triangles (sigh) - // x y z w s t + const GLfloat vertex_data[] = { + // x y s t -size, -size, 0.0f, 1.0f, size, size, 0.0f, 1.0f, -size, size, 0.0f, 1.0f, @@ -111,20 +108,17 @@ bool ABuffer::initializeABuffer() { glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_data), vertex_data, GL_STATIC_DRAW); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, reinterpret_cast(0)); glEnableVertexAttribArray(0); -#endif return true; } bool ABuffer::reinitialize() { - // set the total resolution for all viewports updateDimensions(); return reinitializeInternal(); } -void ABuffer::resolve() { -#ifndef __APPLE__ - if( ! _validShader) { +void ABuffer::resolve(float blackoutFactor) { + if (!_validShader) { generateShaderSource(); updateShader(); _validShader = true; @@ -134,13 +128,14 @@ void ABuffer::resolve() { return; _resolveShader->activate(); + _resolveShader->setUniform("blackoutFactor", blackoutFactor); int startAt = 0; - for(int i = 0; i < _volumes.size(); ++i) { + 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) { + for (int i = 0; i < _transferFunctions.size(); ++i) { glActiveTexture(GL_TEXTURE0 + startAt + i); _transferFunctions.at(i).second->bind(); } @@ -158,7 +153,6 @@ void ABuffer::resolve() { glDrawArrays(GL_TRIANGLES, 0, 6); _resolveShader->deactivate(); -#endif } void ABuffer::addVolume(const std::string& tag,ghoul::opengl::Texture* volume) { @@ -212,8 +206,7 @@ bool ABuffer::updateShader() { } void ABuffer::generateShaderSource() { - - for(int i = 0; i < _samplerFiles.size(); ++i) { + for (int i = 0; i < _samplerFiles.size(); ++i) { std::string line, source = ""; std::ifstream samplerFile(_samplerFiles.at(i)->path()); if(samplerFile.is_open()) { @@ -233,7 +226,6 @@ void ABuffer::generateShaderSource() { } void ABuffer::openspaceHeaders() { - std::ofstream f(absPath(generatedHeadersPath)); f << "#define MAX_VOLUMES " << std::to_string(_samplers.size()) << "\n" << "#define MAX_TF " << _transferFunctions.size() << "\n"; diff --git a/src/abuffer/abufferframebuffer.cpp b/src/abuffer/abufferframebuffer.cpp index e2c13d7cae..e7a174e51e 100644 --- a/src/abuffer/abufferframebuffer.cpp +++ b/src/abuffer/abufferframebuffer.cpp @@ -59,6 +59,9 @@ void ABufferFramebuffer::preRender() { void ABufferFramebuffer::postRender() { } + +void ABufferFramebuffer::resolve(float blackoutFactor) { +} std::vector ABufferFramebuffer::pixelData() { return std::vector(); diff --git a/src/abuffer/abuffersinglelinked.cpp b/src/abuffer/abuffersinglelinked.cpp index 89750f6ced..834f54ad07 100644 --- a/src/abuffer/abuffersinglelinked.cpp +++ b/src/abuffer/abuffersinglelinked.cpp @@ -56,11 +56,11 @@ ABufferSingleLinked::ABufferSingleLinked() {} ABufferSingleLinked::~ABufferSingleLinked() { - glDeleteTextures(1,&_anchorPointerTexture); - glDeleteTextures(1,&_fragmentTexture); - glDeleteBuffers(1,&_anchorPointerTextureInitializer); - glDeleteBuffers(1,&_atomicCounterBuffer); - glDeleteBuffers(1,&_anchorPointerTextureInitializer); + glDeleteTextures(1, &_anchorPointerTexture); + glDeleteTextures(1, &_fragmentTexture); + glDeleteBuffers(1, &_anchorPointerTextureInitializer); + glDeleteBuffers(1, &_atomicCounterBuffer); + glDeleteBuffers(1, &_anchorPointerTextureInitializer); } bool ABufferSingleLinked::initialize() { @@ -123,7 +123,6 @@ void ABufferSingleLinked::clear() { } void ABufferSingleLinked::preRender() { - // Bind head-pointer image for read-write glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, _atomicCounterBuffer); glBindImageTexture(0, _anchorPointerTexture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI); @@ -135,7 +134,6 @@ void ABufferSingleLinked::postRender() { } std::vector ABufferSingleLinked::pixelData() { - unsigned int* anchorTexture = new unsigned int[_totalPixels]; unsigned int* fragmentBuffer = new unsigned int[_totalPixels*MAX_LAYERS*4]; @@ -201,4 +199,4 @@ std::vector ABufferSingleLinked::pixelData() return d; } -} // openspace \ No newline at end of file +} // openspace diff --git a/src/main.cpp b/src/main.cpp index 0edbe2edc9..7862d73111 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -73,12 +73,6 @@ std::pair supportedOpenGLVersion () { return { major, minor }; } -//temporary post-FX functions, TODO make a more permanent solution to this @JK -void postFXPass(); -void setupPostFX(); -GLint _postFXTexLoc; -GLint _postFXOpacityLoc; - #include namespace { @@ -195,9 +189,6 @@ void mainInitFunc() { std::cin.ignore(100); exit(EXIT_FAILURE); } - - //temporary post-FX solution, TODO add a more permanent solution @JK - setupPostFX(); } void mainPreSyncFunc() { @@ -272,26 +263,3 @@ void mainLogCallback(const char* msg){ // Remove the trailing \n that is passed along LINFOC("SGCT", message.substr(0, std::max(message.size() - 1, 0))); } - -void postFXPass(){ - glUniform1i(_postFXTexLoc, 0); - if (OsEng.isMaster()) - glUniform1f(_postFXOpacityLoc, 1.f); - else - glUniform1f(_postFXOpacityLoc, OsEng.renderEngine()->globalBlackOutFactor()); -} - -void setupPostFX(){ -#ifndef __APPLE__ - sgct::PostFX fx[1]; - sgct::ShaderProgram *shader; - fx[0].init("OpacityControl", absPath("${SHADERS}/postFX_vs.glsl"), absPath("${SHADERS}/postFX_fs.glsl")); - fx[0].setUpdateUniformsFunction(postFXPass); - shader = fx[0].getShaderProgram(); - shader->bind(); - _postFXTexLoc = shader->getUniformLocation("Tex"); - _postFXOpacityLoc = shader->getUniformLocation("Opacity"); - shader->unbind(); - _sgctEngine->addPostFX(fx[0]); -#endif -} diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index d915d3d1bb..3d6f87acce 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -395,7 +395,7 @@ void RenderEngine::render(const glm::mat4 &projectionMatrix, const glm::mat4 &vi glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - _abuffer->resolve(); + _abuffer->resolve(_globalBlackOutFactor); glDisable(GL_BLEND); } else {