RenderViewPtr FrameBuffer::attached(uint32 att) const { switch (att) { case ATT_DepthStencil: return mRSView; break; default: uint32 clrid = att - ATT_Color0; if(mClearViews.size() < clrid + 1) { return RenderViewPtr(); } else { return mClearViews[clrid]; } break; } }
RenderViewPtr FrameBuffer::Attached(uint32_t att) const { switch (att) { case ATT_DepthStencil: return rs_view_; default: { uint32_t clr_id = att - ATT_Color0; if (clr_views_.size() < clr_id + 1) { return RenderViewPtr(); } else { return clr_views_[clr_id]; } } } }
RenderViewPtr GLGraphicFactory::createRenderView(const TexturePtr& texture) const { if(texture->type() == TT_Texture2D) return MakeSharedPtr<GLTexture2DRenderView>(texture, 0, 0); return RenderViewPtr(); }
RenderViewPtr OGLESRenderFactory::Make3DDepthStencilRenderView(Texture& /*texture*/, int /*array_index*/, uint32_t /*first_slice*/, uint32_t /*num_slices*/, int /*level*/) { return RenderViewPtr(); }
RenderViewPtr OGLESRenderFactory::MakeCubeDepthStencilRenderView(Texture& /*texture*/, int /*array_index*/, int /*level*/) { return RenderViewPtr(); }
RenderViewPtr OGLESRenderFactory::MakeGraphicsBufferRenderView(GraphicsBuffer& /*gbuffer*/, uint32_t /*width*/, uint32_t /*height*/, ElementFormat /*pf*/) { return RenderViewPtr(); }
GLWindow::GLWindow(const UknString& name, const RenderSettings& settings): mFrameBuffer(new GLFrameBuffer(false)), Window(name) { glfwSetErrorCallback(ErrorCallback); glfwInit(); switch(settings.color_fmt) { case EF_RGBA8: glfwWindowHint(GLFW_RED_BITS, 8); glfwWindowHint(GLFW_BLUE_BITS, 8); glfwWindowHint(GLFW_GREEN_BITS, 8); glfwWindowHint(GLFW_ALPHA_BITS, 8); break; default: // error break; } switch(settings.depth_stencil_fmt) { case EF_D16: glfwWindowHint(GLFW_DEPTH_BITS, 16); glfwWindowHint(GLFW_STENCIL_BITS, 0); mFrameBuffer->mIsDepthBuffered = true; mFrameBuffer->mDepthBits = 16; mFrameBuffer->mStencilBits = 0; break; case EF_D24S8: glfwWindowHint(GLFW_DEPTH_BITS, 24); glfwWindowHint(GLFW_STENCIL_BITS, 8); mFrameBuffer->mIsDepthBuffered = true; mFrameBuffer->mDepthBits = 24; mFrameBuffer->mStencilBits = 8; break; default: glfwWindowHint(GLFW_DEPTH_BITS, 0); glfwWindowHint(GLFW_STENCIL_BITS, 0); mFrameBuffer->mIsDepthBuffered = false; mFrameBuffer->mDepthBits = 0; mFrameBuffer->mStencilBits = 0; break; } if(settings.sample_quality > 0) { glfwWindowHint(GLFW_SAMPLES, settings.sample_quality); } glfwWindowHint(GLFW_RESIZABLE, settings.resizable); /* maybe there are bugs... let glfw decide the best version */ /* glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, UKN_OPENGL_VERSION_MAJOR); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, UKN_OPENGL_VERSION_MINOR); if(UKN_OPENGL_VERSION_MAJOR >= 3) { glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #if defined(MIST_OS_OSX) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); #else glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE); #endif } */ if(!settings.native_window_handle) { if((mGlfwWindow = glfwCreateWindow(settings.width, settings.height, string::WStringToString(name).c_str(), settings.full_screen ? glfwGetPrimaryMonitor() : 0, 0)) == 0) { MIST_THROW_EXCEPTION(L"GLWindow::GLWindow: Error opening window"); } } else { if((mGlfwWindow = glfwCreateWindowSlave((void*)settings.native_window_handle, 0)) == 0) { MIST_THROW_EXCEPTION(L"GLWindow::GLWindow: Error creating slave window on native handle"); } } glfwMakeContextCurrent(mGlfwWindow); #if !defined(UKN_OSX_REQUEST_OPENGL_32_CORE_PROFILE) GLenum err = glewInit(); if (GLEW_OK != err) { MIST_THROW_EXCEPTION(mist::string::StringToWString(format_string("GLWindow::GLWindow: error initializing glew profilem, error; %s", glewGetErrorString(err)))); } #endif // if wnd pos is (0, 0), then put it in the center of current screen int32 wndPosX = settings.left, wndPosY = settings.top; if(wndPosX == 0 && wndPosY == 0) { Array<SystemInformation::DesktopMode> desktop_modes = SystemInformation::EnumDesktopMode(); wndPosX = (desktop_modes[0].width - settings.width) / 2; wndPosY = (desktop_modes[0].height - settings.height) / 2; } glfwSetWindowPos(mGlfwWindow, wndPosX, wndPosY); glfwSetWindowUserPointer(mGlfwWindow, this); glfwSetErrorCallback(ErrorFunc); glfwSetWindowSizeCallback(mGlfwWindow, WindowSizeFunc); glfwSetWindowCloseCallback(mGlfwWindow, WindowCloseFunc); glfwSetWindowRefreshCallback(mGlfwWindow, WindowRefreshFunc); glfwSetWindowFocusCallback(mGlfwWindow, WindowFocusFunc); glfwSetWindowIconifyCallback(mGlfwWindow, WindowIconifyFunc); glfwSetKeyCallback(mGlfwWindow, KeyFunc); glfwSetCursorPosCallback(mGlfwWindow, MousePosFunc); glfwSetMouseButtonCallback(mGlfwWindow, MouseButtonFunc); glfwSetScrollCallback(mGlfwWindow, ScrollFunc); glfwSetCharCallback(mGlfwWindow, CharFunc); // to do with joysticks glfwSwapInterval(0); mFrameBuffer->attach(ATT_Color0, RenderViewPtr(new GLScreenColorRenderView(settings.width, settings.height, settings.color_fmt))); mFrameBuffer->attach(ATT_DepthStencil, RenderViewPtr(new GLScreenDepthStencilRenderView(settings.width, settings.height, settings.depth_stencil_fmt))); onResize() += Bind(this, &GLWindow::onWindowResize); updateWindowProperties(wndPosX, wndPosY, settings.width, settings.height); }