
//================================================================
//大域設定値
//Texture
sampler sampler0_ : register(s0);

//--------------------------------
//ゆがみ生成用パラメータ
static const float RENDER_WIDTH = 1024; //レンダリングテクスチャの幅
static const float RENDER_HEIGHT = 1024; //レンダリングテクスチャの高さ

const float ALPHA_MAX = 250;

//マスク用テクスチャ
const float SCREEN_WIDTH = 1024;
const float SCREEN_HEIGHT = 512;
texture textureMask_;
sampler samplerMask_ = sampler_state
{ 
	Texture = <textureMask_>;
};

float frame_; //フレーム数
float enemyX_; //敵の位置X
float enemyY_; //敵の位置Y
float waveRadius_; //エフェクトの半径

float waveC_R; //エフェクトの色スイッチ 赤
float waveC_G; //エフェクトの色スイッチ 緑
float waveC_B; //エフェクトの色スイッチ 青


//================================================================
//--------------------------------
//ピクセルシェーダ入力値
struct PS_INPUT
{
	float4 diffuse : COLOR0;  //ディフューズ色
	float2 texCoord : TEXCOORD0; //テクスチャ座標
	float2 vPos : VPOS; //描画先座標
};

//--------------------------------
//ピクセルシェーダ出力値
struct PS_OUTPUT
{
    float4 color : COLOR0; //出力色
};


//================================================================
// シェーダ
//--------------------------------
//ピクセルシェーダ
PS_OUTPUT PsWave( PS_INPUT In ) : COLOR0
{
	PS_OUTPUT Out;

		//--------------------------------
		//ゆらぎを計算
		float dist = sqrt((enemyX_-In.vPos.x+0.5)*(enemyX_-In.vPos.x+0.5) + (enemyY_-In.vPos.y+0.5)*(enemyY_-In.vPos.y+0.5));
		float sinTheta = (In.vPos.y - enemyY_) / dist;
		float cosTheta = (In.vPos.x - enemyX_) / dist;
	
		//歪み作成用のsinに使用する角度パラメータ
		float angle = enemyY_ - In.vPos.y + enemyX_ - In.vPos.x - frame_*-8;
		float angle2 = enemyY_ - In.vPos.y + enemyX_ - In.vPos.x - frame_*-2;
		angle = radians(angle+180);
		angle2 = radians(angle2);
	
		//中心から距離が離れるほど影響を小さくする
		float powerRatio = ( waveRadius_ - dist) / waveRadius_;
		//該当ピクセルの歪みの半径を計算
		//エフェクト半径の1/16を最大の歪み幅とする
		float waveRadius_Circle =  sin(angle)*exp(-1*angle*angle/2)/2;
		float waveRadius = waveRadius_+ waveRadius_/4 * waveRadius_Circle;
		
		if(powerRatio >= 0.5){powerRatio = 0.5;}
		if(powerRatio < 0){powerRatio = 0;}
		
		//色情報を取得する位置のバイアス値(ゆらぎの強さもここで調整)
		float biasRadiusX = (1.95+cos(angle)/2+sin(angle2)/2)*waveRadius * (1/8 - powerRatio/8);
		float biasRadiusY = (1.95+sin(angle)/2+cos(angle2)/2)*waveRadius * (1/6 - powerRatio/8);
		float biasX = biasRadiusY * cosTheta;
		float biasY = biasRadiusX * sinTheta;
	
		//テクスチャの色情報を取得する位置
		float2 texUV;
		texUV.x = biasX / RENDER_WIDTH + In.texCoord.x;
		texUV.y = biasY / RENDER_HEIGHT + In.texCoord.y;

		//--------------------------------
		//テクスチャの色
		float4 colorTexture = tex2D(sampler0_, texUV);
	
		//頂点ディフーズ色
		float4 colorDiffuse = In.diffuse;
	
		//合成
		float4 color = colorTexture * colorDiffuse;
		
		//レベル変換
		waveC_R = (1-waveC_R/255);
		waveC_G = (1-waveC_G/255);
		waveC_B = (1-waveC_B/255);
		
		//色を変化させる
		if(powerRatio > 0)
		{
			color.r = color.r * (1 - waveC_R)+waveRadius_Circle*0;
			color.g = color.g * (1 - waveC_G)+waveRadius_Circle*0;
			color.b = color.b * (1 - waveC_B)+waveRadius_Circle*0;
		}
		Out.color = color;
		float Alpha = powerRatio*2 *color.a;
		
		if(Alpha>=ALPHA_MAX)
		{
			Alpha = ALPHA_MAX;
		}
		

		Out.color.a = Alpha;
		return Out;
}


//================================================================
//--------------------------------
//technique
technique TecWave
{
	pass P0
	{
		PixelShader = compile ps_3_0 PsWave();
	}
}

