Files
oboe/src/gfx/render_image.cpp

116 lines
3.6 KiB
C++

/*
* graphtool.cpp
* BoE
*
* Created by Celtic Minstrel on 16/04/09.
*
*/
#include "render_image.hpp"
#include <iostream>
#include <fstream>
#include <boost/filesystem/path.hpp>
#include "fileio.hpp"
#include "render_shapes.hpp"
sf::Shader maskShader;
extern fs::path progDir;
void init_shaders() {
fs::path shaderPath = progDir/"data"/"shaders";
fs::path fragPath = shaderPath/"mask.frag", vertPath = shaderPath/"mask.vert";
do {
std::ifstream fin;
fin.open(fragPath.string().c_str());
if(!fin.good()) {
std::cerr << std_fmterr << ": Error loading fragment shader" << std::endl;
break;
}
fin.seekg(0, std::ios::end);
int size = fin.tellg();
fin.seekg(0);
char* fbuf = new char[size + 1];
fbuf[size] = 0;
fin.read(fbuf, size);
fbuf[fin.gcount()] = 0;
fin.close();
fin.open(vertPath.string().c_str());
if(!fin.good()) {
std::cerr << std_fmterr << ": Error loading vertex shader" << std::endl;
delete[] fbuf;
break;
}
fin.seekg(0, std::ios::end);
size = fin.tellg();
fin.seekg(0);
char* vbuf = new char[size + 1];
vbuf[size] = 0;
fin.read(vbuf, size);
vbuf[fin.gcount()] = 0;
if(!maskShader.loadFromMemory(vbuf, fbuf)) {
std::cerr << "Error: Failed to load shaders from " << shaderPath << "\nVertex:\n" << vbuf << "\nFragment:\n" << fbuf << std::endl;
}
delete[] fbuf;
delete[] vbuf;
} while(false);
}
void draw_splash(const sf::Texture& splash, sf::RenderWindow& targ, rectangle dest_rect) {
rectangle from_rect = rectangle(splash);
targ.clear(sf::Color::Black);
rect_draw_some_item(splash, from_rect, targ, dest_rect);
targ.display();
}
static void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode);
void rect_draw_some_item(sf::RenderTarget& targ_gworld,rectangle targ_rect) {
fill_rect(targ_gworld, targ_rect, sf::Color::Black);
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::BlendMode mode){
rect_draw_some_item(src_gworld, src_rect, targ_gworld, targ_rect, sf::RenderStates(mode));
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,sf::RenderTarget& targ_gworld,rectangle targ_rect,sf::RenderStates mode) {
setActiveRenderTarget(targ_gworld);
sf::Sprite tile(src_gworld, src_rect);
tile.setPosition(targ_rect.left, targ_rect.top);
double xScale = targ_rect.width(), yScale = targ_rect.height();
xScale /= src_rect.width();
yScale /= src_rect.height();
tile.setScale(xScale, yScale);
targ_gworld.draw(tile, mode);
}
void rect_draw_some_item(const sf::Texture& src_gworld,rectangle src_rect,const sf::Texture& mask_gworld,sf::RenderTarget& targ_gworld,rectangle targ_rect) {
static sf::RenderTexture src;
static bool inited = false;
if(!inited || src_rect.width() != src.getSize().x || src_rect.height() != src.getSize().y) {
src.create(src_rect.width(), src_rect.height());
inited = true;
}
rectangle dest_rect = src_rect;
dest_rect.offset(-dest_rect.left,-dest_rect.top);
rect_draw_some_item(src_gworld, src_rect, src, dest_rect);
src.display();
maskShader.setParameter("texture", sf::Shader::CurrentTexture);
maskShader.setParameter("mask", mask_gworld);
rect_draw_some_item(src.getTexture(), dest_rect, targ_gworld, targ_rect, &maskShader);
}
void setActiveRenderTarget(sf::RenderTarget& where) {
const std::type_info& type = typeid(where);
if(type == typeid(sf::RenderWindow&))
dynamic_cast<sf::RenderWindow&>(where).setActive();
else if(type == typeid(sf::RenderTexture&))
dynamic_cast<sf::RenderTexture&>(where).setActive();
else throw std::bad_cast();
}