Elevate Engine 1
Loading...
Searching...
No Matches
WwiseFileDataSource.cpp
Go to the documentation of this file.
2
5
6#include <array>
7#include <format>
8#include <memory>
9#include <string>
10#include <string_view>
11#include <filesystem>
12
13#include <rapidxml.hpp>
14#include <flxml/utils.h>
15#include <flxml/wrappers.h>
16
17#define WWISE_WORKUNIT_EXTENSION ".wwu"
18
19namespace fs = std::filesystem;
20
21namespace Elevate
22{
24 {
25 EE_CORE_INFO("Getting Wwise Project Info from Files...");
26
27 m_treeRoot.reset(new WwiseItem());
29 m_treeRoot->IsOnDisk = true;
30
31 fs::path basePath = m_projectPath;
32 if (!fs::is_directory(basePath))
33 {
34 EE_CORE_ERROR("ERROR (WwiseFileDataSource::RefreshSource() : The provided project path is not a valid directory : {}", basePath.string());
35 }
36
37 for (const auto& entry : fs::directory_iterator(basePath))
38 {
39 ProcessRootFolder(entry);
40 }
41
42 EE_CORE_TRACE("Wwise Project File Analysed.");
43 }
44
45 void WwiseFileDataSource::ProcessRootFolder(const std::filesystem::path& rootFolder)
46 {
47 // todo avoid checking useless folders like cache and others
48 if (!fs::is_directory(rootFolder) || !IsValidDirectory(rootFolder.stem().string()))
49 {
50 return; // We do not have a directory
51 }
52
53 WwiseItemPtr folderItem = WwiseItem::Create();
54 folderItem->Name = rootFolder.filename().string();
55 folderItem->Type = WwiseType::RootDirectory;
56 folderItem->IsOnDisk = true;
57 m_treeRoot->AddChildren(folderItem);
58
59 for (const auto& entry : fs::directory_iterator(rootFolder))
60 {
61 ProcessWorkUnit(folderItem, entry);
62 }
63 }
64
65 void WwiseFileDataSource::ProcessWorkUnit(WwiseItemPtr parent, const std::filesystem::path& workUnitPath)
66 {
67 if (workUnitPath.extension() != WWISE_WORKUNIT_EXTENSION)
68 {
69 return;
70 }
71
72 rapidxml::
73 file<> workUnitFile(workUnitPath.string().c_str());
74 flxml::xml_document<> doc;
75 doc.parse<0>(workUnitFile.data());
76
77 // Get the second node as the first one is the xml
78 // todo check the document type to check if really workunit
79 auto optDocNode = doc.first_node();
80 if (!optDocNode) return;
81 flxml::xml_node<char>* docNode = optDocNode.get();
82
83 auto optTypeNode = docNode->first_node();
84 if (!optTypeNode) return;
85 flxml::xml_node<char>* typeNode = optTypeNode.get();
86
87 auto optWorkUnitNode = typeNode->first_node();
88 if (!optWorkUnitNode) return;
89 flxml::xml_node<char>* workUnitNode = optWorkUnitNode.get();
90
91 auto optIdAttr = workUnitNode->first_attribute("ID");
92
93 WwiseItemPtr workUnitItem = WwiseItem::Create();
94 workUnitItem->Name = workUnitPath.stem().string();
95 workUnitItem->Type = WwiseType::WorkUnit;
96 workUnitItem->IsOnDisk = true;
97
98 if (optIdAttr)
99 {
100 workUnitItem->GUID = optIdAttr.get()->value();
101 }
102
103 parent->AddChildren(workUnitItem);
104
105 auto optChildrenListNode = workUnitNode->first_node();
106 if (optWorkUnitNode)
107 {
108 for (auto child = optWorkUnitNode->first_node(); child; child = child->next_sibling())
109 {
110 if (child)
111 {
112 ProcessNode(workUnitItem, child.get());
113 }
114 }
115 }
116
117 doc.clear();
118 }
119
120 void Elevate::WwiseFileDataSource::ProcessNode(WwiseItemPtr parent, rapidxml::xml_node<char>* node)
121 {
122 WwiseType type = GetTypeFromName(std::string(node->name()));
123
124 WwiseItemPtr item = nullptr;
125 switch (type)
126 {
127 case WwiseType::Bus:
128 item = ProcessBus(parent, node);
129 break;
131 item = ProcessAuxBus(parent, node);
132 break;
133 case WwiseType::Event:
134 item = ProcessEvent(parent, node);
135 break;
137 item = ProcessSoundBank(parent, node);
138 break;
140 item = ProcessStateGroup(parent, node);
141 break;
142 case WwiseType::State:
143 item = ProcessState(parent, node);
144 break;
146 item = ProcessSwitchGroup(parent, node);
147 break;
149 item = ProcessSwitch(parent, node);
150 break;
151 default:
152 return;
153 }
154
155 if (item)
156 {
157 item->IsOnDisk = true;
158
159 auto optName = node->first_attribute("Name");
160 auto optId = node->first_attribute("ID");
161 auto optShortId = node->first_attribute("ShortID");
162
163 if (optName)
164 {
165 item->Name = optName->value();
166 }
167 if (optId)
168 {
169 item->GUID = optId->value();
170 }
171 if (optShortId)
172 {
173 item->ShortID = std::stoi(std::string(optShortId->value()));
174 }
175 parent->AddChildren(item);
176
177 if (item->IsDirectory())
178 {
179 auto optChildrenList = node->first_node("ChildrenList");
180 if (optChildrenList)
181 {
182 ProcessNode(item, optChildrenList.get());
183 }
184 }
185 }
186 }
187
188 WwiseItemPtr WwiseFileDataSource::ProcessBus(WwiseItemPtr parent, flxml::xml_node<>* node)
189 {
190 return WwiseBus::Create();
191 }
192
193 WwiseItemPtr WwiseFileDataSource::ProcessAuxBus(WwiseItemPtr parent, flxml::xml_node<>* node)
194 {
195 return WwiseAuxBus::Create();
196 }
197
198 WwiseItemPtr WwiseFileDataSource::ProcessEvent(WwiseItemPtr parent, flxml::xml_node<>* node)
199 {
200 return WwiseEvent::Create();
201 }
202
203 WwiseItemPtr WwiseFileDataSource::ProcessSoundBank(WwiseItemPtr parent, flxml::xml_node<>* node)
204 {
205 return WwiseSoundbank::Create();
206 }
207
208 WwiseItemPtr WwiseFileDataSource::ProcessStateGroup(WwiseItemPtr parent, flxml::xml_node<>* node)
209 {
211 }
212
213 WwiseItemPtr WwiseFileDataSource::ProcessState(WwiseItemPtr parent, flxml::xml_node<>* node)
214 {
215 return WwiseState::Create();
216 }
217
218 WwiseItemPtr WwiseFileDataSource::ProcessSwitchGroup(WwiseItemPtr parent, flxml::xml_node<>* node)
219 {
221 }
222
223 WwiseItemPtr WwiseFileDataSource::ProcessSwitch(WwiseItemPtr parent, flxml::xml_node<>* node)
224 {
225 return WwiseSwitch::Create();
226 }
227
228 bool WwiseFileDataSource::IsValidDirectory(std::string directoryName)
229 {
230 constexpr std::array<std::string_view, 6> validDirectories = {
231 "Busses", "Events", "SoundBanks", "States", "Switches"
232 };
233
234 for (const auto& name : validDirectories)
235 {
236 if (name == directoryName)
237 {
238 return true;
239 }
240 }
241 return false;
242 }
243
244 WwiseType WwiseFileDataSource::GetTypeFromName(std::string name)
245 {
246 if (name == "Bus") return WwiseType::Bus;
247 if (name == "AuxBus") return WwiseType::AuxBus;
248 else if (name == "SoundBank") return WwiseType::SoundBank;
249 else if (name == "WorkUnit") return WwiseType::WorkUnit;
250 else if (name == "AudioDevice") return WwiseType::AudioDevice;
251 else if (name == "Event") return WwiseType::Event;
252 else if (name == "SwitchGroup") return WwiseType::SwitchGroup;
253 else if (name == "Switch") return WwiseType::Switch;
254 else if (name == "StateGroup") return WwiseType::StateGroup;
255 else if (name == "State") return WwiseType::State;
256 else if (name == "GameParameter") return WwiseType::GameParameter;
257 else if (name == "Effect") return WwiseType::Effect;
258 else if (name == "Trigger") return WwiseType::Trigger;
259 else if (name == "Folder") return WwiseType::VirtualFolder;
260 else return WwiseType::Unknown;
261 }
262
267}
#define WWISE_WORKUNIT_EXTENSION
WwiseType
Definition WwiseItem.h:10
WwiseItemPtr ProcessSwitch(WwiseItemPtr parent, flxml::xml_node< char > *node)
void ProcessWorkUnit(WwiseItemPtr parent, const std::filesystem::path &workUnitPath)
bool IsValidDirectory(std::string directoryName)
virtual void RefreshSource() override
WwiseItemPtr ProcessSwitchGroup(WwiseItemPtr parent, flxml::xml_node< char > *node)
WwiseItemPtr ProcessEvent(WwiseItemPtr parent, flxml::xml_node< char > *node)
void ProcessRootFolder(const std::filesystem::path &rootFolder)
WwiseItemPtr ProcessSoundBank(WwiseItemPtr parent, flxml::xml_node< char > *node)
WwiseItemPtr ProcessStateGroup(WwiseItemPtr parent, flxml::xml_node< char > *node)
virtual void InitializeSource() override
WwiseItemPtr ProcessAuxBus(WwiseItemPtr parent, flxml::xml_node< char > *node)
void ProcessNode(WwiseItemPtr parent, flxml::xml_node< char > *node)
WwiseItemPtr ProcessState(WwiseItemPtr parent, flxml::xml_node< char > *node)
WwiseItemPtr ProcessBus(WwiseItemPtr parent, flxml::xml_node< char > *node)
std::shared_ptr< WwiseItem > m_treeRoot
static WwiseAuxBusPtr Create()
Definition WwiseItem.h:180
static WwiseBusPtr Create()
Definition WwiseItem.h:169
static WwiseEventPtr Create()
Definition WwiseItem.h:95
static WwiseItemPtr Create()
Definition WwiseItem.cpp:3
static WwiseSoundbankPtr Create()
Definition WwiseItem.h:78
static WwiseStateGroupPtr Create()
Definition WwiseItem.h:130
static WwiseStatePtr Create()
Definition WwiseItem.h:143
static WwiseSwitchGroupPtr Create()
Definition WwiseItem.h:106
static WwiseSwitchPtr Create()
Definition WwiseItem.h:119