mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-24 19:30:26 +01:00
127 lines
4.1 KiB
C++
127 lines
4.1 KiB
C++
216
|
|
%{
|
|
#include "Entities/StdH/StdH.h"
|
|
%}
|
|
|
|
uses "Entities/Marker";
|
|
uses "Entities/FogMarker";
|
|
|
|
|
|
class CHazeMarker: CMarker {
|
|
name "Haze Marker";
|
|
thumbnail "Thumbnails\\HazeMarker.tbn";
|
|
features "IsImportant";
|
|
|
|
properties:
|
|
10 enum FogAttenuationType m_faType "Attenuation Type" 'A' =FA_EXP,
|
|
11 FLOAT m_fDensity "Density" 'D' = 0.1f,
|
|
12 FLOAT m_fNear "Near" = 100.0f,
|
|
13 FLOAT m_fFar "Far" = 1000.0f,
|
|
14 BOOL m_bVisibleFromOutside "Visible from outside" = FALSE,
|
|
|
|
22 INDEX m_iSize "Size" = 32,
|
|
23 COLOR m_colBase "Base Color" 'C' = (C_WHITE|CT_OPAQUE),
|
|
24 COLOR m_colUp "Color (up)" = (C_BLACK|CT_TRANSPARENT),
|
|
25 COLOR m_colDown "Color (down)" = (C_BLACK|CT_TRANSPARENT),
|
|
26 COLOR m_colNorth "Color (north)" = (C_BLACK|CT_TRANSPARENT),
|
|
27 COLOR m_colSouth "Color (south)" = (C_BLACK|CT_TRANSPARENT),
|
|
28 COLOR m_colEast "Color (east)" = (C_BLACK|CT_TRANSPARENT),
|
|
29 COLOR m_colWest "Color (west)" = (C_BLACK|CT_TRANSPARENT),
|
|
|
|
components:
|
|
1 model MODEL_MARKER "Models\\Editor\\Haze.mdl",
|
|
2 texture TEXTURE_MARKER "Models\\Editor\\Haze.tex"
|
|
|
|
functions:
|
|
|
|
/* Get haze type name, return empty string if not used. */
|
|
const CTString &GetHazeName(void)
|
|
{
|
|
return m_strName;
|
|
}
|
|
|
|
/* Get haze. */
|
|
void GetHaze(class CHazeParameters &hpHaze, FLOAT3D &vViewDir)
|
|
{
|
|
// calculate directional haze color
|
|
COLOR colDir=C_BLACK, colMul;
|
|
FLOAT fR=0.0f, fG=0.0f, fB=0.0f, fA=0.0f;
|
|
FLOAT fSum = 255.0f / (Abs(vViewDir(1))+Abs(vViewDir(2))+Abs(vViewDir(3)));
|
|
|
|
if( vViewDir(1) < 0.0f) {
|
|
colMul = (COLOR)(-vViewDir(1)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colWest, colMul));
|
|
}
|
|
if( vViewDir(1) > 0.0f) {
|
|
colMul = (COLOR)(+vViewDir(1)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colEast, colMul));
|
|
}
|
|
if( vViewDir(2) < 0.0f) {
|
|
colMul = (COLOR)(-vViewDir(2)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colDown, colMul));
|
|
}
|
|
if( vViewDir(2) > 0.0f) {
|
|
colMul = (COLOR)(+vViewDir(2)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colUp, colMul));
|
|
}
|
|
if( vViewDir(3) < 0.0f) {
|
|
colMul = (COLOR)(-vViewDir(3)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colNorth, colMul));
|
|
}
|
|
if( vViewDir(3) > 0.0f) {
|
|
colMul = (COLOR)(+vViewDir(3)*fSum);
|
|
colMul = (colMul<<CT_RSHIFT) | (colMul<<CT_GSHIFT) | (colMul<<CT_BSHIFT) | (colMul<<CT_ASHIFT);
|
|
colDir = AddColors( colDir, MulColors( m_colSouth, colMul));
|
|
}
|
|
|
|
// blend base and direction haze color
|
|
colDir = AddColors( colDir, m_colBase);
|
|
|
|
// assign parameters
|
|
hpHaze.hp_colColor = colDir;
|
|
hpHaze.hp_atType = (AttenuationType) m_faType;
|
|
hpHaze.hp_fDensity = m_fDensity;
|
|
hpHaze.hp_fNear = m_fNear;
|
|
hpHaze.hp_fFar = m_fFar;
|
|
hpHaze.hp_iSize = m_iSize;
|
|
hpHaze.hp_ulFlags = 0;
|
|
if (m_bVisibleFromOutside) {
|
|
hpHaze.hp_ulFlags |= HPF_VISIBLEFROMOUTSIDE;
|
|
}
|
|
}
|
|
|
|
procedures:
|
|
|
|
Main()
|
|
{
|
|
InitAsEditorModel();
|
|
SetPhysicsFlags(EPF_MODEL_IMMATERIAL);
|
|
SetCollisionFlags(ECF_IMMATERIAL);
|
|
|
|
// set appearance
|
|
SetModel(MODEL_MARKER);
|
|
SetModelMainTexture(TEXTURE_MARKER);
|
|
|
|
// set name
|
|
if (m_strName=="Marker") {
|
|
m_strName = "Haze marker";
|
|
}
|
|
|
|
// clamp values to valid ranges
|
|
m_fDensity = ClampDn(m_fDensity, 1E-6f);
|
|
m_fFar = ClampDn(m_fFar, 0.001f);
|
|
m_fNear = Clamp(m_fNear, 0.0f, m_fFar-0.0005f);
|
|
ASSERT(m_fNear>=0 && m_fNear<m_fFar);
|
|
|
|
m_iSize = 1<<INDEX(Log2(m_iSize));
|
|
m_iSize= Clamp(m_iSize, INDEX(2), INDEX(256));
|
|
|
|
return;
|
|
}
|
|
};
|