mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2025-12-12 18:27:24 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue