Beispiel #1
0
    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();
        }

    }
Beispiel #2
0
    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();        
    }