HaloMap.RawData.BSPModel.BSPCollision.InjectCollisonMesh C# (CSharp) 메소드

InjectCollisonMesh() 공개 메소드

The inject collison mesh.
public InjectCollisonMesh ( string FilePath, Meta meta ) : void
FilePath string The file path.
meta HaloMap.Meta.Meta The meta.
리턴 void
            public void InjectCollisonMesh(string FilePath, Meta meta)
            {
                FileStream FS = new FileStream(FilePath, FileMode.Open);
                StreamReader SR = new StreamReader(FS);
                string temps = string.Empty;
                int verticecount = 0;
                int facecount = 0;
                List<Vector3> vertices = new List<Vector3>();
                List<ushort> faces = new List<ushort>();
                do
                {
                    temps = SR.ReadLine();
                    if (temps == null)
                    {
                        continue;
                    }

                    char[] search = new[] { ',', ' ' };
                    string[] tempstrings = temps.Split(search, StringSplitOptions.RemoveEmptyEntries);
                    switch (tempstrings[0])
                    {
                        case "v":
                            Vector3 tempv = new Vector3();
                            tempv.X = float.Parse(tempstrings[1]);
                            tempv.Y = float.Parse(tempstrings[2]);
                            tempv.Z = float.Parse(tempstrings[3]);
                            vertices.Add(tempv);
                            verticecount++;

                            break;
                        case "f":
                            string[] split1 = tempstrings[1].Split('/');
                            string[] split2 = tempstrings[2].Split('/');
                            string[] split3 = tempstrings[3].Split('/');
                            ushort temp1 = ushort.Parse(split1[0]);
                            ushort temp2 = ushort.Parse(split2[0]);
                            ushort temp3 = ushort.Parse(split3[0]);
                            temp1--;
                            temp2--;
                            temp3--;
                            faces.Add(temp1);
                            faces.Add(temp2);
                            faces.Add(temp3);
                            facecount += 3;
                            break;
                    }
                }
                while (temps != null);
                SR.Close();
                FS.Close();
                if (this.Vertices.Length >= verticecount && this.Faces.Length >= facecount)
                {
                    meta.Map.OpenMap(MapTypes.Internal);
                    meta.Map.BW.BaseStream.Position = meta.offset + this.VerticeReflexiveOffset;
                    meta.Map.BW.Write(verticecount);
                    for (int x = 0; x < verticecount; x++)
                    {
                        meta.Map.BW.BaseStream.Position = meta.offset + this.VerticeReflexiveTranslation + (x * 16);
                        meta.Map.BW.Write(vertices[x].X);
                        meta.Map.BW.Write(vertices[x].Y);
                        meta.Map.BW.Write(vertices[x].Z);
                    }

                    meta.Map.BW.BaseStream.Position = meta.offset + this.FaceReflexiveOffset;
                    int tempint = facecount / 3;
                    meta.Map.BW.Write(tempint);
                    for (int x = 0; x < facecount; x += 3)
                    {
                        int fuck = x / 3;
                        if (meta.Map.HaloVersion == HaloVersionEnum.Halo2 ||
                            meta.Map.HaloVersion == HaloVersionEnum.Halo2Vista)
                        {
                            meta.Map.BW.BaseStream.Position = meta.offset + this.FaceReflexiveTranslation + (fuck * 12);
                            meta.Map.BW.Write(faces[x]);

                            meta.Map.BW.Write(faces[x + 1]);
                        }
                        else
                        {
                            meta.Map.BW.BaseStream.Position = meta.offset + this.FaceReflexiveTranslation + (fuck * 24);
                            meta.Map.BW.Write((int)faces[x]);

                            meta.Map.BW.Write((int)faces[x + 1]);
                        }
                    }

                    meta.Map.CloseMap();
                }
            }

Usage Example

예제 #1
0
        /// <summary>
        /// The inject collision mesh obj tool strip menu item_ click.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The e.</param>
        /// <remarks></remarks>
        private void injectCollisionMeshOBJToolStripMenuItem_Click(object sender, EventArgs e)
        {
            loadMetaDialog.Filter = "Wavefront Object Files (*.obj) | *.obj";
            if (loadMetaDialog.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }

            BSPModel.BSPCollision coll = new BSPModel.BSPCollision(map.SelectedMeta);
            coll.InjectCollisonMesh(loadMetaDialog.FileName, map.SelectedMeta);
            LoadMeta(map.SelectedMeta.TagIndex);
        }