//===========================================================================//
// File:	mtrxstk.hh                                                          //
// Project: MUNGA           Brick: Math Library                              //
// Contents: Interface specification for the matrix class                    //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 11/21/94  JMA  Initial coding.                                            //
// 12/01/94  JMA  Changed Matrix to Matrix4D, based both matrix classes on  //
//                  Matrix44Base                                             //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc.                //
// All Rights reserved worldwide                                             //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL               //
//===========================================================================//

#pragma once

#include "Stuff.hpp"
#include "MemoryBlock.hpp"
#include "Matrix.hpp"
#include "LinearMatrix.hpp"

namespace Stuff {

	//~~~~~~~~~~~~~~~~~~~~~~~ AffinerMatrix4DStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class AffinerMatrix4DStack:
		public MemoryStackOf<AffineMatrix4D>
	{
	 public:
		AffinerMatrix4DStack(
			size_t start,
			size_t delta,
			const char* name
		):
			MemoryStackOf<AffineMatrix4D>(start, delta, name)
				{}

		AffinerMatrix4DStack&
			Concatenate(const AffineMatrix4D& matrix);

		AffineMatrix4D&
			Push(const AffineMatrix4D& matrix);

		operator AffineMatrix4D&()
			{Check_Object(this); return *Peek();}
	};

	//~~~~~~~~~~~~~~~~~~~~~~~ LinearMatrix4DStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class LinearMatrix4DStack:
		public MemoryStackOf<LinearMatrix4D>
	{
	 public:
		LinearMatrix4DStack(
			size_t start,
			size_t delta,
			const char* name
		):
			MemoryStackOf<LinearMatrix4D>(start, delta, name)
				{}

		LinearMatrix4DStack&
			Concatenate(const LinearMatrix4D& matrix);

		LinearMatrix4D&
			Push(const LinearMatrix4D& matrix);

		operator LinearMatrix4D&()
			{Check_Object(this); return *Peek();}
	};

	//~~~~~~~~~~~~~~~~~~~~~~~~~~ Matrix4DStack ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	class Matrix4DStack:
		public MemoryStackOf<Matrix4D>
	{
	 public:
		Matrix4DStack(
			size_t start,
			size_t delta,
			const char* name
		):
			MemoryStackOf<Matrix4D>(start, delta, name)
				{}

		Matrix4DStack&
			Concatenate(const Matrix4D& matrix);
		Matrix4DStack&
			Concatenate(const AffineMatrix4D& matrix);

		Matrix4D&
			Push(const Matrix4D& matrix);
		Matrix4D&
			Push(const AffineMatrix4D& matrix);

		operator Matrix4D&()
			{Check_Object(this); return *Peek();}
	};

}
