1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-22 02:12:45 +01:00

rwviewer: wrap QOpenGLContext

This commit is contained in:
Anonymous Maarten 2018-08-10 02:40:23 +02:00
parent 50bbfb40f3
commit d212a779c2
8 changed files with 92 additions and 458 deletions

View File

@ -6,7 +6,6 @@ find_package(Qt5Widgets REQUIRED)
add_executable(rwviewer WIN32 add_executable(rwviewer WIN32
main.cpp main.cpp
OpenGLCompat.h
ViewerWindow.hpp ViewerWindow.hpp
ViewerWindow.cpp ViewerWindow.cpp
@ -44,6 +43,8 @@ add_executable(rwviewer WIN32
AnimationListModel.cpp AnimationListModel.cpp
AnimationListWidget.hpp AnimationListWidget.hpp
AnimationListWidget.cpp AnimationListWidget.cpp
QOpenGLContextWrapper.cpp
QOpenGLContextWrapper.hpp
) )
target_link_libraries(rwviewer target_link_libraries(rwviewer

View File

@ -1,432 +0,0 @@
#pragma once
#undef __GLEW_H__
#if defined(RW_OSX) && !defined(_OPENGL_COMPAT_H_)
#define _OPENGL_COMPAT_H_
#undef glActiveShaderProgram
#undef glActiveTexture
#undef glAttachShader
#undef glBeginConditionalRender
#undef glBeginQuery
#undef glBeginTransformFeedback
#undef glBindAttribLocation
#undef glBindBuffer
#undef glBindBufferBase
#undef glBindBufferRange
#undef glBindFragDataLocation
#undef glBindFragDataLocationIndexed
#undef glBindFramebuffer
#undef glBindProgramPipeline
#undef glBindRenderbuffer
#undef glBindSampler
#undef glBindTexture
#undef glBindVertexArray
#undef glBlendColor
#undef glBlendEquation
#undef glBlendEquationSeparate
#undef glBlendFunc
#undef glBlendFuncSeparate
#undef glBlitFramebuffer
#undef glBufferData
#undef glBufferSubData
#undef glCheckFramebufferStatus
#undef glClampColor
#undef glClear
#undef glClearBufferfi
#undef glClearBufferfv
#undef glClearBufferiv
#undef glClearBufferuiv
#undef glClearColor
#undef glClearDepth
#undef glClearDepthf
#undef glClearStencil
#undef glClientWaitSync
#undef glColorMask
#undef glColorMaski
#undef glCompileShader
#undef glCompressedTexImage1D
#undef glCompressedTexImage2D
#undef glCompressedTexImage3D
#undef glCompressedTexSubImage1D
#undef glCompressedTexSubImage2D
#undef glCompressedTexSubImage3D
#undef glCopyBufferSubData
#undef glCopyTexImage1D
#undef glCopyTexImage2D
#undef glCopyTexSubImage1D
#undef glCopyTexSubImage2D
#undef glCopyTexSubImage3D
#undef glCreateProgram
#undef glCreateShader
#undef glCreateShaderProgramv
#undef glCullFace
#undef glDeleteBuffers
#undef glDeleteFramebuffers
#undef glDeleteProgram
#undef glDeleteProgramPipelines
#undef glDeleteQueries
#undef glDeleteRenderbuffers
#undef glDeleteSamplers
#undef glDeleteShader
#undef glDeleteSync
#undef glDeleteTextures
#undef glDeleteVertexArrays
#undef glDepthFunc
#undef glDepthMask
#undef glDepthRange
#undef glDepthRangeArrayv
#undef glDepthRangeIndexed
#undef glDepthRangef
#undef glDetachShader
#undef glDisable
#undef glDisableVertexAttribArray
#undef glDisablei
#undef glDrawArrays
#undef glDrawArraysInstanced
#undef glDrawBuffer
#undef glDrawBuffers
#undef glDrawElements
#undef glDrawElementsBaseVertex
#undef glDrawElementsInstanced
#undef glDrawElementsInstancedBaseVertex
#undef glDrawRangeElements
#undef glDrawRangeElementsBaseVertex
#undef glEnable
#undef glEnableVertexAttribArray
#undef glEnablei
#undef glEndConditionalRender
#undef glEndQuery
#undef glEndTransformFeedback
#undef glFenceSync
#undef glFinish
#undef glFlush
#undef glFlushMappedBufferRange
#undef glFramebufferRenderbuffer
#undef glFramebufferTexture
#undef glFramebufferTexture1D
#undef glFramebufferTexture2D
#undef glFramebufferTexture3D
#undef glFramebufferTextureLayer
#undef glFrontFace
#undef glGenBuffers
#undef glGenFramebuffers
#undef glGenProgramPipelines
#undef glGenQueries
#undef glGenRenderbuffers
#undef glGenSamplers
#undef glGenTextures
#undef glGenVertexArrays
#undef glGenerateMipmap
#undef glGetActiveAttrib
#undef glGetActiveUniform
#undef glGetActiveUniformBlockName
#undef glGetActiveUniformBlockiv
#undef glGetActiveUniformName
#undef glGetActiveUniformsiv
#undef glGetAttachedShaders
#undef glGetAttribLocation
#undef glGetBooleani_v
#undef glGetBooleanv
#undef glGetBufferParameteri64v
#undef glGetBufferParameteriv
#undef glGetBufferPointerv
#undef glGetBufferSubData
#undef glGetCompressedTexImage
#undef glGetDoublei_v
#undef glGetDoublev
#undef glGetError
#undef glGetFloati_v
#undef glGetFloatv
#undef glGetFragDataIndex
#undef glGetFragDataLocation
#undef glGetFramebufferAttachmentParameteriv
#undef glGetInteger64i_v
#undef glGetInteger64v
#undef glGetIntegeri_v
#undef glGetIntegerv
#undef glGetMultisamplefv
#undef glGetProgramBinary
#undef glGetProgramInfoLog
#undef glGetProgramPipelineInfoLog
#undef glGetProgramPipelineiv
#undef glGetProgramiv
#undef glGetQueryObjecti64v
#undef glGetQueryObjectiv
#undef glGetQueryObjectui64v
#undef glGetQueryObjectuiv
#undef glGetQueryiv
#undef glGetRenderbufferParameteriv
#undef glGetSamplerParameterIiv
#undef glGetSamplerParameterIuiv
#undef glGetSamplerParameterfv
#undef glGetSamplerParameteriv
#undef glGetShaderInfoLog
#undef glGetShaderPrecisionFormat
#undef glGetShaderSource
#undef glGetShaderiv
#undef glGetString
#undef glGetStringi
#undef glGetSynciv
#undef glGetTexImage
#undef glGetTexLevelParameterfv
#undef glGetTexLevelParameteriv
#undef glGetTexParameterIiv
#undef glGetTexParameterIuiv
#undef glGetTexParameterfv
#undef glGetTexParameteriv
#undef glGetTransformFeedbackVarying
#undef glGetUniformBlockIndex
#undef glGetUniformIndices
#undef glGetUniformLocation
#undef glGetUniformfv
#undef glGetUniformiv
#undef glGetUniformuiv
#undef glGetVertexAttribIiv
#undef glGetVertexAttribIuiv
#undef glGetVertexAttribPointerv
#undef glGetVertexAttribdv
#undef glGetVertexAttribfv
#undef glGetVertexAttribiv
#undef glHint
#undef glIsBuffer
#undef glIsEnabled
#undef glIsEnabledi
#undef glIsFramebuffer
#undef glIsProgram
#undef glIsProgramPipeline
#undef glIsQuery
#undef glIsRenderbuffer
#undef glIsSampler
#undef glIsShader
#undef glIsSync
#undef glIsTexture
#undef glIsVertexArray
#undef glLineWidth
#undef glLinkProgram
#undef glLogicOp
#undef glMapBuffer
#undef glMapBufferRange
#undef glMultiDrawArrays
#undef glMultiDrawElements
#undef glMultiDrawElementsBaseVertex
#undef glPixelStoref
#undef glPixelStorei
#undef glPointParameterf
#undef glPointParameterfv
#undef glPointParameteri
#undef glPointParameteriv
#undef glPointSize
#undef glPolygonMode
#undef glPolygonOffset
#undef glPrimitiveRestartIndex
#undef glProgramBinary
#undef glProgramParameteri
#undef glProgramUniform1d
#undef glProgramUniform1dv
#undef glProgramUniform1f
#undef glProgramUniform1fv
#undef glProgramUniform1i
#undef glProgramUniform1iv
#undef glProgramUniform1ui
#undef glProgramUniform1uiv
#undef glProgramUniform2d
#undef glProgramUniform2dv
#undef glProgramUniform2f
#undef glProgramUniform2fv
#undef glProgramUniform2i
#undef glProgramUniform2iv
#undef glProgramUniform2ui
#undef glProgramUniform2uiv
#undef glProgramUniform3d
#undef glProgramUniform3dv
#undef glProgramUniform3f
#undef glProgramUniform3fv
#undef glProgramUniform3i
#undef glProgramUniform3iv
#undef glProgramUniform3ui
#undef glProgramUniform3uiv
#undef glProgramUniform4d
#undef glProgramUniform4dv
#undef glProgramUniform4f
#undef glProgramUniform4fv
#undef glProgramUniform4i
#undef glProgramUniform4iv
#undef glProgramUniform4ui
#undef glProgramUniform4uiv
#undef glProgramUniformMatrix2dv
#undef glProgramUniformMatrix2fv
#undef glProgramUniformMatrix2x3dv
#undef glProgramUniformMatrix2x3fv
#undef glProgramUniformMatrix2x4dv
#undef glProgramUniformMatrix2x4fv
#undef glProgramUniformMatrix3dv
#undef glProgramUniformMatrix3fv
#undef glProgramUniformMatrix3x2dv
#undef glProgramUniformMatrix3x2fv
#undef glProgramUniformMatrix3x4dv
#undef glProgramUniformMatrix3x4fv
#undef glProgramUniformMatrix4dv
#undef glProgramUniformMatrix4fv
#undef glProgramUniformMatrix4x2dv
#undef glProgramUniformMatrix4x2fv
#undef glProgramUniformMatrix4x3dv
#undef glProgramUniformMatrix4x3fv
#undef glProvokingVertex
#undef glQueryCounter
#undef glReadBuffer
#undef glReadPixels
#undef glReleaseShaderCompiler
#undef glRenderbufferStorage
#undef glRenderbufferStorageMultisample
#undef glSampleCoverage
#undef glSampleMaski
#undef glSamplerParameterIiv
#undef glSamplerParameterIuiv
#undef glSamplerParameterf
#undef glSamplerParameterfv
#undef glSamplerParameteri
#undef glSamplerParameteriv
#undef glScissor
#undef glScissorArrayv
#undef glScissorIndexed
#undef glScissorIndexedv
#undef glShaderBinary
#undef glShaderSource
#undef glStencilFunc
#undef glStencilFuncSeparate
#undef glStencilMask
#undef glStencilMaskSeparate
#undef glStencilOp
#undef glStencilOpSeparate
#undef glTexBuffer
#undef glTexImage1D
#undef glTexImage2D
#undef glTexImage2DMultisample
#undef glTexImage3D
#undef glTexImage3DMultisample
#undef glTexParameterIiv
#undef glTexParameterIuiv
#undef glTexParameterf
#undef glTexParameterfv
#undef glTexParameteri
#undef glTexParameteriv
#undef glTexSubImage1D
#undef glTexSubImage2D
#undef glTexSubImage3D
#undef glTransformFeedbackVaryings
#undef glUniform1f
#undef glUniform1fv
#undef glUniform1i
#undef glUniform1iv
#undef glUniform1ui
#undef glUniform1uiv
#undef glUniform2f
#undef glUniform2fv
#undef glUniform2i
#undef glUniform2iv
#undef glUniform2ui
#undef glUniform2uiv
#undef glUniform3f
#undef glUniform3fv
#undef glUniform3i
#undef glUniform3iv
#undef glUniform3ui
#undef glUniform3uiv
#undef glUniform4f
#undef glUniform4fv
#undef glUniform4i
#undef glUniform4iv
#undef glUniform4ui
#undef glUniform4uiv
#undef glUniformBlockBinding
#undef glUniformMatrix2fv
#undef glUniformMatrix2x3fv
#undef glUniformMatrix2x4fv
#undef glUniformMatrix3fv
#undef glUniformMatrix3x2fv
#undef glUniformMatrix3x4fv
#undef glUniformMatrix4fv
#undef glUniformMatrix4x2fv
#undef glUniformMatrix4x3fv
#undef glUnmapBuffer
#undef glUseProgram
#undef glUseProgramStages
#undef glValidateProgram
#undef glValidateProgramPipeline
#undef glVertexAttrib1d
#undef glVertexAttrib1dv
#undef glVertexAttrib1f
#undef glVertexAttrib1fv
#undef glVertexAttrib1s
#undef glVertexAttrib1sv
#undef glVertexAttrib2d
#undef glVertexAttrib2dv
#undef glVertexAttrib2f
#undef glVertexAttrib2fv
#undef glVertexAttrib2s
#undef glVertexAttrib2sv
#undef glVertexAttrib3d
#undef glVertexAttrib3dv
#undef glVertexAttrib3f
#undef glVertexAttrib3fv
#undef glVertexAttrib3s
#undef glVertexAttrib3sv
#undef glVertexAttrib4Nbv
#undef glVertexAttrib4Niv
#undef glVertexAttrib4Nsv
#undef glVertexAttrib4Nub
#undef glVertexAttrib4Nubv
#undef glVertexAttrib4Nuiv
#undef glVertexAttrib4Nusv
#undef glVertexAttrib4bv
#undef glVertexAttrib4d
#undef glVertexAttrib4dv
#undef glVertexAttrib4f
#undef glVertexAttrib4fv
#undef glVertexAttrib4iv
#undef glVertexAttrib4s
#undef glVertexAttrib4sv
#undef glVertexAttrib4ubv
#undef glVertexAttrib4uiv
#undef glVertexAttrib4usv
#undef glVertexAttribDivisor
#undef glVertexAttribI1i
#undef glVertexAttribI1iv
#undef glVertexAttribI1ui
#undef glVertexAttribI1uiv
#undef glVertexAttribI2i
#undef glVertexAttribI2iv
#undef glVertexAttribI2ui
#undef glVertexAttribI2uiv
#undef glVertexAttribI3i
#undef glVertexAttribI3iv
#undef glVertexAttribI3ui
#undef glVertexAttribI3uiv
#undef glVertexAttribI4bv
#undef glVertexAttribI4i
#undef glVertexAttribI4iv
#undef glVertexAttribI4sv
#undef glVertexAttribI4ubv
#undef glVertexAttribI4ui
#undef glVertexAttribI4uiv
#undef glVertexAttribI4usv
#undef glVertexAttribIPointer
#undef glVertexAttribP1ui
#undef glVertexAttribP1uiv
#undef glVertexAttribP2ui
#undef glVertexAttribP2uiv
#undef glVertexAttribP3ui
#undef glVertexAttribP3uiv
#undef glVertexAttribP4ui
#undef glVertexAttribP4uiv
#undef glVertexAttribPointer
#undef glViewport
#undef glViewportArrayv
#undef glViewportIndexedf
#undef glViewportIndexedfv
#undef glWaitSync
#endif

View File

@ -0,0 +1,37 @@
#include "QOpenGLContextWrapper.hpp"
#include <QApplication>
#include <QMessageBox>
#include <QOpenGLContext>
QOpenGLContextWrapper::QOpenGLContextWrapper(QWidget *parent)
: m_parent(parent) {
}
void QOpenGLContextWrapper::setup(QSurfaceFormat format) {
m_context = new QOpenGLContext(m_parent);
m_context->setShareContext(QOpenGLContext::globalShareContext());
m_context->setFormat(format);
}
bool QOpenGLContextWrapper::create() {
if (!m_context->create()) {
QMessageBox::critical(m_parent, "OpenGL Failure",
"Failed to create OpenGL context");
QApplication::exit(1);
return false;
}
return true;
}
bool QOpenGLContextWrapper::makeCurrent(QSurface *surface) {
return m_context->makeCurrent(surface);
}
void QOpenGLContextWrapper::doneCurrent() {
m_context->doneCurrent();
}
void QOpenGLContextWrapper::swapBuffers(QSurface *surface) {
m_context->swapBuffers(surface);
}

View File

@ -0,0 +1,28 @@
#ifndef _RWVIEWER_QOPENGLWRAPPER_HPP
#define _RWVIEWER_QOPENGLWRAPPER_HPP
#include <QSurfaceFormat>
class QOpenGLContext;
class QSurface;
class QWidget;
class QOpenGLContextWrapper {
public:
QOpenGLContextWrapper(QWidget *parent);
void setup(QSurfaceFormat format);
bool create();
bool makeCurrent(QSurface *surface);
void doneCurrent();
void swapBuffers(QSurface *surface);
QOpenGLContext *get() {
return m_context;
}
private:
QOpenGLContext *m_context;
QWidget *m_parent;
};
#endif

View File

@ -1,6 +1,7 @@
#include "ViewerWidget.hpp" #include "ViewerWidget.hpp"
#include <QFileDialog>
#include <QMouseEvent> #include "QOpenGLContextWrapper.hpp"
#include <engine/Animator.hpp> #include <engine/Animator.hpp>
#include <engine/GameData.hpp> #include <engine/GameData.hpp>
#include <engine/GameWorld.hpp> #include <engine/GameWorld.hpp>
@ -12,6 +13,9 @@
#include <render/ObjectRenderer.hpp> #include <render/ObjectRenderer.hpp>
#include <render/TextRenderer.hpp> #include <render/TextRenderer.hpp>
#include <QFileDialog>
#include <QMouseEvent>
constexpr float kViewFov = glm::radians(90.0f); constexpr float kViewFov = glm::radians(90.0f);
namespace { namespace {
@ -32,9 +36,9 @@ ViewCamera OrbitCamera (const glm::vec2& viewPort, const glm::vec2& viewAngles,
} }
} }
ViewerWidget::ViewerWidget(QOpenGLContext* context, QWindow* parent) ViewerWidget::ViewerWidget(QOpenGLContextWrapper* context, QWindow* parent)
: QWindow(parent) : QWindow(parent)
, context(context) { , m_context(context) {
setSurfaceType(OpenGLSurface); setSurfaceType(OpenGLSurface);
} }
@ -335,7 +339,7 @@ void ViewerWidget::renderNow() {
return; return;
} }
context->makeCurrent(this); m_context->makeCurrent(this);
if (!initialised) { if (!initialised) {
initGL(); initGL();
@ -343,7 +347,7 @@ void ViewerWidget::renderNow() {
} }
paintGL(); paintGL();
context->swapBuffers(this); m_context->swapBuffers(this);
requestUpdate(); requestUpdate();
} }

