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; 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) if (!force && !_config.UseAdvancedDyes)
return; return;
foreach (var actor in data.Objects.Where(a => a is { IsCharacter: true, Model.IsHuman: true })) 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; continue;
if (!_directX.TryGetColorTable(*texture, out var table)) if (!PrepareColorSet.TryGetColorTable(actor, changedIndex, out var baseTable, out var mode))
continue; continue;
if (value.HasValue) foreach (var (index, value) in state.Materials.GetValues(
value.Value.Apply(ref table[index.RowIndex], mode); MaterialValueIndex.Min(changedIndex.DrawObject, changedIndex.SlotIndex, changedIndex.MaterialIndex),
else if (PrepareColorSet.TryGetColorTable(actor, index, out var baseTable, out _)) MaterialValueIndex.Max(changedIndex.DrawObject, changedIndex.SlotIndex, changedIndex.MaterialIndex)))
table[index.RowIndex] = baseTable[index.RowIndex]; {
else if (index == changedIndex.Key)
continue; 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); var data = GetData(state);
if (apply) 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; return data;
} }

View file

@ -293,7 +293,7 @@ public sealed class StateManager(
{ {
actors = Applier.ChangeParameters(state, CustomizeParameterExtensions.All, true); actors = Applier.ChangeParameters(state, CustomizeParameterExtensions.All, true);
foreach (var (idx, mat) in state.Materials.Values) 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(); state.Materials.Clear();