mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-25 23:56:50 +00:00
80 lines
2.3 KiB
C++
80 lines
2.3 KiB
C++
|
//========= 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
|
||
|
|
||
|
}
|
||
|
|