Skip to content

Commit

Permalink
slowly getting better
Browse files Browse the repository at this point in the history
  • Loading branch information
4sval committed Oct 29, 2022
1 parent 59dd045 commit c6dcd92
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 17 deletions.
27 changes: 20 additions & 7 deletions FModel/Resources/default.frag
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions FModel/Views/SearchView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
37 changes: 31 additions & 6 deletions FModel/Views/Snooper/Material.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -33,7 +33,7 @@ public Material()
Parameters = new CMaterialParams2();
UvNumber = 1;
DiffuseColor = Vector4.Zero;
EmissionColor = Vector4.Zero;
EmissionColor = Array.Empty<Vector4>();
IsUsed = false;
}

Expand Down Expand Up @@ -98,6 +98,23 @@ void Add(Texture[] array, UTexture2D original)
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;
Expand Down Expand Up @@ -126,13 +143,18 @@ public void Render(Shader shader)
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);

Expand All @@ -153,7 +175,10 @@ public void Dispose()
{
SpecularMasks[i]?.Dispose();
}
Emissive?.Dispose();
for (int i = 0; i < Emissive.Length; i++)
{
Emissive[i]?.Dispose();
}
GL.DeleteProgram(_handle);
}
}
2 changes: 1 addition & 1 deletion FModel/Views/Snooper/Model.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ private Model(string name, string type, ResolvedObject[] materials, CBaseMeshLod
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();
}

Expand Down

0 comments on commit c6dcd92

Please sign in to comment.