From: Stuart Buchanan Date: Thu, 23 Feb 2012 20:10:02 +0000 (+0000) Subject: Stop objects from overlapping the edge of the triangle in which they are placed.... X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=cf2619613db25d49a723b8f61f679f4dbe8d9529;p=simgear.git Stop objects from overlapping the edge of the triangle in which they are placed. This should stop buildings encroaching roads etc. --- diff --git a/simgear/scene/tgdb/SGTexturedTriangleBin.hxx b/simgear/scene/tgdb/SGTexturedTriangleBin.hxx index 3e722d98..9c6d6ab7 100644 --- a/simgear/scene/tgdb/SGTexturedTriangleBin.hxx +++ b/simgear/scene/tgdb/SGTexturedTriangleBin.hxx @@ -235,7 +235,8 @@ public: } } - void addRandomPoints(float coverage, + void addRandomPoints(double coverage, + double spacing, osg::Texture2D* object_mask, std::vector >& points) { @@ -271,22 +272,30 @@ public: float c = 1 - a - b; SGVec3f randomPoint = a*v0 + b*v1 + c*v2; - if (object_mask != NULL) { - SGVec2f texCoord = a*t0 + b*t1 + c*t2; - - // Check this random point against the object mask - // blue (for buildings) channel. - osg::Image* img = object_mask->getImage(); - unsigned int x = (int) (img->s() * texCoord.x()) % img->s(); - unsigned int y = (int) (img->t() * texCoord.y()) % img->t(); - - if (mt_rand(&seed) < img->getColor(x, y).b()) { - // The red channel contains the rotation for this object - points.push_back(std::make_pair(randomPoint, img->getColor(x,y).r())); - } - } else { - points.push_back(std::make_pair(randomPoint, mt_rand(&seed))); - } + // 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; + + // Check this random point against the object mask + // blue (for buildings) channel. + osg::Image* img = object_mask->getImage(); + unsigned int x = (int) (img->s() * texCoord.x()) % img->s(); + unsigned int y = (int) (img->t() * texCoord.y()) % img->t(); + + if (mt_rand(&seed) < img->getColor(x, y).b()) { + // The red channel contains the rotation for this object + points.push_back(std::make_pair(randomPoint, img->getColor(x,y).r())); + } + } else { + points.push_back(std::make_pair(randomPoint, mt_rand(&seed))); + } + } num -= 1.0; } } diff --git a/simgear/scene/tgdb/obj.cxx b/simgear/scene/tgdb/obj.cxx index 8de319f5..235b8f62 100644 --- a/simgear/scene/tgdb/obj.cxx +++ b/simgear/scene/tgdb/obj.cxx @@ -536,6 +536,7 @@ struct SGTileGeometryBin { std::vector > randomPoints; i->second.addRandomPoints(object->get_coverage_m2(), + object->get_spacing_m(), mat->get_object_mask(i->second), randomPoints); std::vector >::iterator l;