16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 22:09:19 +02:00

viewport changes

This commit is contained in:
milek7
2019-03-12 19:21:33 +01:00
parent e85d588851
commit dba2308997
8 changed files with 86 additions and 74 deletions

View File

@@ -204,13 +204,22 @@ struct global_settings {
struct extraviewport_config { struct extraviewport_config {
std::string monitor; std::string monitor;
int width; int width, height;
int height;
glm::mat4 transform; glm::mat4 transform;
}; };
std::vector<extraviewport_config> extra_viewports; std::vector<extraviewport_config> extra_viewports;
struct pythonviewport_config {
std::string surface;
std::string monitor;
glm::ivec2 size;
glm::ivec2 offset;
glm::ivec2 cut;
};
std::vector<pythonviewport_config> python_viewports;
std::vector<std::pair<std::string, std::string>> network_servers; std::vector<std::pair<std::string, std::string>> network_servers;
std::optional<std::pair<std::string, std::string>> network_client; std::optional<std::pair<std::string, std::string>> network_client;

View File

@@ -486,6 +486,9 @@ eu07_application::window( int const Windowindex, bool visible, int width, int he
if( childwindow != nullptr ) { if( childwindow != nullptr ) {
m_windows.emplace_back( childwindow ); m_windows.emplace_back( childwindow );
} }
glfwFocusWindow(m_windows.front()); // restore focus to main window
return childwindow; return childwindow;
} }
@@ -494,21 +497,23 @@ GLFWmonitor* eu07_application::find_monitor(const std::string &str) {
GLFWmonitor **monitors = glfwGetMonitors(&monitor_count); GLFWmonitor **monitors = glfwGetMonitors(&monitor_count);
for (size_t i = 0; i < monitor_count; i++) { for (size_t i = 0; i < monitor_count; i++) {
std::string name(glfwGetMonitorName(monitors[i])); if (describe_monitor(monitors[i]) == str)
std::replace(std::begin(name), std::end(name), ' ', '_');
int x, y;
glfwGetMonitorPos(monitors[i], &x, &y);
std::string desc = name + ":" + std::to_string(x) + "," + std::to_string(y);
if (desc == str)
return monitors[i]; return monitors[i];
} }
return nullptr; return nullptr;
} }
std::string eu07_application::describe_monitor(GLFWmonitor *monitor) {
std::string name(glfwGetMonitorName(monitor));
std::replace(std::begin(name), std::end(name), ' ', '_');
int x, y;
glfwGetMonitorPos(monitor, &x, &y);
return name + ":" + std::to_string(x) + "," + std::to_string(y);
}
// private: // private:
void void
@@ -601,27 +606,21 @@ eu07_application::init_glfw() {
// match requested video mode to current to allow for // match requested video mode to current to allow for
// fullwindow creation when resolution is the same // fullwindow creation when resolution is the same
auto *monitor { glfwGetPrimaryMonitor() };
{ {
int monitor_count; int monitor_count;
GLFWmonitor **monitors = glfwGetMonitors(&monitor_count); GLFWmonitor **monitors = glfwGetMonitors(&monitor_count);
WriteLog("available monitors:"); WriteLog("available monitors:");
for (size_t i = 0; i < monitor_count; i++) { for (size_t i = 0; i < monitor_count; i++) {
std::string name(glfwGetMonitorName(monitors[i])); WriteLog(describe_monitor(monitors[i]));
std::replace(std::begin(name), std::end(name), ' ', '_');
int x, y;
glfwGetMonitorPos(monitors[i], &x, &y);
std::string desc = name + ":" + std::to_string(x) + "," + std::to_string(y);
WriteLog(desc);
if (desc == Global.fullscreen_monitor)
monitor = monitors[i];
} }
} }
auto *monitor { find_monitor(Global.fullscreen_monitor) };
if (!monitor)
monitor = glfwGetPrimaryMonitor();
auto const *vmode { glfwGetVideoMode( monitor ) }; auto const *vmode { glfwGetVideoMode( monitor ) };
glfwWindowHint( GLFW_RED_BITS, vmode->redBits ); glfwWindowHint( GLFW_RED_BITS, vmode->redBits );
@@ -735,6 +734,10 @@ eu07_application::init_gfx() {
if (!GfxRenderer.Init(m_windows.front())) if (!GfxRenderer.Init(m_windows.front()))
return -1; return -1;
for (const global_settings::extraviewport_config &conf : Global.extra_viewports)
if (!GfxRenderer.AddViewport(conf))
return -1;
return 0; return 0;
} }

