//========= Copyright Valve Corporation, All rights reserved. ============//
#include "tier0/platform.h"
#include "mathlib/mathlib.h"
#include "mathlib/spherical_geometry.h"
#include "tier2/tier2.h"
#include "mathlib/halton.h"
#include "bitmap/float_bm.h"
#include "tier0/memdbgon.h"

void main(int argc,char **argv)
{
	InitCommandLineProgram( argc, argv );

	// 1/8th of the sphere
	float a1=UnitSphereTriangleArea( Vector( 1, 0, 0 ), Vector( 0, 0, -1 ), Vector( 0, 1, 0 ) );
	printf( "right spherical triangle projected percentage=%2.4f\n", a1 / ( 4 * M_PI ));

	// a small one
	Vector v1 = Vector( 1, 0, 0 );
	Vector v2 = v1 + Vector( 0, 0.2, 0 );
	Vector v3 = v1 + Vector( 0, 0, 0.2 );
	v2.NormalizeInPlace();
	v3.NormalizeInPlace();
	float a2=UnitSphereTriangleArea( v1, v2, v3 );
	printf( "small spherical triangle projected percentage=%2.5f\n", a2 / ( 4* M_PI ) );

	// now, create a cubemap and sum the area of each of its cells
	FloatCubeMap_t envMap( 10, 10 );
	float flAreaSum = 0.;
	for( int nFace = 0 ; nFace < 6; nFace ++ )
	{
		for( int nY = 0 ; nY < 9; nY++ )
			for( int nX = 0 ; nX < 9; nX++ )
			{
				Vector v00 = envMap.PixelDirection( nFace, nX, nY );
				Vector v01 = envMap.PixelDirection( nFace, nX, nY + 1  );
				Vector v10 = envMap.PixelDirection( nFace, nX + 1, nY );
				Vector v11 = envMap.PixelDirection( nFace, nX + 1 , nY + 1 );
				v00.NormalizeInPlace();
				v01.NormalizeInPlace();
				v10.NormalizeInPlace();
				v11.NormalizeInPlace();
				flAreaSum += UnitSphereTriangleArea( v00, v01, v10 );
				flAreaSum += UnitSphereTriangleArea( v10, v11, v01 );
			}
	}
	printf( "sum of areas of cubemap cells = %2.2f\n", flAreaSum / ( 4.0 * M_PI ) );
	
#if 0  // visual spherical harmonics as (confusing) point sets
	// spherical harmonics
	DirectionalSampler_t sampler;
	for(int i = 0 ; i < 50000; i++ )
	{
		Vector dir=sampler.NextValue();
		float SH = SphericalHarmonic( 4, 3, dir );
		float r=0;
		float g=1; //0.5+0.5*DotProduct( dir, Vector( 0, 0, 1 ) );
		float b=0;
		if ( SH < 0 )
		{
			SH = -SH;
			r=g;
			g=0;
		}
		r *= SH;
		g *= SH;
		b *= SH;
		float rad= SH * 4.0; //4.0; //SH *= 8.0;
		printf( "2\n" );
		printf( "%f %f %f %f %f %f\n",
				dir.x * rad, dir.y * rad, dir.z * rad, r, g, b );
		rad += 0.03;
		printf( "%f %f %f %f %f %f\n",
				dir.x * rad, dir.y * rad, dir.z * rad, r, g, b );
	}
#endif

}