[Core] Implement holes handling on map. Now GetHeight correctly returns no height when a hole is detected. This is very useful in vmap object because in some cases we had a bad value returned by map data wich makes it hard to choose the right height. (c2617)

This commit is contained in:
cyberium 2015-03-26 10:14:51 +00:00 committed by Antz
parent 57f1039ece
commit 4de5fa3543
3 changed files with 44 additions and 11 deletions

View File

@ -1 +1 @@
rUzt6Qdc4EKKtuvr7m2AqM9iQu/Ewo17ul9iktjbtIC4oSTjYtD9kk4xk+lvxAFg2soaw2cvIWw2aArt5lanaEXCgQbziGFOk+7xyiNL8L5EYI1Z1ktvsKuftuPexVFyu57ZCenLn4Yj8EDgqWTNxpVvapEegDOlNhNZommyoRuK1XsXlRPk7cUkSwV5kakiBUOapjUKnZhssMo4q7ldSvJswCqBerGlroqgF4z7/XfFMerFuI92ZKSR0qHamD/qiXxmno0DM7EhzaxgudUEmTBKoG2zw/id0IU4D+xLjwD6OnpHqUwtH0X1Ic4ol+1jyn8lqgthckiEPVjdtlnXqobUm+VTR7D/s2UOEtVAwGbWUz6VeCDqv9yJKMlYkanahjZz/SWR1hRK2O0NL9HMgeid/n+mUs9rnMf/OyUl9sI9MYwEbXNPoUr8duEs62zxus4jErTG69lKxlZ9CW0reyUJkGuX1OUT1N3YoAuLn1ByUWjwbc4cHIIyG75//EO4DYf5twXNV3GG6n/0cFPoRQEu3A9Kof5YFjE40Y5eDYKMhw7y6pAhVgmN08N99lNLvVaQkiaE9udlPcG3+w+hU69SYhPUlXAeMMLo8YLJz3LpH9GxThfm8O6r8VxXJuXYjciEWMn23L3LrGDLZuIL7X60KjZVKACBHERrHnOY4SAx/i4ZG1DXoVNn1NNxIOo82i0cEyA4O+AsXAehPDfSrKMQCztvspLSO7AqWs3tztQESfNrGwZ3md0oy0ThvmFamHKGogyx1EMvnDlW+1zKt77ZUzYCbKL313eAFo0nd+neQRpO6RuNWIXnO3QHrorPQwC0LBV6CbfFLQ+Gkc0vSVHEMWIikHEd/oRgKyovCT5gY5/aonApxW1Z+8kJoRPLrObcQAUmc71cZi0wYMg8SOVMnX3tTSZSN8uSlpat3ZCCUj/MpMeFRfWVmOhLNa2ys9gPr7B0or6BlBVwB+zQP1PXw0y/oAoqoFsYvUbSUyMxHtZ6NBEcyorY3xnMKrvq8uEZmp/AvEltfWuBFbtf+6xzWELdDYhKNkBwZSxfGizH20abksycEtZhN92IusWgt0ZyapyFPOdrhtlUKo/Ao45T1aUp4JyeiY6SgiObacIr2h5myV6SNK3k45eHxEQ/kKHfrza2ZdJWvWKICe/DcE4wMCiqHjIJvcGCFEwSVUSN2jaihi/vWXgM9mv1QD2RqySxMQoSvlSqYRxP0eezm5vsfcTwv67H9HUp4Tmve96ZrFxDXjnCuZSXZf9pJOKSGC/puuW8MF9eZ5JFYjZbeqOJd8JWR+7wRW0jmj5jTXTO0mFT1vgWdAz0rAH44C0okdwOWio2ztozZnhaeRZfUQQF4+B4kp/2KmABa8IVga7Hp2fguSiqx6h/Qkf0WwnUkwUF4laI5NR5xJUA4EAHDqjbfHpFAn23rdSTqoGDkQTPu3jXnE4OLh2ZyyIsEZVg+/FahgQEY6qkwNhQx5Rg700ltapiUIYNYxmlB8nXOoutX8eqfus/ozj09+c8FpAkSepXzdRfgdlIyLy1ahfxF9Oqg014n0QkgVLkzxLFbjoTp+Ivis/HyvjyE75MRA+Mntdcaj9vPliz1Baa5qcrB4wg7ZZHAEKHf9QN2z5mil8fjhhPBbNUBMKKs7q2jizF0jgWrrxiEqhzNuFbECFfsLqHgpv7rzyH1zlMMAiWTr1ISjkUFnr+Ya/y9YBVMKg3VLH3d8h5YcQbuV5sHFzha1LKCmiz4H/87ZTzP1qEBYumPLGmOvyOjxY24bzSjE2wf/nlJv0kltXLQAcjb+d2MP0AAIGWPlwQkd8snBkbAbXWf2IZ8safxhJ8395m3LmpzvyiwRm5ma51w43icnCi1rflPFP9wjgMA4zNRzTzhBcCd8GWmmJHkULlq3d4Qu6h7KfaZccu4QsbW/z2AmkZ2VJeKTNi4pwsda4UU17XwdClCDtEHakaZ9m2Zb6Bb4zEyY7o2TwI3m3engWr06TDPd15n9Afa82oKFeumt2EkB9wApnHvMY2Nrhs0CNqojfIzJixAqSJQohXSj9ZL/Orf8rPAqgoDPfKksFz8nqQxpz1Hfi4vY+oPqfntSIKkeLd+oCf5U7jjGMGVwzEG8BF6CYNUURp2T2Jn+SOYeVMUDmgIv1Xb0ADdcSg7Q8Wrg4X5q0ZRvlAd+wlriZjytSKkgeyXQ8HykO/wZ3EjqP5tJItx4Sr3Yt8G5Q0NW7EA8CxsNNX6iFYOl1j1TcLnmeHIVOwhbR1h0+dr3j4Iq/hsgpg9QHYLk+8z0/XV+r/QgDeJICEmT0dvWxoBGzgrOllfNSgOIExuOX/hdGs4DMjutOebHgFuVJ+JwSlvEr0uIBxu9g10CDQJFSWoXasK1D/GvnyR4qhYaN9ofmiTgsOBSVAIznWRffo4s8uZfJwwb9wAzQOKF2F8N1hHyRR+yKBmNLZaDbRj6nlOq6ljMVz20SIFFtLdfp9IfZjd54NG2PuR2+FBh4EqVTWUVWT+GS21/mxpjBhSwHxZBGe88L90jWULyHZ5cRnfuvwvUSyikjXJX6lkCZvcvHCOCPLvBdpv56dMIB/mXyd/c2TJBLgk0ifQgxOXd17ihaKRa8VTZC2vC/aGDeInRTTdxj0g8jogthyI5h/uSYCpc0AiPtTjdwMb9Fvoc4Y5NVKDdnmYzt5+54q4wQ+ftgud7VnOEWdzNQqBg5MPqJmKrGeHFTcCmqfubPsQJEVOJaxSnYJ3bvwQ4MUq0AQIK5tJR+LY5WUKjYcK//4dkq+RAlCijJnnq12L0l5TM+fMcA/uzKaZvHS6uzUI5CSWI2vRZ7etuFMs2SiNFQawhVjAw79VAVRXuYEz3xUxhIZiMMpGakw4eZ1+jHafl02uk4BZX/kWUzDAdy+v9AdYz/DC9ur0F/gj4RudniP3L//XXEmVlvcn9R2TWbw8WPPEBEYht6//6uSPkJcKUEGcyHwSC+Rvdcd78gxRlfH1ub+YXgPVIGprjx9gTH0r9ZT4Jz03Xy9hiNTg6Hpdj3jW0GQpEu0E9dlm5D=
rUzt6Qdc4EKKtuvr7m2AqM9iQu/Ewo17ul9iktjbtIC4oSTjYtD9kk4xk+lvxAFg2soaw2cvIWw2aArt5lanaEXCgQbziGFOk+7xyiNL8L5EYI1Z1ktvsKuftuPexVFyu57ZCenLn4Yj8EDgqWTNxL4nZK0uMedfxrmmCuw4hiXifoYapwlH0ad6w/mngprR1iFaCvL1jo84duiY57eigzJCvQf8ad15UFWDHLCjz2H31GPlQky/i5Vqp4melvOUcr7Gw6xgpE8QN4r2L5meTh1LaZVME60Cvw5Y52jKY8ILGD2/QqIZrwRzKtT2r+qnaTaRJGbb2Zc2IdE8Qy/e6rwg490XEnLM2jeKfSO8WLY7jtRKyvXq+hx6jzVUj/xx+ROkJ8L8I24p4Mo9BV+CLJQr/pUjXq4NOQORb/15K9wQKsTI4uh/ctyQ0Ybxs6wTZqSN5qmD91xdtrlOq6CN/2v1nzbC5+QGMhQ5giKzS248UXa+dSrRIDsEgqYUr5MhgkY9ZXGjMGYe2z1v8DowAo6Mjn5iahxwAUucHan7vxs3kwWcFaTM60508cMcw+xSjEsRPODBsPcRI+6e42aG0tBNhgG0PelwWfvm1OG1uKwFTBNAi/rB+pToEkXTZh/Gkjmz41LcBWqz8/qyWS4gzXNawCsgBU+F/eMYbiKl1ELOV1uVvccyRhjsrC7xkOIDf0ur1cZUeHMQTOQhMlct2l6L3++JanR8LTqa2dVAgsJHqQCxuG3mmvBmaE8zdOniDd18VkhN0IrTtHFpcBQPqpnchSoy0ogw9wU/aH9iGEu+HSXRNmGRU/06H9awpyPzkTF93CCA+VVWdIUPIb7AHRDemhYFPmoBcYkUs7BoOe28Ms43aWuR73MPvVYipkeiCBvDjZbOOF66H2VUxisBaMvYvU57J51f+2rbTGN+6iI2iUrRbE31Do84rw/4OhxRLLvung00uiS+vz3lAdG3qwgUSi+eWZFR91N8w+IuhxnCtvrr59Ws1j6hrgla69Rbv57HM28jUjmhzeQIGzoZ4vHiVCHaIrwh6ayqb+VgYQriICcKny7btVc9U7eXYk6mFA1zlsDnhKkXTulOQWQc5TB1mZdMjRajegvbOxAgljI5ZC5I+aDFpGL/iteKsanX3iIT/LajD8U2TqJQhi1FZ3/BYmbySFnbn62EE83Yl+K+BHcw2CJ8PDMs/G/8+mW2opO5X3z1ocmmWDjgkHdIvuX+ah05kK6P+1jYOMWg+aysWAovRNTPm3sNrYXCLUq6s2nji8WZcbJAHna7lPFctt1ZReMKpWmgK8Q9fM9ryMYFPo8Aw4f5HW3GTpNw8QE4X6/LfIwAo3Rhjd1w2wbqeqMOx3CE9yls/l4Vnjzi8qSTQnp0Fg6pIa9Kr4XSWpevKt822cj5EyfI1ilLDWPmIiaf9Kh+LrgQaHHUcDmuc9AZdgcXr5HrbufDizS+CVAtNRMJP2TtZUm0WEHrC2KUIyyuNoKDij62ixA5ouVKexzcNQKVpxR9jAhjj/vm7qBOVSb0yYa5QTxOX3g0+RvJUFGowmxMFUGSQniw5XgYUUG2YdycQj72BjYY3PJgoBGFTP8JgVEXb73kXMDlk3vTdwCEjfo7KUu/9pkm1kosZhW69Wh+q7m376HX32hvHRARdblltYqLFOMPrpKVpIRt3fXr48zastl6LTHtLIiWJY8vHBNtWPIr2ccMGVTgOQXMHiFMWpTLYf+RW14HwtsxWjVhoEkk6E7NzueXzNhqfeMJT6g3gFBYAGfeggvJfdU3+OSiiBaxMI+R+4JmxEtx87IUJ2Htx9Is5Cu+86W6uB5Pfqh3xdoyY5AyjOHJBNeS3oYu6eTLiNFBwAsuJ5YljZTwObyVvCSaCVUrwPECMxUUtQZ2Fm1YHfM6BbSDgGDzhpo6rCQmWoRQpLVp/50oXUcHmYeZAro5b9JSGSvvjImRfQSUzUKR6jTDBJeb0mAYStbreeil+Z6EfKaFD1SbwxmXZXNbbdQL2yagLBFBxk8Cb9BNeUqLkswHLG/zieq+h+nFZfdbIWsGSOK2b59pKD9Yfi8yMNwoABII4oFL2CnfOB5I8ApBcU6VL1CYdrw0BwITaC/zSbEap4TVjcQhkuiQRbavGHpC9u5yBzyLzO3+CkKARjjDh3ctxAt/qq7zthlS594gEsXtgfd7pa6sSME23pkUuvwYxpEBebzqYWeTqtXrFDZjr7LNkKMz6qr3NYpFTf8td5ErBPojidlrPc84wNJ3PsDUIr8NlTDysgRrYDAX2udz3pz0LwOULi7/R7zXF5MvxY+F4NUUfdkQC0wOUJoql31wVPIsXnBXLs/i2z2d+xCukUbJpcVs6brm4dKG9WNw8zdgZw6aTGmlpgKpRfi5U0hmDj5KVem9lWliK2Bt2AKvR3sqKa5jMDZkAB+u63F7/r/movEYabJXLJSykXvdVZhOLm3gKFb9K0W0n8MCfjXZ6xoWyJ5675VVKG9Qk2dBGoTACr4zHulXX+CofdH8H9o+p4zqYi5vSOqhespvSXP105s9W2r3hpEtXSMpkEBzfTrV5CWpx0a7LHW9+aYpM3VPPzxx0N+mSUbnVYGp/27rwrwjb0scty57l3uXQQsPlWhAAA93W/Phw6W6VmoSvyJC9vm2EiPozpfswQJxuE1m8aAc8BnZOPBl8O8INRz6VjIAoQzScrzHEPEg/n0AXqwstMtshVbFK1pIYNr+xrO/uRKKK+IhgVroDWJbGM449ItjriFgLnIt0bfLyV8VBjAVjKfcd382CbFY5+G7GfIpr82PuZ+uhiAOskHdqy9VGq67cBSFxceoWpzLbbrOU8h5XEuaswl8VFnOgcPDqQ+GNv4w2JCZV2OMm7VAHbSm8vkf9tjigEvZEWe/uPiPr0a0huhtxLI8+xsxJT6UPLmYwz61Wy9sGQDeDykldLkZCzzHckC+flwSGUqucYWluD/E+F9MwNC4BML=

