const Ogre::Vector3 Mesh::getWorldSpacePosition(const Ogre::Vector3& ObjectSpacePosition) const { Ogre::Matrix4 mWorldMatrix; if (mCreated) { #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 7 mWorldMatrix = mEntity->getParentSceneNode()->_getFullTransform(); #else mEntity->getParentSceneNode()->getWorldTransforms(&mWorldMatrix); #endif } else { Ogre::SceneNode *mTmpSN = new Ogre::SceneNode(0); mTmpSN->setPosition(mHydrax->getPosition()); #if OGRE_VERSION_MAJOR >= 1 && OGRE_VERSION_MINOR >= 7 mWorldMatrix = mTmpSN->_getFullTransform(); #else mTmpSN->getWorldTransforms(&mWorldMatrix); #endif delete mTmpSN; } return mWorldMatrix.transformAffine(ObjectSpacePosition); }
const Ogre::Vector3 Mesh::getWorldSpacePosition(const Ogre::Vector3& ObjectSpacePosition) const { Ogre::Matrix4 mWorldMatrix; if (mCreated) { mWorldMatrix = mEntity->getParentSceneNode()->_getFullTransform(); } else { Ogre::SceneNode *mTmpSN = new Ogre::SceneNode(0); mTmpSN->setPosition(mHydrax->getPosition()); mWorldMatrix = mTmpSN->_getFullTransform(); delete mTmpSN; } return mWorldMatrix.transformAffine(ObjectSpacePosition); }
void SimpleGrid::update(const Ogre::Real &timeSinceLastFrame) { if (!isCreated()) { return; } Module::update(timeSinceLastFrame); // Update heigths int i = 0, v, u; if (getNormalMode() == MaterialManager::NM_VERTEX) { Mesh::POS_NORM_VERTEX* Vertices = static_cast<Mesh::POS_NORM_VERTEX*>(mVertices); if (mOptions.ChoppyWaves) { for(int i = 0; i < mOptions.Complexity*mOptions.Complexity; i++) { Vertices[i] = mVerticesChoppyBuffer[i]; Vertices[i].y = mNoise->getValue(Vertices[i].x, Vertices[i].z) * mOptions.Strength; } } else { for(int i = 0; i < mOptions.Complexity*mOptions.Complexity; i++) { Vertices[i].y = mNoise->getValue(Vertices[i].x, Vertices[i].z) * mOptions.Strength; } } } else if (getNormalMode() == MaterialManager::NM_RTT) { Mesh::POS_VERTEX* Vertices = static_cast<Mesh::POS_VERTEX*>(mVertices); // For object-space to world-space conversion // RTT normals calculation needs world-space coords Ogre::Vector3 p = Ogre::Vector3(0,0,0); Ogre::Matrix4 mWorldMatrix; mHydrax->getMesh()->getEntity()->getParentSceneNode()->getWorldTransforms(&mWorldMatrix); for(int i = 0; i < mOptions.Complexity*mOptions.Complexity; i++) { p.x = Vertices[i].x; p.y = 0; p.z = Vertices[i].z; // Calculate the world-space position mWorldMatrix.transformAffine(p); Vertices[i].y = mNoise->getValue(p.x, p.z) * mOptions.Strength; } } // Smooth the heightdata if (mOptions.Smooth) { if (getNormalMode() == MaterialManager::NM_VERTEX) { Mesh::POS_NORM_VERTEX* Vertices = static_cast<Mesh::POS_NORM_VERTEX*>(mVertices); for(v=1; v<(mOptions.Complexity-1); v++) { for(u=1; u<(mOptions.Complexity-1); u++) { Vertices[v*mOptions.Complexity + u].y = 0.2f * (Vertices[v *mOptions.Complexity + u ].y + Vertices[v *mOptions.Complexity + (u+1)].y + Vertices[v *mOptions.Complexity + (u-1)].y + Vertices[(v+1)*mOptions.Complexity + u ].y + Vertices[(v-1)*mOptions.Complexity + u ].y); } } } else if (getNormalMode() == MaterialManager::NM_RTT) { Mesh::POS_VERTEX* Vertices = static_cast<Mesh::POS_VERTEX*>(mVertices); for(v=1; v<(mOptions.Complexity-1); v++) { for(u=1; u<(mOptions.Complexity-1); u++) { Vertices[v*mOptions.Complexity + u].y = 0.2f * (Vertices[v *mOptions.Complexity + u ].y + Vertices[v *mOptions.Complexity + (u+1)].y + Vertices[v *mOptions.Complexity + (u-1)].y + Vertices[(v+1)*mOptions.Complexity + u ].y + Vertices[(v-1)*mOptions.Complexity + u ].y); } } } } // Update normals _calculeNormals(); // Perform choppy waves _performChoppyWaves(); // Upload geometry changes mHydrax->getMesh()->updateGeometry(mOptions.Complexity*mOptions.Complexity, mVertices); }