- render battle end screen to texture buffer on first render so it takes less fps to render after the 1st frame

This commit is contained in:
Mark Vejvoda
2011-06-12 05:54:54 +00:00
parent 722261e212
commit f0c636d2ff
4 changed files with 362 additions and 255 deletions

View File

@@ -1387,6 +1387,25 @@ Vec2i computeCenteredPos(const string &text, Font3D *font, int x, int y) {
return textPos;
}
void Renderer::renderTextBoundingBox3D(const string &text, Font3D *font, float alpha, int x, int y, int w, int h, bool centered) {
glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT);
glEnable(GL_BLEND);
glColor4fv(Vec4f(1.f, 1.f, 1.f, alpha).ptr());
Vec2f pos= Vec2f(x, y);
//Vec2i pos= centered? computeCenteredPos(text, font, x, y): Vec2i(x, y);
if(centered == true) {
getCentered3DPos(text, font, pos, w, h);
}
textRenderer3D->begin(font);
textRenderer3D->render(text, pos.x, pos.y);
textRenderer3D->end();
glDisable(GL_BLEND);
glPopAttrib();
}
void Renderer::renderText3D(const string &text, Font3D *font, float alpha, int x, int y, bool centered) {
glPushAttrib(GL_ENABLE_BIT | GL_CURRENT_BIT);
glEnable(GL_BLEND);
@@ -1633,7 +1652,8 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) {
if(color != NULL) {
if(renderText3DEnabled == true) {
renderText3D(lines[i], label->getFont3D(), (*color), textPos.x, textPos.y, label->getCentered());
//renderText3D(lines[i], label->getFont3D(), (*color), textPos.x, textPos.y, label->getCentered());
renderTextBoundingBox3D(lines[i], label->getFont3D(), (*color), x, y, w, h, label->getCentered());
}
else {
renderText(lines[i], label->getFont(), (*color), textPos.x, textPos.y, label->getCentered());
@@ -1641,7 +1661,8 @@ void Renderer::renderLabel(GraphicLabel *label,const Vec4f *color) {
}
else {
if(renderText3DEnabled == true) {
renderText3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered());
//renderText3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered());
renderTextBoundingBox3D(lines[i], label->getFont3D(), GraphicComponent::getFade(), x, y, w, h, label->getCentered());
}
else {
renderText(lines[i], label->getFont(), GraphicComponent::getFade(), textPos.x, textPos.y, label->getCentered());
@@ -1841,7 +1862,9 @@ void Renderer::renderCheckBox(const GraphicCheckBox *box) {
//lighting
float anim= GraphicComponent::getAnim();
if(anim>0.5f) anim= 1.f-anim;
if(anim > 0.5f) {
anim = 1.f - anim;
}
if(box->getLighted() && box->getEditable()) {
const int lightSize= 0;
@@ -5489,6 +5512,49 @@ VisibleQuadContainerCache & Renderer::getQuadCache( bool updateOnDirtyFrame,
return quadCache;
}
void Renderer::beginRenderToTexture(Texture2D **renderToTexture) {
static bool supportFBOs = Texture2DGl().supports_FBO_RBO();
if(supportFBOs == true && renderToTexture != NULL) {
Config &config= Config::getInstance();
Texture2D::Filter textureFilter = strToTextureFilter(config.getString("Filter"));
int maxAnisotropy = config.getInt("FilterMaxAnisotropy");
const Metrics &metrics = Metrics::getInstance();
*renderToTexture = GraphicsInterface::getInstance().getFactory()->newTexture2D();
Texture2DGl *texture = static_cast<Texture2DGl *>(*renderToTexture);
texture->setMipmap(false);
Pixmap2D *pixmapScreenShot = texture->getPixmap();
pixmapScreenShot->init(metrics.getScreenW(), metrics.getScreenH(), 4);
texture->setForceCompressionDisabled(true);
texture->init(textureFilter,maxAnisotropy);
texture->setup_FBO_RBO();
assertGl();
if(texture->checkFrameBufferStatus() == false) {
//printf("******************** WARNING CANNOT Attach to FBO!\n");
texture->end();
delete texture;
*renderToTexture=NULL;
}
}
}
void Renderer::endRenderToTexture(Texture2D **renderToTexture) {
static bool supportFBOs = Texture2DGl().supports_FBO_RBO();
if(supportFBOs == true && renderToTexture != NULL) {
Texture2DGl *texture = static_cast<Texture2DGl *>(*renderToTexture);
if(texture != NULL) {
texture->dettachFrameBufferFromTexture();
}
assertGl();
}
}
void Renderer::renderMapPreview( const MapPreview *map, bool renderAll,
int screenPosX, int screenPosY,
Texture2D **renderToTexture) {

View File

@@ -371,6 +371,10 @@ public:
Vec2f getCentered3DPos(const string &text, Font3D *font, Vec2f &pos, int w, int h);
void renderTextBoundingBox3D(const string &text, Font3D *font, const Vec4f &color, int x, int y, int w, int h, bool centered);
void renderTextBoundingBox3D(const string &text, Font3D *font, const Vec3f &color, int x, int y, int w, int h, bool centered);
void renderTextBoundingBox3D(const string &text, Font3D *font, float alpha, int x, int y, int w, int h, bool centered);
void beginRenderToTexture(Texture2D **renderToTexture);
void endRenderToTexture(Texture2D **renderToTexture);
//components
void renderLabel(GraphicLabel *label);

View File

@@ -42,6 +42,7 @@ BattleEnd::BattleEnd(Program *program, const Stats *stats): ProgramState(program
mouseX = 0;
mouseY = 0;
mouse2d = 0;
renderToTexture = NULL;
const Metrics &metrics= Metrics::getInstance();
Lang &lang= Lang::getInstance();
@@ -59,7 +60,14 @@ BattleEnd::BattleEnd(Program *program, const Stats *stats): ProgramState(program
BattleEnd::~BattleEnd() {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__);
SoundRenderer::getInstance().playMusic(CoreData::getInstance().getMenuMusic());
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__);
delete renderToTexture;
renderToTexture = NULL;
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__);
}
@@ -73,6 +81,29 @@ void BattleEnd::update() {
void BattleEnd::render() {
Renderer &renderer= Renderer::getInstance();
if(renderToTexture != NULL) {
//printf("Rendering from texture!\n");
renderer.clearBuffers();
renderer.reset2d();
renderer.renderBackground(renderToTexture);
renderer.renderButton(&buttonExit);
//exit message box
if(mainMessageBox.getEnabled()){
renderer.renderMessageBox(&mainMessageBox);
}
renderer.renderMouse2d(mouseX, mouseY, mouse2dAnim);
renderer.swapBuffers();
}
else {
//printf("Rendering to texture!\n");
renderer.beginRenderToTexture(&renderToTexture);
TextRenderer2D *textRenderer2D = renderer.getTextRenderer();
TextRenderer3D *textRenderer3D = renderer.getTextRenderer3D();
TextRenderer *textRenderer = NULL;
@@ -352,10 +383,15 @@ void BattleEnd::render(){
renderer.renderMessageBox(&mainMessageBox);
}
if(renderToTexture == NULL) {
renderer.renderMouse2d(mouseX, mouseY, mouse2d, 0.f);
}
renderer.endRenderToTexture(&renderToTexture);
renderer.swapBuffers();
}
}
void BattleEnd::keyDown(char key){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s %d]\n",__FILE__,__FUNCTION__,__LINE__);

View File

@@ -33,6 +33,7 @@ private:
int mouseY;
int mouse2d;
GraphicMessageBox mainMessageBox;
Texture2D *renderToTexture;
void showMessageBox(const string &text, const string &header, bool toggle);