private void ApplyBrush(ViewControl vc, System.Drawing.Point scrPt) { TerrainGob terrain = m_terrainEditor.TerrainEditorControl.SelectedTerrain; TerrainBrush brush = m_terrainEditor.TerrainEditorControl.SelectedBrush; TerrainMap terrainMap = m_terrainEditor.TerrainEditorControl.SelectedTerrainMap; if (brush == null || (!brush.CanApplyTo(terrain) && !brush.CanApplyTo(terrainMap))) { return; } Ray3F rayw = vc.GetWorldRay(scrPt); TerrainGob.RayPickRetVal retval; if (terrain.RayPick(rayw, out retval)) { TerrainOp op = null; if (brush.CanApplyTo(terrain)) { Point pt = terrain.WorldToSurfaceSpace(retval.hitpos); brush.Apply(terrain, pt.X, pt.Y, out op); } else if (brush.CanApplyTo(terrainMap)) { Point pt = terrainMap.WorldToSurfaceSpace(retval.hitpos); brush.Apply(terrainMap, pt.X, pt.Y, out op); } m_tmpOps.Add(op); m_terrainOpList.Add(new WeakReference(op)); m_memUsage += op.SizeInBytes; } }
void IManipulator.Render(ViewControl vc) { TerrainGob terrain = m_terrainEditor.TerrainEditorControl.SelectedTerrain; TerrainBrush brush = m_terrainEditor.TerrainEditorControl.SelectedBrush; TerrainMap terrainMap = m_terrainEditor.TerrainEditorControl.SelectedTerrainMap; if (brush == null || (!brush.CanApplyTo(terrain) && !brush.CanApplyTo(terrainMap))) { return; } Vec2F drawscale = new Vec2F(1.0f, 1.0f); if (brush.CanApplyTo(terrainMap)) { ImageData mapImg = terrainMap.GetSurface(); ImageData hmImg = terrain.GetSurface(); drawscale.X = (float)hmImg.Width / (float)mapImg.Width; drawscale.Y = (float)hmImg.Height / (float)mapImg.Height; } Point scrPt = vc.PointToClient(Control.MousePosition); if (!vc.ClientRectangle.Contains(scrPt)) { return; } Ray3F rayw = vc.GetWorldRay(scrPt); TerrainGob.RayPickRetVal retval; if (terrain.RayPick(rayw, out retval)) { terrain.DrawBrush(brush, drawscale, retval.hitpos); } }
public void DrawBrush(TerrainBrush brush, Vec2F drawscale, Vec3F posW) { INativeObject nobj = this.As <INativeObject>(); DrawBrushArgs arg; arg.falloff = brush.Falloff; arg.radius = (float)brush.Radius; arg.posW = posW; arg.drawscale = drawscale; IntPtr argPtr = new IntPtr(&arg); IntPtr retval; nobj.InvokeFunction("DrawBrush", argPtr, out retval); }
private void BrushRdoCheckedChanged(object sender, EventArgs e) { RadioButton button = (RadioButton)sender; m_selectedBrush = button.Checked ? (TerrainBrush)button.Tag : null; if (m_selectedBrush == null) { m_brushProps.Bind(null); } else { m_brushProps.Bind(m_selectedBrush); } }
bool IManipulator.Pick(ViewControl vc, System.Drawing.Point scrPt) { TerrainGob terrain = m_terrainEditor.TerrainEditorControl.SelectedTerrain; TerrainBrush brush = m_terrainEditor.TerrainEditorControl.SelectedBrush; if (terrain != null && brush != null) { FlattenBrush fbrush = brush as FlattenBrush; if (fbrush != null) { Ray3F rayw = vc.GetWorldRay(scrPt); TerrainGob.RayPickRetVal retval; if (terrain.RayPick(rayw, out retval)) { Point pt = terrain.WorldToSurfaceSpace(retval.hitpos); ImageData hm = terrain.GetSurface(); fbrush.Height = hm.GetPixelFloat(pt.X, pt.Y); } } return(true); } return(false); }
private void BrushRdoCheckedChanged(object sender, EventArgs e) { RadioButton button = (RadioButton)sender; m_selectedBrush = button.Checked ? (TerrainBrush)button.Tag : null; if (m_selectedBrush == null) m_brushProps.Bind(new object()); else m_brushProps.Bind(m_selectedBrush); }
void IManipulator.OnEndDrag(ViewControl vc, Point scrPt) { if (!dragged) { ApplyBrush(vc, scrPt); } dragged = false; if (m_tmpOps.Count > 0) { TerrainBrush brush = m_terrainEditor.TerrainEditorControl.SelectedBrush; string transName = string.Format("Apply {0} brush", brush.Name); GameContext context = m_designView.Context.As <GameContext>(); context.DoTransaction( delegate { foreach (var op in m_tmpOps) { context.TransactionOperations.Add(op); } }, transName); m_tmpOps.Clear(); } if (m_memUsage > MemoryQuota) { m_memUsage = 0; // removed all the TerrainOps that been GC-ed // and re-compute current memory usage. List <WeakReference> tmplist = new List <WeakReference>(); foreach (WeakReference wkref in m_terrainOpList) { if (!wkref.IsAlive) { tmplist.Add(wkref); } else { m_memUsage += ((TerrainOp)wkref.Target).SizeInBytes; } } if (m_memUsage == 0) { m_terrainOpList.Clear(); } else { foreach (WeakReference wkref in tmplist) { m_terrainOpList.Remove(wkref); } } // disable oldest terrainOP to free memory. int limit = MemoryQuota - MemoryQuota / 5; foreach (WeakReference wkref in m_terrainOpList) { if (m_memUsage < limit) { break; } TerrainOp op = (TerrainOp)wkref.Target; m_memUsage -= op.SizeInBytes; op.FreeData(); } } }
public void DrawBrush(TerrainBrush brush, Vec2F drawscale, Vec3F posW) { INativeObject nobj = this.As<INativeObject>(); DrawBrushArgs arg; arg.falloff = brush.Falloff; arg.radius = (float)brush.Radius; arg.posW = posW; arg.drawscale = drawscale; IntPtr argPtr = new IntPtr(&arg); IntPtr retval; nobj.InvokeFunction("DrawBrush", argPtr, out retval); }