#include "booster.h" Booster::Booster(Vector3f tpos, BOOST_TYPE ttype) { pos = tpos; type = ttype; } Booster::~Booster() { } Vector3f Booster::GetPosition() { return pos; } BOOST_TYPE Booster::GetType() { return type; } bool Booster::GetAvailability() { return available; } void Booster::SetAvailability(bool value) { available = value; } void Booster::RenderBillboard(TextureAtlas& textureAtlas, Shader& shader, Transformation tran, Player player) { float width = 1.0f; float height = 1.7f; Matrix4 mat4 = tran.GetMatrix(); Vector3f DiffCam = GetPosition() - player.GetPosition(); Vector3f UpCam = Vector3f(mat4.Get12(), mat4.Get22(), mat4.Get32()); Vector3f CrossA = DiffCam.Cross(UpCam); Vector3f CrossB = DiffCam.Cross(CrossA); CrossA.Normalize(); CrossB.Normalize(); Vector3f playerPosition = GetPosition() + Vector3f(0.f, 0.f, 0.f); Vector3f v1 = (playerPosition + CrossA * 0.5 * width + CrossB * 0.5 * height); Vector3f v2 = (playerPosition - CrossA * 0.5 * width + CrossB * 0.5 * height); Vector3f v3 = (playerPosition + CrossA * 0.5 * width - CrossB * 0.5 * height); Vector3f v4 = (playerPosition - CrossA * 0.5 * width - CrossB * 0.5 * height); float u, v, w, h; shader.Use(); textureAtlas.Bind(); textureAtlas.TextureIndexToCoord(0, u, v, w, h); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); glLoadMatrixf(tran.GetMatrix().GetInternalValues()); glBegin(GL_QUADS); glTexCoord2f(u, v); glVertex3f(v1.x, v1.y, v1.z); glTexCoord2f(u + w, v); glVertex3f(v2.x, v2.y, v2.z); glTexCoord2f(u + w, v + h); glVertex3f(v3.x, v3.y, v3.z); glTexCoord2f(u, v + h); glVertex3f(v4.x, v4.y, v4.z); glEnd(); glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR); glBlendEquation(GL_FUNC_SUBTRACT); glDisable(GL_BLEND); shader.Disable(); }