Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warning instead of IndexOutOfBoundsException #786

Merged
merged 7 commits into from
Dec 9, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG-PRERELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ The format is based on [Keep a Changelog].
- Editing Prefabs with AAO Components in Unity 2022 will cause Error `#782`
- Error if there are reference to Prefab Asset PhysBone Collider `#783`
- Remove Mesh in Box editor broken if inspector is narrow `#784`
- Errors for partially incorrectly configured avatars `#786`
- Since this release, instead of internal errors, warnings are shown

### Security

Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ The format is based on [Keep a Changelog].
- Editing Prefabs with AAO Components in Unity 2022 will cause Error `#782`
- Error if there are reference to Prefab Asset PhysBone Collider `#783`
- Remove Mesh in Box editor broken if inspector is narrow `#784`
- Errors for partially incorrectly configured avatars `#786`
- Since this release, instead of internal errors, warnings are shown

### Security

Expand Down
106 changes: 72 additions & 34 deletions Editor/APIInternal/ComponentInfos.VRCSDK.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,23 +55,38 @@ protected override void CollectMutations(T component, ComponentMutationsCollecto
case VRC_AvatarDescriptor.LipSyncStyle.JawFlapBone:
collector.TransformRotation(component.lipSyncJawBone);
break;
case VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape when component.VisemeSkinnedMesh != null:
case VRC_AvatarDescriptor.LipSyncStyle.JawFlapBlendShape:
{
collector.ModifyProperties(component.VisemeSkinnedMesh,
$"blendShape.{component.MouthOpenBlendShapeName}");
if (component.VisemeSkinnedMesh != null)
{
collector.ModifyProperties(component.VisemeSkinnedMesh,
$"blendShape.{component.MouthOpenBlendShapeName}");
} else {
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:NoVisemeSkinnedMesh")
?.WithContext(component);
}
break;
}
case VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape when component.VisemeSkinnedMesh != null:
case VRC_AvatarDescriptor.LipSyncStyle.VisemeBlendShape:
{
collector.ModifyProperties(component.VisemeSkinnedMesh,
component.VisemeBlendShapes.Select(blendShape => $"blendShape.{blendShape}"));
if (component.VisemeSkinnedMesh != null)
{
collector.ModifyProperties(component.VisemeSkinnedMesh,
component.VisemeBlendShapes.Select(blendShape => $"blendShape.{blendShape}"));
} else {
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:NoVisemeSkinnedMesh")
?.WithContext(component);
}
break;
}
case VRC_AvatarDescriptor.LipSyncStyle.VisemeParameterOnly:
// NOP
break;
default:
throw new ArgumentOutOfRangeException();
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:UnknownLipSyncStyle",
component.lipSync.ToString())
?.WithContext(component);
break;
}
}

Expand Down Expand Up @@ -122,7 +137,8 @@ protected override void ApplySpecialMapping(T component, MappingSource mappingSo
// NOP
break;
default:
throw new ArgumentOutOfRangeException();
// Warning Reported in CollectMutations
break;
}
}

