Merge remote-tracking branch 'origin/main' into dev-merge

This commit is contained in:
bd_ 2023-04-15 18:16:07 +09:00
commit a910fa5c05
41 changed files with 1315 additions and 538 deletions

View File

@ -9,3 +9,7 @@ updates:
directory: "/docs" # Location of package manifests
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
schedule:
interval: "weekly"
directory: .github/workflows

View File

@ -34,7 +34,7 @@ jobs:
- name: get version
id: version
uses: notiz-dev/github-action-json-property@7c8cf5cc36eb85d8d287a8086a39dac59628eb31
uses: notiz-dev/github-action-json-property@a5a9c668b16513c737c3e1f8956772c99c73f6e8
with:
path: "Packages/${{env.packageName}}/package.json"
prop_path: "version"
@ -55,7 +55,7 @@ jobs:
echo "unityPackage=${{ env.packageName }}-${{ steps.version.outputs.prop }}.unitypackage" >> $GITHUB_ENV
- name: Create Zip
uses: thedoctor0/zip-release@09336613be18a8208dfa66bd57efafd9e2685657
uses: thedoctor0/zip-release@a24011d8d445e4da5935a7e73c1f98e22a439464
with:
type: "zip"
directory: "Packages/${{env.packageName}}/"
@ -70,7 +70,7 @@ jobs:
include-files: metaList
- name: Make Release
uses: softprops/action-gh-release@1e07f4398721186383de40550babbdf2b84acfc5
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844
if: startsWith(github.ref, 'refs/tags/')
with:
draft: true

View File

@ -1,8 +1,21 @@
name: Build documentation
name: Build documentation
on:
pull_request:
workflow_call:
inputs:
ref:
description: 'commit to build'
type: string
required: false
path:
description: 'path within the docs pages to build to'
type: string
required: false
artifact:
description: 'artifact name to write'
type: string
required: false
jobs:
build-docs:
@ -13,6 +26,11 @@ jobs:
with:
node-version: 18
- uses: actions/checkout@v3 # check out this repo
if: ${{ !inputs.ref }}
- uses: actions/checkout@v3 # check out the repo we're building docs for
if: ${{ inputs.ref }}
with:
ref: ${{ inputs.ref }}
- uses: actions/checkout@v3
with:
repository: bdunderscore/modular-avatar-images
@ -38,15 +56,27 @@ jobs:
restore-keys: |
${{ runner.os }}-yarn-
- name: Set baseUri
if: ${{ inputs.path }}
run: |
BASEURL="/${{ inputs.path }}/" perl -i -p -e "s{baseUrl: '/'}{baseUrl: '\$ENV{BASEURL}'}" docs/docusaurus.config.js
cat docs/docusaurus.config.js
- name: Build docs
run: |
cd docs
yarn install --immutable
yarn build
ls -lR build
- name: Set robots.txt
run: |
if [ -e docs/robots.txt ]; then
cp docs/robots.txt docs/build/robots.txt
fi
- name: Upload artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: docs
name: ${{ inputs.artifact || 'docs' }}
path: docs/build

View File

@ -2,7 +2,9 @@ name: Deploy documentation
on:
push:
branches:
- ci
- main
- dev
workflow_dispatch:
permissions:
@ -18,9 +20,18 @@ jobs:
build-docs:
name: Build documentation
uses: bdunderscore/modular-avatar/.github/workflows/build-test-docs.yml@main
build-docs-dev:
name: Build documentation (dev branch)
uses: bdunderscore/modular-avatar/.github/workflows/build-test-docs.yml@main
with:
ref: dev
path: dev
artifact: docs-dev
deploy-docs:
name: Deploy documentation
needs: build-docs
needs:
- build-docs
- build-docs-dev
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
@ -28,13 +39,22 @@ jobs:
steps:
- name: Download artifact
uses: actions/download-artifact@v2
uses: actions/download-artifact@v3
with:
name: docs
path: docs/build
- name: Download artifact
uses: actions/download-artifact@v3
with:
name: docs-dev
path: docs/build/dev
- name: Dump file listing
run: |
ls -lR docs/build
- name: Setup Pages
uses: actions/configure-pages@v2
uses: actions/configure-pages@v3
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
@ -43,4 +63,4 @@ jobs:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
uses: actions/deploy-pages@v2

77
.github/workflows/gameci.yml vendored Normal file
View File

@ -0,0 +1,77 @@
# MIT License
#
# Copyright (c) 2022 anatawa12
# Copyright (c) 2022 bd_
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
name: GameCI
on:
push:
branches: [master, dev]
# This is a bit of a radioactive event; we need to be very careful with what permissions
# we assign this action, as we're allowing arbitrary code execution with the context of
# whatever permissions we assign.
pull_request_target:
paths:
- 'Packages/**'
- 'Assets/**'
- 'ProjectSettings/**'
- '.github/workflows/gameci.yml'
workflow_dispatch: {}
# pull_request_target grants access to a privileged GITHUB_TOKEN by default, revoke this
permissions:
contents: read
checks: write
jobs:
build-and-test:
runs-on: ubuntu-latest
permissions:
checks: write
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.event.pull_request.head.sha }}
- uses: anatawa12/sh-actions/resolve-vpm-packages@master
- uses: game-ci/unity-test-runner@v2
id: gameci
env:
# meh, just a personal license...
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
testMode: EditMode
githubToken: ${{ github.token }}
coverageOptions: generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:+nadena.dev.*
customParameters: -nographics -assemblyNames Tests
- uses: actions/upload-artifact@v3
if: always()
with:
name: Test results
path: ${{ steps.gameci.outputs.artifactsPath }}
- uses: actions/upload-artifact@v3
if: always()
with:
name: Coverage results
path: ${{ steps.gameci.outputs.coveragePath }}

39
.github/workflows/gamici-activation.yml vendored Normal file
View File

@ -0,0 +1,39 @@
# MIT License
#
# Copyright (c) 2022 anatawa12
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
name: GameCI Acquire activation file
on:
workflow_dispatch: {}
jobs:
activation:
name: Request manual activation file 🔑
runs-on: ubuntu-latest
steps:
# Request manual activation file
- name: Request manual activation file
id: getManualLicenseFile
uses: game-ci/unity-request-activation-file@v2
- name: Expose as artifact
uses: actions/upload-artifact@v3
with:
name: ${{ steps.getManualLicenseFile.outputs.filePath }}
path: ${{ steps.getManualLicenseFile.outputs.filePath }}

View File

@ -22,7 +22,7 @@ namespace modular_avatar_tests.AnimateAddedBones
var layerName = "merged";
var motion = findFxMotion(prefab, layerName);
var motion = findFxClip(prefab, layerName);
var cubeObject = prefab.transform.Find("Armature/Hips").GetChild(0).gameObject;
Assert.True(cubeObject.name.StartsWith("Cube$"));

View File

