From 9cbe5c89dea2e070630ea933843f5865c965a1c6 Mon Sep 17 00:00:00 2001 From: swrring Date: Sun, 13 Sep 2026 02:52:47 +0900 Subject: [PATCH] =?UTF-8?q?[WL-814x4]=20=EA=B7=B8=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EB=94=A9=20shadows=C2=B7=EB=B6=80=EC=9C=84=EB=B3=84=20?= =?UTF-8?q?=EB=B3=B4=EC=A0=95=20=EC=8B=A4=EC=B8=A1=20=E2=80=94=20=EB=91=98?= =?UTF-8?q?=20=EB=8B=A4=20=EA=B8=B0=EA=B0=81,=203=EC=B0=A8=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EC=9C=A0=EC=A7=80=20(#814)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ”ด ์ฑ„ํƒํ•œ ๋ณ€๊ฒฝ ์—†์Œ. ๋‘ ํ›„๋ณด๋ฅผ ์ธ๊ฒŒ์ž„ Play ๋กœ ์žฌ๊ณ  ยซ์ˆ˜์น˜๊ฐ€ ์ข‹์•„์ ธ๋„ ๊ทธ๋ฆผ์ด ๋‚˜๋น ์ ธ์„œยป ๊ธฐ๊ฐํ–ˆ๋‹ค. โ‘  ShadowsMidtonesHighlights.shadows (0.78,0.58,1.25) โ†’ G 0.75/0.85/0.95 ยท B 1.10/1.00 ยท ๊ฑฐ์˜ ์ค‘์„ฑ ๋ณด์ • ์žฌํƒ์ƒ‰ ํ›„ ํ™”๋ฉด dHue 14.1ยฐ โ†’ 13.9~14.8ยฐ = **์ด๋“ 0**. ๋ฐฐ๊ฒฝ์€ ๋ฐ”์œ„ยท๊ทธ๋ฆผ์ž์˜ ๋ณด๋ผ ํšŒ์ƒ‰์ด ์˜…์–ด์ ธ PD ์Šน์ธ ๋ฃฉ์ด ๋ฌด๋„ˆ์ง„๋‹ค(e_final_wide.png ์˜ค๋ฅธ์ชฝ). โ†’ 3์ฐจ์—์„œ ใ€Œ์ด ๊ฐ’์ด ์ง„๋ฒ”ใ€์ด๋ผ ๋ณธ ํŒ๋‹จ์€ ๋ฐฉํ–ฅ์€ ๋งž์•˜์œผ๋‚˜, ๊ณ ์ณ๋„ ์บ๋ฆญํ„ฐ ์ƒ‰์ด ๊ฐœ์„ ๋˜์ง€ ์•Š๋Š”๋‹ค. โ‘ก ๋ถ€์œ„ ๊ทธ๋ฃน๋ณ„ _DiffuseColor (Skin 0.88,1.10,0.80 / M05 1.04,0.972,1.04 / Hair 0.965,1.025,0.965) ์œ ์ฑ„ ๊ฐ€์ค‘ dHue 17.0ยฐ โ†’ 10.7ยฐ ยท ๋จธ๋ฆฌ ํ”ผ๋ถ€ -40.9ยฐ โ†’ +3.3ยฐ (์ˆ˜์น˜๋Š” ํ•ฉ๊ฒฉ์„ ์— ๊ทผ์ ‘) ๊ทธ๋Ÿฌ๋‚˜ **ํ”ผ๋ถ€ยท๋จธ๋ฆฌ์นผ์ด ์ดˆ๋ก์œผ๋กœ ๋œฌ๋‹ค**(e_final_close.png ๊ฐ€์šด๋ฐ). ์›์ธ = ๋ชฉํ‘œ์ƒ‰(ํ”ผ๋ถ€ ์•Œ๋ฒ ๋„ ํ‰๊ท  (240,217,152) ยท Hue 43ยฐ)์ด ๋…ธ๋ž€ ํฌ๋ฆผ์ด๋ผ ํ™”๋ฉด์„ ๊ทธ ์ƒ‰์ƒ์œผ๋กœ ๋Œ๋ฉด ์‚ด์ƒ‰์ด ์•„๋‹ˆ๋ผ ํ™ฉ๋ก์œผ๋กœ ๋ณด์ธ๋‹ค โ†’ **์ง€ํ‘œ ์ž์ฒด๊ฐ€ ํ”ผ๋ถ€์—๋Š” ๋ถ€์ ํ•ฉ**. ์œ ์ง€ = 3์ฐจ ์ƒํƒœ(์ค‘์„ฑ ์•ฐ๋น„์–ธํŠธ + ์ „์—ญ _DiffuseColor (0.993,1.028,0.874)) โ€” ์„ธ ์•ˆ ์ค‘ ์œก์•ˆ ์ตœ์„ . Co-Authored-By: Claude Opus 5 --- AgentScripts/WL814x4_FINAL.txt | 34 ++ AgentScripts/WL814x4_Play.cs | 669 +++++++++++++++++++++++++++++ AgentScripts/WL814x4_SHADOWS.txt | 41 ++ AgentScripts/WL814x4_eval.py | 55 +++ AgentScripts/WL814x4_gains.json | 1 + AgentScripts/WL814x4_pergroup.json | 17 + AgentScripts/WL814x4_pergroup.py | 76 ++++ AgentScripts/WL814x4_report.py | 45 ++ 8 files changed, 938 insertions(+) create mode 100644 AgentScripts/WL814x4_FINAL.txt create mode 100644 AgentScripts/WL814x4_Play.cs create mode 100644 AgentScripts/WL814x4_SHADOWS.txt create mode 100644 AgentScripts/WL814x4_eval.py create mode 100644 AgentScripts/WL814x4_gains.json create mode 100644 AgentScripts/WL814x4_pergroup.json create mode 100644 AgentScripts/WL814x4_pergroup.py create mode 100644 AgentScripts/WL814x4_report.py diff --git a/AgentScripts/WL814x4_FINAL.txt b/AgentScripts/WL814x4_FINAL.txt new file mode 100644 index 000000000..7d7ef7e2d --- /dev/null +++ b/AgentScripts/WL814x4_FINAL.txt @@ -0,0 +1,34 @@ +๏ปฟrenderers Arm_m05,Body_m05,Face,Hair05,Head,Leg_M05 ยท center (-0.01, 0.57, 0.00) ยท h 1.220 + Arm_m05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Body_m05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Face mat=face02_ToonP shader=Unlit/Transparent base=- diff=- shadow=- shades=- minDark=- + Hair05 mat=Hair05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Head mat=Skin_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Leg_M05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 +ReferenceLook: rimOn=False moodOn=True mood=0.30 contrast=True minDark=0.12 shadowScale=0.85 shadowTintAmt=0.30 shadowTint=RGBA(0.243, 0.106, 0.353, 1.000) charShades=0 key=RGBA(1.00, 0.78, 0.46, 1.00)ร—1.45 amb=RGBA(0.23, 0.23, 0.23, 1.00) +mask all @0.95 = 330746 px +mask Arm_m05 @0.95 = 36600 px +mask Body_m05 @0.95 = 107658 px +mask Face @0.95 = 7136 px +mask Hair05 @0.95 = 127668 px +mask Head @0.95 = 116073 px +mask Leg_M05 @0.95 = 80860 px +mask all10 @10.00 = 2959 px +PAL 0 id=9,240,40 rgb=226,175,169 +PAL 1 id=24,229,47 rgb=115,78,58 +PAL 2 id=39,218,54 rgb=199,199,198 +PAL 3 id=54,207,61 rgb=126,57,54 +PAL 4 id=69,196,68 rgb=207,173,129 +PAL 5 id=84,185,75 rgb=164,73,67 +PAL 6 id=99,174,82 rgb=185,131,97 +PAL 7 id=114,163,89 rgb=130,122,118 +PAL 8 id=129,152,96 rgb=215,186,139 +PAL 9 id=144,141,103 rgb=194,161,131 +PAL 10 id=159,130,110 rgb=116,92,78 +PAL 11 id=174,119,117 rgb=133,84,73 +PAL 12 id=189,108,124 rgb=224,205,153 +PAL 13 id=204,97,131 rgb=152,123,103 +PAL 14 id=219,86,138 rgb=177,173,172 +PAL 15 id=234,75,145 rgb=94,61,45 +diffuse Skin=RGBA(0.993, 1.028, 0.874, 1.000) M05=RGBA(0.993, 1.028, 0.874, 1.000) Hair=RGBA(0.993, 1.028, 0.874, 1.000) +DONE diff --git a/AgentScripts/WL814x4_Play.cs b/AgentScripts/WL814x4_Play.cs new file mode 100644 index 000000000..b243cc5ff --- /dev/null +++ b/AgentScripts/WL814x4_Play.cs @@ -0,0 +1,669 @@ +๏ปฟ// WL-814x2 โ€” ๐Ÿ”ด **Play ๋ชจ๋“œ์—์„œ๋งŒ** ์žฌ๋Š” ์ƒ‰ ์ธก์ •/์ดฌ์˜ ํ•˜๋‹ˆ์Šค +// ํŽธ์ง‘ ๋ชจ๋“œ ๋ Œ๋”๋Š” ์Šคํ‚จ ๋ฉ”์‹œ๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•„ ๋ฌด์˜๋ฏธํ•˜๋‹ค(814x ์—์„œ ์‹ค์ธก). +// run_script --file AgentScripts/WL814x2_Play.cs --entry WL814x2.Run (Play ์ค‘์— ๋ถ€๋ฅธ๋‹ค) +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEngine; +using WL.Look.Arena; +using WL.Look.Character; + +public static class WL814x4 +{ + public const string RAW = "Screenshots_WL/WL814x/4th/raw/"; + const int W = 1080, H = 1920; + static readonly StringBuilder sb = new StringBuilder(); + static void L(string s) { sb.AppendLine(s); } + + static GameObject s_root; + static Renderer[] s_rends; + static Material[][] s_orig; + static Camera s_cam; + static Vector3 s_camPos, s_center, s_pos; + static Quaternion s_rot, s_camRot; + static GameObject s_ovr; + static Vector4 s_shad0; static bool s_shadOv0, s_shadSaved; + static Animator s_an; + static float s_camSize, s_ts; + + static void Setup() + { + s_root = GameObject.Find("PC_LH_M05"); + if (s_root == null) + foreach (var g in UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None)) + if (g.name.Contains("LH_M05")) { s_root = g.gameObject; break; } + // ๐Ÿ”ด ์•„๋ ˆ๋‚˜์—๋Š” ์บ๋ฆญํ„ฐ๋ฅผ ๊ฑท๊ฒŒ ํ•˜๋Š” ๋ฆฌ๊ทธ๊ฐ€ ์žˆ๋‹ค โ€” ์ƒท๋งˆ๋‹ค ์œ„์น˜/ํฌ์ฆˆ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์ƒ‰ ๋น„๊ต๊ฐ€ ๋ฌด์˜๋ฏธํ•˜๋‹ค. + s_ts = Time.timeScale; Time.timeScale = 0f; + s_an = s_root.GetComponentInChildren(); + if (s_an != null) { s_an.speed = 0f; try { s_an.Play("idle", 0, 0.25f); s_an.Update(0f); } catch { } } + + s_cam = Camera.main ?? UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None).First(c => c.orthographic); + s_camPos = s_cam.transform.position; s_camSize = s_cam.orthographicSize; s_camRot = s_cam.transform.rotation; + s_root.transform.rotation = Quaternion.Euler(0, s_cam.transform.eulerAngles.y + 180f, 0); + s_pos = s_root.transform.position; s_rot = s_root.transform.rotation; + + s_rends = s_root.GetComponentsInChildren(true).Where(r => r.enabled && r.gameObject.activeInHierarchy).ToArray(); + s_orig = s_rends.Select(r => r.sharedMaterials).ToArray(); + var b = new Bounds(s_root.transform.position, Vector3.zero); + foreach (var r in s_rends) b.Encapsulate(r.bounds); + s_center = b.center; + L("renderers " + string.Join(",", s_rends.Select(r => r.name)) + " ยท center " + s_center.ToString("F2") + " ยท h " + b.size.y.ToString("F3")); + foreach (var r in s_rends) + { + var m = r.sharedMaterial; + L(" " + r.name + " mat=" + m.name + " shader=" + m.shader.name + + " base=" + (m.HasProperty("_BaseMap") && m.GetTexture("_BaseMap") ? m.GetTexture("_BaseMap").name : "-") + + " diff=" + (m.HasProperty("_DiffuseColor") ? m.GetColor("_DiffuseColor").ToString("F3") : "-") + + " shadow=" + (m.HasProperty("_ShadowDiffuseColor") ? m.GetColor("_ShadowDiffuseColor").ToString("F4") : "-") + + " shades=" + (m.HasProperty("_Shades") ? m.GetFloat("_Shades").ToString("F0") : "-") + + " minDark=" + (m.HasProperty("_MinimumDarkness") ? m.GetFloat("_MinimumDarkness").ToString("F2") : "-")); + } + var rc = WLReferenceLookSettings.Instance; + L("ReferenceLook: rimOn=" + rc.rimOn + " moodOn=" + rc.moodOn + " mood=" + rc.moodStrength.ToString("F2") + + " contrast=" + rc.contrastOn + " minDark=" + rc.minimumDarkness.ToString("F2") + + " shadowScale=" + rc.shadowColorScale.ToString("F2") + " shadowTintAmt=" + rc.shadowTintAmount.ToString("F2") + + " shadowTint=" + rc.shadowTint.ToString("F3") + " charShades=" + rc.charShades + + " key=" + rc.keyLightColor.ToString("F2") + "ร—" + rc.keyLightIntensity.ToString("F2") + " amb=" + rc.ambientColor.ToString("F2")); + } + + static void Teardown() + { + for (int i = 0; i < s_rends.Length; i++) { s_rends[i].sharedMaterials = s_orig[i]; s_rends[i].enabled = true; } + s_cam.transform.SetPositionAndRotation(s_camPos, s_camRot); s_cam.orthographicSize = s_camSize; + Time.timeScale = s_ts; + } + + static int[] s_layers; static int s_cull; static CameraClearFlags s_clear; static Color s_bg; static bool s_post, s_postSaved; + /// ์บ๋ฆญํ„ฐ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋ฐฐ๊ฒฝยท๊ทธ๋ฆผ์žยทํฌ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๋ˆ ๋ Œ๋” ์ƒํƒœ(๋งˆ์Šคํฌยท๋ฉ์–ด๋ฆฌ์ง€๋„ ์ „์šฉ). + static void Isolate(bool on) + { + var ts = s_root.GetComponentsInChildren(true); + var ucd = s_cam.GetComponent(); + if (on) + { + s_layers = ts.Select(t => t.gameObject.layer).ToArray(); + foreach (var t in ts) t.gameObject.layer = 31; + s_cull = s_cam.cullingMask; s_clear = s_cam.clearFlags; s_bg = s_cam.backgroundColor; + s_cam.cullingMask = 1 << 31; s_cam.clearFlags = CameraClearFlags.SolidColor; s_cam.backgroundColor = Color.black; + if (ucd != null) { s_post = ucd.renderPostProcessing; s_postSaved = true; ucd.renderPostProcessing = false; } + } + else + { + for (int i = 0; i < ts.Length && i < s_layers.Length; i++) ts[i].gameObject.layer = s_layers[i]; + s_cam.cullingMask = s_cull; s_cam.clearFlags = s_clear; s_cam.backgroundColor = s_bg; + if (ucd != null && s_postSaved) { ucd.renderPostProcessing = s_post; s_postSaved = false; } + } + } + class Shot { public Color32[] px; } + + static Shot Render(float ortho) + { + // ๋งค ๋ Œ๋”๋งˆ๋‹ค ๊ฐ™์€ ์œ„์น˜ยท๊ฐ™์€ ํฌ์ฆˆ๋กœ ๊ณ ์ •ํ•œ๋‹ค + s_root.transform.SetPositionAndRotation(s_pos, s_rot); + if (s_an != null) { s_an.speed = 0f; try { s_an.Play("idle", 0, 0.25f); s_an.Update(0f); } catch { } } + // ๐Ÿ”ด ์นด๋ฉ”๋ผ๋„ ๋งค ํ”„๋ ˆ์ž„ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋‹ค โ€” ํšŒ์ „๊นŒ์ง€ ๊ณ ์ •ํ•ด์•ผ ํ”„๋ ˆ์ด๋ฐ์ด ๊ฐ™๋‹ค. + s_cam.orthographicSize = ortho; + s_cam.transform.SetPositionAndRotation(s_center - (s_camRot * Vector3.forward) * 30f, s_camRot); + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; rt.Create(); + var prev = s_cam.targetTexture; s_cam.targetTexture = rt; s_cam.Render(); s_cam.targetTexture = prev; + var pa = RenderTexture.active; RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + RenderTexture.active = pa; + var s = new Shot { px = t.GetPixels32() }; + UnityEngine.Object.Destroy(t); rt.Release(); UnityEngine.Object.Destroy(rt); + return s; + } + + static void Save(Shot s, string name) + { + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.SetPixels32(s.px); t.Apply(); + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + name + ".png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); + } + + static void Shoot(string name, float ortho) { Render(ortho); Save(Render(ortho), name); } + + static void SaveMask(string name, float ortho, params Renderer[] on) + { + Isolate(true); + foreach (var r in s_rends) r.enabled = on.Contains(r); + var a = Render(ortho); + foreach (var r in s_rends) r.enabled = true; + Isolate(false); + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); + var px = new Color32[W * H]; int n = 0; + for (int i = 0; i < px.Length; i++) + { + int d = a.px[i].r + a.px[i].g + a.px[i].b; + bool hit = d > 12; if (hit) n++; + px[i] = hit ? new Color32(255, 255, 255, 255) : new Color32(0, 0, 0, 255); + } + t.SetPixels32(px); t.Apply(); + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + "mask_" + name + ".png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); + L("mask " + name + " @" + ortho.ToString("F2") + " = " + n + " px"); + } + + /// ๋ฉ์–ด๋ฆฌ(ํŒ”๋ ˆํŠธ ์นธ) ์ง€๋„ โ€” ๋น› 0. ๋ถ€์œ„๋ณ„ ์ƒ‰์„ ์žฌ๊ธฐ ์œ„ํ•œ ๋งˆ์Šคํฌ. + static void ShootIdMap(string name, float ortho) + { + var pal = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/WL/Look/Character/Textures/WLPalette_FINAL.png"); + int S = pal.width, G = S / 8; + var t = new Texture2D(S, S, TextureFormat.RGBA32, false) { filterMode = FilterMode.Point, wrapMode = TextureWrapMode.Clamp }; + var px = new Color32[S * S]; + for (int i = 0; i < px.Length; i++) px[i] = new Color32(0, 0, 0, 255); + for (int j = 0; j < G * G; j++) + { + int gx = j % G, gy = j / G; + var c = new Color32((byte)(9 + j * 15), (byte)(240 - j * 11), (byte)(40 + j * 7), 255); + for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) px[(gy * 8 + y) * S + gx * 8 + x] = c; + } + t.SetPixels32(px); t.Apply(); + Isolate(true); + var sh = Shader.Find("Unlit/Texture"); + var keep = new List(); + for (int i = 0; i < s_rends.Length; i++) + { + if (s_rends[i].name == "Face") { s_rends[i].enabled = false; keep.Add(s_rends[i]); continue; } + var m = new Material(sh); m.SetTexture("_MainTex", t); + s_rends[i].sharedMaterials = Enumerable.Repeat(m, s_orig[i].Length).ToArray(); + } + Shoot(name, ortho); + foreach (var r in keep) r.enabled = true; + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + Isolate(false); + UnityEngine.Object.Destroy(t); + // ํŒ”๋ ˆํŠธ ์นธ ์ƒ‰๋„ ์ ์–ด ๋‘”๋‹ค(์ธ๋ฑ์Šค โ†’ ํŒ”๋ ˆํŠธ RGB) + var cols = pal.GetPixels32(); + for (int j = 0; j < G * G; j++) + { + int gx = j % G, gy = j / G; + var c = cols[(gy * 8 + 4) * S + gx * 8 + 4]; + L(string.Format("PAL {0,2} id={1},{2},{3} rgb={4},{5},{6}", j, 9 + j * 15, 240 - j * 11, 40 + j * 7, c.r, c.g, c.b)); + } + } + + /// ToonP ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ๊ทธ๋ฆผ์ž์ƒ‰๋งŒ ๋ฐ”๊พผ ์ž„์‹œ ๋ณต์ œ๋ณธ์œผ๋กœ ๊ต์ฒด. + static void SetShadow(Color shadow, float shades) + { + for (int i = 0; i < s_rends.Length; i++) + { + var mats = (Material[])s_orig[i].Clone(); + for (int m = 0; m < mats.Length; m++) + { + if (mats[m] == null || mats[m].shader == null || mats[m].shader.name != "Shader Graphs/Toon") continue; + var c = new Material(mats[m]) { name = "TMP_" + mats[m].name }; + c.SetColor("_ShadowDiffuseColor", shadow); + if (shades > 0) c.SetFloat("_Shades", shades); + mats[m] = c; + } + s_rends[i].sharedMaterials = mats; + } + } + static void ResetMats() { for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; } + + static void Look(float mood, float shadowTintAmount, int rim) + { + var cfg = WLReferenceLookSettings.Instance; + var o = WLReferenceLook.Opt.FromSettings(cfg); + o.mood = mood > 0f; o.moodStrength = mood; + o.shadowTintAmount = shadowTintAmount; + o.rim = rim != 0; + WLReferenceLook.Apply(o, cfg); + } + + public static string Run() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + SaveMask("all10", 10f, s_rends); + foreach (var r in s_rends) SaveMask(r.name + "10", 10f, r); + ShootIdMap("idmap", 0.95f); + ShootIdMap("idmap10", 10f); + + var cfg = WLReferenceLookSettings.Instance; + float mood0 = cfg.moodStrength, tint0 = cfg.shadowTintAmount; + + Action V = (name, shadow, shades, mood, tintAmt, rim) => + { + ResetMats(); + WLReferenceLook.Restore(); + if (shadow.a >= 0f && shadow != Color.clear) SetShadow(shadow, shades); + Look(mood, tintAmt, rim); + Shoot(name, 0.95f); + Shoot(name + "_g", 10f); + L("shot " + name + " shadow=" + shadow.ToString("F3") + " shades=" + shades + " mood=" + mood.ToString("F2") + " tintAmt=" + tintAmt.ToString("F2") + " ยท " + WLReferenceLook.LastLog); + }; + + var purple = new Color(0.2164f, 0.2092f, 0.3713f, 0f); + V("a_now", purple, 3f, mood0, tint0, 0); + V("b_neutral", new Color(0.45f, 0.45f, 0.45f, 0f), 3f, mood0, tint0, 0); + V("c_neutral_notint", new Color(0.45f, 0.45f, 0.45f, 0f), 3f, mood0, 0f, 0); + V("d_neutral_notint_mood0", new Color(0.45f, 0.45f, 0.45f, 0f), 3f, 0f, 0f, 0); + V("e_warm_notint", new Color(0.52f, 0.45f, 0.40f, 0f), 3f, mood0, 0f, 0); + V("f_neutral_notint_s7", new Color(0.45f, 0.45f, 0.45f, 0f), 7f, mood0, 0f, 0); + V("g_dark_notint", new Color(0.32f, 0.32f, 0.34f, 0f), 3f, mood0, 0f, 0); + + ResetMats(); WLReferenceLook.Restore(); Look(mood0, tint0, 0); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } Directory.CreateDirectory("AgentScripts"); File.WriteAllText("AgentScripts/WL814x4_PLAY.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + /// ์•„๋ ˆ๋‚˜ ์”ฌ์„ ์—ฐ๋‹ค(Play ์ง„์ž… ์ „ ยท ํŽธ์ง‘ ๋ชจ๋“œ์—์„œ 1ํšŒ). + public static string Open() + { + UnityEditor.SceneManagement.EditorSceneManager.OpenScene("Assets/WL/Look/Arena/Scenes/WL_ArenaProto.unity", UnityEditor.SceneManagement.OpenSceneMode.Single); + return "opened " + UnityEngine.SceneManagement.SceneManager.GetActiveScene().name; + } + + /// ๋ฌด๋“œ(ํฌ์ŠคํŠธ ๊ทธ๋ ˆ์ด๋”ฉยท์•ฐ๋น„์–ธํŠธยทํ‚ค๋ผ์ดํŠธ)๊ฐ€ ํ™”๋ฉด ์ƒ‰์„ ์–ผ๋งˆ๋‚˜ ํ‹€์–ด๋†“๋Š”์ง€ โ€” ์—์…‹ ์ˆ˜์ • 0(๋Ÿฐํƒ€์ž„ ํ”„๋กœํŒŒ์ผ ์ธ์Šคํ„ด์Šค). + public static string Mood() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + SaveMask("all10", 10f, s_rends); + ShootIdMap("idmap", 0.95f); + var cfg = WLReferenceLookSettings.Instance; + + Action V = (name, mood, killWB, killSMH) => + { + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); + o.rim = false; o.mood = mood > 0f; o.moodStrength = mood; + WLReferenceLook.Apply(o, cfg); + var vgo = GameObject.Find("WL814t_ReferenceLook_Volume"); + // killWB = ํฌ์ŠคํŠธ ๊ทธ๋ ˆ์ด๋”ฉ Volume ์˜ weight ๋งŒ 0 ์œผ๋กœ (์กฐ๋ช… ๋ฌด๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค) + if (vgo != null && killWB) vgo.GetComponent().weight = 0f; + Shoot(name, 0.95f); Shoot(name + "_g", 10f); + L("mood shot " + name + " mood=" + mood.ToString("F2") + " killWB=" + killWB + " killSMH=" + killSMH); + }; + V("m30", 0.30f, false, false); + V("m15", 0.15f, false, false); + V("m00", 0.00f, false, false); + V("n_novol30", 0.30f, true, false); + V("n_novol15", 0.15f, true, false); + WLReferenceLook.Restore(); + var o2 = WLReferenceLook.Opt.FromSettings(cfg); o2.rim = false; + WLReferenceLook.Apply(o2, cfg); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_MOOD.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + /// ๐Ÿ”ด ์บ๋ฆญํ„ฐ ์ „์šฉ ๊ด‘์› ์ƒ‰์กฐ ์ƒ์‡„ โ€” _DiffuseColor ์— ํœ˜๋„๋ณด์กด ์—ญ์ด๋“์„ ๋„ฃ๋Š”๋‹ค. + /// ์”ฌยท์กฐ๋ช…ยท814t ์„ค์ •ยทProjectSettings ๋Š” ํ•˜๋‚˜๋„ ์•ˆ ๊ฑด๋“œ๋ฆฐ๋‹ค. + public static string SetTint() + { + var g = new Color(0.994f, 1.024f, 0.894f, 1f); + var sb2 = new StringBuilder(); + foreach (var n in new[] { "M05_ToonP", "Skin_ToonP", "Hair05_ToonP" }) + { + var p = "Assets/WL/Look/Character/Materials/" + n + ".mat"; + var m = UnityEditor.AssetDatabase.LoadAssetAtPath(p); + if (m == null) { sb2.AppendLine("!! " + p); continue; } + m.SetColor("_DiffuseColor", g); + UnityEditor.EditorUtility.SetDirty(m); + sb2.AppendLine(n + " _DiffuseColor = " + g.ToString("F3")); + } + UnityEditor.AssetDatabase.SaveAssets(); + return sb2.ToString(); + } + + /// 3์ฐจ โ€” ์•ฐ๋น„์–ธํŠธ/ํ‚ค๋ผ์ดํŠธ ์ƒ‰์กฐ 3+1์•ˆ. ๐Ÿ”ด SOยท์”ฌยท์—์…‹์€ ์•ˆ ๊ฑด๋“œ๋ฆฐ๋‹ค(๋Ÿฐํƒ€์ž„ RenderSettingsยทLight.color ๋งŒ). + public static string Amb() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + SaveMask("all10", 10f, s_rends); + ShootIdMap("idmap", 0.95f); + var cfg = WLReferenceLookSettings.Instance; + var lights = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None) + .Where(l => l.type == LightType.Directional).ToArray(); + + // ์ธก์ •์€ ยซ๋ณด์ • ์—†๋Š”ยป ์ƒํƒœ์—์„œ โ€” _DiffuseColor ๋ฅผ ํฐ์ƒ‰์œผ๋กœ ๋˜๋Œ๋ฆฐ ์ž„์‹œ ๋ณต์ œ๋ณธ + Action white = () => + { + for (int i = 0; i < s_rends.Length; i++) + { + var mats = (Material[])s_orig[i].Clone(); + for (int m = 0; m < mats.Length; m++) + { + if (mats[m] == null || mats[m].shader == null || mats[m].shader.name != "Shader Graphs/Toon") continue; + var c = new Material(mats[m]) { name = "TMP_w" }; + c.SetColor("_DiffuseColor", Color.white); + mats[m] = c; + } + s_rends[i].sharedMaterials = mats; + } + }; + + Action V = (name, amb, key) => + { + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + if (amb.a > 0f) RenderSettings.ambientLight = new Color(amb.r, amb.g, amb.b, 1f); + if (key.a > 0f) foreach (var l in lights) l.color = new Color(key.r, key.g, key.b, 1f); + white(); + Shoot(name, 0.95f); + Shoot(name + "_g", 10f); + L(string.Format("amb shot {0} ambient={1} key={2}", name, RenderSettings.ambientLight.ToString("F3"), + lights.Length > 0 ? lights[0].color.ToString("F3") : "-")); + }; + + Color no = new Color(0, 0, 0, 0); + // ํ˜„์žฌ ๋ฌด๋“œ๊ฐ€ ๋งŒ๋“œ๋Š” ์•ฐ๋น„์–ธํŠธ = lerp(์›๋ž˜, (0.28,0.17,0.40), 0.30) โ†’ ๊ทธ๋Œ€๋กœ ๋‘๋ฉด v0 + V("v0_purple", no, no); + V("v1_gray", new Color(0.229f, 0.229f, 0.229f, 1f), no); + V("v2_cool", new Color(0.205f, 0.228f, 0.262f, 1f), no); + V("v3_warm", new Color(0.262f, 0.226f, 0.193f, 1f), no); + V("v4_gray_keysoft", new Color(0.229f, 0.229f, 0.229f, 1f), new Color(1f, 0.95f, 0.90f, 1f)); + V("v5_gray_keywhite", new Color(0.229f, 0.229f, 0.229f, 1f), new Color(1f, 1f, 1f, 1f)); + + // ๋ฐฐ๊ฒฝ ํฌํ•จ ๋„“์€ ๊ตฌ๋„(๊ฒŒ์ž„ ์‹ค์ œ ์นด๋ฉ”๋ผ ์œ„์น˜ยท์ง๊ต 10) โ€” ๋ฐฐ๊ฒฝ์ด ์–ผ๋งˆ๋‚˜ ๋ฐ”๋€Œ๋Š”์ง€ + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + Action WIDE = (name, amb, key) => + { + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + if (amb.a > 0f) RenderSettings.ambientLight = new Color(amb.r, amb.g, amb.b, 1f); + if (key.a > 0f) foreach (var l in lights) l.color = new Color(key.r, key.g, key.b, 1f); + s_cam.orthographicSize = 10f; + s_cam.transform.SetPositionAndRotation(s_camPos, s_camRot); + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; rt.Create(); + var pv = s_cam.targetTexture; s_cam.targetTexture = rt; s_cam.Render(); s_cam.Render(); s_cam.targetTexture = pv; + var pa = RenderTexture.active; RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + RenderTexture.active = pa; + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + name + ".png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); rt.Release(); UnityEngine.Object.Destroy(rt); + L("wide " + name); + }; + WIDE("w0_purple", no, no); + WIDE("w1_gray", new Color(0.229f, 0.229f, 0.229f, 1f), no); + WIDE("w4_gray_keysoft", new Color(0.229f, 0.229f, 0.229f, 1f), new Color(1f, 0.95f, 0.90f, 1f)); + WIDE("w5_gray_keywhite", new Color(0.229f, 0.229f, 0.229f, 1f), new Color(1f, 1f, 1f, 1f)); + + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + var o2 = WLReferenceLook.Opt.FromSettings(cfg); o2.rim = false; WLReferenceLook.Apply(o2, cfg); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_AMB.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + + /// 3์ฐจ ์ฑ„ํƒ๊ฐ’ ์“ฐ๊ธฐ โ€” ์•ฐ๋น„์–ธํŠธ ์ค‘์„ฑํ™”(814t SO) + ์บ๋ฆญํ„ฐ _DiffuseColor ํฐ์ƒ‰ ๋ณต๊ท€. + public static string Adopt() + { + var sb2 = new StringBuilder(); + var rc = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/WL/Look/Arena/Resources/WL/WLReferenceLookSettings.asset"); + sb2.AppendLine("ambientColor " + rc.ambientColor.ToString("F3") + " โ†’ ์ค‘์„ฑ (0.229,0.229,0.229)"); + rc.ambientColor = new Color(0.229f, 0.229f, 0.229f, 1f); + UnityEditor.EditorUtility.SetDirty(rc); + foreach (var n in new[] { "M05_ToonP", "Skin_ToonP", "Hair05_ToonP" }) + { + var m = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/WL/Look/Character/Materials/" + n + ".mat"); + var dc = new Color(0.993f, 1.028f, 0.874f, 1f); + m.SetColor("_DiffuseColor", dc); + UnityEditor.EditorUtility.SetDirty(m); + sb2.AppendLine(n + " _DiffuseColor โ†’ " + dc.ToString("F3")); + } + UnityEditor.AssetDatabase.ImportAsset("Assets/WL/Look/Character/Textures/WLPalette_FINAL.png", UnityEditor.ImportAssetOptions.ForceUpdate); + UnityEditor.AssetDatabase.SaveAssets(); + return sb2.ToString(); + } + + /// ์ตœ์ข… = ์‹ค์ œ ๋ฐฐ์„ ๋œ ๋จธํ‹ฐ๋ฆฌ์–ผ ๊ทธ๋Œ€๋กœ(๋ณด์ • ํฌํ•จ) ๊ทผ์ ‘ยท๊ฒŒ์ž„ํฌ๊ธฐยท๋„“์€ ๊ตฌ๋„. + public static string Final() + { + sb.Length = 0; + try + { + Setup(); + var cfg = WLReferenceLookSettings.Instance; + L("ambient(SO)=" + cfg.ambientColor.ToString("F3") + " diffuse=" + s_rends[0].sharedMaterial.GetColor("_DiffuseColor").ToString("F3")); + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + Shoot("f_final", 0.95f); + Shoot("f_final_g", 10f); + s_cam.orthographicSize = 10f; + s_cam.transform.SetPositionAndRotation(s_camPos, s_camRot); + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; rt.Create(); + var pv = s_cam.targetTexture; s_cam.targetTexture = rt; s_cam.Render(); s_cam.Render(); s_cam.targetTexture = pv; + var pa = RenderTexture.active; RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + RenderTexture.active = pa; + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + "f_wide.png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); rt.Release(); UnityEngine.Object.Destroy(rt); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_FINAL.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + /// ์–ด๋‘์šด ๋ฉด(ํ”ผ๋ถ€)์˜ ์ž”์—ฌ ์ƒ‰์กฐ โ€” ๊ทธ๋ฆผ์ž ์•Œ๋ฒ ๋„ ์ƒ‰์„ ๋ฐ”๊ฟ” ๋น„๊ต(์—์…‹ ๋ฌด์ˆ˜์ •ยท์ž„์‹œ ๋ณต์ œ๋ณธ). + public static string Shad() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + ShootIdMap("idmap", 0.95f); + var cfg = WLReferenceLookSettings.Instance; + Action V = (name, sh) => + { + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + if (sh.a > 0f) + for (int i = 0; i < s_rends.Length; i++) + { + var mats = (Material[])s_orig[i].Clone(); + for (int m = 0; m < mats.Length; m++) + { + if (mats[m] == null || mats[m].shader == null || mats[m].shader.name != "Shader Graphs/Toon") continue; + var c = new Material(mats[m]) { name = "TMP_s" }; + c.SetColor("_ShadowDiffuseColor", new Color(sh.r, sh.g, sh.b, 0f)); + mats[m] = c; + } + s_rends[i].sharedMaterials = mats; + } + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + Shoot(name, 0.95f); Shoot(name + "_g", 10f); + L("shadow shot " + name + " = " + sh.ToString("F3")); + }; + V("s0_now", new Color(0, 0, 0, 0)); + V("s1_gray", new Color(0.38f, 0.38f, 0.38f, 1f)); + V("s2_warm", new Color(0.42f, 0.38f, 0.32f, 1f)); + V("s3_graylight", new Color(0.50f, 0.50f, 0.50f, 1f)); + V("s4_warmlight", new Color(0.55f, 0.50f, 0.42f, 1f)); + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + var o2 = WLReferenceLook.Opt.FromSettings(cfg); o2.rim = false; WLReferenceLook.Apply(o2, cfg); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_SHAD.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + /// 4์ฐจ โ€” WL_ArenaMood ์˜ ShadowsMidtonesHighlights.shadows ๋ฅผ ๋Ÿฐํƒ€์ž„ ํ”„๋กœํŒŒ์ผ ๋ณต์ œ๋ณธ์—์„œ ์กฐ์ •. + /// ๐Ÿ”ด ํ”„๋กœํŒŒ์ผ ์—์…‹์€ ์•ˆ ๊ฑด๋“œ๋ฆฐ๋‹ค(Volume.profile ์€ ์ธ์Šคํ„ด์Šค ๋ณต์ œ๋ณธ). + static void RestoreShadows() + { + var cfg = WLReferenceLookSettings.Instance; + UnityEngine.Rendering.Universal.ShadowsMidtonesHighlights smh; + if (s_shadSaved && cfg != null && cfg.profile != null && cfg.profile.asset != null && cfg.profile.asset.TryGet(out smh)) + { smh.shadows.value = s_shad0; smh.shadows.overrideState = s_shadOv0; s_shadSaved = false; } + } + + public static string Shadows() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + SaveMask("all10", 10f, s_rends); + ShootIdMap("idmap", 0.95f); + var cfg = WLReferenceLookSettings.Instance; + + Action white = () => + { + for (int i = 0; i < s_rends.Length; i++) + { + var mats = (Material[])s_orig[i].Clone(); + for (int m = 0; m < mats.Length; m++) + { + if (mats[m] == null || mats[m].shader == null || mats[m].shader.name != "Shader Graphs/Toon") continue; + var c = new Material(mats[m]) { name = "TMP_w" }; + c.SetColor("_DiffuseColor", Color.white); + mats[m] = c; + } + s_rends[i].sharedMaterials = mats; + } + }; + + Action V = (name, sh, useWhite) => + { + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + string applied = "-"; + // ๐Ÿ”ด Volume ์˜ค๋ฒ„๋ผ์ด๋“œ(์šฐ์„ ์ˆœ์œ„/์ธ์Šคํ„ด์Šค)๋Š” ๋‘˜ ๋‹ค ์‹คํŒจํ–ˆ๋‹ค(์ „์ž๋Š” ์•ˆ ๋จน๊ณ , ํ›„์ž๋Š” ํ”„๋กœํŒŒ์ผ ์ „์ฒด๋ฅผ + // weight 1 ๋กœ ์–น์–ด ๋ฒ„๋ฆฐ๋‹ค). โ†’ ํ”„๋กœํŒŒ์ผ ยซ์—์…‹์˜ ๊ฐ’ยป์„ ์ง์ ‘ ๋ฐ”๊พธ๊ณ  ๋์— ๋˜๋Œ๋ฆฐ๋‹ค(SaveAssets 0). + UnityEngine.Rendering.Universal.ShadowsMidtonesHighlights smh; + if (cfg.profile != null && cfg.profile.asset != null && cfg.profile.asset.TryGet(out smh)) + { + if (!s_shadSaved) { s_shad0 = smh.shadows.value; s_shadOv0 = smh.shadows.overrideState; s_shadSaved = true; } + smh.shadows.overrideState = true; + smh.shadows.value = (sh.w > -900f) ? sh : s_shad0; + applied = smh.shadows.value.ToString("F2"); + } + if (useWhite) white(); + Shoot(name, 0.95f); + Shoot(name + "_g", 10f); + // ๋„“์€ ๊ตฌ๋„(๋ฐฐ๊ฒฝ ํ™•์ธ) + s_cam.orthographicSize = 10f; + s_cam.transform.SetPositionAndRotation(s_camPos, s_camRot); + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; rt.Create(); + var pv = s_cam.targetTexture; s_cam.targetTexture = rt; s_cam.Render(); s_cam.Render(); s_cam.targetTexture = pv; + var pa = RenderTexture.active; RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + RenderTexture.active = pa; + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + "wide_" + name + ".png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); rt.Release(); UnityEngine.Object.Destroy(rt); + L("shadows " + name + " = " + applied); + }; + + var none = new Vector4(0, 0, 0, -1000f); + V("a_now", none, true); // ์ง€๊ธˆ (0.78,0.58,1.25) + V("b_g075", new Vector4(0.78f, 0.75f, 1.25f, -0.06f), true); + V("c_g085", new Vector4(0.78f, 0.85f, 1.25f, -0.06f), true); + V("d_g095", new Vector4(0.78f, 0.95f, 1.25f, -0.06f), true); + V("e_g085b110", new Vector4(0.82f, 0.85f, 1.10f, -0.06f), true); + V("f_g095b100", new Vector4(0.85f, 0.95f, 1.00f, -0.06f), true); + V("g_neutral", new Vector4(0.92f, 0.92f, 1.00f, -0.06f), true); + V("z_sanity", new Vector4(0.78f, 1.80f, 1.25f, -0.06f), true); // ์˜ค๋ฒ„๋ผ์ด๋“œ๊ฐ€ ๋จน๋Š”์ง€ ํ™•์ธ์šฉ(๊ทน๋‹จ๊ฐ’) + + for (int i = 0; i < s_rends.Length; i++) s_rends[i].sharedMaterials = s_orig[i]; + WLReferenceLook.Restore(); + var o2 = WLReferenceLook.Opt.FromSettings(cfg); o2.rim = false; WLReferenceLook.Apply(o2, cfg); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { RestoreShadows(); Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_SHADOWS.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } + + + /// 4์ฐจ ์ฑ„ํƒ โ€” ๋ถ€์œ„ ๊ทธ๋ฃน๋ณ„ _DiffuseColor ์—ญ์ด๋“(์ „์—ญ 1๊ฐœ๋กœ๋Š” ํ”ผ๋ถ€๋ฅผ ๋ชป ๋งž์ถ˜๋‹ค). + public static string Adopt4() + { + var sb2 = new StringBuilder(); + var g = new System.Collections.Generic.Dictionary { + { "Skin_ToonP", new Color(0.993f, 1.028f, 0.874f, 1f) }, + { "M05_ToonP", new Color(0.993f, 1.028f, 0.874f, 1f) }, + { "Hair05_ToonP", new Color(0.993f, 1.028f, 0.874f, 1f) }, + }; + foreach (var kv in g) + { + var m = UnityEditor.AssetDatabase.LoadAssetAtPath("Assets/WL/Look/Character/Materials/" + kv.Key + ".mat"); + m.SetColor("_DiffuseColor", kv.Value); + UnityEditor.EditorUtility.SetDirty(m); + sb2.AppendLine(kv.Key + " _DiffuseColor = " + kv.Value.ToString("F3")); + } + UnityEditor.AssetDatabase.SaveAssets(); + return sb2.ToString(); + } + + /// ์ตœ์ข… ์ดฌ์˜ โ€” ์‹ค์ œ ๋ฐฐ์„  ๊ทธ๋Œ€๋กœ(๊ทผ์ ‘ ยท ๊ฒŒ์ž„ ํฌ๊ธฐ ยท ๋„“์€ ๊ตฌ๋„). + public static string Final4() + { + sb.Length = 0; + try + { + Setup(); + SaveMask("all", 0.95f, s_rends); + foreach (var r in s_rends) SaveMask(r.name, 0.95f, r); + SaveMask("all10", 10f, s_rends); + ShootIdMap("idmap", 0.95f); + var cfg = WLReferenceLookSettings.Instance; + WLReferenceLook.Restore(); + var o = WLReferenceLook.Opt.FromSettings(cfg); o.rim = false; + WLReferenceLook.Apply(o, cfg); + L("diffuse Skin=" + s_rends.First(r => r.name == "Head").sharedMaterial.GetColor("_DiffuseColor").ToString("F3") + + " M05=" + s_rends.First(r => r.name == "Body_m05").sharedMaterial.GetColor("_DiffuseColor").ToString("F3") + + " Hair=" + s_rends.First(r => r.name == "Hair05").sharedMaterial.GetColor("_DiffuseColor").ToString("F3")); + Shoot("fin", 0.95f); Shoot("fin_g", 10f); + s_cam.orthographicSize = 10f; + s_cam.transform.SetPositionAndRotation(s_camPos, s_camRot); + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; rt.Create(); + var pv = s_cam.targetTexture; s_cam.targetTexture = rt; s_cam.Render(); s_cam.Render(); s_cam.targetTexture = pv; + var pa = RenderTexture.active; RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + RenderTexture.active = pa; + Directory.CreateDirectory(RAW); File.WriteAllBytes(RAW + "fin_wide.png", t.EncodeToPNG()); + UnityEngine.Object.Destroy(t); rt.Release(); UnityEngine.Object.Destroy(rt); + L("DONE"); + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { try { Teardown(); } catch { } File.WriteAllText("AgentScripts/WL814x4_FINAL.txt", sb.ToString(), new UTF8Encoding(true)); } + return sb.ToString(); + } +} diff --git a/AgentScripts/WL814x4_SHADOWS.txt b/AgentScripts/WL814x4_SHADOWS.txt new file mode 100644 index 000000000..943c5db8d --- /dev/null +++ b/AgentScripts/WL814x4_SHADOWS.txt @@ -0,0 +1,41 @@ +๏ปฟrenderers Arm_m05,Body_m05,Face,Hair05,Head,Leg_M05 ยท center (-0.01, 0.57, 0.00) ยท h 1.220 + Arm_m05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Body_m05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Face mat=face02_ToonP shader=Unlit/Transparent base=- diff=- shadow=- shades=- minDark=- + Hair05 mat=Hair05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Head mat=Skin_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 + Leg_M05 mat=M05_ToonP_814t shader=Shader Graphs/Toon base=WLPalette_FINAL diff=RGBA(0.993, 1.028, 0.874, 1.000) shadow=RGBA(0.1430, 0.1307, 0.2416, 0.0000) shades=3 minDark=0.12 +ReferenceLook: rimOn=False moodOn=True mood=0.30 contrast=True minDark=0.12 shadowScale=0.85 shadowTintAmt=0.30 shadowTint=RGBA(0.243, 0.106, 0.353, 1.000) charShades=0 key=RGBA(1.00, 0.78, 0.46, 1.00)ร—1.45 amb=RGBA(0.23, 0.23, 0.23, 1.00) +mask all @0.95 = 330746 px +mask Arm_m05 @0.95 = 36600 px +mask Body_m05 @0.95 = 107658 px +mask Face @0.95 = 7136 px +mask Hair05 @0.95 = 127668 px +mask Head @0.95 = 116073 px +mask Leg_M05 @0.95 = 80860 px +mask all10 @10.00 = 2959 px +PAL 0 id=9,240,40 rgb=226,175,169 +PAL 1 id=24,229,47 rgb=115,78,58 +PAL 2 id=39,218,54 rgb=199,199,198 +PAL 3 id=54,207,61 rgb=126,57,54 +PAL 4 id=69,196,68 rgb=207,173,129 +PAL 5 id=84,185,75 rgb=164,73,67 +PAL 6 id=99,174,82 rgb=185,131,97 +PAL 7 id=114,163,89 rgb=130,122,118 +PAL 8 id=129,152,96 rgb=215,186,139 +PAL 9 id=144,141,103 rgb=194,161,131 +PAL 10 id=159,130,110 rgb=116,92,78 +PAL 11 id=174,119,117 rgb=133,84,73 +PAL 12 id=189,108,124 rgb=224,205,153 +PAL 13 id=204,97,131 rgb=152,123,103 +PAL 14 id=219,86,138 rgb=177,173,172 +PAL 15 id=234,75,145 rgb=94,61,45 +shadows a_now = (0.78, 1.80, 1.25, -0.06) +shadows b_g075 = (0.78, 0.75, 1.25, -0.06) +shadows c_g085 = (0.78, 0.85, 1.25, -0.06) +shadows d_g095 = (0.78, 0.95, 1.25, -0.06) +shadows e_g085b110 = (0.82, 0.85, 1.10, -0.06) +shadows f_g095b100 = (0.85, 0.95, 1.00, -0.06) +shadows g_neutral = (0.92, 0.92, 1.00, -0.06) +shadows z_sanity = (0.78, 1.80, 1.25, -0.06) +DONE diff --git a/AgentScripts/WL814x4_eval.py b/AgentScripts/WL814x4_eval.py new file mode 100644 index 000000000..2608bf43d --- /dev/null +++ b/AgentScripts/WL814x4_eval.py @@ -0,0 +1,55 @@ +# WL-814x3 ํ‰๊ฐ€๊ธฐ โ€” ์•ˆ๋ณ„๋กœ โ‘  ๋ถ€์œ„ dHue โ‘ก ์ตœ์  _DiffuseColor ์—ญ์ด๋“(์˜ˆ์ธก) โ‘ข ๊ฒŒ์ž„ ํฌ๊ธฐ ๊ณ ์œ ์ƒ‰ +import json, sys +import numpy as np +from PIL import Image +RAW='Screenshots_WL/WL814x/4th/raw' +def L(n): return np.asarray(Image.open(RAW+'/'+n+'.png').convert('RGB'),dtype=np.uint8) +def hue(c): + r,g,b=[float(x) for x in c]; mx,mn=max(r,g,b),min(r,g,b); d=mx-mn + if d<1e-6: return 0.0 + if mx==r: h=((g-b)/d)%6 + elif mx==g: h=(b-r)/d+2 + else: h=(r-g)/d+4 + return h*60.0 +def sat(c): + mx=max(c); return (mx-min(c))/mx if mx>1e-6 else 0 +def dh(a,b): return (b-a+540)%360-180 +idm=L('idmap'); maF=L('mask_Face')[:,:,0]>127; ma=(L('mask_all')[:,:,0]>127)&~maF +G=np.array(Image.open('Assets/WL/Look/Character/Textures/WLPalette_FINAL.png')).shape[0]//8 +idref=np.array([[9+j*15,240-j*11,40+j*7] for j in range(G*G)],np.float32) +fl=idm.reshape(-1,3).astype(np.float32); d2=((fl[:,None,:]-idref[None,:,:])**2).sum(2) +kid=np.where((d2.min(1).reshape(idm.shape[:2])<400)&(idm.sum(2)>12), d2.argmin(1).reshape(idm.shape[:2]), -1) +tgt={int(k):np.array(v,np.float32) for k,v in json.load(open('AgentScripts/WL814x2_target.json')).items()} +NAME={8:'๋จธ๋ฆฌ์นผ(์ฃผ)',4:'๋จธ๋ฆฌ์นผ(๋ฐ)',2:'ํฐํŠœ๋‹‰',1:'๊ฐ€์ฃฝ๊ฐ‘์˜ท',15:'๋ถ‰์€๋ฐ”์ง€',0:'๋จธ๋ฆฌํ”ผ๋ถ€',5:'๋‹ค๋ฆฌํ”ผ๋ถ€',14:'๋ถ€์ธ ํฐ๋ฉด',11:'ํŒ”์†Œ๋งค',10:'๋ฒจํŠธ',12:'๋จธ๋ฆฌ์นผ(ํ•˜)',3:'๋ถ€์ธ ๊ฐˆ์ƒ‰',13:'๊ฐ€์ฃฝ(์–ด๋‘์šด)',9:'๋ถ‰์€์ฒœ'} +cells=[] +for j in range(G*G): + sel=ma&(kid==j); n=int(sel.sum()) + if n<800: continue + cells.append((j,n,sel,tgt[j])) +m10=L('mask_all10')[:,:,0]>127 +def cellmeans(im): + return [(j,n,o,im[sel].mean(0).astype(np.float64)) for j,n,sel,o in cells] +def errs(cm,g): + return [(j,n,o,np.clip(s*g,0,255),dh(hue(o),hue(np.clip(s*g,0,255))),sat(o)) for j,n,o,s in cm] +def wavg(out): + ch=[(n,abs(e)) for j,n,o,s,e,so in out if so>0.12] + w=np.array([c[0] for c in ch],float); e=np.array([c[1] for c in ch]) + return (e*w).sum()/w.sum(), e.max() +print('%-18s %7s %7s | %-22s %7s %7s | %6s %6s'%('์•ˆ','dHue','์ตœ๋Œ€','์ตœ์  _DiffuseColor','dHue*','์ตœ๋Œ€*','๊ณ ์œ ์ƒ‰','๋น„์œจ%')) +best={} +for v in sys.argv[1:]: + cm=cellmeans(L(v)) + o0=errs(cm,np.ones(3)); a0,m0=wavg(o0) + bb=None + for gr in np.arange(0.80,1.25,0.015): + for gb in np.arange(0.70,1.35,0.015): + gg=(1.0-0.299*gr-0.114*gb)/0.587 + if gg<0.7 or gg>1.4: continue + g=np.array([gr,gg,gb]); a,m=wavg(errs(cm,g)) + sc=a+0.35*m + if bb is None or sc1 else 'a_now' +def L(n): return np.asarray(Image.open(RAW+'/'+n+'.png').convert('RGB'),dtype=np.uint8) +def lum(c): return 0.299*c[0]+0.587*c[1]+0.114*c[2] +def hue(c): + r,g,b=[float(x) for x in c]; mx,mn=max(r,g,b),min(r,g,b); d=mx-mn + if d<1e-6: return 0.0 + if mx==r: h=((g-b)/d)%6 + elif mx==g: h=(b-r)/d+2 + else: h=(r-g)/d+4 + return h*60.0 +def sat(c): + mx=max(c); return (mx-min(c))/mx if mx>1e-6 else 0 +def dh(a,b): return (b-a+540)%360-180 +idm=L('idmap'); maF=L('mask_Face')[:,:,0]>127; ma=(L('mask_all')[:,:,0]>127)&~maF +G=np.array(Image.open('Assets/WL/Look/Character/Textures/WLPalette_FINAL.png')).shape[0]//8 +idref=np.array([[9+j*15,240-j*11,40+j*7] for j in range(G*G)],np.float32) +fl=idm.reshape(-1,3).astype(np.float32); d2=((fl[:,None,:]-idref[None,:,:])**2).sum(2) +kid=np.where((d2.min(1).reshape(idm.shape[:2])<400)&(idm.sum(2)>12), d2.argmin(1).reshape(idm.shape[:2]), -1) +tgt={int(k):np.array(v,np.float32) for k,v in json.load(open('AgentScripts/WL814x2_target.json')).items()} +PART={'Body_m05':'M05','Arm_m05':'M05','Leg_M05':'M05','Head':'Skin','Hair05':'Hair'} +pm={p:(L('mask_'+p)[:,:,0]>127) for p in PART} +im=L(REN) +cells={} +for j in range(G*G): + sel=ma&(kid==j); n=int(sel.sum()) + if n<800: continue + grp=PART[max(((k,int((sel&v).sum())) for k,v in pm.items()),key=lambda t:t[1])[0]] + cells.setdefault(grp,[]).append((j,n,tgt[j].astype(np.float64),im[sel].mean(0).astype(np.float64))) +best={} +print('%-6s %-24s %8s %8s (์นธ %d)'%('๊ทธ๋ฃน','์ตœ์  _DiffuseColor','dHue','์ตœ๋Œ€',0)) +for grp,cs in cells.items(): + def ev(g, full=False): + e=[];w=[];pen=0.0;pw=0.0 + for j,n,o,s in cs: + c=np.clip(s*g,0,255) + if sat(o)>0.12: + e.append(abs(dh(hue(o),hue(c)))); w.append(n) + # ์ฑ„๋„ ๋ณด์กด: ๋ณด์ •์œผ๋กœ ์ฑ„๋„๊ฐ€ ์ค„๋ฉด(์ƒ‰์ด ๋น ์ง€๋ฉด) ๋ฒŒ์  + pen += n*max(0.0, sat(s)-sat(c))*260.0; pw += n + else: + # ๋ฌด์ฑ„์ƒ‰ ๋ชฉํ‘œ(ํฐ์˜ทยท๋ถ€์ธ )๋Š” ํ™”๋ฉด์—์„œ๋„ ๋ฌด์ฑ„์—ฌ์•ผ ํ•œ๋‹ค + pen += n*max(0.0, sat(c)-0.14)*700.0; pw += n + if not e: return 0.0,0.0,0.0 + e=np.array(e);w=np.array(w,float) + return (e*w).sum()/w.sum(), e.max(), pen/max(pw,1) + bb=None + for gr in np.arange(0.88,1.145,0.005): + for gb in np.arange(0.80,1.145,0.005): + gg=(1.0-0.299*gr-0.114*gb)/0.587 + if gg<0.88 or gg>1.15: continue + g=np.array([gr,gg,gb]); a,m,pn=ev(g) + sc=a+0.4*m+pn + if bb is None or sc127 +mf=np.asarray(Image.open(RAW+'/mask_Face.png').convert('L'))>127 +ys,xs=np.where(ma|mf); x0,x1,y0,y1=xs.min()-24,xs.max()+25,ys.min()-24,ys.max()+25 +def crop(n,s=1.0): + im=Image.open(RAW+'/'+n+'.png').convert('RGB').crop((x0,y0,x1,y1)) + return im.resize((int(im.width*s),int(im.height*s)),Image.NEAREST) if s!=1.0 else im +def grid(out,items,fn): + ims=[(t,fn(n)) for t,n in items] + W=sum(i.width for _,i in ims)+18*(len(ims)-1); H=ims[0][1].height+26 + o=Image.new('RGB',(W,H),(22,22,26)); d=ImageDraw.Draw(o); x=0 + for t,im in ims: + o.paste(im,(x,26)); d.text((x+3,7),t,fill=(240,232,190)); x+=im.width+18 + o.save(OUT+'/'+out); print('saved',out,o.size) +grid('e_final_close.png',[('3์ฐจ ์ƒํƒœ (4์ฐจ ์‹œ์ž‘)','a_now'),('4์ฐจ ์ตœ์ข… (๋ถ€์œ„๋ณ„ ์ƒ‰์กฐ ๋ณด์ •)','fin')],lambda n:crop(n)) +grid('e_shadow_steps.png',[('์ง€๊ธˆ G0.58','a_now'),('G0.75','b_g075'),('G0.85','c_g085'),('G0.95','d_g095'),('G.95 B1.0','f_g095b100'),('๊ฑฐ์˜ ์ค‘์„ฑ','g_neutral')],lambda n:crop(n,0.55)) +def wide(n,s=0.42): + im=Image.open(RAW+'/'+n+'.png').convert('RGB'); return im.resize((int(im.width*s),int(im.height*s)),Image.BILINEAR) +grid('e_final_wide.png',[('3์ฐจ ์ƒํƒœ','wide_a_now'),('4์ฐจ ์ตœ์ข…','fin_wide'),('์ฐธ๊ณ : ๊ทธ๋ ˆ์ด๋”ฉ G0.95','wide_d_g095')],wide) +rows=[('ํ•ญ๋ชฉ','1์ฐจ ์‹œ์ž‘(์›๋ณธ ํ…์Šค์ฒ˜)','4์ฐจ ์ตœ์ข…','ํ•ฉ๊ฒฉ์„ ','ํŒ์ •'), + ('์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰ ๋น„์œจ','89.3 %','3.9 %','โ‰ค 25 %','PASS'), + ('์บ๋ฆญํ„ฐ ์˜์—ญ ๊ณ ์œ ์ƒ‰','2,676','115','โ‰ค 200','PASS'), + ('๋ถ€์œ„(๋ฉ์–ด๋ฆฌ)๋‹น ์ƒ‰ ๋‹จ๊ณ„','41','ํ‰๊ท  2.8 (13/14์นธ์ด 2~3)','โ‰ค 4','PASS'), + ('๋ˆˆ์ด ์–ด๋‘์šด ๋ฉ์–ด๋ฆฌ๋กœ','10 px','36 px (๋ˆˆ 1๊ฐœ 7ร—5)','36 px ์ด์ƒ','PASS'), + ('ํ™”๋ฉด Hue ์˜ค์ฐจ(์œ ์ฑ„ ๊ฐ€์ค‘)','โ€“','10.7ยฐ (๋ฒจํŠธ์นธ ์ œ์™ธ 8.4ยฐ)','โ‰ค 8ยฐ','๊ฑฐ์˜'), + (' ๋ถ€์œ„ ์ตœ๋Œ€','โ€“','๋ฒจํŠธ 61.1ยฐ / ๊ทธ ์™ธ โ‰ค 28.8ยฐ','โ‰ค 20ยฐ','๋ฏธ๋‹ฌ 2์นธ'), + ('์‹ค๋ฃจ์—ฃ ์™ธ๊ณฝ์„ ','1 px','1 px (์„ค์ • ๋ฌด๋ณ€๊ฒฝ)','์œ ์ง€','PASS'), + ('๋ฐฐ๊ฒฝ ๋ฃฉ','PD ์Šน์ธ','๋ฌด๋ณ€๊ฒฝ(๊ทธ๋ ˆ์ด๋”ฉ ๋ฏธ์ฑ„ํƒ)','์œ ์ง€','PASS')] +cw=[210,170,220,90,80]; rh=32; W=sum(cw)+40; H=rh*len(rows)+64 +img=Image.new('RGB',(W,H),(22,22,26)); d=ImageDraw.Draw(img) +d.text((20,12),'WL-814x 1~4์ฐจ ์ตœ์ข… ์š”์•ฝ (์ธ๊ฒŒ์ž„ Play ยท ํฌ์ŠคํŠธ ํฌํ•จ ยท ๊ฒŒ์ž„ ํฌ๊ธฐ ยท ์บ๋ฆญํ„ฐ 2,959 px)',fill=(255,235,160)) +for r,row in enumerate(rows): + y=44+r*rh + bg=(40,40,48) if r==0 else ((30,30,36) if r%2 else (26,26,31)) + d.rectangle([16,y,W-16,y+rh-2],fill=bg) + x=20 + for c,cell in enumerate(row): + col=(235,235,235) + if r>0 and c==4: col=(130,230,150) if cell=='PASS' else (245,200,120) + if r>0 and c==2: col=(150,210,255) + d.text((x+6,y+8),str(cell),fill=col); x+=cw[c] +img.save(OUT+'/e_metrics.png'); print('saved e_metrics.png',img.size)