mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 19:37:02 +00:00
[0139] Added new "vmapExtractor4" Thanks (Sys Xen, LordJz, Trinity).
NOTE: VC90 Project-Files need Update
Cmake need Update
Signed-off-by: Salja <salja2012@hotmail.de>
This commit is contained in:
parent
475b7a943e
commit
29c459982e
29 changed files with 3760 additions and 3 deletions
13
contrib/vmap_extractor_v4/.gitignore
vendored
Normal file
13
contrib/vmap_extractor_v4/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#
|
||||||
|
# NOTE! Don't add files that are generated in specific
|
||||||
|
# subdirectories here. Add them in the ".gitignore" file
|
||||||
|
# in that subdirectory instead.
|
||||||
|
#
|
||||||
|
# NOTE! Please use 'git-ls-files -i --exclude-standard'
|
||||||
|
# command after changing this file, to see if there are
|
||||||
|
# any tracked files which get ignored after the change.
|
||||||
|
#
|
||||||
|
# MaNGOS generated files at Windows build
|
||||||
|
#
|
||||||
|
|
||||||
|
bin
|
||||||
25
contrib/vmap_extractor_v4/CMakeLists.txt
Normal file
25
contrib/vmap_extractor_v4/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Copyright (C) 2005-2012 MaNGOS project <http://getmangos.com/>
|
||||||
|
#
|
||||||
|
# This file is free software; as a special exception the author gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
cmake_minimum_required (VERSION 2.6)
|
||||||
|
project (MANGOS_VMAP_EXTRACT_IO)
|
||||||
|
|
||||||
|
|
||||||
|
# uncomment next line to disable debug mode
|
||||||
|
ADD_DEFINITIONS("-DIOMAP_DEBUG")
|
||||||
|
# build setup currently only supports libmpq 0.4.x
|
||||||
|
ADD_DEFINITIONS("-DUSE_LIBMPQ04")
|
||||||
|
ADD_DEFINITIONS("-Wall")
|
||||||
|
ADD_DEFINITIONS("-ggdb")
|
||||||
|
ADD_DEFINITIONS("-O3")
|
||||||
|
|
||||||
|
include_directories(../../dep/libmpq)
|
||||||
|
|
||||||
|
add_subdirectory(vmapextract)
|
||||||
42
contrib/vmap_extractor_v4/README
Normal file
42
contrib/vmap_extractor_v4/README
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
Linux:
|
||||||
|
|
||||||
|
1. Building
|
||||||
|
|
||||||
|
Because vmap_extractor depends on libmpq for reading mpq files, you will have
|
||||||
|
to build libmpq prior to vmap_extractor. Therefore cd to dep/StormLib and execute:
|
||||||
|
|
||||||
|
$ ./autogen.sh
|
||||||
|
$ ./configure
|
||||||
|
$ make
|
||||||
|
|
||||||
|
After that, cd to contrib/vmap_extractor_v4/ and execute:
|
||||||
|
|
||||||
|
$ cmake .
|
||||||
|
$ make
|
||||||
|
|
||||||
|
You should now have an executable file at vmapextract/vmapextractor
|
||||||
|
|
||||||
|
2. Extracting
|
||||||
|
|
||||||
|
Use the created executable to extract model information. Change the data path if
|
||||||
|
needed.
|
||||||
|
|
||||||
|
$ vmapextract/vmapextractor -d /mnt/windows/games/wow/Data/
|
||||||
|
|
||||||
|
Resulting files will be in ./Buildings
|
||||||
|
|
||||||
|
###########################
|
||||||
|
Windows:
|
||||||
|
|
||||||
|
1. Building
|
||||||
|
|
||||||
|
Just build the solution in contrib\vmap_extractor_v2\win
|
||||||
|
Resulting binaries will be in contrib\vmap_extractor_v2\bin\$(PlatformName)_$(ConfigurationName)
|
||||||
|
|
||||||
|
2. Extracting
|
||||||
|
|
||||||
|
Use the created executable (from command prompt) to extract model information.
|
||||||
|
It should find the data path for your client installation through the windows registry,
|
||||||
|
but the data path can be specified with the -d option.
|
||||||
|
|
||||||
|
Resulting files will be in .\Buildings
|
||||||
46
contrib/vmap_extractor_v4/make_vmaps.bat
Normal file
46
contrib/vmap_extractor_v4/make_vmaps.bat
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
@echo off
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo Welcome to the vmaps extractor and assembler
|
||||||
|
echo.
|
||||||
|
echo You need 2GB of free space in disk, CTRL+C to stop process
|
||||||
|
echo Hit Enter to start . . .
|
||||||
|
pause>nul
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
IF EXIST buildings\dir (ECHO The buildings folder already exist do you want to delete it?
|
||||||
|
echo If YES hit Enter to continue if no CLOSE the program now! . . .
|
||||||
|
pause>nul
|
||||||
|
DEL /S /Q buildings)
|
||||||
|
vmapExtractor4.exe
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
IF NOT %ERRORLEVEL% LEQ 1 (echo The vmap extract tool finalized with errors.
|
||||||
|
echo Hit Enter to continue . . .
|
||||||
|
pause>nul)
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo Vmaps extracted check log.txt for errors, now it's time to assemble the vmaps press any key to continue . . .
|
||||||
|
pause>nul
|
||||||
|
md vmaps
|
||||||
|
vmap_assembler.exe buildings vmaps
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
IF NOT %ERRORLEVEL% LEQ 1 (echo The vmap assembler tool finalized with errors.
|
||||||
|
echo Hit Enter to continue . . .
|
||||||
|
pause>nul)
|
||||||
|
cls
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo.
|
||||||
|
echo Process done! copy vmaps folder to the MaNGOS main directory
|
||||||
|
echo Press any key to exit . . .
|
||||||
|
pause>nul
|
||||||
16
contrib/vmap_extractor_v4/vmapextract/CMakeLists.txt
Normal file
16
contrib/vmap_extractor_v4/vmapextract/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Copyright (C) 2005-2012 MaNGOS project <http://getmangos.com/>
|
||||||
|
#
|
||||||
|
# This file is free software; as a special exception the author gives
|
||||||
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
|
# modifications, as long as this notice is preserved.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||||
|
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
cmake_minimum_required (VERSION 2.6)
|
||||||
|
project (MANGOS_IOMAP_EXTRACTOR)
|
||||||
|
|
||||||
|
LINK_DIRECTORIES( ${LINK_DIRECTORIES} ../../../dep/libmpq/libmpq/.libs/ )
|
||||||
|
add_executable(vmapextractor adtfile.cpp dbcfile.cpp model.cpp mpq_libmpq.cpp vmapexport.cpp wdtfile.cpp wmo.cpp)
|
||||||
|
target_link_libraries(vmapextractor libmpq.a bz2 z)
|
||||||
222
contrib/vmap_extractor_v4/vmapextract/adtfile.cpp
Normal file
222
contrib/vmap_extractor_v4/vmapextract/adtfile.cpp
Normal file
|
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include "vmapexport.h"
|
||||||
|
#include "adtfile.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char * GetPlainName(const char * FileName)
|
||||||
|
{
|
||||||
|
const char * szTemp;
|
||||||
|
|
||||||
|
if((szTemp = strrchr(FileName, '\\')) != NULL)
|
||||||
|
FileName = szTemp + 1;
|
||||||
|
return FileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * GetPlainName(char * FileName)
|
||||||
|
{
|
||||||
|
char * szTemp;
|
||||||
|
|
||||||
|
if((szTemp = strrchr(FileName, '\\')) != NULL)
|
||||||
|
FileName = szTemp + 1;
|
||||||
|
return FileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fixnamen(char *name, size_t len)
|
||||||
|
{
|
||||||
|
for (size_t i=0; i<len-3; i++)
|
||||||
|
{
|
||||||
|
if (i>0 && name[i]>='A' && name[i]<='Z' && isalpha(name[i-1]))
|
||||||
|
{
|
||||||
|
name[i] |= 0x20;
|
||||||
|
} else if ((i==0 || !isalpha(name[i-1])) && name[i]>='a' && name[i]<='z')
|
||||||
|
{
|
||||||
|
name[i] &= ~0x20;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//extension in lowercase
|
||||||
|
for(size_t i=len-3; i<len; i++)
|
||||||
|
name[i] |= 0x20;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fixname2(char *name, size_t len)
|
||||||
|
{
|
||||||
|
for (size_t i=0; i<len-3; i++)
|
||||||
|
{
|
||||||
|
if(name[i] == ' ')
|
||||||
|
name[i] = '_';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char * GetExtension(char * FileName)
|
||||||
|
{
|
||||||
|
char * szTemp;
|
||||||
|
if((szTemp = strrchr(FileName, '.')) != NULL)
|
||||||
|
return szTemp;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern HANDLE WorldMpq;
|
||||||
|
|
||||||
|
ADTFile::ADTFile(char* filename): ADT(WorldMpq, filename)
|
||||||
|
{
|
||||||
|
Adtfilename.append(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY)
|
||||||
|
{
|
||||||
|
if(ADT.isEof ())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint32 size;
|
||||||
|
|
||||||
|
string xMap;
|
||||||
|
string yMap;
|
||||||
|
|
||||||
|
Adtfilename.erase(Adtfilename.find(".adt"),4);
|
||||||
|
string TempMapNumber;
|
||||||
|
TempMapNumber = Adtfilename.substr(Adtfilename.length()-6,6);
|
||||||
|
xMap = TempMapNumber.substr(TempMapNumber.find("_")+1,(TempMapNumber.find_last_of("_")-1) - (TempMapNumber.find("_")));
|
||||||
|
yMap = TempMapNumber.substr(TempMapNumber.find_last_of("_")+1,(TempMapNumber.length()) - (TempMapNumber.find_last_of("_")));
|
||||||
|
Adtfilename.erase((Adtfilename.length()-xMap.length()-yMap.length()-2), (xMap.length()+yMap.length()+2));
|
||||||
|
string AdtMapNumber = xMap + ' ' + yMap + ' ' + GetPlainName((char*)Adtfilename.c_str());
|
||||||
|
//printf("Processing map %s...\n", AdtMapNumber.c_str());
|
||||||
|
//printf("MapNumber = %s\n", TempMapNumber.c_str());
|
||||||
|
//printf("xMap = %s\n", xMap.c_str());
|
||||||
|
//printf("yMap = %s\n", yMap.c_str());
|
||||||
|
|
||||||
|
std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
|
||||||
|
FILE *dirfile;
|
||||||
|
dirfile = fopen(dirname.c_str(), "ab");
|
||||||
|
if(!dirfile)
|
||||||
|
{
|
||||||
|
printf("Can't open dirfile!'%s'\n", dirname.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!ADT.isEof())
|
||||||
|
{
|
||||||
|
char fourcc[5];
|
||||||
|
ADT.read(&fourcc,4);
|
||||||
|
ADT.read(&size, 4);
|
||||||
|
flipcc(fourcc);
|
||||||
|
fourcc[4] = 0;
|
||||||
|
|
||||||
|
size_t nextpos = ADT.getPos() + size;
|
||||||
|
|
||||||
|
if (!strcmp(fourcc,"MCIN"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MTEX"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MMDX"))
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
char *buf = new char[size];
|
||||||
|
ADT.read(buf, size);
|
||||||
|
char *p=buf;
|
||||||
|
int t=0;
|
||||||
|
ModelInstansName = new string[size];
|
||||||
|
while (p<buf+size)
|
||||||
|
{
|
||||||
|
fixnamen(p,strlen(p));
|
||||||
|
char* s = GetPlainName(p);
|
||||||
|
fixname2(s,strlen(s));
|
||||||
|
|
||||||
|
ModelInstansName[t++] = s;
|
||||||
|
|
||||||
|
string path(p);
|
||||||
|
|
||||||
|
p = p+strlen(p)+1;
|
||||||
|
}
|
||||||
|
delete[] buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MWMO"))
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
char *buf = new char[size];
|
||||||
|
ADT.read(buf, size);
|
||||||
|
char *p=buf;
|
||||||
|
int q = 0;
|
||||||
|
WmoInstansName = new string[size];
|
||||||
|
while (p<buf+size)
|
||||||
|
{
|
||||||
|
string path(p);
|
||||||
|
char* s=GetPlainName(p);
|
||||||
|
fixnamen(s,strlen(s));
|
||||||
|
fixname2(s,strlen(s));
|
||||||
|
p=p+strlen(p)+1;
|
||||||
|
WmoInstansName[q++] = s;
|
||||||
|
}
|
||||||
|
delete[] buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//======================
|
||||||
|
else if (!strcmp(fourcc,"MDDF"))
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
nMDX = (int)size / 36;
|
||||||
|
for (int i=0; i<nMDX; ++i)
|
||||||
|
{
|
||||||
|
uint32 id;
|
||||||
|
ADT.read(&id, 4);
|
||||||
|
ModelInstance inst(ADT,ModelInstansName[id].c_str(), map_num, tileX, tileY, dirfile);
|
||||||
|
}
|
||||||
|
delete[] ModelInstansName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MODF"))
|
||||||
|
{
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
nWMO = (int)size / 64;
|
||||||
|
for (int i=0; i<nWMO; ++i)
|
||||||
|
{
|
||||||
|
uint32 id;
|
||||||
|
ADT.read(&id, 4);
|
||||||
|
WMOInstance inst(ADT,WmoInstansName[id].c_str(), map_num, tileX, tileY, dirfile);
|
||||||
|
}
|
||||||
|
delete[] WmoInstansName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//======================
|
||||||
|
ADT.seek(nextpos);
|
||||||
|
}
|
||||||
|
ADT.close();
|
||||||
|
fclose(dirfile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADTFile::~ADTFile()
|
||||||
|
{
|
||||||
|
ADT.close();
|
||||||
|
}
|
||||||
143
contrib/vmap_extractor_v4/vmapextract/adtfile.h
Normal file
143
contrib/vmap_extractor_v4/vmapextract/adtfile.h
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ADT_H
|
||||||
|
#define ADT_H
|
||||||
|
|
||||||
|
#include "mpqfile.h"
|
||||||
|
#include "wmo.h"
|
||||||
|
#include "model.h"
|
||||||
|
|
||||||
|
#define TILESIZE (533.33333f)
|
||||||
|
#define CHUNKSIZE ((TILESIZE) / 16.0f)
|
||||||
|
#define UNITSIZE (CHUNKSIZE / 8.0f)
|
||||||
|
|
||||||
|
class Liquid;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
float z;
|
||||||
|
}svec;
|
||||||
|
|
||||||
|
struct vec
|
||||||
|
{
|
||||||
|
double x;
|
||||||
|
double y;
|
||||||
|
double z;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct triangle
|
||||||
|
{
|
||||||
|
vec v[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float v9[16*8+1][16*8+1];
|
||||||
|
float v8[16*8][16*8];
|
||||||
|
}Cell;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
double v9[9][9];
|
||||||
|
double v8[8][8];
|
||||||
|
uint16 area_id;
|
||||||
|
//Liquid *lq;
|
||||||
|
float waterlevel[9][9];
|
||||||
|
uint8 flag;
|
||||||
|
}chunk;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
chunk ch[16][16];
|
||||||
|
}mcell;
|
||||||
|
|
||||||
|
struct MapChunkHeader
|
||||||
|
{
|
||||||
|
uint32 flags;
|
||||||
|
uint32 ix;
|
||||||
|
uint32 iy;
|
||||||
|
uint32 nLayers;
|
||||||
|
uint32 nDoodadRefs;
|
||||||
|
uint32 ofsHeight;
|
||||||
|
uint32 ofsNormal;
|
||||||
|
uint32 ofsLayer;
|
||||||
|
uint32 ofsRefs;
|
||||||
|
uint32 ofsAlpha;
|
||||||
|
uint32 sizeAlpha;
|
||||||
|
uint32 ofsShadow;
|
||||||
|
uint32 sizeShadow;
|
||||||
|
uint32 areaid;
|
||||||
|
uint32 nMapObjRefs;
|
||||||
|
uint32 holes;
|
||||||
|
uint16 s1;
|
||||||
|
uint16 s2;
|
||||||
|
uint32 d1;
|
||||||
|
uint32 d2;
|
||||||
|
uint32 d3;
|
||||||
|
uint32 predTex;
|
||||||
|
uint32 nEffectDoodad;
|
||||||
|
uint32 ofsSndEmitters;
|
||||||
|
uint32 nSndEmitters;
|
||||||
|
uint32 ofsLiquid;
|
||||||
|
uint32 sizeLiquid;
|
||||||
|
float zpos;
|
||||||
|
float xpos;
|
||||||
|
float ypos;
|
||||||
|
uint32 textureId;
|
||||||
|
uint32 props;
|
||||||
|
uint32 effectId;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class ADTFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ADTFile(char* filename);
|
||||||
|
~ADTFile();
|
||||||
|
int nWMO;
|
||||||
|
int nMDX;
|
||||||
|
string* WmoInstansName;
|
||||||
|
string* ModelInstansName;
|
||||||
|
bool init(uint32 map_num, uint32 tileX, uint32 tileY);
|
||||||
|
//void LoadMapChunks();
|
||||||
|
|
||||||
|
//uint32 wmo_count;
|
||||||
|
/*
|
||||||
|
const mcell& Getmcell() const
|
||||||
|
{
|
||||||
|
return Mcell;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
private:
|
||||||
|
//size_t mcnk_offsets[256], mcnk_sizes[256];
|
||||||
|
MPQFile ADT;
|
||||||
|
//mcell Mcell;
|
||||||
|
string Adtfilename;
|
||||||
|
};
|
||||||
|
|
||||||
|
const char * GetPlainName(const char * FileName);
|
||||||
|
char * GetPlainName(char * FileName);
|
||||||
|
char * GetExtension(char * FileName);
|
||||||
|
void fixnamen(char *name, size_t len);
|
||||||
|
void fixname2(char *name, size_t len);
|
||||||
|
//void fixMapNamen(char *name, size_t len);
|
||||||
|
|
||||||
|
#endif
|
||||||
119
contrib/vmap_extractor_v4/vmapextract/dbcfile.cpp
Normal file
119
contrib/vmap_extractor_v4/vmapextract/dbcfile.cpp
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
|
||||||
|
#include "dbcfile.h"
|
||||||
|
|
||||||
|
DBCFile::DBCFile(HANDLE mpq, const char* filename) :
|
||||||
|
_mpq(mpq), _filename(filename), _file(NULL), _data(NULL), _stringTable(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DBCFile::open()
|
||||||
|
{
|
||||||
|
if (!SFileOpenFileEx(_mpq, _filename, SFILE_OPEN_PATCHED_FILE, &_file))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
char header[4];
|
||||||
|
unsigned int na, nb, es, ss;
|
||||||
|
|
||||||
|
DWORD readBytes = 0;
|
||||||
|
SFileReadFile(_file, header, 4, &readBytes, NULL);
|
||||||
|
if (readBytes != 4) // Number of records
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (header[0] != 'W' || header[1] != 'D' || header[2] != 'B' || header[3] != 'C')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
readBytes = 0;
|
||||||
|
SFileReadFile(_file, &na, 4, &readBytes, NULL);
|
||||||
|
if (readBytes != 4) // Number of records
|
||||||
|
return false;
|
||||||
|
|
||||||
|
readBytes = 0;
|
||||||
|
SFileReadFile(_file, &nb, 4, &readBytes, NULL);
|
||||||
|
if (readBytes != 4) // Number of fields
|
||||||
|
return false;
|
||||||
|
|
||||||
|
readBytes = 0;
|
||||||
|
SFileReadFile(_file, &es, 4, &readBytes, NULL);
|
||||||
|
if (readBytes != 4) // Size of a record
|
||||||
|
return false;
|
||||||
|
|
||||||
|
readBytes = 0;
|
||||||
|
SFileReadFile(_file, &ss, 4, &readBytes, NULL);
|
||||||
|
if (readBytes != 4) // String size
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_recordSize = es;
|
||||||
|
_recordCount = na;
|
||||||
|
_fieldCount = nb;
|
||||||
|
_stringSize = ss;
|
||||||
|
if (_fieldCount * 4 != _recordSize)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_data = new unsigned char[_recordSize * _recordCount + _stringSize];
|
||||||
|
_stringTable = _data + _recordSize*_recordCount;
|
||||||
|
|
||||||
|
size_t data_size = _recordSize * _recordCount + _stringSize;
|
||||||
|
readBytes = 0;
|
||||||
|
SFileReadFile(_file, _data, data_size, &readBytes, NULL);
|
||||||
|
if (readBytes != data_size)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCFile::~DBCFile()
|
||||||
|
{
|
||||||
|
delete [] _data;
|
||||||
|
if (_file != NULL)
|
||||||
|
SFileCloseFile(_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCFile::Record DBCFile::getRecord(size_t id)
|
||||||
|
{
|
||||||
|
assert(_data);
|
||||||
|
return Record(*this, _data + id*_recordSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t DBCFile::getMaxId()
|
||||||
|
{
|
||||||
|
assert(_data);
|
||||||
|
|
||||||
|
size_t maxId = 0;
|
||||||
|
for(size_t i = 0; i < getRecordCount(); ++i)
|
||||||
|
if (maxId < getRecord(i).getUInt(0))
|
||||||
|
maxId = getRecord(i).getUInt(0);
|
||||||
|
|
||||||
|
return maxId;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCFile::Iterator DBCFile::begin()
|
||||||
|
{
|
||||||
|
assert(_data);
|
||||||
|
return Iterator(*this, _data);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBCFile::Iterator DBCFile::end()
|
||||||
|
{
|
||||||
|
assert(_data);
|
||||||
|
return Iterator(*this, _stringTable);
|
||||||
|
}
|
||||||
|
|
||||||
145
contrib/vmap_extractor_v4/vmapextract/dbcfile.h
Normal file
145
contrib/vmap_extractor_v4/vmapextract/dbcfile.h
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DBCFILE_H
|
||||||
|
#define DBCFILE_H
|
||||||
|
#include <cassert>
|
||||||
|
#include <string>
|
||||||
|
#include "StormLib.h"
|
||||||
|
|
||||||
|
class DBCFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DBCFile(HANDLE mpq, const char* filename);
|
||||||
|
~DBCFile();
|
||||||
|
|
||||||
|
// Open database. It must be openened before it can be used.
|
||||||
|
bool open();
|
||||||
|
|
||||||
|
// Database exceptions
|
||||||
|
class Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Exception(const std::string &message) : message(message) { }
|
||||||
|
virtual ~Exception() { }
|
||||||
|
const std::string &getMessage() { return message; }
|
||||||
|
private:
|
||||||
|
std::string message;
|
||||||
|
};
|
||||||
|
|
||||||
|
class NotFound: public Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NotFound(): Exception("Key was not found") { }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Iteration over database
|
||||||
|
class Iterator;
|
||||||
|
class Record
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
float getFloat(size_t field) const
|
||||||
|
{
|
||||||
|
assert(field < file._fieldCount);
|
||||||
|
return *reinterpret_cast<float*>(offset+field*4);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int getUInt(size_t field) const
|
||||||
|
{
|
||||||
|
assert(field < file._fieldCount);
|
||||||
|
return *reinterpret_cast<unsigned int*>(offset+field*4);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getInt(size_t field) const
|
||||||
|
{
|
||||||
|
assert(field < file._fieldCount);
|
||||||
|
return *reinterpret_cast<int*>(offset+field*4);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *getString(size_t field) const
|
||||||
|
{
|
||||||
|
assert(field < file._fieldCount);
|
||||||
|
size_t stringOffset = getUInt(field);
|
||||||
|
assert(stringOffset < file._stringSize);
|
||||||
|
return reinterpret_cast<char*>(file._stringTable + stringOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {}
|
||||||
|
unsigned char *offset;
|
||||||
|
DBCFile &file;
|
||||||
|
|
||||||
|
friend class DBCFile;
|
||||||
|
friend class DBCFile::Iterator;
|
||||||
|
};
|
||||||
|
/** Iterator that iterates over records
|
||||||
|
*/
|
||||||
|
class Iterator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Iterator(DBCFile &file, unsigned char *offset) : record(file, offset) { }
|
||||||
|
|
||||||
|
/// Advance (prefix only)
|
||||||
|
Iterator & operator++()
|
||||||
|
{
|
||||||
|
record.offset += record.file._recordSize;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return address of current instance
|
||||||
|
Record const & operator*() const { return record; }
|
||||||
|
const Record* operator->() const { return &record; }
|
||||||
|
|
||||||
|
/// Comparison
|
||||||
|
bool operator==(const Iterator &b) const
|
||||||
|
{
|
||||||
|
return record.offset == b.record.offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const Iterator &b) const
|
||||||
|
{
|
||||||
|
return record.offset != b.record.offset;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
Record record;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get record by id
|
||||||
|
Record getRecord(size_t id);
|
||||||
|
/// Get begin iterator over records
|
||||||
|
Iterator begin();
|
||||||
|
/// Get begin iterator over records
|
||||||
|
Iterator end();
|
||||||
|
/// Trivial
|
||||||
|
size_t getRecordCount() const { return _recordCount; }
|
||||||
|
size_t getFieldCount() const { return _fieldCount; }
|
||||||
|
size_t getMaxId();
|
||||||
|
|
||||||
|
private:
|
||||||
|
HANDLE _mpq;
|
||||||
|
const char* _filename;
|
||||||
|
HANDLE _file;
|
||||||
|
size_t _recordSize;
|
||||||
|
size_t _recordCount;
|
||||||
|
size_t _fieldCount;
|
||||||
|
size_t _stringSize;
|
||||||
|
unsigned char *_data;
|
||||||
|
unsigned char* _stringTable;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
77
contrib/vmap_extractor_v4/vmapextract/loadlib/loadlib.h
Normal file
77
contrib/vmap_extractor_v4/vmapextract/loadlib/loadlib.h
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LOAD_LIB_H
|
||||||
|
#define LOAD_LIB_H
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
typedef __int64 int64;
|
||||||
|
typedef __int32 int32;
|
||||||
|
typedef __int16 int16;
|
||||||
|
typedef __int8 int8;
|
||||||
|
typedef unsigned __int64 uint64;
|
||||||
|
typedef unsigned __int32 uint32;
|
||||||
|
typedef unsigned __int16 uint16;
|
||||||
|
typedef unsigned __int8 uint8;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#ifndef uint64_t
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <linux/types.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
typedef int64_t int64;
|
||||||
|
typedef int32_t int32;
|
||||||
|
typedef int16_t int16;
|
||||||
|
typedef int8_t int8;
|
||||||
|
typedef uint64_t uint64;
|
||||||
|
typedef uint32_t uint32;
|
||||||
|
typedef uint16_t uint16;
|
||||||
|
typedef uint8_t uint8;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FILE_FORMAT_VERSION 18
|
||||||
|
|
||||||
|
//
|
||||||
|
// File version chunk
|
||||||
|
//
|
||||||
|
struct file_MVER
|
||||||
|
{
|
||||||
|
union{
|
||||||
|
uint32 fcc;
|
||||||
|
char fcc_txt[4];
|
||||||
|
};
|
||||||
|
uint32 size;
|
||||||
|
uint32 ver;
|
||||||
|
};
|
||||||
|
|
||||||
|
class FileLoader{
|
||||||
|
uint8 *data;
|
||||||
|
uint32 data_size;
|
||||||
|
public:
|
||||||
|
virtual bool prepareLoadedData();
|
||||||
|
uint8 *GetData() {return data;}
|
||||||
|
uint32 GetDataSize() {return data_size;}
|
||||||
|
|
||||||
|
file_MVER *version;
|
||||||
|
FileLoader();
|
||||||
|
~FileLoader();
|
||||||
|
bool loadFile(char *filename, bool log = true);
|
||||||
|
virtual void free();
|
||||||
|
};
|
||||||
|
#endif
|
||||||
204
contrib/vmap_extractor_v4/vmapextract/model.cpp
Normal file
204
contrib/vmap_extractor_v4/vmapextract/model.cpp
Normal file
|
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include "vmapexport.h"
|
||||||
|
#include "model.h"
|
||||||
|
#include "wmo.h"
|
||||||
|
#include "mpqfile.h"
|
||||||
|
#include <cassert>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
extern HANDLE WorldMpq;
|
||||||
|
|
||||||
|
Model::Model(std::string &filename) : filename(filename), vertices(0), indices(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Model::open()
|
||||||
|
{
|
||||||
|
MPQFile f(WorldMpq, filename.c_str());
|
||||||
|
|
||||||
|
ok = !f.isEof();
|
||||||
|
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
f.close();
|
||||||
|
// Do not show this error on console to avoid confusion, the extractor can continue working even if some models fail to load
|
||||||
|
//printf("Error loading model %s\n", filename.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_unload();
|
||||||
|
|
||||||
|
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
|
||||||
|
if(header.nBoundingTriangles > 0)
|
||||||
|
{
|
||||||
|
f.seek(0);
|
||||||
|
f.seekRelative(header.ofsBoundingVertices);
|
||||||
|
vertices = new Vec3D[header.nBoundingVertices];
|
||||||
|
f.read(vertices,header.nBoundingVertices*12);
|
||||||
|
for (uint32 i=0; i<header.nBoundingVertices; i++)
|
||||||
|
{
|
||||||
|
vertices[i] = fixCoordSystem(vertices[i]);
|
||||||
|
}
|
||||||
|
f.seek(0);
|
||||||
|
f.seekRelative(header.ofsBoundingTriangles);
|
||||||
|
indices = new uint16[header.nBoundingTriangles];
|
||||||
|
f.read(indices,header.nBoundingTriangles*2);
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//printf("not included %s\n", filename.c_str());
|
||||||
|
f.close();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Model::ConvertToVMAPModel(const char * outfilename)
|
||||||
|
{
|
||||||
|
int N[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
|
||||||
|
FILE * output=fopen(outfilename,"wb");
|
||||||
|
if(!output)
|
||||||
|
{
|
||||||
|
printf("Can't create the output file '%s'\n",outfilename);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fwrite(szRawVMAPMagic,8,1,output);
|
||||||
|
uint32 nVertices = 0;
|
||||||
|
nVertices = header.nBoundingVertices;
|
||||||
|
fwrite(&nVertices, sizeof(int), 1, output);
|
||||||
|
uint32 nofgroups = 1;
|
||||||
|
fwrite(&nofgroups,sizeof(uint32), 1, output);
|
||||||
|
fwrite(N,4*3,1,output);// rootwmoid, flags, groupid
|
||||||
|
fwrite(N,sizeof(float),3*2,output);//bbox, only needed for WMO currently
|
||||||
|
fwrite(N,4,1,output);// liquidflags
|
||||||
|
fwrite("GRP ",4,1,output);
|
||||||
|
uint32 branches = 1;
|
||||||
|
int wsize;
|
||||||
|
wsize = sizeof(branches) + sizeof(uint32) * branches;
|
||||||
|
fwrite(&wsize, sizeof(int), 1, output);
|
||||||
|
fwrite(&branches,sizeof(branches), 1, output);
|
||||||
|
uint32 nIndexes = 0;
|
||||||
|
nIndexes = header.nBoundingTriangles;
|
||||||
|
fwrite(&nIndexes,sizeof(uint32), 1, output);
|
||||||
|
fwrite("INDX",4, 1, output);
|
||||||
|
wsize = sizeof(uint32) + sizeof(unsigned short) * nIndexes;
|
||||||
|
fwrite(&wsize, sizeof(int), 1, output);
|
||||||
|
fwrite(&nIndexes, sizeof(uint32), 1, output);
|
||||||
|
if(nIndexes >0)
|
||||||
|
{
|
||||||
|
fwrite(indices, sizeof(unsigned short), nIndexes, output);
|
||||||
|
}
|
||||||
|
fwrite("VERT",4, 1, output);
|
||||||
|
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
|
||||||
|
fwrite(&wsize, sizeof(int), 1, output);
|
||||||
|
fwrite(&nVertices, sizeof(int), 1, output);
|
||||||
|
if(nVertices >0)
|
||||||
|
{
|
||||||
|
for(uint32 vpos=0; vpos <nVertices; ++vpos)
|
||||||
|
{
|
||||||
|
std::swap(vertices[vpos].y, vertices[vpos].z);
|
||||||
|
}
|
||||||
|
fwrite(vertices, sizeof(float)*3, nVertices, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(output);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vec3D fixCoordSystem(Vec3D v)
|
||||||
|
{
|
||||||
|
return Vec3D(v.x, v.z, -v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D fixCoordSystem2(Vec3D v)
|
||||||
|
{
|
||||||
|
return Vec3D(v.x, v.z, v.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile)
|
||||||
|
{
|
||||||
|
float ff[3];
|
||||||
|
f.read(&id, 4);
|
||||||
|
f.read(ff,12);
|
||||||
|
pos = fixCoords(Vec3D(ff[0],ff[1],ff[2]));
|
||||||
|
f.read(ff,12);
|
||||||
|
rot = Vec3D(ff[0],ff[1],ff[2]);
|
||||||
|
f.read(&scale,4);
|
||||||
|
// scale factor - divide by 1024. blizzard devs must be on crack, why not just use a float?
|
||||||
|
sc = scale / 1024.0f;
|
||||||
|
|
||||||
|
char tempname[512];
|
||||||
|
sprintf(tempname, "%s/%s", szWorkDirWmo, ModelInstName);
|
||||||
|
FILE *input;
|
||||||
|
input = fopen(tempname, "r+b");
|
||||||
|
|
||||||
|
if(!input)
|
||||||
|
{
|
||||||
|
//printf("ModelInstance::ModelInstance couldn't open %s\n", tempname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(input, 8, SEEK_SET); // get the correct no of vertices
|
||||||
|
int nVertices;
|
||||||
|
fread(&nVertices, sizeof (int), 1, input);
|
||||||
|
fclose(input);
|
||||||
|
|
||||||
|
if(nVertices == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint16 adtId = 0;// not used for models
|
||||||
|
uint32 flags = MOD_M2;
|
||||||
|
if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN;
|
||||||
|
//write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name
|
||||||
|
fwrite(&mapID, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&tileX, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&tileY, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&flags, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&adtId, sizeof(uint16), 1, pDirfile);
|
||||||
|
fwrite(&id, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&pos, sizeof(float), 3, pDirfile);
|
||||||
|
fwrite(&rot, sizeof(float), 3, pDirfile);
|
||||||
|
fwrite(&sc, sizeof(float), 1, pDirfile);
|
||||||
|
uint32 nlen=strlen(ModelInstName);
|
||||||
|
fwrite(&nlen, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(ModelInstName, sizeof(char), nlen, pDirfile);
|
||||||
|
|
||||||
|
/* int realx1 = (int) ((float) pos.x / 533.333333f);
|
||||||
|
int realy1 = (int) ((float) pos.z / 533.333333f);
|
||||||
|
int realx2 = (int) ((float) pos.x / 533.333333f);
|
||||||
|
int realy2 = (int) ((float) pos.z / 533.333333f);
|
||||||
|
|
||||||
|
fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f %f %d %d %d,%d %d\n",
|
||||||
|
MapName,
|
||||||
|
ModelInstName,
|
||||||
|
(float) pos.x, (float) pos.y, (float) pos.z,
|
||||||
|
(float) rot.x, (float) rot.y, (float) rot.z,
|
||||||
|
sc,
|
||||||
|
nVertices,
|
||||||
|
realx1, realy1,
|
||||||
|
realx2, realy2
|
||||||
|
); */
|
||||||
|
}
|
||||||
77
contrib/vmap_extractor_v4/vmapextract/model.h
Normal file
77
contrib/vmap_extractor_v4/vmapextract/model.h
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODEL_H
|
||||||
|
#define MODEL_H
|
||||||
|
|
||||||
|
#include "vec3d.h"
|
||||||
|
//#include "mpq.h"
|
||||||
|
#include "modelheaders.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Model;
|
||||||
|
class WMOInstance;
|
||||||
|
class MPQFile;
|
||||||
|
|
||||||
|
Vec3D fixCoordSystem(Vec3D v);
|
||||||
|
|
||||||
|
class Model
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ModelHeader header;
|
||||||
|
uint32 offsBB_vertices, offsBB_indices;
|
||||||
|
Vec3D *BB_vertices, *vertices;
|
||||||
|
uint16 *BB_indices, *indices;
|
||||||
|
size_t nIndices;
|
||||||
|
|
||||||
|
bool open();
|
||||||
|
bool ConvertToVMAPModel(const char * outfilename);
|
||||||
|
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
Model(std::string &filename);
|
||||||
|
~Model() {_unload();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void _unload()
|
||||||
|
{
|
||||||
|
delete[] vertices;
|
||||||
|
delete[] indices;
|
||||||
|
vertices = NULL;
|
||||||
|
indices = NULL;
|
||||||
|
}
|
||||||
|
std::string filename;
|
||||||
|
char outfilename;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ModelInstance
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Model *model;
|
||||||
|
|
||||||
|
uint32 id;
|
||||||
|
Vec3D pos, rot;
|
||||||
|
unsigned int d1, scale;
|
||||||
|
float w,sc;
|
||||||
|
|
||||||
|
ModelInstance() {}
|
||||||
|
ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
94
contrib/vmap_extractor_v4/vmapextract/modelheaders.h
Normal file
94
contrib/vmap_extractor_v4/vmapextract/modelheaders.h
Normal file
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MODELHEADERS_H
|
||||||
|
#define MODELHEADERS_H
|
||||||
|
|
||||||
|
#include "mpqfile.h" // integer typedefs
|
||||||
|
|
||||||
|
#pragma pack(push,1)
|
||||||
|
|
||||||
|
struct ModelHeader
|
||||||
|
{
|
||||||
|
char id[4];
|
||||||
|
uint8 version[4];
|
||||||
|
uint32 nameLength;
|
||||||
|
uint32 nameOfs;
|
||||||
|
uint32 type;
|
||||||
|
uint32 nGlobalSequences;
|
||||||
|
uint32 ofsGlobalSequences;
|
||||||
|
uint32 nAnimations;
|
||||||
|
uint32 ofsAnimations;
|
||||||
|
uint32 nAnimationLookup;
|
||||||
|
uint32 ofsAnimationLookup;
|
||||||
|
uint32 nBones;
|
||||||
|
uint32 ofsBones;
|
||||||
|
uint32 nKeyBoneLookup;
|
||||||
|
uint32 ofsKeyBoneLookup;
|
||||||
|
uint32 nVertices;
|
||||||
|
uint32 ofsVertices;
|
||||||
|
uint32 nViews;
|
||||||
|
uint32 nColors;
|
||||||
|
uint32 ofsColors;
|
||||||
|
uint32 nTextures;
|
||||||
|
uint32 ofsTextures;
|
||||||
|
uint32 nTransparency;
|
||||||
|
uint32 ofsTransparency;
|
||||||
|
uint32 nTextureanimations;
|
||||||
|
uint32 ofsTextureanimations;
|
||||||
|
uint32 nTexReplace;
|
||||||
|
uint32 ofsTexReplace;
|
||||||
|
uint32 nRenderFlags;
|
||||||
|
uint32 ofsRenderFlags;
|
||||||
|
uint32 nBoneLookupTable;
|
||||||
|
uint32 ofsBoneLookupTable;
|
||||||
|
uint32 nTexLookup;
|
||||||
|
uint32 ofsTexLookup;
|
||||||
|
uint32 nTexUnits;
|
||||||
|
uint32 ofsTexUnits;
|
||||||
|
uint32 nTransLookup;
|
||||||
|
uint32 ofsTransLookup;
|
||||||
|
uint32 nTexAnimLookup;
|
||||||
|
uint32 ofsTexAnimLookup;
|
||||||
|
float floats[14];
|
||||||
|
uint32 nBoundingTriangles;
|
||||||
|
uint32 ofsBoundingTriangles;
|
||||||
|
uint32 nBoundingVertices;
|
||||||
|
uint32 ofsBoundingVertices;
|
||||||
|
uint32 nBoundingNormals;
|
||||||
|
uint32 ofsBoundingNormals;
|
||||||
|
uint32 nAttachments;
|
||||||
|
uint32 ofsAttachments;
|
||||||
|
uint32 nAttachLookup;
|
||||||
|
uint32 ofsAttachLookup;
|
||||||
|
uint32 nAttachments_2;
|
||||||
|
uint32 ofsAttachments_2;
|
||||||
|
uint32 nLights;
|
||||||
|
uint32 ofsLights;
|
||||||
|
uint32 nCameras;
|
||||||
|
uint32 ofsCameras;
|
||||||
|
uint32 nCameraLookup;
|
||||||
|
uint32 ofsCameraLookup;
|
||||||
|
uint32 nRibbonEmitters;
|
||||||
|
uint32 ofsRibbonEmitters;
|
||||||
|
uint32 nParticleEmitters;
|
||||||
|
uint32 ofsParticleEmitters;
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma pack(pop)
|
||||||
|
#endif
|
||||||
86
contrib/vmap_extractor_v4/vmapextract/mpqfile.cpp
Normal file
86
contrib/vmap_extractor_v4/vmapextract/mpqfile.cpp
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
#include "mpqfile.h"
|
||||||
|
#include <deque>
|
||||||
|
#include <cstdio>
|
||||||
|
#include "StormLib.h"
|
||||||
|
|
||||||
|
MPQFile::MPQFile(HANDLE mpq, const char* filename):
|
||||||
|
eof(false),
|
||||||
|
buffer(0),
|
||||||
|
pointer(0),
|
||||||
|
size(0)
|
||||||
|
{
|
||||||
|
HANDLE file;
|
||||||
|
if (!SFileOpenFileEx(mpq, filename, SFILE_OPEN_PATCHED_FILE, &file))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Can't open %s, err=%u!\n", filename, GetLastError());
|
||||||
|
eof = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD hi = 0;
|
||||||
|
size = SFileGetFileSize(file, &hi);
|
||||||
|
|
||||||
|
if (hi)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Can't open %s, size[hi] = %u!\n", filename, (uint32)hi);
|
||||||
|
SFileCloseFile(file);
|
||||||
|
eof = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size <= 1)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Can't open %s, size = %u!\n", filename, size);
|
||||||
|
SFileCloseFile(file);
|
||||||
|
eof = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD read = 0;
|
||||||
|
buffer = new char[size];
|
||||||
|
if (!SFileReadFile(file, buffer, size, &read, NULL) || size != read)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Can't read %s, size=%u read=%u!\n", filename, size, read);
|
||||||
|
SFileCloseFile(file);
|
||||||
|
eof = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SFileCloseFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t MPQFile::read(void* dest, size_t bytes)
|
||||||
|
{
|
||||||
|
if (eof) return 0;
|
||||||
|
|
||||||
|
size_t rpos = pointer + bytes;
|
||||||
|
if (rpos > size) {
|
||||||
|
bytes = size - pointer;
|
||||||
|
eof = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(dest, &(buffer[pointer]), bytes);
|
||||||
|
|
||||||
|
pointer = rpos;
|
||||||
|
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPQFile::seek(int offset)
|
||||||
|
{
|
||||||
|
pointer = offset;
|
||||||
|
eof = (pointer >= size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPQFile::seekRelative(int offset)
|
||||||
|
{
|
||||||
|
pointer += offset;
|
||||||
|
eof = (pointer >= size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MPQFile::close()
|
||||||
|
{
|
||||||
|
if (buffer) delete[] buffer;
|
||||||
|
buffer = 0;
|
||||||
|
eof = true;
|
||||||
|
}
|
||||||
81
contrib/vmap_extractor_v4/vmapextract/mpqfile.h
Normal file
81
contrib/vmap_extractor_v4/vmapextract/mpqfile.h
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS // fuck the police^Wwarnings
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MPQ_H
|
||||||
|
#define MPQ_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <Windows.h> // mainly only HANDLE definition is required
|
||||||
|
typedef __int64 int64;
|
||||||
|
typedef __int32 int32;
|
||||||
|
typedef __int16 int16;
|
||||||
|
typedef __int8 int8;
|
||||||
|
typedef unsigned __int64 uint64;
|
||||||
|
typedef unsigned __int32 uint32;
|
||||||
|
typedef unsigned __int16 uint16;
|
||||||
|
typedef unsigned __int8 uint8;
|
||||||
|
#else
|
||||||
|
#include <stdint.h>
|
||||||
|
#ifndef uint64_t
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <linux/types.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
typedef int64_t int64;
|
||||||
|
typedef int32_t int32;
|
||||||
|
typedef int16_t int16;
|
||||||
|
typedef int8_t int8;
|
||||||
|
typedef uint64_t uint64;
|
||||||
|
typedef uint32_t uint32;
|
||||||
|
typedef uint16_t uint16;
|
||||||
|
typedef uint8_t uint8;
|
||||||
|
typedef void* HANDLE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class MPQFile
|
||||||
|
{
|
||||||
|
//MPQHANDLE handle;
|
||||||
|
bool eof;
|
||||||
|
char *buffer;
|
||||||
|
size_t pointer,size;
|
||||||
|
|
||||||
|
// disable copying
|
||||||
|
MPQFile(const MPQFile &f);
|
||||||
|
void operator=(const MPQFile &f);
|
||||||
|
|
||||||
|
public:
|
||||||
|
MPQFile(HANDLE mpq, const char* filename); // filenames are not case sensitive
|
||||||
|
~MPQFile() { close(); }
|
||||||
|
size_t read(void* dest, size_t bytes);
|
||||||
|
size_t getSize() { return size; }
|
||||||
|
size_t getPos() { return pointer; }
|
||||||
|
char* getBuffer() { return buffer; }
|
||||||
|
char* getPointer() { return buffer + pointer; }
|
||||||
|
bool isEof() { return eof; }
|
||||||
|
void seek(int offset);
|
||||||
|
void seekRelative(int offset);
|
||||||
|
void close();
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void flipcc(char *fcc)
|
||||||
|
{
|
||||||
|
char t;
|
||||||
|
t=fcc[0];
|
||||||
|
fcc[0]=fcc[3];
|
||||||
|
fcc[3]=t;
|
||||||
|
t=fcc[1];
|
||||||
|
fcc[1]=fcc[2];
|
||||||
|
fcc[2]=t;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
230
contrib/vmap_extractor_v4/vmapextract/vec3d.h
Normal file
230
contrib/vmap_extractor_v4/vmapextract/vec3d.h
Normal file
|
|
@ -0,0 +1,230 @@
|
||||||
|
#ifndef VEC3D_H
|
||||||
|
#define VEC3D_H
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
class Vec3D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
float x,y,z;
|
||||||
|
|
||||||
|
Vec3D(float x0 = 0.0f, float y0 = 0.0f, float z0 = 0.0f) : x(x0), y(y0), z(z0) {}
|
||||||
|
|
||||||
|
Vec3D(const Vec3D& v) : x(v.x), y(v.y), z(v.z) {}
|
||||||
|
|
||||||
|
Vec3D& operator= (const Vec3D &v) {
|
||||||
|
x = v.x;
|
||||||
|
y = v.y;
|
||||||
|
z = v.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D operator+ (const Vec3D &v) const
|
||||||
|
{
|
||||||
|
Vec3D r(x+v.x,y+v.y,z+v.z);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D operator- (const Vec3D &v) const
|
||||||
|
{
|
||||||
|
Vec3D r(x-v.x,y-v.y,z-v.z);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float operator* (const Vec3D &v) const
|
||||||
|
{
|
||||||
|
return x*v.x + y*v.y + z*v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D operator* (float d) const
|
||||||
|
{
|
||||||
|
Vec3D r(x*d,y*d,z*d);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend Vec3D operator* (float d, const Vec3D& v)
|
||||||
|
{
|
||||||
|
return v * d;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D operator% (const Vec3D &v) const
|
||||||
|
{
|
||||||
|
Vec3D r(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D& operator+= (const Vec3D &v)
|
||||||
|
{
|
||||||
|
x += v.x;
|
||||||
|
y += v.y;
|
||||||
|
z += v.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D& operator-= (const Vec3D &v)
|
||||||
|
{
|
||||||
|
x -= v.x;
|
||||||
|
y -= v.y;
|
||||||
|
z -= v.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D& operator*= (float d)
|
||||||
|
{
|
||||||
|
x *= d;
|
||||||
|
y *= d;
|
||||||
|
z *= d;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float lengthSquared() const
|
||||||
|
{
|
||||||
|
return x*x+y*y+z*z;
|
||||||
|
}
|
||||||
|
|
||||||
|
float length() const
|
||||||
|
{
|
||||||
|
return sqrt(x*x+y*y+z*z);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D& normalize()
|
||||||
|
{
|
||||||
|
this->operator*= (1.0f/length());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D operator~ () const
|
||||||
|
{
|
||||||
|
Vec3D r(*this);
|
||||||
|
r.normalize();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend std::istream& operator>>(std::istream& in, Vec3D& v)
|
||||||
|
{
|
||||||
|
in >> v.x >> v.y >> v.z;
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend std::ostream& operator<<(std::ostream& out, const Vec3D& v)
|
||||||
|
{
|
||||||
|
out << v.x << " " << v.y << " " << v.z;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator float*()
|
||||||
|
{
|
||||||
|
return (float*)this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Vec2D
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
float x,y;
|
||||||
|
|
||||||
|
Vec2D(float x0 = 0.0f, float y0 = 0.0f) : x(x0), y(y0) {}
|
||||||
|
|
||||||
|
Vec2D(const Vec2D& v) : x(v.x), y(v.y) {}
|
||||||
|
|
||||||
|
Vec2D& operator= (const Vec2D &v) {
|
||||||
|
x = v.x;
|
||||||
|
y = v.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D operator+ (const Vec2D &v) const
|
||||||
|
{
|
||||||
|
Vec2D r(x+v.x,y+v.y);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D operator- (const Vec2D &v) const
|
||||||
|
{
|
||||||
|
Vec2D r(x-v.x,y-v.y);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
float operator* (const Vec2D &v) const
|
||||||
|
{
|
||||||
|
return x*v.x + y*v.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D operator* (float d) const
|
||||||
|
{
|
||||||
|
Vec2D r(x*d,y*d);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend Vec2D operator* (float d, const Vec2D& v)
|
||||||
|
{
|
||||||
|
return v * d;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D& operator+= (const Vec2D &v)
|
||||||
|
{
|
||||||
|
x += v.x;
|
||||||
|
y += v.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D& operator-= (const Vec2D &v)
|
||||||
|
{
|
||||||
|
x -= v.x;
|
||||||
|
y -= v.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D& operator*= (float d)
|
||||||
|
{
|
||||||
|
x *= d;
|
||||||
|
y *= d;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
float lengthSquared() const
|
||||||
|
{
|
||||||
|
return x*x+y*y;
|
||||||
|
}
|
||||||
|
|
||||||
|
float length() const
|
||||||
|
{
|
||||||
|
return sqrt(x*x+y*y);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D& normalize()
|
||||||
|
{
|
||||||
|
this->operator*= (1.0f/length());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec2D operator~ () const
|
||||||
|
{
|
||||||
|
Vec2D r(*this);
|
||||||
|
r.normalize();
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
friend std::istream& operator>>(std::istream& in, Vec2D& v)
|
||||||
|
{
|
||||||
|
in >> v.x >> v.y;
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator float*()
|
||||||
|
{
|
||||||
|
return (float*)this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void rotate(float x0, float y0, float *x, float *y, float angle)
|
||||||
|
{
|
||||||
|
float xa = *x - x0, ya = *y - y0;
|
||||||
|
*x = xa*cosf(angle) - ya*sinf(angle) + x0;
|
||||||
|
*y = xa*sinf(angle) + ya*cosf(angle) + y0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
647
contrib/vmap_extractor_v4/vmapextract/vmapexport.cpp
Normal file
647
contrib/vmap_extractor_v4/vmapextract/vmapexport.cpp
Normal file
|
|
@ -0,0 +1,647 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE
|
||||||
|
#include <cstdio>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <list>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <direct.h>
|
||||||
|
#define mkdir _mkdir
|
||||||
|
#else
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef min
|
||||||
|
#undef max
|
||||||
|
|
||||||
|
//#pragma warning(disable : 4505)
|
||||||
|
//#pragma comment(lib, "Winmm.lib")
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
//From Extractor
|
||||||
|
#include "adtfile.h"
|
||||||
|
#include "wdtfile.h"
|
||||||
|
#include "dbcfile.h"
|
||||||
|
#include "wmo.h"
|
||||||
|
#include "mpqfile.h"
|
||||||
|
|
||||||
|
#include "vmapexport.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Defines
|
||||||
|
|
||||||
|
#define MPQ_BLOCK_SIZE 0x1000
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
HANDLE WorldMpq = NULL;
|
||||||
|
HANDLE LocaleMpq = NULL;
|
||||||
|
|
||||||
|
uint32 CONF_TargetBuild = 15595; // 4.3.4.15595
|
||||||
|
|
||||||
|
// List MPQ for extract maps from
|
||||||
|
char const* CONF_mpq_list[]=
|
||||||
|
{
|
||||||
|
"world.MPQ",
|
||||||
|
"art.MPQ",
|
||||||
|
"expansion1.MPQ",
|
||||||
|
"expansion2.MPQ",
|
||||||
|
"expansion3.MPQ",
|
||||||
|
"world2.MPQ",
|
||||||
|
};
|
||||||
|
|
||||||
|
uint32 const Builds[] = {13164, 13205, 13287, 13329, 13596, 13623, 13914, 14007, 14333, 14480, 14545, 15005, 15050, 15211, 15354, 15595, 0};
|
||||||
|
#define LAST_DBC_IN_DATA_BUILD 13623 // after this build mpqs with dbc are back to locale folder
|
||||||
|
|
||||||
|
char* const Locales[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU"};
|
||||||
|
TCHAR* const LocalesT[] =
|
||||||
|
{
|
||||||
|
_T("enGB"), _T("enUS"),
|
||||||
|
_T("deDE"), _T("esES"),
|
||||||
|
_T("frFR"), _T("koKR"),
|
||||||
|
_T("zhCN"), _T("zhTW"),
|
||||||
|
_T("enCN"), _T("enTW"),
|
||||||
|
_T("esMX"), _T("ruRU"),
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LOCALES_COUNT 12
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[64];
|
||||||
|
unsigned int id;
|
||||||
|
}map_id;
|
||||||
|
|
||||||
|
map_id * map_ids;
|
||||||
|
uint16 *LiqType = 0;
|
||||||
|
uint32 map_count;
|
||||||
|
char output_path[128]=".";
|
||||||
|
char input_path[1024]=".";
|
||||||
|
bool preciseVectorData = false;
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
|
||||||
|
//static const char * szWorkDirMaps = ".\\Maps";
|
||||||
|
const char* szWorkDirWmo = "./Buildings";
|
||||||
|
const char* szRawVMAPMagic = "VMAP004";
|
||||||
|
|
||||||
|
bool LoadLocaleMPQFile(int locale)
|
||||||
|
{
|
||||||
|
TCHAR buff[512];
|
||||||
|
memset(buff, 0, sizeof(buff));
|
||||||
|
_stprintf(buff, _T("%s%s/locale-%s.MPQ"), input_path, LocalesT[locale], LocalesT[locale]);
|
||||||
|
if (!SFileOpenArchive(buff, 0, MPQ_OPEN_READ_ONLY, &LocaleMpq))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
_tprintf(_T("Cannot open archive %s\n"), buff);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* prefix = NULL;
|
||||||
|
for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i)
|
||||||
|
{
|
||||||
|
memset(buff, 0, sizeof(buff));
|
||||||
|
if (Builds[i] > LAST_DBC_IN_DATA_BUILD)
|
||||||
|
{
|
||||||
|
prefix = "";
|
||||||
|
_stprintf(buff, _T("%s%s/wow-update-%s-%u.MPQ"), input_path, LocalesT[locale], LocalesT[locale], Builds[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prefix = Locales[locale];
|
||||||
|
_stprintf(buff, _T("%swow-update-%u.MPQ"), input_path, Builds[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SFileOpenPatchArchive(LocaleMpq, buff, prefix, 0))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
_tprintf(_T("Cannot open patch archive %s\n"), buff);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LoadCommonMPQFiles(uint32 build)
|
||||||
|
{
|
||||||
|
TCHAR filename[512];
|
||||||
|
_stprintf(filename, _T("%sworld.MPQ"), input_path);
|
||||||
|
if (!SFileOpenArchive(filename, 0, MPQ_OPEN_READ_ONLY, &WorldMpq))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
_tprintf(_T("Cannot open archive %s\n"), filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = sizeof(CONF_mpq_list) / sizeof(char*);
|
||||||
|
for (int i = 1; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (build < 15211 && !strcmp("world2.MPQ", CONF_mpq_list[i])) // 4.3.2 and higher MPQ
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_stprintf(filename, _T("%s%s"), input_path, CONF_mpq_list[i]);
|
||||||
|
if (!SFileOpenPatchArchive(WorldMpq, filename, "", 0))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
_tprintf(_T("Cannot open archive %s\n"), filename);
|
||||||
|
else
|
||||||
|
_tprintf(_T("Not found %s\n"), filename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tprintf(_T("Loaded %s\n"), filename);
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
int count = 0;
|
||||||
|
SFILE_FIND_DATA data;
|
||||||
|
HANDLE find = SFileFindFirstFile(WorldMpq, "*.*", &data, NULL);
|
||||||
|
if (find != NULL)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
++count;
|
||||||
|
if (data.dwFileFlags & MPQ_FILE_PATCH_FILE)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (SFileFindNextFile(find, &data));
|
||||||
|
}
|
||||||
|
SFileFindClose(find);
|
||||||
|
printf("Scanned %d files, found patch = %d\n", count, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char const* prefix = NULL;
|
||||||
|
for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i)
|
||||||
|
{
|
||||||
|
memset(filename, 0, sizeof(filename));
|
||||||
|
if (Builds[i] > LAST_DBC_IN_DATA_BUILD)
|
||||||
|
{
|
||||||
|
prefix = "";
|
||||||
|
_stprintf(filename, _T("%swow-update-base-%u.MPQ"), input_path, Builds[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prefix = "base";
|
||||||
|
_stprintf(filename, _T("%swow-update-%u.MPQ"), input_path, Builds[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SFileOpenPatchArchive(WorldMpq, filename, prefix, 0))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
_tprintf(_T("Cannot open patch archive %s\n"), filename);
|
||||||
|
else
|
||||||
|
_tprintf(_T("Not found %s\n"), filename);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_tprintf(_T("Loaded %s\n"), filename);
|
||||||
|
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
int count = 0;
|
||||||
|
SFILE_FIND_DATA data;
|
||||||
|
HANDLE find = SFileFindFirstFile(WorldMpq, "*.*", &data, NULL);
|
||||||
|
if (find != NULL)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
++count;
|
||||||
|
if (data.dwFileFlags & MPQ_FILE_PATCH_FILE)
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (SFileFindNextFile(find, &data));
|
||||||
|
}
|
||||||
|
SFileFindClose(find);
|
||||||
|
printf("Scanned %d files, found patch = %d\n", count, found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Local testing functions
|
||||||
|
|
||||||
|
bool FileExists(const char* file)
|
||||||
|
{
|
||||||
|
if (FILE* n = fopen(file, "rb"))
|
||||||
|
{
|
||||||
|
fclose(n);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void strToLower(char* str)
|
||||||
|
{
|
||||||
|
while(*str)
|
||||||
|
{
|
||||||
|
*str=tolower(*str);
|
||||||
|
++str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copied from contrib/extractor/System.cpp
|
||||||
|
void ReadLiquidTypeTableDBC()
|
||||||
|
{
|
||||||
|
printf("Read LiquidType.dbc file...");
|
||||||
|
|
||||||
|
DBCFile dbc(LocaleMpq, "DBFilesClient\\LiquidType.dbc");
|
||||||
|
if(!dbc.open())
|
||||||
|
{
|
||||||
|
printf("Fatal error: Invalid LiquidType.dbc file format!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t LiqType_count = dbc.getRecordCount();
|
||||||
|
size_t LiqType_maxid = dbc.getRecord(LiqType_count - 1).getUInt(0);
|
||||||
|
LiqType = new uint16[LiqType_maxid + 1];
|
||||||
|
memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16));
|
||||||
|
|
||||||
|
for(uint32 x = 0; x < LiqType_count; ++x)
|
||||||
|
LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
|
||||||
|
|
||||||
|
printf("Done! (%u LiqTypes loaded)\n", (unsigned int)LiqType_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExtractWmo()
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
//const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"};
|
||||||
|
|
||||||
|
SFILE_FIND_DATA data;
|
||||||
|
HANDLE find = SFileFindFirstFile(WorldMpq, "*.wmo", &data, NULL);
|
||||||
|
if (find != NULL)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
std::string str = data.cFileName;
|
||||||
|
//printf("Extracting wmo %s\n", str.c_str());
|
||||||
|
success |= ExtractSingleWmo(str);
|
||||||
|
}
|
||||||
|
while (SFileFindNextFile(find, &data));
|
||||||
|
}
|
||||||
|
SFileFindClose(find);
|
||||||
|
|
||||||
|
if (success)
|
||||||
|
printf("\nExtract wmo complete (No (fatal) errors)\n");
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExtractSingleWmo(std::string& fname)
|
||||||
|
{
|
||||||
|
// Copy files from archive
|
||||||
|
|
||||||
|
char szLocalFile[1024];
|
||||||
|
const char * plain_name = GetPlainName(fname.c_str());
|
||||||
|
sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name);
|
||||||
|
fixnamen(szLocalFile,strlen(szLocalFile));
|
||||||
|
|
||||||
|
if (FileExists(szLocalFile))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
int p = 0;
|
||||||
|
//Select root wmo files
|
||||||
|
const char * rchr = strrchr(plain_name, '_');
|
||||||
|
if(rchr != NULL)
|
||||||
|
{
|
||||||
|
char cpy[4];
|
||||||
|
strncpy((char*)cpy,rchr,4);
|
||||||
|
for (int i=0;i < 4; ++i)
|
||||||
|
{
|
||||||
|
int m = cpy[i];
|
||||||
|
if(isdigit(m))
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == 3)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
bool file_ok = true;
|
||||||
|
std::cout << "Extracting " << fname << std::endl;
|
||||||
|
WMORoot froot(fname);
|
||||||
|
if(!froot.open())
|
||||||
|
{
|
||||||
|
printf("Couldn't open RootWmo!!!\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
FILE *output = fopen(szLocalFile,"wb");
|
||||||
|
if(!output)
|
||||||
|
{
|
||||||
|
printf("couldn't open %s for writing!\n", szLocalFile);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
froot.ConvertToVMAPRootWmo(output);
|
||||||
|
int Wmo_nVertices = 0;
|
||||||
|
//printf("root has %d groups\n", froot->nGroups);
|
||||||
|
if (froot.nGroups !=0)
|
||||||
|
{
|
||||||
|
for (uint32 i = 0; i < froot.nGroups; ++i)
|
||||||
|
{
|
||||||
|
char temp[1024];
|
||||||
|
strcpy(temp, fname.c_str());
|
||||||
|
temp[fname.length()-4] = 0;
|
||||||
|
char groupFileName[1024];
|
||||||
|
sprintf(groupFileName,"%s_%03d.wmo",temp, i);
|
||||||
|
//printf("Trying to open groupfile %s\n",groupFileName);
|
||||||
|
|
||||||
|
string s = groupFileName;
|
||||||
|
WMOGroup fgroup(s);
|
||||||
|
if(!fgroup.open())
|
||||||
|
{
|
||||||
|
printf("Could not open all Group file for: %s\n", plain_name);
|
||||||
|
file_ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, &froot, preciseVectorData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(output, 8, SEEK_SET); // store the correct no of vertices
|
||||||
|
fwrite(&Wmo_nVertices,sizeof(int),1,output);
|
||||||
|
fclose(output);
|
||||||
|
|
||||||
|
// Delete the extracted file in the case of an error
|
||||||
|
if (!file_ok)
|
||||||
|
remove(szLocalFile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParsMapFiles()
|
||||||
|
{
|
||||||
|
char fn[512];
|
||||||
|
//char id_filename[64];
|
||||||
|
char id[10];
|
||||||
|
for (unsigned int i=0; i<map_count; ++i)
|
||||||
|
{
|
||||||
|
sprintf(id,"%03u",map_ids[i].id);
|
||||||
|
sprintf(fn,"World\\Maps\\%s\\%s.wdt", map_ids[i].name, map_ids[i].name);
|
||||||
|
WDTFile WDT(fn,map_ids[i].name);
|
||||||
|
if(WDT.init(id, map_ids[i].id))
|
||||||
|
{
|
||||||
|
printf("Processing Map %u\n[", map_ids[i].id);
|
||||||
|
for (int x=0; x<64; ++x)
|
||||||
|
{
|
||||||
|
for (int y=0; y<64; ++y)
|
||||||
|
{
|
||||||
|
if (ADTFile *ADT = WDT.GetMap(x,y))
|
||||||
|
{
|
||||||
|
//sprintf(id_filename,"%02u %02u %03u",x,y,map_ids[i].id);//!!!!!!!!!
|
||||||
|
ADT->init(map_ids[i].id, x, y);
|
||||||
|
delete ADT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("#");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
printf("]\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void getGamePath()
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
strcpy(input_path,"Data\\");
|
||||||
|
#else
|
||||||
|
strcpy(input_path,"Data/");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
bool scan_patches(char* scanmatch, std::vector<std::string>& pArchiveNames)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char path[512];
|
||||||
|
|
||||||
|
for (i = 1; i <= 99; i++)
|
||||||
|
{
|
||||||
|
if (i != 1)
|
||||||
|
{
|
||||||
|
sprintf(path, "%s-%d.MPQ", scanmatch, i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf(path, "%s.MPQ", scanmatch);
|
||||||
|
}
|
||||||
|
#ifdef __linux__
|
||||||
|
if(FILE* h = fopen64(path, "rb"))
|
||||||
|
#else
|
||||||
|
if(FILE* h = fopen(path, "rb"))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
fclose(h);
|
||||||
|
//matches.push_back(path);
|
||||||
|
pArchiveNames.push_back(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool processArgv(int argc, char ** argv, const char *versionString)
|
||||||
|
{
|
||||||
|
bool result = true;
|
||||||
|
bool hasInputPathParam = false;
|
||||||
|
bool preciseVectorData = false;
|
||||||
|
|
||||||
|
for(int i=1; i< argc; ++i)
|
||||||
|
{
|
||||||
|
if(strcmp("-s",argv[i]) == 0)
|
||||||
|
{
|
||||||
|
preciseVectorData = false;
|
||||||
|
}
|
||||||
|
else if(strcmp("-d",argv[i]) == 0)
|
||||||
|
{
|
||||||
|
if((i+1)<argc)
|
||||||
|
{
|
||||||
|
hasInputPathParam = true;
|
||||||
|
strcpy(input_path, argv[i+1]);
|
||||||
|
if (input_path[strlen(input_path) - 1] != '\\' || input_path[strlen(input_path) - 1] != '/')
|
||||||
|
strcat(input_path, "/");
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(strcmp("-?",argv[1]) == 0)
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else if(strcmp("-l",argv[i]) == 0)
|
||||||
|
{
|
||||||
|
preciseVectorData = true;
|
||||||
|
}
|
||||||
|
else if(strcmp("-b",argv[i]) == 0)
|
||||||
|
{
|
||||||
|
if (i + 1 < argc) // all ok
|
||||||
|
CONF_TargetBuild = atoi(argv[i++ + 1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!result)
|
||||||
|
{
|
||||||
|
printf("Extract %s.\n",versionString);
|
||||||
|
printf("%s [-?][-s][-l][-d <path>]\n", argv[0]);
|
||||||
|
printf(" -s : (default) small size (data size optimization), ~500MB less vmap data.\n");
|
||||||
|
printf(" -l : large size, ~500MB more vmap data. (might contain more details)\n");
|
||||||
|
printf(" -d <path>: Path to the vector data source folder.\n");
|
||||||
|
printf(" -b : target build (default %u)", CONF_TargetBuild);
|
||||||
|
printf(" -? : This message.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!hasInputPathParam)
|
||||||
|
getGamePath();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
// Main
|
||||||
|
//
|
||||||
|
// The program must be run with two command line arguments
|
||||||
|
//
|
||||||
|
// Arg1 - The source MPQ name (for testing reading and file find)
|
||||||
|
// Arg2 - Listfile name
|
||||||
|
//
|
||||||
|
|
||||||
|
int main(int argc, char ** argv)
|
||||||
|
{
|
||||||
|
bool success=true;
|
||||||
|
const char *versionString = "V4.00 2012_08";
|
||||||
|
|
||||||
|
// Use command line arguments, when some
|
||||||
|
if(!processArgv(argc, argv, versionString))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// some simple check if working dir is dirty
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string sdir = std::string(szWorkDirWmo) + "/dir";
|
||||||
|
std::string sdir_bin = std::string(szWorkDirWmo) + "/dir_bin";
|
||||||
|
struct stat status;
|
||||||
|
if (!stat(sdir.c_str(), &status) || !stat(sdir_bin.c_str(), &status))
|
||||||
|
{
|
||||||
|
printf("Your output directory seems to be polluted, please use an empty directory!\n");
|
||||||
|
printf("<press return to exit>");
|
||||||
|
char garbage[2];
|
||||||
|
scanf("%c", garbage);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Extract %s. Beginning work ....\n",versionString);
|
||||||
|
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
// Create the working directory
|
||||||
|
if(mkdir(szWorkDirWmo
|
||||||
|
#ifdef __linux__
|
||||||
|
, 0711
|
||||||
|
#endif
|
||||||
|
))
|
||||||
|
success = (errno == EEXIST);
|
||||||
|
|
||||||
|
LoadCommonMPQFiles(CONF_TargetBuild);
|
||||||
|
|
||||||
|
int FirstLocale = -1;
|
||||||
|
|
||||||
|
for (int i = 0; i < LOCALES_COUNT; ++i)
|
||||||
|
{
|
||||||
|
//Open MPQs
|
||||||
|
if (!LoadLocaleMPQFile(i))
|
||||||
|
{
|
||||||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
|
printf("Unable to load %s locale archives!\n", Locales[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Detected and using locale locale: %s\n", Locales[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadLiquidTypeTableDBC();
|
||||||
|
|
||||||
|
// extract data
|
||||||
|
if(success)
|
||||||
|
success = ExtractWmo();
|
||||||
|
|
||||||
|
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
//map.dbc
|
||||||
|
if(success)
|
||||||
|
{
|
||||||
|
DBCFile * dbc = new DBCFile(LocaleMpq, "DBFilesClient\\Map.dbc");
|
||||||
|
if(!dbc->open())
|
||||||
|
{
|
||||||
|
delete dbc;
|
||||||
|
printf("FATAL ERROR: Map.dbc not found in data file.\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
map_count=dbc->getRecordCount ();
|
||||||
|
map_ids=new map_id[map_count];
|
||||||
|
for(unsigned int x=0;x<map_count;++x)
|
||||||
|
{
|
||||||
|
map_ids[x].id=dbc->getRecord (x).getUInt(0);
|
||||||
|
strcpy(map_ids[x].name,dbc->getRecord(x).getString(1));
|
||||||
|
printf("Map - %s\n",map_ids[x].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
delete dbc;
|
||||||
|
ParsMapFiles();
|
||||||
|
delete [] map_ids;
|
||||||
|
//nError = ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SFileCloseArchive(LocaleMpq);
|
||||||
|
SFileCloseArchive(WorldMpq);
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
if(!success)
|
||||||
|
{
|
||||||
|
printf("ERROR: Extract %s. Work NOT complete.\n Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData);
|
||||||
|
getchar();
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Extract %s. Work complete. No errors.\n",versionString);
|
||||||
|
delete [] LiqType;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
39
contrib/vmap_extractor_v4/vmapextract/vmapexport.h
Normal file
39
contrib/vmap_extractor_v4/vmapextract/vmapexport.h
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VMAPEXPORT_H
|
||||||
|
#define VMAPEXPORT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
enum ModelFlags
|
||||||
|
{
|
||||||
|
MOD_M2 = 1,
|
||||||
|
MOD_WORLDSPAWN = 1<<1,
|
||||||
|
MOD_HAS_BOUND = 1<<2
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const char * szWorkDirWmo;
|
||||||
|
extern const char * szRawVMAPMagic; // vmap magic string for extracted raw vmap data
|
||||||
|
|
||||||
|
bool FileExists(const char * file);
|
||||||
|
void strToLower(char* str);
|
||||||
|
|
||||||
|
bool ExtractSingleWmo(std::string& fname);
|
||||||
|
|
||||||
|
#endif
|
||||||
137
contrib/vmap_extractor_v4/vmapextract/wdtfile.cpp
Normal file
137
contrib/vmap_extractor_v4/vmapextract/wdtfile.cpp
Normal file
|
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#include "vmapexport.h"
|
||||||
|
#include "wdtfile.h"
|
||||||
|
#include "adtfile.h"
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
char * wdtGetPlainName(char * FileName)
|
||||||
|
{
|
||||||
|
char * szTemp;
|
||||||
|
|
||||||
|
if((szTemp = strrchr(FileName, '\\')) != NULL)
|
||||||
|
FileName = szTemp + 1;
|
||||||
|
return FileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern HANDLE WorldMpq;
|
||||||
|
|
||||||
|
WDTFile::WDTFile(char* file_name, char* file_name1):WDT(WorldMpq, file_name)
|
||||||
|
{
|
||||||
|
filename.append(file_name1,strlen(file_name1));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WDTFile::init(char *map_id, unsigned int mapID)
|
||||||
|
{
|
||||||
|
if (WDT.isEof())
|
||||||
|
{
|
||||||
|
//printf("Can't find WDT file.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char fourcc[5];
|
||||||
|
uint32 size;
|
||||||
|
|
||||||
|
std::string dirname = std::string(szWorkDirWmo) + "/dir_bin";
|
||||||
|
FILE *dirfile;
|
||||||
|
dirfile = fopen(dirname.c_str(), "ab");
|
||||||
|
if(!dirfile)
|
||||||
|
{
|
||||||
|
printf("Can't open dirfile!'%s'\n", dirname.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!WDT.isEof())
|
||||||
|
{
|
||||||
|
WDT.read(fourcc,4);
|
||||||
|
WDT.read(&size, 4);
|
||||||
|
|
||||||
|
flipcc(fourcc);
|
||||||
|
fourcc[4] = 0;
|
||||||
|
|
||||||
|
size_t nextpos = WDT.getPos() + size;
|
||||||
|
|
||||||
|
if (!strcmp(fourcc,"MAIN"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
if (!strcmp(fourcc,"MWMO"))
|
||||||
|
{
|
||||||
|
// global map objects
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
char *buf = new char[size];
|
||||||
|
WDT.read(buf, size);
|
||||||
|
char *p=buf;
|
||||||
|
int q = 0;
|
||||||
|
gWmoInstansName = new string[size];
|
||||||
|
while (p<buf+size)
|
||||||
|
{
|
||||||
|
string path(p);
|
||||||
|
char* s=wdtGetPlainName(p);
|
||||||
|
fixnamen(s,strlen(s));
|
||||||
|
p=p+strlen(p)+1;
|
||||||
|
gWmoInstansName[q++] = s;
|
||||||
|
}
|
||||||
|
delete[] buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MODF"))
|
||||||
|
{
|
||||||
|
// global wmo instance data
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
gnWMO = (int)size / 64;
|
||||||
|
string gWMO_mapname;
|
||||||
|
string fake_mapname;
|
||||||
|
fake_mapname = "65 65 ";
|
||||||
|
//gWMO_mapname = fake_mapname + filename;
|
||||||
|
gWMO_mapname = fake_mapname + std::string(map_id);
|
||||||
|
for (int i=0; i<gnWMO; ++i)
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
WDT.read(&id, 4);
|
||||||
|
WMOInstance inst(WDT,gWmoInstansName[id].c_str(),mapID, 65, 65, dirfile);
|
||||||
|
}
|
||||||
|
delete[] gWmoInstansName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WDT.seek((int)nextpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
WDT.close();
|
||||||
|
fclose(dirfile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WDTFile::~WDTFile(void)
|
||||||
|
{
|
||||||
|
WDT.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
ADTFile* WDTFile::GetMap(int x, int z)
|
||||||
|
{
|
||||||
|
if(!(x>=0 && z >= 0 && x<64 && z<64))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char name[512];
|
||||||
|
|
||||||
|
sprintf(name,"World\\Maps\\%s\\%s_%d_%d_obj0.adt", filename.c_str(), filename.c_str(), x, z);
|
||||||
|
return new ADTFile(name);
|
||||||
|
}
|
||||||
29
contrib/vmap_extractor_v4/vmapextract/wdtfile.h
Normal file
29
contrib/vmap_extractor_v4/vmapextract/wdtfile.h
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef WDTFILE_H
|
||||||
|
#define WDTFILE_H
|
||||||
|
|
||||||
|
#include "mpqfile.h"
|
||||||
|
#include "wmo.h"
|
||||||
|
#include <string>
|
||||||
|
#include "stdlib.h"
|
||||||
|
|
||||||
|
class ADTFile;
|
||||||
|
|
||||||
|
class WDTFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WDTFile(char* file_name, char* file_name1);
|
||||||
|
~WDTFile(void);
|
||||||
|
bool init(char *map_id, unsigned int mapID);
|
||||||
|
|
||||||
|
string* gWmoInstansName;
|
||||||
|
int gnWMO, nMaps;
|
||||||
|
|
||||||
|
ADTFile* GetMap(int x, int z);
|
||||||
|
|
||||||
|
private:
|
||||||
|
MPQFile WDT;
|
||||||
|
bool maps[64][64];
|
||||||
|
string filename;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
569
contrib/vmap_extractor_v4/vmapextract/wmo.cpp
Normal file
569
contrib/vmap_extractor_v4/vmapextract/wmo.cpp
Normal file
|
|
@ -0,0 +1,569 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include "vmapexport.h"
|
||||||
|
#include "wmo.h"
|
||||||
|
#include "vec3d.h"
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cassert>
|
||||||
|
#include <map>
|
||||||
|
#include <fstream>
|
||||||
|
#undef min
|
||||||
|
#undef max
|
||||||
|
#include "mpqfile.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
extern uint16 *LiqType;
|
||||||
|
|
||||||
|
WMORoot::WMORoot(std::string &filename) : filename(filename)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
extern HANDLE WorldMpq;
|
||||||
|
|
||||||
|
bool WMORoot::open()
|
||||||
|
{
|
||||||
|
MPQFile f(WorldMpq, filename.c_str());
|
||||||
|
if(f.isEof ())
|
||||||
|
{
|
||||||
|
printf("No such file.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 size;
|
||||||
|
char fourcc[5];
|
||||||
|
|
||||||
|
while (!f.isEof())
|
||||||
|
{
|
||||||
|
f.read(fourcc,4);
|
||||||
|
f.read(&size, 4);
|
||||||
|
|
||||||
|
flipcc(fourcc);
|
||||||
|
fourcc[4] = 0;
|
||||||
|
|
||||||
|
size_t nextpos = f.getPos() + size;
|
||||||
|
|
||||||
|
if (!strcmp(fourcc,"MOHD"))//header
|
||||||
|
{
|
||||||
|
f.read(&nTextures, 4);
|
||||||
|
f.read(&nGroups, 4);
|
||||||
|
f.read(&nP, 4);
|
||||||
|
f.read(&nLights, 4);
|
||||||
|
f.read(&nModels, 4);
|
||||||
|
f.read(&nDoodads, 4);
|
||||||
|
f.read(&nDoodadSets, 4);
|
||||||
|
f.read(&col, 4);
|
||||||
|
f.read(&RootWMOID, 4);
|
||||||
|
f.read(bbcorn1,12);
|
||||||
|
f.read(bbcorn2,12);
|
||||||
|
f.read(&liquidType, 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
else if (!strcmp(fourcc,"MOTX"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOMT"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOGN"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOGI"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOLT"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MODN"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MODS"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MODD"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOSB"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOPV"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOPT"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOPR"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MFOG"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
f.seek((int)nextpos);
|
||||||
|
}
|
||||||
|
f.close ();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WMORoot::ConvertToVMAPRootWmo(FILE *pOutfile)
|
||||||
|
{
|
||||||
|
//printf("Convert RootWmo...\n");
|
||||||
|
|
||||||
|
fwrite(szRawVMAPMagic,1,8,pOutfile);
|
||||||
|
unsigned int nVectors = 0;
|
||||||
|
fwrite(&nVectors,sizeof(nVectors),1,pOutfile); // will be filled later
|
||||||
|
fwrite(&nGroups,4,1,pOutfile);
|
||||||
|
fwrite(&RootWMOID,4,1,pOutfile);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WMORoot::~WMORoot()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WMOGroup::WMOGroup(std::string &filename) : filename(filename),
|
||||||
|
MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0), hlq(0), LiquEx(0), LiquBytes(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WMOGroup::open()
|
||||||
|
{
|
||||||
|
MPQFile f(WorldMpq, filename.c_str());
|
||||||
|
if(f.isEof ())
|
||||||
|
{
|
||||||
|
printf("No such file.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
uint32 size;
|
||||||
|
char fourcc[5];
|
||||||
|
while (!f.isEof())
|
||||||
|
{
|
||||||
|
f.read(fourcc,4);
|
||||||
|
f.read(&size, 4);
|
||||||
|
flipcc(fourcc);
|
||||||
|
if (!strcmp(fourcc,"MOGP"))//Fix sizeoff = Data size.
|
||||||
|
{
|
||||||
|
size = 68;
|
||||||
|
}
|
||||||
|
fourcc[4] = 0;
|
||||||
|
size_t nextpos = f.getPos() + size;
|
||||||
|
LiquEx_size = 0;
|
||||||
|
liquflags = 0;
|
||||||
|
|
||||||
|
if (!strcmp(fourcc,"MOGP"))//header
|
||||||
|
{
|
||||||
|
f.read(&groupName, 4);
|
||||||
|
f.read(&descGroupName, 4);
|
||||||
|
f.read(&mogpFlags, 4);
|
||||||
|
f.read(bbcorn1, 12);
|
||||||
|
f.read(bbcorn2, 12);
|
||||||
|
f.read(&moprIdx, 2);
|
||||||
|
f.read(&moprNItems, 2);
|
||||||
|
f.read(&nBatchA, 2);
|
||||||
|
f.read(&nBatchB, 2);
|
||||||
|
f.read(&nBatchC, 4);
|
||||||
|
f.read(&fogIdx, 4);
|
||||||
|
f.read(&liquidType, 4);
|
||||||
|
f.read(&groupWMOID,4);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOPY"))
|
||||||
|
{
|
||||||
|
MOPY = new char[size];
|
||||||
|
mopy_size = size;
|
||||||
|
nTriangles = (int)size / 2;
|
||||||
|
f.read(MOPY, size);
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOVI"))
|
||||||
|
{
|
||||||
|
MOVI = new uint16[size/2];
|
||||||
|
f.read(MOVI, size);
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOVT"))
|
||||||
|
{
|
||||||
|
MOVT = new float[size/4];
|
||||||
|
f.read(MOVT, size);
|
||||||
|
nVertices = (int)size / 12;
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MONR"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOTV"))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MOBA"))
|
||||||
|
{
|
||||||
|
MOBA = new uint16[size/2];
|
||||||
|
moba_size = size/2;
|
||||||
|
f.read(MOBA, size);
|
||||||
|
}
|
||||||
|
else if (!strcmp(fourcc,"MLIQ"))
|
||||||
|
{
|
||||||
|
liquflags |= 1;
|
||||||
|
hlq = new WMOLiquidHeader;
|
||||||
|
f.read(hlq, 0x1E);
|
||||||
|
LiquEx_size = sizeof(WMOLiquidVert) * hlq->xverts * hlq->yverts;
|
||||||
|
LiquEx = new WMOLiquidVert[hlq->xverts * hlq->yverts];
|
||||||
|
f.read(LiquEx, LiquEx_size);
|
||||||
|
int nLiquBytes = hlq->xtiles * hlq->ytiles;
|
||||||
|
LiquBytes = new char[nLiquBytes];
|
||||||
|
f.read(LiquBytes, nLiquBytes);
|
||||||
|
|
||||||
|
/* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app);
|
||||||
|
llog << filename;
|
||||||
|
llog << "\nbbox: " << bbcorn1[0] << ", " << bbcorn1[1] << ", " << bbcorn1[2] << " | " << bbcorn2[0] << ", " << bbcorn2[1] << ", " << bbcorn2[2];
|
||||||
|
llog << "\nlpos: " << hlq->pos_x << ", " << hlq->pos_y << ", " << hlq->pos_z;
|
||||||
|
llog << "\nx-/yvert: " << hlq->xverts << "/" << hlq->yverts << " size: " << size << " expected size: " << 30 + hlq->xverts*hlq->yverts*8 + hlq->xtiles*hlq->ytiles << std::endl;
|
||||||
|
llog.close(); */
|
||||||
|
}
|
||||||
|
f.seek((int)nextpos);
|
||||||
|
}
|
||||||
|
f.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData)
|
||||||
|
{
|
||||||
|
fwrite(&mogpFlags,sizeof(uint32),1,output);
|
||||||
|
fwrite(&groupWMOID,sizeof(uint32),1,output);
|
||||||
|
// group bound
|
||||||
|
fwrite(bbcorn1, sizeof(float), 3, output);
|
||||||
|
fwrite(bbcorn2, sizeof(float), 3, output);
|
||||||
|
fwrite(&liquflags,sizeof(uint32),1,output);
|
||||||
|
int nColTriangles = 0;
|
||||||
|
if(pPreciseVectorData)
|
||||||
|
{
|
||||||
|
char GRP[] = "GRP ";
|
||||||
|
fwrite(GRP,1,4,output);
|
||||||
|
|
||||||
|
int k = 0;
|
||||||
|
int moba_batch = moba_size/12;
|
||||||
|
MobaEx = new int[moba_batch*4];
|
||||||
|
for(int i=8; i<moba_size; i+=12)
|
||||||
|
{
|
||||||
|
MobaEx[k++] = MOBA[i];
|
||||||
|
}
|
||||||
|
int moba_size_grp = moba_batch*4+4;
|
||||||
|
fwrite(&moba_size_grp,4,1,output);
|
||||||
|
fwrite(&moba_batch,4,1,output);
|
||||||
|
fwrite(MobaEx,4,k,output);
|
||||||
|
delete [] MobaEx;
|
||||||
|
|
||||||
|
uint32 nIdexes = nTriangles * 3;
|
||||||
|
|
||||||
|
if(fwrite("INDX",4, 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file nbraches ID");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
int wsize = sizeof(uint32) + sizeof(unsigned short) * nIdexes;
|
||||||
|
if(fwrite(&wsize, sizeof(int), 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file wsize");
|
||||||
|
// no need to exit?
|
||||||
|
}
|
||||||
|
if(fwrite(&nIdexes, sizeof(uint32), 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file nIndexes");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if(nIdexes >0)
|
||||||
|
{
|
||||||
|
if(fwrite(MOVI, sizeof(unsigned short), nIdexes, output) != nIdexes)
|
||||||
|
{
|
||||||
|
printf("Error while writing file indexarray");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fwrite("VERT",4, 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file nbraches ID");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
wsize = sizeof(int) + sizeof(float) * 3 * nVertices;
|
||||||
|
if(fwrite(&wsize, sizeof(int), 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file wsize");
|
||||||
|
// no need to exit?
|
||||||
|
}
|
||||||
|
if(fwrite(&nVertices, sizeof(int), 1, output) != 1)
|
||||||
|
{
|
||||||
|
printf("Error while writing file nVertices");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
if(nVertices >0)
|
||||||
|
{
|
||||||
|
if(fwrite(MOVT, sizeof(float)*3, nVertices, output) != nVertices)
|
||||||
|
{
|
||||||
|
printf("Error while writing file vectors");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nColTriangles = nTriangles;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char GRP[] = "GRP ";
|
||||||
|
fwrite(GRP,1,4,output);
|
||||||
|
int k = 0;
|
||||||
|
int moba_batch = moba_size/12;
|
||||||
|
MobaEx = new int[moba_batch*4];
|
||||||
|
for(int i=8; i<moba_size; i+=12)
|
||||||
|
{
|
||||||
|
MobaEx[k++] = MOBA[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
int moba_size_grp = moba_batch*4+4;
|
||||||
|
fwrite(&moba_size_grp,4,1,output);
|
||||||
|
fwrite(&moba_batch,4,1,output);
|
||||||
|
fwrite(MobaEx,4,k,output);
|
||||||
|
delete [] MobaEx;
|
||||||
|
|
||||||
|
//-------INDX------------------------------------
|
||||||
|
//-------MOPY--------
|
||||||
|
MoviEx = new uint16[nTriangles*3]; // "worst case" size...
|
||||||
|
int *IndexRenum = new int[nVertices];
|
||||||
|
memset(IndexRenum, 0xFF, nVertices*sizeof(int));
|
||||||
|
for (int i=0; i<nTriangles; ++i)
|
||||||
|
{
|
||||||
|
// Skip no collision triangles
|
||||||
|
if (MOPY[2*i]&WMO_MATERIAL_NO_COLLISION ||
|
||||||
|
!(MOPY[2*i]&(WMO_MATERIAL_HINT|WMO_MATERIAL_COLLIDE_HIT)) )
|
||||||
|
continue;
|
||||||
|
// Use this triangle
|
||||||
|
for (int j=0; j<3; ++j)
|
||||||
|
{
|
||||||
|
IndexRenum[MOVI[3*i + j]] = 1;
|
||||||
|
MoviEx[3*nColTriangles + j] = MOVI[3*i + j];
|
||||||
|
}
|
||||||
|
++nColTriangles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign new vertex index numbers
|
||||||
|
int nColVertices = 0;
|
||||||
|
for (uint32 i=0; i<nVertices; ++i)
|
||||||
|
{
|
||||||
|
if (IndexRenum[i] == 1)
|
||||||
|
{
|
||||||
|
IndexRenum[i] = nColVertices;
|
||||||
|
++nColVertices;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// translate triangle indices to new numbers
|
||||||
|
for (int i=0; i<3*nColTriangles; ++i)
|
||||||
|
{
|
||||||
|
assert(MoviEx[i] < nVertices);
|
||||||
|
MoviEx[i] = IndexRenum[MoviEx[i]];
|
||||||
|
}
|
||||||
|
|
||||||
|
// write triangle indices
|
||||||
|
int INDX[] = {0x58444E49, nColTriangles*6+4, nColTriangles*3};
|
||||||
|
fwrite(INDX,4,3,output);
|
||||||
|
fwrite(MoviEx,2,nColTriangles*3,output);
|
||||||
|
|
||||||
|
// write vertices
|
||||||
|
int VERT[] = {0x54524556, nColVertices*3*sizeof(float)+4, nColVertices};// "VERT"
|
||||||
|
int check = 3*nColVertices;
|
||||||
|
fwrite(VERT,4,3,output);
|
||||||
|
for (uint32 i=0; i<nVertices; ++i)
|
||||||
|
if(IndexRenum[i] >= 0)
|
||||||
|
check -= fwrite(MOVT+3*i, sizeof(float), 3, output);
|
||||||
|
|
||||||
|
assert(check==0);
|
||||||
|
|
||||||
|
delete [] MoviEx;
|
||||||
|
delete [] IndexRenum;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------LIQU------------------------
|
||||||
|
if(LiquEx_size != 0)
|
||||||
|
{
|
||||||
|
int LIQU_h[] = {0x5551494C, sizeof(WMOLiquidHeader) + LiquEx_size + hlq->xtiles*hlq->ytiles};// "LIQU"
|
||||||
|
fwrite(LIQU_h, 4, 2, output);
|
||||||
|
|
||||||
|
// according to WoW.Dev Wiki:
|
||||||
|
uint32 liquidEntry;
|
||||||
|
if (rootWMO->liquidType & 4)
|
||||||
|
liquidEntry = liquidType;
|
||||||
|
else if (liquidType == 15)
|
||||||
|
liquidEntry = 0;
|
||||||
|
else
|
||||||
|
liquidEntry = liquidType + 1;
|
||||||
|
|
||||||
|
if (!liquidEntry)
|
||||||
|
{
|
||||||
|
int v1; // edx@1
|
||||||
|
int v2; // eax@1
|
||||||
|
|
||||||
|
v1 = hlq->xtiles * hlq->ytiles;
|
||||||
|
v2 = 0;
|
||||||
|
if (v1 > 0)
|
||||||
|
{
|
||||||
|
while ((LiquBytes[v2] & 0xF) == 15)
|
||||||
|
{
|
||||||
|
++v2;
|
||||||
|
if (v2 >= v1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v2 < v1 && (LiquBytes[v2] & 0xF) != 15)
|
||||||
|
liquidEntry = (LiquBytes[v2] & 0xF) + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (liquidEntry && liquidEntry < 21)
|
||||||
|
{
|
||||||
|
switch (((uint8)liquidEntry - 1) & 3)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
liquidEntry = ((mogpFlags & 0x80000) != 0) + 13;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
liquidEntry = 14;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
liquidEntry = 19;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
liquidEntry = 20;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hlq->type = liquidEntry;
|
||||||
|
|
||||||
|
/* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app);
|
||||||
|
llog << filename;
|
||||||
|
llog << ":\nliquidEntry: " << liquidEntry << " type: " << hlq->type << " (root:" << rootWMO->liquidType << " group:" << liquidType << ")\n";
|
||||||
|
llog.close(); */
|
||||||
|
|
||||||
|
fwrite(hlq, sizeof(WMOLiquidHeader), 1, output);
|
||||||
|
// only need height values, the other values are unknown anyway
|
||||||
|
for (uint32 i = 0; i<LiquEx_size/sizeof(WMOLiquidVert); ++i)
|
||||||
|
fwrite(&LiquEx[i].height, sizeof(float), 1, output);
|
||||||
|
// todo: compress to bit field
|
||||||
|
fwrite(LiquBytes, 1, hlq->xtiles*hlq->ytiles, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nColTriangles;
|
||||||
|
}
|
||||||
|
|
||||||
|
WMOGroup::~WMOGroup()
|
||||||
|
{
|
||||||
|
delete [] MOPY;
|
||||||
|
delete [] MOVI;
|
||||||
|
delete [] MOVT;
|
||||||
|
delete [] MOBA;
|
||||||
|
delete hlq;
|
||||||
|
delete [] LiquEx;
|
||||||
|
delete [] LiquBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile)
|
||||||
|
{
|
||||||
|
pos = Vec3D(0,0,0);
|
||||||
|
|
||||||
|
float ff[3];
|
||||||
|
f.read(&id, 4);
|
||||||
|
f.read(ff,12);
|
||||||
|
pos = Vec3D(ff[0],ff[1],ff[2]);
|
||||||
|
f.read(ff,12);
|
||||||
|
rot = Vec3D(ff[0],ff[1],ff[2]);
|
||||||
|
f.read(ff,12);
|
||||||
|
pos2 = Vec3D(ff[0],ff[1],ff[2]);
|
||||||
|
f.read(ff,12);
|
||||||
|
pos3 = Vec3D(ff[0],ff[1],ff[2]);
|
||||||
|
f.read(&d2,4);
|
||||||
|
|
||||||
|
uint16 trash,adtId;
|
||||||
|
f.read(&adtId,2);
|
||||||
|
f.read(&trash,2);
|
||||||
|
|
||||||
|
//-----------add_in _dir_file----------------
|
||||||
|
|
||||||
|
char tempname[512];
|
||||||
|
sprintf(tempname, "%s/%s", szWorkDirWmo, WmoInstName);
|
||||||
|
FILE *input;
|
||||||
|
input = fopen(tempname, "r+b");
|
||||||
|
|
||||||
|
if(!input)
|
||||||
|
{
|
||||||
|
printf("WMOInstance::WMOInstance: couldn't open %s\n", tempname);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(input, 8, SEEK_SET); // get the correct no of vertices
|
||||||
|
int nVertices;
|
||||||
|
fread(&nVertices, sizeof (int), 1, input);
|
||||||
|
fclose(input);
|
||||||
|
|
||||||
|
if(nVertices == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
float x,z;
|
||||||
|
x = pos.x;
|
||||||
|
z = pos.z;
|
||||||
|
if(x==0 && z == 0)
|
||||||
|
{
|
||||||
|
pos.x = 533.33333f*32;
|
||||||
|
pos.z = 533.33333f*32;
|
||||||
|
}
|
||||||
|
pos = fixCoords(pos);
|
||||||
|
pos2 = fixCoords(pos2);
|
||||||
|
pos3 = fixCoords(pos3);
|
||||||
|
|
||||||
|
float scale = 1.0f;
|
||||||
|
uint32 flags = MOD_HAS_BOUND;
|
||||||
|
if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN;
|
||||||
|
//write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, name
|
||||||
|
fwrite(&mapID, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&tileX, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&tileY, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&flags, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&adtId, sizeof(uint16), 1, pDirfile);
|
||||||
|
fwrite(&id, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(&pos, sizeof(float), 3, pDirfile);
|
||||||
|
fwrite(&rot, sizeof(float), 3, pDirfile);
|
||||||
|
fwrite(&scale, sizeof(float), 1, pDirfile);
|
||||||
|
fwrite(&pos2, sizeof(float), 3, pDirfile);
|
||||||
|
fwrite(&pos3, sizeof(float), 3, pDirfile);
|
||||||
|
uint32 nlen=strlen(WmoInstName);
|
||||||
|
fwrite(&nlen, sizeof(uint32), 1, pDirfile);
|
||||||
|
fwrite(WmoInstName, sizeof(char), nlen, pDirfile);
|
||||||
|
|
||||||
|
/* fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n",
|
||||||
|
MapName,
|
||||||
|
WmoInstName,
|
||||||
|
(float) x, (float) pos.y, (float) z,
|
||||||
|
(float) rot.x, (float) rot.y, (float) rot.z,
|
||||||
|
nVertices,
|
||||||
|
realx1, realy1,
|
||||||
|
realx2, realy2
|
||||||
|
); */
|
||||||
|
|
||||||
|
// fclose(dirfile);
|
||||||
|
}
|
||||||
136
contrib/vmap_extractor_v4/vmapextract/wmo.h
Normal file
136
contrib/vmap_extractor_v4/vmapextract/wmo.h
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2012 MaNGOS <http://getmangos.com/>
|
||||||
|
*
|
||||||
|
* 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef WMO_H
|
||||||
|
#define WMO_H
|
||||||
|
#define TILESIZE (533.33333f)
|
||||||
|
#define CHUNKSIZE ((TILESIZE) / 16.0f)
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
#include "vec3d.h"
|
||||||
|
#include "mpqfile.h"
|
||||||
|
|
||||||
|
// MOPY flags
|
||||||
|
#define WMO_MATERIAL_NOCAMCOLLIDE 0x01
|
||||||
|
#define WMO_MATERIAL_DETAIL 0x02
|
||||||
|
#define WMO_MATERIAL_NO_COLLISION 0x04
|
||||||
|
#define WMO_MATERIAL_HINT 0x08
|
||||||
|
#define WMO_MATERIAL_RENDER 0x10
|
||||||
|
#define WMO_MATERIAL_COLLIDE_HIT 0x20
|
||||||
|
#define WMO_MATERIAL_WALL_SURFACE 0x40
|
||||||
|
|
||||||
|
class WMOInstance;
|
||||||
|
class WMOManager;
|
||||||
|
class MPQFile;
|
||||||
|
|
||||||
|
/* 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); }
|
||||||
|
|
||||||
|
class WMORoot
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
uint32 nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootWMOID, liquidType;
|
||||||
|
unsigned int col;
|
||||||
|
float bbcorn1[3];
|
||||||
|
float bbcorn2[3];
|
||||||
|
|
||||||
|
WMORoot(std::string &filename);
|
||||||
|
~WMORoot();
|
||||||
|
|
||||||
|
bool open();
|
||||||
|
bool ConvertToVMAPRootWmo(FILE *output);
|
||||||
|
private:
|
||||||
|
std::string filename;
|
||||||
|
char outfilename;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WMOLiquidHeader
|
||||||
|
{
|
||||||
|
int xverts, yverts, xtiles, ytiles;
|
||||||
|
float pos_x;
|
||||||
|
float pos_y;
|
||||||
|
float pos_z;
|
||||||
|
short type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WMOLiquidVert
|
||||||
|
{
|
||||||
|
uint16 unk1;
|
||||||
|
uint16 unk2;
|
||||||
|
float height;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WMOGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// MOGP
|
||||||
|
int groupName, descGroupName, mogpFlags;
|
||||||
|
float bbcorn1[3];
|
||||||
|
float bbcorn2[3];
|
||||||
|
uint16 moprIdx;
|
||||||
|
uint16 moprNItems;
|
||||||
|
uint16 nBatchA;
|
||||||
|
uint16 nBatchB;
|
||||||
|
uint32 nBatchC, fogIdx, liquidType, groupWMOID;
|
||||||
|
|
||||||
|
int mopy_size,moba_size;
|
||||||
|
int LiquEx_size;
|
||||||
|
unsigned int nVertices; // number when loaded
|
||||||
|
int nTriangles; // number when loaded
|
||||||
|
char *MOPY;
|
||||||
|
uint16 *MOVI;
|
||||||
|
uint16 *MoviEx;
|
||||||
|
float *MOVT;
|
||||||
|
uint16 *MOBA;
|
||||||
|
int *MobaEx;
|
||||||
|
WMOLiquidHeader *hlq;
|
||||||
|
WMOLiquidVert *LiquEx;
|
||||||
|
char *LiquBytes;
|
||||||
|
uint32 liquflags;
|
||||||
|
|
||||||
|
WMOGroup(std::string &filename);
|
||||||
|
~WMOGroup();
|
||||||
|
|
||||||
|
bool open();
|
||||||
|
int ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string filename;
|
||||||
|
char outfilename;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WMOInstance
|
||||||
|
{
|
||||||
|
static std::set<int> ids;
|
||||||
|
public:
|
||||||
|
std::string MapName;
|
||||||
|
int currx;
|
||||||
|
int curry;
|
||||||
|
WMOGroup *wmo;
|
||||||
|
Vec3D pos;
|
||||||
|
Vec3D pos2, pos3, rot;
|
||||||
|
uint32 indx,id, d2, d3;
|
||||||
|
int doodadset;
|
||||||
|
|
||||||
|
WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile);
|
||||||
|
|
||||||
|
static void reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
110
contrib/vmap_extractor_v4/win/VC100/vmapExtractor4.vcxproj
Normal file
110
contrib/vmap_extractor_v4/win/VC100/vmapExtractor4.vcxproj
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}</ProjectGuid>
|
||||||
|
<RootNamespace>vmapExtractor4</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\bin\$(Platform)_$(Configuration)\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\$(ProjectName)__$(Platform)_$(Configuration)\</IntDir>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\bin\$(Platform)_$(Configuration)\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\bin\$(ProjectName)__$(Platform)_$(Configuration)\</IntDir>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\..\dep\StormLib\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>..\..\..\..\dep\StormLib\bin\StormLib\$(Platform)\$(Configuration)AD;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||||
|
<DataExecutionPrevention>
|
||||||
|
</DataExecutionPrevention>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<AdditionalIncludeDirectories>..\..\..\..\dep\StormLib\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>StormLibRAD.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>..\..\..\..\dep\StormLib\bin\StormLib\$(Platform)\$(Configuration)AD;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<GenerateDebugInformation>false</GenerateDebugInformation>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\vmapextract\adtfile.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\dbcfile.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\model.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\mpqfile.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\vmapexport.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\wdtfile.cpp" />
|
||||||
|
<ClCompile Include="..\..\vmapextract\wmo.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\vmapextract\adtfile.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\dbcfile.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\model.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\modelheaders.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\mpqfile.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\vec3d.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\vmapexport.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\wdtfile.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\wmo.h" />
|
||||||
|
<ClInclude Include="..\..\vmapextract\loadlib\loadlib.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\vmapextract\adtfile.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\dbcfile.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\model.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\mpqfile.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\vmapexport.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\wdtfile.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\vmapextract\wmo.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\vmapextract\dbcfile.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\adtfile.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\loadlib\loadlib.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\model.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\mpqfile.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\modelheaders.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\vmapexport.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\vec3d.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\wdtfile.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\vmapextract\wmo.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{77920bff-80f2-4d57-8efb-d36d461d04a4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{093fdfc3-8861-4d64-9c5e-4a58337b9c7e}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
||||||
246
contrib/vmap_extractor_v4/win/VC90/vmapExtractor3.vcproj
Normal file
246
contrib/vmap_extractor_v4/win/VC90/vmapExtractor3.vcproj
Normal file
|
|
@ -0,0 +1,246 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="vmapExtractor3"
|
||||||
|
ProjectGUID="{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}"
|
||||||
|
RootNamespace="vmapExtractor3"
|
||||||
|
TargetFrameworkVersion="196613"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="..\..\bin\$(PlatformName)_$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="..\bin\$(ProjectName)__$(PlatformName)_$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\..\dep\libmpq;..\..\..\..\dep\include\zlib;..\..\..\..\dep\libmpq\win"
|
||||||
|
PreprocessorDefinitions="WIN32;USE_LIBMPQ04"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="libmpq.lib"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\..\dep\libmpq\bin\$(PlatformName)_$(ConfigurationName)"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="..\..\bin\$(PlatformName)_$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="..\bin\$(ProjectName)__$(PlatformName)_$(ConfigurationName)"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2"
|
||||||
|
WholeProgramOptimization="1"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
EnableIntrinsicFunctions="true"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\..\dep\libmpq;..\..\..\..\dep\include\zlib;..\..\..\..\dep\libmpq\win"
|
||||||
|
PreprocessorDefinitions="WIN32;USE_LIBMPQ04"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="libmpq.lib"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\..\dep\libmpq\bin\$(PlatformName)_$(ConfigurationName)"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="vmapextractor"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\adtfile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\adtfile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\dbcfile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\dbcfile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\model.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\model.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\modelheaders.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\mpq_libmpq.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\mpq_libmpq04.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\vec3d.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\vmapexport.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\vmapexport.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\wdtfile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\wdtfile.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\wmo.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\wmo.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="loadlib"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\vmapextract\loadlib\loadlib.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
116
contrib/vmap_extractor_v4/win/vmapExtractor4_VC100.sln
Normal file
116
contrib/vmap_extractor_v4/win/vmapExtractor4_VC100.sln
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
|
# Visual Studio 2010
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor4", "VC100\vmapExtractor4.vcxproj", "{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055} = {78424708-1F6E-4D4B-920C-FB6D26847055}
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C} = {B96F612A-C91D-43B3-A4C3-D4294817EC6C}
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} = {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\..\..\win\VC100\zlib.vcxproj", "{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "..\..\..\win\VC100\bzip2.vcxproj", "{B96F612A-C91D-43B3-A4C3-D4294817EC6C}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StormLib", "..\..\..\dep\StormLib\StormLib.vcxproj", "{78424708-1F6E-4D4B-920C-FB6D26847055}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
DebugAD|Win32 = DebugAD|Win32
|
||||||
|
DebugAD|x64 = DebugAD|x64
|
||||||
|
DebugAS|Win32 = DebugAS|Win32
|
||||||
|
DebugAS|x64 = DebugAS|x64
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
ReleaseAD|Win32 = ReleaseAD|Win32
|
||||||
|
ReleaseAD|x64 = ReleaseAD|x64
|
||||||
|
ReleaseAS|Win32 = ReleaseAS|Win32
|
||||||
|
ReleaseAS|x64 = ReleaseAS|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAD|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAD|Win32.Build.0 = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAD|x64.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAS|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAS|Win32.Build.0 = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.DebugAS|x64.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|x64.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAD|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAD|Win32.Build.0 = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAD|x64.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAS|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAS|Win32.Build.0 = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.ReleaseAS|x64.ActiveCfg = Release|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAD|Win32.ActiveCfg = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAD|x64.ActiveCfg = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAD|x64.Build.0 = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAS|Win32.ActiveCfg = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAS|x64.ActiveCfg = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.DebugAS|x64.Build.0 = Debug|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|x64.Build.0 = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAD|Win32.ActiveCfg = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAD|x64.ActiveCfg = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAD|x64.Build.0 = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAS|Win32.ActiveCfg = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAS|x64.ActiveCfg = Release|x64
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.ReleaseAS|x64.Build.0 = Release|x64
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAD|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAD|Win32.Build.0 = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAD|x64.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAS|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAS|Win32.Build.0 = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.DebugAS|x64.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|x64.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAD|Win32.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAD|Win32.Build.0 = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAD|x64.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAS|Win32.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAS|Win32.Build.0 = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.ReleaseAS|x64.ActiveCfg = Release|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Debug|Win32.ActiveCfg = DebugAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Debug|Win32.Build.0 = DebugAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Debug|x64.ActiveCfg = DebugAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Debug|x64.Build.0 = DebugAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAD|Win32.ActiveCfg = DebugAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAD|Win32.Build.0 = DebugAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAD|x64.ActiveCfg = DebugAD|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAD|x64.Build.0 = DebugAD|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAS|Win32.ActiveCfg = DebugAS|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAS|Win32.Build.0 = DebugAS|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAS|x64.ActiveCfg = DebugAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.DebugAS|x64.Build.0 = DebugAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Release|Win32.ActiveCfg = ReleaseAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Release|Win32.Build.0 = ReleaseAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Release|x64.ActiveCfg = ReleaseAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.Release|x64.Build.0 = ReleaseAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAD|Win32.ActiveCfg = ReleaseAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAD|Win32.Build.0 = ReleaseAD|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAD|x64.ActiveCfg = ReleaseAD|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAD|x64.Build.0 = ReleaseAD|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAS|Win32.ActiveCfg = ReleaseAS|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAS|Win32.Build.0 = ReleaseAS|Win32
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAS|x64.ActiveCfg = ReleaseAS|x64
|
||||||
|
{78424708-1F6E-4D4B-920C-FB6D26847055}.ReleaseAS|x64.Build.0 = ReleaseAS|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
42
contrib/vmap_extractor_v4/win/vmapExtractor4_VC90.sln
Normal file
42
contrib/vmap_extractor_v4/win/vmapExtractor4_VC90.sln
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor3", "VC90\vmapExtractor3.vcproj", "{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C} = {B96F612A-C91D-43B3-A4C3-D4294817EC6C}
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} = {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}
|
||||||
|
{03AB0F44-628E-4855-99A0-C98A1EB52C50} = {03AB0F44-628E-4855-99A0-C98A1EB52C50}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpq", "..\..\..\dep\libmpq\win\VC90\libmpq.vcproj", "{03AB0F44-628E-4855-99A0-C98A1EB52C50}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\..\..\win\VC90\zlib.vcproj", "{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "..\..\..\win\VC90\bzip2.vcproj", "{B96F612A-C91D-43B3-A4C3-D4294817EC6C}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
|
|
@ -24,8 +24,8 @@
|
||||||
|
|
||||||
namespace VMAP
|
namespace VMAP
|
||||||
{
|
{
|
||||||
const char VMAP_MAGIC[] = "VMAP_3.0"; // used in final vmap files
|
const char VMAP_MAGIC[] = "VMAP_4.0"; // used in final vmap files
|
||||||
const char RAW_VMAP_MAGIC[] = "VMAP003"; // used in extracted vmap files with raw data
|
const char RAW_VMAP_MAGIC[] = "VMAP004"; // used in extracted vmap files with raw data
|
||||||
|
|
||||||
// defined in TileAssembler.cpp currently...
|
// defined in TileAssembler.cpp currently...
|
||||||
bool readChunk(FILE* rf, char* dest, const char* compare, uint32 len);
|
bool readChunk(FILE* rf, char* dest, const char* compare, uint32 len);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "0138"
|
#define REVISION_NR "0139"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue