void
JunctionSelection::notifyModified(void) const
{
    if (!mJunctions.empty())
    {
        int minx, maxx, minz, maxz;
        JunctionMap::const_iterator it = mJunctions.begin();
        minx = maxx = it->second.x;
        minz = maxz = it->second.z;
        while (++it != mJunctions.end())
        {
            int x = it->second.x;
            if (minx > x)
                minx = x;
            else if (maxx < x)
                maxx = x;
            int z = it->second.z;
            if (minz > z)
                minz = z;
            else if (maxz < z)
                maxz = z;
        }
        if (minx < 0) minx = 0;
        if (minz < 0) minz = 0;
        if (maxx > getTerrainData()->mXSize)
            maxx = getTerrainData()->mXSize;
        if (maxz > getTerrainData()->mZSize)
            maxz = getTerrainData()->mZSize;
        if (minx <= maxx && minz <= maxz)
        {
            getTerrain()->notifyHeightModified(minx, minz, maxx+1, maxz+1);
        }
    }
}
Пример #2
0
    Real TrueSmoothHeightAction::_computeHeight(const JunctionSelection::Junction& junction, Real seconds)
    {

		float center_x = (MaxBindPoint.first - MinBindPoint.first ) /2 + MinBindPoint.first;
		float center_z = (MaxBindPoint.second- MinBindPoint.second) /2 + MinBindPoint.second;

		//╝к╦с╚еоп
	     Real height = getTerrainData()->getHeight(junction.x, junction.z);
		 float StrenghScalar = RadiusStrength(Ogre::Vector3(center_x,0,center_z),Ogre::Vector3(junction.x ,0,junction.z) ,0.1,(mWeightcnt+mHeightcnt)/4) ;

		float SmoothHeight=0;
		int   vertCnt = 0;
		for (int AdjacentZ = 0;AdjacentZ < 3;AdjacentZ++)
		{
			for (int AdjacentX = 0;AdjacentX < 3;AdjacentX++)
			{
				int VertX = junction.x - 1 + AdjacentX;
				int VertZ = junction.z - 1 + AdjacentZ;

				// prevent array out of bounds crash if X and Y are referencing a vertex on the edge of the map
				if ( false == getTerrainData()->isValidJunction(VertX, VertZ) )
				continue;
				SmoothHeight += getTerrainData()->getHeight(VertX, VertZ) ;
				vertCnt++;
			}
		}
		SmoothHeight=SmoothHeight/vertCnt;
		float Newheight = Lerp(height,SmoothHeight,std::min(StrenghScalar,1.0f)) ;
       Real diff = Newheight - height;
	   Newheight = height +   diff *seconds*getSceneManipulator()->getHeightAdjustSpeed() ;
	   return Newheight;

    }
