/// <summary>
        /// Safely acquires a mesh for processing. Checks for meshes which have already been processed and increments reference counts.
        /// </summary>
        /// <param name="mesh">A reference to the mesh which was already processed or is ready to be processed.</param>
        /// <returns>True if the mesh was already processed, false otherwise.</returns>
        private bool AcquirePreprocessedMesh(out Mesh mesh)
        {
            var sharedMesh = meshFilter.sharedMesh;

            MeshReference meshReference;

            // If this mesh has already been processed, apply the preprocessed mesh and increment the reference count.
            if (sharedMesh != null && processedMeshes.TryGetValue(sharedMesh, out meshReference))
            {
                meshReference.Increment();
                mesh            = meshReference.Mesh;
                meshFilter.mesh = mesh;

                return(true);
            }

            // Clone the mesh, and create a mesh reference which can be keyed off either the original mesh or cloned mesh.
            mesh                  = meshFilter.mesh;
            meshReference         = new MeshReference(mesh);
            processedMeshes[mesh] = meshReference;

            if (sharedMesh != null)
            {
                processedMeshes[sharedMesh] = meshReference;
            }

            return(false);
        }
示例#2
0
 public Vehicle()
 {
     CameraDefinition defaultCameraDefinition = new CameraDefinition()
     {
         Distance = 10,
         FPV = true,
         Offset = Vector3.Zero,
         ViewAngle = Vector2.One,
         Style = DrawingStyle.Normal
     };
     FirstPersonCamera = new FirstPersonCamera(defaultCameraDefinition);
     ThirdPersonCamera = new ThirdPersonCamera(defaultCameraDefinition);
     CameraList = new Camera[0];
     CurrentCamera = 1;
     VehicleMesh = new MeshReference();
 }
 private void SetupMeshReferencesFromScratch()
 {
     if (WPDebug.logMeshReferences)
         DebugLogWithID("SetupMeshReferencesFromScratch", "No sources found, creating new references");
     if (!isCtrlSrf)
     {
         WingProcedural.meshReferenceWingSection = FillMeshRefererence(meshFilterWingSection);
         WingProcedural.meshReferenceWingSurface = FillMeshRefererence(meshFilterWingSurface);
         for (int i = 0; i < meshTypeCountEdgeWing; ++i)
         {
             MeshReference meshReferenceWingEdge = FillMeshRefererence(meshFiltersWingEdgeTrailing[i]);
             meshReferencesWingEdge.Add(meshReferenceWingEdge);
         }
     }
     else
     {
         WingProcedural.meshReferenceCtrlFrame = FillMeshRefererence(meshFilterCtrlFrame);
         WingProcedural.meshReferenceCtrlSurface = FillMeshRefererence(meshFilterCtrlSurface);
         for (int i = 0; i < meshTypeCountEdgeCtrl; ++i)
         {
             MeshReference meshReferenceCtrlEdge = FillMeshRefererence(meshFiltersCtrlEdge[i]);
             meshReferencesCtrlEdge.Add(meshReferenceCtrlEdge);
         }
     }
 }
 private MeshReference FillMeshRefererence(MeshFilter source)
 {
     MeshReference reference = new MeshReference();
     if (source != null)
     {
         int length = source.mesh.vertices.Length;
         reference.vp = new Vector3[length];
         Array.Copy(source.mesh.vertices, reference.vp, length);
         reference.nm = new Vector3[length];
         Array.Copy(source.mesh.normals, reference.nm, length);
         reference.uv = new Vector2[length];
         Array.Copy(source.mesh.uv, reference.uv, length);
     }
     else if (WPDebug.logMeshReferences)
         DebugLogWithID("FillMeshReference", "Mesh filter reference is null, unable to set up reference arrays");
     return reference;
 }
 public override void SetupMeshReferences()
 {
     if (meshReferenceCtrlFrame == null || meshReferenceCtrlFrame.vp.Length == 0
         || meshReferenceCtrlSurface == null || meshReferenceCtrlSurface.vp.Length == 0
         || meshReferencesCtrlEdge[meshTypeCountEdgeWing - 1] == null || meshReferencesCtrlEdge[meshTypeCountEdgeWing - 1].vp.Length == 0)
     {
         meshReferenceCtrlFrame = FillMeshRefererence(meshFilterWingSection);
         meshReferenceCtrlSurface = FillMeshRefererence(meshFilterWingSurface);
         for (int i = 0; i < meshTypeCountEdgeWing; ++i)
         {
             MeshReference meshReferenceCtrlEdge = FillMeshRefererence(meshFiltersWingEdgeTrailing[i]);
             meshReferencesCtrlEdge.Add(meshReferenceCtrlEdge);
         }
     }
 }
 public virtual MeshReference FillMeshRefererence(MeshFilter source)
 {
     if (source != null)
     {
         MeshReference reference = new MeshReference();
         int length = source.mesh.vertices.Length;
         reference.vp = new Vector3[length];
         Array.Copy(source.mesh.vertices, reference.vp, length);
         reference.nm = new Vector3[length];
         Array.Copy(source.mesh.normals, reference.nm, length);
         reference.uv = new Vector2[length];
         Array.Copy(source.mesh.uv, reference.uv, length);
         return reference;
     }
     return null;
 }
