/*********************************************************************NVMH3****
File:  $Id: //sw/devtools/FXComposer2/Alpha4+/SDK/MEDIA/CgFX1.4/quad.cgh#1 $

Copyright NVIDIA Corporation 2005
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
*AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS
BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES
WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS)
ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

******************************************************************************/

#ifndef _QUAD_CGH_
#define _QUAD_CGH_

// macros as types ////////////////////////

#define QUAD_FLOAT // for now

#ifndef QUAD_REAL
#ifdef QUAD_FLOAT
#define QUAD_REAL float
#define QUAD_REAL2 float2
#define QUAD_REAL3 float3
#define QUAD_REAL4 float4
#define QUAD_REAL3x3 float3x3
#define QUAD_REAL4x3 float4x3
#define QUAD_REAL3x4 float3x4
#define QUAD_REAL4x4 float4x4
#else /* ! QUAD_FLOAT */
#define QUAD_REAL half
#define QUAD_REAL2 half2
#define QUAD_REAL3 half3
#define QUAD_REAL4 half4
#define QUAD_REAL3x3 half3x3
#define QUAD_REAL4x3 half4x3
#define QUAD_REAL3x4 half3x4
#define QUAD_REAL4x4 half4x4
#endif /* ! QUAD_FLOAT */
#endif /* ! QUAD_REAL */

// #define QUAD_RESCALE

//// Useful macro funcs /////////////////////////////////////

// Typical usage:
//FILE_TEXTURE_2D(BlendImg,BlendImgSampler,"Blended.dds")
#define FILE_TEXTURE_2D(TName,SName,FName) texture TName < \
	string ResourceName = (FName); string ResourceType = "2D"; >; \
sampler2D SName = sampler_state { \
	Texture = <TName>; \
  	MagFilter = Linear; \
  	MinFilter = LinearMipmapLinear; };

// Typical usage:
//FILE_TEXTURE_2D_MODAL(BlendImg,BlendImgSampler,"Blended.dds",Repeat)
#define FILE_TEXTURE_2D_MODAL(TName,SName,FName,Mode) texture TName < \
	string ResourceName = (FName); string ResourceType = "2D"; >; \
sampler2D SName = sampler_state { \
	Texture = <TName>; \
	WrapS = Mode; \
	WrapT = Mode; \
  	MagFilter = Linear; \
  	MinFilter = LinearMipmapLinear; };

// Typical usage:
// DECLARE_QUAD_TEX(SceneTexture,SceneSampler,"X8R8G8B8")
#define DECLARE_QUAD_TEX(TName,SName,DataFormat) texture TName : RENDERCOLORTARGET < \
	float2 ViewPortRatio = {1.0f,1.0f}; \
	int MipLevels = 1; \
	string Format = (DataFormat) ; \
	string UIWidget = "None"; >;\
sampler SName = sampler_state { \
    texture = <TName>; \
    MagFilter = Nearest;\
    MinFilter = Nearest;\
	AddressU = CLAMP;\
	AddressV = CLAMP;};

// Typical usage:
// DECLARE_QUAD_DEPTH_BUFFER(DepthBuffer, "D24S8")
#define DECLARE_QUAD_DEPTH_BUFFER(TName,DataFormat) texture TName : RENDERDEPTHSTENCILTARGET < \
	float2 ViewportRatio = {1.0f,1.0f}; \
	string Format = (DataFormat); \
	string UIWidget = "None"; >;

/////////////////// Globals ///////////////////////////

float2 QuadScreenSize : VIEWPORTPIXELSIZE < string UIWidget="None"; >;

#ifdef QUAD_RESCALE
float TexScale <
	string UIWidget = "slider";
	float UIMin = 0.01;
	float UIMax = 100.0;
	float UIStep = 0.01;
> = 1.0;
#endif /* QUAD_RESCALE */

/////////////////// Vertex Struct //////////////////////

struct QuadVertexOutput {
   	float4 Position	: POSITION;
    float2 UV		: TEXCOORD0;
};

/////////////////// Standard Vertex Shader /////////////

QuadVertexOutput ScreenQuadVS(
		float3 Position : POSITION, 
		float3 TexCoord : TEXCOORD0
) {
    QuadVertexOutput OUT;
    OUT.Position = float4(Position, 1);
    OUT.UV =
#ifdef QUAD_RESCALE
			TexScale *
#endif /* QUAD_RESCALE */
			TexCoord.xy;
    return OUT;
}

QuadVertexOutput ScreenQuadFlipVS(
		float3 Position : POSITION, 
		float3 TexCoord : TEXCOORD0
) {
    QuadVertexOutput OUT;
    OUT.Position = float4(Position, 1);
    OUT.UV =
#ifdef QUAD_RESCALE
			TexScale *
#endif /* QUAD_RESCALE */
			float2(TexCoord.x,1.0-TexCoord.y);
    return OUT;
}

////////////////// Minimal Fragment Shader ////////////////

float4 ScreenQuadFS(QuadVertexOutput IN,uniform sampler SceneSampler) : COLOR {
	return tex2D(SceneSampler,IN.UV.xy); // easy!
}

#endif /* ! _QUAD_CGH_ */

////////////// eof ///