bool
GridSelection::add(int x, int z)
{
    if (!getTerrainData()->isValidGrid(x, z))
        return false;

    size_t index = getTerrainData()->_getGridIndex(x, z);
    std::pair<GridMap::iterator, bool> inserted =
        mGrids.insert(GridMap::value_type(index, Grid(x, z, getTerrainData()->mGridInfos[index])));
    return inserted.second;
}
bool
JunctionSelection::add(int x, int z, Real weight)
{
    if (!getTerrainData()->isValidJunction(x, z))
        return false;

    size_t index = getTerrainData()->_getJunctionIndex(x, z);
    std::pair<JunctionMap::iterator, bool> inserted =
        mJunctions.insert(JunctionMap::value_type(index, Junction(x, z, getTerrainData()->getHeight(x, z), weight)));
    return inserted.second;
}
Пример #5
0
    void SmoothHeightAction::computeAverageHeight(void)
    {
        Real totalHeight = 0;
        Real totalWeight = 0;
		mMaxHeight = -1;
		mMinHeight = 100000.0f;

		MinBindPoint.first  = 500000.0f;
		MinBindPoint.second = 500000.0f;

		MaxBindPoint.first  = -1.0f;
		MaxBindPoint.second = -1.0f;

        JunctionSelection* selection = static_cast<JunctionSelection*>(
            getSceneManipulator()->_getSelection("JunctionSelection"));
        const JunctionSelection::JunctionMap& junctions = selection->getJunctions();
		if (junctions.size()<=0)
		{
			return;
		}

        JunctionSelection::JunctionMap::const_iterator it;
        for (it = junctions.begin(); it != junctions.end(); ++it)
        {
            const JunctionSelection::Junction& junction = it->second;
            totalWeight += junction.weight;
            totalHeight += getTerrainData()->getHeight(junction.x, junction.z) * junction.weight;

			mMaxHeight = getTerrainData()->getHeight(junction.x, junction.z) > mMaxHeight ? getTerrainData()->getHeight(junction.x, junction.z) :  mMaxHeight ; 
			mMinHeight = getTerrainData()->getHeight(junction.x, junction.z) < mMinHeight ? getTerrainData()->getHeight(junction.x, junction.z) :  mMinHeight ;

			MinBindPoint.first = MinBindPoint.first < junction.x ? MinBindPoint.first	 :  junction.x  ; 
			MinBindPoint.second = MinBindPoint.second < junction.z ? MinBindPoint.second :  junction.z  ; 
			MaxBindPoint.first = MaxBindPoint.first > junction.x ? MaxBindPoint.first	 :  junction.x  ; 
			MaxBindPoint.second = MaxBindPoint.second > junction.z ? MaxBindPoint.second :  junction.z  ; 
        }
        mAverageHeight = totalWeight ? totalHeight / totalWeight : 0;

		//----------------------
		//  lefttop					right top
		//  min.x max.y  ---------- max.x max.y
		//   |							|
		//   |							|
		//   |							|
		//   min.x min.y-----------max.x min.y

		float leftdown_h =  getTerrainData()->getHeight(MinBindPoint.first, MinBindPoint.second);
		float righttop_h =  getTerrainData()->getHeight(MaxBindPoint.first, MaxBindPoint.second);
		float lefttop_h =   getTerrainData()->getHeight(MinBindPoint.first, MaxBindPoint.second);
		float rightdown_h =  getTerrainData()->getHeight(MaxBindPoint.first, MinBindPoint.second);

		if (	abs(righttop_h-lefttop_h)   > 	abs(righttop_h-rightdown_h))
			ScalarX_axis = true;
		else
			ScalarX_axis = false;
	
	
    }
bool
GridSelection::setValue(int x, int z, const TerrainData::GridInfo& info)
{
    if (!getTerrainData()->isValidGrid(x, z))
        return false;

    GridMap::iterator it = mGrids.find(getTerrainData()->_getGridIndex(x, z));
    if (it == mGrids.end())
        return false;

    it->second.info = info;
    return true;
}
bool
JunctionSelection::setValue(int x, int z, Real height)
{
    if (!getTerrainData()->isValidJunction(x, z))
        return false;

    JunctionMap::iterator it = mJunctions.find(getTerrainData()->_getJunctionIndex(x, z));
    if (it == mJunctions.end())
        return false;

    it->second.height = height;
    return true;
}
Пример #8
0
    void
    JunctionPoints::refresh(void)
    {
        JunctionSelection* selection = static_cast<JunctionSelection*>(
            getSceneManipulator()->_getSelection("JunctionSelection"));
        const JunctionSelection::JunctionMap& junctions = selection->getJunctions();

        DisplayNodes newDisplayNodes;

        // Use existing point if possible
        for (JunctionSelection::JunctionMap::const_iterator it = junctions.begin(); it != junctions.end(); ++it)
        {
            const JunctionSelection::Junction& junction = it->second;

            Ogre::Vector3 pos = getTerrainData()->_getPosition(junction.x, junction.z);
            DisplayNodes::iterator found = mDisplayNodes.find(Ogre::Vector4(pos.x, pos.y, pos.z, junction.weight));
            Ogre::SceneNode* node = NULL;
            if (found != mDisplayNodes.end())
            {
                node = found->second;
                mDisplayNodes.erase(found);
            }

			newDisplayNodes.insert(DisplayNodes::value_type(Ogre::Vector4(pos.x, pos.y, pos.z, junction.weight), node));
        }

        // Build new point and adjust position
        for (DisplayNodes::iterator it = newDisplayNodes.begin(); it != newDisplayNodes.end(); ++it)
        {
            if (!it->second)
            {
                if (!mDisplayNodes.empty())
                {
                    DisplayNodes::iterator found = mDisplayNodes.begin();
                    it->second = found->second;
                    mDisplayNodes.erase(found);
                }
                else
                {
                    it->second = allocNode();
                }

                it->second->setPosition(it->first.x,it->first.y,it->first.z);

				// 根据节点的权重来设置节点所挂物体的材质颜色
				Ogre::MaterialPtr material = createPureColourMaterial(Ogre::ColourValue(it->first.w,(1.0f-it->first.w),0.0f));

				// 设置节点的材质
				static_cast<Ogre::Entity *>(it->second->getAttachedObject(0))->setMaterialName(material->getName());		
            }
        }

        // Hide extra points
        for (DisplayNodes::const_iterator it = mDisplayNodes.begin(); it != mDisplayNodes.end(); ++it)
        {
            freeNode(it->second);
        }

        std::swap(newDisplayNodes, mDisplayNodes);
    }
