00001
00002
00003 #include "GPUFire.h"
00004
00005 #include "GPUProgram.h"
00006 #include "Renderer.h"
00007 #include "Texture.h"
00008 #include "TextureDatabase.h"
00009 #include "Vector4f.h"
00010
00011
00012 namespace pge{
00013
00014
00015
00016
00017
00018
00019
00020 GPUFire::GPUFire(Vector3f center, float size) : Sprite(center, size) {
00021 m_time = 0.0f;
00022
00023 m_firecolor = TextureDatabase::getInstance()->addTexture("firecolor.jpg");
00024 m_firemask = TextureDatabase::getInstance()->addTexture("firemask.bmp");
00025 m_noise = TextureDatabase::getInstance()->addTexture("firenoise.jpg");
00026
00027 m_program = new GPUProgram("../data/shader/fire_vs.txt", "../data/shader/fire_fs.txt");
00028 }
00029
00030
00031
00032
00033
00034
00035
00036 GPUFire::~GPUFire(void) {
00037 if(m_program != NULL) {
00038 delete m_program;
00039 m_program = NULL;
00040 }
00041 }
00042
00043
00044
00045
00046
00047
00048
00049 bool GPUFire::init(void) {
00050 return Sprite::init();
00051 }
00052
00053
00054
00055
00056
00057
00058
00059 void GPUFire::render(void) {
00060
00061 glActiveTexture(GL_TEXTURE0);
00062 glEnable(GL_TEXTURE_2D);
00063 glBindTexture(GL_TEXTURE_2D, m_firecolor->getDescriptor());
00064
00065
00066 glActiveTexture(GL_TEXTURE1);
00067 glEnable(GL_TEXTURE_2D);
00068 glBindTexture(GL_TEXTURE_2D, m_firemask->getDescriptor());
00069
00070
00071 glActiveTexture(GL_TEXTURE2);
00072 glEnable(GL_TEXTURE_2D);
00073 glBindTexture(GL_TEXTURE_2D, m_noise->getDescriptor());
00074
00075 m_program->bind();
00076
00077 m_program->passUniform1f("time", m_time);
00078 m_program->passUniform3f("layerSpeed", Vector3f(0.1f, 0.1f, 0.1f));
00079 m_program->passUniform4f("height", Vector4f(0.44f, 0.29f, 0.0f, 1.0f));
00080
00081 m_program->passUniform1f("distortion0", 0.09f);
00082 m_program->passUniform1f("distortion1", 0.08f);
00083 m_program->passUniform1f("distortion2", 0.1f);
00084
00085 m_program->passUniform1i("baseTex", 0);
00086 m_program->passUniform1i("opacityTex", 1);
00087 m_program->passUniform1i("distortionTex", 2);
00088
00089
00090 renderer::setTextureAlphaBlendEnabled(true);
00091
00092
00093 Sprite::render();
00094
00095 renderer::setTextureAlphaBlendEnabled(false);
00096
00097
00098
00099 m_program->release();
00100
00101 glActiveTexture(GL_TEXTURE1);
00102 glDisable(GL_TEXTURE_2D);
00103
00104 glActiveTexture(GL_TEXTURE2);
00105 glDisable(GL_TEXTURE_2D);
00106
00107
00108 glActiveTexture(GL_TEXTURE0);
00109 }
00110
00111
00112
00113
00114
00115
00116
00117 void GPUFire::timer(unsigned int delay) {
00118 m_time += 0.1f;
00119
00120
00121 if (m_time >= 100000.0f - 1.0f) {
00122 m_time = 0.0f;
00123 }
00124 }
00125 };