Do not use DX calls to read color tables except in UI.

This commit is contained in:
Ottermandias 2024-11-25 16:53:33 +01:00
parent 22c7e32760
commit 7f95726cc3
2 changed files with 17 additions and 12 deletions

View file

@ -309,27 +309,31 @@ public class StateApplier(
return data;
}
public unsafe void ChangeMaterialValue(ActorData data, MaterialValueIndex index, ColorRow? value, bool force)
public unsafe void ChangeMaterialValue(ActorState state, ActorData data, MaterialValueIndex changedIndex, ColorRow? changedValue,
bool force)
{
if (!force && !_config.UseAdvancedDyes)
return;
foreach (var actor in data.Objects.Where(a => a is { IsCharacter: true, Model.IsHuman: true }))
{
if (!index.TryGetTexture(actor, out var texture, out var mode))
if (!changedIndex.TryGetTexture(actor, out var texture))
continue;
if (!_directX.TryGetColorTable(*texture, out var table))
if (!PrepareColorSet.TryGetColorTable(actor, changedIndex, out var baseTable, out var mode))
continue;
if (value.HasValue)
value.Value.Apply(ref table[index.RowIndex], mode);
else if (PrepareColorSet.TryGetColorTable(actor, index, out var baseTable, out _))
table[index.RowIndex] = baseTable[index.RowIndex];
else
continue;
foreach (var (index, value) in state.Materials.GetValues(
MaterialValueIndex.Min(changedIndex.DrawObject, changedIndex.SlotIndex, changedIndex.MaterialIndex),
MaterialValueIndex.Max(changedIndex.DrawObject, changedIndex.SlotIndex, changedIndex.MaterialIndex)))
{
if (index == changedIndex.Key)
changedValue?.Apply(ref baseTable[changedIndex.RowIndex], mode);
else
value.Model.Apply(ref baseTable[MaterialValueIndex.FromKey(index).RowIndex], mode);
}
_directX.ReplaceColorTable(texture, table);
_directX.ReplaceColorTable(texture, baseTable);
}
}
@ -337,7 +341,8 @@ public class StateApplier(
{
var data = GetData(state);
if (apply)
ChangeMaterialValue(data, index, state.Materials.TryGetValue(index, out var v) ? v.Model : null, state.IsLocked);
ChangeMaterialValue(state, data, index, state.Materials.TryGetValue(index, out var v) ? v.Model : null, state.IsLocked);
return data;
}

View file

@ -293,7 +293,7 @@ public sealed class StateManager(
{
actors = Applier.ChangeParameters(state, CustomizeParameterExtensions.All, true);
foreach (var (idx, mat) in state.Materials.Values)
Applier.ChangeMaterialValue(actors, MaterialValueIndex.FromKey(idx), mat.Game, true);
Applier.ChangeMaterialValue(state, actors, MaterialValueIndex.FromKey(idx), mat.Game, true);
}
state.Materials.Clear();