void PolygonAdapter::createNewPolygon(WFMath::Polygon<2>* existingPoly) { delete mPolygon; mPolygon = 0; Ogre::SceneNode* entitySceneNode = getEntitySceneNode(); if (entitySceneNode) { mPolygon = new Authoring::Polygon(entitySceneNode, mPositionProvider); WFMath::Polygon<2> poly; if (existingPoly) { poly = *existingPoly; } else { poly.addCorner(0, WFMath::Point<2>(-1, -1)); poly.addCorner(1, WFMath::Point<2>(-1, 1)); poly.addCorner(2, WFMath::Point<2>(1, 1)); poly.addCorner(3, WFMath::Point<2>(1, -1)); } mPolygon->loadFromShape(poly); if (!mPickListener) { mPickListener = new Authoring::PolygonPointPickListener(*mPolygon); mPickListener->EventPickedPoint.connect(sigc::mem_fun(*this, &PolygonAdapter::pickListener_PickedPoint)); EmberOgre::getSingleton().getWorld()->getMainCamera().pushWorldPickListener(mPickListener); } } }
WFMath::Polygon<2> AreaAdapter::getDefaultPolygon() const { WFMath::Polygon<2> poly; poly.addCorner(0, WFMath::Point<2>(-1, -1)); poly.addCorner(1, WFMath::Point<2>(-1, 1)); poly.addCorner(2, WFMath::Point<2>(1, 1)); poly.addCorner(3, WFMath::Point<2>(1, -1)); return poly; }
WFMath::Polygon<2> Polygon::getShape() const { WFMath::Polygon<2> poly; unsigned int i = 0; for (auto& point : mPoints) { poly.addCorner(i++, point->getLocalPosition()); } return poly; }
WFMath::Polygon<2> sutherlandHodgmanKernel(const WFMath::Polygon<2>& inpoly, Clip clipper) { WFMath::Polygon<2> outpoly; if (!inpoly.isValid()) return inpoly; std::size_t points = inpoly.numCorners(); if (points < 3) return outpoly; // i.e an invalid result Point2 lastPt = inpoly.getCorner(points - 1); bool lastInside = clipper.inside(lastPt); for (std::size_t p = 0; p < points; ++p) { Point2 curPt = inpoly.getCorner(p); bool inside = clipper.inside(curPt); if (lastInside) { if (inside) { // emit curPt outpoly.addCorner(outpoly.numCorners(), curPt); } else { // emit intersection of edge with clip line outpoly.addCorner(outpoly.numCorners(), clipper.clip(lastPt, curPt)); } } else { if (inside) { // emit both outpoly.addCorner(outpoly.numCorners(), clipper.clip(lastPt, curPt)); outpoly.addCorner(outpoly.numCorners(), curPt); } else { // don't emit anything } } // last was outside lastPt = curPt; lastInside = inside; } return outpoly; }
void testAreaShader() { Mercator::Area* a1 = new Mercator::Area(1, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), Point2(3, 4)); p.addCorner(p.numCorners(), Point2(10, 10)); p.addCorner(p.numCorners(), Point2(14, 6)); p.addCorner(p.numCorners(), Point2(18, 4)); p.addCorner(p.numCorners(), Point2(17, 19)); p.addCorner(p.numCorners(), Point2(6, 20)); p.addCorner(p.numCorners(), Point2(-1, 18)); p.addCorner(p.numCorners(), Point2(-8, 11)); a1->setShape(p); Mercator::Terrain terrain(Mercator::Terrain::SHADED, 16); Mercator::AreaShader* ashade = new Mercator::AreaShader(1); terrain.addShader(ashade, 0); terrain.setBasePoint(0, 0, -1); terrain.setBasePoint(0, 1, 8); terrain.setBasePoint(1, 0, 2); terrain.setBasePoint(1, 1, 11); terrain.addArea(a1); Mercator::Segment* seg = terrain.getSegment(0,0); assert(a1->checkIntersects(*seg)); seg->populateSurfaces(); }
void testAddToSegment() { Mercator::Area* a1 = new Mercator::Area(1, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), Point2(1, 1)); p.addCorner(p.numCorners(), Point2(6, 1)); p.addCorner(p.numCorners(), Point2(6, 6)); p.addCorner(p.numCorners(), Point2(1, 6)); a1->setShape(p); Mercator::Segment * seg1 = new Mercator::Segment(0,0,seg_size); int success = a1->addToSegment(*seg1); assert(success == 0); Mercator::Segment * seg2 = new Mercator::Segment(1 * seg_size,0,seg_size); success = a1->addToSegment(*seg2); assert(success != 0); }
void testAreaShader() { Mercator::Area* a1 = new Mercator::Area(1, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), Point2(3, 4)); p.addCorner(p.numCorners(), Point2(10, 10)); p.addCorner(p.numCorners(), Point2(14, 6)); p.addCorner(p.numCorners(), Point2(18, 4)); p.addCorner(p.numCorners(), Point2(17, 19)); p.addCorner(p.numCorners(), Point2(6, 20)); p.addCorner(p.numCorners(), Point2(-1, 18)); p.addCorner(p.numCorners(), Point2(-8, 11)); a1->setShape(p); Mercator::Area* a2 = new Mercator::Area(1, false); WFMath::Polygon<2> p2; p2.addCorner(p2.numCorners(), Point2(25, 18)); p2.addCorner(p2.numCorners(), Point2(72, 22)); p2.addCorner(p2.numCorners(), Point2(60, 30)); p2.addCorner(p2.numCorners(), Point2(27, 28)); p2.addCorner(p2.numCorners(), Point2(25, 45)); p2.addCorner(p2.numCorners(), Point2(3, 41)); p2.addCorner(p2.numCorners(), Point2(-2, 20)); a2->setShape(p2); Mercator::Terrain terrain(Mercator::Terrain::SHADED, 16); Mercator::Shader * base_shader = new Mercator::FillShader(Mercator::Shader::Parameters()); terrain.addShader(base_shader, 0); Mercator::AreaShader* ashade = new Mercator::AreaShader(1); terrain.addShader(ashade, 1); terrain.setBasePoint(0, 0, -1); terrain.setBasePoint(0, 1, 8); terrain.setBasePoint(1, 0, 2); terrain.setBasePoint(1, 1, 11); terrain.setBasePoint(2, 0, 2); terrain.setBasePoint(2, 1, 11); terrain.addArea(a1); // terrain.addArea(a2); Mercator::Segment* seg = terrain.getSegment(0,0); assert(a1->checkIntersects(*seg)); seg->populateSurfaces(); writePGMForSurface("test1.pgm", seg->getSize(), seg->getSurfaces()[1]); seg = terrain.getSegment(1,0); seg->populateSurfaces(); writePGMForSurface("test2.pgm", seg->getSize(), seg->getSurfaces()[1]); }
int main() { Mercator::Terrain t; // Add a null test shader to the terrain Mercator::Shader * shader = new TestShader; t.addShader(shader, 0); // Create a test area with a shape which intersects // the Segment at 0,0 Mercator::Area* a1 = new Mercator::Area(0, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), WFMath::Point<2>(3, 4)); p.addCorner(p.numCorners(), WFMath::Point<2>(10, 10)); p.addCorner(p.numCorners(), WFMath::Point<2>(14, 6)); p.addCorner(p.numCorners(), WFMath::Point<2>(18, 4)); p.addCorner(p.numCorners(), WFMath::Point<2>(17, 19)); p.addCorner(p.numCorners(), WFMath::Point<2>(6, 20)); p.addCorner(p.numCorners(), WFMath::Point<2>(-1, 18)); p.addCorner(p.numCorners(), WFMath::Point<2>(-8, 11)); a1->setShape(p); // Add enough base points to force the creation of the Segment at 0,0 t.setBasePoint(0, 0, -1); t.setBasePoint(0, 1, 8); t.setBasePoint(1, 0, 2); t.setBasePoint(1, 1, 11); // Get the Segment at 0,0 Mercator::Segment * seg = t.getSegmentAtIndex(0,0); assert(seg != 0); // Get the surfaces, and add one corresponding to the shader we added. // We need to do this as the functions that would normally make it happen // have been stubbed out. Mercator::Segment::Surfacestore & sss = seg->getSurfaces(); Mercator::Surface * sfce = new Mercator::Surface(*seg, *shader); // Force allocation of the surface buffer so we can check later that it // gets destroyed when the area is added to the terrain. sfce->allocate(); assert(sfce->isValid()); // Add the surface to the store for this segment sss[0] = sfce; // Add the area which should cause relevant surface date to be invalidated t.addArea(a1); // We assert this to ensure that the buffer has been de-allocated // by a call to Surface::invalidate caused by adding the Area. assert(!sfce->isValid()); // force the surface to re-allocate sfce->allocate(); assert(sfce->isValid()); // Modify the areas shape p.addCorner(p.numCorners(), WFMath::Point<2>(-9, 12)); a1->setShape(p); // and cause an area update t.updateArea(a1); // Check the surface has been invalidated again assert(!sfce->isValid()); // force the surface to re-allocate sfce->allocate(); assert(sfce->isValid()); t.removeArea(a1); // Check the surface has been invalidated again assert(!sfce->isValid()); }
int main(int argc, char* argv[]) { Mercator::Area* a1 = new Mercator::Area(1, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), Point2(3, 4)); p.addCorner(p.numCorners(), Point2(10, 10)); p.addCorner(p.numCorners(), Point2(-1, 18)); p.addCorner(p.numCorners(), Point2(-8, 11)); a1->setShape(p); Mercator::Terrain terrain(Mercator::Terrain::SHADED, seg_size); Mercator::AreaShader* ashade = new Mercator::AreaShader(1); terrain.addShader(ashade, 0); terrain.setBasePoint(-2, -1, 5); terrain.setBasePoint(-2, 0, 2); terrain.setBasePoint(-2, 1, 19); terrain.setBasePoint(-1, -1, 4); terrain.setBasePoint(-1, 0, 6); terrain.setBasePoint(-1, 1, 10); terrain.setBasePoint(0, -1, 2); terrain.setBasePoint(0, 0, -1); terrain.setBasePoint(0, 1, 8); terrain.setBasePoint(0, 2, 11); terrain.setBasePoint(1, -1, 7); terrain.setBasePoint(1, 0, 2); terrain.setBasePoint(1, 1, 11); terrain.setBasePoint(1, 2, 9); terrain.setBasePoint(2, -1, 3); terrain.setBasePoint(2, 0, 8); terrain.setBasePoint(2, 1, 2); terrain.setBasePoint(3, -1, 6); terrain.setBasePoint(3, 0, 7); terrain.setBasePoint(3, 1, 9); terrain.addArea(a1); Mercator::Segment* seg = terrain.getSegment(0,0); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); seg = terrain.getSegment(1,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); assert(a1->checkIntersects(*seg) == false); WFMath::Polygon<2> clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); seg = terrain.getSegment(-1,0); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); seg = terrain.getSegment(0,1); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); seg = terrain.getSegment(2,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); assert(a1->checkIntersects(*seg) == false); p.clear(); p.addCorner(p.numCorners(), Point2(3 + seg_size, 4)); p.addCorner(p.numCorners(), Point2(10 + seg_size, 10)); p.addCorner(p.numCorners(), Point2(-1 + seg_size, 18)); p.addCorner(p.numCorners(), Point2(-8 + seg_size, 11)); a1->setShape(p); terrain.updateArea(a1); seg = terrain.getSegment(0,0); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); seg = terrain.getSegment(1,0); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); seg = terrain.getSegment(-1,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); assert(a1->checkIntersects(*seg) == false); seg = terrain.getSegment(0,1); assert(seg->getAreas().size() == 1); assert(seg->getAreas().count(1) == 1); assert(a1->checkIntersects(*seg)); clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); seg = terrain.getSegment(2,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); assert(a1->checkIntersects(*seg) == false); clipped = a1->clipToSegment(*seg); assert(clipped.isValid()); terrain.removeArea(a1); seg = terrain.getSegment(0,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); seg = terrain.getSegment(1,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); seg = terrain.getSegment(-1,0); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); seg = terrain.getSegment(0,1); assert(seg->getAreas().size() == 0); assert(seg->getAreas().count(1) == 0); testAreaShader(); testAddToSegment(); return EXIT_SUCCESS; }
int main() { // Test constructor { Mercator::Forest mf; } // Test constructor { Mercator::Forest mf(23); } // Test getArea() { Mercator::Forest mf; Mercator::Area * a = mf.getArea(); assert(a == 0); } // Test species() { Mercator::Forest mf; Mercator::Forest::PlantSpecies & mps = mf.species(); assert(mps.empty()); } { Mercator::Forest forest(4249162ul); Mercator::Forest::PlantSpecies & species = forest.species(); const Mercator::Forest::PlantStore & plants = forest.getPlants(); // Forest is not yet populated assert(plants.empty()); assert(species.empty()); forest.populate(); // Forest has zero area, so even when populated it is empty assert(plants.empty()); assert(species.empty()); Mercator::Area* ar = new Mercator::Area(1, false); WFMath::Polygon<2> p; p.addCorner(p.numCorners(), Point2(5, 8)); p.addCorner(p.numCorners(), Point2(40, -1)); p.addCorner(p.numCorners(), Point2(45, 16)); p.addCorner(p.numCorners(), Point2(30, 28)); p.addCorner(p.numCorners(), Point2(-2, 26)); p.addCorner(p.numCorners(), Point2(1, 5)); ar->setShape(p); forest.setArea(ar); forest.populate(); // Forest has no species, so even when populated it is empty assert(plants.empty()); assert(species.empty()); { Mercator::Species pine; pine.m_probability = 0.04; pine.m_deviation = 1.f; species.push_back(pine); } forest.populate(); // Forest should now contain some plants assert(!plants.empty()); dumpPlants(plants); int plant_count = countPlants(plants); { Mercator::Species oak; oak.m_probability = 0.02; oak.m_deviation = 1.f; species.push_back(oak); } forest.populate(); // Forest should now contain some plants assert(!plants.empty()); assert(countPlants(plants) > plant_count); dumpPlants(plants); std::cout << countPlants(plants) << "," << plant_count << std::endl << std::flush; } }