// 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"); }