Expand All @@ -141,21 +157,21 @@ protected override void CollectDependency(VRCAvatarDescriptor component,
{
base.CollectDependency(component, collector);

AddCollider(component.collider_head);
AddCollider(component.collider_torso);
AddCollider(component.collider_footR);
AddCollider(component.collider_footL);
AddCollider(component.collider_handR);
AddCollider(component.collider_handL);
AddCollider(component.collider_fingerIndexL);
AddCollider(component.collider_fingerMiddleL);
AddCollider(component.collider_fingerRingL);
AddCollider(component.collider_fingerLittleL);
AddCollider(component.collider_fingerIndexR);
AddCollider(component.collider_fingerMiddleR);
AddCollider(component.collider_fingerRingR);
AddCollider(component.collider_fingerLittleR);
void AddCollider(VRCAvatarDescriptor.ColliderConfig collider)
AddCollider(component.collider_head, "Head");
AddCollider(component.collider_torso, "Torso");
AddCollider(component.collider_footR, "FootR");
AddCollider(component.collider_footL, "FootL");
AddCollider(component.collider_handR, "HandR");
AddCollider(component.collider_handL, "HandL");
AddCollider(component.collider_fingerIndexL, "FingerIndexL");
AddCollider(component.collider_fingerMiddleL, "FingerMiddleL");
AddCollider(component.collider_fingerRingL, "FingerRingL");
AddCollider(component.collider_fingerLittleL, "FingerLittleL");
AddCollider(component.collider_fingerIndexR, "FingerIndexR");
AddCollider(component.collider_fingerMiddleR, "FingerMiddleR");
AddCollider(component.collider_fingerRingR, "FingerRingR");
AddCollider(component.collider_fingerLittleR, "FingerLittleR");
void AddCollider(VRCAvatarDescriptor.ColliderConfig collider, string where)
{
switch (collider.state)
{
Expand All @@ -166,7 +182,10 @@ void AddCollider(VRCAvatarDescriptor.ColliderConfig collider)
case VRCAvatarDescriptor.ColliderConfig.State.Disabled:
break;
default:
throw new ArgumentOutOfRangeException();
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:UnknownColliderState",
collider.ToString(), where)
?.WithContext(component);
break;
}
}
}
Expand Down Expand Up @@ -199,20 +218,38 @@ protected override void CollectMutations(VRCAvatarDescriptor component, Componen
collector.TransformRotation(eyelids);
}
break;
case VRCAvatarDescriptor.EyelidType.Blendshapes
when component.customEyeLookSettings.eyelidsSkinnedMesh != null:
case VRCAvatarDescriptor.EyelidType.Blendshapes:
{
var skinnedMeshRenderer = component.customEyeLookSettings.eyelidsSkinnedMesh;
var mesh = skinnedMeshRenderer.sharedMesh;
if (component.customEyeLookSettings.eyelidsSkinnedMesh != null)
{
var skinnedMeshRenderer = component.customEyeLookSettings.eyelidsSkinnedMesh;
var mesh = skinnedMeshRenderer.sharedMesh;

collector.ModifyProperties(skinnedMeshRenderer,
from index in component.customEyeLookSettings.eyelidsBlendshapes
where 0 <= index && index < mesh.blendShapeCount
select $"blendShape.{mesh.GetBlendShapeName(index)}");
if (mesh != null)
{
collector.ModifyProperties(skinnedMeshRenderer,
from index in component.customEyeLookSettings.eyelidsBlendshapes
where 0 <= index && index < mesh.blendShapeCount
select $"blendShape.{mesh.GetBlendShapeName(index)}");
}
else
{
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:NoMeshInEyelidsSkinnedMesh")
?.WithContext(component);
}
}
else
{
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:NoEyelidsSkinnedMesh")
?.WithContext(component);
}
}
break;
default:
throw new ArgumentOutOfRangeException();
BuildReport.LogWarning("ComponentInfos:VRCAvatarDescriptor:warning:UnknownEyelidType",
component.customEyeLookSettings.eyelidType.ToString())
?.WithContext(component);
break;
}
}
}
Expand Down Expand Up @@ -249,7 +286,8 @@ protected override void ApplySpecialMapping(VRCAvatarDescriptor component, Mappi
}
break;
default:
throw new ArgumentOutOfRangeException();
// Warning Reported in CollectMutations
break;
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions Editor/AnimatorParsers/AnimatorParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,10 @@ void CollectWeightChangesInBehaviors(StateMachineBehaviour[] stateBehaviours)
layer = VRCAvatarDescriptor.AnimLayerType.Additive;
break;
default:
throw new ArgumentOutOfRangeException();
LogWarning("AnimatorParser:PlayableLayerControl:UnknownBlendablePlayableLayer",
$"{playableLayerControl.layer}")
?.WithContext(stateMachineBehaviour);
continue;
}

var current = AnimatorLayerWeightStates.WeightStateFor(playableLayerControl.blendDuration,
Expand All @@ -341,7 +344,10 @@ void CollectWeightChangesInBehaviors(StateMachineBehaviour[] stateBehaviours)
layer = VRCAvatarDescriptor.AnimLayerType.Additive;
break;
default:
throw new ArgumentOutOfRangeException();
LogWarning("AnimatorParser:AnimatorLayerControl:UnknownBlendablePlayableLayer",
$"{animatorLayerControl.layer}")
?.WithContext(stateMachineBehaviour);
continue;
}

var current = AnimatorLayerWeightStates.WeightStateFor(animatorLayerControl.blendDuration,
Expand Down
11 changes: 10 additions & 1 deletion Editor/OptimizerPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ protected override void Configure()
typeof(ObjectMappingContext),
}, _ =>
{
seq.Run(Processors.TraceAndOptimizes.LoadTraceAndOptimizeConfiguration.Instance)
seq.Run("Check if AAO is active", ctx =>
{
ctx.GetState<AAOEnabled>().Enabled = ctx.AvatarRootObject.GetComponent<AvatarTagComponent>();
})
.Then.Run(Processors.TraceAndOptimizes.LoadTraceAndOptimizeConfiguration.Instance)
.Then.Run(Processors.ParseAnimator.Instance)
.Then.Run(Processors.TraceAndOptimizes.AutoFreezeBlendShape.Instance)
#if AAO_VRCSDK3_AVATARS
Expand Down Expand Up @@ -80,4 +84,9 @@ protected override void OnUnhandledException(Exception e)
BuildReport.ReportInternalError(e);
}
}

internal class AAOEnabled
{
public bool Enabled { get; set; }
}
}
4 changes: 4 additions & 0 deletions Editor/Processors/ParseAnimator.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Anatawa12.AvatarOptimizer.AnimatorParsers;
using Anatawa12.AvatarOptimizer.ndmf;
using nadena.dev.ndmf;

