73 lines
2.3 KiB
C++
Executable File
73 lines
2.3 KiB
C++
Executable File
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
// Copyright (C) GarageGames.com, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef __FOG_CALC_H__
|
|
#define __FOG_CALC_H__
|
|
|
|
#include "sceneGraph/sceneState.h"
|
|
#include "sceneGraph/sceneGraph.h"
|
|
|
|
|
|
// This class is a fancy inlined implementation of the fog calculations with all invariants moved
|
|
// into the constructor.
|
|
class FogCalc
|
|
{
|
|
public:
|
|
FogCalc::FogCalc( const PlaneF &dPlane, F32 distOffset, const Point3F &zVec, F32 worldZ, F32 worldPz, const SceneState *state )
|
|
: fc_distOffset( distOffset ),
|
|
fc_newWorldZ( worldZ - worldPz ),
|
|
fc_fogDistance( state->getFogDistance() ),
|
|
fc_visibleDistance( state->getVisibleDistance() ),
|
|
fc_fogScale( state->getFogScale() ),
|
|
fc_PosFogBands( state->getPosFogBands() ),
|
|
fc_NegFogBands( state->getNegFogBands() ),
|
|
distPlane( dPlane ),
|
|
osZVec( zVec ),
|
|
sState( state )
|
|
{
|
|
// For Textured
|
|
F32 heightOffset;
|
|
|
|
gClientSceneGraph->getFogCoordData( tex_invVisibleDistance, heightOffset, tex_invHeightRange );
|
|
|
|
tex_visibleDistanceMod = gClientSceneGraph->getVisibleDistanceMod() - distOffset - distPlane.d;
|
|
tex_newWorldZ = worldZ - heightOffset;
|
|
}
|
|
|
|
inline F32 calcFC( const Point3F &point ) const
|
|
{
|
|
return( sState->getHazeAndFog(mFabs(distPlane.distToPlane(point)) + fc_distOffset, (mDot(point, osZVec) + fc_newWorldZ) ) );
|
|
}
|
|
|
|
inline const Point2F calcTextured( const Point3F &point ) const
|
|
{
|
|
// inline version of SceneGraph::getFogCoordPair
|
|
return( Point2F(
|
|
(tex_visibleDistanceMod - (point.x * distPlane.x + point.y * distPlane.y + point.z * distPlane.z)) * tex_invVisibleDistance,
|
|
(tex_newWorldZ + point.x * osZVec.x + point.y * osZVec.y + point.z * osZVec.z) * tex_invHeightRange
|
|
) );
|
|
}
|
|
|
|
private:
|
|
const F32 fc_distOffset;
|
|
const F32 fc_newWorldZ;
|
|
const F32 fc_fogDistance;
|
|
const F32 fc_visibleDistance;
|
|
const F32 fc_fogScale;
|
|
const Vector<SceneState::FogBand> *fc_PosFogBands;
|
|
const Vector<SceneState::FogBand> *fc_NegFogBands;
|
|
|
|
F32 tex_invVisibleDistance;
|
|
F32 tex_invHeightRange;
|
|
F32 tex_visibleDistanceMod;
|
|
F32 tex_newWorldZ;
|
|
|
|
const PlaneF distPlane;
|
|
const Point3F osZVec;
|
|
const SceneState *sState;
|
|
};
|
|
|
|
#endif //__OK_FOG_CALC_H__
|