// // Copyright (c) 2010 Linaro Limited // // All rights reserved. This program and the accompanying materials // are made available under the terms of the MIT License which accompanies // this distribution, and is available at // http://www.opensource.org/licenses/mit-license.php // // Contributors: // Jesse Barker - original implementation. // #ifndef STACK_H_ #define STACK_H_ #include #include "mat.h" namespace LibMatrix { // // Simple matrix stack implementation suitable for tracking OpenGL matrix // state. Default construction puts an identity matrix on the top of the // stack. // template class MatrixStack { public: MatrixStack() { theStack_.push_back(T()); } MatrixStack(const T& matrix) { theStack_.push_back(matrix); } ~MatrixStack() {} const T& getCurrent() const { return theStack_.back(); } void push() { theStack_.push_back(theStack_.back()); } void pop() { theStack_.pop_back(); } void loadIdentity() { theStack_.back().setIdentity(); } T& operator*=(const T& rhs) { T& curMatrix = theStack_.back(); curMatrix *= rhs; return curMatrix; } void print() const { const T& curMatrix = theStack_.back(); curMatrix.print(); } unsigned int getDepth() const { return theStack_.size(); } private: std::vector theStack_; }; class Stack4 : public MatrixStack { public: void translate(float x, float y, float z) { *this *= Mat4::translate(x, y, z); } void scale(float x, float y, float z) { *this *= Mat4::scale(x, y, z); } void rotate(float angle, float x, float y, float z) { *this *= Mat4::rotate(angle, x, y, z); } void frustum(float left, float right, float bottom, float top, float near, float far) { *this *= Mat4::frustum(left, right, bottom, top, near, far); } void ortho(float left, float right, float bottom, float top, float near, float far) { *this *= Mat4::ortho(left, right, bottom, top, near, far); } void perspective(float fovy, float aspect, float zNear, float zFar) { *this *= Mat4::perspective(fovy, aspect, zNear, zFar); } void lookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { *this *= Mat4::lookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); } }; } // namespace LibMatrix #endif // STACK_H_