Ejemplo n.º 1
0
        // modelファイル内のマテリアル情報を対象とした転送処理
        // .mateファイルのheader, version, name1は存在しない
        public void TransferMaterial(BinaryReader reader, BinaryWriter writer, TargetMaterial trgtMat, bool overwrite)
        {
            // マテリアル名
            reader.ReadString();
            writer.Write(trgtMat.editname);

            string shaderName1 = reader.ReadString();
            string shaderName2 = reader.ReadString();

            if (trgtMat.shaderChanged)
            {
                shaderName1 = trgtMat.ShaderNameOrDefault(shaderName1);
                shaderName2 = ShaderType.GetShader2(shaderName1);
            }
            writer.Write(shaderName1);
            writer.Write(shaderName2);

            //var matType = trgtMat.editedMat.type1;
            var shaderType = trgtMat.editedMat.type;
            var writed     = new HashSet <PropKey>();

            while (reader.PeekChar() != -1)
            {
                string type = reader.ReadString();
                //writer.Write(type);
                if (type == "end")
                {
                    break;
                }

                string propName = reader.ReadString();
                //shaderType.
                var shaderProp = shaderType.GetShaderProp(propName);
                if (shaderProp == null)
                {
                    // シェーダに対応していないプロパティは読み捨て
                    DiscardMateProp(reader, type);
                    continue;
                }

                if (!overwrite)
                {
                    // .mateからマテリアル変更で書き換えるため、そのまま転送
                    // ただし、model上に記述されたマテリアルで指定されたtexファイルは存在する必要あり
                    TransferMateProp(reader, writer, type, propName);
                }
                else
                {
                    switch (type)
                    {
                    case "tex":
                        // .mateによるマテリアル変更がないケースのみ書き換える
                        //
                        // texプロパティがある場合にのみ設定
                        TargetTexture trgtTex = null;
                        trgtMat.texDic.TryGetValue(shaderProp.key, out trgtTex);
                        if (trgtTex == null || trgtTex.tex == null || trgtTex.fileChanged || trgtTex.colorChanged)
                        {
                            // 変更がある場合にのみ書き換え (空のものはnull指定)
                            if (trgtTex != null)
                            {
                                trgtTex.worksuffix = trgtMat.worksuffix;
                            }
                            string srcfile = null;
                            TransferMateProp(reader, null, type, null, ref srcfile);
                            if (trgtTex != null)
                            {
                                trgtTex.workfilename = srcfile;
                            }

                            WriteTex(writer, propName, trgtMat, trgtTex);
                        }
                        else
                        {
                            // 変更がないものはそのまま転送
                            TransferMateProp(reader, writer, type, propName);
                        }
                        break;

                    case "col":
                    case "vec":
                        Write(writer, type, propName);
                        Write(writer, trgtMat.editedMat.material.GetColor(propName));

                        DiscardMateProp(reader, type);
                        break;

                    case "f":
                        Write(writer, type, propName);
                        Write(writer, trgtMat.editedMat.material.GetFloat(propName));

                        DiscardMateProp(reader, type);
                        break;
                    }
                }
                writed.Add(shaderProp.key);
            }

            // シェーダで設定されるプロパティ数が一致しない場合、不足propを追記

            if (shaderType.KeyCount() != writed.Count())
            {
                foreach (var texProp in shaderType.texProps)
                {
                    if (writed.Contains(texProp.key))
                    {
                        continue;
                    }

                    TargetTexture trgtTex = null;
                    trgtMat.texDic.TryGetValue(texProp.key, out trgtTex);
                    WriteTex(writer, texProp.keyName, trgtMat, trgtTex);
                }

                foreach (var prop in shaderType.colProps)
                {
                    if (writed.Contains(prop.key))
                    {
                        continue;
                    }

                    Write(writer, prop.type.ToString(), prop.keyName);
                    Write(writer, trgtMat.editedMat.material.GetColor(prop.propId));
                }

                foreach (var prop in shaderType.fProps)
                {
                    if (writed.Contains(prop.key))
                    {
                        continue;
                    }

                    Write(writer, prop.type.ToString(), prop.keyName);
                    Write(writer, trgtMat.editedMat.material.GetFloat(prop.propId));
                }
            }

            writer.Write("end");
        }