mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 10:17:23 +01:00
Do not use DX calls to read color tables except in UI.
This commit is contained in:
parent
22c7e32760
commit
7f95726cc3
2 changed files with 17 additions and 12 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue