/** \file TerrainContentGenerator.cpp \brief Creates content for the terrain, */ #include "TerrainContentGenerator.h" //----------------------------------------------------------------------- TerrainContentGenerator::TerrainContentGenerator( SceneManager *sm, RayQueryExecutor *rayQueryEx ) { mSceneMgr = sm; mRayQueryExecutor = rayQueryEx; mMinTranslation = Vector3(-70.0f, -70.0f, 0.0f); mMaxTranslation = Vector3(70.0f, 70.0f, 600.0f); mMinAngle = 0; mMaxAngle = 360; mCount = 0; } //----------------------------------------------------------------------- void TerrainContentGenerator::generateScene( int numObjects ) { srand (time (0)); Vector3 rotationRatio; Vector3 translationRatio; for(int i=0; i < numObjects; i++) { rotationRatio.x = rand() / (float) RAND_MAX; rotationRatio.y = rand() / (float) RAND_MAX; rotationRatio.z = rand() / (float) RAND_MAX; translationRatio.x = rand() / (float) RAND_MAX; translationRatio.y = rand() / (float) RAND_MAX; translationRatio.z = rand() / (float) RAND_MAX; generateSceneObject(translationRatio, rotationRatio, i, "sphere.mesh"); } } //----------------------------------------------------------------------- void TerrainContentGenerator::generateSceneObject(const Vector3 &translationRatio, const Vector3 &rotationRatio, const int idx, const String& entName) { // Setup the ray scene query Real rotation = mMinAngle + rotationRatio.x * (mMaxAngle - mMinAngle); Vector3 translation = mMinTranslation + translationRatio * (mMaxTranslation - mMinTranslation); translation.y = 5000; Vector3 queryResult; if(mRayQueryExecutor->executeRayQuery(&queryResult, translation, Vector3::NEGATIVE_UNIT_Y)) { char name[16]; sprintf( name, "%s%d", entName.c_str(), mCount++); Entity *ent = mSceneMgr->createEntity(name, entName); SceneNode *currentObject = mSceneMgr->getRootSceneNode( )->createChildSceneNode( String(name) + "Node", queryResult); currentObject->attachObject(ent); currentObject->setScale(0.1f, 0.1f, 0.1f); } } //----------------------------------------------------------------------- RayQueryExecutor::RayQueryExecutor( SceneManager *sm ) { mRaySceneQuery = sm->createRayQuery(Ray()); } //----------------------------------------------------------------------- RayQueryExecutor::~RayQueryExecutor() { delete mRaySceneQuery; } //----------------------------------------------------------------------- bool RayQueryExecutor::executeRayQuery( Vector3 *result, const Vector3 &pos, const Vector3 &dir ) { Ray ray(pos, dir); mRaySceneQuery->setRay(ray); // Perform the scene query RaySceneQueryResult &queryResult = mRaySceneQuery->execute(); RaySceneQueryResult::iterator it = queryResult.begin( ); if (it != queryResult.end() && it->worldFragment) { SceneQuery::WorldFragment* wf = it->worldFragment; *result = wf->singleIntersection; return true; } return false; }