void IntersectGrids::refresh(void) { GridSelection* selection = static_cast<GridSelection *>( getSceneManipulator()->_getSelection("GridSelection")); const GridSelection::GridMap &mGrids = selection->getGrids(); TerrainData *terrainData = getTerrainData(); if (!mGrids.empty()) { GridSelection::GridMap::const_iterator it = mGrids.begin(); while (it != mGrids.end()) { // 取得这个grid的四个角的坐标 int minx = it->second.x; int minz = it->second.z; int maxx = minx+1; int maxz = minz+1; // 判断是否翻转了,因为翻转了会改变顶点的高度 if ( terrainData->getGridInfo(minx, minz).flags & TerrainData::GridInfo::FlipDiagonal ) { // 第一个三角形 mPosArray.push_back(terrainData->_getPosition(minx,minz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-mIntersectGridsNode->getPosition()); // 第二个三角形 mPosArray.push_back(terrainData->_getPosition(maxx,minz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(minx,minz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-mIntersectGridsNode->getPosition()); } else { // 第一个三角形 mPosArray.push_back(terrainData->_getPosition(minx,minz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(maxx,minz)-mIntersectGridsNode->getPosition()); // 第二个三角形 mPosArray.push_back(terrainData->_getPosition(maxx,minz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-mIntersectGridsNode->getPosition()); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-mIntersectGridsNode->getPosition()); } ++it; } intersectGrids->fillPosition(mPosArray); mPosArray.clear(); } }
void TerrainTileEditable::_notifyHeightModified(int xstart, int zstart, int xend, int zend) { assert(0 <= xstart && xstart < xend && xend <= mXSize+1); assert(0 <= zstart && zstart < zend && zend <= mZSize+1); if (mVertexDatas.empty()) { // Nothing todo when buffer never initialised return; } // TODO: (optimization) some grid may be need to recompute normal only TerrainData* data = mOwner->getData(); Ogre::HardwareVertexBufferSharedPtr posNormBuffer = mVertexDatas.front()->vertexBufferBinding->getBuffer(0); float* pPosNormBuffer = static_cast<float*>(posNormBuffer->lock(Ogre::HardwareBuffer::HBL_NORMAL)); float buffer[6]; int xsize = mXSize; int zsize = mZSize; int xbase = mXBase; int zbase = mZBase; for (int z = zstart; z < zend; ++z) { for (int x = xstart; x < xend; ++x) { Ogre::Vector3 v; v = data->_getPosition(x+xbase, z+zbase); buffer[0] = v.x; buffer[1] = v.y; buffer[2] = v.z; v = data->_getNormal(x+xbase, z+zbase); buffer[3] = v.x; buffer[4] = v.y; buffer[5] = v.z; if (0 < z) { if (0 < x) memcpy(pPosNormBuffer + (((z-1) * xsize + (x-1)) * 4 + 3) * 6, buffer, 6*sizeof(float)); if (x < xsize) memcpy(pPosNormBuffer + (((z-1) * xsize + (x-0)) * 4 + 2) * 6, buffer, 6*sizeof(float)); } if (z < zsize) { if (0 < x) memcpy(pPosNormBuffer + (((z-0) * xsize + (x-1)) * 4 + 1) * 6, buffer, 6*sizeof(float)); if (x < xsize) memcpy(pPosNormBuffer + (((z-0) * xsize + (x-0)) * 4 + 0) * 6, buffer, 6*sizeof(float)); } } } posNormBuffer->unlock(); // re-compue bounding box data->_computeTileBoundingBox(mBounds, xbase, zbase, xsize, zsize); // trigger update of bounding box getParentNode()->needUpdate(); }
void TerrainSelectionGrids::refresh(void) { // 对当前所有的GridSelection进行重绘 GridSelections::const_iterator listIterator = mGridSelectionList.begin(); while ( listIterator != mGridSelectionList.end() ) { GridSelection* selection = *listIterator; const GridSelection::GridMap &mGrids = selection->getGrids(); TerrainData *terrainData = getTerrainData(); if (!mGrids.empty()) { GridSelection::GridMap::const_iterator it = mGrids.begin(); Ogre::Vector3 sceneNodePos = mIntersectGridsNode->getPosition(); while (it != mGrids.end()) { // 取得这个grid的四个角的坐标 int minx = it->second.x; int minz = it->second.z; int maxx = minx+1; int maxz = minz+1; // 判断是否翻转了,因为翻转了会改变顶点的高度 if ( terrainData->getGridInfo(minx, minz).flags & TerrainData::GridInfo::FlipDiagonal ) { // 第一个三角形 mPosArray.push_back(terrainData->_getPosition(minx,minz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-sceneNodePos); // 第二个三角形 mPosArray.push_back(terrainData->_getPosition(maxx,minz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(minx,minz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-sceneNodePos); } else { // 第一个三角形 mPosArray.push_back(terrainData->_getPosition(minx,minz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(maxx,minz)-sceneNodePos); // 第二个三角形 mPosArray.push_back(terrainData->_getPosition(maxx,minz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(minx,maxz)-sceneNodePos); mPosArray.push_back(terrainData->_getPosition(maxx,maxz)-sceneNodePos); } ++it; } } ++listIterator; } intersectGrids->fillPosition(mPosArray); mPosArray.clear(); }