@ -0,0 +1,53 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: DBTP
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings: []
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 1
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 0
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves: []
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 822fa250a223d354b8f2c1e5e4a71beb
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,115 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-2231289259402408727
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: merged
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 6794198557188456209}
m_Position: {x: 30, y: 220, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 6794198557188456209}
--- !u!206 &-43520952576507180
BlendTree:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blend Tree
m_Childs:
- serializedVersion: 2
m_Motion: {fileID: 7400000, guid: 822fa250a223d354b8f2c1e5e4a71beb, type: 2}
m_Threshold: 0
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: A
m_Mirror: 0
- serializedVersion: 2
m_Motion: {fileID: 7400000, guid: 822fa250a223d354b8f2c1e5e4a71beb, type: 2}
m_Threshold: 1
m_Position: {x: 0, y: 0}
m_TimeScale: 1
m_CycleOffset: 0
m_DirectBlendParameter: B
m_Mirror: 0
m_BlendParameter: Blend
m_BlendParameterY: Blend
m_MinThreshold: 0
m_MaxThreshold: 1
m_UseAutomaticThresholds: 1
m_NormalizedBlendValues: 0
m_BlendType: 4
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: DBTP
serializedVersion: 5
m_AnimatorParameters:
- m_Name: A
m_Type: 1
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: B
m_Type: 1
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: merged
m_StateMachine: {fileID: -2231289259402408727}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &6794198557188456209
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blend Tree
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -43520952576507180}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 10117b7b37cd8844c93d0c5c18929fcf
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,28 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Animations;
using UnityEngine;
namespace modular_avatar_tests.DirectBlendTreeParameters
{
public class DirectBlendTreeParameters : TestBase
{
[Test]
public void RemapsDirectBlendTreeParameters()
{
var prefab = CreatePrefab("DirectBlendTreeParameters.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var layerName = "merged";
var motion = findFxMotion(prefab, layerName);
var blendTree = motion as BlendTree;
Assert.NotNull(blendTree);
var children = blendTree.children;
Assert.AreEqual(children[0].directBlendParameter, "A"); //not remapped
Assert.AreEqual(children[1].directBlendParameter, "C"); //remapped
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 355678dd0cdf4503b1b6545427ff5e8e
timeCreated: 1679719502

View File

@ -0,0 +1,390 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &358086172465847897
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4301418309833736947}
- component: {fileID: 8166779794048720401}
- component: {fileID: 3545031262107578409}
m_Layer: 0
m_Name: GameObject
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4301418309833736947
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4724854421498416451}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8166779794048720401
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71a96d4ea0c344f39e277d82035bf9bd, type: 3}
m_Name:
m_EditorClassIdentifier:
parameters:
- nameOrPrefix: B
remapTo: C
internalParameter: 0
isPrefix: 0
syncType: 0
defaultValue: 0
saved: 0
--- !u!114 &3545031262107578409
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 358086172465847897}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1bb122659f724ebf85fe095ac02dc339, type: 3}
m_Name:
m_EditorClassIdentifier:
animator: {fileID: 9100000, guid: 10117b7b37cd8844c93d0c5c18929fcf, type: 2}
layerType: 5
deleteAttachedAnimator: 0
pathMode: 0
matchAvatarWriteDefaults: 0
--- !u!1 &6524782399038551043
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4724854421498416451}
- component: {fileID: 2239338889414089943}
- component: {fileID: 3030341108566167033}
- component: {fileID: 5629002289773137650}
m_Layer: 0
m_Name: DirectBlendTreeParameters
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4724854421498416451
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 4.1121078, y: 0.04631436, z: -0.7135619}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 4301418309833736947}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2239338889414089943
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 542108242, guid: 67cc4cb7839cd3741b63733d5adf0442, type: 3}
m_Name:
m_EditorClassIdentifier:
Name:
ViewPosition: {x: 0, y: 1.6, z: 0.2}
Animations: 0
ScaleIPD: 1
lipSync: 0
lipSyncJawBone: {fileID: 0}
lipSyncJawClosed: {x: 0, y: 0, z: 0, w: 1}
lipSyncJawOpen: {x: 0, y: 0, z: 0, w: 1}
VisemeSkinnedMesh: {fileID: 0}
MouthOpenBlendShapeName: Facial_Blends.Jaw_Down
VisemeBlendShapes: []
unityVersion:
portraitCameraPositionOffset: {x: 0, y: 0, z: 0}
portraitCameraRotationOffset: {x: 0, y: 1, z: 0, w: -0.00000004371139}
customExpressions: 0
expressionsMenu: {fileID: 0}
expressionParameters: {fileID: 0}
enableEyeLook: 0
customEyeLookSettings:
eyeMovement:
confidence: 0.5
excitement: 0.5
leftEye: {fileID: 0}
rightEye: {fileID: 0}
eyesLookingStraight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingUp:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingDown:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingLeft:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyesLookingRight:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidType: 0
upperLeftEyelid: {fileID: 0}
upperRightEyelid: {fileID: 0}
lowerLeftEyelid: {fileID: 0}
lowerRightEyelid: {fileID: 0}
eyelidsDefault:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsClosed:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingUp:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsLookingDown:
upper:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
lower:
linked: 1
left: {x: 0, y: 0, z: 0, w: 0}
right: {x: 0, y: 0, z: 0, w: 0}
eyelidsSkinnedMesh: {fileID: 0}
eyelidsBlendshapes:
customizeAnimationLayers: 0
baseAnimationLayers:
- isEnabled: 0
type: 0
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 4
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 5
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
specialAnimationLayers:
- isEnabled: 0
type: 6
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 7
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
- isEnabled: 0
type: 8
animatorController: {fileID: 0}
mask: {fileID: 0}
isDefault: 1
AnimationPreset: {fileID: 0}
animationHashSet: []
autoFootsteps: 1
autoLocomotion: 1
collider_head:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_torso:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_footL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_handL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleL:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerIndexR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerMiddleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerRingR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
collider_fingerLittleR:
isMirrored: 1
state: 0
transform: {fileID: 0}
radius: 0
height: 0
position: {x: 0, y: 0, z: 0}
rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &3030341108566167033
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -1427037861, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
m_Name:
m_EditorClassIdentifier:
launchedFromSDKPipeline: 0
completedSDKPipeline: 0
blueprintId:
contentType: 0
assetBundleUnityVersion:
fallbackStatus: 0
--- !u!95 &5629002289773137650
Animator:
serializedVersion: 3
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6524782399038551043}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
m_LinearVelocityBlending: 0
m_WarningMessage:
m_HasTransformHierarchy: 1
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorControllerStateOnDisable: 0

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 70484dfc143c0904cb1facfb29d5ee16
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,24 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
using VRC.SDK3.Avatars.ScriptableObjects;
namespace modular_avatar_tests
{
public class NullSubparameterTest : TestBase
{
[Test]
public void TestNullSubparametersField()
{
VRCExpressionsMenu menu = ScriptableObject.CreateInstance<VRCExpressionsMenu>();
var root = CreateRoot("root");
var avatar = root.GetComponent<VRCAvatarDescriptor>();
avatar.expressionsMenu = menu;
// This should not throw an exception
ParameterPolicy.ProbeParameters(root);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: af0baf421bd9450d974871db9d25c2c4
timeCreated: 1681041544

View File

@ -0,0 +1,53 @@
using nadena.dev.modular_avatar.core.editor;
using NUnit.Framework;
using UnityEngine;
using VRC.SDK3.Avatars.Components;
namespace modular_avatar_tests
{
public class RetargetMeshesTest : TestBase
{
// Real world case of this test case is with skinned mesh without bones or skinned mesh renderer with null mesh.
[Test]
public void RootBoneOnly()
{
var root = CreateRoot("root");
var a = CreateChild(root, "a");
var b = CreateChild(a, "b");
var skinnedMeshRenderer = root.AddComponent<SkinnedMeshRenderer>();
skinnedMeshRenderer.sharedMesh = new Mesh();
skinnedMeshRenderer.rootBone = b.transform;
Debug.Assert(skinnedMeshRenderer.bones.Length == 0);
BoneDatabase.AddMergedBone(b.transform);
var context = new BuildContext(root.GetComponent<VRCAvatarDescriptor>());
new RetargetMeshes().OnPreprocessAvatar(root, context);
Assert.AreEqual(a.transform, skinnedMeshRenderer.rootBone);
}
[Test]
public void NoMeshRootBoneOnly()
{
var root = CreateRoot("root");
var a = CreateChild(root, "a");
var b = CreateChild(a, "b");
b.transform.localScale = new Vector3(2, 2, 2);
var skinnedMeshRenderer = root.AddComponent<SkinnedMeshRenderer>();
skinnedMeshRenderer.sharedMesh = null;
skinnedMeshRenderer.localBounds = new Bounds(new Vector3(0, 0, 0), new Vector3(1, 1, 1));
skinnedMeshRenderer.rootBone = b.transform;
Debug.Assert(skinnedMeshRenderer.bones.Length == 0);
BoneDatabase.AddMergedBone(b.transform);
var context = new BuildContext(root.GetComponent<VRCAvatarDescriptor>());
new RetargetMeshes().OnPreprocessAvatar(root, context);
Assert.AreEqual(a.transform, skinnedMeshRenderer.rootBone);
Assert.AreEqual(new Bounds(new Vector3(0, 0, 0), new Vector3(2, 2, 2)),
skinnedMeshRenderer.localBounds);
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0c1eeed79228433d8f9ee98d2ae852d1
timeCreated: 1679738453

View File

@ -17,7 +17,7 @@ namespace modular_avatar_tests.SimpleArmatureToggle
AvatarProcessor.ProcessAvatar(prefab);
var layerName = "merged";
var motion = findFxMotion(prefab, layerName);
var motion = findFxClip(prefab, layerName);
var obj1 = prefab.transform.Find("Armature/Hips").GetChild(1);
var obj2 = prefab.transform.Find("Armature/Hips/Chest").GetChild(0);
@ -26,7 +26,7 @@ namespace modular_avatar_tests.SimpleArmatureToggle
typeof(GameObject), "m_IsActive");
var binding2 = EditorCurveBinding.FloatCurve(RuntimeUtil.AvatarRootPath(obj2.gameObject),
typeof(GameObject), "m_IsActive");
Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding1));
Assert.NotNull(AnimationUtility.GetEditorCurve(motion, binding2));
}

View File

@ -62,15 +62,20 @@ namespace modular_avatar_tests
}
protected static AnimationClip findFxMotion(GameObject prefab, string layerName)
protected static AnimationClip findFxClip(GameObject prefab, string layerName)
{
var motion = findFxMotion(prefab, layerName) as AnimationClip;
Assert.NotNull(motion);
return motion;
}
protected static Motion findFxMotion(GameObject prefab, string layerName)
{
var layer = findFxLayer(prefab, layerName);
var state = layer.stateMachine.states[0].state;
Assert.NotNull(state);
var motion = state.motion as AnimationClip;
Assert.NotNull(motion);
return motion;
return state.motion;
}
protected static AnimatorState FindStateInLayer(AnimatorControllerLayer layer, string stateName)

View File

@ -17,7 +17,7 @@ namespace modular_avatar_tests.TransformMappingThroughSwitchedObject
var prefab = CreatePrefab("TransformMappingThroughSwitchedObject.prefab");
AvatarProcessor.ProcessAvatar(prefab);
var motion = findFxMotion(prefab, "child_controller");
var motion = findFxClip(prefab, "child_controller");
var binding = EditorCurveBinding.FloatCurve("Armature/Hips", typeof(Transform), "localEulerAnglesRaw.x");
var curve = AnimationUtility.GetEditorCurve(motion, binding);

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.UIElements;
@ -18,7 +19,7 @@ namespace VRC.PackageManagement.PackageMaker
{
// VisualElements
private VisualElement _rootView;
private TextField _targetAssetFolderField;
private TextField _targetAssetFolderField;
private TextField _packageIDField;
private Button _actionButton;
private EnumField _targetVRCPackageField;
@ -31,9 +32,10 @@ namespace VRC.PackageManagement.PackageMaker
{
_targetAssetFolderField.SetValueWithoutNotify(_windowData.targetAssetFolder);
}
_packageIDField.SetValueWithoutNotify(_windowData.packageID);
_targetVRCPackageField.SetValueWithoutNotify(_windowData.relatedPackage);
RefreshActionButtonState();
}
@ -49,31 +51,35 @@ namespace VRC.PackageManagement.PackageMaker
PackageMakerWindow wnd = GetWindow<PackageMakerWindow>();
wnd.titleContent = new GUIContent("Package Maker");
}
[MenuItem("Assets/Export VPM as UnityPackage")]
private static void ExportAsUnityPackage ()
private static void ExportAsUnityPackage()
{
if (Selection.assetGUIDs.Length != 1)
var foldersToExport = new List<string>();
StringBuilder exportFilename = new StringBuilder("exported");
foreach (string guid in Selection.assetGUIDs)
{
Debug.LogWarning($"Cannot export selection, must be a single Folder.");
return;
}
string selectedFolder = AssetDatabase.GUIDToAssetPath(Selection.assetGUIDs[0]);
var manifestPath = Path.Combine(selectedFolder, VRCPackageManifest.Filename);
var manifest = VRCPackageManifest.GetManifestAtPath(manifestPath);
if (manifest == null)
{
Debug.LogWarning($"Could not read valid Package Manifest at {manifestPath}. You need to create this first.");
return;
string selectedFolder = AssetDatabase.GUIDToAssetPath(guid);
var manifestPath = Path.Combine(selectedFolder, VRCPackageManifest.Filename);
var manifest = VRCPackageManifest.GetManifestAtPath(manifestPath);
if (manifest == null)
{
Debug.LogWarning(
$"Could not read valid Package Manifest at {manifestPath}. You need to create this first to export a VPM Package.");
continue;
}
exportFilename.Append($"-{manifest.Id}-{manifest.Version}");
foldersToExport.Add(selectedFolder);
}
exportFilename.Append(".unitypackage");
var exportDir = Path.Combine(Directory.GetCurrentDirectory(), "Exports");
Directory.CreateDirectory(exportDir);
AssetDatabase.ExportPackage
(
selectedFolder,
Path.Combine(exportDir, $"{manifest.Id}-{manifest.Version}.unitypackage"),
foldersToExport.ToArray(),
Path.Combine(exportDir, exportFilename.ToString()),
ExportPackageOptions.Recurse | ExportPackageOptions.Interactive
);
}
@ -84,7 +90,7 @@ namespace VRC.PackageManagement.PackageMaker
{
_windowData = PackageMakerWindowData.GetOrCreate();
}
if (_rootView == null) return;
if (_windowData != null)
@ -110,7 +116,7 @@ namespace VRC.PackageManagement.PackageMaker
{
_windowData = PackageMakerWindowData.GetOrCreate();
}
_rootView = rootVisualElement;
_rootView.name = "root-view";
_rootView.styleSheets.Add((StyleSheet) Resources.Load("PackageMakerWindowStyle"));
@ -132,7 +138,7 @@ namespace VRC.PackageManagement.PackageMaker
Base = 3,
UdonSharp = 4,
}
private VisualElement CreateTargetVRCPackageElement()
{
_targetVRCPackageField = new EnumField("Related VRChat Package", VRCPackageEnum.None);
@ -144,7 +150,7 @@ namespace VRC.PackageManagement.PackageMaker
private void OnTargetVRCPackageChanged(ChangeEvent<Enum> evt)
{
_windowData.relatedPackage = (VRCPackageEnum)evt.newValue;
_windowData.relatedPackage = (VRCPackageEnum) evt.newValue;
_windowData.Save();
}
@ -172,12 +178,13 @@ namespace VRC.PackageManagement.PackageMaker
ForceRefresh();
}
}
public static void ForceRefresh ()
public static void ForceRefresh()
{
MethodInfo method = typeof( UnityEditor.PackageManager.Client ).GetMethod( "Resolve", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly );
if( method != null )
method.Invoke( null, null );
MethodInfo method = typeof(UnityEditor.PackageManager.Client).GetMethod("Resolve",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
if (method != null)
method.Invoke(null, null);
AssetDatabase.Refresh();
}
@ -192,17 +199,19 @@ namespace VRC.PackageManagement.PackageMaker
_packageIDField = new TextField("Package ID", 255, false, false, '*');
_packageIDField.RegisterValueChangedCallback(OnPackageIDChanged);
box.Add(_packageIDField);
box.Add(new Label("Lowercase letters, numbers and dots only.")
{
name="description",
tooltip = "Standard practice is reverse domain notation like com.vrchat.packagename. Needs to be unique across VRChat, so if you don't own a domain you can try your username.",
name = "description",
tooltip =
"Standard practice is reverse domain notation like com.vrchat.packagename. Needs to be unique across VRChat, so if you don't own a domain you can try your username.",
});
return box;
}
private Regex packageIdRegex = new Regex("[^a-z0-9.]");
private void OnPackageIDChanged(ChangeEvent<string> evt)
{
if (evt.newValue != null)
@ -212,6 +221,7 @@ namespace VRC.PackageManagement.PackageMaker
_windowData.packageID = newId;
_windowData.Save();
}
RefreshActionButtonState();
}
@ -221,17 +231,22 @@ namespace VRC.PackageManagement.PackageMaker
{
name = "editor-target-box"
};
_targetAssetFolderField = new TextField("Target Folder");
_targetAssetFolderField.RegisterCallback<DragEnterEvent>(OnTargetAssetFolderDragEnter, TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragLeaveEvent>(OnTargetAssetFolderDragLeave, TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragUpdatedEvent>(OnTargetAssetFolderDragUpdated, TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragPerformEvent>(OnTargetAssetFolderDragPerform, TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragExitedEvent>(OnTargetAssetFolderDragExited, TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragEnterEvent>(OnTargetAssetFolderDragEnter,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragLeaveEvent>(OnTargetAssetFolderDragLeave,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragUpdatedEvent>(OnTargetAssetFolderDragUpdated,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragPerformEvent>(OnTargetAssetFolderDragPerform,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterCallback<DragExitedEvent>(OnTargetAssetFolderDragExited,
TrickleDown.TrickleDown);
_targetAssetFolderField.RegisterValueChangedCallback(OnTargetAssetFolderValueChanged);
targetFolderBox.Add(_targetAssetFolderField);
targetFolderBox.Add(new Label("Drag and Drop an Assets Folder to Convert Above"){name="description"});
targetFolderBox.Add(new Label("Drag and Drop an Assets Folder to Convert Above") {name = "description"});
return targetFolderBox;
}
@ -241,7 +256,7 @@ namespace VRC.PackageManagement.PackageMaker
{
return !string.IsNullOrWhiteSpace(targetFolder) && AssetDatabase.IsValidFolder(targetFolder);
}
private void OnTargetAssetFolderValueChanged(ChangeEvent<string> evt)
{
string targetFolder = evt.newValue;
@ -257,7 +272,7 @@ namespace VRC.PackageManagement.PackageMaker
_targetAssetFolderField.SetValueWithoutNotify(evt.previousValue);
}
}
private void OnTargetAssetFolderDragExited(DragExitedEvent evt)
{
DragAndDrop.visualMode = DragAndDropVisualMode.None;
@ -297,7 +312,7 @@ namespace VRC.PackageManagement.PackageMaker
private void OnTargetAssetFolderDragEnter(DragEnterEvent evt)
{
if (DragAndDrop.paths.Length == 1)
{
{
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
DragAndDrop.AcceptDrag();
}
@ -309,9 +324,8 @@ namespace VRC.PackageManagement.PackageMaker
private void DoMigration(string corePath, string targetDir)
{
EditorUtility.DisplayProgressBar("Migrating Package", "Creating Starter Package", 0.1f);
// Convert PackageType enum to VRC Package ID string
string packageType = null;
switch (_windowData.relatedPackage)
@ -334,12 +348,11 @@ namespace VRC.PackageManagement.PackageMaker
Core.Utilities.CreateStarterPackage(_windowData.packageID, parentDir, packageType);
var allFiles = GetAllFiles(corePath).ToList();
MoveFilesToPackageDir(allFiles, corePath, targetDir);
// Clear target asset folder since it should no longer exist
_windowData.targetAssetFolder = "";
}
private static IEnumerable<string> GetAllFiles(string path)
{
var excludedPaths = new List<string>()
@ -351,7 +364,7 @@ namespace VRC.PackageManagement.PackageMaker
s => excludedPaths.All(entry => !s.Contains(entry))
);
}
public static void MoveFilesToPackageDir(List<string> files, string pathBase, string targetDir)
{
EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", 0f);
@ -364,7 +377,7 @@ namespace VRC.PackageManagement.PackageMaker
EditorUtility.DisplayProgressBar("Migrating Package", "Moving Package Files", i / totalFiles);
var file = files[i];
string simplifiedPath = file.Replace($"{pathBase}\\", "");
string dest = null;
if (simplifiedPath.Contains("Editor\\"))
{
@ -389,11 +402,11 @@ namespace VRC.PackageManagement.PackageMaker
continue;
}
}
Directory.Delete(pathBase, true); // cleans up leftover folders since only files are moved
EditorUtility.ClearProgressBar();
}
// Important while we're doing copy-and-rename in order to rename paths with "Assets" without renaming paths with "Sample Assets"
public static string ReplaceFirst(string text, string search, string replace)
{
@ -408,5 +421,4 @@ namespace VRC.PackageManagement.PackageMaker
#endregion
}
}

View File

@ -11,16 +11,17 @@ using UnityEngine;
using VRC.PackageManagement.Core;
using VRC.PackageManagement.Core.Types;
using VRC.PackageManagement.Core.Types.Packages;
using Version = VRC.PackageManagement.Core.Types.VPMVersion.Version;
namespace VRC.PackageManagement.Resolver
{
[InitializeOnLoad]
public class Resolver
{
private const string _projectLoadedKey = "PROJECT_LOADED";
private static string _projectDir;
public static string ProjectDir
{
get
@ -67,7 +68,7 @@ namespace VRC.PackageManagement.Resolver
private static async Task CheckResolveNeeded()
{
SessionState.SetBool(_projectLoadedKey, true);
//Wait for project to finish compiling
while (EditorApplication.isCompiling || EditorApplication.isUpdating)
{
@ -76,12 +77,11 @@ namespace VRC.PackageManagement.Resolver
try
{
if (string.IsNullOrWhiteSpace(ProjectDir))
{
return;
}
if (VPMProjectManifest.ResolveIsNeeded(ProjectDir))
{
Debug.Log($"Resolve needed.");
@ -103,7 +103,7 @@ namespace VRC.PackageManagement.Resolver
// Unity says we can't open windows from this function so it throws an exception but also works fine.
}
}
public static bool VPMManifestExists()
{
return VPMProjectManifest.Exists(ProjectDir, out _);
@ -114,7 +114,7 @@ namespace VRC.PackageManagement.Resolver
VPMProjectManifest.Load(ProjectDir);
ResolverWindow.Refresh();
}
public static void ResolveManifest()
{
ResolveStatic(ProjectDir);
@ -128,7 +128,7 @@ namespace VRC.PackageManagement.Resolver
EditorUtility.ClearProgressBar();
ForceRefresh();
}
public static List<string> GetAllVersionsOf(string id)
{
var project = new UnityProject(ProjectDir);
@ -185,15 +185,15 @@ namespace VRC.PackageManagement.Resolver
return null;
}
public static void ForceRefresh ()
public static void ForceRefresh()
{
MethodInfo method = typeof( UnityEditor.PackageManager.Client ).GetMethod( "Resolve", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly );
if( method != null )
method.Invoke( null, null );
MethodInfo method = typeof(UnityEditor.PackageManager.Client).GetMethod("Resolve",
BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);
if (method != null)
method.Invoke(null, null);
AssetDatabase.Refresh();
}
}
}

View File

@ -1,7 +1,7 @@
{
"name": "com.vrchat.core.vpm-resolver",
"displayName": "VRChat Package Resolver Tool",
"version": "0.1.17",
"version": "0.1.18",
"unity": "2019.4",
"description": "Tool to Download VPM Packages",
"vrchatVersion": "2022.1.1",

View File

@ -1,132 +0,0 @@
/*
* MIT License
*
* Copyright (c) 2022 bd_
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace nadena.dev.modular_avatar.core.editor
{
[InitializeOnLoad]
internal static class ComponentAllowlistPatch
{
internal static readonly bool PATCH_OK;
static ComponentAllowlistPatch()
{
try
{
PatchAllowlist();
PATCH_OK = true;
}
catch (Exception e)
{
Debug.LogException(e);
PATCH_OK = false;
}
}
static void PatchAllowlist()
{
// The below APIs are all public, but undocumented and likely to change in the future.
// As such, we use reflection to access them (allowing us to catch exceptions instead of just breaking the
// build - and allowing the user to manually bake as a workaround).
// The basic idea is to retrieve the HashSet of whitelisted components, and add all components extending
// from AvatarTagComponent to it. This HashSet is cached on first access, but the lists of allowed
// components used to initially populate it are private. So, we'll start off by making a call that (as a
// side-effect) causes the list to be initially cached. This call will throw a NPE because we're passing
// a null GameObject, but that's okay.
var avatarValidation = Util.FindType("VRC.SDK3.Validation.AvatarValidation");
var findIllegalComponents =
avatarValidation?.GetMethod("FindIllegalComponents", BindingFlags.Public | BindingFlags.Static);
if (findIllegalComponents == null)
{
Debug.LogError(
"[ModularAvatar] Unsupported VRCSDK version: Failed to find AvatarValidation.FindIllegalComponents");
return;
}
try
{
findIllegalComponents.Invoke(null, new[] {(object) null});
}
catch (TargetInvocationException e)
{
if (e.InnerException is NullReferenceException)
{
// ok!
}
else
{
System.Diagnostics.Debug.Assert(e.InnerException != null, "e.InnerException != null");
throw e.InnerException;
}
}
// Now fetch the cached allowlist and add our components to it.
var validationUtils = Util.FindType("VRC.SDKBase.Validation.ValidationUtils");
var whitelistedTypes = validationUtils?.GetMethod(
"WhitelistedTypes",
BindingFlags.Public | BindingFlags.Static,
null,
new[] {typeof(string), typeof(IEnumerable<Type>)},
null
);
if (whitelistedTypes == null)
{
Debug.LogError(
"[ModularAvatar] Unsupported VRCSDK version: Failed to find ValidationUtils.WhitelistedTypes");
return;
}
var allowlist = whitelistedTypes.Invoke(null, new object[] {"avatar-sdk3", null}) as HashSet<Type>;
if (allowlist == null)
{
Debug.LogError("[ModularAvatar] Unsupported VRCSDK version: Failed to retrieve component whitelist");
return;
}
allowlist.Add(typeof(AvatarTagComponent));
// We'll need to find all types which derive from AvatarTagComponent and inject them into the allowlist
// as well.
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var ty in assembly.GetTypes())
{
if (typeof(AvatarTagComponent).IsAssignableFrom(ty))
{
allowlist.Add(ty);
}
}
}
}
}
}

View File

@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 657f099f7fc04609a5cfc9ac5461d7e3
timeCreated: 1661563992

View File

@ -10,62 +10,65 @@ namespace nadena.dev.modular_avatar.core.editor
// This list is originally from https://github.com/HhotateA/AvatarModifyTools/blob/d8ae75fed8577707253d6b63a64d6053eebbe78b/Assets/HhotateA/AvatarModifyTool/Editor/EnvironmentVariable.cs#L81-L139
// Copyright (c) 2021 @HhotateA_xR
// Licensed under the MIT License
// In addition, some part is copied from from https://github.com/Azukimochi/BoneRenamer/blob/e9f68acd631d2a0fc3d8b382d361649ac971e988/BoneRenamer/Editor/BoneNames.xml
// Copyright (c) 2023 Azukimochi
// Licensed under the MIT License
private static string[][] boneNamePatterns = new[]
{
new[] {"Hips", "Hip"},
new[] {"LeftUpperLeg", "UpperLeg_Left", "UpperLeg_L", "Leg_Left", "Leg_L", "ULeg_L"},
new[] {"RightUpperLeg", "UpperLeg_Right", "UpperLeg_R", "Leg_Right", "Leg_R", "ULeg_R"},
new[] {"LeftLowerLeg", "LowerLeg_Left", "LowerLeg_L", "Knee_Left", "Knee_L", "LLeg_L"},
new[] {"RightLowerLeg", "LowerLeg_Right", "LowerLeg_R", "Knee_Right", "Knee_R", "LLeg_R"},
new[] {"LeftFoot", "Foot_Left", "Foot_L"},
new[] {"RightFoot", "Foot_Right", "Foot_R"},
new[] {"LeftUpperLeg", "UpperLeg_Left", "UpperLeg_L", "Leg_Left", "Leg_L", "ULeg_L", "Left leg", "LeftUpLeg"},
new[] {"RightUpperLeg", "UpperLeg_Right", "UpperLeg_R", "Leg_Right", "Leg_R", "ULeg_R", "Right leg", "RightUpLeg"},
new[] {"LeftLowerLeg", "LowerLeg_Left", "LowerLeg_L", "Knee_Left", "Knee_L", "LLeg_L", "Left knee", "LeftLeg"},
new[] {"RightLowerLeg", "LowerLeg_Right", "LowerLeg_R", "Knee_Right", "Knee_R", "LLeg_R", "Right knee", "RightLeg"},
new[] {"LeftFoot", "Foot_Left", "Foot_L", "Ankle_L", "Foot.L.001", "Left ankle"},
new[] {"RightFoot", "Foot_Right", "Foot_R", "Ankle_R", "Foot.R.001", "Right ankle"},
new[] {"Spine"},
new[] {"Chest", "Bust"},
new[] {"Neck"},
new[] {"Head"},
new[] {"LeftShoulder", "Shoulder_Left", "Shoulder_L"},
new[] {"RightShoulder", "Shoulder_Right", "Shoulder_R"},
new[] {"LeftUpperArm", "UpperArm_Left", "UpperArm_L", "Arm_Left", "Arm_L", "UArm_L"},
new[] {"RightUpperArm", "UpperArm_Right", "UpperArm_R", "Arm_Right", "Arm_R", "UArm_R"},
new[] {"LeftLowerArm", "LowerArm_Left", "LowerArm_L", "LArm_L"},
new[] {"RightLowerArm", "LowerArm_Right", "LowerArm_R", "LArm_R"},
new[] {"LeftHand", "Hand_Left", "Hand_L"},
new[] {"RightHand", "Hand_Right", "Hand_R"},
new[] {"LeftToes", "Toes_Left", "Toe_Left", "ToeIK_L", "Toes_L", "Toe_L"},
new[] {"RightToes", "Toes_Right", "Toe_Right", "ToeIK_R", "Toes_R", "Toe_R"},
new[] {"LeftUpperArm", "UpperArm_Left", "UpperArm_L", "Arm_Left", "Arm_L", "UArm_L", "Left arm", "UpperLeftArm"},
new[] {"RightUpperArm", "UpperArm_Right", "UpperArm_R", "Arm_Right", "Arm_R", "UArm_R", "Right arm", "UpperRightArm"},
new[] {"LeftLowerArm", "LowerArm_Left", "LowerArm_L", "LArm_L", "Left elbow", "LeftForeArm"},
new[] {"RightLowerArm", "LowerArm_Right", "LowerArm_R", "LArm_R", "Right elbow", "RightForeArm"},
new[] {"LeftHand", "Hand_Left", "Hand_L", "Left wrist", "Wrist_L"},
new[] {"RightHand", "Hand_Right", "Hand_R", "Right wrist", "Wrist_R"},
new[] {"LeftToes", "Toes_Left", "Toe_Left", "ToeIK_L", "Toes_L", "Toe_L", "Foot.L.002", "Left Toe", "LeftToeBase"},
new[] {"RightToes", "Toes_Right", "Toe_Right", "ToeIK_R", "Toes_R", "Toe_R", "Foot.R.002", "Right Toe", "RightToeBase"},
new[] {"LeftEye", "Eye_Left", "Eye_L"},
new[] {"RightEye", "Eye_Right", "Eye_R"},
new[] {"Jaw"},
new[] {"LeftThumbProximal", "ProximalThumb_Left", "ProximalThumb_L", "Thumb1_L"},
new[] {"LeftThumbIntermediate", "IntermediateThumb_Left", "IntermediateThumb_L", "Thumb2_L"},
new[] {"LeftThumbDistal", "DistalThumb_Left", "DistalThumb_L", "Thumb3_L"},
new[] {"LeftIndexProximal", "ProximalIndex_Left", "ProximalIndex_L", "Index1_L"},
new[] {"LeftIndexIntermediate", "IntermediateIndex_Left", "IntermediateIndex_L", "Index2_L"},
new[] {"LeftIndexDistal", "DistalIndex_Left", "DistalIndex_L", "Index3_L"},
new[] {"LeftMiddleProximal", "ProximalMiddle_Left", "ProximalMiddle_L", "Middle1_L"},
new[] {"LeftMiddleIntermediate", "IntermediateMiddle_Left", "IntermediateMiddle_L", "Middle2_L"},
new[] {"LeftMiddleDistal", "DistalMiddle_Left", "DistalMiddle_L", "Middle3_L"},
new[] {"LeftRingProximal", "ProximalRing_Left", "ProximalRing_L", "Ring1_L"},
new[] {"LeftRingIntermediate", "IntermediateRing_Left", "IntermediateRing_L", "Ring2_L"},
new[] {"LeftRingDistal", "DistalRing_Left", "DistalRing_L", "Ring3_L"},
new[] {"LeftLittleProximal", "ProximalLittle_Left", "ProximalLittle_L", "Little1_L"},
new[] {"LeftLittleIntermediate", "IntermediateLittle_Left", "IntermediateLittle_L", "Little2_L"},
new[] {"LeftLittleDistal", "DistalLittle_Left", "DistalLittle_L", "Little3_L"},
new[] {"RightThumbProximal", "ProximalThumb_Right", "ProximalThumb_R", "Thumb1_R"},
new[] {"RightThumbIntermediate", "IntermediateThumb_Right", "IntermediateThumb_R", "Thumb2_R"},
new[] {"RightThumbDistal", "DistalThumb_Right", "DistalThumb_R", "Thumb3_R"},
new[] {"RightIndexProximal", "ProximalIndex_Right", "ProximalIndex_R", "Index1_R"},
new[] {"RightIndexIntermediate", "IntermediateIndex_Right", "IntermediateIndex_R", "Index2_R"},
new[] {"RightIndexDistal", "DistalIndex_Right", "DistalIndex_R", "Index3_R"},
new[] {"RightMiddleProximal", "ProximalMiddle_Right", "ProximalMiddle_R", "Middle1_R"},
new[] {"RightMiddleIntermediate", "IntermediateMiddle_Right", "IntermediateMiddle_R", "Middle2_R"},
new[] {"RightMiddleDistal", "DistalMiddle_Right", "DistalMiddle_R", "Middle3_R"},
new[] {"RightRingProximal", "ProximalRing_Right", "ProximalRing_R", "Ring1_R"},
new[] {"RightRingIntermediate", "IntermediateRing_Right", "IntermediateRing_R", "Ring2_R"},
new[] {"RightRingDistal", "DistalRing_Right", "DistalRing_R", "Ring3_R"},
new[] {"RightLittleProximal", "ProximalLittle_Right", "ProximalLittle_R", "Little1_R"},
new[] {"RightLittleIntermediate", "IntermediateLittle_Right", "IntermediateLittle_R", "Little2_R"},
new[] {"RightLittleDistal", "DistalLittle_Right", "DistalLittle_R", "Little3_R"},
new[] {"LeftThumbProximal", "ProximalThumb_Left", "ProximalThumb_L", "Thumb1_L", "ThumbFinger1_L", "LeftHandThumb1", "Thumb Proximal.L", "Thunb1_L"},
new[] {"LeftThumbIntermediate", "IntermediateThumb_Left", "IntermediateThumb_L", "Thumb2_L", "ThumbFinger2_L", "LeftHandThumb2", "Thumb Intermediate.L", "Thunb2_L"},
new[] {"LeftThumbDistal", "DistalThumb_Left", "DistalThumb_L", "Thumb3_L", "ThumbFinger3_L", "LeftHandThumb3", "Thumb Distal.L", "Thunb3_L"},
new[] {"LeftIndexProximal", "ProximalIndex_Left", "ProximalIndex_L", "Index1_L", "IndexFinger1_L", "LeftHandIndex1", "Index Proximal.L"},
new[] {"LeftIndexIntermediate", "IntermediateIndex_Left", "IntermediateIndex_L", "Index2_L", "IndexFinger2_L", "LeftHandIndex2", "Index Intermediate.L"},
new[] {"LeftIndexDistal", "DistalIndex_Left", "DistalIndex_L", "Index3_L", "IndexFinger3_L", "LeftHandIndex3", "Index Distal.L"},
new[] {"LeftMiddleProximal", "ProximalMiddle_Left", "ProximalMiddle_L", "Middle1_L", "MiddleFinger1_L", "LeftHandMiddle1", "Middle Proximal.L"},
new[] {"LeftMiddleIntermediate", "IntermediateMiddle_Left", "IntermediateMiddle_L", "Middle2_L", "MiddleFinger2_L", "LeftHandMiddle2", "Middle Intermediate.L"},
new[] {"LeftMiddleDistal", "DistalMiddle_Left", "DistalMiddle_L", "Middle3_L", "MiddleFinger3_L", "LeftHandMiddle3", "Middle Distal.L"},
new[] {"LeftRingProximal", "ProximalRing_Left", "ProximalRing_L", "Ring1_L", "RingFinger1_L", "LeftHandRing1", "Ring Proximal.L"},
new[] {"LeftRingIntermediate", "IntermediateRing_Left", "IntermediateRing_L", "Ring2_L", "RingFinger2_L", "LeftHandRing2", "Ring Intermediate.L"},
new[] {"LeftRingDistal", "DistalRing_Left", "DistalRing_L", "Ring3_L", "RingFinger3_L", "LeftHandRing3", "Ring Distal.L"},
new[] {"LeftLittleProximal", "ProximalLittle_Left", "ProximalLittle_L", "Little1_L", "LittleFinger1_L", "LeftHandPinky1", "Little Proximal.L"},
new[] {"LeftLittleIntermediate", "IntermediateLittle_Left", "IntermediateLittle_L", "Little2_L", "LittleFinger2_L", "LeftHandPinky2", "Little Intermediate.L"},
new[] {"LeftLittleDistal", "DistalLittle_Left", "DistalLittle_L", "Little3_L", "LittleFinger3_L", "LeftHandPinky3", "Little Distal.L"},
new[] {"RightThumbProximal", "ProximalThumb_Right", "ProximalThumb_R", "Thumb1_R", "ThumbFinger1_R", "RightHandThumb1", "Thumb Proximal.R", "Thunb1_R"},
new[] {"RightThumbIntermediate", "IntermediateThumb_Right", "IntermediateThumb_R", "Thumb2_R", "ThumbFinger2_R", "RightHandThumb2", "Thumb Intermediate.R", "Thunb2_R"},
new[] {"RightThumbDistal", "DistalThumb_Right", "DistalThumb_R", "Thumb3_R", "ThumbFinger3_R", "RightHandThumb3", "Thumb Distal.R", "Thunb3_R"},
new[] {"RightIndexProximal", "ProximalIndex_Right", "ProximalIndex_R", "Index1_R", "IndexFinger1_R", "RightHandIndex1", "Index Proximal.R"},
new[] {"RightIndexIntermediate", "IntermediateIndex_Right", "IntermediateIndex_R", "Index2_R", "IndexFinger2_R", "RightHandIndex2", "Index Intermediate.R"},
new[] {"RightIndexDistal", "DistalIndex_Right", "DistalIndex_R", "Index3_R", "IndexFinger3_R", "RightHandIndex3", "Index Distal.R"},
new[] {"RightMiddleProximal", "ProximalMiddle_Right", "ProximalMiddle_R", "Middle1_R", "MiddleFinger1_R", "RightHandMiddle1", "Middle Proximal.R"},
new[] {"RightMiddleIntermediate", "IntermediateMiddle_Right", "IntermediateMiddle_R", "Middle2_R", "MiddleFinger2_R", "RightHandMiddle2", "Middle Intermediate.R"},
new[] {"RightMiddleDistal", "DistalMiddle_Right", "DistalMiddle_R", "Middle3_R", "MiddleFinger3_R", "RightHandMiddle3", "Middle Distal.R"},
new[] {"RightRingProximal", "ProximalRing_Right", "ProximalRing_R", "Ring1_R", "RingFinger1_R", "RightHandRing1", "Ring Proximal.R"},
new[] {"RightRingIntermediate", "IntermediateRing_Right", "IntermediateRing_R", "Ring2_R", "RingFinger2_R", "RightHandRing2", "Ring Intermediate.R"},
new[] {"RightRingDistal", "DistalRing_Right", "DistalRing_R", "Ring3_R", "RingFinger3_R", "RightHandRing3", "Ring Distal.R"},
new[] {"RightLittleProximal", "ProximalLittle_Right", "ProximalLittle_R", "Little1_R", "LittleFinger1_R", "RightHandPinky1", "Little Proximal.R"},
new[] {"RightLittleIntermediate", "IntermediateLittle_Right", "IntermediateLittle_R", "Little2_R", "LittleFinger2_R", "RightHandPinky2", "Little Intermediate.R"},
new[] {"RightLittleDistal", "DistalLittle_Right", "DistalLittle_R", "Little3_R", "LittleFinger3_R", "RightHandPinky3", "Little Distal.R"},
new[] {"UpperChest", "UChest"},
};
@ -216,4 +219,4 @@ namespace nadena.dev.modular_avatar.core.editor
}
}
}
}
}

View File

@ -122,7 +122,6 @@ namespace nadena.dev.modular_avatar.core.editor
}
InspectorCommon.DisplayOutOfAvatarWarning(targets);
if (!ComponentAllowlistPatch.PATCH_OK) InspectorCommon.DisplayVRCSDKVersionWarning();
OnInnerInspectorGUI();
}

View File

@ -24,6 +24,7 @@
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using nadena.dev.modular_avatar.editor.ErrorReporting;
using UnityEditor;
using UnityEngine;
@ -88,8 +89,6 @@ namespace nadena.dev.modular_avatar.core.editor
{
BuildReport.ReportingObject(renderer, () =>
{
if (renderer.sharedMesh == null) return;
bool isRetargetable = false;
foreach (var bone in renderer.bones)
{
@ -100,10 +99,12 @@ namespace nadena.dev.modular_avatar.core.editor
}
}
isRetargetable |= BoneDatabase.GetRetargetedBone(renderer.rootBone);
if (isRetargetable)
{
var newMesh = new MeshRetargeter(renderer).Retarget();
_context.SaveAsset(newMesh);
if (newMesh) _context.SaveAsset(newMesh);
}
});
}
@ -143,13 +144,14 @@ namespace nadena.dev.modular_avatar.core.editor
internal class MeshRetargeter
{
private readonly SkinnedMeshRenderer renderer;
private Mesh src, dst;
[CanBeNull] private Mesh src, dst;
public MeshRetargeter(SkinnedMeshRenderer renderer)
{
this.renderer = renderer;
}
[CanBeNull]
public Mesh Retarget()
{
var avatar = RuntimeUtil.FindAvatarInParents(renderer.transform);
@ -165,8 +167,11 @@ namespace nadena.dev.modular_avatar.core.editor
avatarTransform.localScale = Vector3.one;
src = renderer.sharedMesh;
dst = Mesh.Instantiate(src);
dst.name = "RETARGETED: " + src.name;
if (src != null)
{
dst = Mesh.Instantiate(src);
dst.name = "RETARGETED: " + src.name;
}
RetargetBones();
AdjustShapeKeys();
@ -185,22 +190,25 @@ namespace nadena.dev.modular_avatar.core.editor
private void RetargetBones()
{
var originalBindPoses = src.bindposes;
var originalBindPoses = src ? src.bindposes : null;
var originalBones = renderer.bones;
var newBones = (Transform[]) originalBones.Clone();
var newBindPoses = (Matrix4x4[]) originalBindPoses.Clone();
var newBindPoses = (Matrix4x4[]) originalBindPoses?.Clone();
for (int i = 0; i < originalBones.Length; i++)
{
Transform newBindTarget = BoneDatabase.GetRetargetedBone(originalBones[i]);
if (newBindTarget == null) continue;
Matrix4x4 Bp = newBindTarget.worldToLocalMatrix * originalBones[i].localToWorldMatrix *
originalBindPoses[i];
newBones[i] = newBindTarget;
newBindPoses[i] = Bp;
if (originalBindPoses != null)
{
Matrix4x4 Bp = newBindTarget.worldToLocalMatrix * originalBones[i].localToWorldMatrix *
originalBindPoses[i];
newBindPoses[i] = Bp;
}
}
var rootBone = renderer.rootBone;
@ -212,9 +220,12 @@ namespace nadena.dev.modular_avatar.core.editor
scaleBone = renderer.bones[0];
}
dst.bindposes = newBindPoses;
renderer.bones = newBones;
renderer.sharedMesh = dst;
if (dst)
{
dst.bindposes = newBindPoses;
renderer.sharedMesh = dst;
}
var newRootBone = BoneDatabase.GetRetargetedBone(rootBone, true);
var newScaleBone = BoneDatabase.GetRetargetedBone(scaleBone, true);
@ -239,4 +250,4 @@ namespace nadena.dev.modular_avatar.core.editor
renderer.probeAnchor = BoneDatabase.GetRetargetedBone(renderer.probeAnchor, true);
}
}
}
}

View File

@ -171,11 +171,14 @@ namespace nadena.dev.modular_avatar.core.editor
AddParam(control.parameter.name);
}
foreach (var subParam in control.subParameters)
if (control.subParameters != null)
{
if (!string.IsNullOrWhiteSpace(subParam.name))
foreach (var subParam in control.subParameters)
{
AddParam(subParam.name);
if (!string.IsNullOrWhiteSpace(subParam.name))
{
AddParam(subParam.name);
}
}
}
@ -314,4 +317,4 @@ namespace nadena.dev.modular_avatar.core.editor
parameters = newParams;
}
}
}
}

View File

@ -347,13 +347,20 @@ namespace nadena.dev.modular_avatar.core.editor
blendTree.blendParameter = remap(remaps, blendTree.blendParameter);
blendTree.blendParameterY = remap(remaps, blendTree.blendParameterY);
foreach (var childMotion in blendTree.children)
var children = blendTree.children;
for (int i = 0; i < children.Length; i++)
{
var childMotion = children[i];
if (childMotion.motion is BlendTree subTree)
{
ProcessBlendtree(subTree, remaps);
}
childMotion.directBlendParameter = remap(remaps, childMotion.directBlendParameter);
children[i] = childMotion;
}
blendTree.children = children;
}
private void ProcessDriver(VRCAvatarParameterDriver driver, ImmutableDictionary<string, string> remaps)

View File

@ -24,6 +24,7 @@
using System;
using UnityEngine;
using VRC.SDKBase;
namespace nadena.dev.modular_avatar.core
{
@ -31,7 +32,7 @@ namespace nadena.dev.modular_avatar.core
* This abstract base class is injected into the VRCSDK avatar component allowlist to avoid
*/
[DefaultExecutionOrder(-9999)] // run before av3emu
public abstract class AvatarTagComponent : MonoBehaviour
public abstract class AvatarTagComponent : MonoBehaviour, IEditorOnly
{
internal static event Action OnChangeAction;

View File

@ -14,7 +14,7 @@ AudioImporter:
forceToMono: 1
normalize: 1
preloadAudioData: 1
loadInBackground: 0
loadInBackground: 1
ambisonic: 0
3D: 1
userData:

View File

@ -15,6 +15,6 @@
"com.unity.nuget.newtonsoft-json": "2.0.0"
},
"vpmDependencies": {
"com.vrchat.avatars": ">=3.1.9"
"com.vrchat.avatars": ">=3.1.13"
}
}

View File

@ -1,7 +1,7 @@
{
"dependencies": {
"com.vrchat.avatars": {
"version": "3.1.9"
"version": "3.1.13"
},
"com.vrchat.core.vpm-resolver": {
"version": "0.1.13"
@ -22,7 +22,8 @@
"dependencies": {}
},
"com.vrchat.core.vpm-resolver": {
"version": "0.1.17"
"version": "0.1.18",
"dependencies": {}
},
"vrchat.blackstartx.gesture-manager": {
"version": "3.8.3",

View File

@ -8,7 +8,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula');
const config = {
title: 'Modular Avatar',
tagline: 'Drag-and-drop avatar assembly',
url: 'https://modular-avatar.fushizen.net',
url: 'https://modular-avatar.nadena.dev',
baseUrl: '/',
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',

View File

@ -15,21 +15,21 @@
"typecheck": "tsc"
},
"dependencies": {
"@algolia/client-search": "^4.14.3",
"@docusaurus/core": "^2.3.1",
"@docusaurus/preset-classic": "^2.3.1",
"@algolia/client-search": "^4.17.0",
"@docusaurus/core": "^2.4.0",
"@docusaurus/preset-classic": "^2.4.0",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"prism-react-renderer": "^1.3.5",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-loadable": "^5.5.0",
"react-player": "^2.11.2"
"react-player": "^2.12.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "2.3.1",
"@tsconfig/docusaurus": "^1.0.6",
"typescript": "^4.9.5"
"@docusaurus/module-type-aliases": "2.4.0",
"@tsconfig/docusaurus": "^1.0.7",
"typescript": "^5.0.4"
},
"resolutions": {
"trim": "1.0.1",

4
docs/robots.txt Normal file
View File

@ -0,0 +1,4 @@
User-agent: *
Disallow: /dev/
Sitemap: https://modular-avatar.nadena.dev/sitemap.xml

View File

@ -49,10 +49,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/cache-common@npm:4.14.3":
version: 4.14.3
resolution: "@algolia/cache-common@npm:4.14.3"
checksum: 56af1684870b072bb5e8acd6539c1cca69e826f790064df373bc8b86b9bc6a80c9b53fce8aa1c74f2d2bcd917196e712d5aef39fc566cebbea499e2acacea0fe
"@algolia/cache-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/cache-common@npm:4.17.0"
checksum: cbf8d6ca4ee653f2bef6665eb36b7afee2d4031abe5444cd121d60614189f2c96d0e00cfef990cbe68d318dbcef9b38f5df70476f9088ef43f8c83d69d0802b8
languageName: node
linkType: hard
@ -98,13 +98,13 @@ __metadata:
languageName: node
linkType: hard
"@algolia/client-common@npm:4.14.3":
version: 4.14.3
resolution: "@algolia/client-common@npm:4.14.3"
"@algolia/client-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/client-common@npm:4.17.0"
dependencies:
"@algolia/requester-common": 4.14.3
"@algolia/transporter": 4.14.3
checksum: 44799afbbb7955e0577cf199799e44aea6890136d277d56af5ea8628cdabb1cd67d3289eca035a6792a771c0a886164108351be438158d6d23a6c762cfe6abf0
"@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.17.0
checksum: 05791d5483e16a0776a1fb16f42a8e62c67be844e82ff506b5ed82669367f6ea5fba79bcffa90ff4af2039bd8fb16db395edc4c0b1e0c11c050de8a118642180
languageName: node
linkType: hard
@ -130,14 +130,14 @@ __metadata:
languageName: node
linkType: hard
"@algolia/client-search@npm:^4.14.3":
version: 4.14.3
resolution: "@algolia/client-search@npm:4.14.3"
"@algolia/client-search@npm:^4.17.0":
version: 4.17.0
resolution: "@algolia/client-search@npm:4.17.0"
dependencies:
"@algolia/client-common": 4.14.3
"@algolia/requester-common": 4.14.3
"@algolia/transporter": 4.14.3
checksum: fb32e68d9bc815afab7199ae59d71d51f785f98fc3eb1d2bdb3065bc11424d797d1b1a2755397785bc715c2085dc1ddcf2b46d677b95dd95a825f597ba04505b
"@algolia/client-common": 4.17.0
"@algolia/requester-common": 4.17.0
"@algolia/transporter": 4.17.0
checksum: ca6aedd67e69112e3a86086e48de4f38b9d127c2e606b345de58a528dd2d2016e70783cf446dfa669036c69ffbd0616f27b180cacb6ab0fafe85065b2b8d323f
languageName: node
linkType: hard
@ -155,10 +155,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/logger-common@npm:4.14.3":
version: 4.14.3
resolution: "@algolia/logger-common@npm:4.14.3"
checksum: c42bb686637ca32ab6636055b0d0ef368bc9e3e2ea71e3e3becece68a88896b34cfa6d657ccdf1b6a01fcabc075f78d10fb813f399e88323a9b17ea80dba33f5
"@algolia/logger-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/logger-common@npm:4.17.0"
checksum: e6359266544ed9d9eab8d4217c126a8209f74fbd1e407f2249b886915a521e89e419dc6401a65389523f3bdffb3880c0a95578c3c437653f941ddb1095c37e08
languageName: node
linkType: hard
@ -187,10 +187,10 @@ __metadata:
languageName: node
linkType: hard
"@algolia/requester-common@npm:4.14.3":
version: 4.14.3
resolution: "@algolia/requester-common@npm:4.14.3"
checksum: 1bc8400b18613c9d65b5ee07dd23e9e324669338d849fae987ed0b518567fb00a61a2ef00279fe65148c8f51603f2df6e4137c6693d2aca30bf453b8b759aa44
"@algolia/requester-common@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/requester-common@npm:4.17.0"
checksum: 13ace23f53fc88677d896ae4506f04a5defd17f69b9611571e19dd45c91fda74a71acd27f799f55f88d550264b8f4477831d9ff546ffeb7257e35ec4ee983ca8
languageName: node
linkType: hard
@ -214,14 +214,14 @@ __metadata:
languageName: node
linkType: hard
"@algolia/transporter@npm:4.14.3":
version: 4.14.3
resolution: "@algolia/transporter@npm:4.14.3"
"@algolia/transporter@npm:4.17.0":
version: 4.17.0
resolution: "@algolia/transporter@npm:4.17.0"
dependencies:
"@algolia/cache-common": 4.14.3
"@algolia/logger-common": 4.14.3
"@algolia/requester-common": 4.14.3
checksum: ad959c648d987726cc1e138cf68fd11673dbf12498ee3e3ccd573c5a2d63f9e20b0f58ab130c2b9807f7c2ff029c8e040923366d75c1e7ad62b02f40fb822ee2
"@algolia/cache-common": 4.17.0
"@algolia/logger-common": 4.17.0
"@algolia/requester-common": 4.17.0
checksum: 1864bf9ccdf63f5090a89f44358c30317f549b4dc37dd8ce446383ca217c1a9737ab2749ca92394a320574690ea04134ae600c2a3f1f9d393549a5124079c2a6
languageName: node
linkType: hard
@ -1724,9 +1724,9 @@ __metadata:
languageName: node
linkType: hard
"@docusaurus/core@npm:2.3.1, @docusaurus/core@npm:^2.3.1":
version: 2.3.1
resolution: "@docusaurus/core@npm:2.3.1"
"@docusaurus/core@npm:2.4.0, @docusaurus/core@npm:^2.4.0":
version: 2.4.0
resolution: "@docusaurus/core@npm:2.4.0"
dependencies:
"@babel/core": ^7.18.6
"@babel/generator": ^7.18.7
@ -1738,13 +1738,13 @@ __metadata:
"@babel/runtime": ^7.18.6
"@babel/runtime-corejs3": ^7.18.6
"@babel/traverse": ^7.18.8
"@docusaurus/cssnano-preset": 2.3.1
"@docusaurus/logger": 2.3.1
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/cssnano-preset": 2.4.0
"@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/react-loadable": 5.5.2
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-common": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.4.0
"@slorber/static-site-generator-webpack-plugin": ^4.0.7
"@svgr/webpack": ^6.2.1
autoprefixer: ^10.4.7
@ -1804,40 +1804,40 @@ __metadata:
react-dom: ^16.8.4 || ^17.0.0
bin:
docusaurus: bin/docusaurus.mjs
checksum: 812aecae45af3f4d02fd16e89517ca9f1ba22821a078aaa890f5797ac7e0cc0c79e7623eb999e885cf7e7652a6ffda8ff7c06dfd85ca29aaab600993c3d9980d
checksum: 04d30e31e9c4198ce3f4a47c4f59943f357ef96a5cfa10674fd3049d4cf067c15fa0ae184383ba3e420f59a9b3077ed1cf1f373626399f0e46cea6fcf0897d7b
languageName: node
linkType: hard
"@docusaurus/cssnano-preset@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/cssnano-preset@npm:2.3.1"
"@docusaurus/cssnano-preset@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/cssnano-preset@npm:2.4.0"
dependencies:
cssnano-preset-advanced: ^5.3.8
postcss: ^8.4.14
postcss-sort-media-queries: ^4.2.1
tslib: ^2.4.0
checksum: a3d00ce86b16caffde36734bb2f4541d2c0df5e8ab6891a78ad05bccc631a895fecb04c385626ebcb8f905510c28fa6158288585673ae96565532d4ee4b60d4f
checksum: b8982230ec014378a5453453df400a328a6ecdeecffb666ead5cfbeb5dc689610f0e62ee818ffcc8adc270c7c47cb818ad730c769eb8fa689dd79d4f9d448b6d
languageName: node
linkType: hard
"@docusaurus/logger@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/logger@npm:2.3.1"
"@docusaurus/logger@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/logger@npm:2.4.0"
dependencies:
chalk: ^4.1.2
tslib: ^2.4.0
checksum: eff5f258aeac9c643431426256e3bc4515074cc3cc754fa643579ba427ba232ecace9a9579ae5af542330b22d7361892a1eaf84526983a0c821c5ca3ee895176
checksum: 0424b77e2abaa50f20d6042ededf831157852656d1242ae9b0829b897e6f5b1e1e5ea30df599839e0ec51c72e42a5a867b136387dd5359032c735f431eddd078
languageName: node
linkType: hard
"@docusaurus/mdx-loader@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/mdx-loader@npm:2.3.1"
"@docusaurus/mdx-loader@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/mdx-loader@npm:2.4.0"
dependencies:
"@babel/parser": ^7.18.8
"@babel/traverse": ^7.18.8
"@docusaurus/logger": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/logger": 2.4.0
"@docusaurus/utils": 2.4.0
"@mdx-js/mdx": ^1.6.22
escape-html: ^1.0.3
file-loader: ^6.2.0
@ -1854,16 +1854,16 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 4a1c9ef0e8506ab4d9cb4714ff7437664e238e0f2878a5eb4a2e082897bbee7ae8d0b61ba9d45ffa820beb5ce75aa0050201db815b00c18fc136aaa4c6411c21
checksum: 3d4e7bf6840fa7dcf4250aa5ea019f80dac6cc38e9f8b9a0515b81b6c0f6d6f4ed4103f521784e70db856aec06cff4be176ef281e1cac53afc82bc1182bbf9ad
languageName: node
linkType: hard
"@docusaurus/module-type-aliases@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/module-type-aliases@npm:2.3.1"
"@docusaurus/module-type-aliases@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/module-type-aliases@npm:2.4.0"
dependencies:
"@docusaurus/react-loadable": 5.5.2
"@docusaurus/types": 2.3.1
"@docusaurus/types": 2.4.0
"@types/history": ^4.7.11
"@types/react": "*"
"@types/react-router-config": "*"
@ -1873,21 +1873,21 @@ __metadata:
peerDependencies:
react: "*"
react-dom: "*"
checksum: 74f799f81455dc8ff3e6edf07428996764014c2c7b416e6b5d160af15f00ad3aa1ab75dee5356645ec7f2ea832fb2aca6e9a32b19d64abeb9e3d57c4195f1e50
checksum: fc655d9dc77d88ba9d10abe602c9fd5533992b14de495e4f3e4caea368693a7b7e5a805fb2938287bed949900e7e3d7f94bea3c1a8727b45e19c85996965d0c7
languageName: node
linkType: hard
"@docusaurus/plugin-content-blog@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-content-blog@npm:2.3.1"
"@docusaurus/plugin-content-blog@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-content-blog@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/logger": 2.3.1
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-common": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.4.0
cheerio: ^1.0.0-rc.12
feed: ^4.2.2
fs-extra: ^10.1.0
@ -1900,21 +1900,21 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: abc668ceab15269f57be7f74acbec2e139b4f6b90af8771d246a9036d124b49b0d9fd4890e9566df7a4ba960f2da0316c18741eed1be0646f2b4602465219ddd
checksum: e912ea1a01c1769b374aecf1af72cef96dbed5faa01b74cc12d951dd5dccc089994ff649f0a18f994e39730338f99c0aa12f3b2a1eefc40888f1fb7956cece29
languageName: node
linkType: hard
"@docusaurus/plugin-content-docs@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-content-docs@npm:2.3.1"
"@docusaurus/plugin-content-docs@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-content-docs@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/logger": 2.3.1
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/module-type-aliases": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.4.0
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.4.0
"@types/react-router-config": ^5.0.6
combine-promises: ^1.1.0
fs-extra: ^10.1.0
@ -1927,132 +1927,132 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: bcf8d921407d11b497926a1f61a1dc8c96f82fbe5a1959cc106b082e555f8fb6f42cf9262a658acf33d9543e5eb3e778049d91f71e4a2855993dc759c845cf31
checksum: 5a273e80f2c28e4a33ab994e8702b3afaff04eb73f156a0a3e42cd9d182f8e1ed2b794348b090ec170cc1e4aba2e997d1fb6e8684f73ac6698bf66d96114c57b
languageName: node
linkType: hard
"@docusaurus/plugin-content-pages@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-content-pages@npm:2.3.1"
"@docusaurus/plugin-content-pages@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-content-pages@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.4.0
fs-extra: ^10.1.0
tslib: ^2.4.0
webpack: ^5.73.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 8543050ed7330f54a28c0daeef11662eed3f3a08a6d0015b1a32db3d5e9ec46f0c6a8a5a4cb3e871ce953074d60424cc418b7ffa280695294626855a7a1a146a
checksum: 5381e913101f271476cbdc264e6058a0cbe0835ed4a823e430540da545253c1dc56578c66a6d978ee2f1aca114110aba529443ae835f26ef0eaf7de1ed6a5001
languageName: node
linkType: hard
"@docusaurus/plugin-debug@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-debug@npm:2.3.1"
"@docusaurus/plugin-debug@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-debug@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
fs-extra: ^10.1.0
react-json-view: ^1.21.3
tslib: ^2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: e660575f900eedbeab6e222eb4f8ef6a7a49815c91a97839a4839737c0b3101698bf7c6e035cbafaa49010340010a9ec0d37270dc81a470b3bae42662c7a24b8
checksum: 921614843453ef189dfa2ada31e7abed8f976b0c314f7486fde35f976911de2ab307863608326e96bea67468e98dc648aeea82dbad04d0701c3c48c92bd40c6c
languageName: node
linkType: hard
"@docusaurus/plugin-google-analytics@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-google-analytics@npm:2.3.1"
"@docusaurus/plugin-google-analytics@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-google-analytics@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 9306ae89cd5fb8ca86fd58809d7e624f988411d8908a151e9b6d9e8d0b84e08f1e3eba46024bc4321bcaeb3e9bc38e919b0bcf561adc9d40fa97c8ffeb232888
checksum: 2d8c7e5689675ced9acffe1e2187144d6ebeea471a5992139c3eea87094e315e272263da5499591e85bc3501b7583f693d33c660507b36a835fc9eb75584c706
languageName: node
linkType: hard
"@docusaurus/plugin-google-gtag@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-google-gtag@npm:2.3.1"
"@docusaurus/plugin-google-gtag@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-google-gtag@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 494f0405d79aa9cb36d1ea4cf739499ad15b59fe876573ab5b304b5e84ab6ef4d428ebdc26647777b0816af452f62959b5ddb25e5bbf73c7fb3d6568258980d0
checksum: 6aa0bb6ac5e410ea438db2de20c95a4a34d7056855b2e0baa7685e31bd9b3f48ef55f8135ca496688ccbfaba88945219acae146a244141bfb7e2372ba54c0ce2
languageName: node
linkType: hard
"@docusaurus/plugin-google-tag-manager@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-google-tag-manager@npm:2.3.1"
"@docusaurus/plugin-google-tag-manager@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils-validation": 2.4.0
tslib: ^2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: d0b2ccc212652bb4f1c1bd61420e7f235325d4f2e8de0f5b25282305f54209d05da981c1253325bcae9afbc7575bd5c246d037d2be5fbda06f2842ba8335ab47
checksum: 2df57cd95808ed7cf58ade342dcc3382e167ecebaedc7184588c214f6b64eab60fa0145ab0ce7e25803acfe3952412c1134d52ad0ea636cef652a73ccd79a5cb
languageName: node
linkType: hard
"@docusaurus/plugin-sitemap@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/plugin-sitemap@npm:2.3.1"
"@docusaurus/plugin-sitemap@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/plugin-sitemap@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/logger": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-common": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.4.0
fs-extra: ^10.1.0
sitemap: ^7.1.1
tslib: ^2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 667d2abbf46efffc4d20e38fe435a19392f07726446193a017306652ee9db3d478e971eefb209e1a5c243b6b82af3de72d4b975b8e74aa93bda4711ce8c309bc
checksum: e96fcc84352880da6a3e566cdc249e44ad825b400f2d798746201c3a4a255b196b999f5bf5d0a5b52c752acf9e9eb1169111b463914502a6cae9c114800fa09e
languageName: node
linkType: hard
"@docusaurus/preset-classic@npm:^2.3.1":
version: 2.3.1
resolution: "@docusaurus/preset-classic@npm:2.3.1"
"@docusaurus/preset-classic@npm:^2.4.0":
version: 2.4.0
resolution: "@docusaurus/preset-classic@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/plugin-content-blog": 2.3.1
"@docusaurus/plugin-content-docs": 2.3.1
"@docusaurus/plugin-content-pages": 2.3.1
"@docusaurus/plugin-debug": 2.3.1
"@docusaurus/plugin-google-analytics": 2.3.1
"@docusaurus/plugin-google-gtag": 2.3.1
"@docusaurus/plugin-google-tag-manager": 2.3.1
"@docusaurus/plugin-sitemap": 2.3.1
"@docusaurus/theme-classic": 2.3.1
"@docusaurus/theme-common": 2.3.1
"@docusaurus/theme-search-algolia": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/plugin-debug": 2.4.0
"@docusaurus/plugin-google-analytics": 2.4.0
"@docusaurus/plugin-google-gtag": 2.4.0
"@docusaurus/plugin-google-tag-manager": 2.4.0
"@docusaurus/plugin-sitemap": 2.4.0
"@docusaurus/theme-classic": 2.4.0
"@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-search-algolia": 2.4.0
"@docusaurus/types": 2.4.0
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: e4128a1bcb64d5ced04a281476ec1ae2d5523040d41ed57a8f744fb83659a2a2be902e94989de69ab1e6d693ec26c60d1ef6b2fe3ec96d5af6c9b3ef58f5b0cd
checksum: 33961a1edd445f13971e640db9445a0fae418babf0fe5f4078f21e605f9d945f7a3a4b7ad53ac7b578a7302f093c708429f462a76a3f297b3439d8e23b3990aa
languageName: node
linkType: hard
@ -2068,26 +2068,26 @@ __metadata:
languageName: node
linkType: hard
"@docusaurus/theme-classic@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/theme-classic@npm:2.3.1"
"@docusaurus/theme-classic@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/theme-classic@npm:2.4.0"
dependencies:
"@docusaurus/core": 2.3.1
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/module-type-aliases": 2.3.1
"@docusaurus/plugin-content-blog": 2.3.1
"@docusaurus/plugin-content-docs": 2.3.1
"@docusaurus/plugin-content-pages": 2.3.1
"@docusaurus/theme-common": 2.3.1
"@docusaurus/theme-translations": 2.3.1
"@docusaurus/types": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-common": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-translations": 2.4.0
"@docusaurus/types": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@docusaurus/utils-validation": 2.4.0
"@mdx-js/react": ^1.6.22
clsx: ^1.2.1
copy-text-to-clipboard: ^3.0.1
infima: 0.2.0-alpha.42
infima: 0.2.0-alpha.43
lodash: ^4.17.21
nprogress: ^0.2.0
postcss: ^8.4.14
@ -2100,20 +2100,21 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 273812924fc29b2316aff554ae0302509ebeaca5aa829b58253e74d22a66e69444f1c324a2d5e8e170e6c6f27dd0d6927e6c6a22a7e0c14567ff777d04a5b0c1
checksum: 7f3161d7be653b6a86ffd58d8a6c6d62f464db919c32b7b9ab2ec9ca1b79136e2278fdc908e90cfa31cf21385d87cd7496d5bf9c80d30c2279ef95e7f7be28aa
languageName: node
linkType: hard
"@docusaurus/theme-common@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/theme-common@npm:2.3.1"
"@docusaurus/theme-common@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/theme-common@npm:2.4.0"
dependencies:
"@docusaurus/mdx-loader": 2.3.1
"@docusaurus/module-type-aliases": 2.3.1
"@docusaurus/plugin-content-blog": 2.3.1
"@docusaurus/plugin-content-docs": 2.3.1
"@docusaurus/plugin-content-pages": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/mdx-loader": 2.4.0
"@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/plugin-content-blog": 2.4.0
"@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/plugin-content-pages": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-common": 2.4.0
"@types/history": ^4.7.11
"@types/react": "*"
"@types/react-router-config": "*"
@ -2126,22 +2127,22 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 6b902e9e782721c3c49bcdee5d969ea1c1138ebcb03891e34f827b16f2c06f43a86d95f240a60ed084539e9b16435312a41be7bff4e724f4fb209998dd4d3a59
checksum: 0790c6e5ad14bc8518173314a058e01837321d5992364d1ae4f9907f1d055f5852f883512d7a64e5add95dcfe362a009b374220de6493b32624a406d8ce74750
languageName: node
linkType: hard
"@docusaurus/theme-search-algolia@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/theme-search-algolia@npm:2.3.1"
"@docusaurus/theme-search-algolia@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/theme-search-algolia@npm:2.4.0"
dependencies:
"@docsearch/react": ^3.1.1
"@docusaurus/core": 2.3.1
"@docusaurus/logger": 2.3.1
"@docusaurus/plugin-content-docs": 2.3.1
"@docusaurus/theme-common": 2.3.1
"@docusaurus/theme-translations": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/utils-validation": 2.3.1
"@docusaurus/core": 2.4.0
"@docusaurus/logger": 2.4.0
"@docusaurus/plugin-content-docs": 2.4.0
"@docusaurus/theme-common": 2.4.0
"@docusaurus/theme-translations": 2.4.0
"@docusaurus/utils": 2.4.0
"@docusaurus/utils-validation": 2.4.0
algoliasearch: ^4.13.1
algoliasearch-helper: ^3.10.0
clsx: ^1.2.1
@ -2153,23 +2154,23 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 965303068e43b11f58d20b95bb6dfc01d5e575c2070d2730b94303bd2a1d33794075cae43bfe472f08061bd8770f14c8eb54932274e6b39f954ab34e7cfc5689
checksum: a74a199faf6bab1d663cd41f9477c65c17f8dd2080664d5c00f998eb7c57345f1c30ff4f2c3bc88863f2e606c6f7475300747480dc145e61dd42798ca4fd435e
languageName: node
linkType: hard
"@docusaurus/theme-translations@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/theme-translations@npm:2.3.1"
"@docusaurus/theme-translations@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/theme-translations@npm:2.4.0"
dependencies:
fs-extra: ^10.1.0
tslib: ^2.4.0
checksum: dd3796be63c4c946af789c3da18ed2704a2fa90d8e752ba2b780a124dc13369ba590218afad0ac4ea2342f7331ccb9eb1be086226c950b8384978d94a15c57ad
checksum: 37f329eb74fcb16c14bd370038d8bd1e18017fb1f78564d960c53fd4e110eb166f6f1c03f323dea28ede95873ebe28a659554d02cc26d1c3e748a772f9d2313a
languageName: node
linkType: hard
"@docusaurus/types@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/types@npm:2.3.1"
"@docusaurus/types@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/types@npm:2.4.0"
dependencies:
"@types/history": ^4.7.11
"@types/react": "*"
@ -2182,13 +2183,13 @@ __metadata:
peerDependencies:
react: ^16.8.4 || ^17.0.0
react-dom: ^16.8.4 || ^17.0.0
checksum: 91e52f37b97964112aa0d50ee4a6f534d7da941443af5ddc96418817c6ce532a98c73e67045ac703b582c7ed703ebb360205eec30da7f738c0105f2b3ae1a246
checksum: 54b0cd8992269ab0508d94ce19a7fcc2b3e7c9700eb112c9b859ddac8228dcc64282c414b602ba44894be87be79eeeef730fb8e569be68b6e26453e18addcf21
languageName: node
linkType: hard
"@docusaurus/utils-common@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/utils-common@npm:2.3.1"
"@docusaurus/utils-common@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/utils-common@npm:2.4.0"
dependencies:
tslib: ^2.4.0
peerDependencies:
@ -2196,28 +2197,28 @@ __metadata:
peerDependenciesMeta:
"@docusaurus/types":
optional: true
checksum: 405dc5b8aba9a97b2670ba8ff3911bbdaed274edc15214ab482a7159a07ad1c9b3198835a7bee42de4e0320d42bd402ed89ae6896744a364d64d89d9f78bcfb0
checksum: 711e61e899b133fc7cd755e6de75fd79a712eeabbd9853b9122e3929c8390e015bb9e4bca2284028e40e7a0fb2b89ef1c184f7e4149097ffd7b64821b38c11da
languageName: node
linkType: hard
"@docusaurus/utils-validation@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/utils-validation@npm:2.3.1"
"@docusaurus/utils-validation@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/utils-validation@npm:2.4.0"
dependencies:
"@docusaurus/logger": 2.3.1
"@docusaurus/utils": 2.3.1
"@docusaurus/logger": 2.4.0
"@docusaurus/utils": 2.4.0
joi: ^17.6.0
js-yaml: ^4.1.0
tslib: ^2.4.0
checksum: 1e5529d1d0c4fcd9006adf2e5b545458a7dba3877563fb444dcec472f27a3d8492d4c6fb5dd1071bb6e668a13a845d74b8f6c4b6387babfa0e467a9b8b237fda
checksum: 21a229858ed9254830b68dd08de6456dc19b68adead581f86e854ea3e55b64b9616a3bbca521e74f754c9c7bc835ca348dfe9f0949d9a8d189db5b39bcdb9f6b
languageName: node
linkType: hard
"@docusaurus/utils@npm:2.3.1":
version: 2.3.1
resolution: "@docusaurus/utils@npm:2.3.1"
"@docusaurus/utils@npm:2.4.0":
version: 2.4.0
resolution: "@docusaurus/utils@npm:2.4.0"
dependencies:
"@docusaurus/logger": 2.3.1
"@docusaurus/logger": 2.4.0
"@svgr/webpack": ^6.2.1
escape-string-regexp: ^4.0.0
file-loader: ^6.2.0
@ -2238,7 +2239,7 @@ __metadata:
peerDependenciesMeta:
"@docusaurus/types":
optional: true
checksum: e8bce9bbd98bf63664fcd7c0a5f8dec30dad31ed19e18d724b43189b04ecdc1174537e1d987293575ec18d421236fb92d3d39d28477e921507260a39c3f6d6d0
checksum: 7ba6634b6ff71bb7cc64b0eb3c6d2892a21873bce8559bcd460693a80ca0229828c04da751277cdb17c6f18e80e061322bbcd84e9b743adc96c594b43e8a2165
languageName: node
linkType: hard
@ -2700,10 +2701,10 @@ __metadata:
languageName: node
linkType: hard
"@tsconfig/docusaurus@npm:^1.0.6":
version: 1.0.6
resolution: "@tsconfig/docusaurus@npm:1.0.6"
checksum: fb0d7965c01fe64fc6369a72695b903d654bd5fb145f373d707c2bae3c2d828703517d812cef1c041ae44b108f44e52778b9d9837a54fdf782e68e6619a90a4d
"@tsconfig/docusaurus@npm:^1.0.7":
version: 1.0.7
resolution: "@tsconfig/docusaurus@npm:1.0.7"
checksum: 8f5b14005d90b2008f10daf03a5edec86d2a7603e5641c579ea936a5c2d165a8c3007a72254fc4c2adb0554d73062f52bb97b30ff818f01c9215957822f3c4db
languageName: node
linkType: hard
@ -6283,10 +6284,10 @@ __metadata:
languageName: node
linkType: hard
"infima@npm:0.2.0-alpha.42":
version: 0.2.0-alpha.42
resolution: "infima@npm:0.2.0-alpha.42"
checksum: 7206f36639c00a08daab811fedc748068951497efb5ec948cba846fb23856443668015f6bd65ddebe857cc2235f6ca98429f7018c73dcac47b0361ef4721bb8f
"infima@npm:0.2.0-alpha.43":
version: 0.2.0-alpha.43
resolution: "infima@npm:0.2.0-alpha.43"
checksum: fc5f79240e940eddd750439511767092ccb4051e5e91d253ec7630a9e7ce691812da3aa0f05e46b4c0a95dbfadeae5714fd0073f8d2df12e5aaff0697a1d6aa2
languageName: node
linkType: hard
@ -7357,19 +7358,19 @@ __metadata:
version: 0.0.0-use.local
resolution: "modular-avatar-docs@workspace:."
dependencies:
"@algolia/client-search": ^4.14.3
"@docusaurus/core": ^2.3.1
"@docusaurus/module-type-aliases": 2.3.1
"@docusaurus/preset-classic": ^2.3.1
"@algolia/client-search": ^4.17.0
"@docusaurus/core": ^2.4.0
"@docusaurus/module-type-aliases": 2.4.0
"@docusaurus/preset-classic": ^2.4.0
"@mdx-js/react": ^1.6.22
"@tsconfig/docusaurus": ^1.0.6
"@tsconfig/docusaurus": ^1.0.7
clsx: ^1.2.1
prism-react-renderer: ^1.3.5
react: ^17.0.2
react-dom: ^17.0.2
react-loadable: ^5.5.0
react-player: ^2.11.2
typescript: ^4.9.5
react-player: ^2.12.0
typescript: ^5.0.4
languageName: unknown
linkType: soft
@ -8770,9 +8771,9 @@ __metadata:
languageName: node
linkType: hard
"react-player@npm:^2.11.2":
version: 2.11.2
resolution: "react-player@npm:2.11.2"
"react-player@npm:^2.12.0":
version: 2.12.0
resolution: "react-player@npm:2.12.0"
dependencies:
deepmerge: ^4.0.0
load-script: ^1.0.0
@ -8781,7 +8782,7 @@ __metadata:
react-fast-compare: ^3.0.1
peerDependencies:
react: ">=16.6.0"
checksum: 003bfcfb00692f3b5e8dd831411a26a66474b7cb8003284ea835c50f7e9ca831895f8557c9ceafdb29ab9915a3ce0f5ba655c8c88fbff6acae3d4554de9986ee
checksum: 77d3e55ed67cd9c1e2300a990d8015d270072daad41f8a0750c32748f3fbfbc5bd2a2f06e78ac6828c2260b84537b9571d0abac31d3e888b74a3dccb59a56365
languageName: node
linkType: hard
@ -10132,23 +10133,23 @@ __metadata:
languageName: node
linkType: hard
"typescript@npm:^4.9.5":
version: 4.9.5
resolution: "typescript@npm:4.9.5"
"typescript@npm:^5.0.4":
version: 5.0.4
resolution: "typescript@npm:5.0.4"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db
checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172
languageName: node
linkType: hard
"typescript@patch:typescript@^4.9.5#~builtin<compat/typescript>":
version: 4.9.5
resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin<compat/typescript>::version=4.9.5&hash=23ec76"
"typescript@patch:typescript@^5.0.4#~builtin<compat/typescript>":
version: 5.0.4
resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin<compat/typescript>::version=5.0.4&hash=1f5320"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d
checksum: 6a1fe9a77bb9c5176ead919cc4a1499ee63e46b4e05bf667079f11bf3a8f7887f135aa72460a4c3b016e6e6bb65a822cb8689a6d86cbfe92d22cc9f501f09213
languageName: node
linkType: hard
@ -10675,8 +10676,8 @@ __metadata:
linkType: hard
"webpack@npm:^5.73.0":
version: 5.75.0
resolution: "webpack@npm:5.75.0"
version: 5.76.3
resolution: "webpack@npm:5.76.3"
dependencies:
"@types/eslint-scope": ^3.7.3
"@types/estree": ^0.0.51
@ -10707,7 +10708,7 @@ __metadata:
optional: true
bin:
webpack: bin/webpack.js
checksum: 2bcc5f3c195f375944e8af2f00bf2feea39cb9fda5f763b0d1b00077f1c51783db25c94d3fae96a07dead9fa085e6ae7474417e5ab31719c9776ea5969ceb83a
checksum: 363f536b56971d056e34ab4cffa4cbc630b220e51be1a8c3adea87d9f0b51c49cfc7c3720d6614a1fd2c8c63f1ab3100db916fe8367c8bb9299327ff8c3f856d
languageName: node
linkType: hard