@lovelace_lol/polymer 0.0.6 → 0.0.8

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.
Files changed (95) hide show
  1. package/README.md +434 -12
  2. package/dist/index.d.ts +1945 -244
  3. package/dist/index.js +1686 -1017
  4. package/dist/vision/face-worker.js +296 -0
  5. package/dist/vision/face_landmarker.task +0 -0
  6. package/dist/vision/manifest.edn +1 -0
  7. package/dist/vision/vision_bundle.js +2 -0
  8. package/dist/vision/wasm/vision_wasm_internal.js +8841 -0
  9. package/dist/vision/wasm/vision_wasm_internal.wasm +0 -0
  10. package/dist/vision/wasm/vision_wasm_module_internal.js +8837 -0
  11. package/dist/vision/wasm/vision_wasm_module_internal.wasm +0 -0
  12. package/dist/vision/wasm/vision_wasm_nosimd_internal.js +8832 -0
  13. package/dist/vision/wasm/vision_wasm_nosimd_internal.wasm +0 -0
  14. package/dist/worker/agency-worker.js +1276 -962
  15. package/dist/worker/manifest.edn +1 -1
  16. package/package.json +33 -20
  17. package/dist/test.cjs +0 -1519
  18. package/shadow-cljs.edn +0 -173
  19. package/src/polymer/animation/agency.cljs +0 -84
  20. package/src/polymer/animation/domain.cljs +0 -110
  21. package/src/polymer/animation/planner.cljs +0 -88
  22. package/src/polymer/animation/runtime.cljs +0 -137
  23. package/src/polymer/animation/scheduler.cljs +0 -178
  24. package/src/polymer/animation/service.cljs +0 -981
  25. package/src/polymer/animation/state.cljs +0 -112
  26. package/src/polymer/blink/agency.cljs +0 -131
  27. package/src/polymer/blink/planner.cljs +0 -115
  28. package/src/polymer/blink/scheduler.cljs +0 -90
  29. package/src/polymer/blink/snippet.cljs +0 -50
  30. package/src/polymer/blink/state.cljs +0 -102
  31. package/src/polymer/camera_context/agency.cljs +0 -132
  32. package/src/polymer/camera_context/domain.cljs +0 -186
  33. package/src/polymer/camera_context/planner.cljs +0 -50
  34. package/src/polymer/camera_context/scheduler.cljs +0 -113
  35. package/src/polymer/camera_context/state.cljs +0 -121
  36. package/src/polymer/character.cljs +0 -403
  37. package/src/polymer/conversation/agency.cljs +0 -83
  38. package/src/polymer/conversation/domain.cljs +0 -35
  39. package/src/polymer/conversation/effector.cljs +0 -130
  40. package/src/polymer/conversation/planner.cljs +0 -178
  41. package/src/polymer/conversation/scheduler.cljs +0 -202
  42. package/src/polymer/conversation/service.cljs +0 -329
  43. package/src/polymer/conversation/state.cljs +0 -186
  44. package/src/polymer/core.cljs +0 -172
  45. package/src/polymer/eye_head/agency.cljs +0 -75
  46. package/src/polymer/eye_head/domain.cljs +0 -133
  47. package/src/polymer/eye_head/goap.cljs +0 -106
  48. package/src/polymer/eye_head/scheduler.cljs +0 -176
  49. package/src/polymer/eye_head/service.cljs +0 -259
  50. package/src/polymer/eye_head/snippet.cljs +0 -92
  51. package/src/polymer/eye_head/state.cljs +0 -167
  52. package/src/polymer/gaze/agency.cljs +0 -85
  53. package/src/polymer/gaze/domain.cljs +0 -211
  54. package/src/polymer/gaze/goap.cljs +0 -208
  55. package/src/polymer/gaze/scheduler.cljs +0 -184
  56. package/src/polymer/gaze/state.cljs +0 -202
  57. package/src/polymer/gesture/agency.cljs +0 -185
  58. package/src/polymer/gesture/goap.cljs +0 -461
  59. package/src/polymer/gesture/scheduler.cljs +0 -122
  60. package/src/polymer/gesture/snippet.cljs +0 -198
  61. package/src/polymer/gesture/state.cljs +0 -273
  62. package/src/polymer/lipsync/agency.cljs +0 -593
  63. package/src/polymer/lipsync/articulation/jaw.cljs +0 -258
  64. package/src/polymer/lipsync/articulation/snippet.cljs +0 -605
  65. package/src/polymer/lipsync/articulation/tongue.cljs +0 -418
  66. package/src/polymer/lipsync/articulation/visemes.cljs +0 -429
  67. package/src/polymer/lipsync/goap.cljs +0 -132
  68. package/src/polymer/lipsync/pronunciation/effector.cljs +0 -51
  69. package/src/polymer/lipsync/scheduler.cljs +0 -302
  70. package/src/polymer/lipsync/state.cljs +0 -202
  71. package/src/polymer/nlp/phonemes.cljs +0 -164
  72. package/src/polymer/prosodic/agency.cljs +0 -196
  73. package/src/polymer/prosodic/goap.cljs +0 -122
  74. package/src/polymer/prosodic/scheduler.cljs +0 -99
  75. package/src/polymer/prosodic/snippet.cljs +0 -106
  76. package/src/polymer/prosodic/state.cljs +0 -139
  77. package/src/polymer/runtime/embody.cljs +0 -117
  78. package/src/polymer/runtime/embody_wasm.cljs +0 -177
  79. package/src/polymer/runtime/rust_embody_host.cljs +0 -647
  80. package/src/polymer/society.cljs +0 -253
  81. package/src/polymer/stream.cljs +0 -130
  82. package/src/polymer/transcription/agency.cljs +0 -69
  83. package/src/polymer/transcription/domain.cljs +0 -68
  84. package/src/polymer/transcription/effector.cljs +0 -611
  85. package/src/polymer/transcription/planner.cljs +0 -203
  86. package/src/polymer/transcription/scheduler.cljs +0 -225
  87. package/src/polymer/transcription/service.cljs +0 -209
  88. package/src/polymer/transcription/state.cljs +0 -239
  89. package/src/polymer/tts/agency.cljs +0 -503
  90. package/src/polymer/tts/azure.cljs +0 -290
  91. package/src/polymer/tts/planner.cljs +0 -178
  92. package/src/polymer/tts/runtime.cljs +0 -624
  93. package/src/polymer/tts/scheduler.cljs +0 -162
  94. package/src/polymer/tts/state.cljs +0 -191
  95. package/src/polymer/worker.cljs +0 -81
