mirror of
https://github.com/4sval/FModel.git
synced 2026-09-13 12:06:39 -05:00
slowly getting better
This commit is contained in:
Submodule CUE4Parse updated: a70e6850b6...7fb8679a4e
@@ -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);
|
||||
}
|
||||
|
||||
@@ -100,10 +100,10 @@
|
||||
</DataTemplate>
|
||||
</GridViewColumn.CellTemplate>
|
||||
</GridViewColumn>
|
||||
<GridViewColumn Width="225" Header="Package" adonisExtensions:GridViewSortExtension.PropertyName="Package">
|
||||
<GridViewColumn Width="225" Header="Archive" adonisExtensions:GridViewSortExtension.PropertyName="Archive">
|
||||
<GridViewColumn.CellTemplate>
|
||||
<DataTemplate>
|
||||
<TextBlock HorizontalAlignment="Left" Text="{Binding Package}" />
|
||||
<TextBlock HorizontalAlignment="Left" Text="{Binding Archive}" />
|
||||
</DataTemplate>
|
||||
</GridViewColumn.CellTemplate>
|
||||
</GridViewColumn>
|
||||
|
||||
@@ -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<Vector4>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user