]> Dogcows Code - chaz/yoink/blobdiff - src/Hud.cc
preliminary physics, sound, hud
[chaz/yoink] / src / Hud.cc
diff --git a/src/Hud.cc b/src/Hud.cc
new file mode 100644 (file)
index 0000000..ea0dfea
--- /dev/null
@@ -0,0 +1,176 @@
+
+/*******************************************************************************
+
+ 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: *************************************************/
+
This page took 0.022242 seconds and 4 git commands to generate.