Пример #9
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());
            }
        }
    }
Пример #10
0
    void TrueSmoothHeightAction::computeAverageHeight(void)
    {

        Real totalHeight = 0;
        Real totalWeight = 0;

        JunctionSelection* selection = static_cast<JunctionSelection*>( getSceneManipulator()->_getSelection("JunctionSelection"));
        const JunctionSelection::JunctionMap& junctions = selection->getJunctions();
        JunctionSelection::JunctionMap::const_iterator it;
        for (it = junctions.begin(); it != junctions.end(); ++it)
        {
            const JunctionSelection::Junction& junction = it->second;
            totalWeight += junction.weight;
            totalHeight += getTerrainData()->getHeight(junction.x, junction.z) * junction.weight;

			if(it == junctions.begin())
			{
				MinBindPoint = std::pair<int, int>(junction.x,junction.z);
				MaxBindPoint = std::pair<int, int>(junction.x,junction.z);
			}else
			{
				MinBindPoint.first = MinBindPoint.first < junction.x ? MinBindPoint.first :  junction.x  ; 
				MinBindPoint.second = MinBindPoint.second < junction.z ? MinBindPoint.second :  junction.z  ; 
				MaxBindPoint.first = MaxBindPoint.first > junction.x ? MaxBindPoint.first :  junction.x  ; 
				MaxBindPoint.second = MaxBindPoint.second > junction.z ? MaxBindPoint.second :  junction.z  ; 
			}
        }
			 mWeightcnt=MaxBindPoint.first-MinBindPoint.first+1;
			 mHeightcnt=MaxBindPoint.second-MinBindPoint.second+1;

        mAverageHeight = totalWeight ? totalHeight / totalWeight : 0;
    }
