wpf游戏引擎下的Geometry实现

发布于:2025-06-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

1.Geometry.cs

using PrimalEditor.Common;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Printing.IndexedProperties;
using System.Text;
using System.Threading.Tasks;

namespace PrimalEditor.Content
{

    enum PrimitiveMeshType 
    {
    
        Plane,
        Cube,
        UvSphere,
        IcoSphere,
        Cylinder,
        Capsule
    
    
    
    }

    class Mesh : ViewModelBase 
    {

        private int _vertexSize;

        public int VertexSize
        {
            get => _vertexSize;

            set
            {

                if (_vertexSize != value)
                {

                    _vertexSize = value;
                    OnPropertyChanged(nameof(VertexSize));

                }


            }

        }

        private int _vertexCount;

        public int VertexCount
        {
            get => _vertexCount;

            set
            {

                if (_vertexCount != value)
                {

                    _vertexCount = value;
                    OnPropertyChanged(nameof(VertexCount));

                }


            }

        }

        private int _indexSize;

        public int IndexSize
        {
            get => _indexSize;

            set
            {

                if (_indexSize != value)
                {

                    _indexSize = value;
                    OnPropertyChanged(nameof(IndexSize));

                }


            }

        }

        private int _indexCount;

        public int IndexCount
        {
            get => _indexCount;

            set
            {

                if (_indexCount != value)
                {

                    _indexCount = value;
                    OnPropertyChanged(nameof(IndexCount));

                }


            }

        }


        public byte[] Vertices { get; set; }
        public byte[] Indices { get; set; }

    }


    class MeshLOD : ViewModelBase 
    {

        private string _name;

        public string Name
        {
            get => _name;

            set
            {

                if (_name != value)
                {

                    _name = value;
                    OnPropertyChanged(nameof(Name));

                }


            }

        }

        private float _lodThreshold;
       


        public float LodThreshold 
        {
            get => _lodThreshold;
            set 
            {
                if (_lodThreshold != value) 
                {
                    _lodThreshold = value;
                    OnPropertyChanged(nameof(LodThreshold));
                
                
                
                }
            
            
            
            
            }
        
        
        
        }

        public ObservableCollection<Mesh> Meshes { get; } = new ObservableCollection<Mesh>();


    }

    class LODGroup : ViewModelBase 
    {
        private string _name;

        public string Name 
        {
            get =>_name;

            set 
            {

                if (_name != value) 
                {
                
                    _name = value;
                    OnPropertyChanged(nameof(Name));
                
                
                
                }
            
            
            
            
            }
        
        
            
        
        
        
        
        }
    
    
        public ObservableCollection<MeshLOD> LODs { get; } = new ObservableCollection<MeshLOD> ();
    
    
    
    
    }


    class Geometry :Asset
    {


        private readonly List<LODGroup> _lodGroups = new List<LODGroup> ();


        public LODGroup GetLODGroup(int lodGroup = 0) 
        {

            Debug.Assert(lodGroup >= 0 && lodGroup < _lodGroups.Count);

            return _lodGroups.Any() ? _lodGroups[lodGroup] : null;
        
        }


        public void FromRawData(byte[] data) 
        {
        
            Debug.Assert(data?.Length > 0);
            _lodGroups.Clear ();


            using var reader = new BinaryReader(new MemoryStream(data));

            //skip scene name string
            var s = reader.ReadInt32();
            reader.BaseStream.Position += s;

            //get number of LODs
            var numLODGroups = reader.ReadUInt32();
            Debug.Assert (numLODGroups > 0);
            for (int i = 0; i < numLODGroups; ++i) 
            {
                s = reader.ReadInt32();
                string lodGroupName;
                if (s > 0)
                {

                    var nameBytes = reader.ReadBytes(s);
                    lodGroupName = Encoding.UTF8.GetString(nameBytes);

                }
                else 
                {
                    lodGroupName = $"lod_{ContentHelper.GetRandomString()}";
                
                
                
                }


                //get number of meshes in this LOD group
                var numMeshes  = reader.ReadUInt32();
                Debug.Assert (numMeshes > 0);   
            
            
            
            }


        
        }

        public override IEnumerable<string> Save(string file)
        {
            throw new NotImplementedException();
        }

        public Geometry() : base(AssetType.Mesh) { }


    }
}