示例#7
0
        public static WLD Load(Stream stream,string name="default.wld")
        {
            WLD wld = new WLD();
            wld.Name = name;
            int size = Marshal.SizeOf(typeof(WLDHeader));
            var barray = new byte[size];
            stream.Read(barray, 0, size);

            var header = Functions.ByteArrayToStructure<WLDHeader>(barray);

            if (header.Magic != 0x54503d02)
            {
                throw new Exception("Invalid file format");
            }

            if (header.Version == 0x00015500)
            {
                wld._format = Format.Old;
            }
            else if (header.Version == 0x1000C800)
            {
                wld._format = Format.New;
            }
            else
            {
                throw new Exception("Unknown file version");
            }

            //var shash = stream.Position;
            barray = new byte[header.StringHashSize];
            stream.Read(barray, 0, (int)header.StringHashSize);
            wld._sHash = WLD.DecodeFileName(barray);
            wld._strings = wld._sHash.Split('\0');

            var fragCount = header.FragmentCount;

            stream.Seek(size + header.StringHashSize, SeekOrigin.Begin);

            int fragSize = Marshal.SizeOf(typeof(BasicWLDFragment));

            for (int i = 0; i < header.FragmentCount; i++)
            {
                barray = new byte[fragSize];
                stream.Read(barray, 0, fragSize);
                var fragment = Functions.ByteArrayToStructure<BasicWLDFragment>(barray);
                int nameRef = (int)fragment.NameRef;

                var position = stream.Position;

                switch (fragment.Id)
                {
                    case 0x03:
                        var bmpname = new BitmapName(i, nameRef);
                        bmpname.Handler(stream);
                        wld._fragments.Add(bmpname);
                        break;
                    case 0x04:
                        var binfo = new BitmapInfo(i, nameRef);
                        binfo.Handler(stream);
                        wld._fragments.Add(binfo);
                        break;
                    case 0x05:
                        var bitmapInfoRef = new BitmapInfoReference(i, nameRef);
                        bitmapInfoRef.Handler(stream);
                        wld._fragments.Add(bitmapInfoRef);
                        break;
                    case 0x09:
                        break;
                    case 0x10:
                        var skelset = new SkeletonTrackSet(i, nameRef);
                        skelset.Handler(stream);
                        skelset.FragmentName = wld.GetStringAtHashIndex(0-skelset.FragmentNameRef);
                        wld._fragments.Add(skelset);
                        break;
                    case 0x11:
                        var skeltrackRef = new SkeletonTrackReference(i, nameRef);
                        skeltrackRef.Handler(stream);
                        wld._fragments.Add(skeltrackRef);
                        break;
                    case 0x12:
                        var skelpiece = new SkeletonPieceTrack(i, nameRef);
                        skelpiece.Handler(stream);
                        wld._fragments.Add(skelpiece);
                        break;
                    case 0x13:
                        var skelpref = new SkeletonPieceTrackReference(i, nameRef);
                        skelpref.Handler(stream);
                        //skelpref.FragmentName = wld.GetStringAtHashIndex(0 - skelpref.FragmentNameRef);
                        wld._fragments.Add(skelpref);
                        break;
                    case 0x14:
                        var modelref = new ModelReference(i, nameRef);
                        modelref.Handler(stream);
                        modelref.FragmentName = wld.GetStringAtHashIndex(0 - modelref.FragmentNameRef);
                        wld._fragments.Add(modelref);
                        modelref.MagicString = wld.GetStringAtHashIndex(modelref.MagicStringRef);
                        break;
                    case 0x15:
                        var objlocation = new ObjectLocation(i, nameRef);
                        objlocation.Handler(stream);
                        wld._fragments.Add(objlocation);
                        break;
                    case 0x22:
                        //num_0x22++;
                        break;
                    case 0x2d:
                        var meshref = new MeshReference(i, nameRef);
                        meshref.Handler(stream);
                        wld._fragments.Add(meshref);
                        break;
                    case 0x31:
                        var tlist = new TextureList(i, nameRef);
                        tlist.Handler(stream);
                        wld._fragments.Add(tlist);
                        break;
                    case 0x30:
                        var texture = new Texture(i, nameRef);
                        texture.Handler(stream);
                        wld._fragments.Add(texture);
                        break;
                    // Grab the number of vertices and polygons
                    case 0x36:
                        var mesh = new Mesh(i, nameRef);
                        mesh.Handler(stream);
                        wld._fragments.Add(mesh);
                        break;
                }
                stream.Seek(position + fragment.Size - 4, SeekOrigin.Begin);
            }

            return wld;
        }
示例#8
0
 public Object()
 {
     ObjectMesh = new MeshReference();
     RoadEndpoints = new Node[0];
 }
示例#9
0
 public Field()
 {
     Meshes = new MeshReference[0];
     Polygon = new Node[0];
 }