Пример #11
0
    //-----------------------------------------------------------------------
    void TerrainLayerOneEraserAction::_doErase(GridSelection* modified)
    {
        const GridSelection::GridMap& grids = mCurrentGrids->getGrids();

        bool anyModified = false;

        if (!grids.empty())
        {            
            for (GridSelection::GridMap::const_iterator it = grids.begin(); it != grids.end(); ++it)
            {
                const GridSelection::Grid& grid = it->second;
                TerrainData::GridInfo info = grid.info;

                if ( info.layers[1].pixmapId )
                {
                    info.layers[1].pixmapId = 0;
                    info.layers[1].orientation = 0;
                }

                if (info == grid.info)
                    continue;

                anyModified = true;
                modified->add(grid.x, grid.z);
                getTerrainData()->setGridInfo(grid.x, grid.z, info);
            }

            if (anyModified)
            {
                mCurrentGrids->notifyModified();
            }
        }
    }
    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());
            }
        }
    }
    void GridInfoFlagModifyAction::_modifyFlag(const Point& pt)
    {
        GridSelection* selection = static_cast<GridSelection*>(
            getSceneManipulator()->_getSelection("GridSelection"));

        Ogre::Vector3 position;
        bool intersected = getSceneManipulator()->getTerrainIntersects(pt.x, pt.y, position);

        if (intersected)
            getSceneManipulator()->_buildSelection(selection, position.x, position.z);

        const GridSelection::GridMap& grids = selection->getGrids();

        GridSelection::GridMap::const_iterator it;
        for (it = grids.begin(); it != grids.end(); ++it)
        {
            const GridSelection::Grid& grid = it->second;
            TerrainData::GridInfo info = grid.info;
            info.flags ^= mModifiedFlag;

            getTerrainData()->setGridInfo(grid.x, grid.z, info);
        }

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

    }
Пример #15
0
void
GridSelection::apply(void)
{
    for (GridMap::const_iterator it = mGrids.begin(); it != mGrids.end(); ++it)
    {
        const Grid& grid = it->second;
        getTerrainData()->setGridInfo(grid.x, grid.z, grid.info);
    }
    notifyModified();
}
Пример #16
0
    bool CreateObjectAction::updateInstance(const Point& pt)
    {
        if (mObjectType.empty())
        {
            hide();
            return false;
        }

        Ogre::Vector3 position, normal;
        if (!getSceneManipulator()->getTerrainIntersects(pt, position, &normal, true))
        {
            hide();
            return false;
        }

        if (!mObject)
        {
            mObject = ObjectFactoryManager::getSingleton().createInstance(mObjectType);
            mObject->setPropertyList(mParameters);
            mObject->createRenderInstance(getSceneManipulator());		
        }
        else
        {
            mObject->setPropertyList(mParameters);
        }

        Ogre::Vector3 groundingPoint(Ogre::Vector3::ZERO);
        if (mObject->hasProperty("grounding point"))
        {
            // Adjust position by grounding point
            groundingPoint = VariantCast<Ogre::Vector3>(mObject->getProperty("grounding point"));
            position -= groundingPoint;
        }
        position = getSceneManipulator()->_alignPosition(position);
        position.y = getTerrainData()->getHeightAt(position.x, position.z) - groundingPoint.y;
        position = getSceneManipulator()->_alignPosition(position);
		if(!mHasPosition)
			mObject->setProperty("position", position);

		mRangeSphereNode->setVisible(false);
		Ogre::String type = mObject->getType();
		if ( type == "Light")
		{
			LightObject *lightObject = static_cast<LightObject *> (mObject.get());
			if (mObject->getPropertyAsString("type") == "point")
			{
				mRangeSphereNode->setPosition(position);
				mRangeSphereNode->setVisible(true);
			}
		}

        return true;
    }
Пример #17
0
    void SetTerrainHeightAction::_doModify(const Point& pt)
    {
        Ogre::Vector3 position;
        bool intersected = getSceneManipulator()->getTerrainIntersects(pt, position);
        if (intersected)
        {
            bool anyModified = false;

            JunctionSelection* selection = static_cast<JunctionSelection*>(
                getSceneManipulator()->_getSelection("JunctionSelection"));
            getSceneManipulator()->_buildSelection(selection, position.x, position.z);

            const JunctionSelection::JunctionMap& junctions = selection->getJunctions();
            JunctionSelection::JunctionMap::const_iterator it;
            std::vector<TerrainInfo> terrainInfo;
            for (it = junctions.begin(); it != junctions.end(); ++it)
            {
                const JunctionSelection::Junction& junction = it->second;
                Real newHeight = mTerrainHeight;
                if (newHeight != junction.height)
                {
                    anyModified = true;
                    mModifiedJunctions->add(junction.x, junction.z, 1);
                    

                    TerrainInfo terrInfo;
                    terrInfo.x = junction.x;
                    terrInfo.z = junction.z;
                    terrInfo.oldHeight = junction.height;
                    terrInfo.nowHeight = newHeight;
                    terrainInfo.push_back(terrInfo);

                    getTerrainData()->setHeight(junction.x, junction.z, newHeight);
                }
            }
            getSceneManipulator()->_fireTerrainHeightChanged(terrainInfo);

            if (anyModified)
            {
                selection->notifyModified();
            }

            getSceneManipulator()->getHitIndicator("JunctionPoints")->refresh();
        }
        else
        {
            getSceneManipulator()->getHitIndicator("JunctionPoints")->setHitPoint(pt);
        }

        getSceneManipulator()->getHitIndicator("IntersectPoint")->setHitPoint(pt);
    }
