diff --git a/CUE4Parse b/CUE4Parse index a70e6850..7fb8679a 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit a70e6850b658c1cc2d392ff1a14cd5d3faed78a5 +Subproject commit 7fb8679a4ec5e0057cf1d6138cbfd2c1f658a2a3 diff --git a/FModel/Resources/default.frag b/FModel/Resources/default.frag index 0f45b2bb..6314c7d3 100644 --- a/FModel/Resources/default.frag +++ b/FModel/Resources/default.frag @@ -10,14 +10,14 @@ struct Material { sampler2D diffuseMap[8]; sampler2D normalMap[8]; sampler2D specularMap[8]; - sampler2D emissionMap; + sampler2D emissionMap[8]; bool useSpecularMap; bool hasDiffuseColor; vec4 diffuseColor; - vec4 emissionColor; + vec4 emissionColor[8]; float metallic_value; float roughness_value; @@ -49,6 +49,18 @@ vec4 getValueFromSamplerArray(sampler2D array[8]) { } } +vec3 getValueFromVec4Array(vec4 array[8]) { + if (fTexIndex < 1.0) { + return array[0].rgb; + } if (fTexIndex < 2.0) { + return array[1].rgb; + } if (fTexIndex < 3.0) { + return array[2].rgb; + } else { + return array[3].rgb; + } +} + vec3 getNormalFromMap() { vec3 tangentNormal = getValueFromSamplerArray(material.normalMap).xyz * 2.0 - 1.0; @@ -86,11 +98,12 @@ void main() } else { - vec3 result = light.ambient * vec3(getValueFromSamplerArray(material.diffuseMap)); + vec4 diffuse_map = getValueFromSamplerArray(material.diffuseMap); + vec3 diffuse_no_alpha = vec3(diffuse_map); + vec3 result = light.ambient * diffuse_no_alpha; // diffuse - vec4 diffuse_map = getValueFromSamplerArray(material.diffuseMap); - result += light.diffuse * diff * diffuse_map.rgb; + result += light.diffuse * diff * diffuse_no_alpha; // specular if (material.useSpecularMap) @@ -104,8 +117,8 @@ void main() } // emission - vec3 emission_map = vec3(texture(material.emissionMap, fTexCoords)); - result += material.emissionColor.rgb * emission_map; + vec3 emission_map = vec3(getValueFromSamplerArray(material.emissionMap)); + result += getValueFromVec4Array(material.emissionColor) * emission_map; FragColor = vec4(result, 1.0); } diff --git a/FModel/Views/SearchView.xaml b/FModel/Views/SearchView.xaml index fe773785..351a6271 100644 --- a/FModel/Views/SearchView.xaml +++ b/FModel/Views/SearchView.xaml @@ -100,10 +100,10 @@ - + - + diff --git a/FModel/Views/Snooper/Material.cs b/FModel/Views/Snooper/Material.cs index af3711d4..5e846f53 100644 --- a/FModel/Views/Snooper/Material.cs +++ b/FModel/Views/Snooper/Material.cs @@ -21,10 +21,10 @@ public class Material : IDisposable public Texture[] Diffuse; public Texture[] Normals; public Texture[] SpecularMasks; - public Texture Emissive; + public Texture[] Emissive; public Vector4 DiffuseColor; - public Vector4 EmissionColor; + public Vector4[] EmissionColor; public bool HasSpecularMap; public bool HasDiffuseColor; @@ -33,7 +33,7 @@ public class Material : IDisposable Parameters = new CMaterialParams2(); UvNumber = 1; DiffuseColor = Vector4.Zero; - EmissionColor = Vector4.Zero; + EmissionColor = Array.Empty(); IsUsed = false; } @@ -98,6 +98,23 @@ public class Material : IDisposable index++; } + index = 0; + Emissive = new Texture[UvNumber]; + EmissionColor = new Vector4[UvNumber]; + foreach (var e in Parameters.GetEmissiveTextures()) + { + if (index < UvNumber && e is UTexture2D original) + { + if (Parameters.TryGetLinearColor(out var color, $"Emissive{(index > 0 ? index + 1 : "")}") && color is { A: > 0}) + EmissionColor[index] = new Vector4(color.R, color.G, color.B, color.A); + else EmissionColor[index] = Vector4.One; + + Add(Emissive, original); + } + else if (index < UvNumber) EmissionColor[index] = Vector4.Zero; + index++; + } + // diffuse light is based on normal map, so increase ambient if no normal map _ambientLight = new Vector3(Normals[0] == null ? 1.0f : 0.2f); HasSpecularMap = SpecularMasks[0] != null; @@ -126,13 +143,18 @@ public class Material : IDisposable SpecularMasks[i]?.Bind(TextureUnit.Texture0 + unit++); } + for (var i = 0; i < Emissive.Length; i++) + { + shader.SetUniform($"material.emissionMap[{i}]", unit); + shader.SetUniform($"material.emissionColor[{i}]", EmissionColor[i]); + Emissive[i]?.Bind(TextureUnit.Texture0 + unit++); + } + shader.SetUniform("material.useSpecularMap", HasSpecularMap); shader.SetUniform("material.hasDiffuseColor", HasDiffuseColor); shader.SetUniform("material.diffuseColor", DiffuseColor); - shader.SetUniform("material.emissionColor", EmissionColor); - shader.SetUniform("material.metallic_value", 1f); shader.SetUniform("material.roughness_value", 0f); @@ -153,7 +175,10 @@ public class Material : IDisposable { SpecularMasks[i]?.Dispose(); } - Emissive?.Dispose(); + for (int i = 0; i < Emissive.Length; i++) + { + Emissive[i]?.Dispose(); + } GL.DeleteProgram(_handle); } } diff --git a/FModel/Views/Snooper/Model.cs b/FModel/Views/Snooper/Model.cs index 761ca249..c472d5b1 100644 --- a/FModel/Views/Snooper/Model.cs +++ b/FModel/Views/Snooper/Model.cs @@ -79,7 +79,7 @@ public class Model : IDisposable for (int m = 0; m < Materials.Length; m++) { if ((materials[m]?.TryLoad(out var material) ?? false) && material is UMaterialInterface unrealMaterial) - Materials[m] = new Material(4, unrealMaterial); // lod.NumTexCoords + Materials[m] = new Material(lod.NumTexCoords, unrealMaterial); // lod.NumTexCoords else Materials[m] = new Material(); }