13#include <rapidxml.hpp>
14#include <flxml/utils.h>
15#include <flxml/wrappers.h>
17#define WWISE_WORKUNIT_EXTENSION ".wwu"
19namespace fs = std::filesystem;
25 EE_CORE_INFO(
"Getting Wwise Project Info from Files...");
31 fs::path basePath = m_projectPath;
32 if (!fs::is_directory(basePath))
34 EE_CORE_ERROR(
"ERROR (WwiseFileDataSource::RefreshSource() : The provided project path is not a valid directory : {}", basePath.string());
37 for (
const auto& entry : fs::directory_iterator(basePath))
42 EE_CORE_TRACE(
"Wwise Project File Analysed.");
48 if (!fs::is_directory(rootFolder) || !
IsValidDirectory(rootFolder.stem().string()))
54 folderItem->Name = rootFolder.filename().string();
56 folderItem->IsOnDisk =
true;
59 for (
const auto& entry : fs::directory_iterator(rootFolder))
73 file<> workUnitFile(workUnitPath.string().c_str());
74 flxml::xml_document<> doc;
75 doc.parse<0>(workUnitFile.data());
79 auto optDocNode = doc.first_node();
80 if (!optDocNode)
return;
83 auto optTypeNode = docNode->first_node();
84 if (!optTypeNode)
return;
87 auto optWorkUnitNode = typeNode->first_node();
88 if (!optWorkUnitNode)
return;
91 auto optIdAttr = workUnitNode->first_attribute(
"ID");
94 workUnitItem->Name = workUnitPath.stem().string();
96 workUnitItem->IsOnDisk =
true;
100 workUnitItem->GUID = optIdAttr.get()->value();
103 parent->AddChildren(workUnitItem);
105 auto optChildrenListNode = workUnitNode->first_node();
108 for (
auto child = optWorkUnitNode->first_node(); child; child = child->next_sibling())
122 WwiseType type = GetTypeFromName(std::string(node->name()));
124 WwiseItemPtr item =
nullptr;
128 item = ProcessBus(parent, node);
131 item = ProcessAuxBus(parent, node);
134 item = ProcessEvent(parent, node);
137 item = ProcessSoundBank(parent, node);
140 item = ProcessStateGroup(parent, node);
143 item = ProcessState(parent, node);
146 item = ProcessSwitchGroup(parent, node);
149 item = ProcessSwitch(parent, node);
157 item->IsOnDisk =
true;
159 auto optName = node->first_attribute(
"Name");
160 auto optId = node->first_attribute(
"ID");
161 auto optShortId = node->first_attribute(
"ShortID");
165 item->Name = optName->value();
169 item->GUID = optId->value();
173 item->ShortID = std::stoi(std::string(optShortId->value()));
175 parent->AddChildren(item);
177 if (item->IsDirectory())
179 auto optChildrenList = node->first_node(
"ChildrenList");
182 ProcessNode(item, optChildrenList.get());
230 constexpr std::array<std::string_view, 6> validDirectories = {
231 "Busses",
"Events",
"SoundBanks",
"States",
"Switches"
234 for (
const auto& name : validDirectories)
236 if (name == directoryName)
244 WwiseType WwiseFileDataSource::GetTypeFromName(std::string name)
#define WWISE_WORKUNIT_EXTENSION
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()
static WwiseBusPtr Create()
static WwiseEventPtr Create()
static WwiseItemPtr Create()
static WwiseSoundbankPtr Create()
static WwiseStateGroupPtr Create()
static WwiseStatePtr Create()
static WwiseSwitchGroupPtr Create()
static WwiseSwitchPtr Create()