PlacementTypeBounds.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <placement/PlacementTypeBounds.h>
00022 #include <landscapemap/LandscapeMaps.h>
00023 #include <engine/ScorchedContext.h>
00024 #include <common/ProgressCounter.h>
00025 #include <common/RandomGenerator.h>
00026 #include <common/Defines.h>
00027 #include <XML/XMLParser.h>
00028 
00029 PlacementTypeBounds::PlacementTypeBounds()
00030 {
00031 }
00032 
00033 PlacementTypeBounds::~PlacementTypeBounds()
00034 {
00035 }
00036 
00037 bool PlacementTypeBounds::readXML(XMLNode *node)
00038 {
00039         if (!node->getNamedChild("count", count)) return false;
00040         if (!node->getNamedChild("minbounds", minbounds)) return false;
00041         if (!node->getNamedChild("maxbounds", maxbounds)) return false;
00042 
00043         if (maxbounds[0] - minbounds[0] < 25 ||
00044                 maxbounds[1] - minbounds[1] < 25 ||
00045                 maxbounds[2] - minbounds[2] < 10)
00046         {
00047                 return node->returnError(
00048                         "PlacementTypeBounds bounding box is too small, it must be at least 25x10 units");
00049         }
00050 
00051         return PlacementType::readXML(node);
00052 }
00053 
00054 void PlacementTypeBounds::getPositions(ScorchedContext &context,
00055         RandomGenerator &generator,
00056         std::list<Position> &returnPositions,
00057         ProgressCounter *counter)
00058 {
00059         for (int i=0; i<count; i++)
00060         {
00061                 // Set the position, and make sure it is above ground
00062                 Position position;
00063                 do
00064                 {
00065                         position.position[0] = 
00066                                 generator.getRandFixed() * (maxbounds[0] - minbounds[0]) + minbounds[0];
00067                         position.position[1] = 
00068                                 generator.getRandFixed() * (maxbounds[1] - minbounds[1]) + minbounds[1];
00069                         position.position[2] = 
00070                                 generator.getRandFixed() * (maxbounds[2] - minbounds[2]) + minbounds[2];
00071                 } 
00072                 while (context.getLandscapeMaps().getGroundMaps().
00073                         getInterpHeight(position.position[0], position.position[1]) >= position.position[2]);
00074 
00075                 // Set velocity pointing into the middle
00076                 FixedVector middle = (maxbounds + minbounds) / 2;
00077                 position.velocity = middle - position.position;
00078                 position.velocity.StoreNormalize();
00079                 position.velocity[2] = 0;
00080 
00081                 returnPositions.push_back(position);
00082         }
00083 }

Generated on Mon Feb 16 15:14:51 2009 for Scorched3D by  doxygen 1.5.3