/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef WMO_H
#define WMO_H
#include "vec3d.h"
#include
#include
#include
#include
// MOPY flags
enum MopyFlags
{
WMO_MATERIAL_UNK01 = 0x01,
WMO_MATERIAL_NOCAMCOLLIDE = 0x02,
WMO_MATERIAL_DETAIL = 0x04,
WMO_MATERIAL_COLLISION = 0x08,
WMO_MATERIAL_HINT = 0x10,
WMO_MATERIAL_RENDER = 0x20,
WMO_MATERIAL_WALL_SURFACE = 0x40, // Guessed
WMO_MATERIAL_COLLIDE_HIT = 0x80
};
class WMOInstance;
class WMOManager;
class CASCFile;
struct ADTOutputCache;
namespace ADT { struct MODF; }
namespace WMO
{
struct MODS
{
char Name[20];
uint32 StartIndex; // index of first doodad instance in this set
uint32 Count; // number of doodad instances in this set
char _pad[4];
};
struct MODD
{
uint32 NameIndex : 24;
Vec3D Position;
Quaternion Rotation;
float Scale;
uint32 Color;
};
}
/* for whatever reason a certain company just can't stick to one coordinate system... */
static inline Vec3D fixCoords(Vec3D const& v){ return Vec3D(v.z, v.x, v.y); }
struct WMODoodadData
{
std::vector Sets;
std::unique_ptr Paths;
std::unique_ptr FileDataIds;
std::vector Spawns;
std::unordered_set References;
};
class WMORoot
{
private:
std::string filename;
public:
unsigned int color;
uint32 nTextures, nGroups, nPortals, nLights, nDoodadNames, nDoodadDefs, nDoodadSets, RootWMOID;
float bbcorn1[3];
float bbcorn2[3];
uint16 flags, numLod;
std::vector GroupNames;
WMODoodadData DoodadData;
std::unordered_set ValidDoodadNames;
std::vector groupFileDataIDs;
WMORoot(std::string const& filename);
bool open();
bool ConvertToVMAPRootWmo(FILE* output);
};
#pragma pack(push, 1)
struct WMOLiquidHeader
{
int xverts, yverts, xtiles, ytiles;
float pos_x;
float pos_y;
float pos_z;
short material;
};
struct WMOLiquidVert
{
uint16 unk1;
uint16 unk2;
float height;
};
#pragma pack(pop)
class WMOGroup
{
private:
std::string filename;
public:
// MOGP
std::unique_ptr MPY2;
std::unique_ptr MOVX;
float* MOVT;
uint16* MOBA;
int* MobaEx;
WMOLiquidHeader* hlq;
WMOLiquidVert* LiquEx;
char* LiquBytes;
int groupName, descGroupName;
int mogpFlags;
float bbcorn1[3];
float bbcorn2[3];
uint16 moprIdx;
uint16 moprNItems;
uint16 nBatchA;
uint16 nBatchB;
uint32 nBatchC, fogIdx, groupLiquid, groupWMOID;
uint32 mogpFlags2;
int16 parentOrFirstChildSplitGroupIndex;
int16 nextSplitChildGroupIndex;
int moba_size;
int LiquEx_size;
unsigned int nVertices; // number when loaded
int nTriangles; // number when loaded
uint32 liquflags;
std::vector DoodadReferences;
WMOGroup(std::string const& filename);
WMOGroup(WMOGroup&&) = default;
WMOGroup& operator=(WMOGroup&&) = default;
~WMOGroup();
bool open(WMORoot* rootWMO);
int ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData);
uint32 GetLiquidTypeId(uint32 liquidTypeId);
bool ShouldSkip(WMORoot const* root) const;
};
namespace MapObject
{
void Extract(ADT::MODF const& mapObjDef, char const* WmoInstName, bool isGlobalWmo, uint32 mapID, uint32 originalMapId,
FILE* pDirfile, std::vector* dirfileCache);
}
#endif