void CanvasWindow::recreateCanvas() { DENG2_ASSERT_IN_MAIN_THREAD(); GLState::considerNativeStateUndefined(); d->ready = false; // Steal the focus change audience temporarily so no spurious focus // notifications are sent. d->canvasFocusAudience = canvas().audienceForFocusChange(); canvas().audienceForFocusChange().clear(); // We'll re-trap the mouse after the new canvas is ready. d->mouseWasTrapped = canvas().isMouseTrapped(); canvas().trapMouse(false); canvas().setParent(0); canvas().hide(); // Create the replacement Canvas. Once it's created and visible, we'll // finish the switch-over. d->recreated = new Canvas(this, d->canvas); d->recreated->audienceForGLReady() += this; //d->recreated->setGeometry(d->canvas->geometry()); d->recreated->show(); d->recreated->update(); LIBGUI_ASSERT_GL_OK(); LOGDEV_GL_MSG("Canvas recreated, old one still exists"); qDebug() << "old Canvas" << &canvas(); qDebug() << "new Canvas" << d->recreated; }
void attach(GLShader const *shader) { DENG2_ASSERT(shader->isReady()); alloc(); glAttachShader(name, shader->glName()); LIBGUI_ASSERT_GL_OK(); shaders.insert(holdRef(shader)); }
void glSubImage(int level, Vector2i const &pos, Size const &size, GLPixelFormat const &glFormat, void const *data, CubeFace face = PositiveX) { if(data) glPixelStorei(GL_UNPACK_ALIGNMENT, glFormat.rowAlignment); glTexSubImage2D(isCube()? glFace(face) : texTarget, level, pos.x, pos.y, size.x, size.y, glFormat.format, glFormat.type, data); LIBGUI_ASSERT_GL_OK(); }
/** * Update the OpenGL texture parameters. You must bind the texture before * calling. */ void glUpdateParamsOfBoundTexture() { glTexParameteri(texTarget, GL_TEXTURE_WRAP_S, glWrap(wrap.x)); glTexParameteri(texTarget, GL_TEXTURE_WRAP_T, glWrap(wrap.y)); glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, magFilter == Nearest? GL_NEAREST : GL_LINEAR); glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, glMinFilter(minFilter, mipFilter)); glTexParameterf(texTarget, GL_TEXTURE_MAX_LEVEL, maxLevel); if(GLInfo::extensions().EXT_texture_filter_anisotropic) { glTexParameterf(texTarget, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy); } LIBGUI_ASSERT_GL_OK(); flags &= ~ParamsChanged; }
void glSubImage(int level, Rectanglei const &rect, Image const &image, CubeFace face = PositiveX) { auto const &glFormat = image.glFormat(); LIBGUI_GL.glPixelStorei(GL_UNPACK_ALIGNMENT, GLint(glFormat.rowAlignment)); LIBGUI_GL.glPixelStorei(GL_UNPACK_ROW_LENGTH, GLint(image.width())); int const bytesPerPixel = image.depth() / 8; LIBGUI_GL.glTexSubImage2D(isCube()? glFace(face) : texTarget, level, rect.left(), rect.top(), rect.width(), rect.height(), glFormat.format, glFormat.type, static_cast<dbyte const *>(image.bits()) + bytesPerPixel * rect.left() + image.stride() * rect.top()); LIBGUI_GL.glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); LIBGUI_ASSERT_GL_OK(); }
void glImage(int level, Size const &size, GLPixelFormat const &glFormat, void const *data, CubeFace face = PositiveX) { /// @todo GLES2: Check for the BGRA extension. // Choose suitable informal format. GLenum const internalFormat = (glFormat.format == GL_BGRA? GL_RGBA : glFormat.format == GL_DEPTH_STENCIL? GL_DEPTH24_STENCIL8 : glFormat.format); /*qDebug() << "glTexImage2D:" << name << (isCube()? glFace(face) : texTarget) << level << internalFormat << size.x << size.y << 0 << glFormat.format << glFormat.type << data;*/ if(data) glPixelStorei(GL_UNPACK_ALIGNMENT, glFormat.rowAlignment); glTexImage2D(isCube()? glFace(face) : texTarget, level, internalFormat, size.x, size.y, 0, glFormat.format, glFormat.type, data); LIBGUI_ASSERT_GL_OK(); }
void draw() { // Release the row-interleaved FB if not being used. rowInterNeedRelease = true; switch (vrCfg.mode()) { // A) Single view type stereo 3D modes here: case VRConfig::Mono: // Non-stereoscopic frame. drawContent(); break; case VRConfig::LeftOnly: // Left eye view vrCfg.setCurrentEye(VRConfig::LeftEye); drawContent(); break; case VRConfig::RightOnly: // Right eye view vrCfg.setCurrentEye(VRConfig::RightEye); drawContent(); break; // B) Split-screen type stereo 3D modes here: case VRConfig::TopBottom: // Left goes on top // Left eye view on top of screen. vrCfg.setCurrentEye(VRConfig::LeftEye); target().setActiveRect(Rectangleui(0, 0, width(), height()/2), true); drawContent(); // Right eye view on bottom of screen. vrCfg.setCurrentEye(VRConfig::RightEye); target().setActiveRect(Rectangleui(0, height()/2, width(), height()/2), true); drawContent(); break; case VRConfig::SideBySide: // Squished aspect // Left eye view on left side of screen. vrCfg.setCurrentEye(VRConfig::LeftEye); target().setActiveRect(Rectangleui(0, 0, width()/2, height()), true); drawContent(); // Right eye view on right side of screen. vrCfg.setCurrentEye(VRConfig::RightEye); target().setActiveRect(Rectangleui(width()/2, 0, width()/2, height()), true); drawContent(); break; case VRConfig::Parallel: // Normal aspect // Left eye view on left side of screen. vrCfg.setCurrentEye(VRConfig::LeftEye); target().setActiveRect(Rectangleui(0, 0, width()/2, height()), true); drawContent(); // Right eye view on right side of screen. vrCfg.setCurrentEye(VRConfig::RightEye); target().setActiveRect(Rectangleui(width()/2, 0, width()/2, height()), true); drawContent(); break; case VRConfig::CrossEye: // Normal aspect // Right eye view on left side of screen. vrCfg.setCurrentEye(VRConfig::RightEye); target().setActiveRect(Rectangleui(0, 0, width()/2, height()), true); drawContent(); // Left eye view on right side of screen. vrCfg.setCurrentEye(VRConfig::LeftEye); target().setActiveRect(Rectangleui(width()/2, 0, width()/2, height()), true); drawContent(); break; case VRConfig::OculusRift: vrDrawOculusRift(); break; // Overlaid type stereo 3D modes below: case VRConfig::GreenMagenta: // Left eye view vrCfg.setCurrentEye(VRConfig::LeftEye); GLState::push().setColorMask(gl::WriteGreen | gl::WriteAlpha); // Left eye view green drawContent(); // Right eye view vrCfg.setCurrentEye(VRConfig::RightEye); GLState::current().setColorMask(gl::WriteRed | gl::WriteBlue | gl::WriteAlpha); // Right eye view magenta drawContent(); GLState::pop(); break; case VRConfig::RedCyan: // Left eye view vrCfg.setCurrentEye(VRConfig::LeftEye); GLState::push().setColorMask(gl::WriteRed | gl::WriteAlpha); // Left eye view red drawContent(); // Right eye view vrCfg.setCurrentEye(VRConfig::RightEye); GLState::current().setColorMask(gl::WriteGreen | gl::WriteBlue | gl::WriteAlpha); // Right eye view cyan drawContent(); GLState::pop(); break; case VRConfig::QuadBuffered: if (self().window().format().stereo()) { /// @todo Fix me! // Left eye view vrCfg.setCurrentEye(VRConfig::LeftEye); drawContent(); //canvas().framebuffer().swapBuffers(canvas(), gl::SwapStereoLeftBuffer); // Right eye view vrCfg.setCurrentEye(VRConfig::RightEye); drawContent(); //canvas().framebuffer().swapBuffers(canvas(), gl::SwapStereoRightBuffer); } else { // Normal non-stereoscopic frame. drawContent(); } break; case VRConfig::RowInterleaved: { #if !defined (DENG_MOBILE) // Use absolute screen position of window to determine whether the // first scan line is odd or even. QPoint ulCorner(0, 0); ulCorner = self().window().mapToGlobal(ulCorner); // widget to screen coordinates bool const rowParityIsEven = ((int(ulCorner.y()) % 2) == 0); rowInterNeedRelease = false; // Draw the left eye view. rowInterLeftFB.glInit(); rowInterLeftFB.resize(GLFramebuffer::Size(width(), height())); rowInterLeftFB.colorTexture().setFilter(gl::Linear, gl::Linear, gl::MipNone); rowInterLeftFB.colorTexture().glApplyParameters(); GLState::push() .setTarget(rowInterLeftFB) .setViewport(Rectangleui::fromSize(rowInterLeftFB.size())); vrCfg.setCurrentEye(rowParityIsEven? VRConfig::LeftEye : VRConfig::RightEye); drawContent(); GLState::pop(); // Draw right the eye view. rowInterRightFB.glInit(); rowInterRightFB.resize(GLFramebuffer::Size(width(), height())); rowInterRightFB.colorTexture().setFilter(gl::Linear, gl::Linear, gl::MipNone); rowInterRightFB.colorTexture().glApplyParameters(); GLState::push() .setTarget(rowInterRightFB) .setViewport(Rectangleui::fromSize(rowInterRightFB.size())); vrCfg.setCurrentEye(rowParityIsEven ? VRConfig::RightEye : VRConfig::LeftEye); drawContent(); GLState::pop(); // Draw right eye view to the screen from FBO color texture vrInitRowInterleaved(); rowInterUniformTex = rowInterLeftFB.colorTexture(); rowInterUniformTex2 = rowInterRightFB.colorTexture(); rowInterDrawable.draw(); #endif break; } case VRConfig::ColumnInterleaved: /// @todo implement column interleaved stereo 3D after row intleaved is working correctly... case VRConfig::Checkerboard: /// @todo implement checker stereo 3D after row intleaved is working correctly ... default: // Non-stereoscopic frame. drawContent(); break; } if (rowInterNeedRelease) { // release unused FBOs rowInterRightFB.glDeinit(); } // Restore default VR dynamic parameters target().unsetActiveRect(true); vrCfg.setCurrentEye(VRConfig::NeitherEye); LIBGUI_ASSERT_GL_OK(); }