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; }
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); }
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(); }