Commit 2439b8d4 authored by D-AIRY's avatar D-AIRY

Merge branch 'dev' of https://dev.ds-servers.com/sip/engine into dev

parents 23621395 72bcf1f9
......@@ -3,3 +3,5 @@ echo "Executing editor config file"
unbind f10
cl_mode_editor 1
rs_stats 1
\ No newline at end of file
......@@ -17,7 +17,11 @@ half2 PixelSize;
half4 main(vs_out_pp IN) : COLOR0
{
half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.f, 0.f) * PixelSize,0.f,0.f));
half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV,0.f,0.f));
half fEdgeDetected = tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
[branch]if(fEdgeDetected.x == 0.f)
return sampleCenter;
half4 sampleVertNeg1 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, -3.5) * PixelSize, 0.f, 0.f));
half4 sampleVertNeg2 = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.0, -7.5) * PixelSize, 0.f, 0.f));
......@@ -72,5 +76,7 @@ half4 main(vs_out_pp IN) : COLOR0
aaResult = lerp(aaResult, longBlurVert, pass1EdgeAvgHoriz);
}
//return tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
return half4(aaResult.rgb, sampleCenter.a);
return lerp(half4(aaResult.rgb, sampleCenter.a), sampleCenter, 1-fEdgeDetected.x);
}
\ No newline at end of file
......@@ -11,12 +11,17 @@ Directionally Localized Anti Aliasing
#define DLAA_MUL_VAL 0.333f
sampler2D Tex0:register(s0);
sampler2D Tex1:register(s1);
half2 PixelSize;
half4 main(vs_out_pp IN) : COLOR0
{
half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV + half2(0.f, 0.f) * PixelSize,0.f,0.f));
half4 sampleCenter = tex2Dlod(Tex0, half4(IN.TexUV,0.f,0.f));
half fEdgeDetected = tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
[branch]if(fEdgeDetected.x == 0.f)
return sampleCenter;
half4 sampleHorizNeg0 = tex2Dlod(Tex0, half4(IN.TexUV + half2(-1.5f, 0.f) * PixelSize, 0.f, 0.f));
half4 sampleHorizPos0 = tex2Dlod(Tex0, half4(IN.TexUV + half2( 1.5f, 0.f) * PixelSize, 0.f, 0.f));
......@@ -46,5 +51,7 @@ half4 main(vs_out_pp IN) : COLOR0
half4 aaResult = lerp(sampleCenter, avgHoriz, blurAmountHoriz);
aaResult = lerp(aaResult, avgVert, blurAmountVert);
return half4(aaResult.rgb, sampleCenter.a);
//return tex2Dlod(Tex1, half4(IN.TexUV,0.f,0.f));
return half4(aaResult.rgb, sampleCenter.a);
return lerp(half4(aaResult.rgb, sampleCenter.a), sampleCenter, 1-fEdgeDetected.x);
}
\ No newline at end of file
/*
ppe_edge_detected.ps
выделение границ
*/
#include <../struct.h>
#define DLAA_MUL_VAL 0.333
sampler2D Texture0:register(s0);
half2 PixelSize;
half4 main(vs_out_pp IN) : COLOR0
{
/*half4 Center = tex2D(Texture0, IN.TexUV);
half4 UpLeft = tex2D(Texture0, IN.TexUV + half2(-0.5, -0.5) * PixelSize);
half4 UpRight = tex2D(Texture0, IN.TexUV + half2( 0.5, -0.5) * PixelSize);
half4 DownLeft = tex2D(Texture0, IN.TexUV + half2(-0.5, 0.5) * PixelSize);
half4 DownRight = tex2D(Texture0, IN.TexUV + half2( 0.5, 0.5) * PixelSize);
half4 diff = abs(((UpLeft + UpRight + DownLeft + DownRight) * 4.0) - (Center * 16.0));
half edgeMask = dot(diff.xyz, DLAA_MUL_VAL);
return half4(Center.rgb, edgeMask);*/
half fDepthCenter = tex2D(Texture0, IN.TexUV);
half fDepthUpLeft = tex2D(Texture0, IN.TexUV + half2(-1, -1) * PixelSize);
half fDepthUpRight = tex2D(Texture0, IN.TexUV + half2( 1, -1) * PixelSize);
half fDepthDownLeft = tex2D(Texture0, IN.TexUV + half2(-1, 1) * PixelSize);
half fDepthDownRight = tex2D(Texture0, IN.TexUV + half2( 1, 1) * PixelSize);
half diff = abs(((fDepthUpLeft + fDepthUpRight + fDepthDownLeft + fDepthDownRight)*0.25f) - (fDepthCenter));
half edgeMask = step(lerp(0.00001f, 0.001f, fDepthCenter), diff);//dot(diff.xyz, DLAA_MUL_VAL);
return edgeMask;
}
......@@ -7,12 +7,13 @@ ppe_fog_linear.ps
#include <../struct.h>
half3 FogColor;
half4 Param;
half FogDenisty;
/*half4 Param;
//x - интенсивность тумана
//y - на сколько небо в тумане
//z - минимальное значение тумана
//w - максимальное значение тумана
*/
sampler2D DepthMap:register(s0);
......@@ -21,10 +22,10 @@ half4 main(vs_out_pp IN) : COLOR0
half Depth = tex2D(DepthMap, IN.TexUV).r;
[branch]if(Depth >= 1.f)
Depth = Param.y;
clip(-1);
half tmp_alpha = clamp((Param.x * Depth),Param.z,Param.w);
half4 cc = half4(FogColor,tmp_alpha);
/*half tmp_alpha = clamp((Param.x * Depth),Param.z,Param.w);
half4 cc = half4(FogColor,tmp_alpha);*/
return cc;
return half4(FogColor,FogDenisty * Depth);
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ half3 Param;
half2 PixelSize;
sampler2D FrameSampler:register(s0);
sampler2D EdgeDetectedSampler:register(s1);
half2 GetNormal(half2 texuv)
{
......@@ -42,11 +43,16 @@ half2 GetNormal(half2 texuv)
half4 main(vs_out_pp IN) : COLOR0
{
half4 Scene0 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy, 0, 0));
half fEdgeDetected = tex2Dlod(EdgeDetectedSampler, half4(IN.TexUV,0.f,0.f));
[branch]if(fEdgeDetected.x == 0.f)
return Scene0;
half2 Normal = GetNormal(IN.TexUV.xy);
Normal = clamp(Normal, -1, 1) * PixelSize;
half4 Scene0 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy, 0, 0));
half4 Scene1 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy + Normal.xy, 0, 0));
half4 Scene2 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy - Normal.xy, 0, 0));
half4 Scene3 = tex2Dlod(FrameSampler, half4(IN.TexUV.xy + half2(Normal.x, -Normal.y), 0, 0));
......
......@@ -19,15 +19,19 @@ bind f12 screenshot
bind f11 save_worktex
bind f10 change_mode_window
bind f9 shader_reload
bind f8 change_mode_window_abs
cl_mode_editor 1
r_default_fov 1.046
rs_stats 2
pp_ssao 1
pp_bloom true
pp_lensflare true
pp_lensflare_usebloom true
pp_dlaa false
pp_nfaa false
pp_dlaa true
pp_nfaa true
pp_motionblur true
pp_motionblur_coef 0.1
......
......@@ -51,7 +51,7 @@ PROJECT_BRIEF = "3D real-time render"
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory.
PROJECT_LOGO =
PROJECT_LOGO = ./logo.png
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is
......@@ -795,25 +795,23 @@ INPUT = ../../source/gdefines.h \
../../source/GRegisterIndex.h \
../../source/input/sxinput.h \
../../source/gcore/sxgcore.h \
../../source/score/sxscore.h \
../../source/geom/sxgeom.h \
../../source/mtllight/sxmtllight.h \
../../source/pp/sxpp.h \
../../source/SkyXEngine.h \
../../source/managed_render/gdata.h \
../../source/managed_render/camera_update.h \
../../source/managed_render/handler_out_log.cpp \
../../source/managed_render/render_func.h \
../../source/managed_render/level.h \
../../source/anim/sxanim.h \
../../source/anim/ModelFile.h \
../../source/gcore/ModelFile.h \
../../source/SXGUIWinApi/SXGUI.h \
../../source/particles/sxparticles.h \
../../source/score/sxscore.h \
../../source/decals/sxdecals.h \
../../source/aigrid/sxaigrid.h \
../../source/render/sxrender.h \
../../source/level/sxlevel.h \
../../source/SkyXEngine.h \
../../source/sxmaterialeditor/sxmaterialeditor.cpp \
../../source/sxparticleseditor/sxparticleseditor.cpp
../../source/sxparticleseditor/sxparticleseditor.cpp \
../../source/sxleveleditor/sxleveleditor.cpp
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
......
......@@ -101,6 +101,7 @@
<ItemGroup>
<ClInclude Include="..\..\..\source\common\string.h" />
<ClInclude Include="..\..\..\source\gdefines.h" />
<ClInclude Include="..\..\..\source\GRegisterIndex.h" />
<ClInclude Include="..\..\..\source\SkyXEngine.h" />
<ClInclude Include="..\..\..\source\SkyXEngine_Build\resource.h" />
</ItemGroup>
......
......@@ -35,6 +35,9 @@
<ClInclude Include="..\..\..\source\common\string.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\GRegisterIndex.h">
<Filter>Header</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\..\source\SkyXEngine_Build\SkyXEngine.rc">
......
......@@ -32,7 +32,7 @@ See the license in LICENSE
@{*/
#define G_RI_BOOL_CLIPPLANE0 0 /*!< использовать ли плоскость отсечения */
#define G_RI_BOOL_RENDER_WINDOWED 1 /*!< оконный рендер - true, полноэкранный - false */
//#define G_RI_BOOL_RENDER_WINDOWED 1 /*!< оконный рендер - true, полноэкранный - false */
//!@}
......@@ -41,11 +41,11 @@ See the license in LICENSE
/*! \name float register
@{*/
#define G_RI_FLOAT_OBSERVER_NEAR 0 /*!< ближняя плоскость отсечения наблюдателя */
#define G_RI_FLOAT_OBSERVER_FAR 1 /*!< дальняя плоскость отсечения наблюдателя или дальность видимости */
#define G_RI_FLOAT_OBSERVER_FOV 2 /*!< fov наблюдателя */
#define G_RI_FLOAT_WINSIZE_WIDTH 3 /*!< ширина окна рендера */
#define G_RI_FLOAT_WINSIZE_HEIGHT 4 /*!< высота окна рендера */
//#define G_RI_FLOAT_OBSERVER_NEAR 0 /*!< ближняя плоскость отсечения наблюдателя */
//#define G_RI_FLOAT_OBSERVER_FAR 1 /*!< дальняя плоскость отсечения наблюдателя или дальность видимости */
//#define G_RI_FLOAT_OBSERVER_FOV 2 /*!< fov наблюдателя */
//#define G_RI_FLOAT_WINSIZE_WIDTH 3 /*!< ширина окна рендера */
//#define G_RI_FLOAT_WINSIZE_HEIGHT 4 /*!< высота окна рендера */
//!@}
......
This diff is collapsed.
......@@ -46,7 +46,7 @@ GameData::GameData()
Core_0RegisterConcmd("spawn", ccmd_spawn);
Core_0RegisterConcmd("observe", ccmd_observe);
Core_0RegisterCVarFloat("r_default_fov", 45.0f, "Default FOV value");
//Core_0RegisterCVarFloat("r_default_fov", 45.0f, "Default FOV value");
Core_0RegisterCVarBool("cl_mode_editor", false, "Editor control mode");
Core_0RegisterCVarBool("cl_grab_cursor", true, "Grab cursor on move");
......
......@@ -9,7 +9,7 @@ BEGIN_PROPTABLE_NOBASE(SXbaseEntity)
DEFINE_FIELD_VECTOR(m_vPosition, 0, "origin", "Origin", EDITOR_TEXTFIELD)
DEFINE_FIELD_ANGLES(m_vOrientation, 0, "rotation", "Rotation", EDITOR_TEXTFIELD)
DEFINE_FIELD_PARENT(m_pParent, 0, "parent", "Parent entity", EDITOR_TEXTFIELD)
DEFINE_FIELD_FLAGS(m_iFlags, 0, "flags", "Flags", EDITOR_TEXTFIELD)
DEFINE_FIELD_FLAGS(m_iFlags, 0, "flags", "Flags", EDITOR_FLAGS)
DEFINE_FIELD_ENTITY(m_pOwner, PDFF_NOEXPORT | PDFF_NOEDIT, "owner", "", EDITOR_NONE)
//DEFINE_FIELD_STRING(m_szName, 0, "some opt", "Option", EDITOR_COMBOBOX)
......
......@@ -62,9 +62,13 @@ void Crosshair::Update()
return;
}
}
static const int *r_win_width = GET_PCVAR_INT("r_win_width");
static const int *r_win_height = GET_PCVAR_INT("r_win_height");
//build new buffer
float fScreenWidth = Core_RFloatGet(G_RI_FLOAT_WINSIZE_WIDTH);
float fScreenHeight = Core_RFloatGet(G_RI_FLOAT_WINSIZE_HEIGHT);
float fScreenWidth = *r_win_width;
float fScreenHeight = *r_win_height;
float fTexWidth = m_f2TexSize.x;
float fTexHeight = m_f2TexSize.y;
float fXradius = fTexWidth / fScreenWidth * 0.5f;
......
......@@ -265,6 +265,7 @@ const char * GetEmptyString();
#define EDITOR_NONE {PDE_NONE, NULL}}
#define EDITOR_TEXTFIELD {PDE_TEXTFIELD, NULL}}
#define EDITOR_FLAGS {PDE_FLAGS, NULL}}
#define EDITOR_COMBOBOX _GetEditorCombobox(0
#define COMBO_OPTION(name, value) , name, value
......
......@@ -111,9 +111,11 @@ SX_LIB_API const char * SXGame_EntGetDefault(const char * classname, const char
*/
SX_LIB_API int SXGame_EntGetCount();
/*! entity
/*! entity id
*/
SX_LIB_API SXbaseEntity * SXGame_EntGet(ID id);
SX_LIB_API SXbaseEntity *SXGame_EntGet(ID id);
SX_LIB_API SXbaseEntity *SXGame_EntGetByName(const char *szName, ID idStart = 0);
#endif
......
......@@ -355,8 +355,26 @@ SX_LIB_API int SXGame_EntGetCount()
return(GameData::m_pMgr->GetCount());
}
SX_LIB_API SXbaseEntity * SXGame_EntGet(ID id)
SX_LIB_API SXbaseEntity *SXGame_EntGet(ID id)
{
SG_PRECOND(NULL);
return(GameData::m_pMgr->GetById(id));
}
SX_LIB_API SXbaseEntity *SXGame_EntGetByName(const char *szName, ID idStart)
{
SG_PRECOND(NULL);
SXbaseEntity *pEnt = 0;
for (int i = 0, il = SXGame_EntGetCount(); i < il; ++i)
{
pEnt = SXGame_EntGet(i);
if (pEnt && strcmp(szName, pEnt->GetName()) == 0)
{
return pEnt;
}
}
return 0;
}
......@@ -125,13 +125,12 @@ void GCoreInit(HWND hwnd, int width, int heigth, bool windowed, DWORD create_dev
D3DXFONT_DESC LF;
ZeroMemory(&LF, sizeof(D3DXFONT_DESC));
LF.Height = 10; //
LF.Width = 6; //
LF.Weight = 6; // ,
// 0() - 1000()
LF.Height = 14;
LF.Width = 7;
LF.Weight = 10;
LF.Italic = 0;
LF.CharSet = DEFAULT_CHARSET;
LF.FaceName[0] = 0;
sprintf(LF.FaceName, "Courier New");
D3DXCreateFontIndirect(DXDevice, &LF, &FPSText);
......@@ -175,9 +174,9 @@ void GCoreInit(HWND hwnd, int width, int heigth, bool windowed, DWORD create_dev
//
Core_RFloatSet(G_RI_FLOAT_WINSIZE_WIDTH, (float)width);
/*Core_RFloatSet(G_RI_FLOAT_WINSIZE_WIDTH, (float)width);
Core_RFloatSet(G_RI_FLOAT_WINSIZE_HEIGHT, (float)heigth);
Core_RBoolSet(G_RI_BOOL_RENDER_WINDOWED, windowed);
Core_RBoolSet(G_RI_BOOL_RENDER_WINDOWED, windowed);*/
MShaders = new ShaderManager();
MRenderTargets = new CreatorTextures();
......@@ -320,9 +319,9 @@ SX_LIB_API bool SGCore_OnDeviceReset(int width, int heigth, bool windowed)
D3DAPP.BackBufferHeight = heigth;
D3DAPP.Windowed = windowed;
Core_RFloatSet(G_RI_FLOAT_WINSIZE_WIDTH, (float)width);
/*Core_RFloatSet(G_RI_FLOAT_WINSIZE_WIDTH, (float)width);
Core_RFloatSet(G_RI_FLOAT_WINSIZE_HEIGHT, (float)heigth);
Core_RBoolSet(G_RI_BOOL_RENDER_WINDOWED, windowed);
Core_RBoolSet(G_RI_BOOL_RENDER_WINDOWED, windowed);*/
return (FAILED(DXDevice->Reset(&D3DAPP)));
}
......
......@@ -44,7 +44,7 @@ struct IBaseObject
Стандартная функция имеет ограничение на длину сообщения которое регулируется макроопределением REPORT_MSG_MAX_LEN объявленном в gdefines.h. При написании своего обработчика сообщений следует использовать данное ограничение.\n
Уровни критичности сообщений объявлены в gdefines.h: \n
- #REPORT_MSG_LEVEL_NOTICE
- #REPORT_MSG_LEVEL_WARRNING
- #REPORT_MSG_LEVEL_WARNING
- #REPORT_MSG_LEVEL_ERROR
В случае переназначения стандартной функции сообщений необходимо самостоятельно(в переназначаемой функции) обрабатывать уровни критичности, для примера можно использовать механизм стандартной функции.\n
......
......@@ -57,8 +57,8 @@ void CAmbientSounds::update()
if (!m_isPlaying)
return;
static const float * ambient_snd_volume = GET_PCVAR_FLOAT("ambient_snd_volume");
static float ambient_snd_volume_old = 1.f;
static const float * env_ambient_snd_volume = GET_PCVAR_FLOAT("env_ambient_snd_volume");
static float env_ambient_snd_volume_old = 1.f;
if (SSCore_SndStateGet(m_aIDSnds[m_iPlayingLast]) != SOUND_OBJSTATE_PLAY)
{
......@@ -67,15 +67,15 @@ void CAmbientSounds::update()
else
m_iPlayingLast = 0;
SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], ambient_snd_volume_old*100.f);
SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], env_ambient_snd_volume_old*100.f);
SSCore_SndPlay(m_aIDSnds[m_iPlayingLast]);
}
if (ambient_snd_volume && ambient_snd_volume_old != (*ambient_snd_volume))
if (env_ambient_snd_volume && env_ambient_snd_volume_old != (*env_ambient_snd_volume))
{
ambient_snd_volume_old = *ambient_snd_volume;
env_ambient_snd_volume_old = *env_ambient_snd_volume;
if (m_iPlayingLast >= 0)
SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], ambient_snd_volume_old*100.f);
SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], env_ambient_snd_volume_old*100.f);
}
}
......
/******************************************************
Copyright Vitaliy Buturlin, Evgeny Danilovich, 2017
Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
See the license in LICENSE
******************************************************/
/*!
\file
Заголовочный файл sxlevel, библиотека управления уровнем
*/
#ifndef __SXLEVEL_H
#define __SXLEVEL_H
......@@ -76,139 +81,144 @@ See the license in LICENSE
//#############################################################################
//!
/*! \defgroup sxlevel sxlevel - библиотека управления уровнем
@{*/
//! версия подсистемы
SX_LIB_API long SLevel_0GetVersion();
//!
//! установка функции вывода сообщений
SX_LIB_API void SLevel_Dbg_Set(report_func rf);
//!
//! инициализация подсистемы
SX_LIB_API void SLevel_0Create(
const char *szName, //!<
bool isUnic = true //!<
const char *szName, //!< передваваемое имя подсистемы
bool isUnic = true //!< должна ли подсистема быть уникальной на основе имени
);
//!
//! уничтожение либы
SX_LIB_API void SLevel_AKill();
//#############################################################################
//!
//! очистка уровня
SX_LIB_API void SLevel_Clear();
//!
//! загрузка уровня
SX_LIB_API void SLevel_Load(const char *szName, bool isGame);
//!
//! сохранение уровня
SX_LIB_API void SLevel_Save(const char *szName);
//!
//! возвращает и записывает имя уровня
SX_LIB_API const char* SLevel_GetName(char *szName=0);
//!
//! загрузка файла с инфой о частицах
SX_LIB_API void SLevel_LoadParticles();
//!
//! сохранение файла с инфой о частицах
SX_LIB_API void SLevel_SaveParticles();
//#############################################################################
/*! defgroup sxgame_ambient_snd
\ingroup sxgame
\note
\note
/*! \defgroup sxlevel_ambient_snd Фоновые звуки окружения
\ingroup sxlevel
\note Звуки проигрывают поочередно
\note Путь до звука относительно директории со звуками
@{
*/
//!
//! добавить звук
SX_LIB_API void SLevel_AmbientSndAdd(const char* path);
//!
//! возвращает общее количество загруженных звуков
SX_LIB_API UINT SLevel_AmbientSndGetCount();
//! path id
//! в path записывает путь до звука по его id
SX_LIB_API void SLevel_AmbientSndGet(ID id, char* path);
//!
//! очистка списка звуков
SX_LIB_API void SLevel_AmbientSndClear();
//!
//! начать проигрывание звуков
SX_LIB_API void SLevel_AmbientSndPlay();
//!
//! обновление проигрывания
SX_LIB_API void SLevel_AmbientSndUpdate();
//!
//! пауза проигрывания
SX_LIB_API void SLevel_AmbientSndPause();
//! " "
//! возвращает "проигрываются ли звуки"
SX_LIB_API bool SLevel_AmbientSndGetPlaying();
//!@} sxgame_ambient_snd
//!@} sxlevel_ambient_snd
//#############################################################################
/*! defgroup sxgame_weather
\ingroup sxgame
\note
\note , #SXLevel_WeatherUpdate ( )
- :
- (sections) , 01:11:12 1 11 12
- ( )
- , \n
:
- sky_texture -
- sky_rotation - ( )
- sky_color - float4 [0-1] ,
- clouds_texture -
- clouds_color - float4 [0-1] ,
- clouds_rotate - ( )
- clouds_transparency - [0-1]
- clouds_speed -
- sun_texture - , 0
- sun_color - float3 [0-1]
- sun_pos - X Z
- far -
- rain_density [0-1]
- rain_color - float4 [0-1] ,
- thunderbolt -
- thunder_period -
- fog_color - float3 [0-1]
- fog_density -
- env_ambient - \n
, env_ambient \n
\n
:
- period - ( ) UINT2 ( ),
- volume - ( ) UINT2 ( ),
- sounds -
/*! \defgroup sxlevel_weather Погода
\ingroup sxlevel
\note Смена погоды происходит на основании игрового времени
\note При смене погоды для некоторых параметров возможна интерполяция данных от прошлой погоды к текущей на основании игрового времени, поэтому #SLevel_WeatherUpdate необходимо вызывать в основном цикле (в рендере) для планой смены
Файл-конфиг состоит из:
- основной секции (sections) с набором ключей содержащих имена секций по времени, к примеру имя ключа 01:11:12 это значит что ключ содержит имя секции с погодой для 1 часа ночи 11 минут и 12 секунд
- секции с параметрами погоды (для каждого указанного времени)
- секции с параметрами рандомных звуков, если таковые имеются \n
Секции погоды состоят из:
- sky_texture - имя текстуры для скайбокса
- sky_rotation - угол поворота скайбокса (в радианах)
- sky_color - цвет неба float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
- clouds_texture - текстура облаков
- clouds_color - цвет облаков float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
- clouds_rotate - поворот облаков (в радианах)
- clouds_transparency - прозрачность облаков [0-1]
- clouds_speed - скорость движения облаков
- sun_texture - текстура солнца, если указать 0 то солнце будет выключено
- sun_color - цвет солнца и освещения от солнца float3 [0-1]
- sun_pos - позиция сонлца в градусах по оси X и Z
- far - дальность видимости
- rain_density плотность дождя [0-1]
- rain_color - цвет дождя float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
- thunderbolt - будет ли молния
- thunder_period - перидичность звуков ударов молнии
- fog_color - цвет тумана float3 [0-1]
- fog_density - плотность тумана
- env_ambient - имя секции с рандомными звуками для данной погоды \n
Все ключи в секции погоды обязательны, за исключением env_ambient \n
Все компоненты векторов обязательны \n
Секция с рандомными звуками состоит из:
- period - промежуток (в млсек) между воспроизведением UINT2 (от и до), выбирается случайно
- volume - громкость (в процентах) воспроизведения UINT2 (от и до), выбирается случайно
- sounds - список звуков через запятую
@{
*/
//!
//! загрузка конфига погоды
SX_LIB_API void SLevel_WeatherLoad(const char* path);
//!
//! обновление погоды
SX_LIB_API void SLevel_WeatherUpdate();
//!
//! возвращает текущую плотность дождя
SX_LIB_API float SLevel_WeatherGetCurrRainDensity();
//!
//! начать воспроизведение звуков погоды
SX_LIB_API void SLevel_WeatherSndPlay();
//!
//! приостановить воспроизведение звуков погоды
SX_LIB_API void SLevel_WeatherSndPause();
//! " "
//! возвращает "воспроизводятся ли звуки погоды"
SX_LIB_API bool SLevel_WeatherSndIsPlaying();
//!@} sxgame_weather
//!@} sxlevel_weather
//!@} sxlevel
#endif
\ No newline at end of file
......@@ -87,7 +87,7 @@ void CWeatherRndSnd::update()
if (!m_isPlaying)
return;
static const float * weather_snd_volume = GET_PCVAR_FLOAT("weather_snd_volume");
static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume");
if (m_aCurrSndIDs.size() > 0 && (m_ulNextPlay == 0 || m_ulNextPlay < TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER))))
{
......@@ -97,7 +97,7 @@ void CWeatherRndSnd::update()
m_idCurrPlay = m_aCurrSndIDs[tmpkeysnd];
SSCore_SndPosCurrSet(m_idCurrPlay, 0);
int tmprndvol = (rand() % (m_iVolumeE - m_iVolumeB)) + m_iVolumeB;
SSCore_SndVolumeSet(m_idCurrPlay, (long)(weather_snd_volume ? (float)tmprndvol * (*weather_snd_volume) : tmprndvol), SOUND_VOL_PCT);
SSCore_SndVolumeSet(m_idCurrPlay, (long)(env_weather_snd_volume ? (float)tmprndvol * (*env_weather_snd_volume) : tmprndvol), SOUND_VOL_PCT);
SSCore_SndPlay(m_idCurrPlay);
DWORD tmprnd = (rand() % (m_ulPeriodE - m_ulPeriodB)) + m_ulPeriodB;
......@@ -559,7 +559,7 @@ void CWeather::update()
ID gid = SML_LigthsGetGlobal();
static const float * weather_snd_volume = GET_PCVAR_FLOAT("weather_snd_volume");
static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume");
//если есть дождь то обновл¤ем его позицию и громкость
if (m_iSectionCurr >= 0 && (int)m_aTimeSections.size() > m_iSectionCurr && m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
......@@ -570,14 +570,14 @@ void CWeather::update()
updateRainSound();
}
static float * main_rain_density = (float*)GET_PCVAR_FLOAT("main_rain_density");
static float main_rain_density_old = 1.f;
static float * env_default_rain_density = (float*)GET_PCVAR_FLOAT("env_default_rain_density");
static float env_default_rain_density_old = 1.f;
if (main_rain_density && (*main_rain_density) != main_rain_density_old)
if (env_default_rain_density && (*env_default_rain_density) != env_default_rain_density_old)
{
main_rain_density_old = *main_rain_density;
env_default_rain_density_old = *env_default_rain_density;
if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, main_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, env_default_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
}
//получаем текущую игровую дату
......@@ -638,7 +638,7 @@ void CWeather::update()
if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
{
SPE_EmitterSet(m_idEffRain, 0, Color, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vRainColor);
SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, main_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, env_default_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
SPE_EffectEnableSet(m_idEffRain, true);
SSCore_SndPosCurrSet(m_idSndRain, 0);
......@@ -727,7 +727,7 @@ void CWeather::update()
//дальность видимости
float tmpfar = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_fFar, m_aTimeSections[m_iSectionCurr].m_DataSection.m_fFar, lerp_factor);
Core_0SetCVarFloat("p_far", tmpfar);
Core_0SetCVarFloat("r_far", tmpfar);
//плотность тумана
static float * pp_fog_density = (float*)GET_PCVAR_FLOAT("pp_fog_density");
......@@ -756,9 +756,9 @@ void CWeather::update()
//иначе если предыдущее врем¤ грозы нулевое и врем¤ следующей грозы наступило