void GridInfoFlagModifyAction::_doFinish(GridSelection* origin, bool canceled)
    {
        assert(origin);

        if (canceled)
        {
            origin->apply();
        }
        else
        {
            if (!origin->empty())
            {
                std::auto_ptr<FlipTerrainDiagonalOperator> op(new FlipTerrainDiagonalOperator(getSceneManipulator()));

                const GridSelection::GridMap& grids = origin->getGrids();
                GridSelection::GridMap::const_iterator it;
                for (it = grids.begin(); it != grids.end(); ++it)
                {
                    const GridSelection::Grid& grid = it->second;
                    uint newFlipFlag = getTerrainData()->getGridInfo(grid.x, grid.z).flags;
                    uint oldFlipFlag = grid.info.flags;
                    if (newFlipFlag != oldFlipFlag)
                    {
                        op->add(grid.x, grid.z, oldFlipFlag, newFlipFlag);
                    }
                }

                if (!op->empty())
                    getOperatorManager()->addOperator(op.release());
            }
        }
    }
Exemplo n.º 2
0
    //-----------------------------------------------------------------------
    void 
    PaintAction::doFinish(GridSelection* origin, bool canceled)
    {
        assert(origin);

        if (canceled)
        {
            origin->apply();
        }
        else
        {
            if (!origin->empty())
            {
                std::auto_ptr<ModifyTerrainPaintOperator> op(new ModifyTerrainPaintOperator(getSceneManipulator()));

                const GridSelection::GridMap& grids = origin->getGrids();
                GridSelection::GridMap::const_iterator it;
                for (it = grids.begin(); it != grids.end(); ++it)
                {
                    const GridSelection::Grid& grid = it->second;
                    const TerrainData::GridInfo &newGridInfo = getTerrainData()->getGridInfo(grid.x, grid.z);
                    const TerrainData::GridInfo &oldGridInfo = grid.info;
                    if (newGridInfo != oldGridInfo)
                    {
                        op->add(grid.x, grid.z, oldGridInfo, newGridInfo);
                    }
                }

                if (!op->empty())
                    getOperatorManager()->addOperator(op.release());
            }
        }
    }
Exemplo n.º 3
0
void
FixPaintAction::doFinish(JunctionSelection* originJunctions,GridSelection* originGrids, bool canceled)
{
    assert(originJunctions || originGrids);

    if (canceled)
    {
        originJunctions->apply();
        originGrids->apply();
    }
    else
    {
        std::auto_ptr<WX::TerrainSelectionActionOperator> op( new WX::TerrainSelectionActionOperator(getSceneManipulator()) );

        if(!originJunctions->empty())
        {
            const JunctionSelection::JunctionMap& junctions = originJunctions->getJunctions();
            JunctionSelection::JunctionMap::const_iterator it;
            for (it = junctions.begin(); it != junctions.end(); ++it)
            {
                const JunctionSelection::Junction& junction = it->second;
                float oldHeight = junction.height;
                float newHeight = mSceneManipulator->getTerrainData()->getHeight(junction.x,junction.z);

                if (newHeight != oldHeight)
                {
                    op->mModifyHeightOperator->add(junction.x, junction.z, oldHeight, newHeight);
                }
            }
        }
        //因为Grid信息里包含了纹理和对角线信息,所以放在一起
        if (!originGrids->empty())
        {
            const GridSelection::GridMap& grids = originGrids->getGrids();
            GridSelection::GridMap::const_iterator it;
            for (it = grids.begin(); it != grids.end(); ++it)
            {
                const GridSelection::Grid& grid = it->second;
                const TerrainData::GridInfo &oldGridInfo = grid.info;
                const TerrainData::GridInfo &newGridInfo = mSceneManipulator->getTerrainData()->getGridInfo(grid.x, grid.z);
                if (newGridInfo != oldGridInfo)
                {
                    op->mModifyPaintOperator->add(grid.x, grid.z, oldGridInfo, newGridInfo);
                }
            }

        }

        if (!op->empty())
            getOperatorManager()->addOperator(op.release());

    }
}