namespace Anatawa12.AvatarOptimizer.Processors
Expand All @@ -9,6 +10,9 @@ internal class ParseAnimator : Pass<ParseAnimator>

protected override void Execute(BuildContext context)
{
// do not parse Animator if there are no AAO components in the project to avoid warnings
if (!context.GetState<AAOEnabled>().Enabled) return;

var traceAndOptimize = context.GetState<TraceAndOptimizes.TraceAndOptimizeState>();
var modifications = new AnimatorParser(traceAndOptimize.MmdWorldCompatibility)
.GatherAnimationModifications(context);
Expand Down
4 changes: 3 additions & 1 deletion Editor/Processors/TraceAndOptimize/OptimizePhysBone.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,9 @@ bool IsAnimated()
});
break;
default:
throw new ArgumentOutOfRangeException();
BuildReport.LogWarning("TraceAndOptimize:OptimizePhysBone:UnknownPhysBoneColliderShape", shapeType.ToString())
?.WithContext(colliders);
break;
}
}

Expand Down
3 changes: 3 additions & 0 deletions Editor/Processors/TraceAndOptimize/OptimizePhysBone.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 35 additions & 0 deletions Localization/en.po
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,9 @@ msgstr "Prevents removing end bones whose parent is not removed."
msgid "TraceAndOptimize:prop:removeZeroSizedPolygons"
msgstr "Automatically Remove Zero Sized Polygons"

msgid "TraceAndOptimize:OptimizePhysBone:UnknownPhysBoneColliderShape"
msgstr "Unknown PhysBone Collider Shape '{0}' specified"
Sayamame-beans marked this conversation as resolved.
Show resolved Hide resolved

# endregion

#region ApplyObjectMapping
Expand All @@ -481,6 +484,38 @@ msgstr "BlendShape(s) for viseme are Removed / frozen."

#endregion

#region ComponentInfos

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoVisemeSkinnedMesh"
msgstr "No Skinned Mesh Renderer is specified for LipSync."

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownLipSyncStyle"
msgstr "Unknown LipSync Mode '{0}' is specified."

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownColliderState"
msgstr "Unknown Standard Collider State '{0}' is specified for {1}."

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoMeshInEyelidsSkinnedMesh"
msgstr "No Mesh is specified for Eyelids SkinnedMesh."

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoEyelidsSkinnedMesh"
msgstr "No Skinned Mesh Renderer is specified for Eyelids."

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownEyelidType"
msgstr "Unknown Eyelid Type '{0}' is specified."

#endregion

#region AnimatorParser

msgid "AnimatorParser:PlayableLayerControl:UnknownBlendablePlayableLayer"
msgstr "Unknown Playable Layer '{0}' is specified for Playable Layer Control."

msgid "AnimatorParser:AnimatorLayerControl:UnknownBlendablePlayableLayer"
msgstr "Unknown Playable Layer '{0}' is specified for Animator Layer Control."

#endregion

#region MeshInfo2

msgid "MeshInfo2:warning:multiPassRendering"
Expand Down
35 changes: 35 additions & 0 deletions Localization/ja.po
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,9 @@ msgstr "親が削除されていないendボーンを削除しないようにし
msgid "TraceAndOptimize:prop:removeZeroSizedPolygons"
msgstr "面積がゼロのポリゴンを自動的に削除する"

msgid "TraceAndOptimize:OptimizePhysBone:UnknownPhysBoneColliderShape"
msgstr "未知のPhysBone Collider形状'{0}'が指定されています。"

# endregion

#region ApplyObjectMapping
Expand All @@ -417,6 +420,38 @@ msgstr ""

#endregion

#region ComponentInfos

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoVisemeSkinnedMesh"
msgstr "リップシンク用のSkinnedMeshRendererがありません。"

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownLipSyncStyle"
msgstr "リップシンクの種類として未知の種類'{0}'が指定されています。"

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownColliderState"
msgstr "{1}のStandard Colliderに未知の設定'{0}'が指定されています。"

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoMeshInEyelidsSkinnedMesh"
msgstr "瞬き用のSkinnedMeshRendererにメッシュがありません。"

msgid "ComponentInfos:VRCAvatarDescriptor:warning:NoEyelidsSkinnedMesh"
msgstr "瞬き用のSkinnedMeshRendererがありません。"

msgid "ComponentInfos:VRCAvatarDescriptor:warning:UnknownEyelidType"
msgstr "瞬きの種類として未知の種類'{0}'が指定されています。"

#endregion

#region AnimatorParser

msgid "AnimatorParser:PlayableLayerControl:UnknownBlendablePlayableLayer"
msgstr "Playable Layer Controlに未知のレイヤー'{0}'が指定されています。"

msgid "AnimatorParser:AnimatorLayerControl:UnknownBlendablePlayableLayer"
msgstr "Animator Layer Controlに未知のレイヤー'{0}'が指定されています。"

#endregion

#region MeshInfo2

msgid "MeshInfo2:warning:multiPassRendering"
Expand Down
Loading