#pragma once
#include <map>
#include <vector>
#include <whiteout/models/m3/structures.h>
#include <whiteout/models/wem/converters.h>
#include <whiteout/models/wem/diagnostics.h>
#include <whiteout/models/wem/document.h>
#include <whiteout/models/wem/profile.h>
namespace whiteout {
namespace models {
namespace wem {
namespace m3_anim {
struct NodeBases {
u32 bone = 0;
u32 attachment = 0;
u32 light = 0;
u32 camera = 0;
static NodeBases Of(const m3::Model& source);
};
struct Context {
ProfileId profile = ProfileId::Sc2;
NodeBases bases;
std::vector<std::vector<u32>> layerOrdinals;
};
void Import(const m3::Model& source, const Context& context, Document& document, u32 model,
Diagnostics& out);
struct ExportContext {
enum class Slot : u8 { None = 0, Bone, Attachment, Light, Camera };
struct NodeSlot {
Slot slot = Slot::None;
u32 index = 0;
};
ProfileId profile = ProfileId::Sc2;
std::vector<NodeSlot> nodeSlots;
std::vector<u32> nodeBone;
std::vector<u32> nodeVisBone;
std::map<u32 , u32 > sectionGateBones;
std::map<u32 , std::vector<std::pair<u32 , u8 >>>
sectionAlphaLayers;
std::map<u32 , std::vector<std::pair<u32 , u8 >>>
sectionColorLayers;
std::map<u32 , std::vector<u32 >> materialClones;
std::map<u32 , u32 > coverageSwitches;
std::vector<std::vector<u32>> materialOrdinals;
};
void SolveBoneAnimFlags(m3::Model& out);
void Export(const Document& document, u32 model, const ExportContext& context, m3::Model& out,
Diagnostics& diagnostics, M3ExportMap* map = nullptr);
u32 Merge(const m3::Model& external, Document& document, u32 model, Diagnostics& out);
} } } }