Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
            }
        }
Beispiel #5
0
        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);            
     
 }
Beispiel #7
0
        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();
                }
            }
        }
Beispiel #8
0
 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);                            
 }