diff --git a/AgentScripts/WL814v_CAPTURE.txt b/AgentScripts/WL814v_CAPTURE.txt new file mode 100644 index 000000000..6d301771e --- /dev/null +++ b/AgentScripts/WL814v_CAPTURE.txt @@ -0,0 +1,26 @@ +포즈 = 카메라 정면 yaw 240° · ortho 10 · 1080×1920 (814u 동일) +마스크: 얼굴데칼 50 px (x:532, y:969, width:22, height:7) · 머리칼 1154 px · 머리(피부) 1047 px · 전체 2996 px (x:512, y:909, width:51, height:100) +피부(Head) 평균 밝기 L = 181 → 「진하게 읽히는 점」 문턱 = L < 136 + +== 얼굴 안별 화면 실측 (얼굴 데칼 50 px) == + 원본 고유색 49 · 서로다른색 98 % · 밝기 71~184(폭 112) · Hue 16.9° · ΔHue - · 진한점 14 px · 눈1개 진한부분 5×3 px + face V1 고유색 31 · 서로다른색 62 % · 밝기 10~172(폭 162) · Hue 23.0° · ΔHue +6.1 · 진한점 36 px · 눈1개 진한부분 7×5 px + face V2 고유색 36 · 서로다른색 72 % · 밝기 12~161(폭 148) · Hue 22.0° · ΔHue +5.1 · 진한점 25 px · 눈1개 진한부분 7×5 px + face V3 고유색 21 · 서로다른색 42 % · 밝기 21~171(폭 150) · Hue 21.7° · ΔHue +4.8 · 진한점 15 px · 눈1개 진한부분 7×3 px + face V4 고유색 32 · 서로다른색 64 % · 밝기 10~172(폭 162) · Hue 24.3° · ΔHue +7.3 · 진한점 38 px · 눈1개 진한부분 7×5 px + +== 머리칼 안별 화면 실측 (머리칼 1154 px) == + 원본 고유색 1067 · 서로다른색 92 % · 밝기 104~237(폭 132) · Hue 39.2° · ΔHue - + hair V1 고유색 564 · 서로다른색 49 % · 밝기 78~225(폭 147) · Hue 36.0° · ΔHue -3.2 + hair V2 고유색 641 · 서로다른색 56 % · 밝기 84~226(폭 141) · Hue 35.8° · ΔHue -3.4 + hair V3 고유색 517 · 서로다른색 45 % · 밝기 49~216(폭 167) · Hue 30.3° · ΔHue -8.9 + hair V4 고유색 497 · 서로다른색 43 % · 밝기 36~219(폭 183) · Hue 33.4° · ΔHue -5.8 + + saved Screenshots_WL/WL814v/v_face_grid.png (3588×770) + saved Screenshots_WL/WL814v/v_hair_grid.png (1212×306) + saved Screenshots_WL/WL814v/v_best_full.png (768×800) + +== 추천 조합 얼굴 V1 + 머리 V1 == + 캐릭터 전체: 고유색 2658 → 2131 · 서로다른색 89 % → 71 % + 얼굴 진한점 14 → 38 px · 눈1개 7×5 px · 대비폭 112 → 162 + 머리칼 고유색 1067 → 564 · ΔHue -3.2° diff --git a/AgentScripts/WL814v_Capture.cs b/AgentScripts/WL814v_Capture.cs new file mode 100644 index 000000000..3e73a741f --- /dev/null +++ b/AgentScripts/WL814v_Capture.cs @@ -0,0 +1,298 @@ +// WL814v_Capture.cs — 안별 임포트 설정 + 화면 실측 + 비교 캡처 (에디터 전용) +// 🔴 씬 저장 0 · 머티리얼/프리팹/URP 에셋 수정 0 (씬 인스턴스에 임시 Material 만 꽂았다 버린다) · ProjectSettings 0 · 원본 png 수정 0 +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Rendering.Universal; + +public static class WL814v_Capture +{ + const string SCENE = "Assets/WL/Look/Arena/Scenes/WL_ArenaProto.unity"; + const string TEX = "Assets/WL/Look/Character/Textures/"; + const string SHOT = "Screenshots_WL/WL814v/"; + const string OUT = "AgentScripts/WL814v_CAPTURE.txt"; + const int LAYER = 31; + const int W = 1080, H = 1920; + static readonly string[] VS = { "V1", "V2", "V3", "V4" }; + static readonly StringBuilder sb = new StringBuilder(); + static void L(string s) { sb.AppendLine(s); Console.WriteLine("[814vC] " + s); } + + public static void Import() + { + try + { + foreach (var v in VS) + foreach (var f in new[] { "face02_" + v + ".png", "Hair05_" + v + ".png" }) + { + var p = TEX + f; + AssetDatabase.ImportAsset(p, ImportAssetOptions.ForceUpdate); + var ti = (TextureImporter)AssetImporter.GetAtPath(p); + if (ti == null) { L("!! importer null " + p); continue; } + ti.textureType = TextureImporterType.Default; + ti.alphaSource = TextureImporterAlphaSource.FromInput; + ti.alphaIsTransparency = true; + ti.mipmapEnabled = true; // 1/40 축소 → 밉 없으면 심하게 반짝인다 + ti.filterMode = FilterMode.Point; // 도트: 보간 금지 + ti.wrapMode = TextureWrapMode.Clamp; + ti.sRGBTexture = true; + ti.maxTextureSize = 512; // 원본 face02_WL/Hair05_WL 의 실효 크기와 동일 조건 + ti.textureCompression = TextureImporterCompression.Uncompressed; // 블록압축은 하드 엣지를 뭉갠다 + ti.SaveAndReimport(); + var t = AssetDatabase.LoadAssetAtPath(p); + L(string.Format("import {0} → {1}×{2} · {3} · mip {4} · {5}", f, t.width, t.height, t.format, t.mipmapCount, t.filterMode)); + } + } + catch (Exception e) { L("EXCEPTION " + e); } + finally { Directory.CreateDirectory(Path.GetDirectoryName(OUT)); File.WriteAllText(OUT, sb.ToString(), new UTF8Encoding(true)); } + } + + class Shot { public Color32[] px; public int w, h; } + + static Camera cam; + static Shot Render(Color bg) + { + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; + var pA = RenderTexture.active; var pC = cam.clearFlags; var pB = cam.backgroundColor; + cam.clearFlags = CameraClearFlags.SolidColor; cam.backgroundColor = bg; cam.targetTexture = rt; cam.Render(); + RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + cam.targetTexture = null; RenderTexture.active = pA; cam.clearFlags = pC; cam.backgroundColor = pB; + var s = new Shot { px = t.GetPixels32(), w = W, h = H }; + UnityEngine.Object.DestroyImmediate(t); rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + return s; + } + + static bool[] MaskOf(SkinnedMeshRenderer[] all, SkinnedMeshRenderer[] on, out int cnt, out RectInt bb) + { + foreach (var r in all) r.enabled = on.Contains(r); + var b = Render(Color.black); var w = Render(Color.white); + var m = new bool[W * H]; cnt = 0; int x0 = W, y0 = H, x1 = -1, y1 = -1; + for (int i = 0; i < m.Length; i++) + { + int d = Mathf.Max(Mathf.Abs(b.px[i].r - w.px[i].r), Mathf.Max(Mathf.Abs(b.px[i].g - w.px[i].g), Mathf.Abs(b.px[i].b - w.px[i].b))); + if (d < 128) { m[i] = true; cnt++; int x = i % W, y = i / W; if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y; } + } + foreach (var r in all) r.enabled = true; + bb = (x1 < 0) ? new RectInt(0, 0, 0, 0) : new RectInt(x0, y0, x1 - x0 + 1, y1 - y0 + 1); + return m; + } + + static float Lum(Color32 c) { return 0.299f * c.r + 0.587f * c.g + 0.114f * c.b; } + static void Hsv(Color32 c, out float h, out float s, out float v) + { + float r = c.r, g = c.g, b = c.b; float mx = Mathf.Max(r, Mathf.Max(g, b)), mn = Mathf.Min(r, Mathf.Min(g, b)); float d = mx - mn; + h = 0; if (d > 1e-6f) { if (mx == r) h = ((g - b) / d + 6f) % 6f; else if (mx == g) h = (b - r) / d + 2f; else h = (r - g) / d + 4f; } + h *= 60f; s = mx > 1e-6f ? d / mx : 0f; v = mx; + } + static float CMeanHue(List hs, List ws) + { + double x = 0, y = 0; + for (int i = 0; i < hs.Count; i++) { x += ws[i] * Math.Cos(hs[i] * Math.PI / 180.0); y += ws[i] * Math.Sin(hs[i] * Math.PI / 180.0); } + return (float)(((Math.Atan2(y, x) * 180.0 / Math.PI) + 360.0) % 360.0); + } + + class Met { public int px, colors; public float ratio, lmin, lmax, hue, darkPx, eyeW, eyeH; } + + static Met Measure(Shot s, bool[] mask, RectInt bb, float skinL) + { + var m = new Met(); var set = new HashSet(); var hs = new List(); var ws = new List(); + m.lmin = 999; m.lmax = -1; + int dx0 = W, dy0 = H, dx1 = -1, dy1 = -1; int half = bb.x + bb.width / 2; + for (int i = 0; i < mask.Length; i++) + { + if (!mask[i]) continue; + var c = s.px[i]; m.px++; + set.Add((c.r << 16) | (c.g << 8) | c.b); + float l = Lum(c); if (l < m.lmin) m.lmin = l; if (l > m.lmax) m.lmax = l; + float h, sa, v; Hsv(c, out h, out sa, out v); + if (sa > 0.08f) { hs.Add(h); ws.Add(sa); } + if (skinL > 0 && l < skinL * 0.75f) + { + m.darkPx++; + int x = i % W, y = i / W; + if (x < half) { if (x < dx0) dx0 = x; if (x > dx1) dx1 = x; if (y < dy0) dy0 = y; if (y > dy1) dy1 = y; } + } + } + m.colors = set.Count; m.ratio = m.px > 0 ? 100f * set.Count / m.px : 0; + m.hue = hs.Count > 0 ? CMeanHue(hs, ws) : -1; + m.eyeW = dx1 >= dx0 ? dx1 - dx0 + 1 : 0; m.eyeH = dy1 >= dy0 ? dy1 - dy0 + 1 : 0; + return m; + } + + static Shot Crop(Shot s, RectInt r, int zoom) + { + var o = new Shot { w = r.width * zoom, h = r.height * zoom, px = new Color32[r.width * zoom * r.height * zoom] }; + for (int y = 0; y < o.h; y++) + for (int x = 0; x < o.w; x++) + { + int sx = r.x + x / zoom, sy = r.y + y / zoom; + o.px[y * o.w + x] = (sx >= 0 && sy >= 0 && sx < s.w && sy < s.h) ? s.px[sy * s.w + sx] : new Color32(24, 24, 28, 255); + } + return o; + } + static Shot HStack(List a, int gap) + { + int h = a.Max(s => s.h), w = a.Sum(s => s.w) + gap * (a.Count - 1); + var o = new Shot { w = w, h = h, px = new Color32[w * h] }; + for (int i = 0; i < o.px.Length; i++) o.px[i] = new Color32(24, 24, 28, 255); + int xo = 0; + foreach (var s in a) { for (int y = 0; y < s.h; y++) for (int x = 0; x < s.w; x++) o.px[y * w + xo + x] = s.px[y * s.w + x]; xo += s.w + gap; } + return o; + } + static Shot VStack(List a, int gap) + { + int w = a.Max(s => s.w), h = a.Sum(s => s.h) + gap * (a.Count - 1); + var o = new Shot { w = w, h = h, px = new Color32[w * h] }; + for (int i = 0; i < o.px.Length; i++) o.px[i] = new Color32(24, 24, 28, 255); + int yo = 0; + for (int k = a.Count - 1; k >= 0; k--) { var s = a[k]; for (int y = 0; y < s.h; y++) for (int x = 0; x < s.w; x++) o.px[(yo + y) * w + x] = s.px[y * s.w + x]; yo += s.h + gap; } + return o; + } + static void Save(Shot s, string file) + { + var t = new Texture2D(s.w, s.h, TextureFormat.RGBA32, false); t.SetPixels32(s.px); t.Apply(); + Directory.CreateDirectory(SHOT); File.WriteAllBytes(SHOT + file, t.EncodeToPNG()); + UnityEngine.Object.DestroyImmediate(t); L(" saved " + SHOT + file + " (" + s.w + "×" + s.h + ")"); + } + + public static void Capture() + { + try { Body(); } + catch (Exception e) { L("EXCEPTION " + e); } + finally { Directory.CreateDirectory(Path.GetDirectoryName(OUT)); File.WriteAllText(OUT, sb.ToString(), new UTF8Encoding(true)); } + } + + static void Body() + { + EditorSceneManager.OpenScene(SCENE, OpenSceneMode.Single); + GameObject root = null; + foreach (var go in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) + if (go.name.Contains("LH_M05")) { root = go; break; } + var smrs = root.GetComponentsInChildren(true).Where(r => r.enabled).ToArray(); + var faceSMR = smrs.First(r => r.name == "Face"); + var hairSMR = smrs.First(r => r.name == "Hair05"); + var headSMR = smrs.First(r => r.name == "Head"); + var scam = Camera.main ?? UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None).First(c => c.orthographic); + float camYaw = scam.transform.eulerAngles.y; + root.transform.rotation = Quaternion.Euler(0, camYaw + 180f, 0); + L(string.Format("포즈 = 카메라 정면 yaw {0:F0}° · ortho 10 · {1}×{2} (814u 동일)", camYaw + 180f, W, H)); + + var all = root.GetComponentsInChildren(true); + var origLayer = new Dictionary(); foreach (var t in all) { origLayer[t] = t.gameObject.layer; t.gameObject.layer = LAYER; } + var b = new Bounds(root.transform.position, Vector3.zero); foreach (var r in smrs) b.Encapsulate(r.bounds); + var go2 = new GameObject("WL814v_Cap"); + cam = go2.AddComponent(); cam.CopyFrom(scam); + cam.orthographic = true; cam.orthographicSize = 10f; cam.aspect = (float)W / H; cam.targetTexture = null; cam.cullingMask = 1 << LAYER; + cam.transform.SetPositionAndRotation(b.center - scam.transform.forward * 50f, scam.transform.rotation); + var ucd = cam.GetUniversalAdditionalCameraData(); if (ucd != null) { ucd.renderPostProcessing = false; ucd.SetRenderer(0); } + for (int i = 0; i < 3; i++) Render(Color.black); // 배치 워밍업 + + var faceOrig = faceSMR.sharedMaterial; var hairOrig = hairSMR.sharedMaterial; + try + { + int cF, cH, cHead, cAll; RectInt bbF, bbH, bbHead, bbAll; + var mFace = MaskOf(smrs, new[] { faceSMR }, out cF, out bbF); + var mHair = MaskOf(smrs, new[] { hairSMR }, out cH, out bbH); + var mHead = MaskOf(smrs, new[] { headSMR }, out cHead, out bbHead); + var mAll = MaskOf(smrs, smrs, out cAll, out bbAll); + L(string.Format("마스크: 얼굴데칼 {0} px {1} · 머리칼 {2} px · 머리(피부) {3} px · 전체 {4} px {5}", cF, bbF, cH, cHead, cAll, bbAll)); + + var baseShot = Render(new Color(0.10f, 0.10f, 0.12f)); + // 피부 밝기 기준 = Head 마스크의 평균 L + float skinL = 0; int nh = 0; + for (int i = 0; i < mHead.Length; i++) if (mHead[i] && !mFace[i]) { skinL += Lum(baseShot.px[i]); nh++; } + skinL = nh > 0 ? skinL / nh : 128f; + L(string.Format("피부(Head) 평균 밝기 L = {0:F0} → 「진하게 읽히는 점」 문턱 = L < {1:F0}", skinL, skinL * 0.75f)); + + var m0f = Measure(baseShot, mFace, bbF, skinL); + var m0h = Measure(baseShot, mHair, bbH, 0); + L(""); + L("== 얼굴 안별 화면 실측 (얼굴 데칼 " + cF + " px) =="); + L(string.Format(" {0,-8} 고유색 {1,4} · 서로다른색 {2,5:F0} % · 밝기 {3,3:F0}~{4,3:F0}(폭 {5,3:F0}) · Hue {6,5:F1}° · ΔHue {7,6} · 진한점 {8,3:F0} px · 눈1개 진한부분 {9}×{10} px", + "원본", m0f.colors, m0f.ratio, m0f.lmin, m0f.lmax, m0f.lmax - m0f.lmin, m0f.hue, "-", m0f.darkPx, m0f.eyeW, m0f.eyeH)); + var faceShots = new List(); faceShots.Add(baseShot); + foreach (var v in VS) + { + var tx = AssetDatabase.LoadAssetAtPath(TEX + "face02_" + v + ".png"); + if (tx == null) { L(" !! 없음 face02_" + v); continue; } + var fm = new Material(faceOrig) { name = "TMP_face_" + v }; + if (fm.HasProperty("_MainTex")) fm.SetTexture("_MainTex", tx); + if (fm.HasProperty("_BaseMap")) fm.SetTexture("_BaseMap", tx); + if (fm.HasProperty("_ShadowBaseMap")) fm.SetTexture("_ShadowBaseMap", tx); + faceSMR.sharedMaterial = fm; + var s = Render(new Color(0.10f, 0.10f, 0.12f)); faceShots.Add(s); + var m = Measure(s, mFace, bbF, skinL); + L(string.Format(" {0,-8} 고유색 {1,4} · 서로다른색 {2,5:F0} % · 밝기 {3,3:F0}~{4,3:F0}(폭 {5,3:F0}) · Hue {6,5:F1}° · ΔHue {7,6:+0.0;-0.0} · 진한점 {8,3:F0} px · 눈1개 진한부분 {9}×{10} px", + "face " + v, m.colors, m.ratio, m.lmin, m.lmax, m.lmax - m.lmin, m.hue, Mathf.DeltaAngle(m0f.hue, m.hue), m.darkPx, m.eyeW, m.eyeH)); + faceSMR.sharedMaterial = faceOrig; + } + + L(""); + L("== 머리칼 안별 화면 실측 (머리칼 " + cH + " px) =="); + L(string.Format(" {0,-8} 고유색 {1,4} · 서로다른색 {2,5:F0} % · 밝기 {3,3:F0}~{4,3:F0}(폭 {5,3:F0}) · Hue {6,5:F1}° · ΔHue {7,6}", + "원본", m0h.colors, m0h.ratio, m0h.lmin, m0h.lmax, m0h.lmax - m0h.lmin, m0h.hue, "-")); + var hairShots = new List(); hairShots.Add(baseShot); + foreach (var v in VS) + { + var tx = AssetDatabase.LoadAssetAtPath(TEX + "Hair05_" + v + ".png"); + if (tx == null) { L(" !! 없음 Hair05_" + v); continue; } + var hm = new Material(hairOrig) { name = "TMP_hair_" + v }; + if (hm.HasProperty("_MainTex")) hm.SetTexture("_MainTex", tx); + if (hm.HasProperty("_BaseMap")) hm.SetTexture("_BaseMap", tx); + if (hm.HasProperty("_ShadowBaseMap")) hm.SetTexture("_ShadowBaseMap", tx); + hairSMR.sharedMaterial = hm; + var s = Render(new Color(0.10f, 0.10f, 0.12f)); hairShots.Add(s); + var m = Measure(s, mHair, bbH, 0); + L(string.Format(" {0,-8} 고유색 {1,4} · 서로다른색 {2,5:F0} % · 밝기 {3,3:F0}~{4,3:F0}(폭 {5,3:F0}) · Hue {6,5:F1}° · ΔHue {7,6:+0.0;-0.0}", + "hair " + v, m.colors, m.ratio, m.lmin, m.lmax, m.lmax - m.lmin, m.hue, Mathf.DeltaAngle(m0h.hue, m.hue))); + hairSMR.sharedMaterial = hairOrig; + } + + // ── 캡처 ── + var headCrop = new RectInt(bbAll.x - 4, bbAll.y + bbAll.height - 58, bbAll.width + 8, 58); + L(""); + Save(VStack(new List { + HStack(faceShots.Select(s => Crop(s, headCrop, 1)).ToList(), 4), + HStack(faceShots.Select(s => Crop(s, headCrop, 12)).ToList(), 12) }, 16), "v_face_grid.png"); + Save(VStack(new List { + HStack(hairShots.Select(s => Crop(s, headCrop, 1)).ToList(), 4), + HStack(hairShots.Select(s => Crop(s, headCrop, 4)).ToList(), 8) }, 16), "v_hair_grid.png"); + + // 최적 조합 = BEST_FACE / BEST_HAIR (인자로 바꿀 수 있게 상수) + { + var ftx = AssetDatabase.LoadAssetAtPath(TEX + "face02_" + BEST_FACE + ".png"); + var htx = AssetDatabase.LoadAssetAtPath(TEX + "Hair05_" + BEST_HAIR + ".png"); + var fm = new Material(faceOrig) { name = "TMP_bestF" }; var hm = new Material(hairOrig) { name = "TMP_bestH" }; + foreach (var pn in new[] { "_MainTex", "_BaseMap", "_ShadowBaseMap" }) { if (fm.HasProperty(pn)) fm.SetTexture(pn, ftx); if (hm.HasProperty(pn)) hm.SetTexture(pn, htx); } + faceSMR.sharedMaterial = fm; hairSMR.sharedMaterial = hm; + var best = Render(new Color(0.10f, 0.10f, 0.12f)); + var full = new RectInt(bbAll.x - 6, bbAll.y - 6, bbAll.width + 12, bbAll.height + 12); + Save(VStack(new List { + HStack(new List{ Crop(baseShot, full, 1), Crop(best, full, 1) }, 6), + HStack(new List{ Crop(baseShot, full, 6), Crop(best, full, 6) }, 12) }, 16), "v_best_full.png"); + var mf = Measure(best, mFace, bbF, skinL); var mh = Measure(best, mHair, bbH, 0); var ma = Measure(best, mAll, bbAll, 0); + var ma0 = Measure(baseShot, mAll, bbAll, 0); + L(""); + L(string.Format("== 추천 조합 얼굴 {0} + 머리 {1} ==", BEST_FACE, BEST_HAIR)); + L(string.Format(" 캐릭터 전체: 고유색 {0} → {1} · 서로다른색 {2:F0} % → {3:F0} %", ma0.colors, ma.colors, ma0.ratio, ma.ratio)); + L(string.Format(" 얼굴 진한점 {0:F0} → {1:F0} px · 눈1개 {2}×{3} px · 대비폭 {4:F0} → {5:F0}", m0f.darkPx, mf.darkPx, mf.eyeW, mf.eyeH, m0f.lmax - m0f.lmin, mf.lmax - mf.lmin)); + L(string.Format(" 머리칼 고유색 {0} → {1} · ΔHue {2:+0.0;-0.0}°", m0h.colors, mh.colors, Mathf.DeltaAngle(m0h.hue, mh.hue))); + faceSMR.sharedMaterial = faceOrig; hairSMR.sharedMaterial = hairOrig; + } + } + finally + { + faceSMR.sharedMaterial = faceOrig; hairSMR.sharedMaterial = hairOrig; + foreach (var kv in origLayer) if (kv.Key != null) kv.Key.gameObject.layer = kv.Value; + UnityEngine.Object.DestroyImmediate(go2); + } + } + + public static string BEST_FACE = "V1", BEST_HAIR = "V1"; +} diff --git a/AgentScripts/WL814v_PROBE.txt b/AgentScripts/WL814v_PROBE.txt new file mode 100644 index 000000000..85b4bdf0e --- /dev/null +++ b/AgentScripts/WL814v_PROBE.txt @@ -0,0 +1,23 @@ +포즈 = 카메라 정면 yaw 240° · 카메라 ortho 10 · 1080×1920 (814u 동일) +전체 실루엣: 키 100 px · 폭 51 px · 면적 2996 px + +== 부위별 「텍셀 → 화면 픽셀」 밀도 (앞면 삼각형만 · 화면면적 가중) == + (UV 면적은 실효 텍스처 512² 기준 · 괄호는 원본 2048² 기준) + Arm_m05 : 그려진 화면 335 px · 앞면삼각 372개 · 앞면 화면면적 339 px² · UV면적 18171 텍셀² + → 화면 1 px = 54 텍셀(512²) = 857 텍셀(2048²) · 🔴 격자 1변 = 7.3 텍셀(512²) = 29.3 텍셀(2048²) · 투영검증 오차 3 px [TRS(무스케일)] + ↳ 이방성: u 1텍셀(512²) = 0.179 화면 px · v 1텍셀 = 0.190 px → 화면 1 px = u 5.6 × v 5.3 텍셀(512²) = u 22 × v 21 텍셀(2048²) + Body_m05 : 그려진 화면 975 px · 앞면삼각 474개 · 앞면 화면면적 894 px² · UV면적 43365 텍셀² + → 화면 1 px = 49 텍셀(512²) = 776 텍셀(2048²) · 🔴 격자 1변 = 7.0 텍셀(512²) = 27.9 텍셀(2048²) · 투영검증 오차 2 px [TRS(무스케일)] + ↳ 이방성: u 1텍셀(512²) = 0.193 화면 px · v 1텍셀 = 0.194 px → 화면 1 px = u 5.2 × v 5.2 텍셀(512²) = u 21 × v 21 텍셀(2048²) + Face : 그려진 화면 50 px · 앞면삼각 28개 · 앞면 화면면적 20 px² · UV면적 13530 텍셀² + → 화면 1 px = 672 텍셀(512²) = 10748 텍셀(2048²) · 🔴 격자 1변 = 25.9 텍셀(512²) = 103.7 텍셀(2048²) · 투영검증 오차 26 px [TRS(무스케일)] + ↳ 이방성: u 1텍셀(512²) = 0.097 화면 px · v 1텍셀 = 0.083 px → 화면 1 px = u 10.3 × v 12.0 텍셀(512²) = u 41 × v 48 텍셀(2048²) + Hair05 : 그려진 화면 1154 px · 앞면삼각 380개 · 앞면 화면면적 1678 px² · UV면적 63381 텍셀² + → 화면 1 px = 38 텍셀(512²) = 604 텍셀(2048²) · 🔴 격자 1변 = 6.1 텍셀(512²) = 24.6 텍셀(2048²) · 투영검증 오차 2 px [localToWorld] + ↳ 이방성: u 1텍셀(512²) = 0.210 화면 px · v 1텍셀 = 0.230 px → 화면 1 px = u 4.8 × v 4.4 텍셀(512²) = u 19 × v 17 텍셀(2048²) + Head : 그려진 화면 1047 px · 앞면삼각 308개 · 앞면 화면면적 1053 px² · UV면적 17046 텍셀² + → 화면 1 px = 16 텍셀(512²) = 259 텍셀(2048²) · 🔴 격자 1변 = 4.0 텍셀(512²) = 16.1 텍셀(2048²) · 투영검증 오차 3 px [localToWorld] + ↳ 이방성: u 1텍셀(512²) = 0.315 화면 px · v 1텍셀 = 0.286 px → 화면 1 px = u 3.2 × v 3.5 텍셀(512²) = u 13 × v 14 텍셀(2048²) + Leg_M05 : 그려진 화면 729 px · 앞면삼각 400개 · 앞면 화면면적 703 px² · UV면적 37605 텍셀² + → 화면 1 px = 53 텍셀(512²) = 856 텍셀(2048²) · 🔴 격자 1변 = 7.3 텍셀(512²) = 29.3 텍셀(2048²) · 투영검증 오차 2 px [TRS(무스케일)] + ↳ 이방성: u 1텍셀(512²) = 0.179 화면 px · v 1텍셀 = 0.175 px → 화면 1 px = u 5.6 × v 5.7 텍셀(512²) = u 22 × v 23 텍셀(2048²) diff --git a/AgentScripts/WL814v_Probe.cs b/AgentScripts/WL814v_Probe.cs new file mode 100644 index 000000000..dcbfe118f --- /dev/null +++ b/AgentScripts/WL814v_Probe.cs @@ -0,0 +1,177 @@ +// WL814v_Probe.cs — §1-1 부위별 「텍셀 → 화면 픽셀」 밀도 실측 (에디터 전용) +// 🔴 씬 저장 0 · 에셋 수정 0 · ProjectSettings 0. 카메라·포즈는 814u 와 동일(ortho 10 · 1080×1920 · 캐릭터를 카메라 정면으로). +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine; +using UnityEngine.Rendering.Universal; + +public static class WL814v_Probe +{ + const string SCENE = "Assets/WL/Look/Arena/Scenes/WL_ArenaProto.unity"; + const string OUT = "AgentScripts/WL814v_PROBE.txt"; + const int LAYER = 31; + const int W = 1080, H = 1920; + static readonly StringBuilder sb = new StringBuilder(); + static void L(string s) { sb.AppendLine(s); Console.WriteLine("[814vP] " + s); } + + class Shot { public Color32[] px; public int w, h; } + + static Shot Render(Camera cam, Color bg) + { + var rt = new RenderTexture(W, H, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); + rt.antiAliasing = 1; rt.filterMode = FilterMode.Point; + var pA = RenderTexture.active; var pC = cam.clearFlags; var pB = cam.backgroundColor; + cam.clearFlags = CameraClearFlags.SolidColor; cam.backgroundColor = bg; cam.targetTexture = rt; cam.Render(); + RenderTexture.active = rt; + var t = new Texture2D(W, H, TextureFormat.RGBA32, false); t.ReadPixels(new Rect(0, 0, W, H), 0, 0); t.Apply(); + cam.targetTexture = null; RenderTexture.active = pA; cam.clearFlags = pC; cam.backgroundColor = pB; + var s = new Shot { px = t.GetPixels32(), w = W, h = H }; + UnityEngine.Object.DestroyImmediate(t); rt.Release(); UnityEngine.Object.DestroyImmediate(rt); + return s; + } + + // 검정/흰 배경 2장 차분 = 실루엣 마스크 (반투명·안티앨리어싱 무시) + static bool[] Mask(Camera cam, out int x0, out int y0, out int x1, out int y1, out int cnt) + { + var b = Render(cam, Color.black); var wt = Render(cam, Color.white); + var m = new bool[W * H]; x0 = W; y0 = H; x1 = -1; y1 = -1; cnt = 0; + for (int i = 0; i < m.Length; i++) + { + int d = Mathf.Max(Mathf.Abs(b.px[i].r - wt.px[i].r), Mathf.Max(Mathf.Abs(b.px[i].g - wt.px[i].g), Mathf.Abs(b.px[i].b - wt.px[i].b))); + if (d < 128) { m[i] = true; cnt++; int x = i % W, y = i / W; if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y; } + } + return m; + } + + public static void Run() + { + try { Body(); } + catch (Exception e) { L("EXCEPTION " + e); } + finally { Directory.CreateDirectory(Path.GetDirectoryName(OUT)); File.WriteAllText(OUT, sb.ToString(), new UTF8Encoding(true)); } + } + + static void Body() + { + EditorSceneManager.OpenScene(SCENE, OpenSceneMode.Single); + GameObject root = null; + foreach (var go in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) + if (go.name.Contains("LH_M05")) { root = go; break; } + if (root == null) { L("!! root 없음"); return; } + var smrs = root.GetComponentsInChildren(true).Where(r => r.enabled && r.gameObject.activeInHierarchy).ToArray(); + var scam = Camera.main ?? UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None).First(c => c.orthographic); + + float camYaw = scam.transform.eulerAngles.y; + root.transform.rotation = Quaternion.Euler(0, camYaw + 180f, 0); // 814u 캡처와 동일 포즈 + L(string.Format("포즈 = 카메라 정면 yaw {0:F0}° · 카메라 ortho 10 · {1}×{2} (814u 동일)", camYaw + 180f, W, H)); + + var all = root.GetComponentsInChildren(true); + var origLayer = new Dictionary(); + foreach (var t in all) { origLayer[t] = t.gameObject.layer; t.gameObject.layer = LAYER; } + + var b = new Bounds(root.transform.position, Vector3.zero); foreach (var r in smrs) b.Encapsulate(r.bounds); + var go2 = new GameObject("WL814v_Cam"); + var cam = go2.AddComponent(); cam.CopyFrom(scam); + cam.orthographic = true; cam.orthographicSize = 10f; cam.aspect = (float)W / H; cam.targetTexture = null; + cam.cullingMask = 1 << LAYER; + cam.transform.SetPositionAndRotation(b.center - scam.transform.forward * 50f, scam.transform.rotation); + var ucd = cam.GetUniversalAdditionalCameraData(); if (ucd != null) { ucd.renderPostProcessing = false; ucd.SetRenderer(0); } + for (int i = 0; i < 3; i++) Render(cam, Color.black); // 배치 워밍업 + + try + { + int x0, y0, x1, y1, cntAll; + foreach (var r in smrs) r.enabled = true; + Mask(cam, out x0, out y0, out x1, out y1, out cntAll); + L(string.Format("전체 실루엣: 키 {0} px · 폭 {1} px · 면적 {2} px", y1 - y0 + 1, x1 - x0 + 1, cntAll)); + L(""); + L("== 부위별 「텍셀 → 화면 픽셀」 밀도 (앞면 삼각형만 · 화면면적 가중) =="); + L(" (UV 면적은 실효 텍스처 512² 기준 · 괄호는 원본 2048² 기준)"); + + foreach (var target in smrs) + { + // 이 렌더러만 켜서 실제로 그려지는 화면 픽셀 수(가림 반영) + foreach (var r in smrs) r.enabled = (r == target); + int a0, b0, a1, b1, cnt; + Mask(cam, out a0, out b0, out a1, out b1, out cnt); + + var mesh = new Mesh(); + target.BakeMesh(mesh, true); // useScale = true → 스케일 포함 + var verts = mesh.vertices; var uvs = mesh.uv; var tris = mesh.triangles; + var mNoScale = Matrix4x4.TRS(target.transform.position, target.transform.rotation, Vector3.one); + var mFull = target.transform.localToWorldMatrix; + + // 🔴 cam.WorldToScreenPoint 는 GameView 크기를 쓴다(배치 = 엉뚱한 값) → VP 행렬로 직접 1080×1920 으로 투영 + var VP = cam.projectionMatrix * cam.worldToCameraMatrix; + System.Func Proj = (wp) => + { + var c = VP * new Vector4(wp.x, wp.y, wp.z, 1f); + if (Mathf.Abs(c.w) > 1e-9f) { c.x /= c.w; c.y /= c.w; c.z /= c.w; } + return new Vector3((c.x * 0.5f + 0.5f) * W, (c.y * 0.5f + 0.5f) * H, c.z); + }; + + double bestScore = double.MaxValue; string bestTag = "?"; double dens = 0, sArea = 0, uArea = 0; int nFront = 0; + foreach (var mode in new[] { 0, 1 }) + { + var M = (mode == 0) ? mNoScale : mFull; + double sA = 0, uA = 0; int nf = 0, nb = 0; double sAb = 0, uAb = 0; + float px0 = 1e9f, py0 = 1e9f, px1 = -1e9f, py1 = -1e9f; + for (int i = 0; i < tris.Length; i += 3) + { + Vector3 p0 = Proj(M.MultiplyPoint3x4(verts[tris[i]])); + Vector3 p1 = Proj(M.MultiplyPoint3x4(verts[tris[i + 1]])); + Vector3 p2 = Proj(M.MultiplyPoint3x4(verts[tris[i + 2]])); + float cross = (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); + px0 = Mathf.Min(px0, Mathf.Min(p0.x, Mathf.Min(p1.x, p2.x))); px1 = Mathf.Max(px1, Mathf.Max(p0.x, Mathf.Max(p1.x, p2.x))); + py0 = Mathf.Min(py0, Mathf.Min(p0.y, Mathf.Min(p1.y, p2.y))); py1 = Mathf.Max(py1, Mathf.Max(p0.y, Mathf.Max(p1.y, p2.y))); + Vector2 q0 = uvs[tris[i]], q1 = uvs[tris[i + 1]], q2 = uvs[tris[i + 2]]; + float ucross = Mathf.Abs((q1.x - q0.x) * (q2.y - q0.y) - (q2.x - q0.x) * (q1.y - q0.y)); + if (cross > 0f) { sA += cross * 0.5; uA += ucross * 0.5 * 512.0 * 512.0; nf++; } + else { sAb += -cross * 0.5; uAb += ucross * 0.5 * 512.0 * 512.0; nb++; } + } + // 앞면 winding 자동 판별: 그려진 화면 px 수에 더 가까운 쪽 + if (Math.Abs(sAb - cnt) < Math.Abs(sA - cnt)) { sA = sAb; uA = uAb; nf = nb; } + // 검증: 투영 bbox 가 실제 렌더 bbox 와 얼마나 맞나 + double score = Math.Abs(px0 - a0) + Math.Abs(px1 - a1) + Math.Abs(py0 - b0) + Math.Abs(py1 - b1); + if (score < bestScore) { bestScore = score; bestTag = (mode == 0 ? "TRS(무스케일)" : "localToWorld"); sArea = sA; uArea = uA; nFront = nf; dens = (sA > 0 ? uA / sA : 0); } + } + UnityEngine.Object.DestroyImmediate(mesh); + L(string.Format(" {0,-9}: 그려진 화면 {1,5} px · 앞면삼각 {2,4}개 · 앞면 화면면적 {3,7:F0} px² · UV면적 {4,9:F0} 텍셀²", + target.name, cnt, nFront, sArea, uArea)); + L(string.Format(" → 화면 1 px = {0:F0} 텍셀(512²) = {1:F0} 텍셀(2048²) · 🔴 격자 1변 = {2:F1} 텍셀(512²) = {3:F1} 텍셀(2048²) · 투영검증 오차 {4:F0} px [{5}]", + dens, dens * 16.0, Math.Sqrt(dens), Math.Sqrt(dens) * 4.0, bestScore, bestTag)); + + // ── U/V 축별 이방성 (면적 가중) ── + { + var VP2 = cam.projectionMatrix * cam.worldToCameraMatrix; + var M2 = (bestTag == "TRS(무스케일)") ? mNoScale : mFull; + System.Func P2 = (wp) => { var c = VP2 * new Vector4(wp.x, wp.y, wp.z, 1f); if (Mathf.Abs(c.w) > 1e-9f) { c.x /= c.w; c.y /= c.w; } return new Vector2((c.x * 0.5f + 0.5f) * W, (c.y * 0.5f + 0.5f) * H); }; + double wu = 0, wv = 0, wsum = 0; + for (int i = 0; i < tris.Length; i += 3) + { + Vector2 p0 = P2(M2.MultiplyPoint3x4(verts[tris[i]])), p1 = P2(M2.MultiplyPoint3x4(verts[tris[i + 1]])), p2 = P2(M2.MultiplyPoint3x4(verts[tris[i + 2]])); + Vector2 q0 = uvs[tris[i]], q1 = uvs[tris[i + 1]], q2 = uvs[tris[i + 2]]; + Vector2 e1 = q1 - q0, e2 = q2 - q0; Vector2 f1 = p1 - p0, f2 = p2 - p0; + float det = e1.x * e2.y - e2.x * e1.y; if (Mathf.Abs(det) < 1e-12f) continue; + Vector2 dPdu = (f1 * e2.y - f2 * e1.y) / det, dPdv = (f2 * e1.x - f1 * e2.x) / det; + double ar = Math.Abs(f1.x * f2.y - f2.x * f1.y) * 0.5; + wu += ar * dPdu.magnitude / 512.0; wv += ar * dPdv.magnitude / 512.0; wsum += ar; + } + if (wsum > 0) + L(string.Format(" ↳ 이방성: u 1텍셀(512²) = {0:F3} 화면 px · v 1텍셀 = {1:F3} px → 화면 1 px = u {2:F1} × v {3:F1} 텍셀(512²) = u {4:F0} × v {5:F0} 텍셀(2048²)", + wu / wsum, wv / wsum, wsum / wu, wsum / wv, 4.0 * wsum / wu, 4.0 * wsum / wv)); + } + } + foreach (var r in smrs) r.enabled = true; + } + finally + { + foreach (var kv in origLayer) if (kv.Key != null) kv.Key.gameObject.layer = kv.Value; + UnityEngine.Object.DestroyImmediate(go2); + } + } +} diff --git a/Assets/WL/Look/Character/Textures/Hair05_V1.png b/Assets/WL/Look/Character/Textures/Hair05_V1.png new file mode 100644 index 000000000..5cfcc5745 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/Hair05_V1.png differ diff --git a/Assets/WL/Look/Character/Textures/Hair05_V1.png.meta b/Assets/WL/Look/Character/Textures/Hair05_V1.png.meta new file mode 100644 index 000000000..19af8aa87 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/Hair05_V1.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 8b84cf412edabc844853ed7836338da9 +TextureImporter: + internalIDToNameTable: + - first: + 213: 8374489691656223259 + second: Hair05_V1_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hair05_V1_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: b1af65e210a283470800000000000000 + internalID: 8374489691656223259 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/Hair05_V2.png b/Assets/WL/Look/Character/Textures/Hair05_V2.png new file mode 100644 index 000000000..86f2fcbbb Binary files /dev/null and b/Assets/WL/Look/Character/Textures/Hair05_V2.png differ diff --git a/Assets/WL/Look/Character/Textures/Hair05_V2.png.meta b/Assets/WL/Look/Character/Textures/Hair05_V2.png.meta new file mode 100644 index 000000000..47d2562f7 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/Hair05_V2.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 24329acf4a726d240b0d7b2afc6bb412 +TextureImporter: + internalIDToNameTable: + - first: + 213: 8476209593673834849 + second: Hair05_V2_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hair05_V2_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 161efa077bb81a570800000000000000 + internalID: 8476209593673834849 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/Hair05_V3.png b/Assets/WL/Look/Character/Textures/Hair05_V3.png new file mode 100644 index 000000000..678644d95 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/Hair05_V3.png differ diff --git a/Assets/WL/Look/Character/Textures/Hair05_V3.png.meta b/Assets/WL/Look/Character/Textures/Hair05_V3.png.meta new file mode 100644 index 000000000..400ec440e --- /dev/null +++ b/Assets/WL/Look/Character/Textures/Hair05_V3.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 5af6b51f5b270764f9dd2412bd511f45 +TextureImporter: + internalIDToNameTable: + - first: + 213: 3018556313912835306 + second: Hair05_V3_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hair05_V3_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: aec794979f014e920800000000000000 + internalID: 3018556313912835306 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/Hair05_V4.png b/Assets/WL/Look/Character/Textures/Hair05_V4.png new file mode 100644 index 000000000..62d90aea7 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/Hair05_V4.png differ diff --git a/Assets/WL/Look/Character/Textures/Hair05_V4.png.meta b/Assets/WL/Look/Character/Textures/Hair05_V4.png.meta new file mode 100644 index 000000000..ac4c4b645 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/Hair05_V4.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 348e1899929201447825cf8c3e3e2b97 +TextureImporter: + internalIDToNameTable: + - first: + 213: 2029141942209985260 + second: Hair05_V4_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: Hair05_V4_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: ceab54878d5f82c10800000000000000 + internalID: 2029141942209985260 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/face02_V1.png b/Assets/WL/Look/Character/Textures/face02_V1.png new file mode 100644 index 000000000..0e1e4a7a4 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/face02_V1.png differ diff --git a/Assets/WL/Look/Character/Textures/face02_V1.png.meta b/Assets/WL/Look/Character/Textures/face02_V1.png.meta new file mode 100644 index 000000000..9f5b35035 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/face02_V1.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 38fe6159a126f194c8b79ae5cc892b85 +TextureImporter: + internalIDToNameTable: + - first: + 213: 5320282600810261513 + second: face02_V1_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: face02_V1_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: 90cacfd56d075d940800000000000000 + internalID: 5320282600810261513 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/face02_V2.png b/Assets/WL/Look/Character/Textures/face02_V2.png new file mode 100644 index 000000000..a4a026ea8 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/face02_V2.png differ diff --git a/Assets/WL/Look/Character/Textures/face02_V2.png.meta b/Assets/WL/Look/Character/Textures/face02_V2.png.meta new file mode 100644 index 000000000..69f7b7962 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/face02_V2.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: a0079a53ad52fd14692edd0f9aeff0df +TextureImporter: + internalIDToNameTable: + - first: + 213: 1884068705787105596 + second: face02_V2_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: face02_V2_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: c31ded4718e852a10800000000000000 + internalID: 1884068705787105596 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/face02_V3.png b/Assets/WL/Look/Character/Textures/face02_V3.png new file mode 100644 index 000000000..50659e104 Binary files /dev/null and b/Assets/WL/Look/Character/Textures/face02_V3.png differ diff --git a/Assets/WL/Look/Character/Textures/face02_V3.png.meta b/Assets/WL/Look/Character/Textures/face02_V3.png.meta new file mode 100644 index 000000000..4108c6c75 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/face02_V3.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: 4918f11a580835f428779005b08ac550 +TextureImporter: + internalIDToNameTable: + - first: + 213: 3534896832738962428 + second: face02_V3_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: face02_V3_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: cfb2f01d0f97e0130800000000000000 + internalID: 3534896832738962428 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/WL/Look/Character/Textures/face02_V4.png b/Assets/WL/Look/Character/Textures/face02_V4.png new file mode 100644 index 000000000..13a1585de Binary files /dev/null and b/Assets/WL/Look/Character/Textures/face02_V4.png differ diff --git a/Assets/WL/Look/Character/Textures/face02_V4.png.meta b/Assets/WL/Look/Character/Textures/face02_V4.png.meta new file mode 100644 index 000000000..0b9504c77 --- /dev/null +++ b/Assets/WL/Look/Character/Textures/face02_V4.png.meta @@ -0,0 +1,181 @@ +fileFormatVersion: 2 +guid: fe42dc99779996a4ab4e7150123ba646 +TextureImporter: + internalIDToNameTable: + - first: + 213: -809660786628649809 + second: face02_V4_0 + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 1 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: face02_V4_0 + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2048 + height: 2048 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + customData: + outline: [] + physicsShape: [] + tessellationDetail: -1 + bones: [] + spriteID: fac9f68edc183c4f0800000000000000 + internalID: -809660786628649809 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: