/*
 * Javascript Wolfenstein 3D Sprite Object
 * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com
 */

Canvas3D.Sprite = function() {

	this._oPosition = new Canvas3D.Vec3(0,0,0);

	this._iWidth = 0;
	this._iHeight = 0;

	this._bDirty = true;

	this._bVisible = true;

	this._oTexture = null;
};

Canvas3D.Sprite.prototype.setTexture = function(oTexture) 
{
	this._oTexture = oTexture;
}

Canvas3D.Sprite.prototype.setDimensions = function(iWidth, iHeight) 
{
	this._iWidth = iWidth;
	this._iHeight = iHeight;
}

Canvas3D.Sprite.prototype.draw = function(oCtx, iOffsetX, iOffsetY) 
{
	if (!this._oTexture.getCanvas()) return;
	this._bDirty = false;

	if (!this._bVisible) return false;

	var oScene = this._oScene;

	var iSceneWidth = oScene.getWidth();
	var iSceneHeight = oScene.getHeight();

	var iWidth = this._iWidth;
	var iHeight = this._iHeight;

	var oCam = oScene.getActiveCamera();

	var oPos = this._oPosition;


	var oPos = this._oPosition;

	var oTransPos = oCam.transformPoint(oPos);
	if (oTransPos.z <= -oCam.getFocal()) {
		return false;
	}

	var oPoint2D = oCam.project(oTransPos);

	var oPointLeft = oCam.project(oCam.transformPoint(oPos.clone()).addVector(new Canvas3D.Vec3(-iWidth/2,0,0)));
	var oPointRight = oCam.project(oCam.transformPoint(oPos.clone()).addVector(new Canvas3D.Vec3(iWidth/2,0,0)));
	var oPointTop = oCam.project(oCam.transformPoint(oPos.clone()).addVector(new Canvas3D.Vec3(0,iHeight/2,0)));
	var oPointBottom = oCam.project(oCam.transformPoint(oPos.clone()).addVector(new Canvas3D.Vec3(0,-iHeight/2,0)));

	var fTexHeight = oPointBottom.y - oPointTop.y;
	var fTexWidth = oPointRight.x - oPointLeft.x;

	if (bLowRes) {
		// low quality
		var iLOD = 0;
		if (fTexHeight < 128)
			iLOD = 1;
		if (fTexHeight < 64)
			iLOD = 2;
		if (fTexHeight < 32)
			iLOD = 2;
	} else {
		// high quality
		iLOD = 0
		if (fTexHeight < 64)
			iLOD = 1;
		if (fTexHeight < 48)
			iLOD = 2;
		if (fTexHeight < 24)
			iLOD = 2;
	}

	var iLOD = 0;

	var iX = oPoint2D.x + iOffsetX;
	var iY = oPoint2D.y + iOffsetY;

	this._oTexture.draw(
		oCtx, 
		iLOD,
		iX - fTexWidth / 2,
		iY - fTexHeight / 2,
		fTexWidth,
		fTexHeight
	);

	return true;

}

Canvas3D.Sprite.prototype.setScene = function(oScene)
{
	if (this._oScene != oScene) {
		this._oScene = oScene;
	}
}


Canvas3D.Sprite.prototype.getPosition = function()
{
	return this._oPosition;
}

Canvas3D.Sprite.prototype.getSortPosition = function()
{
	return this._oPosition.clone();
}


Canvas3D.Sprite.prototype.setPosition = function(oVec)
{
	if (oVec.x != this._oPosition.x || oVec.y != this._oPosition.y || oVec.z != this._oPosition.z) {
		this._oPosition = oVec;
		this._bDirty = true;
	}
}


Canvas3D.Sprite.prototype.getDirty = function()
{
	return this._bDirty;
}


Canvas3D.Sprite.prototype.hide = function()
{
	this._bVisible = false;
	this._bDirty = true;
}

Canvas3D.Sprite.prototype.show = function()
{
	this._bVisible = true;
	this._bDirty = true;
}

Canvas3D.Sprite.prototype.getForcedZ = function()
{
	return -1;
}

Canvas3D.Sprite.prototype.isVisible = function()
{
	return this._bVisible;
}



