#define ipn (float)31.0
#define syoutenniti (float)10.092592592592592592592592592593

typedef struct{
	float x;
	float y;
	float z;
} Vec3;


typedef struct{
	float u;
	float v;
} Vec2;

typedef struct{
	float x;
	float y;
	float z;
	float w;
} Vec4;


void myclamp(int p1,int p2,int p3,int *p4)
{
	*p4=p1;
	if (*p4<p2){*p4=p2;}
	if (*p4>p3){*p4=p3;}
}

void myclampf(float p1,float p2,float p3,float *p4)
{
	*p4=p1;
	if (*p4<p2){*p4=p2;}
	if (*p4>p3){*p4=p3;}
}


//オープニングのパーティクルの移動処理、あと透明度も決定、床反射適応、重力適応
__kernel void idou(__global Vec3 *partxyz,__global Vec3 *partdxyz,__global float *part3,__global int *parti,__global int *partr,__global Vec3 *CLmidpr,__global Vec2 *CLmidprUV,__global uint *CLmidprCo,float cax,float cay,float caz,float fd,float timestep) {
	int gid=get_global_id(0);
	
	partxyz[gid].x-=0.6*partdxyz[gid].x*timestep;
	partxyz[gid].y-=0.6*partdxyz[gid].y*timestep;
	partxyz[gid].z-=0.6*partdxyz[gid].z*timestep;
	part3[gid]+=(0.4*(gid%8)+10.9)*timestep;
	partdxyz[gid].y+=(0.12*parti[gid])*timestep;
	if (parti[gid]==1) {if (partxyz[gid].y<15.0 ){partdxyz[gid].y=-0.75*(1.0+0.0005*(gid%201-100))*partdxyz[gid].y;partxyz[gid].y-=partdxyz[gid].y*timestep;}}
	if (parti[gid]==-1){if (partxyz[gid].y>-15.0){partdxyz[gid].y=-0.75*(1.0+0.0005*(gid%201-100))*partdxyz[gid].y;partxyz[gid].y-=partdxyz[gid].y*timestep;}}
//3*4こやる
//CLmidpr
	Vec3 ksv;
	int gid4=gid*4;
	ksv.x=ipn;
	ksv.y=ipn;
	ksv.z=0.0;
	CLmidpr[gid4  ].x=partxyz[gid].x+ksv.x;
	CLmidpr[gid4  ].y=partxyz[gid].y+ksv.y;
	CLmidpr[gid4  ].z=partxyz[gid].z+ksv.z;
	ksv.x=-ipn;
	ksv.y=ipn;
	ksv.z=0.0;
	CLmidpr[gid4+1].x=partxyz[gid].x+ksv.x;
	CLmidpr[gid4+1].y=partxyz[gid].y+ksv.y;
	CLmidpr[gid4+1].z=partxyz[gid].z+ksv.z;
	ksv.x=-ipn;
	ksv.y=-ipn;
	ksv.z=0.0;
	CLmidpr[gid4+2].x=partxyz[gid].x+ksv.x;
	CLmidpr[gid4+2].y=partxyz[gid].y+ksv.y;
	CLmidpr[gid4+2].z=partxyz[gid].z+ksv.z;
	ksv.x=ipn;
	ksv.y=-ipn;
	ksv.z=0.0;
	CLmidpr[gid4+3].x=partxyz[gid].x+ksv.x;
	CLmidpr[gid4+3].y=partxyz[gid].y+ksv.y;
	CLmidpr[gid4+3].z=partxyz[gid].z+ksv.z;

	ksv=partxyz[gid];

	float kyori=sqrt((ksv.x-cax)*(ksv.x-cax)+(ksv.y-cay)*(ksv.y-cay)+(ksv.z-caz)*(ksv.z-caz));
	if (kyori==0.0){kyori==0.0000001;}
//	kyori=(17800.0/kyori);
	float syoten=1.0/(0.1-(1.0/kyori));
	if (syoten==0.0){syoten=0.00000000000000001;}
	float kekka=(syoten-syoutenniti);
	if (kekka<0.0){kekka=-kekka;}
	kekka/=syoten;
	int partiid=(int)(kekka*39200.0-37.0);	
	if (partiid<0){partiid=0;}
	if (partiid>255){partiid=255;}
	partiid/=4;
	
	Vec2 uvd;
	uvd.u=(1.0/64.0)*(partiid+0);
	uvd.v=0.0;
	CLmidprUV[gid4  ]=uvd;
	uvd.u=(1.0/64.0)*(partiid+0);
	uvd.v=1.0;
	CLmidprUV[gid4+1]=uvd;
	uvd.u=(1.0/64.0)*(partiid+1);
	uvd.v=1.0;
	CLmidprUV[gid4+2]=uvd;
	uvd.u=(1.0/64.0)*(partiid+1);
	uvd.v=0.0;
	CLmidprUV[gid4+3]=uvd;
//2*4こやる
//CLmidprUV
	
	
	
//w値の計算
	int tmp;
	myclamp((int)(part3[gid]*1.9),0,255,&tmp);
	float tmpf;
	myclampf(part3[gid]-900.0,0.0,9999999.9,&tmpf);
	int w;
	myclamp((int)(255.0-0.94*partiid-tmpf*0.2),0,tmp,&w);
	
	float fw=((float)w+57.0*cos(kyori*0.08)-40.0)*fd;
	if (parti[gid]==-1){fw=fw/3;}

	w=(int)fw;
	if (w<0){w=0;}
	if (w>255){w=255;}
	CLmidprCo[gid4  ]=(((255*256+w)*256+w)*256+w);
	CLmidprCo[gid4+1]=(((255*256+w)*256+w)*256+w);
	CLmidprCo[gid4+2]=(((255*256+w)*256+w)*256+w);
	CLmidprCo[gid4+3]=(((255*256+w)*256+w)*256+w);
}











__kernel void prezent(
	__read_only  image2d_t CLOpeningTxp0,
    __write_only image2d_t CLOpeningTxp1,
    __write_only image2d_t CLOpeningTxp2,
	float timest
	){
	
	sampler_t constSampler=CLK_NORMALIZED_COORDS_TRUE |CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;												


	
	int gid=get_global_id(0);
	int x=gid%640;
	int y=gid/640;

		float2 normalizedCoord = (float2)((x+0.5f)/640.0, (y+0.5f)/128.0);
		int2 unnormalizedCoord = (int2)(x,y);

		float4 value1 = read_imagef(CLOpeningTxp0, constSampler, normalizedCoord);
		float4 value2 = value1;


	float w=value1.s0;//白ならαも255、黒ならαも0
	x=x-320;
	y=y-64;
	float kyori=sqrt((float)(x*x+y*y));
	float ww=w*(-kyori+timest);
	if (ww<0.0){ww=0.0;}
	if (ww>256.0){ww=256.0;}
	ww/=256.0;
	value1.s3=ww*0.81;
	

	ww=w*(-kyori+timest-110.0);
	if (ww<0.0){ww=0.0;}
	if (ww>256.0){ww=256.0;}
	ww/=256.0;
	value2.s3=ww*0.82;
		
		
		
		write_imagef(CLOpeningTxp1,unnormalizedCoord, value1);
		write_imagef(CLOpeningTxp2,unnormalizedCoord, value2);
}
/*


}



*/