package/shadow-cljs.edn DELETED
@@ -1,173 +0,0 @@
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$"}}}
@@ -1,84 +0,0 @@
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))))})))
@@ -1,110 +0,0 @@
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})
@@ -1,88 +0,0 @@
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)))]))
@@ -1,137 +0,0 @@
1
- (ns polymer.animation.runtime
2
- (:require [polymer.animation.domain :as domain]))
3
-
4
- ;; Runtime functions are Animation's side-effect boundary. Everything here is
5
- ;; allowed to touch JavaScript handles or an injected animation engine; planner,
6
- ;; scheduler decision logic, and domain transforms are not.
7
-
8
- (defn js-callable? [value]
9
- (= "function" (goog/typeOf value)))
10
-
11
- (defn js-method [target name]
12
- (when target
13
- (let [method (aget target name)]
14
- (when (js-callable? method)
15
- method))))
16
-
17
- (defn call-js [target name & args]
18
- (when-let [method (js-method target name)]
19
- (.apply method target (to-array args))))
20
-
21
- (defn play-built-handle! [handle]
22
- (when-let [play (js-method handle "play")]
23
- (.call play handle))
24
- handle)
25
-
26
- (defn engine->runtime [engine]
27
- ;; Some callers still pass a larger engine object. Animation adapts it once
28
- ;; into the smaller runtime API it needs, keeping that dependency at this
29
- ;; boundary instead of leaking engine calls into other agencies.
30
- (let [runtime #js {:buildClip (fn [clip-name curves options]
31
- (call-js engine "buildClip" clip-name curves options))
32
- :playSnippet (fn [clip-name curves options]
33
- (or
34
- (call-js engine "playSnippet" #js {:name clip-name :curves curves} options)
35
- (let [handle (call-js engine "buildClip" clip-name curves options)]
36
- (play-built-handle! handle))))
37
- :updateClipParams (fn [clip-name params]
38
- (call-js engine "updateClipParams" clip-name params))
39
- :setSnippetTime (fn [clip-name offset-sec]
40
- (or (call-js engine "setSnippetTime" clip-name offset-sec)
41
- (call-js engine "seekSnippet" clip-name offset-sec)
42
- (call-js engine "seek" clip-name offset-sec)))
43
- :cleanupSnippet (fn [clip-name]
44
- (or (call-js engine "cleanupSnippet" clip-name)
45
- (call-js engine "stopAnimation" clip-name)))
46
- :getAnimationState (fn [clip-name]
47
- (call-js engine "getAnimationState" clip-name))}]
48
- (when (js-method engine "buildTypedClip")
49
- (aset runtime "buildTypedClip"
50
- (fn [clip-name channels options]
51
- (call-js engine "buildTypedClip" clip-name channels options))))
52
- (when (or (js-method engine "playTypedSnippet")
53
- (js-method engine "buildTypedClip"))
54
- (aset runtime "playTypedSnippet"
55
- (fn [snippet options]
56
- (let [clip-name (aget snippet "name")
57
- channels (aget snippet "channels")]
58
- (or
59
- (call-js engine "playTypedSnippet" snippet options)
60
- (play-built-handle!
61
- (call-js engine "buildTypedClip" clip-name channels options)))))))
62
- runtime))
63
-
64
- (defn config->runtime [config]
65
- (let [config (or config #js {})
66
- runtime (aget config "runtime")
67
- engine (aget config "engine")]
68
- (cond
69
- runtime runtime
70
- engine (engine->runtime engine)
71
- :else nil)))
72
-
73
- (defn typed-snippet-js [name channels]
74
- (clj->js {:name name :channels channels}))
75
-
76
- (defn play-typed-snippet! [runtime snippet options]
77
- (let [name (:name snippet)
78
- channels (domain/typed-channels snippet)
79
- channels-js (clj->js channels)
80
- clip-options (domain/snippet->clip-options snippet options)
81
- snippet-js (typed-snippet-js name channels)]
82
- (if (false? (:autoPlay options))
83
- (or (call-js runtime "buildTypedClip" name channels-js clip-options)
84
- (call-js runtime "playTypedSnippet" snippet-js clip-options))
85
- (or (call-js runtime "playTypedSnippet" snippet-js clip-options)
86
- (play-built-handle!
87
- (call-js runtime "buildTypedClip" name channels-js clip-options))))))
88
-
89
- (defn play-legacy-snippet! [runtime snippet options]
90
- (when-let [curves (:curves snippet)]
91
- (let [name (:name snippet)
92
- curves-js (clj->js curves)
93
- clip-options (domain/snippet->legacy-clip-options snippet options)]
94
- (if (false? (:autoPlay options))
95
- (or (call-js runtime "buildClip" name curves-js clip-options)
96
- (call-js runtime "playSnippet" name curves-js clip-options))
97
- (call-js runtime "playSnippet" name curves-js clip-options)))))
98
-
99
- (defn play-snippet! [runtime snippet options]
100
- ;; Typed snippets are Polymer's canonical animation contract. Legacy curve
101
- ;; playback is only a compatibility path for runtimes that have not adopted
102
- ;; typed channels yet.
103
- (if (domain/typed-channels snippet)
104
- (if (or (js-method runtime "playTypedSnippet")
105
- (js-method runtime "buildTypedClip"))
106
- (play-typed-snippet! runtime snippet options)
107
- (when (seq (:curves snippet))
108
- (play-legacy-snippet! runtime snippet options)))
109
- (play-legacy-snippet! runtime snippet options)))
110
-
111
- (defn cleanup-snippet! [runtime handle name]
112
- (when-let [stop (js-method handle "stop")]
113
- (.call stop handle))
114
- (when runtime
115
- (call-js runtime "cleanupSnippet" name)))
116
-
117
- (defn seek-snippet! [runtime handle name offset-sec]
118
- (let [normalized-offset (max 0 (or offset-sec 0))]
119
- (or (when handle
120
- (or (call-js handle "setTime" normalized-offset)
121
- (call-js handle "seek" normalized-offset)))
122
- (when runtime
123
- (or (call-js runtime "setSnippetTime" name normalized-offset)
124
- (call-js runtime "seekSnippet" name normalized-offset)
125
- (call-js runtime "seek" name normalized-offset)
126
- (call-js runtime "updateClipParams"
127
- name
128
- (clj->js {:time normalized-offset
129
- :offsetSec normalized-offset})))))))
130
-
131
- (defn update-snippet! [runtime handle name params]
132
- (let [params-js (clj->js params)]
133
- (or (when handle
134
- (or (call-js handle "updateParams" params-js)
135
- (call-js handle "setParams" params-js)))
136
- (when runtime
137
- (call-js runtime "updateClipParams" name params-js)))))