IVSmoke 1.0
Loading...
Searching...
No Matches
IVSmoke.cpp
1// Copyright (c) 2026, Team SDB. All rights reserved.
2
3#include "IVSmoke.h"
4#include "IVSmokeSceneViewExtension.h"
5#include "IVSmokeSettings.h"
6#include "IVSmokeVisualMaterialPreset.h"
7#include "IVSmokeVoxelVolume.h"
8#include "EngineUtils.h"
9#include "Interfaces/IPluginManager.h"
10#include "Materials/MaterialInterface.h"
11#include "Misc/CoreDelegates.h"
12#include "Misc/Paths.h"
13#include "Stats/Stats.h"
14
15#if WITH_EDITOR
16#include "Editor.h"
17#endif
18
19DEFINE_LOG_CATEGORY(LogIVSmoke);
20
21#define LOCTEXT_NAMESPACE "FIVSmokeModule"
22
24{
25 FString PluginShaderDir = FPaths::Combine(
26 IPluginManager::Get().FindPlugin(TEXT("IVSmoke"))->GetBaseDir(),
27 TEXT("Shaders")
28 );
29 AddShaderSourceDirectoryMapping(TEXT("/Plugin/IVSmoke"), PluginShaderDir);
30
31#if !UE_SERVER
32 // SceneViewExtension requires GEngine, defer until engine is ready
33 // Skip during commandlets (cooking/packaging) - RHI may not be fully initialized
34 if (!IsRunningCommandlet())
35 {
36 UE_LOG(LogIVSmoke, Log, TEXT("[FIVSmokeModule::StartupModule] Registering OnPostEngineInit"));
37 FCoreDelegates::OnPostEngineInit.AddLambda([]()
38 {
39 UE_LOG(LogIVSmoke, Log, TEXT("[FIVSmokeModule::StartupModule] OnPostEngineInit fired"));
40
41 // Preload Visual Material Preset and ensure shader compilation
42 if (const UIVSmokeSettings* Settings = UIVSmokeSettings::Get())
43 {
44 if (UIVSmokeVisualMaterialPreset* Preset = Settings->GetVisualMaterialPreset())
45 {
46 if (UMaterialInterface* Mat = Preset->SmokeVisualMaterial.Get())
47 {
48 Mat->EnsureIsComplete();
49 UE_LOG(LogIVSmoke, Log, TEXT("[FIVSmokeModule::StartupModule] Visual Material preloaded"));
50 }
51 }
52 }
53
55 });
56 }
57#endif
58
59#if WITH_EDITOR
60 // Lock IVSmokeVoxelVolume actors during PIE to prevent World Partition errors
61 FEditorDelegates::PreBeginPIE.AddLambda([](bool bIsSimulating)
62 {
63 if (GEditor)
64 {
65 if (UWorld* EditorWorld = GEditor->GetEditorWorldContext().World())
66 {
67 for (TActorIterator<AIVSmokeVoxelVolume> It(EditorWorld); It; ++It)
68 {
69 It->SetLockLocation(true);
70 }
71 }
72 // Invalidate cached lock state so HasLockedActors() rechecks
73 GEditor->bCheckForLockActors = true;
74 }
75 });
76
77 FEditorDelegates::EndPIE.AddLambda([](bool bIsSimulating)
78 {
79 if (GEditor)
80 {
81 if (UWorld* EditorWorld = GEditor->GetEditorWorldContext().World())
82 {
83 for (TActorIterator<AIVSmokeVoxelVolume> It(EditorWorld); It; ++It)
84 {
85 It->SetLockLocation(false);
86 }
87 }
88 // Invalidate cached lock state
89 GEditor->bCheckForLockActors = true;
90 }
91 });
92#endif
93}
94
95void FIVSmokeModule::ShutdownModule()
96{
97#if !UE_SERVER
98 if (!IsRunningCommandlet())
99 {
101 }
102#endif
103}
104
105#undef LOCTEXT_NAMESPACE
106
107IMPLEMENT_MODULE(FIVSmokeModule, IVSmoke)
virtual void StartupModule() override
Definition IVSmoke.cpp:23
static const UIVSmokeSettings * Get()