Пример #18
0
    Real SmoothHeightAction::_computeHeight(const JunctionSelection::Junction& junction, Real seconds)
    {
        Real height = getTerrainData()->getHeight(junction.x, junction.z);

		if (	mSmoothType == ENUM_SMOOTH_TYPE::SMOOTH_TYPE_TYPE_SMOOTH )
		{
	
		Real diff = mAverageHeight - height;
		Real secondsRequest = Ogre::Math::Abs(diff * junction.weight / getSceneManipulator()->_getHeightAdjustSpeed());
		if (secondsRequest < seconds)
			return mAverageHeight;
		else
			return height + diff * seconds / secondsRequest;
		}


		float StrenghScalar;
		if(ScalarX_axis)
			StrenghScalar = (float)(junction.x - MinBindPoint.first) / (float)(MaxBindPoint.first - MinBindPoint.first);
		else
			StrenghScalar = (float)(junction.z - MinBindPoint.second) / (float)(MaxBindPoint.second - MinBindPoint.second);

		if (StrenghScalar < 0.0f)
			StrenghScalar = 0.0f;

		float  minValue  =  mMaxHeight  ;
		float  maxValue  =  mMinHeight  ;
		float Newheight ;
		if (  getTerrainData()->getHeight(MaxBindPoint.first, MaxBindPoint.second)  <   getTerrainData()->getHeight(MinBindPoint.first, MinBindPoint.second)  )
			Newheight = Lerp(minValue,maxValue,min(StrenghScalar,1.0f)) ;
		else
			Newheight = Lerp(maxValue,minValue,min(StrenghScalar,1.0f)) ;

		Real diff = Newheight - height;
		Newheight = height +   diff *seconds*getSceneManipulator()->getHeightAdjustSpeed() ;
		return Newheight;

    }
