// -*- Mode: c++ -*-

#ifndef	__CMAT3T_H__
#define	__CMAT3T_H__

#include <float.h>
#include <iostream.h>
#include <assert.h>
#include <math.h>
#include "cvec3t-vc.h"

template <class F> class CVec3T;
template <class F> class CMat3T;

template <class F>
istream& operator>> ( istream& is, CMat3T<F>& v) {
  is >> m.m[0] >> m.m[4] >> m.m[8]  >> m.m[12]
     >> m.m[1] >> m.m[5] >> m.m[9]  >> m.m[13]
     >> m.m[2] >> m.m[6] >> m.m[10] >> m.m[14]
     >> m.m[3] >> m.m[7] >> m.m[11] >> m.m[15];
  return is;
}


// column type 3 Mattors
template <class F>
class CMat3T {
public:

  CMat3T( void ) {}
  CMat3T( const F m0, const F m4, const F m8,  const F m12,
	      const F m1, const F m5, const F m9,  const F m13,
		  const F m2, const F m6, const F m10, const F m14,
		  const F m3, const F m7, const F m11, const F m15 ) {

	  m[0] = m0; m[4] = m4; m[8]  = m8;  m[12] = m12;
	  m[1] = m1; m[5] = m5; m[9]  = m9;  m[13] = m13;
	  m[2] = m2; m[6] = m6; m[10] = m10; m[14] = m14;
	  m[3] = m3; m[7] = m7; m[11] = m11; m[15] = m15;

  }

  operator F*( void )
    { return &m[0]; }
  operator const F*( void ) const
    { return &m[0]; }

  ~CMat3T( void ) {}
  
  friend istream& operator>>  ( istream& is, CMat3T& v);


  friend ostream& operator<<  ( ostream& os, const CMat3T& v );

  CMat3T& operator=( const CMat3T& c ) {
	  
	  for(int i = 0; i < 16; i ++) m[i] = c.m[i]; 
	  return *this; 
  }

  CMat3T operator+( const CMat3T& c ) const {

	  CMat3T r;
	  for(int i = 0; i < 16; i ++) r.m[i] = m[i] + c.m[i];
	  return r;
  }

  CMat3T operator-( const CMat3T& c ) const {

	  CMat3T r;
	  for(int i = 0; i < 16; i ++) r.m[i] = m[i] - c.m[i];
	  return r;
  }


  CMat3T operator*(const F c ) {

	  CMat3T r;
	  for(int i = 0; i < 16; i ++) r.m[i] = m[i] * c;
	  return r;
  }	  
  
  F m[16];
};



template <class F>
ostream& operator<<( ostream& os, const CMat3T<F>& m) {
	return os	<< m.m[0] << " " << m.m[4] << " " << m.m[8]  << " " << m.m[12] << endl
				<< m.m[1] << " " << m.m[5] << " " << m.m[9]  << " " << m.m[13] << endl
				<< m.m[2] << " " << m.m[6] << " " << m.m[10] << " " << m.m[14] << endl
				<< m.m[3] << " " << m.m[7] << " " << m.m[11] << " " << m.m[15] << endl;
}




#endif	/* __CMat3T_H__ */










