Skip to content

Commit

Permalink
Deduplicated materials that are exactly the same in Mod.
Browse files Browse the repository at this point in the history
  • Loading branch information
MeltyPlayer committed Jul 5, 2024
1 parent 135b2cf commit 0a94154
Show file tree
Hide file tree
Showing 3 changed files with 235 additions and 60 deletions.
Original file line number Diff line number Diff line change
@@ -1,41 +1,45 @@
using System.Linq;
using System;
using System.Linq;
using System.Collections.Generic;

using fin.data.queues;
using fin.util.linq;

using Newtonsoft.Json.Linq;

namespace fin.language.equations.fixedFunction;

public partial class FixedFunctionEquations<TIdentifier> :
IFixedFunctionEquations<TIdentifier> {
public partial class FixedFunctionEquations<TIdentifier>
: IFixedFunctionEquations<TIdentifier> {
public bool HasInput(TIdentifier identifier)
=> this.ColorInputs.ContainsKey(identifier) ||
this.ScalarInputs.ContainsKey(identifier);

public bool DoOutputsDependOn(TIdentifier[] outputIdentifiers,
IValue value)
=> this.EnumerateOutputs_(outputIdentifiers)
.Any(someValue => someValue.Equals(value));
=> this.DoOutputsDependOn_(outputIdentifiers, value.Equals);

public bool DoOutputsDependOn(TIdentifier[] outputIdentifiers,
TIdentifier identifier)
=> this.EnumerateOutputs_(outputIdentifiers)
.WhereIs<IValue, IIdentifiedValue<TIdentifier>>()
.Any(someValue => identifier.Equals(someValue.Identifier));
=> this.DoOutputsDependOn_(
outputIdentifiers,
value => value is IIdentifiedValue<TIdentifier> identifiedValue &&
identifier.Equals(identifiedValue.Identifier));

public bool DoOutputsDependOn(TIdentifier[] outputIdentifiers,
TIdentifier[] identifiers) {
var identifierSet = identifiers.ToHashSet();
return this.EnumerateOutputs_(outputIdentifiers)
.WhereIs<IValue, IIdentifiedValue<TIdentifier>>()
.Any(someValue
=> identifierSet.Contains(someValue.Identifier));
return this.DoOutputsDependOn_(
outputIdentifiers,
value => value is IIdentifiedValue<TIdentifier> identifiedValue &&
identifierSet.Contains(identifiedValue.Identifier));
}

private IEnumerable<IValue> EnumerateOutputs_(
TIdentifier[] outputIdentifiers) {
var colorQueue = new FinQueue<IColorValue>();
var scalarQueue = new FinQueue<IScalarValue>();
private bool DoOutputsDependOn_(
TIdentifier[] outputIdentifiers,
Func<IValue, bool> checker) {
var colorQueue = new Queue<IColorValue>();
var scalarQueue = new Queue<IScalarValue>();

foreach (var outputIdentifier in outputIdentifiers) {
if (this.colorOutputs_.TryGetValue(outputIdentifier,
Expand All @@ -55,7 +59,9 @@ public bool HasInput(TIdentifier identifier)
if (colorQueue.TryDequeue(out var colorValue)) {
didUpdate = true;

yield return colorValue;
if (checker(colorValue)) {
return true;
}

switch (colorValue) {
case IColorConstant:
Expand All @@ -71,13 +77,21 @@ public bool HasInput(TIdentifier identifier)
break;
}
case IColorExpression colorExpression: {
colorQueue.Enqueue(colorExpression.Terms);
foreach (var term in colorExpression.Terms) {
colorQueue.Enqueue(term);
}

break;
}
case IColorTerm colorTerm: {
colorQueue.Enqueue(colorTerm.NumeratorFactors);
foreach (var numerator in colorTerm.NumeratorFactors) {
colorQueue.Enqueue(numerator);
}

if (colorTerm.DenominatorFactors != null) {
colorQueue.Enqueue(colorTerm.DenominatorFactors);
foreach (var denominator in colorTerm.DenominatorFactors) {
colorQueue.Enqueue(denominator);
}
}

break;
Expand Down Expand Up @@ -106,7 +120,9 @@ public bool HasInput(TIdentifier identifier)
if (scalarQueue.TryDequeue(out var scalarValue)) {
didUpdate = true;

yield return scalarValue;
if (checker(scalarValue)) {
return true;
}

switch (scalarValue) {
case IScalarConstant:
Expand All @@ -130,13 +146,21 @@ public bool HasInput(TIdentifier identifier)
break;
}
case IScalarExpression scalarExpression: {
scalarQueue.Enqueue(scalarExpression.Terms);
foreach (var term in scalarExpression.Terms) {
scalarQueue.Enqueue(term);
}

break;
}
case IScalarTerm scalarTerm: {
scalarQueue.Enqueue(scalarTerm.NumeratorFactors);
foreach (var numerator in scalarTerm.NumeratorFactors) {
scalarQueue.Enqueue(numerator);
}

if (scalarTerm.DenominatorFactors != null) {
scalarQueue.Enqueue(scalarTerm.DenominatorFactors);
foreach (var denominator in scalarTerm.DenominatorFactors) {
scalarQueue.Enqueue(denominator);
}
}

break;
Expand All @@ -147,5 +171,7 @@ public bool HasInput(TIdentifier identifier)
}
}
} while (didUpdate);

return false;
}
}
63 changes: 35 additions & 28 deletions FinModelUtility/Formats/Mod/Mod/src/api/ModModelImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,34 +125,41 @@ public static GxWrapMode ConvertGcnToGx(TilingMode tilingMode)
var lazyTextureDictionary = new GxLazyTextureDictionary(model);

// Writes materials
var modAndFinMaterials = new List<(Material, IMaterial)>();
for (var i = 0; i < mod.materials.materials.Count; ++i) {
var modMaterial = mod.materials.materials[i];

IMaterial finMaterial;
if (modMaterial.flags.CheckFlag(MaterialFlags.HIDDEN)) {
finMaterial = model.MaterialManager.AddHiddenMaterial();
} else if (modMaterial.flags.CheckFlag(MaterialFlags.ENABLED)) {
var modPopulatedMaterial =
new ModPopulatedMaterial(
i,
modMaterial,
mod.materials.texEnvironments[
(int) modMaterial.TevGroupId]);

finMaterial = new GxFixedFunctionMaterial(
model,
model.MaterialManager,
modPopulatedMaterial,
gxTextures,
lazyTextureDictionary).Material;
} else {
finMaterial = model.MaterialManager.AddNullMaterial();
}

modAndFinMaterials.Add((modMaterial, finMaterial));
}
var finMaterialByModMaterial = new LazyDictionary<Material, IMaterial>(
(dict, modMaterial) => {
var i = dict.Count;
IMaterial finMaterial;
if (modMaterial.flags.CheckFlag(MaterialFlags.HIDDEN)) {
finMaterial = model.MaterialManager.AddHiddenMaterial();
} else if (modMaterial.flags.CheckFlag(MaterialFlags.ENABLED)) {
var modPopulatedMaterial =
new ModPopulatedMaterial(
i,
modMaterial,
mod.materials.texEnvironments[
(int) modMaterial.TevGroupId]);
finMaterial = new GxFixedFunctionMaterial(
model,
model.MaterialManager,
modPopulatedMaterial,
gxTextures,
lazyTextureDictionary).Material;
} else {
finMaterial = model.MaterialManager.AddNullMaterial();
}
return finMaterial;
});
var modMaterialAndFinMaterialByIndex
= new LazyDictionary<int, (Material, IMaterial)>(
index => {
var modMaterial = mod.materials.materials[index];
var finMaterial = finMaterialByModMaterial[modMaterial];
return (modMaterial, finMaterial);
});

// Writes bones
// TODO: Simplify these loops
var jointCount = mod.joints.Count;
Expand Down Expand Up @@ -236,7 +243,7 @@ public static GxWrapMode ConvertGcnToGx(TilingMode tilingMode)
var mesh = mod.meshes[meshIndex];

var (modMaterial, finMaterial)
= modAndFinMaterials[jointMatPoly.matIdx];
= modMaterialAndFinMaterialByIndex[jointMatPoly.matIdx];
this.AddMesh_(mod,
mesh,
modMaterial,
Expand Down
Loading

0 comments on commit 0a94154

Please sign in to comment.