mirror of
https://github.com/Ottermandias/Glamourer.git
synced 2026-02-19 22:17:44 +01:00
Run auto redraw on framework, add some locks, handle material value application differently for ApplyAll.
This commit is contained in:
parent
e5f62d3ea9
commit
d8ce81cdc4
10 changed files with 287 additions and 224 deletions
|
|
@ -25,7 +25,8 @@ public class StateApplier(
|
|||
MetaService _metaService,
|
||||
ObjectManager _objects,
|
||||
CrestService _crests,
|
||||
Configuration _config)
|
||||
Configuration _config,
|
||||
DirectXService _directX)
|
||||
{
|
||||
/// <summary> Simply force a redraw regardless of conditions. </summary>
|
||||
public void ForceRedraw(ActorData data)
|
||||
|
|
@ -286,7 +287,7 @@ public class StateApplier(
|
|||
if (!index.TryGetTexture(actor, out var texture))
|
||||
continue;
|
||||
|
||||
if (!index.TryGetColorTable(texture, out var table))
|
||||
if (!_directX.TryGetColorTable(*texture, out var table))
|
||||
continue;
|
||||
|
||||
if (value.HasValue)
|
||||
|
|
@ -296,7 +297,43 @@ public class StateApplier(
|
|||
else
|
||||
continue;
|
||||
|
||||
MaterialService.ReplaceColorTable(texture, table);
|
||||
_directX.ReplaceColorTable(texture, table);
|
||||
}
|
||||
}
|
||||
|
||||
public ActorData ChangeMaterialValues(ActorState state, bool apply)
|
||||
{
|
||||
var data = GetData(state);
|
||||
if (apply)
|
||||
ChangeMaterialValues(data, state.Materials, state.IsLocked);
|
||||
return data;
|
||||
}
|
||||
|
||||
public unsafe void ChangeMaterialValues(ActorData data, in StateMaterialManager materials, bool force)
|
||||
{
|
||||
if (!force && !_config.UseAdvancedDyes)
|
||||
return;
|
||||
|
||||
var groupedMaterialValues = materials.Values.Select(p => (MaterialValueIndex.FromKey(p.Key), p.Value))
|
||||
.GroupBy(p => (p.Item1.DrawObject, p.Item1.SlotIndex, p.Item1.MaterialIndex));
|
||||
|
||||
foreach (var group in groupedMaterialValues)
|
||||
{
|
||||
var values = group.ToList();
|
||||
var mainKey = values[0].Item1;
|
||||
foreach (var actor in data.Objects.Where(a => a is { IsCharacter: true, Model.IsHuman: true }))
|
||||
{
|
||||
if (!mainKey.TryGetTexture(actor, out var texture))
|
||||
continue;
|
||||
|
||||
if (!_directX.TryGetColorTable(*texture, out var table))
|
||||
continue;
|
||||
|
||||
foreach (var (key, value) in values)
|
||||
value.Model.Apply(ref table[key.RowIndex]);
|
||||
|
||||
_directX.ReplaceColorTable(texture, table);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -332,17 +369,17 @@ public class StateApplier(
|
|||
ChangeMainhand(mainhandActors, state.ModelData.Item(EquipSlot.MainHand), state.ModelData.Stain(EquipSlot.MainHand));
|
||||
var offhandActors = state.ModelData.OffhandType != state.BaseData.OffhandType ? actors.OnlyGPose() : actors;
|
||||
ChangeOffhand(offhandActors, state.ModelData.Item(EquipSlot.OffHand), state.ModelData.Stain(EquipSlot.OffHand));
|
||||
}
|
||||
|
||||
if (state.ModelData.IsHuman)
|
||||
{
|
||||
ChangeMetaState(actors, MetaIndex.HatState, state.ModelData.IsHatVisible());
|
||||
ChangeMetaState(actors, MetaIndex.WeaponState, state.ModelData.IsWeaponVisible());
|
||||
ChangeMetaState(actors, MetaIndex.VisorState, state.ModelData.IsVisorToggled());
|
||||
ChangeCrests(actors, state.ModelData.CrestVisibility);
|
||||
ChangeParameters(actors, state.OnlyChangedParameters(), state.ModelData.Parameters, state.IsLocked);
|
||||
foreach (var material in state.Materials.Values)
|
||||
ChangeMaterialValue(actors, MaterialValueIndex.FromKey(material.Key), material.Value.Model, state.IsLocked);
|
||||
if (state.ModelData.IsHuman)
|
||||
{
|
||||
ChangeMetaState(actors, MetaIndex.HatState, state.ModelData.IsHatVisible());
|
||||
ChangeMetaState(actors, MetaIndex.WeaponState, state.ModelData.IsWeaponVisible());
|
||||
ChangeMetaState(actors, MetaIndex.VisorState, state.ModelData.IsVisorToggled());
|
||||
ChangeCrests(actors, state.ModelData.CrestVisibility);
|
||||
ChangeParameters(actors, state.OnlyChangedParameters(), state.ModelData.Parameters, state.IsLocked);
|
||||
// This should never be applied when caused through IPC, then redraw should be true.
|
||||
ChangeMaterialValues(actors, state.Materials, state.IsLocked);
|
||||
}
|
||||
}
|
||||
|
||||
return actors;
|
||||
|
|
|
|||
|
|
@ -321,6 +321,8 @@ public class StateEditor(
|
|||
settings.Source, out _, settings.Key);
|
||||
}
|
||||
}
|
||||
|
||||
requiresRedraw |= mergedDesign.Design.Materials.Count > 0 && settings.Source.IsIpc();
|
||||
}
|
||||
|
||||
var actors = settings.Source.RequiresChange()
|
||||
|
|
|
|||
|
|
@ -224,7 +224,8 @@ public sealed class StateManager(
|
|||
|| !state.ModelData.IsHuman
|
||||
|| CustomizeArray.Compare(state.ModelData.Customize, state.BaseData.Customize).RequiresRedraw();
|
||||
|
||||
state.ModelData = state.BaseData;
|
||||
redraw |= state.Materials.Values.Count > 0 && source.IsIpc();
|
||||
state.ModelData = state.BaseData;
|
||||
state.ModelData.SetIsWet(false);
|
||||
foreach (var index in Enum.GetValues<CustomizeIndex>())
|
||||
state.Sources[index] = StateSource.Game;
|
||||
|
|
@ -339,15 +340,13 @@ public sealed class StateManager(
|
|||
if (!GetOrCreate(actor, out var state))
|
||||
return;
|
||||
|
||||
var data = Applier.ApplyAll(state,
|
||||
!actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw(), false);
|
||||
StateChanged.Invoke(StateChanged.Type.Reapply, source, state, data, null);
|
||||
ReapplyState(actor, state, source);
|
||||
}
|
||||
|
||||
public void ReapplyState(Actor actor, ActorState state, StateSource source)
|
||||
{
|
||||
var data = Applier.ApplyAll(state,
|
||||
!actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw(), false);
|
||||
!actor.Model.IsHuman || CustomizeArray.Compare(actor.Model.GetCustomize(), state.ModelData.Customize).RequiresRedraw() || state.Materials.Values.Count > 0 && source.IsIpc(), false);
|
||||
StateChanged.Invoke(StateChanged.Type.Reapply, source, state, data, null);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue