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; } };