Stop objects from overlapping the edge of the triangle in which they are placed. This should stop buildings encroaching roads etc.

This commit is contained in:
Stuart Buchanan 2012-02-23 20:10:02 +00:00
parent 2a9d39f201
commit cf2619613d
2 changed files with 27 additions and 17 deletions

View File

@ -235,7 +235,8 @@ public:
}
}
void addRandomPoints(float coverage,
void addRandomPoints(double coverage,
double spacing,
osg::Texture2D* object_mask,
std::vector<std::pair<SGVec3f, float> >& points)
{
@ -271,6 +272,13 @@ public:
float c = 1 - a - b;
SGVec3f randomPoint = a*v0 + b*v1 + c*v2;
// Check that the point is sufficiently far from
// the edge of the triangle by measuring the distance
// from the three lines that make up the triangle.
if (((length(cross(randomPoint - v0, randomPoint - v1)) / length(v1 - v0)) > spacing) &&
((length(cross(randomPoint - v1, randomPoint - v2)) / length(v2 - v1)) > spacing) &&
((length(cross(randomPoint - v2, randomPoint - v0)) / length(v0 - v2)) > spacing) )
{
if (object_mask != NULL) {
SGVec2f texCoord = a*t0 + b*t1 + c*t2;
@ -287,6 +295,7 @@ public:
} else {
points.push_back(std::make_pair(randomPoint, mt_rand(&seed)));
}
}
num -= 1.0;
}
}

View File

@ -536,6 +536,7 @@ struct SGTileGeometryBin {
std::vector<std::pair<SGVec3f, float> > randomPoints;
i->second.addRandomPoints(object->get_coverage_m2(),
object->get_spacing_m(),
mat->get_object_mask(i->second),
randomPoints);
std::vector<std::pair<SGVec3f, float> >::iterator l;