2016-03-12 01:20:51 +01:00
|
|
|
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation
|
|
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
2016-03-11 14:57:17 +01:00
|
|
|
|
|
|
|
#ifndef SE_INCL_FOG_INTERNAL_H
|
|
|
|
#define SE_INCL_FOG_INTERNAL_H
|
|
|
|
#ifdef PRAGMA_ONCE
|
|
|
|
#pragma once
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Engine/Graphics/Fog.h>
|
|
|
|
|
|
|
|
|
|
|
|
// current fog parameters
|
|
|
|
extern BOOL _fog_bActive;
|
|
|
|
extern CFogParameters _fog_fp;
|
|
|
|
extern CTexParams _fog_tpLocal;
|
|
|
|
extern FLOAT _fog_fViewerH;
|
|
|
|
extern FLOAT3D _fog_vViewPosAbs;
|
|
|
|
extern FLOAT3D _fog_vViewDirAbs;
|
|
|
|
extern FLOAT3D _fog_vHDirAbs;
|
|
|
|
extern FLOAT3D _fog_vHDirView;
|
|
|
|
extern FLOAT _fog_fMulZ;
|
|
|
|
extern FLOAT _fog_fMulH;
|
|
|
|
extern FLOAT _fog_fAddH;
|
|
|
|
extern PIX _fog_pixSizeH;
|
|
|
|
extern PIX _fog_pixSizeL;
|
|
|
|
extern FLOAT _fog_fStart;
|
|
|
|
extern FLOAT _fog_fEnd;
|
|
|
|
extern ULONG _fog_ulAlpha;
|
|
|
|
extern ULONG _fog_ulTexture;
|
|
|
|
extern UBYTE *_fog_pubTable;
|
|
|
|
|
|
|
|
// start fog with given parameters
|
|
|
|
extern void StartFog( CFogParameters &fp, const FLOAT3D &vViewPosAbs,
|
|
|
|
const FLOATmatrix3D &mAbsToView);
|
|
|
|
// stop fog
|
|
|
|
extern void StopFog(void);
|
|
|
|
|
|
|
|
|
|
|
|
// current haze parameters
|
|
|
|
extern BOOL _haze_bActive;
|
|
|
|
extern CHazeParameters _haze_hp;
|
|
|
|
extern CTexParams _haze_tpLocal;
|
|
|
|
extern UBYTE *_haze_pubTable;
|
|
|
|
extern FLOAT3D _haze_vViewPosAbs;
|
|
|
|
extern FLOAT3D _haze_vViewDirAbs;
|
|
|
|
extern FLOAT _haze_fMul;
|
|
|
|
extern FLOAT _haze_fAdd;
|
|
|
|
extern PIX _haze_pixSize;
|
|
|
|
extern ULONG _haze_ulAlpha;
|
|
|
|
extern ULONG _haze_ulTexture;
|
|
|
|
extern FLOAT _haze_fStart;
|
|
|
|
|
|
|
|
// start haze with given parameters
|
|
|
|
extern void StartHaze( CHazeParameters &hp, const FLOAT3D &vViewPosAbs,
|
|
|
|
const FLOATmatrix3D &mAbsToView);
|
|
|
|
// stop haze
|
|
|
|
extern void StopHaze(void);
|
|
|
|
|
|
|
|
|
|
|
|
// returns lineary-interpolated fog strength in fog texture
|
|
|
|
__forceinline ULONG GetFogAlpha( const GFXTexCoord &tex)
|
|
|
|
{
|
|
|
|
// point sampling of height
|
|
|
|
PIX pixT = FloatToInt( tex.t * _fog_pixSizeH);
|
|
|
|
pixT = Clamp( pixT, 0L, _fog_pixSizeH-1L) * _fog_pixSizeL;
|
|
|
|
// linear interpolation of depth
|
|
|
|
const PIX pixSF = FloatToInt( tex.s*(FLOAT)_fog_pixSizeL*255.499f);
|
|
|
|
const PIX pixS1 = Clamp( (PIX)((pixSF>>8)+0), 0L, _fog_pixSizeL-1L);
|
|
|
|
const PIX pixS2 = Clamp( (PIX)((pixSF>>8)+1), 0L, _fog_pixSizeL-1L);
|
|
|
|
const ULONG ulF = pixSF & 255;
|
|
|
|
const ULONG ulA1 = _fog_pubTable[pixT +pixS1];
|
|
|
|
const ULONG ulA2 = _fog_pubTable[pixT +pixS2];
|
|
|
|
return ((ulA1*(ulF^255)+ulA2*ulF) * _fog_ulAlpha) >>16;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// check if texture coord is in fog
|
|
|
|
__forceinline BOOL InFog( const FLOAT fT)
|
|
|
|
{
|
|
|
|
return (fT>_fog_fStart && fT<_fog_fEnd);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// returns lineary-interpolated haze strength in haze texture
|
|
|
|
__forceinline ULONG GetHazeAlpha( const FLOAT fS)
|
|
|
|
{
|
|
|
|
// linear interpolation of depth
|
|
|
|
const PIX pixSH = FloatToInt( fS*(FLOAT)_haze_pixSize*255.4999f);
|
|
|
|
const PIX pixS1 = Clamp( (PIX)((pixSH>>8)+0), 0L, _haze_pixSize-1L);
|
|
|
|
const PIX pixS2 = Clamp( (PIX)((pixSH>>8)+1), 0L, _haze_pixSize-1L);
|
|
|
|
const ULONG ulH = pixSH & 255;
|
|
|
|
const ULONG ulA1 = _haze_pubTable[pixS1];
|
|
|
|
const ULONG ulA2 = _haze_pubTable[pixS2];
|
|
|
|
return ((ulA1*(ulH^255)+ulA2*ulH) * _haze_ulAlpha) >>16;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// check if texture coord is in haze
|
|
|
|
__forceinline BOOL InHaze( const FLOAT fS)
|
|
|
|
{
|
|
|
|
return (fS>_haze_fStart);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* include-once check. */
|
|
|
|
|