Fix rcMergePolyMeshes() ignoring portals of input meshes.
Copy the portals from input meshes on border to the output mesh.
This commit is contained in:
parent
19e2d8dbe6
commit
77ebf64353
@ -1324,6 +1324,12 @@ bool rcMergePolyMeshes(rcContext* ctx, rcPolyMesh** meshes, const int nmeshes, r
|
|||||||
const unsigned short ox = (unsigned short)floorf((pmesh->bmin[0]-mesh.bmin[0])/mesh.cs+0.5f);
|
const unsigned short ox = (unsigned short)floorf((pmesh->bmin[0]-mesh.bmin[0])/mesh.cs+0.5f);
|
||||||
const unsigned short oz = (unsigned short)floorf((pmesh->bmin[2]-mesh.bmin[2])/mesh.cs+0.5f);
|
const unsigned short oz = (unsigned short)floorf((pmesh->bmin[2]-mesh.bmin[2])/mesh.cs+0.5f);
|
||||||
|
|
||||||
|
bool isMinX = (ox == 0);
|
||||||
|
bool isMinZ = (oz == 0);
|
||||||
|
bool isMaxX = ((unsigned short)floorf((mesh.bmax[0] - pmesh->bmax[0]) / mesh.cs + 0.5f)) == 0;
|
||||||
|
bool isMaxZ = ((unsigned short)floorf((mesh.bmax[2] - pmesh->bmax[2]) / mesh.cs + 0.5f)) == 0;
|
||||||
|
bool isOnBorder = (isMinX || isMinZ || isMaxX || isMaxZ);
|
||||||
|
|
||||||
for (int j = 0; j < pmesh->nverts; ++j)
|
for (int j = 0; j < pmesh->nverts; ++j)
|
||||||
{
|
{
|
||||||
unsigned short* v = &pmesh->verts[j*3];
|
unsigned short* v = &pmesh->verts[j*3];
|
||||||
@ -1344,6 +1350,36 @@ bool rcMergePolyMeshes(rcContext* ctx, rcPolyMesh** meshes, const int nmeshes, r
|
|||||||
if (src[k] == RC_MESH_NULL_IDX) break;
|
if (src[k] == RC_MESH_NULL_IDX) break;
|
||||||
tgt[k] = vremap[src[k]];
|
tgt[k] = vremap[src[k]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isOnBorder)
|
||||||
|
{
|
||||||
|
for (int k = mesh.nvp; k < mesh.nvp * 2; ++k)
|
||||||
|
{
|
||||||
|
if (src[k] & 0x8000 && src[k] != 0xffff)
|
||||||
|
{
|
||||||
|
unsigned short dir = src[k] & 0xf;
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case 0: // Portal x-
|
||||||
|
if (isMinX)
|
||||||
|
tgt[k] = src[k];
|
||||||
|
break;
|
||||||
|
case 1: // Portal z+
|
||||||
|
if (isMaxZ)
|
||||||
|
tgt[k] = src[k];
|
||||||
|
break;
|
||||||
|
case 2: // Portal x+
|
||||||
|
if (isMaxX)
|
||||||
|
tgt[k] = src[k];
|
||||||
|
break;
|
||||||
|
case 3: // Portal z-
|
||||||
|
if (isMinZ)
|
||||||
|
tgt[k] = src[k];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user