예제 #1
0
파일: remOps.cs 프로젝트: kkdevs/sb3u
        public static remMesh FindMesh(remBone meshFrame, remMESCsection meshSection)
        {
            foreach (remMesh mesh in meshSection)
            {
                if (mesh.frame == meshFrame.name)
                {
                    return(mesh);
                }
            }

            return(null);
        }
예제 #2
0
파일: REMParser.cs 프로젝트: kkdevs/sb3u
        public remParser(Stream stream)
        {
            try
            {
                using (BinaryReader binaryReader = new BinaryReader(stream))
                {
                    string[] sectionNames = { "MATC", "BONC", "MESC", "SKIC" };
                    for (int sectionIdx = 0; sectionIdx < sectionNames.Length; sectionIdx++)
                    {
                        string sectionName = Encoding.ASCII.GetString(binaryReader.ReadBytes(4));
                        if (sectionName.Length < 4)
                        {
                            throw new Exception("file incomplete");
                        }
                        if (sectionName != sectionNames[sectionIdx])
                        {
                            Report.ReportLog("Strange section or order for " + sectionName);
                        }
                        int    sectionLength  = binaryReader.ReadInt32();
                        int    numSubSections = binaryReader.ReadInt32();
                        byte[] sectionBuffer  = binaryReader.ReadBytes((int)sectionLength);
                        switch (sectionIdx)
                        {
                        case 0: this.MATC = ReadMaterials(sectionName, sectionLength, numSubSections, sectionBuffer); break;

                        case 1: this.BONC = ReadBones(sectionName, sectionLength, numSubSections, sectionBuffer); break;

                        case 2: this.MESC = ReadMeshes(sectionName, sectionLength, numSubSections, sectionBuffer); break;

                        case 3: this.SKIC = ReadSkin(sectionName, sectionLength, numSubSections, sectionBuffer); break;
                        }
                    }
                }
            }
            catch (FileNotFoundException)
            {
                Report.ReportLog("file not found");
            }
        }
예제 #3
0
파일: REMParser.cs 프로젝트: kkdevs/sb3u
        private static remMESCsection ReadMeshes(string sectionName, int sectionLength, int numMeshes, byte[] sectionBuffer)
        {
            remMESCsection meshSec   = new remMESCsection(numMeshes);
            int            secBufIdx = 0;

            for (int subSection = 0; subSection < numMeshes; subSection++)
            {
                byte[] type = new byte[4] {
                    sectionBuffer[secBufIdx + 0], sectionBuffer[secBufIdx + 1], sectionBuffer[secBufIdx + 2], sectionBuffer[secBufIdx + 3]
                };
                int length = BitConverter.ToInt32(sectionBuffer, secBufIdx + 4);

                remMesh mesh = new remMesh(5);
                Trace.Assert(TypeCheck(remMesh.ClassType, type));
                mesh.frame = GetIdentifier(sectionBuffer, secBufIdx + 8);

                int numMats = BitConverter.ToInt32(sectionBuffer, secBufIdx + 8 + 256);
                mesh.name = GetIdentifier(sectionBuffer, secBufIdx + 8 + 256 + 4);
                int numFaces    = BitConverter.ToInt32(sectionBuffer, secBufIdx + 8 + 256 + 4 + 256);
                int numVertices = BitConverter.ToInt32(sectionBuffer, secBufIdx + 8 + 256 + 4 + 256 + 4);
                for (int i = 0; i < mesh.unknown.Length; i++)
                {
                    mesh.unknown[i] = BitConverter.ToInt32(sectionBuffer, secBufIdx + 8 + 256 + 4 + 256 + 8 + i * 4);
                }
                for (int i = 0; i < numMats; i++)
                {
                    remId mat = GetIdentifier(sectionBuffer, secBufIdx + 8 + 256 + 4 + 256 + 4 * 4 + i * 256);
                    mesh.AddMaterial(mat);
                }

                mesh.vertices = new remVertex[numVertices];
                int vertBufIdx = secBufIdx + 8 + 256 + 4 + 256 + 4 * 4 + mesh.numMats * 256;
                for (int i = 0; i < numVertices; i++)
                {
                    remVertex vertex = new remVertex();
                    vertex.Position    = new Vector3();
                    vertex.Position[0] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 0);
                    vertex.Position[1] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 4);
                    vertex.Position[2] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 8);

                    vertex.UV    = new Vector2();
                    vertex.UV[0] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 12);
                    vertex.UV[1] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 16);

                    vertex.Normal    = new Vector3();
                    vertex.Normal[0] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 20);
                    vertex.Normal[1] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 24);
                    vertex.Normal[2] = BitConverter.ToSingle(sectionBuffer, vertBufIdx + 28);

                    vertex.RGBA = new Color4(BitConverter.ToInt32(sectionBuffer, vertBufIdx + 32));

                    mesh.vertices[i] = vertex;
                    vertBufIdx      += 36;
                }

                mesh.faces = new int[numFaces * 3];
                int faceBufIdx = vertBufIdx;
                for (int i = 0; i < numFaces; i++)
                {
                    mesh.faces[i * 3 + 0] = BitConverter.ToInt32(sectionBuffer, faceBufIdx + 0);
                    mesh.faces[i * 3 + 1] = BitConverter.ToInt32(sectionBuffer, faceBufIdx + 4);
                    mesh.faces[i * 3 + 2] = BitConverter.ToInt32(sectionBuffer, faceBufIdx + 8);
                    faceBufIdx           += 12;
                }

                mesh.faceMarks = new int[numFaces];
                int faceExtraIdx = faceBufIdx;
                for (int i = 0; i < numFaces; i++)
                {
                    mesh.faceMarks[i] = BitConverter.ToInt32(sectionBuffer, faceExtraIdx);
                    faceExtraIdx     += 4;
                }

                meshSec.AddChild(mesh);

                secBufIdx += length;
            }
            if (secBufIdx != sectionLength)
            {
                Report.ReportLog("Warning! MESC section has wrong length.");
            }
            return(meshSec);
        }