@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.
Files changed (85) hide show
  1. package/README.md +226 -0
  2. package/dist/index.d.ts +2603 -0
  3. package/dist/index.js +1031 -0
  4. package/dist/test.cjs +1519 -0
  5. package/dist/worker/agency-worker.js +972 -0
  6. package/dist/worker/manifest.edn +1 -0
  7. package/package.json +57 -0
  8. package/shadow-cljs.edn +173 -0
  9. package/src/polymer/animation/agency.cljs +84 -0
  10. package/src/polymer/animation/domain.cljs +110 -0
  11. package/src/polymer/animation/planner.cljs +88 -0
  12. package/src/polymer/animation/runtime.cljs +137 -0
  13. package/src/polymer/animation/scheduler.cljs +178 -0
  14. package/src/polymer/animation/service.cljs +981 -0
  15. package/src/polymer/animation/state.cljs +112 -0
  16. package/src/polymer/blink/agency.cljs +131 -0
  17. package/src/polymer/blink/planner.cljs +115 -0
  18. package/src/polymer/blink/scheduler.cljs +90 -0
  19. package/src/polymer/blink/snippet.cljs +50 -0
  20. package/src/polymer/blink/state.cljs +102 -0
  21. package/src/polymer/camera_context/agency.cljs +132 -0
  22. package/src/polymer/camera_context/domain.cljs +186 -0
  23. package/src/polymer/camera_context/planner.cljs +50 -0
  24. package/src/polymer/camera_context/scheduler.cljs +113 -0
  25. package/src/polymer/camera_context/state.cljs +121 -0
  26. package/src/polymer/character.cljs +471 -0
  27. package/src/polymer/conversation/agency.cljs +83 -0
  28. package/src/polymer/conversation/domain.cljs +35 -0
  29. package/src/polymer/conversation/effector.cljs +130 -0
  30. package/src/polymer/conversation/planner.cljs +178 -0
  31. package/src/polymer/conversation/scheduler.cljs +202 -0
  32. package/src/polymer/conversation/service.cljs +329 -0
  33. package/src/polymer/conversation/state.cljs +186 -0
  34. package/src/polymer/core.cljs +172 -0
  35. package/src/polymer/eye_head/agency.cljs +75 -0
  36. package/src/polymer/eye_head/domain.cljs +133 -0
  37. package/src/polymer/eye_head/goap.cljs +106 -0
  38. package/src/polymer/eye_head/scheduler.cljs +176 -0
  39. package/src/polymer/eye_head/service.cljs +259 -0
  40. package/src/polymer/eye_head/snippet.cljs +92 -0
  41. package/src/polymer/eye_head/state.cljs +167 -0
  42. package/src/polymer/gaze/agency.cljs +85 -0
  43. package/src/polymer/gaze/domain.cljs +211 -0
  44. package/src/polymer/gaze/goap.cljs +208 -0
  45. package/src/polymer/gaze/scheduler.cljs +184 -0
  46. package/src/polymer/gaze/state.cljs +202 -0
  47. package/src/polymer/gesture/agency.cljs +185 -0
  48. package/src/polymer/gesture/goap.cljs +461 -0
  49. package/src/polymer/gesture/scheduler.cljs +122 -0
  50. package/src/polymer/gesture/snippet.cljs +198 -0
  51. package/src/polymer/gesture/state.cljs +273 -0
  52. package/src/polymer/lipsync/agency.cljs +593 -0
  53. package/src/polymer/lipsync/articulation/jaw.cljs +258 -0
  54. package/src/polymer/lipsync/articulation/snippet.cljs +605 -0
  55. package/src/polymer/lipsync/articulation/tongue.cljs +418 -0
  56. package/src/polymer/lipsync/articulation/visemes.cljs +429 -0
  57. package/src/polymer/lipsync/goap.cljs +132 -0
  58. package/src/polymer/lipsync/pronunciation/effector.cljs +51 -0
  59. package/src/polymer/lipsync/scheduler.cljs +302 -0
  60. package/src/polymer/lipsync/state.cljs +202 -0
  61. package/src/polymer/nlp/phonemes.cljs +164 -0
  62. package/src/polymer/prosodic/agency.cljs +196 -0
  63. package/src/polymer/prosodic/goap.cljs +122 -0
  64. package/src/polymer/prosodic/scheduler.cljs +99 -0
  65. package/src/polymer/prosodic/snippet.cljs +106 -0
  66. package/src/polymer/prosodic/state.cljs +139 -0
  67. package/src/polymer/runtime/embody.cljs +117 -0
  68. package/src/polymer/runtime/embody_wasm.cljs +177 -0
  69. package/src/polymer/runtime/rust_embody_host.cljs +645 -0
  70. package/src/polymer/society.cljs +239 -0
  71. package/src/polymer/stream.cljs +130 -0
  72. package/src/polymer/transcription/agency.cljs +69 -0
  73. package/src/polymer/transcription/domain.cljs +68 -0
  74. package/src/polymer/transcription/effector.cljs +611 -0
  75. package/src/polymer/transcription/planner.cljs +203 -0
  76. package/src/polymer/transcription/scheduler.cljs +225 -0
  77. package/src/polymer/transcription/service.cljs +209 -0
  78. package/src/polymer/transcription/state.cljs +239 -0
  79. package/src/polymer/tts/agency.cljs +503 -0
  80. package/src/polymer/tts/azure.cljs +290 -0
  81. package/src/polymer/tts/planner.cljs +178 -0
  82. package/src/polymer/tts/runtime.cljs +624 -0
  83. package/src/polymer/tts/scheduler.cljs +162 -0
  84. package/src/polymer/tts/state.cljs +191 -0
  85. 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
+ }
@@ -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)))]))