View File

@ -10,13 +10,11 @@
#include <render/TextRenderer.hpp> #include <render/TextRenderer.hpp>
#include <glm/glm.hpp> #include <glm/glm.hpp>
// Prevent Qt from conflicting with glLoadGen on macOS #include <QWindow>
#include "OpenGLCompat.h"
#include <QOpenGLWindow>
class GameRenderer;
class Clump; class Clump;
class GameRenderer;
class QOpenGLContextWrapper;
class ViewerWidget : public QWindow { class ViewerWidget : public QWindow {
Q_OBJECT Q_OBJECT
@ -32,7 +30,7 @@ public:
Text, Text,
}; };
ViewerWidget(QOpenGLContext* context, QWindow* parent); ViewerWidget(QOpenGLContextWrapper* context, QWindow* parent);
void initGL(); void initGL();
void paintGL(); void paintGL();
@ -80,7 +78,7 @@ protected:
Mode _viewMode = Mode::World; Mode _viewMode = Mode::World;
QOpenGLContext* context; QOpenGLContextWrapper* m_context;
GameWorld* _world = nullptr; GameWorld* _world = nullptr;
GameRenderer* _renderer = nullptr; GameRenderer* _renderer = nullptr;

View File

@ -21,6 +21,7 @@ static int MaxRecentGames = 5;
ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags) ViewerWindow::ViewerWindow(QWidget* parent, Qt::WindowFlags flags)
: QMainWindow(parent, flags) : QMainWindow(parent, flags)
, m_context(this)
, gameData(nullptr) , gameData(nullptr)
, gameWorld(nullptr) , gameWorld(nullptr)
, renderer(nullptr) { , renderer(nullptr) {
@ -64,15 +65,13 @@ bool ViewerWindow::setupEngine() {
QSurfaceFormat format = windowHandle()->format(); QSurfaceFormat format = windowHandle()->format();
format.setProfile(QSurfaceFormat::CoreProfile); format.setProfile(QSurfaceFormat::CoreProfile);
format.setVersion(3,3); format.setVersion(3,3);
context_ = new QOpenGLContext(this); m_context.setup(format);
context_->setShareContext(QOpenGLContext::globalShareContext());
context_->setFormat(format);
hiddenSurface = new QOffscreenSurface(windowHandle()->screen()); hiddenSurface = new QOffscreenSurface(windowHandle()->screen());
hiddenSurface->setFormat(format); hiddenSurface->setFormat(format);
hiddenSurface->create(); hiddenSurface->create();
if (!context_->create()) { if (!m_context.create()) {
QMessageBox::critical(this, "OpenGL Failure", QMessageBox::critical(this, "OpenGL Failure",
"Failed to create OpenGL context"); "Failed to create OpenGL context");
QApplication::exit(1); QApplication::exit(1);
@ -194,16 +193,16 @@ ViewerWindow::~ViewerWindow() {
} }
bool ViewerWindow::makeCurrent() { bool ViewerWindow::makeCurrent() {
if (!context_->makeCurrent(hiddenSurface)) { if (!m_context.makeCurrent(hiddenSurface)) {
QMessageBox::critical(this, "OpenGL", "makeCurrent failed"); QMessageBox::critical(this, "OpenGL", "makeCurrent failed");
QApplication::exit(1); QApplication::exit(1);
return false; return false;
} }
return true; return true;
} }
ViewerWidget *ViewerWindow::createViewer() { ViewerWidget *ViewerWindow::createViewer() {
auto view = new ViewerWidget(context_, windowHandle()); auto view = new ViewerWidget(&m_context, windowHandle());
connect(this, &ViewerWindow::gameLoaded, view, &ViewerWidget::gameLoaded); connect(this, &ViewerWindow::gameLoaded, view, &ViewerWidget::gameLoaded);
return view; return view;
} }

View File

@ -1,16 +1,15 @@
#ifndef _VIEWERWINDOW_HPP_ #ifndef _VIEWERWINDOW_HPP_
#define _VIEWERWINDOW_HPP_ #define _VIEWERWINDOW_HPP_
#include "QOpenGLContextWrapper.hpp"
#include <core/Logger.hpp> #include <core/Logger.hpp>
#include <engine/GameData.hpp> #include <engine/GameData.hpp>
#include <engine/GameWorld.hpp> #include <engine/GameWorld.hpp>
// Prevent Qt from conflicting with glLoadGen on macOS
#include "OpenGLCompat.h"
#include <QMainWindow> #include <QMainWindow>
#include <QTabWidget> #include <QTabWidget>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QOpenGLContext>
#include <QOffscreenSurface> #include <QOffscreenSurface>
#include <memory> #include <memory>
@ -21,7 +20,7 @@ class GameRenderer;
class ViewerWindow : public QMainWindow { class ViewerWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
QOpenGLContext* context_; QOpenGLContextWrapper m_context;
QOffscreenSurface* hiddenSurface; QOffscreenSurface* hiddenSurface;
QTabWidget* views; QTabWidget* views;