157 lines
4.1 KiB
C++
157 lines
4.1 KiB
C++
#include "DataDefs.h"
|
|
#include "MiscUtils.h"
|
|
#include "modules/Renderer.h"
|
|
|
|
using namespace DFHack;
|
|
using df::global::enabler;
|
|
using df::global::gps;
|
|
using DFHack::Renderer::renderer_wrap;
|
|
|
|
static renderer_wrap *original_renderer = NULL;
|
|
|
|
bool init()
|
|
{
|
|
if (!original_renderer)
|
|
original_renderer = Renderer::GetRenderer();
|
|
return original_renderer;
|
|
}
|
|
|
|
renderer_wrap *Renderer::AddRenderer (renderer_wrap *r, bool refresh_screen)
|
|
{
|
|
if (!init())
|
|
{
|
|
delete r;
|
|
return NULL;
|
|
}
|
|
renderer_wrap *cur = GetRenderer();
|
|
r->parent = cur;
|
|
r->child = NULL;
|
|
r->copy_from_parent();
|
|
if (cur != original_renderer)
|
|
{
|
|
cur->child = original_renderer;
|
|
}
|
|
r->copy_from_parent();
|
|
enabler->renderer = r;
|
|
if (refresh_screen && gps)
|
|
gps->force_full_display_count++;
|
|
return r;
|
|
}
|
|
|
|
void Renderer::RemoveRenderer (renderer_wrap *r)
|
|
{
|
|
if (r)
|
|
{
|
|
if (original_renderer)
|
|
{
|
|
r->parent->child = r->child;
|
|
if (r->child)
|
|
{
|
|
r->child->parent = r->parent;
|
|
}
|
|
enabler->renderer = r->parent;
|
|
}
|
|
delete r;
|
|
}
|
|
}
|
|
|
|
bool Renderer::RendererExists (renderer_wrap *r)
|
|
{
|
|
renderer_wrap *cur = GetRenderer();
|
|
while (cur && cur != r && cur != original_renderer)
|
|
cur = cur->parent;
|
|
return cur == r;
|
|
}
|
|
|
|
void Renderer::renderer_wrap::set_to_null() {
|
|
screen = NULL;
|
|
screentexpos = NULL;
|
|
screentexpos_addcolor = NULL;
|
|
screentexpos_grayscale = NULL;
|
|
screentexpos_cf = NULL;
|
|
screentexpos_cbr = NULL;
|
|
screen_old = NULL;
|
|
screentexpos_old = NULL;
|
|
screentexpos_addcolor_old = NULL;
|
|
screentexpos_grayscale_old = NULL;
|
|
screentexpos_cf_old = NULL;
|
|
screentexpos_cbr_old = NULL;
|
|
}
|
|
|
|
void Renderer::renderer_wrap::copy_from_parent() {
|
|
screen = parent->screen;
|
|
screentexpos = parent->screentexpos;
|
|
screentexpos_addcolor = parent->screentexpos_addcolor;
|
|
screentexpos_grayscale = parent->screentexpos_grayscale;
|
|
screentexpos_cf = parent->screentexpos_cf;
|
|
screentexpos_cbr = parent->screentexpos_cbr;
|
|
screen_old = parent->screen_old;
|
|
screentexpos_old = parent->screentexpos_old;
|
|
screentexpos_addcolor_old = parent->screentexpos_addcolor_old;
|
|
screentexpos_grayscale_old = parent->screentexpos_grayscale_old;
|
|
screentexpos_cf_old = parent->screentexpos_cf_old;
|
|
screentexpos_cbr_old = parent->screentexpos_cbr_old;
|
|
}
|
|
|
|
void Renderer::renderer_wrap::copy_to_parent() {
|
|
parent->screen = screen;
|
|
parent->screentexpos = screentexpos;
|
|
parent->screentexpos_addcolor = screentexpos_addcolor;
|
|
parent->screentexpos_grayscale = screentexpos_grayscale;
|
|
parent->screentexpos_cf = screentexpos_cf;
|
|
parent->screentexpos_cbr = screentexpos_cbr;
|
|
parent->screen_old = screen_old;
|
|
parent->screentexpos_old = screentexpos_old;
|
|
parent->screentexpos_addcolor_old = screentexpos_addcolor_old;
|
|
parent->screentexpos_grayscale_old = screentexpos_grayscale_old;
|
|
parent->screentexpos_cf_old = screentexpos_cf_old;
|
|
parent->screentexpos_cbr_old = screentexpos_cbr_old;
|
|
}
|
|
|
|
void Renderer::renderer_wrap::update_tile(int32_t x, int32_t y) {
|
|
copy_to_parent();
|
|
parent->update_tile(x,y);
|
|
};
|
|
|
|
void Renderer::renderer_wrap::update_all() {
|
|
copy_to_parent();
|
|
parent->update_all();
|
|
};
|
|
|
|
void Renderer::renderer_wrap::render() {
|
|
copy_to_parent();
|
|
parent->render();
|
|
};
|
|
|
|
void Renderer::renderer_wrap::set_fullscreen() {
|
|
copy_to_parent();
|
|
parent->set_fullscreen();
|
|
copy_from_parent();
|
|
};
|
|
|
|
void Renderer::renderer_wrap::zoom(df::zoom_commands z) {
|
|
copy_to_parent();
|
|
parent->zoom(z);
|
|
copy_from_parent();
|
|
};
|
|
|
|
void Renderer::renderer_wrap::resize(int32_t w, int32_t h) {
|
|
copy_to_parent();
|
|
parent->resize(w,h);
|
|
copy_from_parent();
|
|
};
|
|
|
|
void Renderer::renderer_wrap::grid_resize(int32_t w, int32_t h) {
|
|
copy_to_parent();
|
|
parent->grid_resize(w,h);
|
|
copy_from_parent();
|
|
};
|
|
|
|
bool Renderer::renderer_wrap::get_mouse_coords(int32_t* x, int32_t* y) {
|
|
return parent->get_mouse_coords(x,y);
|
|
};
|
|
|
|
bool Renderer::renderer_wrap::uses_opengl() {
|
|
return parent->uses_opengl();
|
|
};
|