Пример #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();
        }

    }
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();
}
Пример #3
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();        
    }