// SwiftShader Software Renderer
//
// Copyright(c) 2005-2012 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//

#ifndef sw_TextureStage_hpp
#define sw_TextureStage_hpp

#include "Common/Types.hpp"
#include "Common/Math.hpp"
#include "Renderer/Color.hpp"

namespace sw
{
	class Sampler;
	class PixelRoutine;
	class Context;

	class TextureStage
	{
		friend class Context;        // FIXME
		friend class PixelRoutine;   // FIXME

	public:
		enum StageOperation
		{
			STAGE_DISABLE,
			STAGE_SELECTARG1,
			STAGE_SELECTARG2,
			STAGE_SELECTARG3,
			STAGE_MODULATE,
			STAGE_MODULATE2X,
			STAGE_MODULATE4X,
			STAGE_ADD,
			STAGE_ADDSIGNED,
			STAGE_ADDSIGNED2X,
			STAGE_SUBTRACT,
			STAGE_ADDSMOOTH,
			STAGE_MULTIPLYADD,
			STAGE_LERP,
			STAGE_DOT3,
			STAGE_BLENDCURRENTALPHA,
			STAGE_BLENDDIFFUSEALPHA,
			STAGE_BLENDFACTORALPHA,
			STAGE_BLENDTEXTUREALPHA,
			STAGE_BLENDTEXTUREALPHAPM,
			STAGE_PREMODULATE,
			STAGE_MODULATEALPHA_ADDCOLOR,
			STAGE_MODULATECOLOR_ADDALPHA,
			STAGE_MODULATEINVALPHA_ADDCOLOR,
			STAGE_MODULATEINVCOLOR_ADDALPHA,
			STAGE_BUMPENVMAP,
			STAGE_BUMPENVMAPLUMINANCE,

			STAGE_LAST = STAGE_BUMPENVMAPLUMINANCE
		};

		enum SourceArgument
		{
			SOURCE_TEXTURE,
			SOURCE_CONSTANT,
			SOURCE_CURRENT,
			SOURCE_DIFFUSE,
			SOURCE_SPECULAR,
			SOURCE_TEMP,
			SOURCE_TFACTOR,

			SOURCE_LAST = SOURCE_TFACTOR
		};

		enum DestinationArgument
		{
			DESTINATION_CURRENT,
			DESTINATION_TEMP,

			DESTINATION_LAST = DESTINATION_TEMP
		};

		enum ArgumentModifier
		{
			MODIFIER_COLOR,
			MODIFIER_INVCOLOR,
			MODIFIER_ALPHA,
			MODIFIER_INVALPHA,

			MODIFIER_LAST = MODIFIER_INVALPHA
		};

		struct State
		{
			State();

			unsigned int stageOperation			: BITS(STAGE_LAST);
			unsigned int firstArgument			: BITS(SOURCE_LAST);
			unsigned int secondArgument			: BITS(SOURCE_LAST);
			unsigned int thirdArgument			: BITS(SOURCE_LAST);
			unsigned int stageOperationAlpha	: BITS(STAGE_LAST);
			unsigned int firstArgumentAlpha		: BITS(SOURCE_LAST);
			unsigned int secondArgumentAlpha	: BITS(SOURCE_LAST);
			unsigned int thirdArgumentAlpha		: BITS(SOURCE_LAST);
			unsigned int firstModifier			: BITS(MODIFIER_LAST);
			unsigned int secondModifier			: BITS(MODIFIER_LAST);
			unsigned int thirdModifier			: BITS(MODIFIER_LAST);
			unsigned int firstModifierAlpha		: BITS(MODIFIER_LAST);
			unsigned int secondModifierAlpha	: BITS(MODIFIER_LAST);
			unsigned int thirdModifierAlpha		: BITS(MODIFIER_LAST);
			unsigned int destinationArgument	: BITS(DESTINATION_LAST);
			unsigned int texCoordIndex			: BITS(7);

			unsigned int cantUnderflow			: 1;
			unsigned int usesTexture			: 1;
		};

		struct Uniforms
		{
			word4 constantColor4[4];
			float4 bumpmapMatrix4F[2][2];
			word4 bumpmapMatrix4W[2][2];
			word4 luminanceScale4;
			word4 luminanceOffset4;
		};

		TextureStage();

		~TextureStage();

		void init(int stage, const Sampler *sampler, const TextureStage *previousStage);

		State textureStageState() const;

		void setConstantColor(const Color<float> &constantColor);
		void setBumpmapMatrix(int element, float value);
		void setLuminanceScale(float value);
		void setLuminanceOffset(float value);

		void setTexCoordIndex(unsigned int texCoordIndex);
		void setStageOperation(StageOperation stageOperation);
		void setFirstArgument(SourceArgument firstArgument);
		void setSecondArgument(SourceArgument secondArgument);
		void setThirdArgument(SourceArgument thirdArgument);
		void setStageOperationAlpha(StageOperation stageOperationAlpha);
		void setFirstArgumentAlpha(SourceArgument firstArgumentAlpha);
		void setSecondArgumentAlpha(SourceArgument secondArgumentAlpha);
		void setThirdArgumentAlpha(SourceArgument thirdArgumentAlpha);
		void setFirstModifier(ArgumentModifier firstModifier);
		void setSecondModifier(ArgumentModifier secondModifier);
		void setThirdModifier(ArgumentModifier thirdModifier);
		void setFirstModifierAlpha(ArgumentModifier firstModifierAlpha);
		void setSecondModifierAlpha(ArgumentModifier secondModifierAlpha);
		void setThirdModifierAlpha(ArgumentModifier thirdModifierAlpha);
		void setDestinationArgument(DestinationArgument destinationArgument);

		Uniforms uniforms;   // FIXME: Private

	private:
		bool usesColor(SourceArgument source) const;
		bool usesAlpha(SourceArgument source) const;
		bool uses(SourceArgument source) const;
		bool usesCurrent() const;
		bool usesDiffuse() const;
		bool usesSpecular() const;
		bool usesTexture() const;
		bool isStageDisabled() const;
		bool writesCurrent() const;

		int stage;
		
		StageOperation stageOperation;
		SourceArgument firstArgument;
		SourceArgument secondArgument;
		SourceArgument thirdArgument;
		StageOperation stageOperationAlpha;
		SourceArgument firstArgumentAlpha;
		SourceArgument secondArgumentAlpha;
		SourceArgument thirdArgumentAlpha;
		ArgumentModifier firstModifier;
		ArgumentModifier secondModifier;
		ArgumentModifier thirdModifier;
		ArgumentModifier firstModifierAlpha;
		ArgumentModifier secondModifierAlpha;
		ArgumentModifier thirdModifierAlpha;
		DestinationArgument destinationArgument;

		int texCoordIndex;
		const Sampler *sampler;
		const TextureStage *previousStage;
	};
}

#endif  // sw_TextureStage_hpp
