
#include "vertex.h"

#include <math.h>


//#define _VERTEX_ALLOCATION_

/*
#define VERTEX_ALLOC_CHUNK 1024

Vertex* Vertex::_free_list_head = NULL;
int Vertex::_chunks_allocated = 0;

int Vertex::_vert_allocated = 0;
int Vertex::_vert_in_memory = 0;
*/

Vec4 Vertex::_NormalizeTemp_P;
Vec4 Vertex::_NormalizeTemp_N;


void Vertex::CopyFrom(const Vertex &v) {

	_point = v._point;
	_normal = v._normal;
}


Vertex::~Vertex() {

#ifdef _VERTEX_ALLOCATION_
    _in_memory--;
    cerr << "Vertex- " << _in_memory << " (" << _allocated << ")" << endl;
#endif
}


/*
void* Vertex::operator new(size_t size) {

	Vertex *v;

	if (size != sizeof(Vertex))
		return ::new char[size];

	if (_free_list_head) {
		v = _free_list_head;
		_free_list_head = _free_list_head->_next;
		return v;
	}

	else {
		_free_list_head = (Vertex *)
			::new char[VERTEX_ALLOC_CHUNK * sizeof(Vertex)];

		if (!_free_list_head)
			return NULL;

		_chunks_allocated++;
//		cerr << "Vertex chunks: " << _chunks_allocated << endl;

		for (int i=0; i<VERTEX_ALLOC_CHUNK-1; i++)
			_free_list_head[i]._next = _free_list_head + i + 1;

		_free_list_head[VERTEX_ALLOC_CHUNK-1]._next = NULL;

		v = _free_list_head;
		_free_list_head++;
	}

	return v;
}

void Vertex::operator delete(void *deleteme, size_t size) {

	if (size != sizeof(Vertex)) {
		::delete [] ((char*) deleteme);
		return;
	}

	Vertex *v = (Vertex*) deleteme;

	v->_next = _free_list_head;
	_free_list_head = v;
}
*/

ostream& operator<<(ostream& co, const Vertex& v) {

    co << "P: " << v._point << " N: " << v._normal;

    return co;
}