示例#10
0
文件: Entity.cs 项目: zeiban/onyx
        public static Entity CreatePrimitive(PrimitiveType type)
        {
            Entity        entity  = new Entity();
            MeshReference meshRef = entity.AddComponent <MeshReference>();
            Mesh          mesh    = meshRef.Mesh = new Mesh();

            mesh.Vertices = new[]
            {
                new Vector3(-1.0f, -1.0f, -1.0f), //Front
                new Vector3(-1.0f, 1.0f, -1.0f),
                new Vector3(1.0f, 1.0f, -1.0f),
                new Vector3(-1.0f, -1.0f, -1.0f),
                new Vector3(1.0f, 1.0f, -1.0f),
                new Vector3(1.0f, -1.0f, -1.0f),

                new Vector3(-1.0f, -1.0f, 1.0f), //Back
                new Vector3(1.0f, 1.0f, 1.0f),
                new Vector3(-1.0f, 1.0f, 1.0f),
                new Vector3(-1.0f, -1.0f, 1.0f),
                new Vector3(1.0f, -1.0f, 1.0f),
                new Vector3(1.0f, 1.0f, 1.0f),

                new Vector3(-1.0f, 1.0f, -1.0f), // Top
                new Vector3(-1.0f, 1.0f, 1.0f),
                new Vector3(1.0f, 1.0f, 1.0f),
                new Vector3(-1.0f, 1.0f, -1.0f),
                new Vector3(1.0f, 1.0f, 1.0f),
                new Vector3(1.0f, 1.0f, -1.0f),

                new Vector3(-1.0f, -1.0f, -1.0f), // Bottom
                new Vector3(1.0f, -1.0f, 1.0f),
                new Vector3(-1.0f, -1.0f, 1.0f),
                new Vector3(-1.0f, -1.0f, -1.0f),
                new Vector3(1.0f, -1.0f, -1.0f),
                new Vector3(1.0f, -1.0f, 1.0f),

                new Vector3(-1.0f, -1.0f, -1.0f), // Left
                new Vector3(-1.0f, -1.0f, 1.0f),
                new Vector3(-1.0f, 1.0f, 1.0f),
                new Vector3(-1.0f, -1.0f, -1.0f),
                new Vector3(-1.0f, 1.0f, 1.0f),
                new Vector3(-1.0f, 1.0f, -1.0f),

                new Vector3(1.0f, -1.0f, -1.0f),  // right
                new Vector3(1.0f, 1.0f, 1.0f),
                new Vector3(1.0f, -1.0f, 1.0f),
                new Vector3(1.0f, -1.0f, -1.0f),
                new Vector3(1.0f, 1.0f, -1.0f),
                new Vector3(1.0f, 1.0f, 1.0f),
            };

            mesh.Colors = new[]
            {
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),
                new Color4(1.0f, 0.0f, 0.0f, 1.0f),

                new Color4(0.0f, 1.0f, 0.0f, 1.0f),
                new Color4(0.0f, 1.0f, 0.0f, 1.0f),
                new Color4(0.0f, 1.0f, 0.0f, 1.0f),
                new Color4(0.0f, 1.0f, 0.0f, 1.0f),
                new Color4(0.0f, 1.0f, 0.0f, 1.0f),
                new Color4(0.0f, 1.0f, 0.0f, 1.0f),

                new Color4(0.0f, 0.0f, 1.0f, 1.0f),
                new Color4(0.0f, 0.0f, 1.0f, 1.0f),
                new Color4(0.0f, 0.0f, 1.0f, 1.0f),
                new Color4(0.0f, 0.0f, 1.0f, 1.0f),
                new Color4(0.0f, 0.0f, 1.0f, 1.0f),
                new Color4(0.0f, 0.0f, 1.0f, 1.0f),

                new Color4(1.0f, 1.0f, 0.0f, 1.0f),
                new Color4(1.0f, 1.0f, 0.0f, 1.0f),
                new Color4(1.0f, 1.0f, 0.0f, 1.0f),
                new Color4(1.0f, 1.0f, 0.0f, 1.0f),
                new Color4(1.0f, 1.0f, 0.0f, 1.0f),
                new Color4(1.0f, 1.0f, 0.0f, 1.0f),

                new Color4(1.0f, 0.0f, 1.0f, 1.0f),
                new Color4(1.0f, 0.0f, 1.0f, 1.0f),
                new Color4(1.0f, 0.0f, 1.0f, 1.0f),
                new Color4(1.0f, 0.0f, 1.0f, 1.0f),
                new Color4(1.0f, 0.0f, 1.0f, 1.0f),
                new Color4(1.0f, 0.0f, 1.0f, 1.0f),

                new Color4(0.0f, 1.0f, 1.0f, 1.0f),
                new Color4(0.0f, 1.0f, 1.0f, 1.0f),
                new Color4(0.0f, 1.0f, 1.0f, 1.0f),
                new Color4(0.0f, 1.0f, 1.0f, 1.0f),
                new Color4(0.0f, 1.0f, 1.0f, 1.0f),
                new Color4(0.0f, 1.0f, 1.0f, 1.0f)
            };

            MeshRenderer meshRenderer = entity.AddComponent <MeshRenderer>();

            return(entity);
        }