View File

@ -42,6 +42,9 @@ char const* MAP_AREA_MAGIC = "AREA";
char const* MAP_HEIGHT_MAGIC = "MHGT";
char const* MAP_LIQUID_MAGIC = "MLIQ";
static uint16 holetab_h[4] = { 0x1111, 0x2222, 0x4444, 0x8888 };
static uint16 holetab_v[4] = { 0x000F, 0x00F0, 0x0F00, 0xF000 };
GridMap::GridMap()
{
m_flags = 0;
@ -55,6 +58,7 @@ GridMap::GridMap()
m_gridGetHeight = &GridMap::getHeightFromFlat;
m_V9 = NULL;
m_V8 = NULL;
memset(m_holes, 0, sizeof(m_holes));
// Liquid data
m_liquidType = 0;
@ -84,16 +88,9 @@ bool GridMap::loadData(char* filename)
if (!in)
{ return true; }
size_t file_read = fread(&header, sizeof(header), 1, in);
if (file_read <= 0)
{
sLog.outError("Error loading map area data\n");
fclose(in);
return false;
}
fread(&header, sizeof(header), 1, in);
if (header.mapMagic == *((uint32 const*)(MAP_MAGIC)) &&
header.versionMagic == *((uint32 const*)(MAP_VERSION_MAGIC)))
header.versionMagic == *((uint32 const*)(MAP_VERSION_MAGIC)))
{
// loadup area data
if (header.areaMapOffset && !loadAreaData(in, header.areaMapOffset, header.areaMapSize))
@ -103,6 +100,14 @@ bool GridMap::loadData(char* filename)
return false;
}
// loadup holes data
if (header.holesOffset && !loadHolesData(in, header.holesOffset, header.holesSize))
{
sLog.outError("Error loading map holes data\n");
fclose(in);
return false;
}
// loadup height data
if (header.heightMapOffset && !loadHeightData(in, header.heightMapOffset, header.heightMapSize))
{
@ -226,6 +231,16 @@ bool GridMap::loadHeightData(FILE* in, uint32 offset, uint32 /*size*/)
return true;
}
bool GridMap::loadHolesData(FILE* in, uint32 offset, uint32 size)
{
if (fseek(in, offset, SEEK_SET) != 0)
return false;
if (fread(&m_holes, sizeof(m_holes), 1, in) != 1)
return false;
return true;
}
bool GridMap::loadGridMapLiquidData(FILE* in, uint32 offset, uint32 /*size*/)
{
GridMapLiquidHeader header;
@ -284,10 +299,22 @@ float GridMap::getHeightFromFlat(float /*x*/, float /*y*/) const
return m_gridHeight;
}
bool GridMap::isHole(int row, int col) const
{
int cellRow = row / 8; // 8 squares per cell
int cellCol = col / 8;
int holeRow = row % 8 / 2;
int holeCol = (col - (cellCol * 8)) / 2;
uint16 hole = m_holes[cellRow][cellCol];
return (hole & holetab_h[holeCol] & holetab_v[holeRow]) != 0;
}
float GridMap::getHeightFromFloat(float x, float y) const
{
if (!m_V8 || !m_V9)
{ return m_gridHeight; }
{ return INVALID_HEIGHT_VALUE; }
x = MAP_RESOLUTION * (32 - x / SIZE_OF_GRIDS);
y = MAP_RESOLUTION * (32 - y / SIZE_OF_GRIDS);
@ -299,6 +326,9 @@ float GridMap::getHeightFromFloat(float x, float y) const
x_int &= (MAP_RESOLUTION - 1);
y_int &= (MAP_RESOLUTION - 1);
if (isHole(x_int, y_int))
return INVALID_HEIGHT_VALUE;
// Height stored as: h5 - its v8 grid, h1-h4 - its v9 grid
// +--------------> X
// | h1-------h2 Coordinates is:

View File

@ -126,6 +126,7 @@ class GridMap
{
private:
uint16 m_holes[16][16];
uint32 m_flags;
// Area data
@ -162,6 +163,8 @@ class GridMap
bool loadAreaData(FILE* in, uint32 offset, uint32 size);
bool loadHeightData(FILE* in, uint32 offset, uint32 size);
bool loadGridMapLiquidData(FILE* in, uint32 offset, uint32 size);
bool loadHolesData(FILE* in, uint32 offset, uint32 size);
bool isHole(int row, int col) const;
// Get height functions and pointers
typedef float(GridMap::*pGetHeightPtr)(float x, float y) const;