void ScalarField::addEllipsoid(vmath::vec3 p, vmath::mat3 G, double r) { setPointRadius(r); addEllipsoid(p, G); }
void DataManager::setWheater(const float& Humidity, const float& AverageCloudsSize, const bool& delayedResponse) { int numberofclouds = static_cast<int>(Humidity * mMaxNumberOfClouds); Ogre::Vector3 maxcloudsize = AverageCloudsSize*Ogre::Vector3(mNx/14, mNy/14, static_cast<int>(static_cast<float>(mNz)/2.75)); // Update old clouds with new parameters Ogre::Vector3 currentdimensions, currentPosition; std::vector<Ellipsoid*>::const_iterator mEllipsoidsIt; for(mEllipsoidsIt = mEllipsoids.begin(); mEllipsoidsIt != mEllipsoids.end(); mEllipsoidsIt++) { // Update size currentdimensions = (*mEllipsoidsIt)->getDimensions(); if (currentdimensions.x / maxcloudsize.x < 0.5 || currentdimensions.x / maxcloudsize.x > 2) { currentdimensions.x = maxcloudsize.x + Ogre::Math::RangeRandom(-0.2,0.2)*maxcloudsize.x; } if (currentdimensions.y / maxcloudsize.y < 0.5 || currentdimensions.y / maxcloudsize.y > 2) { currentdimensions.y = maxcloudsize.y + Ogre::Math::RangeRandom(-0.2,0.2)*maxcloudsize.y; } if (currentdimensions.z / maxcloudsize.z < 0.5 || currentdimensions.z / maxcloudsize.z > 2) { currentdimensions.z = maxcloudsize.z + Ogre::Math::RangeRandom(-0.2,0.15)*maxcloudsize.z; } (*mEllipsoidsIt)->setDimensions(currentdimensions); // Update position currentPosition = (*mEllipsoidsIt)->getPosition(); (*mEllipsoidsIt)->setPosition(Ogre::Vector3(currentPosition.x,currentPosition.y,static_cast<int>(Ogre::Math::RangeRandom(currentdimensions.z+2,mNz-currentdimensions.z-2)))); } // Remove some clouds if needed while (static_cast<unsigned int>(numberofclouds) < mEllipsoids.size()) { mEllipsoids.pop_back(); } // Add new clouds if needed Ogre::Vector3 newclouddimensions; while (static_cast<unsigned int>(numberofclouds) > mEllipsoids.size()) { newclouddimensions = maxcloudsize*Ogre::Vector3(Ogre::Math::RangeRandom(0.5, 2), Ogre::Math::RangeRandom(0.5, 2), Ogre::Math::RangeRandom(0.75, 1)); addEllipsoid(new Ellipsoid(newclouddimensions.x, newclouddimensions.y, newclouddimensions.z, mNx, mNy, mNz, (int)Ogre::Math::RangeRandom(0, mNx), (int)Ogre::Math::RangeRandom(0, mNy), static_cast<int>(Ogre::Math::RangeRandom(newclouddimensions.z+2,mNz-newclouddimensions.z-2)), Ogre::Math::RangeRandom(1,5.0f)), false); } _updateProbabilities(mCellsCurrent, mNx, mNy, mNz, delayedResponse); if (!delayedResponse) { for (int k = 0; k < 4; k++) { _performCalculations(mNx, mNy, mNz, k, 0, mNx); } mStep = mXStart = mXEnd = 0; _updateVolTextureData(mCellsCurrent, VOL_TEX0, mNx, mNy, mNz); _updateVolTextureData(mCellsCurrent, VOL_TEX1, mNx, mNy, mNz); } }