#include "Model.h"

namespace New3D {

NodeAttributes::NodeAttributes()
{
	currentTexOffsetX	= 0;
	currentTexOffsetY	= 0;
	currentPage			= 0;
	currentClipStatus	= Clip::INTERCEPT;
	currentModelScale	= 1.0f;
}

bool NodeAttributes::Push()
{
	//=============
	NodeAttribs na;
	//=============

	// check for overflow
	if (m_vecAttribs.size() >= 128) {
		return false;
	}

	na.page			= currentPage;
	na.texOffsetX	= currentTexOffsetX;
	na.texOffsetY	= currentTexOffsetY;
	na.clip			= currentClipStatus;
	na.modelScale	= currentModelScale;

	m_vecAttribs.emplace_back(na);

	return true;
}

bool NodeAttributes::Pop()
{
	if (m_vecAttribs.empty()) {
		return false;	// check for underflow
	}

	auto &last = m_vecAttribs.back();

	currentPage			= last.page;
	currentTexOffsetX	= last.texOffsetX;
	currentTexOffsetY	= last.texOffsetY;
	currentClipStatus	= last.clip;
	currentModelScale	= last.modelScale;

	m_vecAttribs.pop_back();

	return true;
}

bool NodeAttributes::StackLimit()
{
	return m_vecAttribs.size() >= 1024;
}

void NodeAttributes::Reset()
{
	currentPage			= 0;
	currentTexOffsetX	= 0;
	currentTexOffsetY	= 0;
	currentClipStatus	= Clip::INTERCEPT;
	currentModelScale	= 1.0f;

	m_vecAttribs.clear();
}

} // New3D