Example #1
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);
    }
    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;
    }
Example #3
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;
	
	
    }
    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);
    }
Example #5
0
    void
    JunctionPoints::_setHitPoint(Real x, Real y)
    {
        JunctionSelection* selection = static_cast<JunctionSelection*>(
            getSceneManipulator()->_getSelection("JunctionSelection"));

        Ogre::Vector3 position;
        bool intersected = getSceneManipulator()->getTerrainIntersects(x, y, position);
        if (!intersected)
        {
            selection->reset();
            hide();
            return;
        }
        getSceneManipulator()->_buildSelection(selection, position.x, position.z);

        refresh();
    }