@lovelace_lol/polymer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -0
- package/dist/index.d.ts +2603 -0
- package/dist/index.js +1031 -0
- package/dist/test.cjs +1519 -0
- package/dist/worker/agency-worker.js +972 -0
- package/dist/worker/manifest.edn +1 -0
- package/package.json +57 -0
- package/shadow-cljs.edn +173 -0
- package/src/polymer/animation/agency.cljs +84 -0
- package/src/polymer/animation/domain.cljs +110 -0
- package/src/polymer/animation/planner.cljs +88 -0
- package/src/polymer/animation/runtime.cljs +137 -0
- package/src/polymer/animation/scheduler.cljs +178 -0
- package/src/polymer/animation/service.cljs +981 -0
- package/src/polymer/animation/state.cljs +112 -0
- package/src/polymer/blink/agency.cljs +131 -0
- package/src/polymer/blink/planner.cljs +115 -0
- package/src/polymer/blink/scheduler.cljs +90 -0
- package/src/polymer/blink/snippet.cljs +50 -0
- package/src/polymer/blink/state.cljs +102 -0
- package/src/polymer/camera_context/agency.cljs +132 -0
- package/src/polymer/camera_context/domain.cljs +186 -0
- package/src/polymer/camera_context/planner.cljs +50 -0
- package/src/polymer/camera_context/scheduler.cljs +113 -0
- package/src/polymer/camera_context/state.cljs +121 -0
- package/src/polymer/character.cljs +471 -0
- package/src/polymer/conversation/agency.cljs +83 -0
- package/src/polymer/conversation/domain.cljs +35 -0
- package/src/polymer/conversation/effector.cljs +130 -0
- package/src/polymer/conversation/planner.cljs +178 -0
- package/src/polymer/conversation/scheduler.cljs +202 -0
- package/src/polymer/conversation/service.cljs +329 -0
- package/src/polymer/conversation/state.cljs +186 -0
- package/src/polymer/core.cljs +172 -0
- package/src/polymer/eye_head/agency.cljs +75 -0
- package/src/polymer/eye_head/domain.cljs +133 -0
- package/src/polymer/eye_head/goap.cljs +106 -0
- package/src/polymer/eye_head/scheduler.cljs +176 -0
- package/src/polymer/eye_head/service.cljs +259 -0
- package/src/polymer/eye_head/snippet.cljs +92 -0
- package/src/polymer/eye_head/state.cljs +167 -0
- package/src/polymer/gaze/agency.cljs +85 -0
- package/src/polymer/gaze/domain.cljs +211 -0
- package/src/polymer/gaze/goap.cljs +208 -0
- package/src/polymer/gaze/scheduler.cljs +184 -0
- package/src/polymer/gaze/state.cljs +202 -0
- package/src/polymer/gesture/agency.cljs +185 -0
- package/src/polymer/gesture/goap.cljs +461 -0
- package/src/polymer/gesture/scheduler.cljs +122 -0
- package/src/polymer/gesture/snippet.cljs +198 -0
- package/src/polymer/gesture/state.cljs +273 -0
- package/src/polymer/lipsync/agency.cljs +593 -0
- package/src/polymer/lipsync/articulation/jaw.cljs +258 -0
- package/src/polymer/lipsync/articulation/snippet.cljs +605 -0
- package/src/polymer/lipsync/articulation/tongue.cljs +418 -0
- package/src/polymer/lipsync/articulation/visemes.cljs +429 -0
- package/src/polymer/lipsync/goap.cljs +132 -0
- package/src/polymer/lipsync/pronunciation/effector.cljs +51 -0
- package/src/polymer/lipsync/scheduler.cljs +302 -0
- package/src/polymer/lipsync/state.cljs +202 -0
- package/src/polymer/nlp/phonemes.cljs +164 -0
- package/src/polymer/prosodic/agency.cljs +196 -0
- package/src/polymer/prosodic/goap.cljs +122 -0
- package/src/polymer/prosodic/scheduler.cljs +99 -0
- package/src/polymer/prosodic/snippet.cljs +106 -0
- package/src/polymer/prosodic/state.cljs +139 -0
- package/src/polymer/runtime/embody.cljs +117 -0
- package/src/polymer/runtime/embody_wasm.cljs +177 -0
- package/src/polymer/runtime/rust_embody_host.cljs +645 -0
- package/src/polymer/society.cljs +239 -0
- package/src/polymer/stream.cljs +130 -0
- package/src/polymer/transcription/agency.cljs +69 -0
- package/src/polymer/transcription/domain.cljs +68 -0
- package/src/polymer/transcription/effector.cljs +611 -0
- package/src/polymer/transcription/planner.cljs +203 -0
- package/src/polymer/transcription/scheduler.cljs +225 -0
- package/src/polymer/transcription/service.cljs +209 -0
- package/src/polymer/transcription/state.cljs +239 -0
- package/src/polymer/tts/agency.cljs +503 -0
- package/src/polymer/tts/azure.cljs +290 -0
- package/src/polymer/tts/planner.cljs +178 -0
- package/src/polymer/tts/runtime.cljs +624 -0
- package/src/polymer/tts/scheduler.cljs +162 -0
- package/src/polymer/tts/state.cljs +191 -0
- package/src/polymer/worker.cljs +70 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[{:module-id :agency-worker, :name :agency-worker, :output-name "agency-worker.js", :entries [polymer.worker], :depends-on nil, :sources ["goog/base.js" "goog/debug/error.js" "goog/dom/nodetype.js" "goog/asserts/asserts.js" "goog/reflect/reflect.js" "goog/math/long.js" "goog/math/integer.js" "goog/dom/htmlelement.js" "goog/dom/tagname.js" "goog/dom/element.js" "goog/asserts/dom.js" "goog/dom/asserts.js" "goog/functions/functions.js" "goog/string/typedstring.js" "goog/string/const.js" "goog/html/trustedtypes.js" "goog/html/safescript.js" "goog/fs/url.js" "goog/fs/blob.js" "goog/html/trustedresourceurl.js" "goog/string/internal.js" "goog/html/safeurl.js" "goog/html/safestyle.js" "goog/object/object.js" "goog/html/safestylesheet.js" "goog/flags/flags.js" "goog/labs/useragent/useragent.js" "goog/labs/useragent/util.js" "goog/labs/useragent/highentropy/highentropyvalue.js" "goog/labs/useragent/highentropy/highentropydata.js" "goog/labs/useragent/browser.js" "goog/array/array.js" "goog/dom/tags.js" "goog/html/safehtml.js" "goog/html/uncheckedconversions.js" "goog/dom/safe.js" "goog/string/string.js" "goog/collections/maps.js" "goog/structs/structs.js" "goog/uri/utils.js" "goog/uri/uri.js" "goog/string/stringbuffer.js" "cljs/core.cljs" "polymer/animation/state.cljs" "polymer/animation/planner.cljs" "polymer/animation/domain.cljs" "polymer/animation/runtime.cljs" "polymer/animation/scheduler.cljs" "polymer/stream.cljs" "polymer/animation/agency.cljs" "clojure/string.cljs" "polymer/animation/service.cljs" "polymer/blink/state.cljs" "polymer/blink/planner.cljs" "polymer/blink/snippet.cljs" "polymer/blink/scheduler.cljs" "polymer/blink/agency.cljs" "polymer/camera_context/domain.cljs" "polymer/camera_context/planner.cljs" "polymer/camera_context/scheduler.cljs" "polymer/camera_context/state.cljs" "polymer/camera_context/agency.cljs" "polymer/conversation/domain.cljs" "polymer/conversation/effector.cljs" "polymer/conversation/planner.cljs" "polymer/conversation/state.cljs" "polymer/conversation/scheduler.cljs" "polymer/conversation/agency.cljs" "polymer/eye_head/domain.cljs" "polymer/eye_head/snippet.cljs" "polymer/eye_head/goap.cljs" "polymer/eye_head/state.cljs" "polymer/eye_head/scheduler.cljs" "polymer/eye_head/agency.cljs" "polymer/gaze/domain.cljs" "polymer/gaze/goap.cljs" "polymer/gaze/state.cljs" "polymer/gaze/scheduler.cljs" "polymer/gaze/agency.cljs" "clojure/set.cljs" "polymer/gesture/state.cljs" "polymer/gesture/goap.cljs" "polymer/gesture/scheduler.cljs" "polymer/gesture/snippet.cljs" "polymer/gesture/agency.cljs" "polymer/lipsync/goap.cljs" "polymer/lipsync/state.cljs" "polymer/nlp/phonemes.cljs" "polymer/lipsync/articulation/visemes.cljs" "polymer/tts/azure.cljs" "polymer/lipsync/scheduler.cljs" "polymer/lipsync/pronunciation/effector.cljs" "polymer/lipsync/articulation/jaw.cljs" "polymer/lipsync/articulation/tongue.cljs" "polymer/lipsync/articulation/snippet.cljs" "polymer/lipsync/agency.cljs" "polymer/prosodic/state.cljs" "polymer/prosodic/goap.cljs" "polymer/prosodic/scheduler.cljs" "polymer/prosodic/snippet.cljs" "polymer/prosodic/agency.cljs" "polymer/society.cljs" "polymer/transcription/domain.cljs" "polymer/transcription/effector.cljs" "polymer/transcription/state.cljs" "polymer/transcription/planner.cljs" "polymer/transcription/scheduler.cljs" "polymer/transcription/agency.cljs" "polymer/tts/planner.cljs" "polymer/tts/state.cljs" "polymer/tts/runtime.cljs" "polymer/tts/scheduler.cljs" "polymer/tts/agency.cljs" "polymer/character.cljs" "polymer/conversation/service.cljs" "polymer/eye_head/service.cljs" "polymer/transcription/service.cljs" "polymer/core.cljs" "polymer/worker.cljs" "shadow/module/agency-worker/append.js"]}]
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lovelace_lol/polymer",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Pure ClojureScript character agencies for Character Loom.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"module": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./worker/agency-worker.js": "./dist/worker/agency-worker.js",
|
|
18
|
+
"./package.json": "./package.json"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"src",
|
|
23
|
+
"shadow-cljs.edn",
|
|
24
|
+
"README.md"
|
|
25
|
+
],
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@lovelace_lol/embody": "latest",
|
|
28
|
+
"cmu-pronouncing-dictionary": "3.0.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"three": ">=0.150.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"shadow-cljs": "^2.28.23",
|
|
35
|
+
"three": "^0.184.0",
|
|
36
|
+
"typescript": "5.7.2"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/meekmachine/Polymer.git"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "rm -f dist/index.js dist/index.cjs dist/index.mjs && shadow-cljs release npm worker",
|
|
47
|
+
"test": "shadow-cljs compile test && node dist/test.cjs",
|
|
48
|
+
"test:embody-exports": "node --test test/embody-export-contract.test.mjs test/embody-marker-endpoint-contract.test.mjs test/embody-model-scale-contract.test.mjs",
|
|
49
|
+
"test:worker": "node test/worker_smoke.cjs",
|
|
50
|
+
"check:install-surface": "node scripts/check-git-install-surface.mjs",
|
|
51
|
+
"check:architecture": "node scripts/check-agency-architecture.mjs",
|
|
52
|
+
"check:embody-exports": "node scripts/check-embody-export-contract.mjs",
|
|
53
|
+
"check:types": "tsc --noEmit --skipLibCheck false --moduleResolution bundler --module esnext --target es2022 dist/index.d.ts",
|
|
54
|
+
"check:dist": "node scripts/check-built-dist.mjs",
|
|
55
|
+
"clean": "rm -rf .shadow-cljs dist/test.js dist/test.cjs dist/worker"
|
|
56
|
+
}
|
|
57
|
+
}
|
package/shadow-cljs.edn
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
{:source-paths ["src" "test"]
|
|
2
|
+
:dependencies []
|
|
3
|
+
:builds
|
|
4
|
+
{:npm
|
|
5
|
+
{:target :esm
|
|
6
|
+
:output-dir "dist"
|
|
7
|
+
:js-options {:js-provider :import}
|
|
8
|
+
:modules {:index
|
|
9
|
+
{;; Closure cannot emit dynamic-import expressions from CLJS.
|
|
10
|
+
;; This build-only ESM connector keeps the package name literal
|
|
11
|
+
;; so downstream bundlers can resolve and split the dictionary.
|
|
12
|
+
:prepend "globalThis.__polymerLoadPronunciationDictionary = () => import('cmu-pronouncing-dictionary');\n"
|
|
13
|
+
:exports {:createBlinkAgency polymer.core/createBlinkAgency
|
|
14
|
+
:createAnimationAgency polymer.core/createAnimationAgency
|
|
15
|
+
:createAnimationService polymer.core/createAnimationService
|
|
16
|
+
:createEyeHeadTrackingService polymer.core/createEyeHeadTrackingService
|
|
17
|
+
:createTranscriptionService polymer.core/createTranscriptionService
|
|
18
|
+
:createConversationService polymer.core/createConversationService
|
|
19
|
+
:TranscriptionService polymer.core/TranscriptionService
|
|
20
|
+
:ConversationService polymer.core/ConversationService
|
|
21
|
+
:DEFAULT_EYE_HEAD_CONFIG polymer.core/DEFAULT_EYE_HEAD_CONFIG
|
|
22
|
+
:DEFAULT_ANIMATION_KEYS polymer.core/DEFAULT_ANIMATION_KEYS
|
|
23
|
+
:EYE_AUS polymer.core/EYE_AUS
|
|
24
|
+
:HEAD_AUS polymer.core/HEAD_AUS
|
|
25
|
+
:animationEventEmitter polymer.core/animationEventEmitter
|
|
26
|
+
:snippetList$ polymer.core/snippetList$
|
|
27
|
+
:snippetState$ polymer.core/snippetState$
|
|
28
|
+
:snippetTime$ polymer.core/snippetTime$
|
|
29
|
+
:globalPlaybackState$ polymer.core/globalPlaybackState$
|
|
30
|
+
:bakedClipList$ polymer.core/bakedClipList$
|
|
31
|
+
:playingBakedAnimations$ polymer.core/playingBakedAnimations$
|
|
32
|
+
:bakedAnimationProgress$ polymer.core/bakedAnimationProgress$
|
|
33
|
+
:bakedAnimationState$ polymer.core/bakedAnimationState$
|
|
34
|
+
:getBundledSnippetNames polymer.core/getBundledSnippetNames
|
|
35
|
+
:getStoredSnippetNames polymer.core/getStoredSnippetNames
|
|
36
|
+
:getAvailableSnippetNames polymer.core/getAvailableSnippetNames
|
|
37
|
+
:resolveSnippetEntry polymer.core/resolveSnippetEntry
|
|
38
|
+
:preloadAllSnippets polymer.core/preloadAllSnippets
|
|
39
|
+
:clearPreloadedSnippets polymer.core/clearPreloadedSnippets
|
|
40
|
+
:createGazeAgency polymer.core/createGazeAgency
|
|
41
|
+
:createEyeHeadTrackingAgency polymer.core/createEyeHeadTrackingAgency
|
|
42
|
+
:createLipSyncAgency polymer.core/createLipSyncAgency
|
|
43
|
+
:createTTSAgency polymer.core/createTTSAgency
|
|
44
|
+
:createGestureAgency polymer.core/createGestureAgency
|
|
45
|
+
:createProsodicAgency polymer.core/createProsodicAgency
|
|
46
|
+
:createConversationAgency polymer.core/createConversationAgency
|
|
47
|
+
:createTranscriptionAgency polymer.core/createTranscriptionAgency
|
|
48
|
+
:createCameraContextAgency polymer.core/createCameraContextAgency
|
|
49
|
+
:createCharacterAgencies polymer.core/createCharacterAgencies
|
|
50
|
+
:DEFAULT_AGENCY_SOCIETY polymer.core/DEFAULT_AGENCY_SOCIETY
|
|
51
|
+
:Embody polymer.runtime.embody/Embody
|
|
52
|
+
:BLENDING_MODES polymer.runtime.embody/BLENDING_MODES
|
|
53
|
+
:THREE_BLENDING_MODES polymer.runtime.embody/THREE_BLENDING_MODES
|
|
54
|
+
:collectMorphMeshes polymer.runtime.embody/collectMorphMeshes
|
|
55
|
+
:analyzeModel polymer.runtime.embody/analyzeModel
|
|
56
|
+
:extractModelData polymer.runtime.embody/extractModelData
|
|
57
|
+
:getPreset polymer.runtime.embody/getPreset
|
|
58
|
+
:validateMappings polymer.runtime.embody/validateMappings
|
|
59
|
+
:extendCharacterConfigWithPreset polymer.runtime.embody/extendCharacterConfigWithPreset
|
|
60
|
+
:extractProfileOverrides polymer.runtime.embody/extractProfileOverrides
|
|
61
|
+
:mergeCharacterRegionsByName polymer.runtime.embody/mergeCharacterRegionsByName
|
|
62
|
+
:applyAUBoneBindingUpdate polymer.runtime.embody/applyAUBoneBindingUpdate
|
|
63
|
+
:applyBilateralAxisBindingUpdate polymer.runtime.embody/applyBilateralAxisBindingUpdate
|
|
64
|
+
:applyBoneAxisBindingUpdate polymer.runtime.embody/applyBoneAxisBindingUpdate
|
|
65
|
+
:buildBoneAuOptions polymer.runtime.embody/buildBoneAuOptions
|
|
66
|
+
:classifyAuAsJointControl polymer.runtime.embody/classifyAuAsJointControl
|
|
67
|
+
:createBilateralBoneAxisAu polymer.runtime.embody/createBilateralBoneAxisAu
|
|
68
|
+
:createBoneAxisAu polymer.runtime.embody/createBoneAxisAu
|
|
69
|
+
:DEFAULT_AXIS_TO_CHANNEL polymer.runtime.embody/DEFAULT_AXIS_TO_CHANNEL
|
|
70
|
+
:DEFAULT_BONE_MAX_DEGREES polymer.runtime.embody/DEFAULT_BONE_MAX_DEGREES
|
|
71
|
+
:ensureBilateralBoneNodeKeys polymer.runtime.embody/ensureBilateralBoneNodeKeys
|
|
72
|
+
:ensureBoneNodeKey polymer.runtime.embody/ensureBoneNodeKey
|
|
73
|
+
:findNodeKeyForBone polymer.runtime.embody/findNodeKeyForBone
|
|
74
|
+
:formatAxisDirectionLabel polymer.runtime.embody/formatAxisDirectionLabel
|
|
75
|
+
:formatAxisLabel polymer.runtime.embody/formatAxisLabel
|
|
76
|
+
:getAUBoneBindingState polymer.runtime.embody/getAUBoneBindingState
|
|
77
|
+
:getAxisFromChannel polymer.runtime.embody/getAxisFromChannel
|
|
78
|
+
:getBilateralAxisBindingState polymer.runtime.embody/getBilateralAxisBindingState
|
|
79
|
+
:getBoneAxisBindingState polymer.runtime.embody/getBoneAxisBindingState
|
|
80
|
+
:inferChiralBoneNamePair polymer.runtime.embody/inferChiralBoneNamePair
|
|
81
|
+
:inferEyeControlFamily polymer.runtime.embody/inferEyeControlFamily
|
|
82
|
+
:inferEyeControlScope polymer.runtime.embody/inferEyeControlScope
|
|
83
|
+
:isJointControlAuInfo polymer.runtime.embody/isJointControlAuInfo
|
|
84
|
+
:isMaxDegreesOnlyAxisBindingUpdate polymer.runtime.embody/isMaxDegreesOnlyAxisBindingUpdate
|
|
85
|
+
:JOINT_CONTROL_SECTION polymer.runtime.embody/JOINT_CONTROL_SECTION
|
|
86
|
+
:resolveBoneAxisChannel polymer.runtime.embody/resolveBoneAxisChannel
|
|
87
|
+
:resolveBoneNameForNodeKey polymer.runtime.embody/resolveBoneNameForNodeKey
|
|
88
|
+
:resolveContinuumDisplayLabel polymer.runtime.embody/resolveContinuumDisplayLabel
|
|
89
|
+
:stripConfiguredBoneAffixes polymer.runtime.embody/stripConfiguredBoneAffixes
|
|
90
|
+
:computeCameraRelativeGazeOffset polymer.runtime.embody/computeCameraRelativeGazeOffset
|
|
91
|
+
:detectAnnotationLaterality polymer.runtime.embody/detectAnnotationLaterality
|
|
92
|
+
:fuzzyNameMatch polymer.runtime.embody/fuzzyNameMatch
|
|
93
|
+
:getDefaultAnnotationLaterality polymer.runtime.embody/getDefaultAnnotationLaterality
|
|
94
|
+
:getMeshNamesForAUProfile polymer.runtime.embody/getMeshNamesForAUProfile
|
|
95
|
+
:getModelLocalOrbitAngle polymer.runtime.embody/getModelLocalOrbitAngle
|
|
96
|
+
:getSemanticHorizontalSign polymer.runtime.embody/getSemanticHorizontalSign
|
|
97
|
+
:getSemanticHorizontalSignForSide polymer.runtime.embody/getSemanticHorizontalSignForSide
|
|
98
|
+
:getWorldDirectionForCameraAngle polymer.runtime.embody/getWorldDirectionForCameraAngle
|
|
99
|
+
:hasLeftRightMorphs polymer.runtime.embody/hasLeftRightMorphs
|
|
100
|
+
:isMixedAU polymer.runtime.embody/isMixedAU
|
|
101
|
+
:passesMarkerCameraAngleGate polymer.runtime.embody/passesMarkerCameraAngleGate
|
|
102
|
+
:resolveBoneNames polymer.runtime.embody/resolveBoneNames
|
|
103
|
+
:resolveFaceCenter polymer.runtime.embody/resolveFaceCenter
|
|
104
|
+
:resolveRegionCameraAngle polymer.runtime.embody/resolveRegionCameraAngle
|
|
105
|
+
:resolveRegionVisibilityCameraAngle polymer.runtime.embody/resolveRegionVisibilityCameraAngle
|
|
106
|
+
:toWorldDirection polymer.runtime.embody/toWorldDirection
|
|
107
|
+
:RustAnnotationCameraCore polymer.runtime.embody/RustAnnotationCameraCore
|
|
108
|
+
:createRustAnnotationCameraCore polymer.runtime.embody/createRustAnnotationCameraCore
|
|
109
|
+
:CC4_BONES polymer.runtime.embody/CC4_BONES
|
|
110
|
+
:VISEME_KEYS polymer.runtime.embody/VISEME_KEYS
|
|
111
|
+
:HAIR_COLOR_PRESETS polymer.runtime.embody/HAIR_COLOR_PRESETS
|
|
112
|
+
:DEFAULT_HAIR_COLOR_APPEARANCE polymer.runtime.embody/DEFAULT_HAIR_COLOR_APPEARANCE
|
|
113
|
+
:normalizeHairColorAppearance polymer.runtime.embody/normalizeHairColorAppearance
|
|
114
|
+
:HUMANOID_SKELETON_TEMPLATES polymer.runtime.embody/HUMANOID_SKELETON_TEMPLATES
|
|
115
|
+
:JONATHAN_HUMANOID_SKELETON_TEMPLATE polymer.runtime.embody/JONATHAN_HUMANOID_SKELETON_TEMPLATE
|
|
116
|
+
:getHumanoidSkeletonTemplate polymer.runtime.embody/getHumanoidSkeletonTemplate
|
|
117
|
+
:getHumanoidSkeletonTemplateBoneNames polymer.runtime.embody/getHumanoidSkeletonTemplateBoneNames
|
|
118
|
+
:createValidationSkeletonFromHumanoidTemplate polymer.runtime.embody/createValidationSkeletonFromHumanoidTemplate
|
|
119
|
+
:computeHumanoidSkeletonTemplateRestBounds polymer.runtime.embody/computeHumanoidSkeletonTemplateRestBounds
|
|
120
|
+
:extractHumanoidSkeletonTemplateFromModel polymer.runtime.embody/extractHumanoidSkeletonTemplateFromModel
|
|
121
|
+
:createCharacterHost polymer.runtime.embody/createCharacterHost
|
|
122
|
+
:createRustEmbodyHost polymer.runtime.embody/createRustEmbodyHost
|
|
123
|
+
:createRustEmbodyHostUnbound polymer.runtime.embody/createRustEmbodyHostUnbound
|
|
124
|
+
:supportsRustEmbodyPreset polymer.runtime.embody/supportsRustEmbodyPreset
|
|
125
|
+
:createDefaultCharacterScene polymer.runtime.embody/createDefaultCharacterScene
|
|
126
|
+
:createDefaultCharacterLighting polymer.runtime.embody/createDefaultCharacterLighting
|
|
127
|
+
:createShadowPlane polymer.runtime.embody/createShadowPlane
|
|
128
|
+
:loadCharacterModel polymer.runtime.embody/loadCharacterModel
|
|
129
|
+
:parseCharacterModel polymer.runtime.embody/parseCharacterModel
|
|
130
|
+
:applyCharacterModelTransform polymer.runtime.embody/applyCharacterModelTransform
|
|
131
|
+
:disposeCharacterModel polymer.runtime.embody/disposeCharacterModel
|
|
132
|
+
:DEFAULT_CHARACTER_LIGHTING_PRESET_ID polymer.runtime.embody/DEFAULT_CHARACTER_LIGHTING_PRESET_ID
|
|
133
|
+
:DEFAULT_CHARACTER_LIGHTING_PRESET_IDS polymer.runtime.embody/DEFAULT_CHARACTER_LIGHTING_PRESET_IDS
|
|
134
|
+
:DEFAULT_CHARACTER_LIGHTING_PRESETS polymer.runtime.embody/DEFAULT_CHARACTER_LIGHTING_PRESETS
|
|
135
|
+
:DEFAULT_CHARACTER_LIGHTING_SETTINGS polymer.runtime.embody/DEFAULT_CHARACTER_LIGHTING_SETTINGS
|
|
136
|
+
:normalizeDefaultCharacterLightingSettings polymer.runtime.embody/normalizeDefaultCharacterLightingSettings
|
|
137
|
+
:CHARACTER_SCENE_TYPES polymer.runtime.embody/CHARACTER_SCENE_TYPES
|
|
138
|
+
:CHARACTER_SCENE_TYPE_IDS polymer.runtime.embody/CHARACTER_SCENE_TYPE_IDS
|
|
139
|
+
:DEFAULT_CHARACTER_SCENE_TYPE_ID polymer.runtime.embody/DEFAULT_CHARACTER_SCENE_TYPE_ID
|
|
140
|
+
:initEmbodyCore polymer.runtime.embody-wasm/initEmbodyCore
|
|
141
|
+
:isEmbodyCoreReady polymer.runtime.embody-wasm/isEmbodyCoreReady
|
|
142
|
+
:getEmbodyCore polymer.runtime.embody-wasm/getEmbodyCore
|
|
143
|
+
:coreAbiVersion polymer.runtime.embody-wasm/coreAbiVersion
|
|
144
|
+
:packMorphFrameDelta polymer.runtime.embody-wasm/packMorphFrameDelta
|
|
145
|
+
:solveBilateralValues polymer.runtime.embody-wasm/solveBilateralValues
|
|
146
|
+
:solveMorphBatch polymer.runtime.embody-wasm/solveMorphBatch
|
|
147
|
+
:solveAxisQuaternion polymer.runtime.embody-wasm/solveAxisQuaternion
|
|
148
|
+
:analyzeMeshProportions polymer.runtime.embody-wasm/analyzeMeshProportions
|
|
149
|
+
:solveTemplateSkeletonFit polymer.runtime.embody-wasm/solveTemplateSkeletonFit
|
|
150
|
+
:composeTemplateFitAdjustment polymer.runtime.embody-wasm/composeTemplateFitAdjustment
|
|
151
|
+
:composeTemplateSkeletonFitTransform polymer.runtime.embody-wasm/composeTemplateSkeletonFitTransform
|
|
152
|
+
:defaultHairPhysicsConfigValues polymer.runtime.embody-wasm/defaultHairPhysicsConfigValues
|
|
153
|
+
:createHairPhysicsSolver polymer.runtime.embody-wasm/createHairPhysicsSolver
|
|
154
|
+
:createRuntimeCore polymer.runtime.embody-wasm/createRuntimeCore
|
|
155
|
+
:EMBODY_CORE_ABI_VERSION polymer.runtime.embody-wasm/EMBODY_CORE_ABI_VERSION
|
|
156
|
+
:PACKED_MORPH_FRAME_DELTA_STRIDE polymer.runtime.embody-wasm/PACKED_MORPH_FRAME_DELTA_STRIDE
|
|
157
|
+
:HAIR_CONFIG_STRIDE polymer.runtime.embody-wasm/HAIR_CONFIG_STRIDE
|
|
158
|
+
:HAIR_STATE_STRIDE polymer.runtime.embody-wasm/HAIR_STATE_STRIDE
|
|
159
|
+
:HAIR_HEAD_STATE_STRIDE polymer.runtime.embody-wasm/HAIR_HEAD_STATE_STRIDE
|
|
160
|
+
:HAIR_MORPH_OUTPUT_STRIDE polymer.runtime.embody-wasm/HAIR_MORPH_OUTPUT_STRIDE
|
|
161
|
+
:MESH_PROPORTIONS_STRIDE polymer.runtime.embody-wasm/MESH_PROPORTIONS_STRIDE
|
|
162
|
+
:TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE polymer.runtime.embody-wasm/TEMPLATE_SKELETON_FIT_SOLUTION_STRIDE
|
|
163
|
+
:TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE polymer.runtime.embody-wasm/TEMPLATE_SKELETON_FIT_TRANSFORM_STRIDE}}}}
|
|
164
|
+
|
|
165
|
+
:worker
|
|
166
|
+
{:target :browser
|
|
167
|
+
:output-dir "dist/worker"
|
|
168
|
+
:modules {:agency-worker {:init-fn polymer.worker/init}}}
|
|
169
|
+
|
|
170
|
+
:test
|
|
171
|
+
{:target :node-test
|
|
172
|
+
:output-to "dist/test.cjs"
|
|
173
|
+
:ns-regexp "polymer\\..*-test$"}}}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
(ns polymer.animation.agency
|
|
2
|
+
(:require [polymer.animation.planner :as planner]
|
|
3
|
+
[polymer.animation.runtime :as runtime]
|
|
4
|
+
[polymer.animation.scheduler :as scheduler]
|
|
5
|
+
[polymer.animation.state :as state]
|
|
6
|
+
[polymer.stream :as stream]))
|
|
7
|
+
|
|
8
|
+
;; Animation is Polymer's runtime-owning agency. Peer agencies send animation
|
|
9
|
+
;; requests as plain data; this agency plans those requests, schedules ordered
|
|
10
|
+
;; runtime work, and keeps the external animation handle lifecycle private.
|
|
11
|
+
|
|
12
|
+
(defn debug-flag-enabled? [name]
|
|
13
|
+
(try
|
|
14
|
+
(let [search (when (exists? js/window)
|
|
15
|
+
(.. js/window -location -search))
|
|
16
|
+
params (when search (js/URLSearchParams. search))
|
|
17
|
+
value (when params (.get params name))]
|
|
18
|
+
(or (= value "1") (= value "true")))
|
|
19
|
+
(catch :default _ false)))
|
|
20
|
+
|
|
21
|
+
(defn animation-debug-enabled? []
|
|
22
|
+
(or (debug-flag-enabled? "polymerVocalDebug")
|
|
23
|
+
(debug-flag-enabled? "polymerLipSyncDebug")))
|
|
24
|
+
|
|
25
|
+
(defn debug-log! [label payload]
|
|
26
|
+
(when (animation-debug-enabled?)
|
|
27
|
+
(.info js/console (str label " " (.stringify js/JSON (clj->js payload))))))
|
|
28
|
+
|
|
29
|
+
(defn create-animation-agency [config]
|
|
30
|
+
(let [runtime (runtime/config->runtime config)
|
|
31
|
+
input-stream (stream/create-stream)
|
|
32
|
+
event-stream (stream/create-stream)
|
|
33
|
+
state-atom (atom state/default-state)
|
|
34
|
+
disposed? (atom false)
|
|
35
|
+
emit-input (:emit input-stream)
|
|
36
|
+
emit-event (:emit event-stream)
|
|
37
|
+
animation-scheduler (scheduler/create-scheduler
|
|
38
|
+
{:runtime runtime
|
|
39
|
+
:state-atom state-atom
|
|
40
|
+
:emit-event emit-event
|
|
41
|
+
:disposed? disposed?
|
|
42
|
+
:debug-log! debug-log!})]
|
|
43
|
+
(letfn [(dispatch! [command]
|
|
44
|
+
(when-not @disposed?
|
|
45
|
+
(let [payload (js->clj command :keywordize-keys true)
|
|
46
|
+
requested-at (state/now-ms)]
|
|
47
|
+
(emit-input {:type "command"
|
|
48
|
+
:agency "animation"
|
|
49
|
+
:command payload})
|
|
50
|
+
((:enqueue-actions! animation-scheduler)
|
|
51
|
+
(planner/plan-command @state-atom payload requested-at)))))]
|
|
52
|
+
#js {:dispatch dispatch!
|
|
53
|
+
:snapshot (fn [] (state/visible-state @state-atom))
|
|
54
|
+
:input (stream/writable-port input-stream dispatch!)
|
|
55
|
+
:events (stream/readable-port event-stream)
|
|
56
|
+
:subscribeInput (fn [listener] ((:subscribe input-stream) listener))
|
|
57
|
+
:subscribeEvents (fn [listener] ((:subscribe event-stream) listener))
|
|
58
|
+
:subscribe (fn [listener] ((:subscribe event-stream) listener))
|
|
59
|
+
:subscribeStatus (fn [listener] ((:subscribe event-stream) listener))
|
|
60
|
+
:scheduleSnippet (fn [snippet options]
|
|
61
|
+
(dispatch! #js {:type "scheduleSnippet"
|
|
62
|
+
:sourceAgency "direct"
|
|
63
|
+
:snippet snippet
|
|
64
|
+
:options options}))
|
|
65
|
+
:removeSnippet (fn [name]
|
|
66
|
+
(dispatch! #js {:type "removeSnippet"
|
|
67
|
+
:sourceAgency "direct"
|
|
68
|
+
:name name}))
|
|
69
|
+
:seekSnippet (fn [name offset-sec]
|
|
70
|
+
(dispatch! #js {:type "seekSnippet"
|
|
71
|
+
:sourceAgency "direct"
|
|
72
|
+
:name name
|
|
73
|
+
:offsetSec offset-sec}))
|
|
74
|
+
:updateSnippet (fn [name params]
|
|
75
|
+
(dispatch! #js {:type "updateSnippet"
|
|
76
|
+
:sourceAgency "direct"
|
|
77
|
+
:name name
|
|
78
|
+
:params params}))
|
|
79
|
+
:dispose (fn []
|
|
80
|
+
(when-not @disposed?
|
|
81
|
+
(reset! disposed? true)
|
|
82
|
+
((:dispose! animation-scheduler))
|
|
83
|
+
((:dispose input-stream))
|
|
84
|
+
((:dispose event-stream))))})))
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
(ns polymer.animation.domain)
|
|
2
|
+
|
|
3
|
+
;; Domain functions describe Polymer animation data without touching a runtime.
|
|
4
|
+
;; They answer questions like "is this a typed viseme snippet?" and "which clip
|
|
5
|
+
;; options should a runtime receive?" so the scheduler can stay focused on
|
|
6
|
+
;; ordering and lifecycle.
|
|
7
|
+
|
|
8
|
+
(defn viseme-snippet-category? [category]
|
|
9
|
+
(= "visemeSnippet" category))
|
|
10
|
+
|
|
11
|
+
(defn typed-channels [snippet]
|
|
12
|
+
(let [channels (:channels snippet)]
|
|
13
|
+
(when (seq channels)
|
|
14
|
+
channels)))
|
|
15
|
+
|
|
16
|
+
(defn typed-channel-target [channel]
|
|
17
|
+
(:target channel))
|
|
18
|
+
|
|
19
|
+
(defn typed-viseme-channel? [channel]
|
|
20
|
+
(= "viseme" (:type (typed-channel-target channel))))
|
|
21
|
+
|
|
22
|
+
(defn typed-jaw-channel? [channel]
|
|
23
|
+
(let [target (typed-channel-target channel)]
|
|
24
|
+
(or (and (= "au" (:type target))
|
|
25
|
+
(= 26 (:id target)))
|
|
26
|
+
(and (= "bone" (:type target))
|
|
27
|
+
(= "JAW" (:id target))))))
|
|
28
|
+
|
|
29
|
+
(defn typed-viseme-snippet? [snippet]
|
|
30
|
+
(boolean (some typed-viseme-channel? (typed-channels snippet))))
|
|
31
|
+
|
|
32
|
+
(defn typed-jaw-snippet? [snippet]
|
|
33
|
+
(boolean (some typed-jaw-channel? (typed-channels snippet))))
|
|
34
|
+
|
|
35
|
+
(defn typed-channel-summary [snippet]
|
|
36
|
+
;; The summary is diagnostic-only. A transducer is appropriate here because
|
|
37
|
+
;; this is a pure map/reduce over channel data with no ordering side effects.
|
|
38
|
+
(into []
|
|
39
|
+
(map (fn [channel]
|
|
40
|
+
(let [keyframes (:keyframes channel)
|
|
41
|
+
peak (transduce (map :intensity) max 0 keyframes)]
|
|
42
|
+
{:target (:target channel)
|
|
43
|
+
:frames (count keyframes)
|
|
44
|
+
:firstSec (:time (first keyframes))
|
|
45
|
+
:lastSec (:time (last keyframes))
|
|
46
|
+
:peak peak})))
|
|
47
|
+
(or (typed-channels snippet) [])))
|
|
48
|
+
|
|
49
|
+
(defn explicit-auto-viseme-jaw [snippet]
|
|
50
|
+
(when (contains? snippet :autoVisemeJaw)
|
|
51
|
+
(:autoVisemeJaw snippet)))
|
|
52
|
+
|
|
53
|
+
(defn snippet->clip-options-map
|
|
54
|
+
([snippet options] (snippet->clip-options-map snippet options false))
|
|
55
|
+
([snippet options legacy-fallback?]
|
|
56
|
+
;; Typed channels carry their own namespace, so the normal Embody path does
|
|
57
|
+
;; not need snippetCategory. The legacy curve fallback still needs
|
|
58
|
+
;; "visemeSnippet" because older runtimes otherwise treat numeric lip ids as
|
|
59
|
+
;; facial AU ids.
|
|
60
|
+
(let [category (:snippetCategory snippet)
|
|
61
|
+
typed-viseme? (typed-viseme-snippet? snippet)
|
|
62
|
+
viseme-category? (or (viseme-snippet-category? category) typed-viseme?)
|
|
63
|
+
curves (or (:curves snippet) {})
|
|
64
|
+
has-jaw-curve? (or (contains? curves "26") (typed-jaw-snippet? snippet))
|
|
65
|
+
category-for-options (or category
|
|
66
|
+
(when (and legacy-fallback? typed-viseme?)
|
|
67
|
+
"visemeSnippet"))
|
|
68
|
+
loop? (boolean (:loop snippet))
|
|
69
|
+
loop-mode (or (:mixerLoopMode snippet) (if loop? "repeat" "once"))
|
|
70
|
+
playback-rate (or (:snippetPlaybackRate snippet) 1)
|
|
71
|
+
reverse? (boolean (:mixerReverse snippet))
|
|
72
|
+
signed-rate (if reverse? (- playback-rate) playback-rate)
|
|
73
|
+
intensity-scale (or (:snippetIntensityScale snippet) 1)
|
|
74
|
+
auto-viseme-jaw (if (contains? snippet :autoVisemeJaw)
|
|
75
|
+
(explicit-auto-viseme-jaw snippet)
|
|
76
|
+
(when (and viseme-category? has-jaw-curve?) false))]
|
|
77
|
+
(cond->
|
|
78
|
+
(merge
|
|
79
|
+
{:loop loop?
|
|
80
|
+
:loopMode loop-mode
|
|
81
|
+
:repeatCount (:mixerRepeatCount snippet)
|
|
82
|
+
:reverse reverse?
|
|
83
|
+
:priority (:snippetPriority snippet)
|
|
84
|
+
:playbackRate signed-rate
|
|
85
|
+
:rate signed-rate
|
|
86
|
+
:weight intensity-scale
|
|
87
|
+
:mixerWeight (:mixerWeight snippet)
|
|
88
|
+
:intensityScale intensity-scale
|
|
89
|
+
:balance (or (:snippetBalance snippet) 0)
|
|
90
|
+
:balanceMap (or (:snippetBalanceMap snippet) {})
|
|
91
|
+
:jawScale (or (:snippetJawScale snippet) 1)
|
|
92
|
+
:source "snippet"}
|
|
93
|
+
options)
|
|
94
|
+
category-for-options (assoc :snippetCategory category-for-options)
|
|
95
|
+
(some? auto-viseme-jaw) (assoc :autoVisemeJaw auto-viseme-jaw)))))
|
|
96
|
+
|
|
97
|
+
(defn snippet->clip-options [snippet options]
|
|
98
|
+
(clj->js (snippet->clip-options-map snippet options false)))
|
|
99
|
+
|
|
100
|
+
(defn snippet->legacy-clip-options [snippet options]
|
|
101
|
+
(clj->js (snippet->clip-options-map snippet options true)))
|
|
102
|
+
|
|
103
|
+
(defn schedule-log-payload [snippet options source-agency]
|
|
104
|
+
{:name (:name snippet)
|
|
105
|
+
:sourceAgency source-agency
|
|
106
|
+
:typed (boolean (typed-channels snippet))
|
|
107
|
+
:channelCount (count (typed-channels snippet))
|
|
108
|
+
:channels (typed-channel-summary snippet)
|
|
109
|
+
:curveKeys (vec (keys (or (:curves snippet) {})))
|
|
110
|
+
:options options})
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
(ns polymer.animation.planner
|
|
2
|
+
(:require [polymer.animation.state :as state]))
|
|
3
|
+
|
|
4
|
+
;; The planner turns input stream commands into scheduler actions. It does not
|
|
5
|
+
;; call runtimes, mutate handles, or emit events. Keeping those decisions as data
|
|
6
|
+
;; makes Animation easier to test and lets future agencies negotiate by sending
|
|
7
|
+
;; requests without knowing this agency's internals.
|
|
8
|
+
|
|
9
|
+
(defn source-agency [payload]
|
|
10
|
+
(or (:sourceAgency payload) "unknown"))
|
|
11
|
+
|
|
12
|
+
(defn error-action [message]
|
|
13
|
+
{:op :error
|
|
14
|
+
:message message})
|
|
15
|
+
|
|
16
|
+
(defn schedule-action [payload requested-at]
|
|
17
|
+
(let [source (source-agency payload)
|
|
18
|
+
fallback-name (str "polymer:animation:" requested-at)
|
|
19
|
+
snippet (assoc (:snippet payload)
|
|
20
|
+
:name (state/snippet-name (:snippet payload) fallback-name))
|
|
21
|
+
options (assoc (or (:options payload) {}) :sourceAgency source)]
|
|
22
|
+
{:op :schedule
|
|
23
|
+
:sourceAgency source
|
|
24
|
+
:requestedAt requested-at
|
|
25
|
+
:snippet snippet
|
|
26
|
+
:options options}))
|
|
27
|
+
|
|
28
|
+
(defn remove-action [payload]
|
|
29
|
+
{:op :remove
|
|
30
|
+
:sourceAgency (source-agency payload)
|
|
31
|
+
:name (:name payload)
|
|
32
|
+
:reason "requested"})
|
|
33
|
+
|
|
34
|
+
(defn seek-action [payload]
|
|
35
|
+
{:op :seek
|
|
36
|
+
:sourceAgency (source-agency payload)
|
|
37
|
+
:name (:name payload)
|
|
38
|
+
:offsetSec (max 0 (:offsetSec payload))})
|
|
39
|
+
|
|
40
|
+
(defn update-action [payload]
|
|
41
|
+
{:op :update
|
|
42
|
+
:sourceAgency (source-agency payload)
|
|
43
|
+
:name (:name payload)
|
|
44
|
+
:params (:params payload)})
|
|
45
|
+
|
|
46
|
+
(defn clear-action [current-state payload]
|
|
47
|
+
{:op :clear
|
|
48
|
+
:sourceAgency (source-agency payload)
|
|
49
|
+
:names (vec (keys (:scheduled current-state)))})
|
|
50
|
+
|
|
51
|
+
(defn plan-command [current-state payload requested-at]
|
|
52
|
+
(case (:type payload)
|
|
53
|
+
"scheduleSnippet"
|
|
54
|
+
(if (:snippet payload)
|
|
55
|
+
[(schedule-action payload requested-at)]
|
|
56
|
+
[(error-action "Animation scheduleSnippet command requires a snippet")])
|
|
57
|
+
|
|
58
|
+
"removeSnippet"
|
|
59
|
+
(if-let [_name (:name payload)]
|
|
60
|
+
[(remove-action payload)]
|
|
61
|
+
[(error-action "Animation removeSnippet command requires a name")])
|
|
62
|
+
|
|
63
|
+
"seekSnippet"
|
|
64
|
+
(cond
|
|
65
|
+
(not (:name payload))
|
|
66
|
+
[(error-action "Animation seekSnippet command requires a name")]
|
|
67
|
+
|
|
68
|
+
(not (number? (:offsetSec payload)))
|
|
69
|
+
[(error-action "Animation seekSnippet command requires offsetSec")]
|
|
70
|
+
|
|
71
|
+
:else
|
|
72
|
+
[(seek-action payload)])
|
|
73
|
+
|
|
74
|
+
"updateSnippet"
|
|
75
|
+
(cond
|
|
76
|
+
(not (:name payload))
|
|
77
|
+
[(error-action "Animation updateSnippet command requires a name")]
|
|
78
|
+
|
|
79
|
+
(not (map? (:params payload)))
|
|
80
|
+
[(error-action "Animation updateSnippet command requires params")]
|
|
81
|
+
|
|
82
|
+
:else
|
|
83
|
+
[(update-action payload)])
|
|
84
|
+
|
|
85
|
+
"clear"
|
|
86
|
+
[(clear-action current-state payload)]
|
|
87
|
+
|
|
88
|
+
[(error-action (str "Unknown Animation command: " (:type payload)))]))
|