From 0a5862a0ca225b11ee5e9c9c4775aac4c3bdad77 Mon Sep 17 00:00:00 2001 From: 4sval Date: Mon, 7 Nov 2022 18:47:33 +0100 Subject: [PATCH] code clean up --- CUE4Parse | 2 +- FModel/Resources/default.frag | 2 +- FModel/Views/Snooper/Cube.cs | 74 ++++++++-------- FModel/Views/Snooper/Material.cs | 143 +++++++++++++++++-------------- 4 files changed, 118 insertions(+), 103 deletions(-) diff --git a/CUE4Parse b/CUE4Parse index 5a52cb3d..bdcccb1f 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 5a52cb3d467fe81d219e675f22b1c81e49bf6f56 +Subproject commit bdcccb1fc10c58942bbb897f320a43e0c1a13e30 diff --git a/FModel/Resources/default.frag b/FModel/Resources/default.frag index 7b611df2..86f0dd40 100644 --- a/FModel/Resources/default.frag +++ b/FModel/Resources/default.frag @@ -113,7 +113,7 @@ void main() if (subsurface > 0.0f && uParameters.M.SkinBoost.Exponent > 0.0f) { - vec3 color = pow(uParameters.M.SkinBoost.Exponent, 2) * uParameters.M.SkinBoost.Color; + vec3 color = uParameters.M.SkinBoost.Color * pow(uParameters.M.SkinBoost.Exponent, uParameters.M.SkinBoost.Exponent); result *= clamp(color * m.b, 0.0f, 1.0f); } diff --git a/FModel/Views/Snooper/Cube.cs b/FModel/Views/Snooper/Cube.cs index c21aad63..db53b9c6 100644 --- a/FModel/Views/Snooper/Cube.cs +++ b/FModel/Views/Snooper/Cube.cs @@ -17,48 +17,48 @@ public class Cube : Model 32, 33, 34, 35 }; Vertices = new float[] { - // I X Y Z Normals U V Layer - -1, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, .5f, + // I X Y Z Normals Tangent U V Layer + -1, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, .5f, - -1, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, .5f, + -1, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, .5f, - -1, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, .5f, - -1, -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, .5f, + -1, -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, .5f, + -1, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, .5f, + -1, -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, .5f, - -1, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, .5f, + -1, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, .5f, - -1, 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, .5f, - -1, -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, .5f, + -1, 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, .5f, + -1, -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, .5f, - -1, -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, .5f, - -1, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, .5f + -1, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, .5f, + -1, -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, .5f, + -1, -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, .5f }; Materials = new Material[1]; diff --git a/FModel/Views/Snooper/Material.cs b/FModel/Views/Snooper/Material.cs index 85d767fe..fd8013ec 100644 --- a/FModel/Views/Snooper/Material.cs +++ b/FModel/Views/Snooper/Material.cs @@ -45,6 +45,8 @@ public class Material : IDisposable Normals = Array.Empty(); SpecularMasks = Array.Empty(); Emissive = Array.Empty(); + + DiffuseColor = Array.Empty(); EmissiveColor = Array.Empty(); } @@ -63,95 +65,108 @@ public class Material : IDisposable { _handle = GL.CreateProgram(); - if (Parameters.IsNull) + if (numTexCoords < 1 || Parameters.IsNull) { Diffuse = new[] { new Texture(new FLinearColor(1f, 0f, 0f, 1f)) }; + Normals = new[] { new Texture(new FLinearColor(0.498f, 0.498f, 0.996f, 1f))}; + SpecularMasks = new Texture[1]; + Emissive = new Texture[1]; + DiffuseColor = new[] { new Vector4(0.5f) }; + EmissiveColor = new[] { Vector4.One }; } else { - Fill(cache, numTexCoords, ref Diffuse, Parameters.HasTopDiffuse, CMaterialParams2.Diffuse, CMaterialParams2.FallbackDiffuse); - Fill(cache, numTexCoords, ref Normals, true, CMaterialParams2.Normals, CMaterialParams2.FallbackNormals); - Fill(cache, numTexCoords, ref SpecularMasks, true, CMaterialParams2.SpecularMasks, CMaterialParams2.FallbackSpecularMasks); - Fill(cache, numTexCoords, ref Emissive, true, CMaterialParams2.Emissive, CMaterialParams2.FallbackEmissive); - - if (Parameters.TryGetTexture2d(out var o, "M") && cache.TryGetCachedTexture(o, out var t)) - { - M = new Mask { Texture = t, AmbientOcclusion = 0.7f }; - HasM = true; - if (Parameters.TryGetLinearColor(out var l, "Skin Boost Color And Exponent")) - M.SkinBoost = new Boost { Color = new Vector3(l.R, l.G, l.B), Exponent = l.A }; + { // textures + Diffuse = FillTextures(cache, numTexCoords, Parameters.HasTopDiffuse, CMaterialParams2.Diffuse, CMaterialParams2.FallbackDiffuse, true); + Normals = FillTextures(cache, numTexCoords, Parameters.HasTopNormals, CMaterialParams2.Normals, CMaterialParams2.FallbackNormals); + SpecularMasks = FillTextures(cache, numTexCoords, Parameters.HasTopSpecularMasks, CMaterialParams2.SpecularMasks, CMaterialParams2.FallbackSpecularMasks); + Emissive = FillTextures(cache, numTexCoords, true, CMaterialParams2.Emissive, CMaterialParams2.FallbackEmissive); } - if (Parameters.TryGetScalar(out var roughnessMin, "RoughnessMin", "SpecRoughnessMin") && - Parameters.TryGetScalar(out var roughnessMax, "RoughnessMax", "SpecRoughnessMax")) - Roughness = (roughnessMin + roughnessMax) / 2f; - if (Parameters.TryGetScalar(out var roughness, "Rough", "Roughness")) - Roughness = roughness; - - if (Parameters.TryGetScalar(out var specularMult, "SpecularMult")) - SpecularMult = specularMult; - if (Parameters.TryGetScalar(out var emissiveMult, "emissive mult", "Emissive_Mult")) - EmissiveMult = emissiveMult; - - if (Parameters.TryGetScalar(out var uvScale, "UV Scale")) - UVScale = uvScale; - - DiffuseColor = new Vector4[numTexCoords]; - for (int i = 0; i < DiffuseColor.Length; i++) - { - if (Diffuse[i] == null) continue; - - if (Parameters.TryGetLinearColor(out var color, "ColorMult", "Color_mul", "Color") && color is { A: > 0 }) - { - DiffuseColor[i] = new Vector4(color.R, color.G, color.B, color.A); - } - else DiffuseColor[i] = new Vector4(0.5f); + { // colors + DiffuseColor = FillColors(numTexCoords, Diffuse, CMaterialParams2.DiffuseColors, new Vector4(0.5f)); + EmissiveColor = FillColors(numTexCoords, Emissive, CMaterialParams2.EmissiveColors, Vector4.One); } - EmissiveColor = new Vector4[numTexCoords]; - for (int i = 0; i < EmissiveColor.Length; i++) - { - if (Emissive[i] == null) continue; - - string[] names = i == 0 ? new[] { "Emissive", "EmissiveColor", "Emissive Color" } : new[] { $"Emissive{i + 1}" }; - if (Parameters.TryGetLinearColor(out var color, names) && color is { A: > 0 }) + { // scalars + if (Parameters.TryGetTexture2d(out var original, "M") && cache.TryGetCachedTexture(original, out var transformed)) { - EmissiveColor[i] = new Vector4(color.R, color.G, color.B, color.A); + M = new Mask { Texture = transformed, AmbientOcclusion = 0.7f }; + HasM = true; + if (Parameters.TryGetLinearColor(out var l, "Skin Boost Color And Exponent")) + M.SkinBoost = new Boost { Color = new Vector3(l.R, l.G, l.B), Exponent = l.A }; } - else EmissiveColor[i] = Vector4.One; + + if (Parameters.TryGetScalar(out var roughnessMin, "RoughnessMin", "SpecRoughnessMin") && + Parameters.TryGetScalar(out var roughnessMax, "RoughnessMax", "SpecRoughnessMax")) + Roughness = (roughnessMin + roughnessMax) / 2f; + if (Parameters.TryGetScalar(out var roughness, "Rough", "Roughness")) + Roughness = roughness; + + if (Parameters.TryGetScalar(out var specularMult, "SpecularMult")) + SpecularMult = specularMult; + if (Parameters.TryGetScalar(out var emissiveMult, "emissive mult", "Emissive_Mult")) + EmissiveMult = emissiveMult; + + if (Parameters.TryGetScalar(out var uvScale, "UV Scale")) + UVScale = uvScale; } } } - /// - /// - /// - /// has at least 1 clearly defined texture - /// list of texture parameter names - /// fallback texture parameter name - private void Fill(Cache cache, int numTexCoords, ref Texture[] array, bool top, IReadOnlyList triggers, string fallback) + /// just the cache object + /// number of item in the array + /// has at least 1 clearly defined texture, else will go straight to fallback + /// list of texture parameter names by uv channel + /// fallback texture name to use if no top texture found + /// if no top texture, no fallback texture, then use the first texture found + private Texture[] FillTextures(Cache cache, int numTexCoords, bool top, IReadOnlyList triggers, string fallback, bool first = false) { - array = new Texture[numTexCoords]; + UTexture2D original; + Texture transformed; + var textures = new Texture[numTexCoords]; + if (top) { - for (int i = 0; i < array.Length; i++) + for (int i = 0; i < textures.Length; i++) { - if (Parameters.TryGetTexture2d(out var o, triggers[i]) && cache.TryGetCachedTexture(o, out var t)) - array[i] = t; - else if (i > 0 && array[i - 1] != null) - array[i] = array[i - 1]; + if (Parameters.TryGetTexture2d(out original, triggers[i]) && cache.TryGetCachedTexture(original, out transformed)) + textures[i] = transformed; + else if (i > 0 && textures[i - 1] != null) + textures[i] = textures[i - 1]; } } - else if (Parameters.Textures.TryGetValue(fallback, out var u) && u is UTexture2D o && cache.TryGetCachedTexture(o, out var t)) + else if (Parameters.TryGetTexture2d(out original, fallback) && cache.TryGetCachedTexture(original, out transformed)) { - for (int i = 0; i < array.Length; i++) - array[i] = t; + for (int i = 0; i < textures.Length; i++) + textures[i] = transformed; } - else if (Parameters.Textures.First() is { Value: UTexture2D d } && cache.TryGetCachedTexture(d, out var rip)) + else if (first && Parameters.TryGetFirstTexture2d(out original) && cache.TryGetCachedTexture(original, out transformed)) { - for (int i = 0; i < array.Length; i++) - array[i] = rip; + for (int i = 0; i < textures.Length; i++) + textures[i] = transformed; } + return textures; + } + + /// number of item in the array + /// reference array + /// list of color parameter names by uv channel + /// fallback color to use if no trigger was found + private Vector4[] FillColors(int numTexCoords, IReadOnlyList textures, IReadOnlyList triggers, Vector4 fallback) + { + var colors = new Vector4[numTexCoords]; + for (int i = 0; i < colors.Length; i++) + { + if (textures[i] == null) continue; + + if (Parameters.TryGetLinearColor(out var color, triggers[i]) && color is { A: > 0 }) + { + colors[i] = new Vector4(color.R, color.G, color.B, color.A); + } + else colors[i] = fallback; + } + return colors; } public void Render(Shader shader)