Add decal color, fix some bugs and improve logic and handling somewhat.

This commit is contained in:
Ottermandias 2024-01-09 16:05:18 +01:00
parent 6158bcb2f9
commit 5ea779a34c
14 changed files with 351 additions and 174 deletions

View file

@ -1,5 +1,4 @@
using FFXIVClientStructs.FFXIV.Shader;
using Glamourer.Events;
using Glamourer.Events;
using Glamourer.GameData;
using Glamourer.Interop;
using Glamourer.Interop.Penumbra;
@ -282,23 +281,13 @@ public class StateApplier(
}
/// <summary> Change the customize parameters on models. Can change multiple at once. </summary>
public unsafe void ChangeParameters(ActorData data, CustomizeParameterFlag flags, in CustomizeParameterData values)
public void ChangeParameters(ActorData data, CustomizeParameterFlag flags, in CustomizeParameterData values)
{
if (!_config.UseAdvancedParameters)
if (!_config.UseAdvancedParameters || flags == 0)
return;
foreach (var actor in data.Objects.Where(a => a is { IsCharacter: true, Model.IsHuman: true }))
{
var buffer = actor.Model.AsHuman->CustomizeParameterCBuffer;
if (buffer == null)
continue;
var ptr = (CustomizeParameter*)buffer->UnsafeSourcePointer;
if (ptr == null)
continue;
values.Apply(ref *ptr, flags);
}
actor.Model.ApplyParameterData(flags, values);
}
/// <inheritdoc cref="ChangeParameters(ActorData,CustomizeParameterFlag,in CustomizeParameterData)"/>

View file

@ -210,7 +210,7 @@ public class StateEditor
}
/// <summary> Change the customize flags of a character. </summary>
public bool ChangeParameter(ActorState state, CustomizeParameterFlag flag, Vector3 value, StateChanged.Source source, out Vector3 oldValue,
public bool ChangeParameter(ActorState state, CustomizeParameterFlag flag, CustomizeParameterValue value, StateChanged.Source source, out CustomizeParameterValue oldValue,
uint key = 0)
{
oldValue = state.ModelData.Parameters[flag];

View file

@ -729,30 +729,27 @@ public class StateListener : IDisposable
if (!model.IsHuman)
return;
var cBuffer = model.AsHuman->CustomizeParameterCBuffer;
if (cBuffer == null)
return;
var ptr = (CustomizeParameter*)cBuffer->UnsafeSourcePointer;
if (ptr == null)
return;
var data = model.GetParameterData();
foreach (var flag in CustomizeParameterExtensions.AllFlags)
{
var newValue = CustomizeParameterData.FromParameter(*ptr, flag);
var newValue = data[flag];
switch (state[flag])
{
case StateChanged.Source.Game:
if (state.BaseData.Parameters.Set(flag, newValue))
_manager.ChangeCustomizeParameter(state, flag, newValue, StateChanged.Source.Game);
break;
case StateChanged.Source.Manual:
if (state.BaseData.Parameters.Set(flag, newValue))
_manager.ChangeCustomizeParameter(state, flag, newValue, StateChanged.Source.Game);
else if (_config.UseAdvancedParameters)
model.ApplySingleParameterData(flag, state.ModelData.Parameters);
break;
case StateChanged.Source.Fixed:
case StateChanged.Source.Ipc:
state.BaseData.Parameters.Set(flag, newValue);
if (_config.UseAdvancedParameters)
state.ModelData.Parameters.ApplySingle(ref *ptr, flag);
model.ApplySingleParameterData(flag, state.ModelData.Parameters);
break;
}
}

View file

@ -186,13 +186,7 @@ public class StateManager(
// Weapon visibility could technically be inferred from the weapon draw objects,
// but since we use hat visibility from the game object we can also use weapon visibility from it.
ret.SetWeaponVisible(!actor.AsCharacter->DrawData.IsWeaponHidden);
if (model.IsHuman && model.AsHuman->CustomizeParameterCBuffer != null)
{
var ptr = model.AsHuman->CustomizeParameterCBuffer->UnsafeSourcePointer;
if (ptr != null)
ret.Parameters = CustomizeParameterData.FromParameters(*(CustomizeParameter*)ptr);
}
ret.Parameters = model.GetParameterData();
return ret;
}
@ -315,7 +309,7 @@ public class StateManager(
}
/// <summary> Change the crest of an equipment piece. </summary>
public void ChangeCustomizeParameter(ActorState state, CustomizeParameterFlag flag, Vector3 value, StateChanged.Source source, uint key = 0)
public void ChangeCustomizeParameter(ActorState state, CustomizeParameterFlag flag, CustomizeParameterValue value, StateChanged.Source source, uint key = 0)
{
if (!_editor.ChangeParameter(state, flag, value, source, out var old, key))
return;