/* * This file is part of the AzerothCore 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 Affero General Public License as published by the * Free Software Foundation; either version 3 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 Affero 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 #include #include #include #include "vec3d.h" #include "loadlib/loadlib.h" // MOPY flags enum MopyFlags { WHO_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 WMOMgr; class MPQFile; 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(const Vec3D& v) { return Vec3D(v.z, v.x, v.y); } struct WMODoodadData { std::vector Sets; std::unique_ptr Paths; 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, flags; float bbcorn1[3]; float bbcorn2[3]; WMODoodadData DoodadData; std::unordered_set ValidDoodadNames; 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 char* MOPY; uint16* MOVI; uint16* MoviEx; 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; int mopy_size, 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(); bool open(WMORoot* rootWMO); int ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData); uint32 GetLiquidTypeId(uint32 liquidTypeId); }; namespace MapObject { void Extract(ADT::MODF const& mapObjDef, char const* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE* pDirfile); } #endif