void LowerHeightAction::process(Selection * sel, const Gui3DMouseEvent &, bool selChanged, Type type) { // ok the lower height action is our "dirt dig" action // only works on brushes... Brush *brush = dynamic_cast<Brush *>(sel); if(!brush) return; if ( type == End ) return; Point2I brushPos = brush->getPosition(); Point2I brushSize = brush->getSize(); GridPoint brushGridPoint = brush->getGridPoint(); Vector<GridInfo> cur; // the height at the brush position mTerrainEditor->getGridInfos(brushGridPoint, cur); if (cur.size() == 0) return; // we get 30 process actions per second (at least) F32 heightAdjust = -mTerrainEditor->mAdjustHeightVal / 30; // nothing can get higher than the current brush pos adjusted height F32 maxHeight = cur[0].mHeight + heightAdjust; if(maxHeight < 0) maxHeight = 0; for(U32 i = 0; i < sel->size(); i++) { mTerrainEditor->getUndoSel()->add((*sel)[i]); if((*sel)[i].mHeight > maxHeight) { (*sel)[i].mHeight += heightAdjust * (*sel)[i].mWeight; if((*sel)[i].mHeight < maxHeight) (*sel)[i].mHeight = maxHeight; } mTerrainEditor->setGridInfo((*sel)[i]); } mTerrainEditor->scheduleGridUpdate(); }