diff --git a/src/Editors/LevelEditor/Editor/Scene/SceneRender.cpp b/src/Editors/LevelEditor/Editor/Scene/SceneRender.cpp index 5137270a8d..89b6245460 100644 --- a/src/Editors/LevelEditor/Editor/Scene/SceneRender.cpp +++ b/src/Editors/LevelEditor/Editor/Scene/SceneRender.cpp @@ -24,37 +24,10 @@ void object_StrictB2F_1(EScene::mapObject_Node *N){RENDER_OBJECT(1,true);} void object_StrictB2F_2(EScene::mapObject_Node *N){RENDER_OBJECT(2,true);} void object_StrictB2F_3(EScene::mapObject_Node *N){RENDER_OBJECT(3,true);} -#define RENDER_SCENE_TOOLS(P,B)\ - {\ - SceneMToolsIt s_it = scene_tools.begin();\ - SceneMToolsIt s_end = scene_tools.end();\ - for (; s_it!=s_end; s_it++){\ - EDevice->SetShader (B?EDevice->m_SelectionShader:EDevice->m_WireShader);\ - RCache.set_xform_world (Fidentity);\ - try{\ - (*s_it)->OnRenderRoot(P,B);\ - }catch(...){\ - ELog.DlgMsg(mtError, "Please notify AlexMX!!! Critical error has occured in render routine!!! [Type B] - Tools: '%s'",(*s_it)->ClassName());\ - }\ - }\ - } - void EScene::RenderSky(const Fmatrix& camera) { if( !valid() ) return; -// draw sky -/* -//. - if (m_SkyDome&&fraBottomBar->miDrawSky->Checked){ - st_Environment& E = m_LevelOp.m_Envs[m_LevelOp.m_CurEnv]; - m_SkyDome->GetPosition() = camera.c; - m_SkyDome->UpdateTransform(true); - EDevice->SetRS(D3DRS_TEXTUREFACTOR, E.m_SkyColor.get()); - m_SkyDome->RenderSingle(); - EDevice->SetRS(D3DRS_TEXTUREFACTOR, 0xffffffff); - } -*/ } struct tools_rp_pred @@ -110,7 +83,26 @@ void EScene::Render( const Fmatrix& camera ) } } } - + + auto RENDER_SCENE_TOOLS = [scene_tools](int P, bool B) + { + SceneMToolsIt s_it = scene_tools.begin(); + SceneMToolsIt s_end = scene_tools.end(); + for (; s_it != s_end; s_it++) + { + EDevice->SetShader(B ? EDevice->m_SelectionShader : EDevice->m_WireShader); + RCache.set_xform_world(Fidentity); + try + { + (*s_it)->OnRenderRoot(P, B); + } + catch (...) + { + ELog.DlgMsg(mtError, "Please notify AlexMX!!! Critical error has occured in render routine!!! [Type B] - Tools: '%s'", (*s_it)->ClassName()); \ + } + } + }; + // priority #0 // normal mapRenderObjects.traverseLR (object_Normal_0); diff --git a/src/Editors/LevelEditor/Editor/Tools/Light/ESceneLightTools.cpp b/src/Editors/LevelEditor/Editor/Tools/Light/ESceneLightTools.cpp index 45b5c3be4e..1dd11dc035 100644 --- a/src/Editors/LevelEditor/Editor/Tools/Light/ESceneLightTools.cpp +++ b/src/Editors/LevelEditor/Editor/Tools/Light/ESceneLightTools.cpp @@ -80,6 +80,19 @@ void ESceneLightTool::OnRender(int priority, bool strictB2F) { inherited::OnRender(priority, strictB2F); + if (bIsShowSun) + m_Flags.set(flShowSun, true); + else + m_Flags.set(flShowSun, false); + if (bIsUseSunDir) + m_Flags.set(flWthrSunDir, true); + else + m_Flags.set(flWthrSunDir, false); + if (bIsUseHemi) + m_Flags.set(flWthrHemi, true); + else + m_Flags.set(flWthrHemi, false); + if (m_Flags.is(flShowSun)) { if ((true == strictB2F) && (1 == priority)) { diff --git a/src/Editors/LevelEditor/Editor/UI_LevelTools.cpp b/src/Editors/LevelEditor/Editor/UI_LevelTools.cpp index 59317d65a4..c21c9c2dec 100644 --- a/src/Editors/LevelEditor/Editor/UI_LevelTools.cpp +++ b/src/Editors/LevelEditor/Editor/UI_LevelTools.cpp @@ -375,22 +375,18 @@ void CLevelTool::ZoomObject(BOOL bSelectedOnly) void CLevelTool::GetCurrentFog(u32& fog_color, float& s_fog, float& e_fog) { - - if (psDeviceFlags.is(rsEnvironment)&&psDeviceFlags.is(rsFog)||UI->IsPlayInEditor()) + if (psDeviceFlags.is(rsEnvironment) && psDeviceFlags.is(rsFog) || UI->IsPlayInEditor()) { - s_fog = g_pGamePersistent->Environment().CurrentEnv->fog_near; - e_fog = g_pGamePersistent->Environment().CurrentEnv->fog_far; - Fvector& f_clr = g_pGamePersistent->Environment().CurrentEnv->fog_color; - fog_color = color_rgba_f(f_clr.x,f_clr.y,f_clr.z,1.f); + s_fog = g_pGamePersistent->Environment().CurrentEnv->fog_near; + e_fog = g_pGamePersistent->Environment().CurrentEnv->fog_far; + Fvector& f_clr = g_pGamePersistent->Environment().CurrentEnv->fog_color; + fog_color = color_rgba_f(f_clr.x, f_clr.y, f_clr.z, 1.f); } else { - - s_fog = psDeviceFlags.is(rsFog)?(1.0f - fFogness)* 0.85f * UI->ZFar():0.99f*UI->ZFar(); - e_fog = psDeviceFlags.is(rsFog)?0.91f * UI->ZFar():UI->ZFar(); - + s_fog = psDeviceFlags.is(rsFog) ? (1.0f - fFogness) * 0.85f * UI->ZFar() : 0.99f * UI->ZFar(); + e_fog = psDeviceFlags.is(rsFog) ? 0.91f * UI->ZFar() : UI->ZFar(); } - } diff --git a/src/Editors/xrECore/Editor/EditorPreferences.cpp b/src/Editors/xrECore/Editor/EditorPreferences.cpp index 2899e5c8c4..f00bf8bbcc 100644 --- a/src/Editors/xrECore/Editor/EditorPreferences.cpp +++ b/src/Editors/xrECore/Editor/EditorPreferences.cpp @@ -333,12 +333,15 @@ void CCustomPreferences::Load() scene_recent_list.push_back(fn.c_str()); } } - // Weather - env_from_time = JSONData["editor_prefs"]["env_from_time"]; - env_to_time = JSONData["editor_prefs"]["env_to_time"]; - env_speed = JSONData["editor_prefs"]["env_speed"]; - sWeather = ((std::string)(JSONData["editor_prefs"]["weather"])).c_str(); + // Weather + if (JSONData["editor_prefs"].contains("env_from_time")) + { + env_from_time = JSONData["editor_prefs"]["env_from_time"]; + env_to_time = JSONData["editor_prefs"]["env_to_time"]; + env_speed = JSONData["editor_prefs"]["env_speed"]; + } + sWeather = ((std::string)(JSONData["editor_prefs"]["weather"])).c_str(); if (JSONData["ContentBrowser"].contains("file_custom_icon")) { custom_icons = JSONData["ContentBrowser"]["file_custom_icon"].get>(); diff --git a/src/Editors/xrECore/Editor/UIWeatherPropForm.cpp b/src/Editors/xrECore/Editor/UIWeatherPropForm.cpp index b1fece56d5..bc94346ae2 100644 --- a/src/Editors/xrECore/Editor/UIWeatherPropForm.cpp +++ b/src/Editors/xrECore/Editor/UIWeatherPropForm.cpp @@ -37,12 +37,45 @@ void UIWeatherPropForm::Draw() float time_factor = g_pGameLevel ? g_pGameLevel->GetEnvironmentTimeFactor() : env.fTimeFactor; ImVec2 sizeImage = ImVec2(454.0f, 250.0f); // Размер изображения, которое мы хотим сделать видимым ImVec2 sizeButton = ImVec2(100.0f, 22.0f); // Размер кнопки, которое мы хотим сделать видимым + // -------------------------------------------------------------------------------------------- // Картинка - { + { + ImVec2 image_pos = ImGui::GetCursorScreenPos(); m_weather_properties->Load(); ImGui::SameLine(0, 0); - ImGui::Image(m_weather_properties->surface_get(), ImVec2(sizeImage)); + ImGui::Image(m_weather_properties->pSurface, ImVec2(sizeImage)); + + // Переводим секунды в часы (0-24) + float hours = std::fmod(time / 3600.0f, 24.0f); + + // Диапазон ночи + float alpha = 0.0f; + if (hours >= 18.0f) + { + alpha = (hours - 18.0f) / 4.0f; + } + else if (hours <= 6.0f) + { + alpha = 1.0f - (hours / 6.0f); + } + + // Корректируем диапазон (0 - 1) + alpha = std::clamp(alpha, 0.0f, 0.85f); + + // Конвертируем в диапазон 0 - 255 + int alpha_int = static_cast(alpha * 255.0f); + + // Накладываем затемнение (если есть) + if (alpha_int > 0) + { + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled( + image_pos, + ImVec2(image_pos.x + sizeImage.x, image_pos.y + sizeImage.y), + ImColor(0, 0, 0, alpha_int) + ); + } } // -------------------------------------------------------------------------------------------- ImGui::BeginChild("Center", ImVec2(455, 575), true); @@ -54,9 +87,9 @@ void UIWeatherPropForm::Draw() ImGui::TextColored(ImVec4(0, 1, 1, 0.7), titleTime); // -------------------------------------------------------------------------------------------- if (ImGui::CollapsingHeader("Environment time", ImGuiTreeNodeFlags_DefaultOpen)) - { - u32 hours, minutes, seconds; - env.SplitTime(time, hours, minutes, seconds); + { + u32 hours, minutes, seconds; + env.SplitTime(time, hours, minutes, seconds); string128 temp; xr_sprintf(temp, "Current time: %02d:%02d:%02d###environment_time", hours, minutes, seconds); diff --git a/src/utils/ETools/xrXRC.cpp b/src/utils/ETools/xrXRC.cpp index e331d2d310..7a9d6a67b8 100644 --- a/src/utils/ETools/xrXRC.cpp +++ b/src/utils/ETools/xrXRC.cpp @@ -6,4 +6,10 @@ #include "xrXRC.h" -ENGINE_API xrXRC XRC; \ No newline at end of file +thread_local CDB::COLLIDER CL; +ENGINE_API xrXRC XRC; + +IC CDB::COLLIDER* xrXRC::collider() +{ + return &CL; +} diff --git a/src/utils/ETools/xrXRC.h b/src/utils/ETools/xrXRC.h index eb7bdbd2d1..f28fa11161 100644 --- a/src/utils/ETools/xrXRC.h +++ b/src/utils/ETools/xrXRC.h @@ -2,85 +2,72 @@ // ////////////////////////////////////////////////////////////////////// -#if !defined(AFX_XRXRC_H__9AA25268_621F_4FCA_BD75_AF2E9822B8E3__INCLUDED_) -#define AFX_XRXRC_H__9AA25268_621F_4FCA_BD75_AF2E9822B8E3__INCLUDED_ #pragma once #include "../../xrCDB/xrCDB.h" -class ENGINE_API xrXRC +#ifndef ETOOLS_API +# ifdef ETOOLS_EXPORTS +# define ETOOLS_API __declspec( dllexport ) +# else +# define ETOOLS_API __declspec( dllimport ) +# endif +#endif + +class ETOOLS_API xrXRC { - CDB::COLLIDER CL; public: - IC CDB::COLLIDER* collider (){return &CL;} - IC void ray_options (DWORD f) + IC CDB::COLLIDER* collider(); + IC void ray_options(DWORD f) { - CL.ray_options(f); + collider()->ray_options(f); } - IC void ray_query (const CDB::MODEL *m_def, const Fvector& r_start, const Fvector& r_dir, float r_range) + + IC void ray_query(const CDB::MODEL* m_def, const Fvector& r_start, const Fvector& r_dir, float r_range) { -#ifndef NO_XRC_STATS - Device.Statistic->clRAY.Begin(); -#endif - CL.ray_query(m_def,r_start,r_dir,r_range); -#ifndef NO_XRC_STATS - Device.Statistic->clRAY.End (); -#endif + collider()->ray_query(m_def, r_start, r_dir, r_range); } - IC void ray_query (const Fmatrix& inv_parent, const CDB::MODEL *m_def, const Fvector& r_start, const Fvector& r_dir, float r_range) + IC void ray_query(const Fmatrix& inv_parent, const CDB::MODEL* m_def, const Fvector& r_start, const Fvector& r_dir, float r_range) { - // transform - Fvector S,D; - inv_parent.transform_tiny (S,r_start); - inv_parent.transform_dir (D,r_dir); - ray_query (m_def,S,D,r_range); + // transform + Fvector S, D; + inv_parent.transform_tiny(S, r_start); + inv_parent.transform_dir(D, r_dir); + ray_query(m_def, S, D, r_range); } - IC void box_options (DWORD f) + IC void box_options(DWORD f) { - CL.box_options(f); + collider()->box_options(f); } - IC void box_query (const CDB::MODEL *m_def, const Fvector& b_center, const Fvector& b_dim) + IC void box_query(const CDB::MODEL* m_def, const Fvector& b_center, const Fvector& b_dim) { -#ifndef NO_XRC_STATS - Device.Statistic->clBOX.Begin(); -#endif - CL.box_query(m_def,b_center,b_dim); -#ifndef NO_XRC_STATS - Device.Statistic->clBOX.End (); -#endif + collider()->box_query(m_def, b_center, b_dim); } - IC void box_query (const Fmatrix& inv_parent, const CDB::MODEL *m_def, const Fbox& src) + IC void box_query(const Fmatrix& inv_parent, const CDB::MODEL* m_def, const Fbox& src) { - Fbox dest; - dest.xform(src,inv_parent); - Fvector c,d; - dest.getcenter(c); - dest.getradius(d); - box_query(m_def,c,d); + Fbox dest; + dest.xform(src, inv_parent); + Fvector c, d; + dest.getcenter(c); + dest.getradius(d); + box_query(m_def, c, d); } - IC void frustum_options (DWORD f) + IC void frustum_options(DWORD f) { - CL.frustum_options(f); + collider()->frustum_options(f); } - IC void frustum_query (const CDB::MODEL *m_def, const CFrustum& F) + IC void frustum_query(const CDB::MODEL* m_def, const CFrustum& F) { -#ifndef NO_XRC_STATS - Device.Statistic->clFRUSTUM.Begin(); -#endif - CL.frustum_query(m_def,F); -#ifndef NO_XRC_STATS - Device.Statistic->clFRUSTUM.End (); -#endif + collider()->frustum_query(m_def, F); } - IC CDB::RESULT* r_begin () { return CL.r_begin(); }; - IC CDB::RESULT* r_end () { return CL.r_end(); }; - IC void r_free () { CL.r_free(); } - IC int r_count () { return CL.r_count(); }; - IC void r_clear () { CL.r_clear(); }; + IC CDB::RESULT* r_begin() { return collider()->r_begin(); }; + IC CDB::RESULT* r_end() { return collider()->r_end(); }; + IC void r_free() { collider()->r_free(); } + IC int r_count() { return collider()->r_count(); }; + IC void r_clear() { collider()->r_clear(); }; }; -ENGINE_API extern xrXRC XRC; -#endif // !defined(AFX_XRXRC_H__9AA25268_621F_4FCA_BD75_AF2E9822B8E3__INCLUDED_) +ENGINE_API extern xrXRC XRC; \ No newline at end of file diff --git a/src/xrEngine/Environment_render.cpp b/src/xrEngine/Environment_render.cpp index a7efc8f7f2..833a6aeb19 100644 --- a/src/xrEngine/Environment_render.cpp +++ b/src/xrEngine/Environment_render.cpp @@ -197,7 +197,7 @@ void CEnvironment::RenderClouds () void CEnvironment::RenderFlares() { - if (0 == g_pGameLevel) + if (0 == g_pGameLevel && !Device.IsEditorMode()) return; // 1