+
+/*******************************************************************************
+
+ Copyright (c) 2009, Charles McGarvey
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+*******************************************************************************/
+
+#include <Moof/OpenGL.hh>
+
+#include "Hud.hh"
+
+#include <iostream>
+
+
+ProgressBar::ProgressBar(const Mf::Tilemap& tilemap, Mf::Tilemap::Index index) :
+ progress_(0.0),
+ tilemap_(tilemap)
+{
+ tilemap.getTileCoords(index, texCoords_);
+
+ Mf::Scalar half = (texCoords_[2] - texCoords_[0]) / 2.0 + texCoords_[0];
+ midCoords_[0] = half - 0.01;
+ midCoords_[1] = half + 0.01;
+}
+
+void ProgressBar::resize(const Mf::Rectangle& rect)
+{
+ Mf::Scalar height = rect.max[1] - rect.min[1];
+ Mf::Scalar halfHeight = height / 2.0;
+
+ width_ = rect.max[0] - rect.min[0] - height;
+ // assert width > 0
+
+ vertices_[0] = rect.min;
+ vertices_[1] = Mf::Vector2(rect.min[0] + halfHeight, rect.min[1]);
+ vertices_[2] = vertices_[1];
+ vertices_[3] = Mf::Vector2(rect.min[0] + height, rect.min[1]);
+ vertices_[4] = Mf::Vector2(rect.min[0] + height, rect.max[1]);
+ vertices_[5] = Mf::Vector2(rect.min[0] + halfHeight, rect.max[1]);
+ vertices_[6] = vertices_[5];
+ vertices_[7] = Mf::Vector2(rect.min[0], rect.max[1]);
+
+ setProgress(progress_);
+}
+
+void ProgressBar::setProgress(Mf::Scalar progress)
+{
+ Mf::Scalar halfHeight = (vertices_[7][1] - vertices_[0][1]) / 2.0;
+
+ vertices_[2][0] = vertices_[1][0] + progress * width_;
+ vertices_[3][0] = vertices_[1][0] + progress * width_ + halfHeight;
+ vertices_[4][0] = vertices_[1][0] + progress * width_ + halfHeight;
+ vertices_[5][0] = vertices_[1][0] + progress * width_;
+
+ progress_ = progress;
+}
+
+void ProgressBar::draw(Mf::Scalar alpha) const
+{
+ if (Mf::isEqual(progress_, 0.0))
+ {
+ // don't draw anything if the progress is 0%
+ return;
+ }
+
+ glColor4f(1.0f, 1.0f, 1.0f, 0.85f);
+ tilemap_.bind();
+
+ glBegin(GL_QUADS);
+ glTexCoord2(texCoords_[0], texCoords_[1]);
+ glVertex2v(vertices_[0].data());
+ glTexCoord2(midCoords_[0], texCoords_[3]);
+ glVertex2v(vertices_[1].data());
+ glTexCoord2(midCoords_[0], texCoords_[5]);
+ glVertex2v(vertices_[6].data());
+ glTexCoord2(texCoords_[6], texCoords_[7]);
+ glVertex2v(vertices_[7].data());
+
+ glTexCoord2(midCoords_[0], texCoords_[1]);
+ glVertex2v(vertices_[1].data());
+ glTexCoord2(midCoords_[1], texCoords_[3]);
+ glVertex2v(vertices_[2].data());
+ glTexCoord2(midCoords_[1], texCoords_[5]);
+ glVertex2v(vertices_[5].data());
+ glTexCoord2(midCoords_[0], texCoords_[7]);
+ glVertex2v(vertices_[6].data());
+
+ glTexCoord2(midCoords_[1], texCoords_[1]);
+ glVertex2v(vertices_[2].data());
+ glTexCoord2(texCoords_[2], texCoords_[3]);
+ glVertex2v(vertices_[3].data());
+ glTexCoord2(texCoords_[4], texCoords_[5]);
+ glVertex2v(vertices_[4].data());
+ glTexCoord2(midCoords_[1], texCoords_[7]);
+ glVertex2v(vertices_[5].data());
+ glEnd();
+}
+
+
+Hud::Hud() :
+ bar1_(Mf::Tilemap("StatusBars"), 0),
+ bar2_(Mf::Tilemap("StatusBars"), 2),
+ font_("Font")
+{
+ resize(800, 600);
+}
+
+
+void Hud::resize(int width, int height)
+{
+ cml::matrix_orthographic_RH( projection_,
+ 0.0,
+ Mf::Scalar(width), 0.0, Mf::Scalar(height),
+ 1.0, -1.0, cml::z_clip_neg_one);
+
+ // position the two progress bars at the top-left of the screen
+ bar1_.resize(Mf::Rectangle(20, height - 51,
+ 0.7 * width, height - 3));
+ bar2_.resize(Mf::Rectangle(20, height - 28,
+ 0.7 * width, height - 70));
+
+ setBar1Progress(0.05);
+ setBar2Progress(0.0);
+}
+
+
+void Hud::draw(Mf::Scalar alpha) const
+{
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadMatrix(projection_.data());
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadIdentity();
+
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_BLEND);
+
+ bar1_.draw();
+ bar2_.draw();
+
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+}
+
+
+/** vim: set ts=4 sw=4 tw=80: *************************************************/
+