View File

@@ -100,6 +100,8 @@ private:
int init_audio(); int init_audio();
int init_modes(); int init_modes();
bool init_network(); bool init_network();
std::string describe_monitor(GLFWmonitor *monitor);
// members // members
bool m_screenshot_queued = false; bool m_screenshot_queued = false;

View File

@@ -42,6 +42,12 @@ void gl::buffer::unbind(targets target)
binding_points[target] = 0; binding_points[target] = 0;
} }
void gl::buffer::unbind()
{
for (size_t i = 0; i < sizeof(binding_points) / sizeof(GLuint); i++)
unbind((targets)i);
}
gl::buffer::buffer() gl::buffer::buffer()
{ {
glGenBuffers(1, *this); glGenBuffers(1, *this);

View File

@@ -37,6 +37,7 @@ namespace gl
void bind(targets target); void bind(targets target);
void bind_base(targets target, GLuint index); void bind_base(targets target, GLuint index);
static void unbind(targets target); static void unbind(targets target);
static void unbind();
void allocate(targets target, int size, GLenum hint); void allocate(targets target, int size, GLenum hint);
void upload(targets target, const void *data, int offset, int size); void upload(targets target, const void *data, int offset, int size);

View File

@@ -167,22 +167,10 @@ bool opengl_renderer::Init(GLFWwindow *Window)
default_viewport.main = true; default_viewport.main = true;
default_viewport.window = m_window; default_viewport.window = m_window;
for (const global_settings::extraviewport_config &conf : Global.extra_viewports) { if (!init_viewport(default_viewport))
m_viewports.push_back(std::make_unique<viewport_config>()); return false;
viewport_config &vp = *m_viewports.back().get();
vp.width = conf.width;
vp.height = conf.height;
vp.window = Application.window(-1, true, vp.width, vp.height, Application.find_monitor(conf.monitor));
vp.camera_transform = conf.transform;
std::cout << "ZXZ " << glm::to_string(vp.camera_transform) << std::endl;
}
for (auto &viewport : m_viewports) {
if (!init_viewport(*viewport.get()))
return false;
}
glfwMakeContextCurrent(m_window); glfwMakeContextCurrent(m_window);
gl::buffer::unbind();
if (Global.gfx_shadowmap_enabled) if (Global.gfx_shadowmap_enabled)
{ {
@@ -301,6 +289,22 @@ bool opengl_renderer::Init(GLFWwindow *Window)
return true; return true;
} }
bool opengl_renderer::AddViewport(const global_settings::extraviewport_config &conf)
{
m_viewports.push_back(std::make_unique<viewport_config>());
viewport_config &vp = *m_viewports.back().get();
vp.width = conf.width;
vp.height = conf.height;
vp.window = Application.window(-1, true, vp.width, vp.height, Application.find_monitor(conf.monitor));
vp.camera_transform = conf.transform;
bool ret = init_viewport(vp);
glfwMakeContextCurrent(m_window);
gl::buffer::unbind();
return ret;
}
bool opengl_renderer::init_viewport(viewport_config &vp) bool opengl_renderer::init_viewport(viewport_config &vp)
{ {
glfwMakeContextCurrent(vp.window); glfwMakeContextCurrent(vp.window);
@@ -445,6 +449,7 @@ bool opengl_renderer::Render()
} }
glfwMakeContextCurrent(m_window); glfwMakeContextCurrent(m_window);
gl::buffer::unbind();
m_current_viewport = &(*m_viewports.front()); m_current_viewport = &(*m_viewports.front());
m_drawcount = m_cellqueue.size(); m_drawcount = m_cellqueue.size();
@@ -525,17 +530,16 @@ void opengl_renderer::Render_pass(viewport_config &vp, rendermode const Mode)
glDebug("context switch"); glDebug("context switch");
glfwMakeContextCurrent(vp.window); glfwMakeContextCurrent(vp.window);
gl::buffer::unbind();
m_current_viewport = &vp; m_current_viewport = &vp;
if (!simulation::is_ready) if (!simulation::is_ready)
{ {
if (!vp.main)
break;
gl::framebuffer::unbind(); gl::framebuffer::unbind();
glClearColor(0.0f, 0.5f, 0.0f, 1.0f); glClearColor(0.0f, 0.5f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Application.render_ui(); if (vp.main)
Application.render_ui();
break; break;
} }
@@ -1047,7 +1051,7 @@ void opengl_renderer::setup_pass(viewport_config &Viewport, renderpass_config &C
glm::mat4 frustumtest_proj; glm::mat4 frustumtest_proj;
float const fovy = glm::radians(Global.FieldOfView / Global.ZoomFactor); float const fovy = glm::radians(Global.FieldOfView / Global.ZoomFactor);
float const aspect = std::max(1.f, (float)Global.iWindowWidth) / std::max(1.f, (float)Global.iWindowHeight); float const aspect = std::max(1.f, (float)Viewport.width) / std::max(1.f, (float)Viewport.height);
Config.viewport_camera.position() = Global.pCamera.Pos; Config.viewport_camera.position() = Global.pCamera.Pos;
@@ -3458,9 +3462,7 @@ void opengl_renderer::Render_Alpha(TSubModel *Submodel)
void opengl_renderer::Update_Pick_Control() void opengl_renderer::Update_Pick_Control()
{ {
// context-switch workaround // context-switch workaround
gl::buffer::unbind(gl::buffer::PIXEL_PACK_BUFFER); gl::buffer::unbind();
gl::buffer::unbind(gl::buffer::PIXEL_UNPACK_BUFFER);
gl::buffer::unbind(gl::buffer::ARRAY_BUFFER);
if (!m_picking_pbo->is_busy()) if (!m_picking_pbo->is_busy())
{ {

View File

@@ -130,6 +130,8 @@ class opengl_renderer
// methods // methods
bool Init(GLFWwindow *Window); bool Init(GLFWwindow *Window);
bool AddViewport(const global_settings::extraviewport_config &conf);
// main draw call. returns false on error // main draw call. returns false on error
bool Render(); bool Render();
void SwapBuffers(); void SwapBuffers();

View File

@@ -17,38 +17,19 @@ texture_window::texture_window(texture_handle src, std::string surfacename)
tex.create(); tex.create();
m_source = tex.id; m_source = tex.id;
glfwWindowHint(GLFW_VISIBLE, GLFW_TRUE);
int window_w = m_win_w, window_h = m_win_h; int window_w = m_win_w, window_h = m_win_h;
{ auto iter = Global.python_monitormap.find(surfacename);
int monitor_count; if (iter != Global.python_monitormap.end())
GLFWmonitor **monitors = glfwGetMonitors(&monitor_count); monitor = Application.find_monitor((*iter).second);
for (size_t i = 0; i < monitor_count; i++) { if (monitor) {
std::string name(glfwGetMonitorName(monitors[i])); const GLFWvidmode *mode = glfwGetVideoMode(monitor);
std::replace(std::begin(name), std::end(name), ' ', '_'); window_w = mode->width;
window_h = mode->height;
int x, y;
glfwGetMonitorPos(monitors[i], &x, &y);
std::string desc = name + ":" + std::to_string(x) + "," + std::to_string(y);
auto iter = Global.python_monitormap.find(surfacename);
if (iter != Global.python_monitormap.end()
&& (*iter).second == desc) {
monitor = monitors[i];
const GLFWvidmode *mode = glfwGetVideoMode(monitor);
window_w = mode->width;
window_h = mode->height;
break;
}
}
} }
GLFWwindow *root = Application.window(); m_window = Application.window(-1, true, window_w, window_h, monitor);
m_window = glfwCreateWindow(window_w, window_h, ("EU07: surface " + surfacename).c_str(), monitor, root);
glfwSetWindowUserPointer(m_window, this); glfwSetWindowUserPointer(m_window, this);
glfwSetFramebufferSizeCallback(m_window, texture_window_fb_resize); glfwSetFramebufferSizeCallback(m_window, texture_window_fb_resize);
@@ -68,6 +49,12 @@ void texture_window::threadfunc()
glfwMakeContextCurrent(m_window); glfwMakeContextCurrent(m_window);
glfwSwapInterval(1); glfwSwapInterval(1);
{
GLuint v;
glGenVertexArrays(1, &v);
glBindVertexArray(v);
}
gl::shader vert("quad.vert"); gl::shader vert("quad.vert");
gl::shader frag("texturewindow.frag"); gl::shader frag("texturewindow.frag");
gl::program shader(std::vector<std::reference_wrapper<const gl::shader>>({vert, frag})); gl::program shader(std::vector<std::reference_wrapper<const gl::shader>>({vert, frag}));