Detail mesh is calculated in tile local coordinates for better floating point accuracy.
This commit is contained in:
parent
7b7f0e6fb9
commit
f77a7511ed
@ -192,10 +192,10 @@ static float distToPoly(int nvert, const float* verts, const float* p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static unsigned short getHeight(const float* pos, const float* bmin, const float cs, const float ics, const rcHeightPatch& hp)
|
static unsigned short getHeight(const float* pos, const float cs, const float ics, const rcHeightPatch& hp)
|
||||||
{
|
{
|
||||||
int ix = (int)floorf((pos[0]-bmin[0])*ics + 0.01f);
|
int ix = (int)floorf(pos[0]*ics + 0.01f);
|
||||||
int iz = (int)floorf((pos[2]-bmin[2])*ics + 0.01f);
|
int iz = (int)floorf(pos[2]*ics + 0.01f);
|
||||||
ix = rcClamp(ix-hp.xmin, 0, hp.width);
|
ix = rcClamp(ix-hp.xmin, 0, hp.width);
|
||||||
iz = rcClamp(iz-hp.ymin, 0, hp.height);
|
iz = rcClamp(iz-hp.ymin, 0, hp.height);
|
||||||
unsigned short h = hp.data[ix+iz*hp.width];
|
unsigned short h = hp.data[ix+iz*hp.width];
|
||||||
@ -546,7 +546,7 @@ static bool buildPolyDetail(const float* in, const int nin, unsigned short reg,
|
|||||||
pos[0] = vj[0] + dx*u;
|
pos[0] = vj[0] + dx*u;
|
||||||
pos[1] = vj[1] + dy*u;
|
pos[1] = vj[1] + dy*u;
|
||||||
pos[2] = vj[2] + dz*u;
|
pos[2] = vj[2] + dz*u;
|
||||||
pos[1] = chf.bmin[1] + getHeight(pos, chf.bmin, cs, ics, hp)*chf.ch;
|
pos[1] = getHeight(pos, cs, ics, hp)*chf.ch;
|
||||||
}
|
}
|
||||||
// Simplify samples.
|
// Simplify samples.
|
||||||
int idx[MAX_EDGE] = {0,nn};
|
int idx[MAX_EDGE] = {0,nn};
|
||||||
@ -655,7 +655,7 @@ static bool buildPolyDetail(const float* in, const int nin, unsigned short reg,
|
|||||||
// Make sure the samples are not too close to the edges.
|
// Make sure the samples are not too close to the edges.
|
||||||
if (distToPoly(nin,in,pt) > -sampleDist/2) continue;
|
if (distToPoly(nin,in,pt) > -sampleDist/2) continue;
|
||||||
samples.push(x);
|
samples.push(x);
|
||||||
samples.push(getHeight(pt, chf.bmin, cs, ics, hp));
|
samples.push(getHeight(pt, cs, ics, hp));
|
||||||
samples.push(z);
|
samples.push(z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -673,7 +673,7 @@ static bool buildPolyDetail(const float* in, const int nin, unsigned short reg,
|
|||||||
{
|
{
|
||||||
float pt[3];
|
float pt[3];
|
||||||
pt[0] = samples[i*3+0]*sampleDist;
|
pt[0] = samples[i*3+0]*sampleDist;
|
||||||
pt[1] = chf.bmin[1] + samples[i*3+1]*chf.ch;
|
pt[1] = samples[i*3+1]*chf.ch;
|
||||||
pt[2] = samples[i*3+2]*sampleDist;
|
pt[2] = samples[i*3+2]*sampleDist;
|
||||||
float d = distToTriMesh(pt, verts, nverts, &tris[0], tris.size()/4);
|
float d = distToTriMesh(pt, verts, nverts, &tris[0], tris.size()/4);
|
||||||
if (d < 0) continue; // did not hit the mesh.
|
if (d < 0) continue; // did not hit the mesh.
|
||||||
@ -968,9 +968,9 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c
|
|||||||
{
|
{
|
||||||
if(p[j] == 0xffff) break;
|
if(p[j] == 0xffff) break;
|
||||||
const unsigned short* v = &mesh.verts[p[j]*3];
|
const unsigned short* v = &mesh.verts[p[j]*3];
|
||||||
poly[j*3+0] = orig[0] + v[0]*cs;
|
poly[j*3+0] = v[0]*cs;
|
||||||
poly[j*3+1] = orig[1] + v[1]*ch;
|
poly[j*3+1] = v[1]*ch;
|
||||||
poly[j*3+2] = orig[2] + v[2]*cs;
|
poly[j*3+2] = v[2]*cs;
|
||||||
npoly++;
|
npoly++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -991,9 +991,20 @@ bool rcBuildPolyMeshDetail(const rcPolyMesh& mesh, const rcCompactHeightfield& c
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Offset detail vertices, unnecassary?
|
// Move detail verts to world space.
|
||||||
for (int j = 0; j < nverts; ++j)
|
for (int j = 0; j < nverts; ++j)
|
||||||
verts[j*3+1] += chf.ch;
|
{
|
||||||
|
verts[j*3+0] += orig[0];
|
||||||
|
verts[j*3+1] += orig[1] + chf.ch; // Is this offset necessary?
|
||||||
|
verts[j*3+2] += orig[2];
|
||||||
|
}
|
||||||
|
// Offset poly too, will be used to flag checking.
|
||||||
|
for (int j = 0; j < npoly; ++j)
|
||||||
|
{
|
||||||
|
poly[j*3+0] += orig[0];
|
||||||
|
poly[j*3+1] += orig[1];
|
||||||
|
poly[j*3+2] += orig[2];
|
||||||
|
}
|
||||||
|
|
||||||
// Store detail submesh.
|
// Store detail submesh.
|
||||||
const int ntris = tris.size()/4;
|
const int ntris = tris.size()/4;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user