Example #1
0
        /// <summary>
        /// 获取这个material各种杂七杂八的属性
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="config"></param>
        /// <param name="encoding"></param>
        /// <param name="textureIndexSize"></param>
        /// <param name="textureList"></param>
        /// <returns></returns>
        private static MmdMaterial ReadMaterial(BinaryReader reader, ModelReadConfig config, Encoding encoding,
                                                int textureIndexSize, MmdTexture[] textureList)
        {
            //OYM:别想着优化这一坨代码,人家按顺序来的
            var material = new MmdMaterial();

            material.Name          = MmdReaderUtil.ReadSizedString(reader, encoding);
            material.NameEn        = MmdReaderUtil.ReadSizedString(reader, encoding);
            material.DiffuseColor  = MmdReaderUtil.ReadColor(reader, true);
            material.SpecularColor = MmdReaderUtil.ReadColor(reader, false);
            material.Shiness       = reader.ReadSingle();
            material.AmbientColor  = MmdReaderUtil.ReadColor(reader, false);
            var drawFlag = reader.ReadByte();

            //OYM:下面一排位运算,谁有兴趣去看一眼?
            material.DrawDoubleFace   = (drawFlag & PmxMaterialDrawFlags.PmxMaterialDrawDoubleFace) != 0;
            material.DrawGroundShadow = (drawFlag & PmxMaterialDrawFlags.PmxMaterialDrawGroundShadow) != 0;
            material.CastSelfShadow   = (drawFlag & PmxMaterialDrawFlags.PmxMaterialCastSelfShadow) != 0;
            material.DrawSelfShadow   = (drawFlag & PmxMaterialDrawFlags.PmxMaterialDrawSelfShadow) != 0;
            material.DrawEdge         = (drawFlag & PmxMaterialDrawFlags.PmxMaterialDrawEdge) != 0;
            material.EdgeColor        = MmdReaderUtil.ReadColor(reader, true);
            material.EdgeSize         = reader.ReadSingle();
            var textureIndex = MmdReaderUtil.ReadIndex(reader, textureIndexSize);//OYM:后面是选择相应的着色器

            if (textureIndex < textureList.Length && textureIndex >= 0)
            {
                material.Texture = textureList[textureIndex];
            }
            var subTextureIndex = MmdReaderUtil.ReadIndex(reader, textureIndexSize);

            if (subTextureIndex < textureList.Length && subTextureIndex >= 0)
            {
                material.SubTexture = textureList[subTextureIndex];
            }
            material.SubTextureType = (MmdMaterial.SubTextureTypeEnum)reader.ReadByte();
            var useGlobalToon = reader.ReadByte() != 0;

            if (useGlobalToon)
            {
                int globalToonIndex = reader.ReadByte();
                material.Toon = MmdTextureUtil.GetGlobalToon(globalToonIndex, config.GlobalToonPath);
            }
            else
            {
                var toonIndex = MmdReaderUtil.ReadIndex(reader, textureIndexSize);
                if (toonIndex < textureList.Length && toonIndex >= 0)
                {
                    material.Toon = textureList[toonIndex];
                }
            }
            material.MetaInfo = MmdReaderUtil.ReadSizedString(reader, encoding);
            return(material);
        }
Example #2
0
        public override MmdModel Read(BinaryReader reader, ModelReadConfig config)
        {
            var model   = new MmdModel();
            var context = new PmdReadContext();
            var meta    = ReadMeta(reader);

            if (!"Pmd".Equals(meta.Magic) || Math.Abs(meta.Version - 1.0f) > 0.0001f)
            {
                throw new MmdFileParseException("File is not a PMD 1.0 file");
            }
            ReadDescription(reader, model);
            ReadVertices(reader, model);
            ReadTriangles(reader, model);
            var toonTextureIds = new List <int>();

            ReadParts(reader, model, toonTextureIds);
            ReadBonesAndIks(reader, model, context);
            ReadFaces(reader, model);
            ReadFacdDisplayListNames(reader);
            ReadBoneNameList(reader, context);
            ReadBoneDisp(reader);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_30;
            }
            ReadInfoEn(reader, model, context);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_30;
            }
            ReadCustomTextures(reader, config, model, toonTextureIds);
            if (MmdReaderUtil.Eof(reader))
            {
                goto PMD_READER_READ_LEGACY_50;
            }
            ReadRigidBodies(reader, model, context);
            ReadConstraints(reader, model);
            goto PMD_READER_READ_SUCCEED;

PMD_READER_READ_LEGACY_30:

            for (var i = 0; i < model.Parts.Length; ++i)
            {
                var material = model.Parts[i].Material;
                material.Toon = MmdTextureUtil.GetGlobalToon(toonTextureIds[i], config.GlobalToonPath);
            }
PMD_READER_READ_LEGACY_50:
PMD_READER_READ_SUCCEED:
            model.Normalize();
            return(model);
        }
Example #3
0
        private static void ReadCustomTextures(BinaryReader reader, ModelReadConfig config, MmdModel model,
                                               List <int> toonTextureIds)
        {
            var customTextures = new MmdTexture[10];

            for (var i = 0; i < 10; ++i)
            {
                customTextures[i] =
                    new MmdTexture(MmdReaderUtil.ReadStringFixedLength(reader, 100, Tools.JapaneseEncoding));
            }

            for (var i = 0; i < model.Parts.Length; ++i)
            {
                var material = model.Parts[i].Material;
                if (toonTextureIds[i] < 10)
                {
                    material.Toon = customTextures[toonTextureIds[i]];
                }
                else
                {
                    material.Toon = MmdTextureUtil.GetGlobalToon(-1, config.GlobalToonPath);
                }
            }
        }