00001
00002
00003 #include "Sprite.h"
00004
00005 #include "Renderer.h"
00006 #include "Texture.h"
00007
00008
00009 namespace pge {
00010
00011
00012
00013
00014
00015
00016
00017 Sprite::Sprite(Vector3f topLeft, Vector3f topRight, Vector3f bottomRight, Vector3f bottomLeft) {
00018 m_topLeft = topLeft;
00019 m_topRight = topRight;
00020 m_bottomLeft = bottomLeft;
00021 m_bottomRight = bottomRight;
00022
00023
00024 m_center = topLeft;
00025
00026 m_forceBillboard = false;
00027 m_billboardEnabled = false;
00028
00029 m_size = ((topLeft.subtract(topRight)).magnitude());
00030 m_right = Vector3f();
00031 m_up = Vector3f();
00032
00033 m_texRepeatU = 0.0f;
00034 m_texRepeatV = 0.0f;
00035
00036 m_texture = NULL;
00037
00038 m_color = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
00039 }
00040
00041
00042
00043
00044
00045
00046
00047 Sprite::Sprite(Vector3f center, float size) {
00048 m_topLeft = Vector3f();
00049 m_topRight = Vector3f();
00050 m_bottomLeft = Vector3f();
00051 m_bottomRight = Vector3f();
00052
00053 m_center = center;
00054 m_forceBillboard = true;
00055 m_billboardEnabled = true;
00056
00057 m_size = size;
00058 m_right = Vector3f();
00059 m_up = Vector3f();
00060
00061 m_texRepeatU = 0.0f;
00062 m_texRepeatV = 0.0f;
00063
00064 m_texture = NULL;
00065
00066 m_color = Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
00067 }
00068
00069
00070
00071
00072
00073
00074
00075 Sprite::~Sprite(void) {
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 Vector3f Sprite::getCenter(void) {
00085 return m_center;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094 void Sprite::setCenter(Vector3f center) {
00095 m_center = center;
00096 }
00097
00098
00099
00100
00101
00102
00103
00104 void Sprite::setSize(float size) {
00105 m_size = size;
00106 }
00107
00108
00109
00110
00111
00112
00113
00114 void Sprite::setTexture(Texture *texture) {
00115 m_texture = texture;
00116 }
00117
00118
00119
00120
00121
00122
00123
00124 void Sprite::setColor(Vector4f color) {
00125 m_color = color;
00126 }
00127
00128
00129
00130
00131
00132
00133
00134 bool Sprite::isBillboardEnabled(void) {
00135 return (m_billboardEnabled || m_forceBillboard);
00136 }
00137
00138
00139
00140
00141
00142
00143
00144 void Sprite::setBillboardEnabled(bool enabled) {
00145 m_billboardEnabled = enabled;
00146 }
00147
00148
00149
00150
00151
00152
00153
00154 bool Sprite::init(void) {
00155 return true;
00156 }
00157
00158
00159
00160
00161
00162
00163
00164 void Sprite::render(void) {
00165
00166 if(m_forceBillboard || m_billboardEnabled) {
00167
00168 glGetFloatv(GL_MODELVIEW_MATRIX, m_mat);
00169
00170 m_right.m_v[0] = m_mat[0];
00171 m_right.m_v[1] = m_mat[4];
00172 m_right.m_v[2] = m_mat[8];
00173 m_up.m_v[0] = m_mat[1];
00174 m_up.m_v[1] = m_mat[5];
00175 m_up.m_v[2] = m_mat[9];
00176
00177 m_bottomLeft = m_center.add((m_right.add(m_up)).multiply(-m_size));
00178 m_bottomRight = m_center.add((m_right.subtract(m_up)).multiply(m_size));
00179 m_topRight = m_center.add((m_right.add(m_up)).multiply(m_size));
00180 m_topLeft = m_center.add((m_up.subtract(m_right)).multiply(m_size));
00181
00182
00183 if(m_texture != NULL) {
00184 if(m_texture->hasAlphaBlending()) {
00185 renderer::setTextureAlphaBlendEnabled(true);
00186 }
00187 renderer::setTexture(m_texture, GL_MODULATE);
00188 renderer::color4f(m_color);
00189 }
00190
00191 glBegin(GL_QUADS);
00192
00193 renderer::vertex3f(m_bottomLeft, 0.0f + m_texRepeatU, 1.0f + m_texRepeatV);
00194
00195 renderer::vertex3f(m_bottomRight, 1.0f + m_texRepeatU, 1.0f + m_texRepeatV);
00196
00197 renderer::vertex3f(m_topRight, 1.0f + m_texRepeatU, 0.0f + m_texRepeatV);
00198
00199 renderer::vertex3f(m_topLeft, 0.0f + m_texRepeatU, 0.0f + m_texRepeatV);
00200 glEnd();
00201
00202 if(m_texture != NULL) {
00203 if(m_texture->hasAlphaBlending()) {
00204 renderer::setTextureAlphaBlendEnabled(false);
00205 }
00206 renderer::color4f(1.0f, 1.0f, 1.0f, 1.0f);
00207 }
00208
00209 } else {
00210
00211 if(m_texture != NULL) {
00212 if(m_texture->hasAlphaBlending()) {
00213 renderer::setTextureAlphaBlendEnabled(true);
00214 }
00215 renderer::setTexture(m_texture, GL_MODULATE);
00216 renderer::color4f(m_color);
00217 }
00218
00219 glBegin(GL_QUADS);
00220
00221 renderer::vertex3f(m_bottomLeft, 0.0f + m_texRepeatU, 1.0f + m_texRepeatV);
00222
00223 renderer::vertex3f(m_bottomRight, 1.0f + m_texRepeatU, 1.0f + m_texRepeatV);
00224
00225 renderer::vertex3f(m_topRight, 1.0f + m_texRepeatU, 0.0f + m_texRepeatV);
00226
00227 renderer::vertex3f(m_topLeft, 0.0f + m_texRepeatU, 0.0f + m_texRepeatV);
00228 glEnd();
00229
00230 if(m_texture != NULL) {
00231 if(m_texture->hasAlphaBlending()) {
00232 renderer::setTextureAlphaBlendEnabled(false);
00233 }
00234 renderer::color4f(1.0f, 1.0f, 1.0f, 1.0f);
00235 }
00236 }
00237 }
00238
00239
00240
00241
00242
00243
00244
00245 void Sprite::timer(unsigned int delay) {
00246 }
00247 };