42 #include "imgui_internal.h"
49 void GfxScene::CreateDustPools()
52 m_dustpools[
"dust"] =
new DustPool(m_scene_manager,
"tracks/Dust", 20);
53 m_dustpools[
"clump"] =
new DustPool(m_scene_manager,
"tracks/Clump", 20);
54 m_dustpools[
"sparks"] =
new DustPool(m_scene_manager,
"tracks/Sparks", 10);
55 m_dustpools[
"drip"] =
new DustPool(m_scene_manager,
"tracks/Drip", 50);
56 m_dustpools[
"splash"] =
new DustPool(m_scene_manager,
"tracks/Splash", 20);
57 m_dustpools[
"ripple"] =
new DustPool(m_scene_manager,
"tracks/Ripple", 20);
60 void GfxScene::ClearScene()
63 for (
auto itor : m_dustpools)
65 itor.second->Discard(m_scene_manager);
71 m_all_gfx_actors.clear();
72 m_all_gfx_characters.clear();
75 m_scene_manager->clearScene();
87 m_skidmark_conf.LoadDefaultSkidmarkDefs();
90 void GfxScene::UpdateScene(
float dt)
96 for (
GfxActor* gfx_actor: m_live_gfx_actors)
98 gfx_actor->UpdateFlexbodies();
99 gfx_actor->UpdateWheelVisuals();
103 GfxActor* player_gfx_actor =
nullptr;
104 if (m_simbuf.simbuf_player_actor !=
nullptr)
106 player_gfx_actor = m_simbuf.simbuf_player_actor->GetGfxActor();
110 if (m_simbuf.simbuf_camera_behavior != CameraManager::CAMERA_BEHAVIOR_STATIC)
112 float fov = (m_simbuf.simbuf_camera_behavior == CameraManager::CAMERA_BEHAVIOR_VEHICLE_CINECAM)
121 for (
GfxActor* gfx_actor: m_all_gfx_actors)
123 float dt_actor = (!gfx_actor->GetSimDataBuffer().simbuf_physics_paused) ? dt : 0.f;
124 gfx_actor->UpdateParticles(dt_actor);
128 for (
auto itor : m_dustpools)
130 itor.second->update();
136 if (player_gfx_actor !=
nullptr)
152 if (player_gfx_actor !=
nullptr)
168 sky->DetectSkyUpdate();
173 if (skyx_man !=
nullptr)
179 if (m_simbuf.simbuf_race_in_progress != m_simbuf.simbuf_race_in_progress_prev)
181 if (m_simbuf.simbuf_race_in_progress)
190 if (m_simbuf.simbuf_race_in_progress)
196 if (m_simbuf.simbuf_player_actor)
202 for (
GfxActor* gfx_actor: m_all_gfx_actors)
204 gfx_actor->UpdateNetLabels(dt);
210 a->UpdateCharacterInScene();
214 for (
GfxActor* gfx_actor: m_all_gfx_actors)
216 float dt_actor = (!gfx_actor->GetSimDataBuffer().simbuf_physics_paused) ? dt : 0.f;
217 if (gfx_actor->IsActorLive())
219 gfx_actor->UpdateRods();
220 gfx_actor->UpdateCabMesh();
221 gfx_actor->UpdateWingMeshes();
222 gfx_actor->UpdateAirbrakes();
223 gfx_actor->UpdateCParticles();
224 gfx_actor->UpdateExhausts();
225 gfx_actor->UpdateAeroEngines();
226 gfx_actor->UpdatePropAnimations(dt_actor);
227 gfx_actor->UpdateRenderdashRTT();
230 gfx_actor->UpdateProps(dt_actor, (gfx_actor == player_gfx_actor));
232 gfx_actor->UpdateFlares(dt_actor, (gfx_actor == player_gfx_actor));
234 if (player_gfx_actor !=
nullptr)
240 if (m_simbuf.simbuf_player_actor->ar_driveable ==
TRUCK && m_simbuf.simbuf_player_actor->ar_engine !=
nullptr)
244 else if (m_simbuf.simbuf_player_actor->ar_driveable ==
AIRPLANE)
255 for (
GfxActor* gfx_actor: m_live_gfx_actors)
257 gfx_actor->FinishWheelUpdates();
258 gfx_actor->FinishFlexbodyTasks();
262 void GfxScene::SetParticlesVisible(
bool visible)
264 for (
auto itor : m_dustpools)
266 itor.second->setVisible(visible);
272 auto found = m_dustpools.find(name);
273 if (found != m_dustpools.end())
275 return found->second;
285 m_all_gfx_actors.push_back(gfx_actor);
288 void GfxScene::BufferSimulationData()
300 m_simbuf.simbuf_race_in_progress_prev = m_simbuf.simbuf_race_in_progress;
306 m_live_gfx_actors.clear();
309 if (a->IsActorLive() || !a->IsActorInitialized())
311 a->UpdateSimDataBuffer();
312 m_live_gfx_actors.push_back(a);
313 a->InitializeActor();
319 a->BufferSimulationData();
325 auto itor = std::remove(m_all_gfx_actors.begin(), m_all_gfx_actors.end(), remove_me);
326 if (itor != m_all_gfx_actors.end())
328 m_all_gfx_actors.erase(itor, m_all_gfx_actors.end());
355 m_all_gfx_characters.push_back(gfx_character);
360 auto itor = std::remove(m_all_gfx_characters.begin(), m_all_gfx_characters.end(), remove_me);
361 if (itor != m_all_gfx_characters.end())
363 m_all_gfx_characters.erase(itor, m_all_gfx_characters.end());
367 void GfxScene::DrawNetLabel(Ogre::Vector3 scene_pos,
float cam_dist, std::string
const& nick,
int colornum)
372 float font_size = std::max(0.6, cam_dist / 40.0);
377 nick +
" (" +
TOSTRING((
float)(ceil(cam_dist / 100) / 10.0) ) +
" km)";
379 else if (cam_dist > 20)
382 nick +
" (" +
TOSTRING((
int)cam_dist) +
" m)";
391 ImVec2 screen_size = ImGui::GetIO().DisplaySize;
395 Ogre::Vector3 pos_xyz = world2screen.
Convert(scene_pos);
401 ImVec2 pos((
int)pos_xyz.x+0.5, (
int)pos_xyz.y+0.5);
403 ImVec2 text_size = ImGui::CalcTextSize(caption.c_str());
407 ImGuiContext* g = ImGui::GetCurrentContext();
409 ImVec2 text_pos(pos.x - ((text_size.x / 2)), pos.y - ((text_size.y / 2)));
412 const float PADDING = 4.f;
413 drawlist->AddRectFilled(
414 text_pos - ImVec2(PADDING, PADDING),
415 text_pos + text_size + ImVec2(PADDING, PADDING),
417 ImGui::GetStyle().WindowRounding);
421 ImVec4 text_color(color.r, color.g, color.b, 1.f);
422 drawlist->AddText(g->Font, g->FontSize, text_pos, ImColor(text_color), caption.c_str());
425 #endif // USE_SOCKETW
428 void GfxScene::AdjustParticleSystemTimeFactor(Ogre::ParticleSystem* psys)
430 float speed_factor = 0.f;
433 speed_factor = m_simbuf.simbuf_sim_speed;
436 psys->setSpeedFactor(speed_factor);