Ejemplo n.º 1
0
        /// <summary>
        ///     指定されたストリームから読み込む。
        /// </summary>
        internal static 材質 読み込む(FileStream fs, PMXヘッダ header)
        {
            var material = new 材質();

            material.材質名                = ParserHelper.get_TextBuf(fs, header.エンコード方式);
            material.材質名_英              = ParserHelper.get_TextBuf(fs, header.エンコード方式);
            material.拡散色                = ParserHelper.get_Float4(fs);
            material.反射色                = ParserHelper.get_Float3(fs);
            material.反射強度               = ParserHelper.get_Float(fs);
            material.環境色                = ParserHelper.get_Float3(fs);
            material.描画フラグ              = (描画フラグ)ParserHelper.get_Byte(fs);
            material.エッジ色               = ParserHelper.get_Float4(fs);
            material.エッジサイズ             = ParserHelper.get_Float(fs);
            material.通常テクスチャの参照インデックス   = ParserHelper.get_Index(fs, header.テクスチャインデックスサイズ);
            material.スフィアテクスチャの参照インデックス = ParserHelper.get_Index(fs, header.テクスチャインデックスサイズ);

            switch (ParserHelper.get_Byte(fs))
            {
            case 0:
                material.スフィアモード = スフィアモード.無効;
                break;

            case 1:
                material.スフィアモード = スフィアモード.乗算;
                break;

            case 2:
                material.スフィアモード = スフィアモード.加算;
                break;

            case 3:
                material.スフィアモード = スフィアモード.サブテクスチャ;
                break;

            default:
                throw new InvalidDataException("スフィアモード値が異常です。");
            }

            material.共有Toonフラグ            = ParserHelper.get_Byte(fs);
            material.共有Toonのテクスチャ参照インデックス = material.共有Toonフラグ == 0 ? ParserHelper.get_Index(fs, header.テクスチャインデックスサイズ) : ParserHelper.get_Byte(fs);
            material.メモ  = ParserHelper.get_TextBuf(fs, header.エンコード方式);
            material.頂点数 = ParserHelper.get_Int(fs);
            if (material.頂点数 % 3 != 0)
            {
                throw new InvalidDataException();   // 3 の倍数じゃなければエラー。
            }
            return(material);
        }
Ejemplo n.º 2
0
        public static エフェクト用材質情報 作成する(IDrawable drawable, MMDFileParser.PMXModelParser.材質 material)
        {
            var info = new エフェクト用材質情報()
            {
                材質名         = material.材質名,
                材質名_英       = material.材質名_英,
                環境色         = new Vector4(material.環境色, 1f),
                拡散色         = material.拡散色,
                エッジ色        = material.エッジ色,
                放射色         = new Vector4(1f),
                地面影色        = drawable.地面影色,
                反射色         = new Vector4(material.反射色, 1f),
                反射係数        = material.反射強度,
                トゥーン色       = new Vector4(0f),
                エッジ幅        = material.エッジサイズ,
                エッジが有効である   = material.描画フラグ.HasFlag(描画フラグ.エッジ),
                地面影が有効である   = material.描画フラグ.HasFlag(描画フラグ.地面影),
                Line描画を使用する = material.描画フラグ.HasFlag(描画フラグ.Line描画),
                乗算差分        = new エフェクト用材質情報(),
                加算差分        = new エフェクト用材質情報(),
                テッセレーション係数  = 1.0f,
            };

            info.初期値 = new エフェクト用材質情報()
            {
                環境色   = new Vector4(material.環境色, 1f),
                拡散色   = material.拡散色,
                エッジ色  = material.エッジ色,
                放射色   = new Vector4(1f),
                地面影色  = drawable.地面影色,
                反射色   = new Vector4(material.反射色, 1f),
                反射係数  = material.反射強度,
                トゥーン色 = new Vector4(0f),
                エッジ幅  = material.エッジサイズ,
            };

            info._リセットする();

            return(info);
        }