Пример #19
0
void CameraDragMove::_onDrag(const Point& pt)
{
    if (!mTerrainHitInfo.hitted)
        return;

    Ogre::Ray ray = getSceneManipulator()->getWindowToViewportRay(pt);
    if (!ray.getDirection().y)
        return;

    Ogre::Vector3 newPosition;

    // 对正交投影和透视投影分开处理
    if (getSceneManipulator()->getCamera()->getProjectionType() == Ogre::PT_ORTHOGRAPHIC)
    {
        Real offsetx = mRay.getOrigin().x  - ray.getOrigin().x;
        Real offsetz = mRay.getOrigin().z - ray.getOrigin().z;

        newPosition.x = getSceneManipulator()->getCamera()->getRealPosition().x + offsetx;
        newPosition.y = getSceneManipulator()->getCamera()->getRealPosition().y;
        newPosition.z = getSceneManipulator()->getCamera()->getRealPosition().z + offsetz;
    }
    else
    {
        Real length = (mTerrainHitInfo.position.y - mTerrainHitInfo.hitPosition.y) / ray.getDirection().y;
        newPosition = mTerrainHitInfo.hitPosition + ray.getDirection() * length;

        if (getSceneManipulator()->getCameraHeightLocked())
        {
            newPosition.y +=
                getTerrainData()->getHeightAt(newPosition.x, newPosition.z) -
                getTerrainData()->getHeightAt(mTerrainHitInfo.position.x, mTerrainHitInfo.position.z);
        }

    }

    getSceneManipulator()->setCameraPosition(newPosition);
}
Пример #20
0
void
JunctionSelection::apply(void)
{
    std::vector<TerrainInfo> terrainInfo;
    for (JunctionMap::const_iterator it = mJunctions.begin(); it != mJunctions.end(); ++it)
    {
        const Junction& junction = it->second;

        float oldHeight = getTerrainData()->getHeight(junction.x,junction.z);

        TerrainInfo terrInfo;
        terrInfo.x = junction.x;
        terrInfo.z = junction.z;
        terrInfo.oldHeight = oldHeight;
        terrInfo.nowHeight = junction.height;
        terrainInfo.push_back(terrInfo);

        
        getTerrainData()->setHeight(junction.x, junction.z, junction.height);
    }
    
    getSceneManipulator()->_fireTerrainHeightChanged(terrainInfo);
    notifyModified();
}
Пример #21
0
    //-----------------------------------------------------------------------
    void
        PaintAction::updatePixmapInfo(void) const
    {
        mPixmapId = getTerrainData()->_registerPixmap(
            mPixmap.textureName,
            mPixmap.left,
            mPixmap.top,
            mPixmap.right,
            mPixmap.bottom);

        mPixmapTransparent = false;
        if (!mPixmap.textureName.empty())
        {
            mPixmapTransparent = getSceneManipulator()->IsTransparentTexture(mPixmap.textureName);
        }

        mPixmapInfoValid = true;
    }
	bool CreateComplexObjectAction::updateInstance(const Point& pt)
	{
		if (mObjectType.empty())
		{
			hide();
			return false;
		}

		Ogre::Vector3 position, normal;
		if (!getSceneManipulator()->getTerrainIntersects(pt, position, &normal, true))
		{
			hide();
			return false;
		}

		if (!mObject)
		{
			mObject = ObjectFactoryManager::getSingleton().createInstance(mObjectType);
			mObject->setPropertyList(mParameters);

			// 设置物体的位置
			Ogre::Vector3 groundingPoint(Ogre::Vector3::ZERO);
			if (mObject->hasProperty("grounding point"))
			{
				// Adjust position by grounding point
				groundingPoint = VariantCast<Ogre::Vector3>(mObject->getProperty("grounding point"));
				position -= groundingPoint;
			}
			position = getSceneManipulator()->_alignPosition(position);
			position.y = getTerrainData()->getHeightAt(position.x, position.z) - groundingPoint.y;
			position = getSceneManipulator()->_alignPosition(position);
			mObject->setProperty("position", position);

			mObject->createRenderInstance(getSceneManipulator());
		}
		else
		{
			mObject->setPropertyList(mParameters);
		}
		
		return true;
	}
Пример #23
0
 Real RaiseHeightAction::_computeHeight(const JunctionSelection::Junction& junction, Real seconds)
 {
     return getTerrainData()->getHeight(junction.x, junction.z) + mAdjust * junction.weight;
 }
Пример #24
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();        
    }
Пример #25
0
bool
GridSelection::exist(int x, int z) const
{
    return getTerrainData()->isValidGrid(x, z) &&
            mGrids.find(getTerrainData()->_getGridIndex(x, z)) != mGrids.end();
}
Пример #26
0
bool
GridSelection::remove(int x, int z)
{
    return getTerrainData()->isValidGrid(x, z) &&
            mGrids.erase(getTerrainData()->_getGridIndex(x, z)) > 0;
}
Пример #27
0
bool
JunctionSelection::remove(int x, int z)
{
    return getTerrainData()->isValidJunction(x, z) &&
            mJunctions.erase(getTerrainData()->_getJunctionIndex(x, z)) > 0;
}
Пример #28
0
bool
JunctionSelection::exist(int x, int z) const
{
    return getTerrainData()->isValidJunction(x, z) &&
            mJunctions.find(getTerrainData()->_getJunctionIndex(x, z)) != mJunctions.end();
}