#pragma once

#include "Mix/Geometry/Sphere.h"

namespace Mix{ namespace Scene{ namespace Common{

	//シャドウマッピングのサンプリング( PCF )
	static const UInt32 RENDERER_SM_SAMPLING_NUM = 9;
	static const Mix::Vector4 SM_SAMPLING_OFFSET_TABLE[Mix::Scene::Common::RENDERER_SM_SAMPLING_NUM] =
	{
		Mix::Vector4( -1.0f, -1.0f, 0.0f, 0.0f ),
		Mix::Vector4(  0.0f, -1.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f, -1.0f, 0.0f, 0.0f ),

		Mix::Vector4( -1.0f,  0.0f, 0.0f, 0.0f ),
		Mix::Vector4(  0.0f,  0.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f,  0.0f, 0.0f, 0.0f ),

		Mix::Vector4( -1.0f, +1.0f, 0.0f, 0.0f ),
		Mix::Vector4(  0.0f, +1.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f, +1.0f, 0.0f, 0.0f ),
	};

	//被写界深度のサンプリング
	static const UInt32 RENDERER_DOF_SAMPLING_NUM = 12;
	static const Mix::Vector4 DOF_SAMPLING_OFFSET_TABLE[Mix::Scene::Common::RENDERER_DOF_SAMPLING_NUM] =
	{
		Mix::Vector4(  0.0f, -1.5f, 0.0f, 0.0f ),

		Mix::Vector4( -1.0f, -1.0f, 0.0f, 0.0f ),
		Mix::Vector4(  0.0f, -1.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f, -1.0f, 0.0f, 0.0f ),

		Mix::Vector4( -1.5f,  0.0f, 0.0f, 0.0f ),
		Mix::Vector4( -1.0f,  0.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f,  0.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.5f,  0.0f, 0.0f, 0.0f ),

		Mix::Vector4( -1.0f, +1.0f, 0.0f, 0.0f ),
		Mix::Vector4(  0.0f, +1.0f, 0.0f, 0.0f ),
		Mix::Vector4( +1.0f, +1.0f, 0.0f, 0.0f ),

		Mix::Vector4(  0.0f, +1.5f, 0.0f, 0.0f ),
	};

	//ルミノシティのトランスフォームテクスチャのスケール
	static const Int32 RENDERER_LUM_TRANSFORM_SCALE	= 4;

	// サンプリングタイプ列挙定数
	enum RENDERER_SAMPLING_TYPE
	{
		RST_COPY		= 0,	// コピー
		RST_DOWN2x		= 1,	// ダウン 1/2
		RST_DOWN4x		= 2,	// ダウン 1/4

		RST_MAX			= 3,	// サンプリングタイプ数
	};

	// 屈折クラス列挙定数
	enum RENDERER_REFRACT_CLASS
	{
		RRC_UNKNOWN			= 0,	// 不明
		RRC_FRONT			= 1,	// 屈折面より前
		RRC_BACK			= 2,	// 屈折面より後
		RRC_OVERLAP			= 3,	// 屈折面と重なっている ( 前後で重複して２回にわたって描画しているため、パフォーマンスが低下する )
	};

	// ローカルライト構造体
	struct LOCAL_LIGHT
	{
		//タイプ( Mix::Scene::IRendererObject::POINT_LIGHT or Mix::Scene::IRendererObject::SPOT_LIGHT )
		UInt32 type;

		//共通
		Mix::Vector3 pos;
		Mix::Vector3 atten;
		Mix::Vector4 color;

		//スポット
		Mix::Vector3 dir;
		Float32 range;
		Float32 innerCos;
		Float32 outerCos;
		Float32 exp;

		//ポイント
		Float32 outerRadius;
		Float32 invDiffRadius;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		// 作業用 : シェーダーに渡すことはない
		////////////////////////////////////////////////////////////////////////////////////////////////////

		/*
			視界判定時に設定される
		*/

		Mix::Geometry::Sphere bounds;
		Float32 z;
		Float32 minZ;
		Float32 maxZ;

		/*
			ライティングするオブジェクト毎に変化(ソート用)
		*/

		Float32 offsetZ; //オブジェクトを基点として前後関係
		Float32 effect;	//オブジェクトに対してのライトの影響( ライトの半径 + オブジェクトの半径 - 中心の距離 )
	};

}}}
