// Token: 0x060000D5 RID: 213 RVA: 0x0000A7A4 File Offset: 0x000089A4 public ACCMaterial(ACCMaterial src) { this.Original = src; this.renderer = src.renderer; this.material = src.material; this.name = src.name; this.type = src.type; this.renderQueue = src.renderQueue; this.editColors = src.editColors; this.pickers = src.pickers; this.editVals = src.editVals; }
// Token: 0x060001A2 RID: 418 RVA: 0x0000F858 File Offset: 0x0000DA58 public string ToText(ACCMaterial target) { Material material = target.material; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("1000\r\n"); stringBuilder.Append(target.name.ToLower()).Append("\r\n"); stringBuilder.Append(target.name).Append("\r\n"); string name = target.type.name; stringBuilder.Append(name).Append("\r\n"); stringBuilder.Append(ShaderType.GetMateName(name)).Append("\r\n\r\n"); ShaderType type = target.type; foreach (ShaderPropTex shaderPropTex in type.texProps) { stringBuilder.Append("tex\r\n"); string keyName = shaderPropTex.keyName; stringBuilder.Append('\t').Append(keyName).Append("\r\n"); Texture texture = material.GetTexture(shaderPropTex.propId); if (texture == null) { stringBuilder.Append("\tnull\r\n"); } else { stringBuilder.Append("\ttex2d\r\n"); stringBuilder.Append('\t').Append(texture.name).Append("\r\n"); stringBuilder.Append('\t').Append(MateHandler.settings.txtPrefixTex).Append(texture.name).Append(".png\r\n"); Vector2 textureOffset = material.GetTextureOffset(keyName); Vector2 textureScale = material.GetTextureScale(keyName); stringBuilder.Append("\t").Append(textureOffset.x).Append(' ').Append(textureOffset.y).Append(' ').Append(textureScale.x).Append(' ').Append(textureScale.y).Append("\r\n"); } } foreach (ShaderPropColor shaderPropColor in type.colProps) { stringBuilder.Append("col\r\n"); string keyName2 = shaderPropColor.keyName; stringBuilder.Append('\t').Append(keyName2).Append("\r\n"); Color color = material.GetColor(keyName2); stringBuilder.Append('\t').Append(color.r).Append(' ').Append(color.g).Append(' ').Append(color.b).Append(' ').Append(color.a).Append("\r\n"); } foreach (ShaderPropFloat shaderPropFloat in type.fProps) { stringBuilder.Append("f\r\n"); string keyName3 = shaderPropFloat.keyName; stringBuilder.Append('\t').Append(keyName3).Append("\r\n"); float @float = material.GetFloat(keyName3); stringBuilder.Append('\t').Append(@float).Append("\r\n"); } return(stringBuilder.ToString()); }
// 編集前と後でオブジェクトを分ける場合用(未使用) public ACCMaterial(ACCMaterial src) { this.original = src; this.renderer = src.renderer; this.material = src.material; this.name = src.name; //this.shader = src.shader; //this.type1 = src.type1; this.type = src.type; this.renderQueue = src.renderQueue; // TODO 配列の中身はディープコピーとする this.editColors = src.editColors; this.editVals = src.editVals; }
// 編集前と後でオブジェクトを分ける場合用(未使用) public ACCMaterial(ACCMaterial src) { this.original = src; this.renderer = src.renderer; this.material = src.material; this.name = src.name; //this.shader = src.shader; //this.type1 = src.type1; this.type = src.type; this.renderQueue = src.renderQueue; // TODO 配列の中身はディープコピーとする this.editColors = src.editColors; this.editVals = src.editVals; }
// 編集前と後でオブジェクトを分ける場合用(未使用) public ACCMaterial(ACCMaterial src) { Original = src; renderer = src.renderer; material = src.material; name = src.name; //this.shader = src.shader; //this.type1 = src.type1; type = src.type; renderQueue = src.renderQueue; // TODO 配列の中身はディープコピーとする editColors = src.editColors; pickers = src.pickers; editVals = src.editVals; }
// public void ReflectTo(Material m) { // m.SetFloat("_SetManualRenderQueue", renderQueue.val); // m.renderQueue = (int)renderQueue.val; // // if (type1.hasColor) { // m.SetColor(PROP_COLOR, color.val.Value); // } // if (type1.isLighted) { // m.SetColor(PROP_SHADOWC, shadowColor.val.Value); // m.SetFloat("_Shininess", shininess.val); // } // if (type1.isOutlined) { // m.SetColor(PROP_OUTLINEC, outlineColor.val.Value); // m.SetFloat("_OutlineWidth", outlineWidth.val); // } // if (type1.isToony) { // m.SetColor(PROP_RIMC, rimColor.val.Value); // m.SetFloat("_RimPower", rimPower.val); // m.SetFloat("_RimShift", rimShift.val); // } // if (type1.isHair) { // m.SetFloat("_HiRate", hiRate.val); // m.SetFloat("_HiPow", hiPow.val); // } // if (type1.isHair) { // m.SetFloat("_HiRate", hiRate.val); // m.SetFloat("_HiPow", hiPow.val); // } // if (type1.hasFloat1) { // m.SetFloat("_FloatValue1", floatVal1.val); // } // if (type1.hasFloat2) { // m.SetFloat("_FloatValue2", floatVal2.val); // } // if (type1.hasFloat3) { // m.SetFloat("_FloatValue3", floatVal3.val); // } // if (type1.hasCutoff) { // m.SetFloat("_Cutoff", cutoff.val); // } // } public bool hasChanged(ACCMaterial mate) { // 同一シェーダを想定 for (int i = 0; i < editColors.Length; i++) { if (this.editColors[i].val != mate.editColors[i].val) { return(true); } } for (int i = 0; i < editVals.Length; i++) { if (!NumberUtil.Equals(this.editVals[i].val, mate.editVals[i].val)) { return(true); } } return(false); }
// Token: 0x060001A5 RID: 421 RVA: 0x0000FC7C File Offset: 0x0000DE7C public bool Write(ACCMaterial target, string mateText, int apply) { using (StringReader stringReader = new StringReader(mateText)) { FileUtilEx instance = FileUtilEx.Instance; stringReader.ReadLine(); Material material = target.material; stringReader.ReadLine(); stringReader.ReadLine(); string text = stringReader.ReadLine(); stringReader.ReadLine(); if ((apply & MateHandler.MATE_SHADER) > 0 && material.shader.name != text) { target.ChangeShader(text, -1); } ShaderType type = target.type; string text2 = stringReader.ReadLine(); List <string> list = new List <string>(); while (text2 != null) { if (text2.Length != 0 && text2[0] != '\t') { list.Clear(); string text3 = text2.Trim(); while ((text2 = stringReader.ReadLine()) != null) { if (text2.Length != 0) { if (text2[0] != '\t') { break; } string text4 = text2.Trim(); if (text4.Length > 0) { list.Add(text4); } } } string a; if (list.Count != 0 && (a = text3) != null) { if (!(a == "tex")) { if (!(a == "col") && !(a == "vec")) { if (a == "f") { if ((apply & MateHandler.MATE_FLOAT) > 0 && list.Count >= 2) { string text5 = list[0]; ShaderProp shaderProp = type.GetShaderProp(text5); float value; if (shaderProp == null) { LogUtil.Log(new object[] { "シェーダに対応していないプロパティのためスキップします.propName=", text5 }); } else if (!float.TryParse(list[1], out value)) { LogUtil.Log(new object[] { "指定文字列はfloatに変換できません。スキップします。propName={0}, text={1}", text5, list[1] }); } else { material.SetFloat(shaderProp.propId, value); LogUtil.DebugF("float set({0})", new object[] { text5 }); } } } } else if ((apply & MateHandler.MATE_COLOR) > 0 && list.Count >= 2) { string text6 = list[0]; ShaderProp shaderProp2 = type.GetShaderProp(text6); if (shaderProp2 == null) { LogUtil.Log(new object[] { "シェーダに対応していないプロパティのためスキップします.propName=", text6 }); } else { float[] array = this.ParseVals(list[1], text6, 4); if (array != null) { Color value2 = new Color(array[0], array[1], array[2], array[3]); material.SetColor(shaderProp2.propId, value2); LogUtil.DebugF("color set ({0})", new object[] { text6 }); } } } } else if ((apply & MateHandler.MATE_TEX) > 0) { if (list.Count == 2) { if (list[1] == "null") { material.SetTexture(list[0], null); } } else if (list.Count < 5) { string text7 = string.Empty; if (list.Count >= 1) { text7 = "propName=" + list[0]; } LogUtil.Log(new object[] { "指定パラメータが不足しているためtexの適用をスキップします.", text7 }); } else { string text8 = list[0]; string text9 = list[2]; ShaderProp shaderProp3 = type.GetShaderProp(text8); if (shaderProp3 == null) { LogUtil.Log(new object[] { "シェーダに対応していないプロパティのためスキップします.propName=", text8 }); } else { Texture texture = material.GetTexture(shaderProp3.propId); if (texture == null || texture.name != text9) { if (!text9.ToLower().EndsWith(FileConst.EXT_TEXTURE, StringComparison.Ordinal)) { text9 += FileConst.EXT_TEXTURE; } if (!instance.Exists(text9)) { LogUtil.LogF("tex({0}) not found. (propName={1})", new object[] { text9, text8 }); continue; } Texture2D value3 = instance.LoadTexture(text9); material.SetTexture(shaderProp3.propId, value3); } float[] array2 = this.ParseVals(list[4], text8, 4); if (array2 == null) { LogUtil.DebugF("tex({0}) prop is null", new object[] { text9 }); } else { material.SetTextureOffset(shaderProp3.propId, new Vector2(array2[0], array2[1])); material.SetTextureScale(shaderProp3.propId, new Vector2(array2[2], array2[3])); LogUtil.DebugF("tex({0}) loaded to {1}", new object[] { text9, shaderProp3.keyName }); } } } } } } else { text2 = stringReader.ReadLine(); } } } return(true); }
// Token: 0x060001A4 RID: 420 RVA: 0x0000FC6C File Offset: 0x0000DE6C public bool Write(ACCMaterial target, string mateText) { return(this.Write(target, mateText, MateHandler.MATE_ALL)); }
public string ToText(ACCMaterial target) { var mate = target.material; var buff = new StringBuilder(); // ゲーム中にバージョン、name1を保持していないので制限事項 // mateファイルの特定も少し手間が掛かるため、まずは暫定処置 buff.Append("1000\r\n"); buff.Append(target.name.ToLower()).Append("\r\n"); buff.Append(target.name).Append("\r\n"); string shaderName = target.type.name; buff.Append(shaderName).Append("\r\n"); buff.Append(ShaderType.GetShader2(shaderName)).Append("\r\n\r\n"); var type = target.type; // tex foreach (var texProp in type.texProps) { buff.Append("tex\r\n"); var propName = texProp.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var tex = mate.GetTexture(texProp.propId); if (tex == null) { buff.Append("\tnull\r\n"); } else { buff.Append("\ttex2d\r\n"); buff.Append('\t').Append(tex.name).Append("\r\n"); // tex name // なんちゃってテキストパス (これもゲーム中にデータが残らないため) buff.Append('\t').Append(settings.txtPrefixTex).Append(tex.name).Append(".png\r\n"); // tex path // var offset = mate.GetTextureOffset(propName); var scale = mate.GetTextureScale(propName); buff.Append("\t").Append(offset.x).Append(' ').Append(offset.y) .Append(' ').Append(scale.x).Append(' ').Append(scale.y).Append("\r\n"); } } // col foreach (var colProp in type.colProps) { buff.Append("col\r\n"); var propName = colProp.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var color = mate.GetColor(propName); buff.Append('\t').Append(color.r).Append(' ') .Append(color.g).Append(' ') .Append(color.b).Append(' ') .Append(color.a).Append("\r\n"); } // f foreach (var prop in type.fProps) { buff.Append("f\r\n"); var propName = prop.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var fVal = mate.GetFloat(propName); buff.Append('\t').Append(fVal).Append("\r\n"); } return(buff.ToString()); }
// public void ReflectTo(Material m) { // m.SetFloat("_SetManualRenderQueue", renderQueue.val); // m.renderQueue = (int)renderQueue.val; // // if (type1.hasColor) { // m.SetColor(PROP_COLOR, color.val.Value); // } // if (type1.isLighted) { // m.SetColor(PROP_SHADOWC, shadowColor.val.Value); // m.SetFloat("_Shininess", shininess.val); // } // if (type1.isOutlined) { // m.SetColor(PROP_OUTLINEC, outlineColor.val.Value); // m.SetFloat("_OutlineWidth", outlineWidth.val); // } // if (type1.isToony) { // m.SetColor(PROP_RIMC, rimColor.val.Value); // m.SetFloat("_RimPower", rimPower.val); // m.SetFloat("_RimShift", rimShift.val); // } // if (type1.isHair) { // m.SetFloat("_HiRate", hiRate.val); // m.SetFloat("_HiPow", hiPow.val); // } // if (type1.isHair) { // m.SetFloat("_HiRate", hiRate.val); // m.SetFloat("_HiPow", hiPow.val); // } // if (type1.hasFloat1) { // m.SetFloat("_FloatValue1", floatVal1.val); // } // if (type1.hasFloat2) { // m.SetFloat("_FloatValue2", floatVal2.val); // } // if (type1.hasFloat3) { // m.SetFloat("_FloatValue3", floatVal3.val); // } // if (type1.hasCutoff) { // m.SetFloat("_Cutoff", cutoff.val); // } // } public bool hasChanged(ACCMaterial mate) { // 同一シェーダを想定 for (int i=0; i< editColors.Length; i++) { if (this.editColors[i].val != mate.editColors[i].val) return true; } for (int i=0; i< editVals.Length; i++) { if ( !NumberUtil.Equals(this.editVals[i].val, mate.editVals[i].val) ) return true; } return false; }
// Token: 0x060000DB RID: 219 RVA: 0x0000AD70 File Offset: 0x00008F70 public bool HasChanged(ACCMaterial mate) { return(this.editColors.Where((EditColor t, int i) => t.val != mate.editColors[i].val).Any <EditColor>() || this.editVals.Where((EditValue t, int i) => !NumberUtil.Equals(t.val, mate.editVals[i].val, 0.001f)).Any <EditValue>()); }
public bool Write(ACCMaterial target, string mateText, int apply=MATE_ALL) { using (var sr = new StringReader(mateText)) { var outUtil = FileUtilEx.Instance; sr.ReadLine(); // version var mate = target.material; // TODO マテリアル名を変更か、あるいはマテリアル名に対応するRenderQueueを設定 sr.ReadLine(); // name1 sr.ReadLine(); // name2 var shader = sr.ReadLine(); // shader1 sr.ReadLine(); // shader2 if ((apply & MATE_SHADER) > 0) { if (mate.shader.name != shader) { target.ChangeShader(shader); } } var shaderType = target.type; // シェーダに対応していないプロパティはスルー // // ヘッダ部分は読み捨て for (int i = 0; i < 5; i++) sr.ReadLine(); var line = sr.ReadLine(); var work = new List<string>(); while (line != null) { if (line.Length != 0 && line[0] != '\t') { work.Clear(); // 次のタイプまで読み込み string type = line.Trim(); while ((line = sr.ReadLine()) != null) { if (line.Length == 0) continue; if (line[0] == '\t') { var val = line.Trim(); if (val.Length > 0) work.Add(val); } else { break; } } if (work.Count == 0) continue; switch (type) { case "tex": if ((apply & MATE_TEX) > 0) { if (work.Count == 2) { if (work[1] == "null") { mate.SetTexture(work[0], null); } continue; } else if (work.Count < 5) { string tmp = string.Empty; if (work.Count >= 1) { tmp = "propName="+work[0]; } LogUtil.Log("指定パラメータが不足しているためtexの適用をスキップします.", tmp); continue; } var propName1 = work[0]; var texName = work[2]; var texKey = shaderType.GetShaderProp(propName1); if (texKey == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName1); continue; } // tex名が同一の場合はは変更しない var prevTex = mate.GetTexture(texKey.propId); if (prevTex != null && prevTex.name == texName) continue; var fvals = parseVals(work[4], propName1, 4); if (fvals == null) continue; if (!texName.ToLower().EndsWith(FileConst.EXT_TEXTURE, StringComparison.Ordinal)) { texName += FileConst.EXT_TEXTURE; } if (!outUtil.Exists(texName)) { LogUtil.LogF("tex({0}) not found. (propName={1})", texName, propName1); continue; } // テクスチャの適用 var tex2d = outUtil.LoadTexture(texName); mate.SetTexture(texKey.propId, tex2d); mate.SetTextureOffset(propName1, new UnityEngine.Vector2(fvals[0], fvals[1])); mate.SetTextureScale(propName1, new UnityEngine.Vector2(fvals[2], fvals[3])); LogUtil.DebugF("tex({0}) loaded to {1}", texName, propName1); } break; case "col": case "vec": if ((apply & MATE_COLOR) > 0) { if (work.Count < 2) continue; var propName2 = work[0]; var texKey2 = shaderType.GetShaderProp(propName2); if (texKey2 == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName2); continue; } var colVals = parseVals(work[1], propName2, 4); if (colVals == null) continue; var color = new Color(colVals[0], colVals[1], colVals[2], colVals[3]); mate.SetColor(texKey2.propId, color); LogUtil.DebugF("color set ({0})", propName2); } break; case "f": if ((apply & MATE_FLOAT) > 0) { if (work.Count < 2) continue; var propName3 = work[0]; var texKey3 = shaderType.GetShaderProp(propName3); if (texKey3 == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName3); continue; } float fVal; if (!float.TryParse(work[1], out fVal)) { LogUtil.Log("指定文字列はfloatに変換できません。スキップします。propName={0}, text={1}", propName3, work[1]); continue; } mate.SetFloat(texKey3.propId, fVal); LogUtil.DebugF("float set({0})", propName3); } break; } } else { line = sr.ReadLine(); } } } return true; }
public string ToText(ACCMaterial target) { var mate = target.material; var buff = new StringBuilder(); // ゲーム中にバージョン、name1を保持していないので制限事項 // mateファイルの特定も少し手間が掛かるため、まずは暫定処置 buff.Append("1000\r\n"); buff.Append(target.name.ToLower()).Append("\r\n"); buff.Append(target.name).Append("\r\n"); string shaderName = target.type.name; buff.Append(shaderName).Append("\r\n"); buff.Append(ShaderType.GetShader2(shaderName)).Append("\r\n\r\n"); var type = target.type; // tex foreach (var texProp in type.texProps) { buff.Append("tex\r\n"); var propName = texProp.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var tex = mate.GetTexture(texProp.propId); if (tex == null) { buff.Append("\tnull\r\n"); } else { buff.Append("\ttex2d\r\n"); buff.Append('\t').Append(tex.name).Append("\r\n"); // tex name // なんちゃってテキストパス (これもゲーム中にデータが残らないため) buff.Append('\t').Append(settings.txtPrefixTex).Append(tex.name).Append(".png\r\n"); // tex path // var offset = mate.GetTextureOffset(propName); var scale = mate.GetTextureScale(propName); buff.Append("\t").Append(offset.x).Append(' ').Append(offset.y) .Append(' ').Append(scale.x).Append(' ').Append(scale.y).Append("\r\n"); } } // col foreach (var colProp in type.colProps) { buff.Append("col\r\n"); var propName = colProp.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var color = mate.GetColor(propName); buff.Append('\t').Append(color.r).Append(' ') .Append(color.g).Append(' ') .Append(color.b).Append(' ') .Append(color.a).Append("\r\n"); } // f foreach (var prop in type.fProps) { buff.Append("f\r\n"); var propName = prop.keyName; buff.Append('\t').Append(propName).Append("\r\n"); var fVal = mate.GetFloat(propName); buff.Append('\t').Append(fVal).Append("\r\n"); } return buff.ToString(); }
// Token: 0x06000139 RID: 313 RVA: 0x0000C670 File Offset: 0x0000A870 public void Init(ACCMaterial edited) { this.editedMat = edited; if (!this.onlyModel && !string.IsNullOrEmpty(this.filename)) { LogUtil.Debug(new object[] { "load material file", this.filename }); this.srcMat = ACCMaterialEx.Load(this.filename); this.shaderChanged = (this.editedMat.type != this.srcMat.type); } if (edited.type.isTrans) { if (Math.Abs(edited.renderQueue.val - 2000f) < 0.01f) { this.needPmat = false; } else { this.needPmat = true; string matName = (this.srcMat != null) ? this.srcMat.name2 : edited.name; float renderQueue = MaterialUtil.GetRenderQueue(matName); if (renderQueue < 0f) { this.needPmatChange = true; } LogUtil.DebugF("render queue: src={0}, edited={1}", new object[] { renderQueue, edited.renderQueue }); this.needPmatChange |= !NumberUtil.Equals(edited.renderQueue.val, renderQueue, 0.01f); this.pmatExport = this.needPmatChange; } } if (!this.shaderChanged && this.srcMat != null) { this.hasParamChanged = this.editedMat.HasChanged(this.srcMat); } this.editname = this.editedMat.material.name; Maid currentMaid = MaidHolder.Instance.CurrentMaid; foreach (ShaderPropTex shaderPropTex in this.editedMat.type.texProps) { LogUtil.Debug(new object[] { "propName:", shaderPropTex.key }); Texture texture = this.editedMat.material.GetTexture(shaderPropTex.propId); TextureModifier.FilterParam filter = ACCTexturesView.GetFilter(currentMaid, this.slotName, this.editedMat.material, shaderPropTex.propId); bool flag = filter != null && !filter.HasNotChanged(); bool flag2 = false; ACCTextureEx acctextureEx; if (texture != null && this.srcMat != null && this.srcMat.texDic.TryGetValue(shaderPropTex.key, out acctextureEx)) { flag2 = (acctextureEx.editname != texture.name); } TargetTexture value = new TargetTexture(flag, flag2, texture) { filter = filter }; this.texDic[shaderPropTex.key] = value; this.hasTexColorChanged = (this.hasTexColorChanged || flag); this.hasTexFileChanged = (this.hasTexFileChanged || flag2); } LogUtil.Debug(new object[] { "target material initialized" }); }
public void Init(ACCMaterial edited) { this.editedMat = edited; // ファイルからマテリアル情報をロード if (onlyModel) { // modelファイルからマテリアルのロード } else if (!string.IsNullOrEmpty(filename)) { LogUtil.Debug("load material file", filename); srcMat = ACCMaterialEx.Load(filename); shaderChanged = (editedMat.type != srcMat.type); } // pmat チェック // 透過型のみを対象とし、 // 1. マテリアル名に対応するpmatが存在しない場合 // 2. renderQueueが変更されている場合 if (edited.type.isTrans) { // renderqueueがデフォルト値であれば変更不要 if (Math.Abs(edited.renderQueue.val - 2000) < 0.01f) { this.needPmat = false; } else { this.needPmat = true; string matName = (srcMat != null)? srcMat.name2 : edited.name; float srcRq = MaterialType.GetRenderQueue(matName); // 既存のマテリアル名に対応するpmatが存在しない => 変更必要 if (srcRq < 0) this.needPmatChange = true; LogUtil.DebugF("render queue: src={0}, edited={1}", srcRq, edited.renderQueue); this.needPmatChange |= !NumberUtil.Equals(edited.renderQueue.val, srcRq, 0.01f); this.pmatExport = needPmatChange; } } if (!shaderChanged) { // TODO modelロードでsrcMatを作成した場合は条件削除可能 if (srcMat != null) hasParamChanged = editedMat.hasChanged(srcMat); } this.editname = editedMat.material.name; var maid = MaidHolder.Instance.currentMaid; // テクスチャの変更フラグチェック foreach (var texProp in editedMat.type.texProps) { //foreach (string propName in editedMat.type1.texPropNames) { LogUtil.Debug("propName:", texProp.key); Texture tex = editedMat.material.GetTexture(texProp.propId); var filter = ACCTexturesView.GetFilter(maid, slotName, editedMat.material, texProp.propId); var colorChanged = (filter != null) && !filter.hasNotChanged(); var fileChanged = false; if (tex != null && srcMat != null) { ACCTextureEx baseTex; if (srcMat.texDic.TryGetValue(texProp.key, out baseTex)) { fileChanged = (baseTex.editname != tex.name); } } var trgtTex = new TargetTexture(colorChanged, fileChanged, tex); trgtTex.filter = filter; texDic[texProp.key] = trgtTex; hasTexColorChanged |= colorChanged; hasTexFileChanged |= fileChanged; } LogUtil.Debug("target material initialized"); }
public void Init(ACCMaterial edited) { editedMat = edited; // ファイルからマテリアル情報をロード if (onlyModel) { // modelファイルからマテリアルのロード } else if (!string.IsNullOrEmpty(filename)) { LogUtil.Debug("load material file", filename); srcMat = ACCMaterialEx.Load(filename); shaderChanged = (editedMat.type != srcMat.type); } // pmat チェック // 透過型のみを対象とし、 // 1. マテリアル名に対応するpmatが存在しない場合 // 2. renderQueueが変更されている場合 if (edited.type.isTrans) { // renderqueueがデフォルト値であれば変更不要 if (Math.Abs(edited.renderQueue.val - 2000) < 0.01f) { needPmat = false; } else { needPmat = true; var matName = (srcMat != null)? srcMat.name2 : edited.name; var srcRq = MaterialUtil.GetRenderQueue(matName); // 既存のマテリアル名に対応するpmatが存在しない => 変更必要 if (srcRq < 0) { needPmatChange = true; } LogUtil.DebugF("render queue: src={0}, edited={1}", srcRq, edited.renderQueue); needPmatChange |= !NumberUtil.Equals(edited.renderQueue.val, srcRq, 0.01f); pmatExport = needPmatChange; } } if (!shaderChanged) { // TODO modelロードでsrcMatを作成した場合は条件削除可能 if (srcMat != null) { hasParamChanged = editedMat.HasChanged(srcMat); } } editname = editedMat.material.name; var maid = MaidHolder.Instance.CurrentMaid; // テクスチャの変更フラグチェック foreach (var texProp in editedMat.type.texProps) { //foreach (string propName in editedMat.type1.texPropNames) { LogUtil.Debug("propName:", texProp.key); var tex = editedMat.material.GetTexture(texProp.propId); var filter = ACCTexturesView.GetFilter(maid, slotName, editedMat.material, texProp.propId); var colorChanged = (filter != null) && !filter.HasNotChanged(); var fileChanged = false; if (tex != null && srcMat != null) { ACCTextureEx baseTex; if (srcMat.texDic.TryGetValue(texProp.key, out baseTex)) { fileChanged = (baseTex.editname != tex.name); } } var trgtTex = new TargetTexture(colorChanged, fileChanged, tex) { filter = filter }; texDic[texProp.key] = trgtTex; hasTexColorChanged |= colorChanged; hasTexFileChanged |= fileChanged; } LogUtil.Debug("target material initialized"); }
public ACCMaterialsView(Renderer r, Material m, int idx) { //original = new ACCMaterial(m, r); //edited = new ACCMaterial(original); this.matIdx = idx; edited = new ACCMaterial(m, r); }
public bool Write(ACCMaterial target, string mateText) { return(Write(target, mateText, MATE_ALL)); }
public bool Write(ACCMaterial target, string mateText, int apply = MATE_ALL) { using (var sr = new StringReader(mateText)) { var outUtil = FileUtilEx.Instance; sr.ReadLine(); // version var mate = target.material; // TODO マテリアル名を変更か、あるいはマテリアル名に対応するRenderQueueを設定 sr.ReadLine(); // name1 sr.ReadLine(); // name2 var shader = sr.ReadLine(); // shader1 sr.ReadLine(); // shader2 if ((apply & MATE_SHADER) > 0) { if (mate.shader.name != shader) { target.ChangeShader(shader); } } var shaderType = target.type; // シェーダに対応していないプロパティはスルー // // ヘッダ部分は読み捨て for (int i = 0; i < 5; i++) { sr.ReadLine(); } var line = sr.ReadLine(); var work = new List <string>(); while (line != null) { if (line.Length != 0 && line[0] != '\t') { work.Clear(); // 次のタイプまで読み込み string type = line.Trim(); while ((line = sr.ReadLine()) != null) { if (line.Length == 0) { continue; } if (line[0] == '\t') { var val = line.Trim(); if (val.Length > 0) { work.Add(val); } } else { break; } } if (work.Count == 0) { continue; } switch (type) { case "tex": if ((apply & MATE_TEX) > 0) { if (work.Count == 2) { if (work[1] == "null") { mate.SetTexture(work[0], null); } continue; } else if (work.Count < 5) { string tmp = string.Empty; if (work.Count >= 1) { tmp = "propName=" + work[0]; } LogUtil.Log("指定パラメータが不足しているためtexの適用をスキップします.", tmp); continue; } var propName1 = work[0]; var texName = work[2]; var texKey = shaderType.GetShaderProp(propName1); if (texKey == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName1); continue; } // tex名が同一の場合はは変更しない var prevTex = mate.GetTexture(texKey.propId); if (prevTex != null && prevTex.name == texName) { continue; } var fvals = parseVals(work[4], propName1, 4); if (fvals == null) { continue; } if (!texName.ToLower().EndsWith(FileConst.EXT_TEXTURE, StringComparison.Ordinal)) { texName += FileConst.EXT_TEXTURE; } if (!outUtil.Exists(texName)) { LogUtil.LogF("tex({0}) not found. (propName={1})", texName, propName1); continue; } // テクスチャの適用 var tex2d = outUtil.LoadTexture(texName); mate.SetTexture(texKey.propId, tex2d); mate.SetTextureOffset(propName1, new UnityEngine.Vector2(fvals[0], fvals[1])); mate.SetTextureScale(propName1, new UnityEngine.Vector2(fvals[2], fvals[3])); LogUtil.DebugF("tex({0}) loaded to {1}", texName, propName1); } break; case "col": case "vec": if ((apply & MATE_COLOR) > 0) { if (work.Count < 2) { continue; } var propName2 = work[0]; var texKey2 = shaderType.GetShaderProp(propName2); if (texKey2 == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName2); continue; } var colVals = parseVals(work[1], propName2, 4); if (colVals == null) { continue; } var color = new Color(colVals[0], colVals[1], colVals[2], colVals[3]); mate.SetColor(texKey2.propId, color); LogUtil.DebugF("color set ({0})", propName2); } break; case "f": if ((apply & MATE_FLOAT) > 0) { if (work.Count < 2) { continue; } var propName3 = work[0]; var texKey3 = shaderType.GetShaderProp(propName3); if (texKey3 == null) { LogUtil.Log("シェーダに対応していないプロパティのためスキップします.propName=", propName3); continue; } float fVal; if (!float.TryParse(work[1], out fVal)) { LogUtil.Log("指定文字列はfloatに変換できません。スキップします。propName={0}, text={1}", propName3, work[1]); continue; } mate.SetFloat(texKey3.propId, fVal); LogUtil.DebugF("float set({0})", propName3); } break; } } else { line = sr.ReadLine(); } } } return(true); }
public bool HasChanged(ACCMaterial mate) { // 同一シェーダを想定 return(editColors.Where((t, i) => t.val != mate.editColors[i].val).Any() || editVals.Where((t, i) => !NumberUtil.Equals(t.val, mate.editVals[i].val)).Any()); }