/*  $Id: matrix4x4.cpp,v 1.3 2004/04/11 16:56:09 mbn Exp $
**
**  ClanLib Game SDK
**  Copyright (C) 2003  The ClanLib Team
**  For a total list of contributers see the file CREDITS.
**
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Lesser General Public
**  License as published by the Free Software Foundation; either
**  version 2.1 of the License, or (at your option) any later version.
**
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  Lesser General Public License for more details.
**
**  You should have received a copy of the GNU Lesser General Public
**  License along with this library; if not, write to the Free Software
**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
*/

#include "Core/precomp.h"
#include "API/Core/Math/matrix4x4.h"

/////////////////////////////////////////////////////////////////////////////
// CL_Matrix4x4 construction:

CL_Matrix4x4::CL_Matrix4x4(bool identity)
{
	memset(matrix, 0, sizeof(double[16]));
	if (identity)
	{
		matrix[0] = 1.0;
		matrix[5] = 1.0;
		matrix[10] = 1.0;
		matrix[15] = 1.0;
	}
}

CL_Matrix4x4::CL_Matrix4x4(const CL_Matrix4x4 &copy)
{
	for (int i=0; i<16; i++)
		matrix[i] = copy.matrix[i];
}

CL_Matrix4x4::CL_Matrix4x4(double *init_matrix)
{
	for (int i=0; i<16; i++)
		matrix[i] = init_matrix[i];
}

CL_Matrix4x4::CL_Matrix4x4(float *init_matrix)
{
	for (int i=0; i<16; i++)
		matrix[i] = (double) init_matrix[i];
}

/////////////////////////////////////////////////////////////////////////////
// CL_Matrix4x4 attributes:

double CL_Matrix4x4::get_origin_x() const
{
	return matrix[12];
}

double CL_Matrix4x4::get_origin_y() const
{
	return matrix[13];
}

double CL_Matrix4x4::get_origin_z() const
{
	return matrix[14];
}

/////////////////////////////////////////////////////////////////////////////
// CL_Matrix4x4 operations:

bool CL_Matrix4x4::operator==(const CL_Matrix4x4 &other)
{
	for (int i=0; i<16; i++)
		if (matrix[i] != other.matrix[i]) return false;
	return true;
}

bool CL_Matrix4x4::operator!=(const CL_Matrix4x4 &other)
{
	for (int i=0; i<16; i++)
		if (matrix[i] != other.matrix[i]) return true;
	return false;
}

CL_Matrix4x4 &CL_Matrix4x4::operator =(const CL_Matrix4x4 &copy)
{
	for (int i=0; i<16; i++)
		matrix[i] = copy.matrix[i];
	return *this;
}

CL_Matrix4x4 CL_Matrix4x4::multiply(const CL_Matrix4x4 &mult)
{
	CL_Matrix4x4 result;
	for (int x=0; x<4; x++)
	{
		for (int y=0; y<4; y++)
		{
			result.matrix[x+y*4] =
				matrix[x]*mult.matrix[y*4] +
				matrix[x+4]*mult.matrix[y*4+1] +
				matrix[x+8]*mult.matrix[y*4+2] +
				matrix[x+12]*mult.matrix[y*4+3];
		}
	}
	return result;
}

/////////////////////////////////////////////////////////////////////////////
// CL_Matrix4x4 implementation:
