@felbrasil/dreamy 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +69 -2
- package/dist/api.d.ts +1 -0
- package/dist/api.js +2 -0
- package/dist/api.js.map +7 -0
- package/dist/chunks/chunk-72DMUKP3.js +1470 -0
- package/dist/chunks/chunk-72DMUKP3.js.map +7 -0
- package/dist/chunks/chunk-VZMBE5MV.js +5936 -0
- package/dist/chunks/chunk-VZMBE5MV.js.map +7 -0
- package/dist/chunks/chunk-ZU72KKME.js +8600 -0
- package/dist/chunks/chunk-ZU72KKME.js.map +7 -0
- package/dist/core.d.ts +1 -0
- package/dist/core.js +34 -0
- package/dist/core.js.map +7 -0
- package/dist/dreamy_evaluator.wasm +0 -0
- package/dist/evaluator.d.ts +1 -0
- package/dist/evaluator.js +52 -0
- package/dist/evaluator.js.map +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7280 -0
- package/dist/index.js.map +7 -0
- package/dist/styles.css +1 -0
- package/dist/types/api/src/commands/command.d.ts +7 -0
- package/dist/types/api/src/commands/decal-commands.d.ts +35 -0
- package/dist/types/api/src/commands/palette-commands.d.ts +14 -0
- package/dist/types/api/src/commands/rig-commands.d.ts +229 -0
- package/dist/types/api/src/commands/scene-commands.d.ts +64 -0
- package/dist/types/api/src/commands/sculpt-commands.d.ts +111 -0
- package/dist/types/api/src/commands/stamp-spec.d.ts +3 -0
- package/dist/types/api/src/commands/target.d.ts +8 -0
- package/dist/types/api/src/creation-api.d.ts +52 -0
- package/dist/types/api/src/events/creation-event.d.ts +7 -0
- package/dist/types/api/src/events/decal-events.d.ts +20 -0
- package/dist/types/api/src/events/event-of.d.ts +6 -0
- package/dist/types/api/src/events/palette-events.d.ts +8 -0
- package/dist/types/api/src/events/rig-events.d.ts +161 -0
- package/dist/types/api/src/events/scene-events.d.ts +34 -0
- package/dist/types/api/src/events/sculpt-events.d.ts +53 -0
- package/dist/types/api/src/id.d.ts +1 -0
- package/dist/types/api/src/index.d.ts +31 -0
- package/dist/types/api/src/model/creation.d.ts +22 -0
- package/dist/types/api/src/model/decal.d.ts +48 -0
- package/dist/types/api/src/model/look.d.ts +56 -0
- package/dist/types/api/src/model/math.d.ts +18 -0
- package/dist/types/api/src/model/palette.d.ts +11 -0
- package/dist/types/api/src/model/rig.d.ts +125 -0
- package/dist/types/api/src/model/scene-object.d.ts +22 -0
- package/dist/types/api/src/model/sculpt.d.ts +13 -0
- package/dist/types/api/src/model/stamp.d.ts +53 -0
- package/dist/types/api/src/model/wing.d.ts +35 -0
- package/dist/types/api/src/ports/basic-ports.d.ts +7 -0
- package/dist/types/api/src/ports/evaluator.d.ts +62 -0
- package/dist/types/api/src/ports/persistence.d.ts +89 -0
- package/dist/types/api/src/ports/viewport.d.ts +125 -0
- package/dist/types/core/src/apply/body-part-added.d.ts +2 -0
- package/dist/types/core/src/apply/body-part-removed.d.ts +2 -0
- package/dist/types/core/src/apply/bone-removed.d.ts +3 -0
- package/dist/types/core/src/apply/bone-renamed.d.ts +2 -0
- package/dist/types/core/src/apply/bone-reparented.d.ts +2 -0
- package/dist/types/core/src/apply/bone-sizes-set.d.ts +3 -0
- package/dist/types/core/src/apply/bone-tags-set.d.ts +2 -0
- package/dist/types/core/src/apply/bone-transforms-set.d.ts +6 -0
- package/dist/types/core/src/apply/bones-added.d.ts +2 -0
- package/dist/types/core/src/apply/creature-generated.d.ts +3 -0
- package/dist/types/core/src/apply/decal-removed.d.ts +2 -0
- package/dist/types/core/src/apply/decals-added.d.ts +2 -0
- package/dist/types/core/src/apply/design-deleted.d.ts +2 -0
- package/dist/types/core/src/apply/design-saved.d.ts +2 -0
- package/dist/types/core/src/apply/flat-wings-set.d.ts +2 -0
- package/dist/types/core/src/apply/object-renamed.d.ts +2 -0
- package/dist/types/core/src/apply/object-reparented.d.ts +2 -0
- package/dist/types/core/src/apply/object-transforms-set.d.ts +2 -0
- package/dist/types/core/src/apply/objects-deleted.d.ts +2 -0
- package/dist/types/core/src/apply/objects-duplicated.d.ts +3 -0
- package/dist/types/core/src/apply/palette-color-set.d.ts +2 -0
- package/dist/types/core/src/apply/palette-reset.d.ts +2 -0
- package/dist/types/core/src/apply/part-grafted.d.ts +3 -0
- package/dist/types/core/src/apply/part-slot-swapped.d.ts +3 -0
- package/dist/types/core/src/apply/pivot-set.d.ts +2 -0
- package/dist/types/core/src/apply/pose-preset-applied.d.ts +3 -0
- package/dist/types/core/src/apply/pose-reset.d.ts +3 -0
- package/dist/types/core/src/apply/premade-applied.d.ts +3 -0
- package/dist/types/core/src/apply/region-blend-set.d.ts +3 -0
- package/dist/types/core/src/apply/rig-created.d.ts +2 -0
- package/dist/types/core/src/apply/rig-mirror-set.d.ts +2 -0
- package/dist/types/core/src/apply/rig-mode-set.d.ts +2 -0
- package/dist/types/core/src/apply/sculpt-created.d.ts +2 -0
- package/dist/types/core/src/apply/sculpt-look-set.d.ts +3 -0
- package/dist/types/core/src/apply/smear-group-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamp-placements-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamp-props-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamps-added.d.ts +2 -0
- package/dist/types/core/src/apply/stamps-removed.d.ts +2 -0
- package/dist/types/core/src/apply/symmetry-set-for-all.d.ts +2 -0
- package/dist/types/core/src/atoms/check/check.d.ts +7 -0
- package/dist/types/core/src/atoms/decal/decal-limits.d.ts +6 -0
- package/dist/types/core/src/atoms/decal/decal-problem.d.ts +4 -0
- package/dist/types/core/src/atoms/decal/design-problem.d.ts +4 -0
- package/dist/types/core/src/atoms/look/catalogs.d.ts +9 -0
- package/dist/types/core/src/atoms/look/default-look.d.ts +4 -0
- package/dist/types/core/src/atoms/look/look-problem.d.ts +7 -0
- package/dist/types/core/src/atoms/look/merge-look.d.ts +3 -0
- package/dist/types/core/src/atoms/math/mat4.d.ts +14 -0
- package/dist/types/core/src/atoms/math/quat.d.ts +18 -0
- package/dist/types/core/src/atoms/math/transform.d.ts +7 -0
- package/dist/types/core/src/atoms/math/vec3.d.ts +18 -0
- package/dist/types/core/src/atoms/palette/default-palette.d.ts +4 -0
- package/dist/types/core/src/atoms/palette/is-color-ref.d.ts +2 -0
- package/dist/types/core/src/atoms/palette/poc-color-ref.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/bone-matrices.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/bone-region.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/bone-role.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/bone-size.d.ts +7 -0
- package/dist/types/core/src/atoms/rig/compose-local.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/find-rig.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/mirror-partner.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/mirror-sculpt.d.ts +9 -0
- package/dist/types/core/src/atoms/rig/mirror-transform.d.ts +9 -0
- package/dist/types/core/src/atoms/rig/partner-target.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/pose-presets.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/pose-rule.d.ts +48 -0
- package/dist/types/core/src/atoms/rig/pose-template-rules.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/rebase-pose.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/resize-bones.d.ts +12 -0
- package/dist/types/core/src/atoms/rig/rig-extent.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/side-from-name.d.ts +7 -0
- package/dist/types/core/src/atoms/rig/size-frame.d.ts +18 -0
- package/dist/types/core/src/atoms/rig/with-slot-parts.d.ts +9 -0
- package/dist/types/core/src/atoms/scene/copy-with-new-ids.d.ts +7 -0
- package/dist/types/core/src/atoms/scene/object-tree.d.ts +8 -0
- package/dist/types/core/src/atoms/scene/place-in-order.d.ts +7 -0
- package/dist/types/core/src/atoms/scene/unique-name.d.ts +4 -0
- package/dist/types/core/src/atoms/scene/world-matrix.d.ts +4 -0
- package/dist/types/core/src/atoms/sculpt/all-sculpts.d.ts +3 -0
- package/dist/types/core/src/atoms/sculpt/is-wing-target.d.ts +3 -0
- package/dist/types/core/src/atoms/sculpt/target-sculpt.d.ts +10 -0
- package/dist/types/core/src/atoms/sculpt/update-target.d.ts +8 -0
- package/dist/types/core/src/atoms/stamp/apply-stamp-props.d.ts +11 -0
- package/dist/types/core/src/atoms/stamp/clamp-symmetry.d.ts +11 -0
- package/dist/types/core/src/atoms/stamp/clean-props.d.ts +3 -0
- package/dist/types/core/src/atoms/stamp/emptied-groups.d.ts +3 -0
- package/dist/types/core/src/atoms/stamp/move-locked-groups.d.ts +12 -0
- package/dist/types/core/src/atoms/stamp/normalize-base.d.ts +6 -0
- package/dist/types/core/src/atoms/stamp/resolve-stamp-props.d.ts +14 -0
- package/dist/types/core/src/atoms/stamp/smear.d.ts +15 -0
- package/dist/types/core/src/atoms/stamp/stamp-problem.d.ts +7 -0
- package/dist/types/core/src/atoms/wing/wing-problem.d.ts +6 -0
- package/dist/types/core/src/create-creation-api.d.ts +12 -0
- package/dist/types/core/src/decide.d.ts +4 -0
- package/dist/types/core/src/empty-creation.d.ts +2 -0
- package/dist/types/core/src/fold.d.ts +6 -0
- package/dist/types/core/src/index.d.ts +9 -0
- package/dist/types/core/src/molecules/add-body-part.d.ts +8 -0
- package/dist/types/core/src/molecules/add-bone.d.ts +8 -0
- package/dist/types/core/src/molecules/add-decals.d.ts +4 -0
- package/dist/types/core/src/molecules/add-stamps.d.ts +8 -0
- package/dist/types/core/src/molecules/apply-pose-preset.d.ts +4 -0
- package/dist/types/core/src/molecules/apply-premade.d.ts +9 -0
- package/dist/types/core/src/molecules/auto-tag-sides.d.ts +4 -0
- package/dist/types/core/src/molecules/create-rig.d.ts +4 -0
- package/dist/types/core/src/molecules/create-sculpt.d.ts +4 -0
- package/dist/types/core/src/molecules/delete-design.d.ts +4 -0
- package/dist/types/core/src/molecules/delete-objects.d.ts +4 -0
- package/dist/types/core/src/molecules/duplicate-objects.d.ts +6 -0
- package/dist/types/core/src/molecules/generate-creature.d.ts +7 -0
- package/dist/types/core/src/molecules/graft-part.d.ts +4 -0
- package/dist/types/core/src/molecules/mirror-objects.d.ts +7 -0
- package/dist/types/core/src/molecules/molecule.d.ts +17 -0
- package/dist/types/core/src/molecules/remove-body-part.d.ts +3 -0
- package/dist/types/core/src/molecules/remove-bone.d.ts +4 -0
- package/dist/types/core/src/molecules/remove-decal.d.ts +3 -0
- package/dist/types/core/src/molecules/remove-smear-group.d.ts +4 -0
- package/dist/types/core/src/molecules/remove-stamps.d.ts +4 -0
- package/dist/types/core/src/molecules/rename-bone.d.ts +3 -0
- package/dist/types/core/src/molecules/rename-object.d.ts +3 -0
- package/dist/types/core/src/molecules/reparent-bone.d.ts +4 -0
- package/dist/types/core/src/molecules/reparent-object.d.ts +4 -0
- package/dist/types/core/src/molecules/reset-palette.d.ts +3 -0
- package/dist/types/core/src/molecules/reset-pose.d.ts +3 -0
- package/dist/types/core/src/molecules/save-design.d.ts +4 -0
- package/dist/types/core/src/molecules/set-bone-sizes.d.ts +8 -0
- package/dist/types/core/src/molecules/set-bone-tags.d.ts +4 -0
- package/dist/types/core/src/molecules/set-bone-transforms.d.ts +7 -0
- package/dist/types/core/src/molecules/set-flat-wings.d.ts +4 -0
- package/dist/types/core/src/molecules/set-object-transforms.d.ts +3 -0
- package/dist/types/core/src/molecules/set-palette-color.d.ts +3 -0
- package/dist/types/core/src/molecules/set-pivot.d.ts +3 -0
- package/dist/types/core/src/molecules/set-region-blend.d.ts +4 -0
- package/dist/types/core/src/molecules/set-rig-mirror.d.ts +3 -0
- package/dist/types/core/src/molecules/set-rig-mode.d.ts +3 -0
- package/dist/types/core/src/molecules/set-sculpt-look.d.ts +7 -0
- package/dist/types/core/src/molecules/set-smear-group.d.ts +4 -0
- package/dist/types/core/src/molecules/set-stamp-placements.d.ts +4 -0
- package/dist/types/core/src/molecules/set-stamp-props.d.ts +3 -0
- package/dist/types/core/src/molecules/set-symmetry-for-all.d.ts +4 -0
- package/dist/types/core/src/molecules/swap-part-slot.d.ts +7 -0
- package/dist/types/core/src/premades/ant-bake.d.ts +2 -0
- package/dist/types/core/src/premades/bake-authoring.d.ts +35 -0
- package/dist/types/core/src/premades/bake-types.d.ts +65 -0
- package/dist/types/core/src/premades/baked-part-for.d.ts +11 -0
- package/dist/types/core/src/premades/bee-bake.d.ts +2 -0
- package/dist/types/core/src/premades/bird-bake.d.ts +2 -0
- package/dist/types/core/src/premades/body-stamps-for-bone.d.ts +14 -0
- package/dist/types/core/src/premades/bone-tree.d.ts +15 -0
- package/dist/types/core/src/premades/build-premade-rig.d.ts +23 -0
- package/dist/types/core/src/premades/build-template.d.ts +6 -0
- package/dist/types/core/src/premades/centipede-bake.d.ts +2 -0
- package/dist/types/core/src/premades/coat-stamps.d.ts +3 -0
- package/dist/types/core/src/premades/crab-bake.d.ts +2 -0
- package/dist/types/core/src/premades/dragon-bake.d.ts +2 -0
- package/dist/types/core/src/premades/face-decals.d.ts +17 -0
- package/dist/types/core/src/premades/fish-bake.d.ts +2 -0
- package/dist/types/core/src/premades/fit-part-slot.d.ts +21 -0
- package/dist/types/core/src/premades/generate-creature.d.ts +21 -0
- package/dist/types/core/src/premades/gorilla-bake.d.ts +2 -0
- package/dist/types/core/src/premades/graft-slot.d.ts +34 -0
- package/dist/types/core/src/premades/humanoid-bake.d.ts +2 -0
- package/dist/types/core/src/premades/insect6-bake.d.ts +2 -0
- package/dist/types/core/src/premades/jellyfish-bake.d.ts +2 -0
- package/dist/types/core/src/premades/lizard-bake.d.ts +2 -0
- package/dist/types/core/src/premades/make-baked-part.d.ts +9 -0
- package/dist/types/core/src/premades/make-body-part.d.ts +9 -0
- package/dist/types/core/src/premades/make-flat-part.d.ts +13 -0
- package/dist/types/core/src/premades/part-context.d.ts +20 -0
- package/dist/types/core/src/premades/part-kits.d.ts +36 -0
- package/dist/types/core/src/premades/part-slots.d.ts +17 -0
- package/dist/types/core/src/premades/part-stamp.d.ts +13 -0
- package/dist/types/core/src/premades/part-styles.d.ts +44 -0
- package/dist/types/core/src/premades/premade-fit.d.ts +18 -0
- package/dist/types/core/src/premades/premade-infos.d.ts +3 -0
- package/dist/types/core/src/premades/reseat-attachments.d.ts +31 -0
- package/dist/types/core/src/premades/rig-builder.d.ts +51 -0
- package/dist/types/core/src/premades/rodent-bake.d.ts +2 -0
- package/dist/types/core/src/premades/scorpion-bake.d.ts +2 -0
- package/dist/types/core/src/premades/shark-bake.d.ts +2 -0
- package/dist/types/core/src/premades/sitter-bake.d.ts +3 -0
- package/dist/types/core/src/premades/skeleton-bakes.d.ts +4 -0
- package/dist/types/core/src/premades/snake-bake.d.ts +2 -0
- package/dist/types/core/src/premades/spider-bake.d.ts +2 -0
- package/dist/types/core/src/premades/stamps-box.d.ts +9 -0
- package/dist/types/core/src/premades/style-for-bone.d.ts +7 -0
- package/dist/types/core/src/premades/swap-slot.d.ts +13 -0
- package/dist/types/core/src/premades/template-catalog.d.ts +20 -0
- package/dist/types/core/src/premades/template-color.d.ts +9 -0
- package/dist/types/core/src/premades/turtle-bake.d.ts +2 -0
- package/dist/types/core/src/premades/variants/aquatic-variants.d.ts +16 -0
- package/dist/types/core/src/premades/variants/coat-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/ear-variants.d.ts +8 -0
- package/dist/types/core/src/premades/variants/fantasy-more-variants.d.ts +3 -0
- package/dist/types/core/src/premades/variants/fantasy-variants.d.ts +17 -0
- package/dist/types/core/src/premades/variants/head-variants.d.ts +9 -0
- package/dist/types/core/src/premades/variants/horn-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/index.d.ts +10 -0
- package/dist/types/core/src/premades/variants/land-variants.d.ts +3 -0
- package/dist/types/core/src/premades/variants/leg-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/part-variant.d.ts +14 -0
- package/dist/types/core/src/premades/variants/tail-variants.d.ts +6 -0
- package/dist/types/core/src/premades/variants/variant-authoring.d.ts +29 -0
- package/dist/types/core/src/premades/whale-bake.d.ts +2 -0
- package/dist/types/core/src/premades/wing-defaults.d.ts +4 -0
- package/dist/types/core/src/premades/wing-frame.d.ts +10 -0
- package/dist/types/core/src/premades/wolf-bake.d.ts +2 -0
- package/dist/types/core/src/premades/worm-bake.d.ts +2 -0
- package/dist/types/evaluator/src/abi.d.ts +64 -0
- package/dist/types/evaluator/src/chunks.d.ts +53 -0
- package/dist/types/evaluator/src/index.d.ts +11 -0
- package/dist/types/evaluator/src/prep/colors.d.ts +11 -0
- package/dist/types/evaluator/src/prep/mat3.d.ts +13 -0
- package/dist/types/evaluator/src/prep/pack.d.ts +23 -0
- package/dist/types/evaluator/src/prep/props.d.ts +16 -0
- package/dist/types/evaluator/src/prep/symmetry.d.ts +23 -0
- package/dist/types/evaluator/src/reference/core.d.ts +3 -0
- package/dist/types/evaluator/src/reference/mesher.d.ts +22 -0
- package/dist/types/evaluator/src/reference/skin.d.ts +8 -0
- package/dist/types/evaluator/src/session.d.ts +21 -0
- package/dist/types/evaluator/src/wasm/core.d.ts +9 -0
- package/dist/types/evaluator/src/worker/client.d.ts +28 -0
- package/dist/types/evaluator/src/worker/host.d.ts +8 -0
- package/dist/types/evaluator/src/worker/protocol.d.ts +39 -0
- package/dist/types/evaluator/src/worker/spawn.d.ts +6 -0
- package/dist/types/evaluator/src/worker/worker-inline.d.ts +1 -0
- package/dist/types/evaluator/src/worker/worker.d.ts +1 -0
- package/dist/types/module/src/index.d.ts +2 -0
- package/dist/types/module/src/ui/atoms/action-button.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/badge.d.ts +9 -0
- package/dist/types/module/src/ui/atoms/checkbox.d.ts +6 -0
- package/dist/types/module/src/ui/atoms/color-input.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/hex-chip.d.ts +5 -0
- package/dist/types/module/src/ui/atoms/icon-button.d.ts +14 -0
- package/dist/types/module/src/ui/atoms/icon.d.ts +8 -0
- package/dist/types/module/src/ui/atoms/kbd.d.ts +4 -0
- package/dist/types/module/src/ui/atoms/match-button.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/number-input.d.ts +11 -0
- package/dist/types/module/src/ui/atoms/pill-button.d.ts +11 -0
- package/dist/types/module/src/ui/atoms/range-input.d.ts +17 -0
- package/dist/types/module/src/ui/atoms/select-input.d.ts +12 -0
- package/dist/types/module/src/ui/atoms/separator.d.ts +2 -0
- package/dist/types/module/src/ui/atoms/side-button.d.ts +13 -0
- package/dist/types/module/src/ui/atoms/swatch.d.ts +13 -0
- package/dist/types/module/src/ui/atoms/tool-button.d.ts +22 -0
- package/dist/types/module/src/ui/hooks/editor-actions.d.ts +50 -0
- package/dist/types/module/src/ui/hooks/editor-context.d.ts +37 -0
- package/dist/types/module/src/ui/hooks/use-compact.d.ts +2 -0
- package/dist/types/module/src/ui/hooks/use-editor-controller.d.ts +17 -0
- package/dist/types/module/src/ui/hooks/use-keyboard.d.ts +11 -0
- package/dist/types/module/src/ui/lib/catalog.d.ts +76 -0
- package/dist/types/module/src/ui/lib/colors.d.ts +15 -0
- package/dist/types/module/src/ui/lib/decals.d.ts +6 -0
- package/dist/types/module/src/ui/lib/design-geometry.d.ts +60 -0
- package/dist/types/module/src/ui/lib/math.d.ts +18 -0
- package/dist/types/module/src/ui/lib/placement.d.ts +8 -0
- package/dist/types/module/src/ui/lib/scene.d.ts +51 -0
- package/dist/types/module/src/ui/lib/symmetry.d.ts +5 -0
- package/dist/types/module/src/ui/lib/targets.d.ts +28 -0
- package/dist/types/module/src/ui/lib/view-state.d.ts +74 -0
- package/dist/types/module/src/ui/molecules/axis-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/color-field.d.ts +14 -0
- package/dist/types/module/src/ui/molecules/count-stepper.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/floating-panel.d.ts +26 -0
- package/dist/types/module/src/ui/molecules/help-row.d.ts +8 -0
- package/dist/types/module/src/ui/molecules/inline-edit.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/list-row.d.ts +25 -0
- package/dist/types/module/src/ui/molecules/modal.d.ts +11 -0
- package/dist/types/module/src/ui/molecules/mode-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/scroll-row.d.ts +10 -0
- package/dist/types/module/src/ui/molecules/slider-row.d.ts +16 -0
- package/dist/types/module/src/ui/molecules/swatch-row.d.ts +11 -0
- package/dist/types/module/src/ui/molecules/tab-bar.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/toolbar-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/toolbar.d.ts +10 -0
- package/dist/types/module/src/ui/molecules/vec3-field.d.ts +10 -0
- package/dist/types/module/src/ui/organisms/bone-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/bone-size-sliders.d.ts +9 -0
- package/dist/types/module/src/ui/organisms/category-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/decal-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/decal-editor.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/fleck-style-tab.d.ts +7 -0
- package/dist/types/module/src/ui/organisms/git-sync-panel.d.ts +10 -0
- package/dist/types/module/src/ui/organisms/help-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/material-tab.d.ts +3 -0
- package/dist/types/module/src/ui/organisms/object-list-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/palette-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/parts-tab.d.ts +26 -0
- package/dist/types/module/src/ui/organisms/pattern-tab.d.ts +3 -0
- package/dist/types/module/src/ui/organisms/pose-tab.d.ts +8 -0
- package/dist/types/module/src/ui/organisms/premade-picker.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/properties-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/region-blends.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/rendering-bar.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/rig-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/scenes-modal.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/select-hint.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/shape-list-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/side-dock.d.ts +4 -0
- package/dist/types/module/src/ui/organisms/stamp-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/stamp-props-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/stamp-size-panel.d.ts +4 -0
- package/dist/types/module/src/ui/organisms/stats-badge.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/style-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/symmetry-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/toast.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/token-guide.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/touch-mods.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/transform-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/transform-tab.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/utilities-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/viewport-host.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/voxel-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/wing-tab.d.ts +10 -0
- package/dist/types/module/src/ui/pages/editor-page.d.ts +9 -0
- package/dist/types/module/src/ui/templates/editor-shell.d.ts +2 -0
- package/dist/types/studio/src/browser-files.d.ts +3 -0
- package/dist/types/studio/src/clock.d.ts +2 -0
- package/dist/types/studio/src/creation-file.d.ts +21 -0
- package/dist/types/studio/src/git-remote.d.ts +36 -0
- package/dist/types/studio/src/git-sync.d.ts +33 -0
- package/dist/types/studio/src/ids.d.ts +3 -0
- package/dist/types/studio/src/index.d.ts +15 -0
- package/dist/types/studio/src/indexed-db-library.d.ts +2 -0
- package/dist/types/studio/src/library-persistence.d.ts +29 -0
- package/dist/types/studio/src/library-sync.d.ts +29 -0
- package/dist/types/studio/src/preferences.d.ts +9 -0
- package/dist/types/studio/src/seed.d.ts +3 -0
- package/dist/types/studio/src/studio.d.ts +17 -0
- package/dist/types/viewport/src/create-viewport.d.ts +10 -0
- package/dist/types/viewport/src/decals/builtin-art.d.ts +19 -0
- package/dist/types/viewport/src/decals/builtin-docs.d.ts +7 -0
- package/dist/types/viewport/src/decals/decal-atlas.d.ts +37 -0
- package/dist/types/viewport/src/decals/decal-catalog.d.ts +17 -0
- package/dist/types/viewport/src/decals/decal-glsl.d.ts +2 -0
- package/dist/types/viewport/src/decals/decal-limits.d.ts +11 -0
- package/dist/types/viewport/src/decals/decal-uniforms.d.ts +40 -0
- package/dist/types/viewport/src/decals/design-raster.d.ts +8 -0
- package/dist/types/viewport/src/decals/interior-thumbs.d.ts +6 -0
- package/dist/types/viewport/src/index.d.ts +1 -0
- package/dist/types/viewport/src/interaction/bone-tool.d.ts +13 -0
- package/dist/types/viewport/src/interaction/bones-visible.d.ts +7 -0
- package/dist/types/viewport/src/interaction/cursor.d.ts +3 -0
- package/dist/types/viewport/src/interaction/decal-tool.d.ts +18 -0
- package/dist/types/viewport/src/interaction/esc-hold.d.ts +13 -0
- package/dist/types/viewport/src/interaction/ghost-geometry.d.ts +6 -0
- package/dist/types/viewport/src/interaction/gizmo.d.ts +34 -0
- package/dist/types/viewport/src/interaction/interaction-context.d.ts +41 -0
- package/dist/types/viewport/src/interaction/marquee.d.ts +8 -0
- package/dist/types/viewport/src/interaction/pivot-helper.d.ts +13 -0
- package/dist/types/viewport/src/interaction/select-tool.d.ts +30 -0
- package/dist/types/viewport/src/interaction/selection-boxes.d.ts +11 -0
- package/dist/types/viewport/src/interaction/stamp-tool.d.ts +41 -0
- package/dist/types/viewport/src/interaction/stamp-wires.d.ts +18 -0
- package/dist/types/viewport/src/interaction/surface-hit.d.ts +14 -0
- package/dist/types/viewport/src/materials/fleck-material.d.ts +69 -0
- package/dist/types/viewport/src/materials/global-uniforms.d.ts +15 -0
- package/dist/types/viewport/src/materials/skin.d.ts +18 -0
- package/dist/types/viewport/src/materials/wing-material.d.ts +21 -0
- package/dist/types/viewport/src/math/colors.d.ts +29 -0
- package/dist/types/viewport/src/math/convert.d.ts +15 -0
- package/dist/types/viewport/src/math/decal-pose.d.ts +7 -0
- package/dist/types/viewport/src/math/lod.d.ts +16 -0
- package/dist/types/viewport/src/math/picking.d.ts +32 -0
- package/dist/types/viewport/src/math/pixel-palette.d.ts +15 -0
- package/dist/types/viewport/src/math/screen.d.ts +26 -0
- package/dist/types/viewport/src/math/skeleton-math.d.ts +32 -0
- package/dist/types/viewport/src/math/smear.d.ts +20 -0
- package/dist/types/viewport/src/math/symmetry.d.ts +21 -0
- package/dist/types/viewport/src/objects/default-look.d.ts +3 -0
- package/dist/types/viewport/src/objects/mesh-driver.d.ts +26 -0
- package/dist/types/viewport/src/objects/mesh-key.d.ts +8 -0
- package/dist/types/viewport/src/objects/rig-view.d.ts +31 -0
- package/dist/types/viewport/src/objects/scene-views.d.ts +53 -0
- package/dist/types/viewport/src/objects/sculpt-view.d.ts +66 -0
- package/dist/types/viewport/src/objects/view-context.d.ts +19 -0
- package/dist/types/viewport/src/objects/wing-view.d.ts +27 -0
- package/dist/types/viewport/src/rig/bone-viz.d.ts +13 -0
- package/dist/types/viewport/src/scene/camera-motion.d.ts +10 -0
- package/dist/types/viewport/src/scene/camera-sun.d.ts +3 -0
- package/dist/types/viewport/src/scene/environment.d.ts +3 -0
- package/dist/types/viewport/src/scene/frame-camera.d.ts +10 -0
- package/dist/types/viewport/src/scene/play-mode.d.ts +9 -0
- package/dist/types/viewport/src/scene/render-pipeline.d.ts +26 -0
- package/dist/types/viewport/src/scene/render-settings.d.ts +18 -0
- package/dist/types/viewport/src/scene/resolve-frag.d.ts +3 -0
- package/dist/types/viewport/src/scene/stage.d.ts +38 -0
- package/dist/types/viewport/src/scene/stress-test.d.ts +6 -0
- package/dist/types/viewport/src/wings/wing-mesh.d.ts +19 -0
- package/dist/types/viewport/src/wings/wing-outlines.d.ts +32 -0
- package/dist/types/viewport/src/wings/wing-pattern.d.ts +7 -0
- package/dist/viewport.d.ts +1 -0
- package/dist/viewport.js +8 -0
- package/dist/viewport.js.map +7 -0
- package/package.json +74 -4
|
@@ -0,0 +1,1470 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// ../evaluator/src/abi.ts
|
|
4
|
+
var STAMP_STRIDE = 32;
|
|
5
|
+
var PARAMS_LEN = 17;
|
|
6
|
+
var SHAPE_CODE = {
|
|
7
|
+
cube: 0,
|
|
8
|
+
sphere: 1,
|
|
9
|
+
cylinder: 2,
|
|
10
|
+
torus: 3,
|
|
11
|
+
cone: 4,
|
|
12
|
+
pyramid: 5,
|
|
13
|
+
prism: 6,
|
|
14
|
+
octahedron: 7,
|
|
15
|
+
capsule: 8,
|
|
16
|
+
dome: 9
|
|
17
|
+
};
|
|
18
|
+
var MODE_CODE = { add: 0, subtract: 1, intersect: 2, paint: 3 };
|
|
19
|
+
var SEGMENT_STRIDE = 7;
|
|
20
|
+
|
|
21
|
+
// ../evaluator/src/reference/mesher.ts
|
|
22
|
+
function newVoxArrays(total) {
|
|
23
|
+
const f = () => new Float32Array(total);
|
|
24
|
+
return { field: f(), cR: f(), cG: f(), cB: f(), fR: f(), fG: f(), fB: f(), mat: new Float32Array(total * 4) };
|
|
25
|
+
}
|
|
26
|
+
var mn = (a, b) => a < b ? a : b;
|
|
27
|
+
var mx = (a, b) => a > b ? a : b;
|
|
28
|
+
var clamp01 = (v) => mx(0, mn(1, v));
|
|
29
|
+
var fround = Math.fround;
|
|
30
|
+
function sdShape(code2, x, y, z, hx, hy, hz) {
|
|
31
|
+
if (code2 === 0) {
|
|
32
|
+
const dx = Math.abs(x) - hx;
|
|
33
|
+
const dy = Math.abs(y) - hy;
|
|
34
|
+
const dz = Math.abs(z) - hz;
|
|
35
|
+
const ox = mx(dx, 0);
|
|
36
|
+
const oy = mx(dy, 0);
|
|
37
|
+
const oz = mx(dz, 0);
|
|
38
|
+
const outLen = Math.sqrt(ox * ox + oy * oy + oz * oz);
|
|
39
|
+
const inDist = mn(mx(dx, mx(dy, dz)), 0);
|
|
40
|
+
return outLen + inDist;
|
|
41
|
+
}
|
|
42
|
+
const qx = x / hx;
|
|
43
|
+
const qy = y / hy;
|
|
44
|
+
const qz = z / hz;
|
|
45
|
+
const minH = mn(mn(hx, hy), hz);
|
|
46
|
+
switch (code2) {
|
|
47
|
+
case 1:
|
|
48
|
+
return (Math.sqrt(qx * qx + qy * qy + qz * qz) - 1) * minH;
|
|
49
|
+
case 2: {
|
|
50
|
+
const dXZ = (Math.sqrt(qx * qx + qz * qz) - 1) * mn(hx, hz);
|
|
51
|
+
const dY = Math.abs(y) - hy;
|
|
52
|
+
const ox = mx(dXZ, 0);
|
|
53
|
+
const oy = mx(dY, 0);
|
|
54
|
+
return mn(mx(dXZ, dY), 0) + Math.sqrt(ox * ox + oy * oy);
|
|
55
|
+
}
|
|
56
|
+
case 3: {
|
|
57
|
+
const a = Math.sqrt(qx * qx + qz * qz) - 0.8;
|
|
58
|
+
return (Math.sqrt(a * a + qy * qy) - 0.3) * minH;
|
|
59
|
+
}
|
|
60
|
+
case 4: {
|
|
61
|
+
const rx = Math.sqrt(qx * qx + qz * qz);
|
|
62
|
+
const ry = qy;
|
|
63
|
+
const cax = rx - mn(rx, ry < 0 ? 1 : 0);
|
|
64
|
+
const cay = Math.abs(ry) - 1;
|
|
65
|
+
const t = mx(0, mn(1, (rx + 2 - 2 * ry) / 5));
|
|
66
|
+
const cbx = rx - t;
|
|
67
|
+
const cby = ry - 1 + 2 * t;
|
|
68
|
+
const s = cbx < 0 && cay < 0 ? -1 : 1;
|
|
69
|
+
return s * Math.sqrt(mn(cax * cax + cay * cay, cbx * cbx + cby * cby)) * minH;
|
|
70
|
+
}
|
|
71
|
+
case 5: {
|
|
72
|
+
const S5 = 2.236068;
|
|
73
|
+
return mx(mx((2 * Math.abs(qx) + qy - 1) / S5, (2 * Math.abs(qz) + qy - 1) / S5), -qy - 1) * minH;
|
|
74
|
+
}
|
|
75
|
+
case 6:
|
|
76
|
+
return mx(mx((2 * Math.abs(qx) + qy - 1) / 2.236068, -qy - 1), Math.abs(qz) - 1) * minH;
|
|
77
|
+
case 7:
|
|
78
|
+
return (Math.abs(qx) + Math.abs(qy) + Math.abs(qz) - 1) / 1.7320508 * minH;
|
|
79
|
+
case 8: {
|
|
80
|
+
const dq = Math.sqrt(qx * qx + qz * qz);
|
|
81
|
+
const dyc = mx(Math.abs(qy) - 0.5, 0) / 0.5;
|
|
82
|
+
return (Math.sqrt(dq * dq + dyc * dyc) - 1) * minH * 0.5;
|
|
83
|
+
}
|
|
84
|
+
case 9: {
|
|
85
|
+
const a = Math.sqrt(qx * qx + (qy + 1) * (qy + 1) + qz * qz) - 1;
|
|
86
|
+
return mx(a, -(qy + 1)) * minH;
|
|
87
|
+
}
|
|
88
|
+
default:
|
|
89
|
+
return 1e5;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function evalRange(T, list, A, RX, RY, ox, oy, oz, sx, sy, sz, x0, x1, y0, y1, z0, z1) {
|
|
93
|
+
const { field, cR, cG, cB, fR, fG, fB, mat } = A;
|
|
94
|
+
const nL = list.length;
|
|
95
|
+
const S = STAMP_STRIDE;
|
|
96
|
+
for (let z = z0; z <= z1; z++) {
|
|
97
|
+
const pz = oz + z * sz;
|
|
98
|
+
for (let y = y0; y <= y1; y++) {
|
|
99
|
+
const py = oy + y * sy;
|
|
100
|
+
for (let x = x0; x <= x1; x++) {
|
|
101
|
+
const px = ox + x * sx;
|
|
102
|
+
const idx = x + y * RX + z * RX * RY;
|
|
103
|
+
let d = 1e5;
|
|
104
|
+
let r = T[20], g = T[21], b = T[22];
|
|
105
|
+
let fr = T[23], fg = T[24], fb = T[25];
|
|
106
|
+
let m0 = T[26], m1 = T[27], m2 = T[28], m3 = T[29];
|
|
107
|
+
for (let li = 0; li < nL; li++) {
|
|
108
|
+
const s = list[li];
|
|
109
|
+
const o = s * S;
|
|
110
|
+
const mode = T[o + 1];
|
|
111
|
+
const k = T[o + 17];
|
|
112
|
+
const dx = px - T[o + 2], dy = py - T[o + 3], dz = pz - T[o + 4];
|
|
113
|
+
if (s > 0) {
|
|
114
|
+
let lb = Math.sqrt(dx * dx + dy * dy + dz * dz) - T[o + 18];
|
|
115
|
+
if (lb > 0) lb *= T[o + 19];
|
|
116
|
+
if (mode === 0 && lb - d >= k) continue;
|
|
117
|
+
if (mode === 1 && lb + d >= k) continue;
|
|
118
|
+
if (mode === 3 && lb >= k * 0.5) continue;
|
|
119
|
+
}
|
|
120
|
+
const lx = T[o + 5] * dx + T[o + 6] * dy + T[o + 7] * dz;
|
|
121
|
+
const ly = T[o + 8] * dx + T[o + 9] * dy + T[o + 10] * dz;
|
|
122
|
+
const lz = T[o + 11] * dx + T[o + 12] * dy + T[o + 13] * dz;
|
|
123
|
+
const sd = sdShape(T[o], lx, ly, lz, T[o + 14], T[o + 15], T[o + 16]);
|
|
124
|
+
if (s > 0) {
|
|
125
|
+
const kk = mx(k, 1e-4);
|
|
126
|
+
if (mode === 0 ? sd - d >= kk : mode === 1 && sd + d >= kk) continue;
|
|
127
|
+
}
|
|
128
|
+
const sr = T[o + 20], sg = T[o + 21], sb = T[o + 22];
|
|
129
|
+
const sfr = T[o + 23], sfg = T[o + 24], sfb = T[o + 25];
|
|
130
|
+
const s0 = T[o + 26], s1 = T[o + 27], s2 = T[o + 28], s3 = T[o + 29];
|
|
131
|
+
const ov = T[o + 30];
|
|
132
|
+
if (mode === 0) {
|
|
133
|
+
if (s === 0) {
|
|
134
|
+
d = sd;
|
|
135
|
+
r = sr;
|
|
136
|
+
g = sg;
|
|
137
|
+
b = sb;
|
|
138
|
+
fr = sfr;
|
|
139
|
+
fg = sfg;
|
|
140
|
+
fb = sfb;
|
|
141
|
+
} else {
|
|
142
|
+
const h = clamp01(0.5 + 0.5 * (sd - d) / mx(k, 1e-4));
|
|
143
|
+
r = sr + (r - sr) * h;
|
|
144
|
+
g = sg + (g - sg) * h;
|
|
145
|
+
b = sb + (b - sb) * h;
|
|
146
|
+
fr = sfr + (fr - sfr) * h;
|
|
147
|
+
fg = sfg + (fg - sfg) * h;
|
|
148
|
+
fb = sfb + (fb - sfb) * h;
|
|
149
|
+
d = sd * (1 - h) + d * h - k * h * (1 - h);
|
|
150
|
+
m0 = fround(s0 + (m0 - s0) * h);
|
|
151
|
+
m1 = fround(s1 + (m1 - s1) * h);
|
|
152
|
+
m2 = fround(s2 + (m2 - s2) * h);
|
|
153
|
+
m3 = fround(s3 + (m3 - s3) * h);
|
|
154
|
+
}
|
|
155
|
+
} else if (mode === 1) {
|
|
156
|
+
const h = clamp01(0.5 - 0.5 * (sd + d) / mx(k, 1e-4));
|
|
157
|
+
r = r + (sr - r) * h;
|
|
158
|
+
g = g + (sg - g) * h;
|
|
159
|
+
b = b + (sb - b) * h;
|
|
160
|
+
fr = fr + (sfr - fr) * h;
|
|
161
|
+
fg = fg + (sfg - fg) * h;
|
|
162
|
+
fb = fb + (sfb - fb) * h;
|
|
163
|
+
d = d * (1 - h) - sd * h + k * h * (1 - h);
|
|
164
|
+
if (ov !== 0) {
|
|
165
|
+
if (ov & 1) m0 = fround(m0 + (s0 - m0) * h);
|
|
166
|
+
if (ov & 2) m1 = fround(m1 + (s1 - m1) * h);
|
|
167
|
+
if (ov & 4) m2 = fround(m2 + (s2 - m2) * h);
|
|
168
|
+
if (ov & 8) m3 = fround(m3 + (s3 - m3) * h);
|
|
169
|
+
}
|
|
170
|
+
} else if (mode === 2) {
|
|
171
|
+
const h = clamp01(0.5 - 0.5 * (sd - d) / mx(k, 1e-4));
|
|
172
|
+
r = sr + (r - sr) * h;
|
|
173
|
+
g = sg + (g - sg) * h;
|
|
174
|
+
b = sb + (b - sb) * h;
|
|
175
|
+
fr = sfr + (fr - sfr) * h;
|
|
176
|
+
fg = sfg + (fg - sfg) * h;
|
|
177
|
+
fb = sfb + (fb - sfb) * h;
|
|
178
|
+
d = sd * (1 - h) + d * h + k * h * (1 - h);
|
|
179
|
+
if (ov !== 0) {
|
|
180
|
+
if (ov & 1) m0 = fround(s0 + (m0 - s0) * h);
|
|
181
|
+
if (ov & 2) m1 = fround(s1 + (m1 - s1) * h);
|
|
182
|
+
if (ov & 4) m2 = fround(s2 + (m2 - s2) * h);
|
|
183
|
+
if (ov & 8) m3 = fround(s3 + (m3 - s3) * h);
|
|
184
|
+
}
|
|
185
|
+
} else if (mode === 3) {
|
|
186
|
+
if (sd < k * 0.5) {
|
|
187
|
+
const f = clamp01(1 - sd / mx(k * 0.5, 0.05));
|
|
188
|
+
r = r + (sr - r) * f;
|
|
189
|
+
g = g + (sg - g) * f;
|
|
190
|
+
b = b + (sb - b) * f;
|
|
191
|
+
fr = fr + (sfr - fr) * f;
|
|
192
|
+
fg = fg + (sfg - fg) * f;
|
|
193
|
+
fb = fb + (sfb - fb) * f;
|
|
194
|
+
if (ov !== 0) {
|
|
195
|
+
if (ov & 1) m0 = fround(m0 + (s0 - m0) * f);
|
|
196
|
+
if (ov & 2) m1 = fround(m1 + (s1 - m1) * f);
|
|
197
|
+
if (ov & 4) m2 = fround(m2 + (s2 - m2) * f);
|
|
198
|
+
if (ov & 8) m3 = fround(m3 + (s3 - m3) * f);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
field[idx] = d;
|
|
204
|
+
cR[idx] = r;
|
|
205
|
+
cG[idx] = g;
|
|
206
|
+
cB[idx] = b;
|
|
207
|
+
fR[idx] = fr;
|
|
208
|
+
fG[idx] = fg;
|
|
209
|
+
fB[idx] = fb;
|
|
210
|
+
const m4 = idx * 4;
|
|
211
|
+
mat[m4] = m0;
|
|
212
|
+
mat[m4 + 1] = m1;
|
|
213
|
+
mat[m4 + 2] = m2;
|
|
214
|
+
mat[m4 + 3] = m3;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
var CORNER_X = [0, 1, 0, 1, 0, 1, 0, 1];
|
|
220
|
+
var CORNER_Y = [0, 0, 1, 1, 0, 0, 1, 1];
|
|
221
|
+
var CORNER_Z = [0, 0, 0, 0, 1, 1, 1, 1];
|
|
222
|
+
var EDGE_A = [0, 2, 4, 6, 0, 1, 4, 5, 0, 1, 2, 3];
|
|
223
|
+
var EDGE_B = [1, 3, 5, 7, 2, 3, 6, 7, 4, 5, 6, 7];
|
|
224
|
+
function surfaceNets(A, RX, RY, RZ, ox, oy, oz, sx, sy, sz, own) {
|
|
225
|
+
const { field, cR, cG, cB, fR, fG, fB, mat } = A;
|
|
226
|
+
const pos = [];
|
|
227
|
+
const nor = [];
|
|
228
|
+
const col = [];
|
|
229
|
+
const fnd = [];
|
|
230
|
+
const mats = [];
|
|
231
|
+
const idxOut = [];
|
|
232
|
+
const cx = RX - 1, cy = RY - 1, cz = RZ - 1;
|
|
233
|
+
const cellIndex = new Int32Array(Math.max(0, cx * cy * cz)).fill(-1);
|
|
234
|
+
const vals = new Float64Array(8);
|
|
235
|
+
const idxs = new Int32Array(8);
|
|
236
|
+
let vertCount = 0;
|
|
237
|
+
for (let z = 0; z < cz; z++) {
|
|
238
|
+
for (let y = 0; y < cy; y++) {
|
|
239
|
+
for (let x = 0; x < cx; x++) {
|
|
240
|
+
let mask = 0;
|
|
241
|
+
for (let c = 0; c < 8; c++) {
|
|
242
|
+
const i = x + CORNER_X[c] + (y + CORNER_Y[c]) * RX + (z + CORNER_Z[c]) * RX * RY;
|
|
243
|
+
idxs[c] = i;
|
|
244
|
+
const v = field[i];
|
|
245
|
+
vals[c] = v;
|
|
246
|
+
if (v < 0) mask |= 1 << c;
|
|
247
|
+
}
|
|
248
|
+
if (mask === 0 || mask === 255) continue;
|
|
249
|
+
let px = 0, py = 0, pz = 0, r = 0, g = 0, b = 0, fr = 0, fg = 0, fb = 0, n = 0;
|
|
250
|
+
let m0 = 0, m1 = 0, m2 = 0, m3 = 0;
|
|
251
|
+
for (let e = 0; e < 12; e++) {
|
|
252
|
+
const a = EDGE_A[e], bb = EDGE_B[e];
|
|
253
|
+
const va = vals[a], vb = vals[bb];
|
|
254
|
+
if (va < 0 === vb < 0) continue;
|
|
255
|
+
const t = va / (va - vb);
|
|
256
|
+
px += CORNER_X[a] + t * (CORNER_X[bb] - CORNER_X[a]);
|
|
257
|
+
py += CORNER_Y[a] + t * (CORNER_Y[bb] - CORNER_Y[a]);
|
|
258
|
+
pz += CORNER_Z[a] + t * (CORNER_Z[bb] - CORNER_Z[a]);
|
|
259
|
+
const ia = idxs[a], ib = idxs[bb];
|
|
260
|
+
r += cR[ia] + t * (cR[ib] - cR[ia]);
|
|
261
|
+
g += cG[ia] + t * (cG[ib] - cG[ia]);
|
|
262
|
+
b += cB[ia] + t * (cB[ib] - cB[ia]);
|
|
263
|
+
fr += fR[ia] + t * (fR[ib] - fR[ia]);
|
|
264
|
+
fg += fG[ia] + t * (fG[ib] - fG[ia]);
|
|
265
|
+
fb += fB[ia] + t * (fB[ib] - fB[ia]);
|
|
266
|
+
const a4 = ia * 4, b4 = ib * 4;
|
|
267
|
+
m0 += mat[a4] + t * (mat[b4] - mat[a4]);
|
|
268
|
+
m1 += mat[a4 + 1] + t * (mat[b4 + 1] - mat[a4 + 1]);
|
|
269
|
+
m2 += mat[a4 + 2] + t * (mat[b4 + 2] - mat[a4 + 2]);
|
|
270
|
+
m3 += mat[a4 + 3] + t * (mat[b4 + 3] - mat[a4 + 3]);
|
|
271
|
+
n++;
|
|
272
|
+
}
|
|
273
|
+
const v0 = vals[0], v1 = vals[1], v2 = vals[2], v3 = vals[3];
|
|
274
|
+
const v4 = vals[4], v5 = vals[5], v6 = vals[6], v7 = vals[7];
|
|
275
|
+
const gx = (v1 - v0 + (v3 - v2) + (v5 - v4) + (v7 - v6)) / sx;
|
|
276
|
+
const gy = (v2 - v0 + (v3 - v1) + (v6 - v4) + (v7 - v5)) / sy;
|
|
277
|
+
const gz = (v4 - v0 + (v5 - v1) + (v6 - v2) + (v7 - v3)) / sz;
|
|
278
|
+
const gl = Math.sqrt(gx * gx + gy * gy + gz * gz);
|
|
279
|
+
if (gl > 1e-12) nor.push(gx / gl, gy / gl, gz / gl);
|
|
280
|
+
else nor.push(0, 1, 0);
|
|
281
|
+
const inv = 1 / n;
|
|
282
|
+
pos.push(ox + (x + px * inv) * sx, oy + (y + py * inv) * sy, oz + (z + pz * inv) * sz);
|
|
283
|
+
col.push(r * inv, g * inv, b * inv);
|
|
284
|
+
fnd.push(fr * inv, fg * inv, fb * inv);
|
|
285
|
+
mats.push(m0 * inv, m1 * inv, m2 * inv, m3 * inv);
|
|
286
|
+
cellIndex[x + y * cx + z * cx * cy] = vertCount++;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const dims = [RX, RY, RZ];
|
|
291
|
+
const cdims = [cx, cy, cz];
|
|
292
|
+
const cs = [1, cx, cx * cy];
|
|
293
|
+
const fs = [1, RX, RX * RY];
|
|
294
|
+
const p = [0, 0, 0];
|
|
295
|
+
for (let z = 0; z < RZ; z++) {
|
|
296
|
+
for (let y = 0; y < RY; y++) {
|
|
297
|
+
for (let x = 0; x < RX; x++) {
|
|
298
|
+
p[0] = x;
|
|
299
|
+
p[1] = y;
|
|
300
|
+
p[2] = z;
|
|
301
|
+
const i = x + y * RX + z * RX * RY;
|
|
302
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
303
|
+
const v = (axis + 1) % 3;
|
|
304
|
+
const w = (axis + 2) % 3;
|
|
305
|
+
const pa = p[axis], pv = p[v], pw = p[w];
|
|
306
|
+
if (pa >= dims[axis] - 1 || pa < own) continue;
|
|
307
|
+
if (pv < 1 || pv > cdims[v] - 1) continue;
|
|
308
|
+
if (pw < 1 || pw > cdims[w] - 1) continue;
|
|
309
|
+
const in0 = field[i] < 0;
|
|
310
|
+
const in1 = field[i + fs[axis]] < 0;
|
|
311
|
+
if (in0 === in1) continue;
|
|
312
|
+
const base = pa * cs[axis];
|
|
313
|
+
const a = cellIndex[base + (pv - 1) * cs[v] + (pw - 1) * cs[w]];
|
|
314
|
+
const b = cellIndex[base + pv * cs[v] + (pw - 1) * cs[w]];
|
|
315
|
+
const c = cellIndex[base + pv * cs[v] + pw * cs[w]];
|
|
316
|
+
const d = cellIndex[base + (pv - 1) * cs[v] + pw * cs[w]];
|
|
317
|
+
if (a < 0 || b < 0 || c < 0 || d < 0) continue;
|
|
318
|
+
if (in0) idxOut.push(a, b, c, a, c, d);
|
|
319
|
+
else idxOut.push(a, c, b, a, d, c);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
const positions = Float32Array.from(pos);
|
|
325
|
+
let x0 = 0, y0 = 0, z0 = 0, x1 = 0, y1 = 0, z1 = 0;
|
|
326
|
+
if (positions.length > 0) {
|
|
327
|
+
x0 = x1 = positions[0];
|
|
328
|
+
y0 = y1 = positions[1];
|
|
329
|
+
z0 = z1 = positions[2];
|
|
330
|
+
for (let i = 3; i < positions.length; i += 3) {
|
|
331
|
+
const px = positions[i], py = positions[i + 1], pz = positions[i + 2];
|
|
332
|
+
if (px < x0) x0 = px;
|
|
333
|
+
if (px > x1) x1 = px;
|
|
334
|
+
if (py < y0) y0 = py;
|
|
335
|
+
if (py > y1) y1 = py;
|
|
336
|
+
if (pz < z0) z0 = pz;
|
|
337
|
+
if (pz > z1) z1 = pz;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
positions,
|
|
342
|
+
normals: Float32Array.from(nor),
|
|
343
|
+
colors: Float32Array.from(col),
|
|
344
|
+
foundation: Float32Array.from(fnd),
|
|
345
|
+
material: Float32Array.from(mats),
|
|
346
|
+
indices: Uint32Array.from(idxOut),
|
|
347
|
+
bounds: [x0, y0, z0, x1, y1, z1]
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// ../evaluator/src/reference/skin.ts
|
|
352
|
+
var WEIGHT_FALLOFF = 0.08;
|
|
353
|
+
function skinWeights(positions, segs, segCount, boneCount) {
|
|
354
|
+
const n = Math.floor(positions.length / 3);
|
|
355
|
+
const I = new Float32Array(n * 4);
|
|
356
|
+
const W = new Float32Array(n * 4);
|
|
357
|
+
if (boneCount === 0) return { boneIndices: I, boneWeights: W };
|
|
358
|
+
const dist = new Float32Array(boneCount);
|
|
359
|
+
for (let v = 0; v < n; v++) {
|
|
360
|
+
const px = positions[v * 3], py = positions[v * 3 + 1], pz = positions[v * 3 + 2];
|
|
361
|
+
dist.fill(Infinity);
|
|
362
|
+
for (let s = 0; s < segCount; s++) {
|
|
363
|
+
const o = s * SEGMENT_STRIDE;
|
|
364
|
+
const ax = segs[o], ay = segs[o + 1], az = segs[o + 2];
|
|
365
|
+
const abx = segs[o + 3] - ax, aby = segs[o + 4] - ay, abz = segs[o + 5] - az;
|
|
366
|
+
const bone = segs[o + 6];
|
|
367
|
+
const apx = px - ax, apy = py - ay, apz = pz - az;
|
|
368
|
+
const len2 = abx * abx + aby * aby + abz * abz;
|
|
369
|
+
let t = len2 > 1e-8 ? (apx * abx + apy * aby + apz * abz) / len2 : 0;
|
|
370
|
+
t = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
371
|
+
const dx = apx - abx * t, dy = apy - aby * t, dz = apz - abz * t;
|
|
372
|
+
const d2 = dx * dx + dy * dy + dz * dz;
|
|
373
|
+
if (d2 < dist[bone]) dist[bone] = d2;
|
|
374
|
+
}
|
|
375
|
+
let wsum = 0;
|
|
376
|
+
for (let k = 0; k < 4; k++) {
|
|
377
|
+
let bi = -1;
|
|
378
|
+
let m = Infinity;
|
|
379
|
+
for (let j = 0; j < boneCount; j++) {
|
|
380
|
+
if (dist[j] < m) {
|
|
381
|
+
m = dist[j];
|
|
382
|
+
bi = j;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (bi < 0) {
|
|
386
|
+
I[v * 4 + k] = 0;
|
|
387
|
+
W[v * 4 + k] = 0;
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
const q = m + WEIGHT_FALLOFF;
|
|
391
|
+
const w = 1 / (q * q);
|
|
392
|
+
I[v * 4 + k] = bi;
|
|
393
|
+
W[v * 4 + k] = w;
|
|
394
|
+
wsum += w;
|
|
395
|
+
dist[bi] = Infinity;
|
|
396
|
+
}
|
|
397
|
+
for (let k = 0; k < 4; k++) W[v * 4 + k] = W[v * 4 + k] / wsum;
|
|
398
|
+
}
|
|
399
|
+
return { boneIndices: I, boneWeights: W };
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// ../evaluator/src/reference/core.ts
|
|
403
|
+
function createReferenceCore() {
|
|
404
|
+
const slots = /* @__PURE__ */ new Map();
|
|
405
|
+
const scratch = /* @__PURE__ */ new Map();
|
|
406
|
+
return {
|
|
407
|
+
kind: "reference",
|
|
408
|
+
mesh(table, stampCount, params, list) {
|
|
409
|
+
const RX = params[6], RY = params[7], RZ = params[8];
|
|
410
|
+
const total = RX * RY * RZ;
|
|
411
|
+
const slot = params[10];
|
|
412
|
+
let A;
|
|
413
|
+
let full = true;
|
|
414
|
+
if (slot >= 0) {
|
|
415
|
+
A = slots.get(slot);
|
|
416
|
+
if (A && A.field.length === total) full = false;
|
|
417
|
+
else {
|
|
418
|
+
A = newVoxArrays(total);
|
|
419
|
+
slots.set(slot, A);
|
|
420
|
+
}
|
|
421
|
+
} else {
|
|
422
|
+
A = scratch.get(total);
|
|
423
|
+
if (!A) {
|
|
424
|
+
A = newVoxArrays(total);
|
|
425
|
+
scratch.set(total, A);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
let order = list;
|
|
429
|
+
if (!order || order.length === 0) {
|
|
430
|
+
order = new Int32Array(stampCount);
|
|
431
|
+
for (let i = 0; i < stampCount; i++) order[i] = i;
|
|
432
|
+
}
|
|
433
|
+
const box = full ? [0, RX - 1, 0, RY - 1, 0, RZ - 1] : [params[11], params[12], params[13], params[14], params[15], params[16]];
|
|
434
|
+
if (stampCount > 0) {
|
|
435
|
+
evalRange(
|
|
436
|
+
table,
|
|
437
|
+
order,
|
|
438
|
+
A,
|
|
439
|
+
RX,
|
|
440
|
+
RY,
|
|
441
|
+
params[0],
|
|
442
|
+
params[1],
|
|
443
|
+
params[2],
|
|
444
|
+
params[3],
|
|
445
|
+
params[4],
|
|
446
|
+
params[5],
|
|
447
|
+
box[0],
|
|
448
|
+
box[1],
|
|
449
|
+
box[2],
|
|
450
|
+
box[3],
|
|
451
|
+
box[4],
|
|
452
|
+
box[5]
|
|
453
|
+
);
|
|
454
|
+
} else {
|
|
455
|
+
A.field.fill(1e5);
|
|
456
|
+
}
|
|
457
|
+
return surfaceNets(A, RX, RY, RZ, params[0], params[1], params[2], params[3], params[4], params[5], params[9]);
|
|
458
|
+
},
|
|
459
|
+
dropSlot(slot) {
|
|
460
|
+
slots.delete(slot);
|
|
461
|
+
},
|
|
462
|
+
skin(positions, segments, segmentCount, boneCount) {
|
|
463
|
+
return skinWeights(positions, segments, segmentCount, boneCount);
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
// ../evaluator/src/prep/colors.ts
|
|
469
|
+
var FIXED_COLORS = { tongue: 16021135, teeth: 16514042, black: 1118481 };
|
|
470
|
+
var MISSING = 16711935;
|
|
471
|
+
function colorHex(ref, palette) {
|
|
472
|
+
if (ref === "tongue" || ref === "teeth" || ref === "black") return FIXED_COLORS[ref];
|
|
473
|
+
const v = palette[ref];
|
|
474
|
+
return typeof v === "number" ? v : MISSING;
|
|
475
|
+
}
|
|
476
|
+
function rgbOf(ref, palette) {
|
|
477
|
+
const hex = colorHex(ref, palette);
|
|
478
|
+
return [(hex >> 16 & 255) / 255, (hex >> 8 & 255) / 255, (hex & 255) / 255];
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
// ../evaluator/src/prep/mat3.ts
|
|
482
|
+
var IDENTITY = [1, 0, 0, 0, 1, 0, 0, 0, 1];
|
|
483
|
+
function fromQuaternion(q) {
|
|
484
|
+
const l = Math.sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w) || 1;
|
|
485
|
+
const x = q.x / l, y = q.y / l, z = q.z / l, w = q.w / l;
|
|
486
|
+
const x2 = x + x, y2 = y + y, z2 = z + z;
|
|
487
|
+
const xx = x * x2, xy = x * y2, xz = x * z2;
|
|
488
|
+
const yy = y * y2, yz = y * z2, zz = z * z2;
|
|
489
|
+
const wx = w * x2, wy = w * y2, wz = w * z2;
|
|
490
|
+
return [1 - (yy + zz), xy - wz, xz + wy, xy + wz, 1 - (xx + zz), yz - wx, xz - wy, yz + wx, 1 - (xx + yy)];
|
|
491
|
+
}
|
|
492
|
+
function fromAxisAngle(ax, ay, az, angle) {
|
|
493
|
+
const c = Math.cos(angle), s = Math.sin(angle), t = 1 - c;
|
|
494
|
+
const tx = t * ax, ty = t * ay;
|
|
495
|
+
return [
|
|
496
|
+
tx * ax + c,
|
|
497
|
+
tx * ay - s * az,
|
|
498
|
+
tx * az + s * ay,
|
|
499
|
+
tx * ay + s * az,
|
|
500
|
+
ty * ay + c,
|
|
501
|
+
ty * az - s * ax,
|
|
502
|
+
tx * az - s * ay,
|
|
503
|
+
ty * az + s * ax,
|
|
504
|
+
t * az * az + c
|
|
505
|
+
];
|
|
506
|
+
}
|
|
507
|
+
function scale(sx, sy, sz) {
|
|
508
|
+
return [sx, 0, 0, 0, sy, 0, 0, 0, sz];
|
|
509
|
+
}
|
|
510
|
+
function mul(a, b) {
|
|
511
|
+
const o = [];
|
|
512
|
+
for (let r = 0; r < 3; r++) {
|
|
513
|
+
for (let c = 0; c < 3; c++) o.push(a[r * 3] * b[c] + a[r * 3 + 1] * b[3 + c] + a[r * 3 + 2] * b[6 + c]);
|
|
514
|
+
}
|
|
515
|
+
return o;
|
|
516
|
+
}
|
|
517
|
+
function transpose(m) {
|
|
518
|
+
return [m[0], m[3], m[6], m[1], m[4], m[7], m[2], m[5], m[8]];
|
|
519
|
+
}
|
|
520
|
+
function det(m) {
|
|
521
|
+
return m[0] * (m[4] * m[8] - m[5] * m[7]) - m[1] * (m[3] * m[8] - m[5] * m[6]) + m[2] * (m[3] * m[7] - m[4] * m[6]);
|
|
522
|
+
}
|
|
523
|
+
function apply(m, x, y, z) {
|
|
524
|
+
return [m[0] * x + m[1] * y + m[2] * z, m[3] * x + m[4] * y + m[5] * z, m[6] * x + m[7] * y + m[8] * z];
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
// ../evaluator/src/prep/props.ts
|
|
528
|
+
function resolveStampProps(stamp, sculpt) {
|
|
529
|
+
const group = stamp.smearGroupId === void 0 ? void 0 : sculpt.smearGroups.find((g) => g.id === stamp.smearGroupId);
|
|
530
|
+
const look = sculpt.look;
|
|
531
|
+
if (group) {
|
|
532
|
+
return {
|
|
533
|
+
mode: group.mode,
|
|
534
|
+
blend: group.blend,
|
|
535
|
+
color: group.color,
|
|
536
|
+
foundationColor: group.foundationColor ?? group.color,
|
|
537
|
+
material: stamp.material ?? {},
|
|
538
|
+
symmetry: group.symmetry
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
return {
|
|
542
|
+
mode: stamp.mode,
|
|
543
|
+
blend: stamp.blend ?? look.blend,
|
|
544
|
+
color: stamp.color ?? look.color,
|
|
545
|
+
foundationColor: stamp.foundationColor ?? (stamp.color !== void 0 ? stamp.color : look.foundationColor),
|
|
546
|
+
material: stamp.material ?? {},
|
|
547
|
+
symmetry: stamp.symmetry
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// ../evaluator/src/prep/symmetry.ts
|
|
552
|
+
var SYM_MAX_N = 12;
|
|
553
|
+
var SYM_MAX_INSTANCES = 128;
|
|
554
|
+
var SYM_STAMP_CAP = 1024;
|
|
555
|
+
var AXIS_ORDER = ["x", "y", "z"];
|
|
556
|
+
var AXIS_VEC = { x: [1, 0, 0], y: [0, 1, 0], z: [0, 0, 1] };
|
|
557
|
+
var MIRROR = { x: scale(-1, 1, 1), y: scale(1, -1, 1), z: scale(1, 1, -1) };
|
|
558
|
+
var FLIP_X = scale(-1, 1, 1);
|
|
559
|
+
function symAxesOf(axes) {
|
|
560
|
+
return AXIS_ORDER.filter((a) => (axes ?? []).includes(a));
|
|
561
|
+
}
|
|
562
|
+
function symClampN(n, axes) {
|
|
563
|
+
let N = Math.max(1, Math.min(SYM_MAX_N, Math.round(n) || 1));
|
|
564
|
+
const len = symAxesOf(axes).length;
|
|
565
|
+
while (len > 0 && N > 1 && Math.pow(N, len) > SYM_MAX_INSTANCES) N--;
|
|
566
|
+
return N;
|
|
567
|
+
}
|
|
568
|
+
var isIdentity = (m) => m.every((v, i) => Math.abs(v - IDENTITY[i]) <= 1e-6);
|
|
569
|
+
var matCache = /* @__PURE__ */ new Map();
|
|
570
|
+
function symInstanceMatrices(n, axes) {
|
|
571
|
+
const sel = symAxesOf(axes);
|
|
572
|
+
const key = n + "|" + sel.join("");
|
|
573
|
+
const hit = matCache.get(key);
|
|
574
|
+
if (hit) return hit;
|
|
575
|
+
const plan = sel.length ? sel : n > 1 ? ["y"] : [];
|
|
576
|
+
let list = plan.length ? [IDENTITY] : [];
|
|
577
|
+
for (const a of AXIS_ORDER) {
|
|
578
|
+
if (!plan.includes(a)) continue;
|
|
579
|
+
const gens = [];
|
|
580
|
+
if (n === 2) gens.push(IDENTITY, MIRROR[a]);
|
|
581
|
+
else {
|
|
582
|
+
const v = AXIS_VEC[a];
|
|
583
|
+
for (let k = 0; k < n; k++) gens.push(fromAxisAngle(v[0], v[1], v[2], k * Math.PI * 2 / n));
|
|
584
|
+
}
|
|
585
|
+
const next = [];
|
|
586
|
+
for (const base of list) for (const g of gens) next.push(mul(base, g));
|
|
587
|
+
list = next;
|
|
588
|
+
}
|
|
589
|
+
const seen = /* @__PURE__ */ new Set();
|
|
590
|
+
const unique = [];
|
|
591
|
+
for (const m of list) {
|
|
592
|
+
if (isIdentity(m)) continue;
|
|
593
|
+
const k = m.map((v) => Math.round(v * 1e5)).join(",");
|
|
594
|
+
if (seen.has(k)) continue;
|
|
595
|
+
seen.add(k);
|
|
596
|
+
unique.push(m);
|
|
597
|
+
}
|
|
598
|
+
matCache.set(key, unique);
|
|
599
|
+
return unique;
|
|
600
|
+
}
|
|
601
|
+
function symInstancesOf(position, rotation, pivot, n, axes) {
|
|
602
|
+
const P = fromQuaternion(pivot.rotation);
|
|
603
|
+
const Pinv = transpose(P);
|
|
604
|
+
const pp = pivot.position;
|
|
605
|
+
return symInstanceMatrices(n, axes).map((L0) => {
|
|
606
|
+
const L = mul(mul(P, L0), Pinv);
|
|
607
|
+
const r = apply(L, position.x - pp.x, position.y - pp.y, position.z - pp.z);
|
|
608
|
+
let M = mul(L, rotation);
|
|
609
|
+
if (det(L) < 0) M = mul(M, FLIP_X);
|
|
610
|
+
return { position: [pp.x + r[0], pp.y + r[1], pp.z + r[2]], rotation: M };
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// ../evaluator/src/prep/pack.ts
|
|
615
|
+
var MIN_RESOLUTION = 4;
|
|
616
|
+
var MAX_RESOLUTION = 128;
|
|
617
|
+
function clampResolution(r) {
|
|
618
|
+
return Math.max(MIN_RESOLUTION, Math.min(MAX_RESOLUTION, Math.round(r) || 36));
|
|
619
|
+
}
|
|
620
|
+
function lodLevels(base) {
|
|
621
|
+
const r = Math.max(16, Math.min(64, Math.round(base) || 36));
|
|
622
|
+
return [r, Math.max(16, Math.round(r * 0.67)), Math.max(12, Math.round(r * 0.44))];
|
|
623
|
+
}
|
|
624
|
+
function boundRadius(shape, hx, hy, hz) {
|
|
625
|
+
if (shape === "sphere") return Math.max(hx, hy, hz);
|
|
626
|
+
if (shape === "cylinder") {
|
|
627
|
+
const r = Math.max(hx, hz);
|
|
628
|
+
return Math.sqrt(r * r + hy * hy);
|
|
629
|
+
}
|
|
630
|
+
if (shape === "torus") {
|
|
631
|
+
const r = 1.1 * Math.max(hx, hz), t = 0.3 * hy;
|
|
632
|
+
return Math.sqrt(r * r + t * t);
|
|
633
|
+
}
|
|
634
|
+
return Math.sqrt(hx * hx + hy * hy + hz * hz);
|
|
635
|
+
}
|
|
636
|
+
function packSculpt(sculpt, palette) {
|
|
637
|
+
const rows = [];
|
|
638
|
+
const props = sculpt.stamps.map((s) => resolveStampProps(s, sculpt));
|
|
639
|
+
let overflow = 0;
|
|
640
|
+
sculpt.stamps.forEach((s, si) => {
|
|
641
|
+
const rot = fromQuaternion(s.rotation);
|
|
642
|
+
const base = { shape: s.shape, sx: s.scale.x, sy: s.scale.y, sz: s.scale.z, si };
|
|
643
|
+
rows.push({ ...base, pos: [s.position.x, s.position.y, s.position.z], rot });
|
|
644
|
+
const sym = props[si].symmetry;
|
|
645
|
+
const n = symClampN(sym?.count ?? 1, sym?.axes);
|
|
646
|
+
for (const inst of symInstancesOf(s.position, rot, sculpt.pivot, n, sym?.axes)) {
|
|
647
|
+
if (rows.length >= SYM_STAMP_CAP) {
|
|
648
|
+
overflow++;
|
|
649
|
+
continue;
|
|
650
|
+
}
|
|
651
|
+
rows.push({ ...base, pos: inst.position, rot: inst.rotation });
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
const count = rows.length;
|
|
655
|
+
const T = new Float64Array(count * STAMP_STRIDE);
|
|
656
|
+
const mat = sculpt.look.material;
|
|
657
|
+
const defaults = [mat.roughness, mat.metalness, mat.glow, 1];
|
|
658
|
+
let lo = [Infinity, Infinity, Infinity], hi = [-Infinity, -Infinity, -Infinity];
|
|
659
|
+
let maxBlend = -Infinity;
|
|
660
|
+
rows.forEach((row, i) => {
|
|
661
|
+
const p = props[row.si];
|
|
662
|
+
const o = i * STAMP_STRIDE;
|
|
663
|
+
const hx = row.sx * 0.5, hy = row.sy * 0.5, hz = row.sz * 0.5;
|
|
664
|
+
T[o] = SHAPE_CODE[row.shape] ?? -1;
|
|
665
|
+
T[o + 1] = MODE_CODE[p.mode] ?? 4;
|
|
666
|
+
T[o + 2] = row.pos[0];
|
|
667
|
+
T[o + 3] = row.pos[1];
|
|
668
|
+
T[o + 4] = row.pos[2];
|
|
669
|
+
const R = row.rot;
|
|
670
|
+
T[o + 5] = R[0];
|
|
671
|
+
T[o + 6] = R[3];
|
|
672
|
+
T[o + 7] = R[6];
|
|
673
|
+
T[o + 8] = R[1];
|
|
674
|
+
T[o + 9] = R[4];
|
|
675
|
+
T[o + 10] = R[7];
|
|
676
|
+
T[o + 11] = R[2];
|
|
677
|
+
T[o + 12] = R[5];
|
|
678
|
+
T[o + 13] = R[8];
|
|
679
|
+
T[o + 14] = hx;
|
|
680
|
+
T[o + 15] = hy;
|
|
681
|
+
T[o + 16] = hz;
|
|
682
|
+
T[o + 17] = p.blend;
|
|
683
|
+
T[o + 18] = boundRadius(row.shape, hx, hy, hz);
|
|
684
|
+
T[o + 19] = row.shape === "cube" ? 1 : Math.min(hx, hy, hz) / Math.max(hx, hy, hz, 1e-4);
|
|
685
|
+
const c = rgbOf(p.color, palette), f = rgbOf(p.foundationColor, palette);
|
|
686
|
+
T[o + 20] = c[0];
|
|
687
|
+
T[o + 21] = c[1];
|
|
688
|
+
T[o + 22] = c[2];
|
|
689
|
+
T[o + 23] = f[0];
|
|
690
|
+
T[o + 24] = f[1];
|
|
691
|
+
T[o + 25] = f[2];
|
|
692
|
+
const own = [p.material.roughness, p.material.metalness, p.material.glow, p.material.flecks === void 0 ? void 0 : p.material.flecks ? 1 : 0];
|
|
693
|
+
let mask = 0;
|
|
694
|
+
for (let k = 0; k < 4; k++) {
|
|
695
|
+
const v = own[k];
|
|
696
|
+
if (v !== void 0) mask |= 1 << k;
|
|
697
|
+
T[o + 26 + k] = Math.fround(v ?? defaults[k]);
|
|
698
|
+
}
|
|
699
|
+
T[o + 30] = mask;
|
|
700
|
+
maxBlend = Math.max(maxBlend, p.blend);
|
|
701
|
+
const pad = [row.sx * 0.7, row.sy * 0.7, row.sz * 0.7];
|
|
702
|
+
for (let a = 0; a < 3; a++) {
|
|
703
|
+
lo[a] = Math.min(lo[a], row.pos[a] - pad[a]);
|
|
704
|
+
hi[a] = Math.max(hi[a], row.pos[a] + pad[a]);
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
if (count === 0) {
|
|
708
|
+
lo = [0, 0, 0];
|
|
709
|
+
hi = [0, 0, 0];
|
|
710
|
+
maxBlend = 0;
|
|
711
|
+
}
|
|
712
|
+
const size0 = [hi[0] - lo[0], hi[1] - lo[1], hi[2] - lo[2]];
|
|
713
|
+
const margin = Math.max(Math.min(0.6, 0.35 * Math.max(size0[0], size0[1], size0[2])), maxBlend * 1.5);
|
|
714
|
+
const bMin = [lo[0] - margin, lo[1] - margin, lo[2] - margin];
|
|
715
|
+
const bMax = [hi[0] + margin, hi[1] + margin, hi[2] + margin];
|
|
716
|
+
return {
|
|
717
|
+
table: T,
|
|
718
|
+
count,
|
|
719
|
+
overflow,
|
|
720
|
+
maxBlend,
|
|
721
|
+
bMin,
|
|
722
|
+
bSize: [bMax[0] - bMin[0], bMax[1] - bMin[1], bMax[2] - bMin[2]]
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
// ../evaluator/src/chunks.ts
|
|
727
|
+
var CHUNK_MIN_EXTENT = 8;
|
|
728
|
+
var CHUNK_CELLS = 144;
|
|
729
|
+
var CHUNK_C0 = 16;
|
|
730
|
+
var CHUNK_LEVELS = 3;
|
|
731
|
+
var CHUNK_TARGET_PX = 20;
|
|
732
|
+
var CHUNK_HYST = 0.25;
|
|
733
|
+
var EMPTY = {
|
|
734
|
+
nV: 0,
|
|
735
|
+
pos: new Float32Array(0),
|
|
736
|
+
nor: new Float32Array(0),
|
|
737
|
+
col: new Float32Array(0),
|
|
738
|
+
fcol: new Float32Array(0),
|
|
739
|
+
mat: new Float32Array(0),
|
|
740
|
+
idx: new Uint32Array(0)
|
|
741
|
+
};
|
|
742
|
+
function wantsChunks(P, chunkedBefore) {
|
|
743
|
+
const ext = Math.max(P.bSize[0], P.bSize[1], P.bSize[2]);
|
|
744
|
+
return ext >= CHUNK_MIN_EXTENT * (chunkedBefore ? 0.8 : 1);
|
|
745
|
+
}
|
|
746
|
+
function niceStep(x) {
|
|
747
|
+
const e = Math.floor(Math.log10(x)), m = x / Math.pow(10, e);
|
|
748
|
+
for (const v of [1, 1.25, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10]) if (m <= v + 1e-9) return v * Math.pow(10, e);
|
|
749
|
+
return 10 * Math.pow(10, e);
|
|
750
|
+
}
|
|
751
|
+
function suffixMax(table, count) {
|
|
752
|
+
const o = new Float64Array(count + 1);
|
|
753
|
+
for (let i = count - 1; i >= 0; i--) o[i] = Math.max(o[i + 1], table[i * STAMP_STRIDE + 17]);
|
|
754
|
+
return o;
|
|
755
|
+
}
|
|
756
|
+
function dirtyBoxes(oldT, nOld, cur, nNew) {
|
|
757
|
+
const nMin = Math.min(nOld, nNew), changedOld = [], changedNew = [];
|
|
758
|
+
for (let i = 0; i < nMin; i++) {
|
|
759
|
+
const a = i * STAMP_STRIDE;
|
|
760
|
+
for (let k = 0; k < STAMP_STRIDE; k++) {
|
|
761
|
+
if (oldT[a + k] !== cur[a + k]) {
|
|
762
|
+
changedOld.push(i);
|
|
763
|
+
changedNew.push(i);
|
|
764
|
+
break;
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
for (let i = nMin; i < nOld; i++) changedOld.push(i);
|
|
769
|
+
for (let i = nMin; i < nNew; i++) changedNew.push(i);
|
|
770
|
+
const boxes = [];
|
|
771
|
+
let bad = false;
|
|
772
|
+
const reach = (T, suf, i) => {
|
|
773
|
+
const o = i * STAMP_STRIDE, mode = T[o + 1], k = T[o + 17];
|
|
774
|
+
if (mode === 2 || mode > 3) {
|
|
775
|
+
bad = true;
|
|
776
|
+
return;
|
|
777
|
+
}
|
|
778
|
+
const kk = mode === 3 ? 0.5 * k : k + suf[i + 1];
|
|
779
|
+
const inv = 1.25 / Math.max(T[o + 19], 0.02), r = T[o + 18] + kk * inv;
|
|
780
|
+
const x = T[o + 2], y = T[o + 3], z = T[o + 4];
|
|
781
|
+
boxes.push([x - r, y - r, z - r, x + r, y + r, z + r, 3 * inv]);
|
|
782
|
+
};
|
|
783
|
+
const sufOld = suffixMax(oldT, nOld), sufNew = suffixMax(cur, nNew);
|
|
784
|
+
for (const i of changedOld) reach(oldT, sufOld, i);
|
|
785
|
+
for (const i of changedNew) reach(cur, sufNew, i);
|
|
786
|
+
return bad ? null : boxes;
|
|
787
|
+
}
|
|
788
|
+
function shapeList(T, n, suf, lo, hi, step) {
|
|
789
|
+
const out = [];
|
|
790
|
+
let hasAdd = false;
|
|
791
|
+
for (let i = 0; i < n; i++) {
|
|
792
|
+
const o = i * STAMP_STRIDE, mode = T[o + 1];
|
|
793
|
+
let reaches = true;
|
|
794
|
+
if (mode === 0 || mode === 3) {
|
|
795
|
+
const kk = mode === 3 ? 0.5 * T[o + 17] : T[o + 17] + suf[i + 1];
|
|
796
|
+
const r = T[o + 18] + (kk + 3 * step) * 1.25 / Math.max(T[o + 19], 0.02);
|
|
797
|
+
const px = T[o + 2], py = T[o + 3], pz = T[o + 4];
|
|
798
|
+
const dx = Math.max(lo[0] - px, 0, px - hi[0]), dy = Math.max(lo[1] - py, 0, py - hi[1]), dz = Math.max(lo[2] - pz, 0, pz - hi[2]);
|
|
799
|
+
reaches = dx * dx + dy * dy + dz * dz <= r * r;
|
|
800
|
+
}
|
|
801
|
+
if (mode === 0 && reaches) hasAdd = true;
|
|
802
|
+
if (reaches || i === 0) out.push(i);
|
|
803
|
+
}
|
|
804
|
+
return hasAdd ? Int32Array.from(out) : null;
|
|
805
|
+
}
|
|
806
|
+
function buildChunk(core, st, P, suf, rec, L) {
|
|
807
|
+
const h0 = st.h0, f = 1 << L, n = CHUNK_C0 >> L, h = f * h0, RX = n + 2;
|
|
808
|
+
const ox = (rec.i * CHUNK_C0 - f) * h0, oy = (rec.j * CHUNK_C0 - f) * h0, oz = (rec.k * CHUNK_C0 - f) * h0;
|
|
809
|
+
const W = st.W, pad = 2 * h;
|
|
810
|
+
const list = shapeList(
|
|
811
|
+
P.table,
|
|
812
|
+
P.count,
|
|
813
|
+
suf,
|
|
814
|
+
[rec.i * W - pad, rec.j * W - pad, rec.k * W - pad],
|
|
815
|
+
[(rec.i + 1) * W + pad, (rec.j + 1) * W + pad, (rec.k + 1) * W + pad],
|
|
816
|
+
h
|
|
817
|
+
);
|
|
818
|
+
if (!list) return EMPTY;
|
|
819
|
+
const params = new Float64Array(PARAMS_LEN);
|
|
820
|
+
params.set([ox, oy, oz, h, h, h, RX, RX, RX, 1, -1, 0, RX - 1, 0, RX - 1, 0, RX - 1]);
|
|
821
|
+
const m = core.mesh(P.table, P.count, params, list);
|
|
822
|
+
if (!m.indices.length) return EMPTY;
|
|
823
|
+
return {
|
|
824
|
+
nV: m.positions.length / 3,
|
|
825
|
+
pos: m.positions.slice(),
|
|
826
|
+
nor: m.normals.slice(),
|
|
827
|
+
col: m.colors.slice(),
|
|
828
|
+
fcol: m.foundation.slice(),
|
|
829
|
+
mat: m.material.slice(),
|
|
830
|
+
idx: m.indices.slice()
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
function skirtOf(mesh, depth) {
|
|
834
|
+
const idx = mesh.idx, cnt = /* @__PURE__ */ new Map();
|
|
835
|
+
const key = (a, b) => a < b ? a * mesh.nV + b : b * mesh.nV + a;
|
|
836
|
+
for (let t = 0; t < idx.length; t += 3) {
|
|
837
|
+
for (let e = 0; e < 3; e++) {
|
|
838
|
+
const kk = key(idx[t + e], idx[t + (e + 1) % 3]);
|
|
839
|
+
cnt.set(kk, (cnt.get(kk) ?? 0) + 1);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
const edges = [];
|
|
843
|
+
for (let t = 0; t < idx.length; t += 3) {
|
|
844
|
+
for (let e = 0; e < 3; e++) {
|
|
845
|
+
const a = idx[t + e], b = idx[t + (e + 1) % 3];
|
|
846
|
+
if (cnt.get(key(a, b)) === 1) edges.push(a, b);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
const nE = edges.length / 2;
|
|
850
|
+
if (!nE) return null;
|
|
851
|
+
const nV = nE * 4, pos = new Float32Array(nV * 3), nor = new Float32Array(nV * 3), col = new Float32Array(nV * 3);
|
|
852
|
+
const fcol = new Float32Array(nV * 3), mat = new Float32Array(nV * 4), ix = new Uint32Array(nE * 12);
|
|
853
|
+
for (let e = 0; e < nE; e++) {
|
|
854
|
+
const a = edges[e * 2], b = edges[e * 2 + 1], o = e * 4;
|
|
855
|
+
[a, b, b, a].forEach((src, q) => {
|
|
856
|
+
const d = (o + q) * 3, s = src * 3, drop = q >= 2 ? depth : 0;
|
|
857
|
+
for (let c = 0; c < 3; c++) {
|
|
858
|
+
pos[d + c] = mesh.pos[s + c] - mesh.nor[s + c] * drop;
|
|
859
|
+
nor[d + c] = mesh.nor[s + c];
|
|
860
|
+
col[d + c] = mesh.col[s + c];
|
|
861
|
+
fcol[d + c] = mesh.fcol[s + c];
|
|
862
|
+
}
|
|
863
|
+
for (let c = 0; c < 4; c++) mat[(o + q) * 4 + c] = mesh.mat[src * 4 + c];
|
|
864
|
+
});
|
|
865
|
+
ix.set([o, o + 1, o + 2, o, o + 2, o + 3, o, o + 2, o + 1, o, o + 3, o + 2], e * 12);
|
|
866
|
+
}
|
|
867
|
+
return { nV, pos, nor, col, fcol, mat, idx: ix };
|
|
868
|
+
}
|
|
869
|
+
function wantLevel(st, rec, view) {
|
|
870
|
+
const W = st.W, c = view.camera;
|
|
871
|
+
const dx = Math.max(rec.i * W - c.x, 0, c.x - (rec.i + 1) * W);
|
|
872
|
+
const dy = Math.max(rec.j * W - c.y, 0, c.y - (rec.j + 1) * W);
|
|
873
|
+
const dz = Math.max(rec.k * W - c.z, 0, c.z - (rec.k + 1) * W);
|
|
874
|
+
const dist = Math.max(Math.sqrt(dx * dx + dy * dy + dz * dz), 1e-3);
|
|
875
|
+
const pxAt = (L) => st.h0 * (1 << L) * view.pixelsPerUnitAtDistance1 / dist;
|
|
876
|
+
let ideal = 0;
|
|
877
|
+
for (let L = CHUNK_LEVELS - 1; L >= 0; L--) if (pxAt(L) <= CHUNK_TARGET_PX) {
|
|
878
|
+
ideal = L;
|
|
879
|
+
break;
|
|
880
|
+
}
|
|
881
|
+
const cur = rec.level;
|
|
882
|
+
if (cur === null || ideal <= cur) return ideal;
|
|
883
|
+
return pxAt(ideal) * (1 + CHUNK_HYST) <= CHUNK_TARGET_PX ? ideal : cur;
|
|
884
|
+
}
|
|
885
|
+
function skirtFor(st, rec, mesh) {
|
|
886
|
+
let depth = 0;
|
|
887
|
+
for (let a = -1; a <= 1; a++) for (let b = -1; b <= 1; b++) for (let c = -1; c <= 1; c++) {
|
|
888
|
+
if (!a && !b && !c) continue;
|
|
889
|
+
const nb = st.chunks.get(`${rec.i + a},${rec.j + b},${rec.k + c}`);
|
|
890
|
+
if (!nb || nb.level === null || nb.level === rec.level) continue;
|
|
891
|
+
const nm = nb.meshes.get(nb.level);
|
|
892
|
+
if (!nm || !nm.nV) continue;
|
|
893
|
+
depth = Math.max(depth, st.h0 * (1 << Math.max(nb.level, rec.level ?? 0)));
|
|
894
|
+
}
|
|
895
|
+
if (!depth) return null;
|
|
896
|
+
if (rec.skirt && rec.skirtDepth === depth && rec.skirtOf === mesh) return rec.skirt;
|
|
897
|
+
rec.skirt = skirtOf(mesh, depth);
|
|
898
|
+
rec.skirtDepth = depth;
|
|
899
|
+
rec.skirtOf = mesh;
|
|
900
|
+
return rec.skirt;
|
|
901
|
+
}
|
|
902
|
+
function merge(st) {
|
|
903
|
+
const parts = [];
|
|
904
|
+
let nV = 0, nI = 0;
|
|
905
|
+
for (const rec of st.chunks.values()) {
|
|
906
|
+
const m = rec.level === null ? null : rec.meshes.get(rec.level);
|
|
907
|
+
if (!m || !m.nV) continue;
|
|
908
|
+
parts.push(m);
|
|
909
|
+
nV += m.nV;
|
|
910
|
+
nI += m.idx.length;
|
|
911
|
+
const sk = skirtFor(st, rec, m);
|
|
912
|
+
if (sk) {
|
|
913
|
+
parts.push(sk);
|
|
914
|
+
nV += sk.nV;
|
|
915
|
+
nI += sk.idx.length;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
const pos = new Float32Array(nV * 3), nor = new Float32Array(nV * 3), col = new Float32Array(nV * 3);
|
|
919
|
+
const fcol = new Float32Array(nV * 3), mat = new Float32Array(nV * 4), idx = new Uint32Array(nI);
|
|
920
|
+
let v = 0, t = 0;
|
|
921
|
+
const lo = [Infinity, Infinity, Infinity], hi = [-Infinity, -Infinity, -Infinity];
|
|
922
|
+
for (const m of parts) {
|
|
923
|
+
pos.set(m.pos, v * 3);
|
|
924
|
+
nor.set(m.nor, v * 3);
|
|
925
|
+
col.set(m.col, v * 3);
|
|
926
|
+
fcol.set(m.fcol, v * 3);
|
|
927
|
+
mat.set(m.mat, v * 4);
|
|
928
|
+
for (let q = 0; q < m.idx.length; q++) idx[t + q] = m.idx[q] + v;
|
|
929
|
+
v += m.nV;
|
|
930
|
+
t += m.idx.length;
|
|
931
|
+
}
|
|
932
|
+
for (let p = 0; p < pos.length; p += 3) {
|
|
933
|
+
for (let c = 0; c < 3; c++) {
|
|
934
|
+
lo[c] = Math.min(lo[c], pos[p + c]);
|
|
935
|
+
hi[c] = Math.max(hi[c], pos[p + c]);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
const bounds = nV ? [lo[0], lo[1], lo[2], hi[0], hi[1], hi[2]] : [0, 0, 0, 0, 0, 0];
|
|
939
|
+
return { nV, pos, nor, col, fcol, mat, idx, bounds, chunks: st.chunks.size };
|
|
940
|
+
}
|
|
941
|
+
function chunkMesh(core, prev, P, view) {
|
|
942
|
+
const ext = Math.max(P.bSize[0], P.bSize[1], P.bSize[2]);
|
|
943
|
+
const h0 = niceStep(ext / CHUNK_CELLS), W = CHUNK_C0 * h0;
|
|
944
|
+
let st = prev;
|
|
945
|
+
if (!st || st.h0 !== h0) st = { h0, W, chunks: /* @__PURE__ */ new Map(), table: new Float64Array(0), count: 0 };
|
|
946
|
+
const dirty = st.count ? dirtyBoxes(st.table, st.count, P.table, P.count) : null;
|
|
947
|
+
st.table = P.table;
|
|
948
|
+
st.count = P.count;
|
|
949
|
+
const suf = suffixMax(P.table, P.count);
|
|
950
|
+
const lo = [0, 1, 2].map((a) => Math.floor(P.bMin[a] / W));
|
|
951
|
+
const hi = [0, 1, 2].map((a) => Math.ceil((P.bMin[a] + P.bSize[a]) / W) - 1);
|
|
952
|
+
const alive = /* @__PURE__ */ new Set();
|
|
953
|
+
for (let k = lo[2]; k <= hi[2]; k++) for (let j = lo[1]; j <= hi[1]; j++) for (let i = lo[0]; i <= hi[0]; i++) {
|
|
954
|
+
const key = `${i},${j},${k}`;
|
|
955
|
+
alive.add(key);
|
|
956
|
+
if (!st.chunks.has(key)) st.chunks.set(key, { i, j, k, level: null, meshes: /* @__PURE__ */ new Map(), skirt: null, skirtDepth: 0, skirtOf: null });
|
|
957
|
+
}
|
|
958
|
+
for (const key of [...st.chunks.keys()]) if (!alive.has(key)) st.chunks.delete(key);
|
|
959
|
+
for (const rec of st.chunks.values()) {
|
|
960
|
+
for (const L of [...rec.meshes.keys()]) {
|
|
961
|
+
let hit = dirty === null;
|
|
962
|
+
if (!hit) {
|
|
963
|
+
const h = h0 * (1 << L);
|
|
964
|
+
hit = dirty.some((bx) => {
|
|
965
|
+
const p = (2 + bx[6]) * h;
|
|
966
|
+
return bx[0] <= (rec.i + 1) * W + p && bx[3] >= rec.i * W - p && bx[1] <= (rec.j + 1) * W + p && bx[4] >= rec.j * W - p && bx[2] <= (rec.k + 1) * W + p && bx[5] >= rec.k * W - p;
|
|
967
|
+
});
|
|
968
|
+
}
|
|
969
|
+
if (hit) {
|
|
970
|
+
rec.meshes.delete(L);
|
|
971
|
+
rec.skirt = null;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
for (const rec of st.chunks.values()) {
|
|
976
|
+
const L = wantLevel(st, rec, view);
|
|
977
|
+
if (!rec.meshes.has(L)) rec.meshes.set(L, buildChunk(core, st, P, suf, rec, L));
|
|
978
|
+
const prevLevel = rec.level;
|
|
979
|
+
rec.level = L;
|
|
980
|
+
for (const key of [...rec.meshes.keys()]) if (key !== L && key !== prevLevel) rec.meshes.delete(key);
|
|
981
|
+
}
|
|
982
|
+
return { state: st, out: merge(st) };
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
// ../evaluator/src/session.ts
|
|
986
|
+
var VOX_CACHE_MAX = 4;
|
|
987
|
+
var VOX_FULL_FRACTION = 0.6;
|
|
988
|
+
var now = () => typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
989
|
+
function suffixMax2(table, count) {
|
|
990
|
+
const o = new Float64Array(count + 1);
|
|
991
|
+
for (let i = count - 1; i >= 0; i--) o[i] = Math.max(o[i + 1], table[i * STAMP_STRIDE + 17]);
|
|
992
|
+
return o;
|
|
993
|
+
}
|
|
994
|
+
function dirtyBox(e, P, R, step) {
|
|
995
|
+
const nOld = e.count, nNew = P.count, nMin = Math.min(nOld, nNew);
|
|
996
|
+
const changedOld = [], changedNew = [];
|
|
997
|
+
for (let i = 0; i < nMin; i++) {
|
|
998
|
+
const a = i * STAMP_STRIDE;
|
|
999
|
+
for (let k = 0; k < STAMP_STRIDE; k++) {
|
|
1000
|
+
if (e.table[a + k] !== P.table[a + k]) {
|
|
1001
|
+
changedOld.push(i);
|
|
1002
|
+
changedNew.push(i);
|
|
1003
|
+
break;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
for (let i = nMin; i < nOld; i++) changedOld.push(i);
|
|
1008
|
+
for (let i = nMin; i < nNew; i++) changedNew.push(i);
|
|
1009
|
+
const st = Math.max(step[0], step[1], step[2]);
|
|
1010
|
+
const [bx, by, bz] = P.bMin;
|
|
1011
|
+
const [wx, wy, wz] = P.bSize;
|
|
1012
|
+
let x0 = Infinity, y0 = Infinity, z0 = Infinity, x1 = -Infinity, y1 = -Infinity, z1 = -Infinity;
|
|
1013
|
+
let bad = false;
|
|
1014
|
+
const reach = (T, suf, i) => {
|
|
1015
|
+
const o = i * STAMP_STRIDE;
|
|
1016
|
+
const mode = T[o + 1], k = T[o + 17];
|
|
1017
|
+
if (mode === 2 || mode > 3) {
|
|
1018
|
+
bad = true;
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
const kk = mode === 3 ? 0.5 * k : k + suf[i + 1];
|
|
1022
|
+
const r = T[o + 18] + (kk + 3 * st) * 1.25 / Math.max(T[o + 19], 0.02);
|
|
1023
|
+
if (!(r < 4 * wx + 4 * wy + 4 * wz)) {
|
|
1024
|
+
bad = true;
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
const px = T[o + 2], py = T[o + 3], pz = T[o + 4];
|
|
1028
|
+
x0 = Math.min(x0, Math.floor((px - r - bx) / step[0]));
|
|
1029
|
+
x1 = Math.max(x1, Math.ceil((px + r - bx) / step[0]));
|
|
1030
|
+
y0 = Math.min(y0, Math.floor((py - r - by) / step[1]));
|
|
1031
|
+
y1 = Math.max(y1, Math.ceil((py + r - by) / step[1]));
|
|
1032
|
+
z0 = Math.min(z0, Math.floor((pz - r - bz) / step[2]));
|
|
1033
|
+
z1 = Math.max(z1, Math.ceil((pz + r - bz) / step[2]));
|
|
1034
|
+
};
|
|
1035
|
+
const sufOld = suffixMax2(e.table, nOld), sufNew = suffixMax2(P.table, nNew);
|
|
1036
|
+
for (const i of changedOld) reach(e.table, sufOld, i);
|
|
1037
|
+
for (const i of changedNew) reach(P.table, sufNew, i);
|
|
1038
|
+
if (bad) return null;
|
|
1039
|
+
if (x0 === Infinity) return "none";
|
|
1040
|
+
x0 = Math.max(0, x0);
|
|
1041
|
+
y0 = Math.max(0, y0);
|
|
1042
|
+
z0 = Math.max(0, z0);
|
|
1043
|
+
x1 = Math.min(R - 1, x1);
|
|
1044
|
+
y1 = Math.min(R - 1, y1);
|
|
1045
|
+
z1 = Math.min(R - 1, z1);
|
|
1046
|
+
const vox = Math.max(0, x1 - x0 + 1) * Math.max(0, y1 - y0 + 1) * Math.max(0, z1 - z0 + 1);
|
|
1047
|
+
if (vox > VOX_FULL_FRACTION * R * R * R) return null;
|
|
1048
|
+
return [x0, x1, y0, y1, z0, z1];
|
|
1049
|
+
}
|
|
1050
|
+
function createMeshSession(core, options = {}) {
|
|
1051
|
+
const useCache = options.cache ?? true;
|
|
1052
|
+
const cache = /* @__PURE__ */ new Map();
|
|
1053
|
+
const freeSlots = [];
|
|
1054
|
+
for (let i = VOX_CACHE_MAX - 1; i >= 0; i--) freeSlots.push(i);
|
|
1055
|
+
let info = { mode: "full", voxels: 0, total: 0 };
|
|
1056
|
+
const chunked = /* @__PURE__ */ new Map();
|
|
1057
|
+
const takeSlot = (key) => {
|
|
1058
|
+
let e = cache.get(key);
|
|
1059
|
+
if (e) {
|
|
1060
|
+
cache.delete(key);
|
|
1061
|
+
cache.set(key, e);
|
|
1062
|
+
return e;
|
|
1063
|
+
}
|
|
1064
|
+
if (!freeSlots.length) {
|
|
1065
|
+
const [oldKey, old] = cache.entries().next().value;
|
|
1066
|
+
cache.delete(oldKey);
|
|
1067
|
+
core.dropSlot(old.slot);
|
|
1068
|
+
freeSlots.push(old.slot);
|
|
1069
|
+
}
|
|
1070
|
+
e = { slot: freeSlots.pop(), res: -1, bMin: [NaN, NaN, NaN], bSize: [NaN, NaN, NaN], table: new Float64Array(0), count: 0 };
|
|
1071
|
+
cache.set(key, e);
|
|
1072
|
+
return e;
|
|
1073
|
+
};
|
|
1074
|
+
return {
|
|
1075
|
+
core,
|
|
1076
|
+
mesh(request) {
|
|
1077
|
+
const t0 = now();
|
|
1078
|
+
const R = clampResolution(request.resolution);
|
|
1079
|
+
const P = packSculpt(request.sculpt, request.palette);
|
|
1080
|
+
const prevChunks = chunked.get(request.key) ?? null;
|
|
1081
|
+
if (request.view && wantsChunks(P, prevChunks !== null)) {
|
|
1082
|
+
const { state, out } = chunkMesh(core, prevChunks, P, request.view);
|
|
1083
|
+
chunked.set(request.key, state);
|
|
1084
|
+
info = { mode: "chunks", voxels: out.chunks, total: out.chunks };
|
|
1085
|
+
const b2 = out.bounds;
|
|
1086
|
+
return {
|
|
1087
|
+
key: request.key,
|
|
1088
|
+
positions: out.pos,
|
|
1089
|
+
normals: out.nor,
|
|
1090
|
+
colors: out.col,
|
|
1091
|
+
foundation: out.fcol,
|
|
1092
|
+
material: out.mat,
|
|
1093
|
+
indices: out.idx,
|
|
1094
|
+
boundsMin: { x: b2[0], y: b2[1], z: b2[2] },
|
|
1095
|
+
boundsMax: { x: b2[3], y: b2[4], z: b2[5] },
|
|
1096
|
+
ms: now() - t0,
|
|
1097
|
+
...P.overflow ? { overflow: P.overflow } : {}
|
|
1098
|
+
};
|
|
1099
|
+
}
|
|
1100
|
+
chunked.delete(request.key);
|
|
1101
|
+
const step = [P.bSize[0] / (R - 1), P.bSize[1] / (R - 1), P.bSize[2] / (R - 1)];
|
|
1102
|
+
const total = R * R * R;
|
|
1103
|
+
const params = new Float64Array(PARAMS_LEN);
|
|
1104
|
+
params.set([P.bMin[0], P.bMin[1], P.bMin[2], step[0], step[1], step[2], R, R, R, 0, -1, 0, R - 1, 0, R - 1, 0, R - 1]);
|
|
1105
|
+
info = { mode: "full", voxels: total, total };
|
|
1106
|
+
let entry = null;
|
|
1107
|
+
if (useCache) {
|
|
1108
|
+
entry = takeSlot(request.key);
|
|
1109
|
+
params[10] = entry.slot;
|
|
1110
|
+
const sameGrid = entry.res === R && entry.bMin.every((v, i) => v === P.bMin[i]) && entry.bSize.every((v, i) => v === P.bSize[i]);
|
|
1111
|
+
const box = sameGrid ? dirtyBox(entry, P, R, step) : null;
|
|
1112
|
+
if (box === "none") {
|
|
1113
|
+
params.set([0, -1, 0, -1, 0, -1], 11);
|
|
1114
|
+
info = { mode: "none", voxels: 0, total };
|
|
1115
|
+
} else if (box) {
|
|
1116
|
+
params.set(box, 11);
|
|
1117
|
+
info = { mode: "region", voxels: (box[1] - box[0] + 1) * (box[3] - box[2] + 1) * (box[5] - box[4] + 1), total };
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
const raw = core.mesh(P.table, P.count, params, null);
|
|
1121
|
+
if (entry) {
|
|
1122
|
+
entry.res = R;
|
|
1123
|
+
entry.bMin = P.bMin;
|
|
1124
|
+
entry.bSize = P.bSize;
|
|
1125
|
+
entry.table = P.table;
|
|
1126
|
+
entry.count = P.count;
|
|
1127
|
+
}
|
|
1128
|
+
const b = raw.bounds;
|
|
1129
|
+
return {
|
|
1130
|
+
key: request.key,
|
|
1131
|
+
positions: raw.positions,
|
|
1132
|
+
normals: raw.normals,
|
|
1133
|
+
colors: raw.colors,
|
|
1134
|
+
foundation: raw.foundation,
|
|
1135
|
+
material: raw.material,
|
|
1136
|
+
indices: raw.indices,
|
|
1137
|
+
boundsMin: { x: b[0], y: b[1], z: b[2] },
|
|
1138
|
+
boundsMax: { x: b[3], y: b[4], z: b[5] },
|
|
1139
|
+
ms: now() - t0,
|
|
1140
|
+
...P.overflow ? { overflow: P.overflow } : {}
|
|
1141
|
+
};
|
|
1142
|
+
},
|
|
1143
|
+
skinWeights(request) {
|
|
1144
|
+
const segs = [];
|
|
1145
|
+
request.bones.forEach((bone, bi) => {
|
|
1146
|
+
const h = bone.head;
|
|
1147
|
+
if (!bone.childHeads.length) segs.push(h.x, h.y, h.z, h.x, h.y, h.z, bi);
|
|
1148
|
+
else for (const c of bone.childHeads) segs.push(h.x, h.y, h.z, c.x, c.y, c.z, bi);
|
|
1149
|
+
});
|
|
1150
|
+
const raw = core.skin(request.positions, Float64Array.from(segs), segs.length / SEGMENT_STRIDE, request.bones.length);
|
|
1151
|
+
return { key: request.key, boneIndices: raw.boneIndices, boneWeights: raw.boneWeights };
|
|
1152
|
+
},
|
|
1153
|
+
forget(key) {
|
|
1154
|
+
chunked.delete(key);
|
|
1155
|
+
const e = cache.get(key);
|
|
1156
|
+
if (!e) return;
|
|
1157
|
+
cache.delete(key);
|
|
1158
|
+
core.dropSlot(e.slot);
|
|
1159
|
+
freeSlots.push(e.slot);
|
|
1160
|
+
},
|
|
1161
|
+
lastInfo: () => info
|
|
1162
|
+
};
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
// dreamy:inline-worker
|
|
1166
|
+
var code = '"use strict";(()=>{var YA=Uint8Array.fromBase64||(()=>{for(var A=new Uint8Array(128),t=0;t<64;t++)A[t<26?t+65:t<52?t+71:t<62?t-4:t*4-205]=t;return e=>{for(var n=e.length,s=new Uint8Array((n-(e[n-1]=="=")-(e[n-2]=="="))*3/4|0),y=0,r=0;y<n;){var i=A[e.charCodeAt(y++)],o=A[e.charCodeAt(y++)],m=A[e.charCodeAt(y++)],c=A[e.charCodeAt(y++)];s[r++]=i<<2|o>>4,s[r++]=o<<4|m>>2,s[r++]=m<<6|c}return s}})();var QA=YA("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");var TA={cube:0,sphere:1,cylinder:2,torus:3,cone:4,pyramid:5,prism:6,octahedron:7,capsule:8,dome:9},At={add:0,subtract:1,intersect:2,paint:3},EA=7;function JA(A){let t=()=>new Float32Array(A);return{field:t(),cR:t(),cG:t(),cB:t(),fR:t(),fG:t(),fB:t(),mat:new Float32Array(A*4)}}var MA=(A,t)=>A<t?A:t,O=(A,t)=>A>t?A:t,$A=A=>O(0,MA(1,A)),AA=Math.fround;function Ft(A,t,e,n,s,y,r){if(A===0){let j=Math.abs(t)-s,d=Math.abs(e)-y,a=Math.abs(n)-r,u=O(j,0),f=O(d,0),l=O(a,0),b=Math.sqrt(u*u+f*f+l*l),h=MA(O(j,O(d,a)),0);return b+h}let i=t/s,o=e/y,m=n/r,c=MA(MA(s,y),r);switch(A){case 1:return(Math.sqrt(i*i+o*o+m*m)-1)*c;case 2:{let j=(Math.sqrt(i*i+m*m)-1)*MA(s,r),d=Math.abs(e)-y,a=O(j,0),u=O(d,0);return MA(O(j,d),0)+Math.sqrt(a*a+u*u)}case 3:{let j=Math.sqrt(i*i+m*m)-.8;return(Math.sqrt(j*j+o*o)-.3)*c}case 4:{let j=Math.sqrt(i*i+m*m),d=o,a=j-MA(j,d<0?1:0),u=Math.abs(d)-1,f=O(0,MA(1,(j+2-2*d)/5)),l=j-f,b=d-1+2*f;return(l<0&&u<0?-1:1)*Math.sqrt(MA(a*a+u*u,l*l+b*b))*c}case 5:return O(O((2*Math.abs(i)+o-1)/2.236068,(2*Math.abs(m)+o-1)/2.236068),-o-1)*c;case 6:return O(O((2*Math.abs(i)+o-1)/2.236068,-o-1),Math.abs(m)-1)*c;case 7:return(Math.abs(i)+Math.abs(o)+Math.abs(m)-1)/1.7320508*c;case 8:{let j=Math.sqrt(i*i+m*m),d=O(Math.abs(o)-.5,0)/.5;return(Math.sqrt(j*j+d*d)-1)*c*.5}case 9:{let j=Math.sqrt(i*i+(o+1)*(o+1)+m*m)-1;return O(j,-(o+1))*c}default:return 1e5}}function tt(A,t,e,n,s,y,r,i,o,m,c,j,d,a,u,f,l){let{field:b,cR:h,cG:M,cB:x,fR:k,fG:F,fB:D,mat:N}=e,L=t.length,P=32;for(let I=f;I<=l;I++){let H=i+I*c;for(let q=a;q<=u;q++){let R=r+q*m;for(let fA=j;fA<=d;fA++){let FA=y+fA*o,oA=fA+q*n+I*n*s,v=1e5,J=A[20],B=A[21],g=A[22],V=A[23],W=A[24],U=A[25],X=A[26],Z=A[27],Y=A[28],S=A[29];for(let K=0;K<L;K++){let Q=t[K],E=Q*P,G=A[E+1],w=A[E+17],jA=FA-A[E+2],tA=R-A[E+3],eA=H-A[E+4];if(Q>0){let p=Math.sqrt(jA*jA+tA*tA+eA*eA)-A[E+18];if(p>0&&(p*=A[E+19]),G===0&&p-v>=w||G===1&&p+v>=w||G===3&&p>=w*.5)continue}let DA=A[E+5]*jA+A[E+6]*tA+A[E+7]*eA,SA=A[E+8]*jA+A[E+9]*tA+A[E+10]*eA,xA=A[E+11]*jA+A[E+12]*tA+A[E+13]*eA,$=Ft(A[E],DA,SA,xA,A[E+14],A[E+15],A[E+16]);if(Q>0){let p=O(w,1e-4);if(G===0?$-v>=p:G===1&&$+v>=p)continue}let nA=A[E+20],T=A[E+21],rA=A[E+22],dA=A[E+23],cA=A[E+24],uA=A[E+25],yA=A[E+26],bA=A[E+27],hA=A[E+28],pA=A[E+29],z=A[E+30];if(G===0)if(Q===0)v=$,J=nA,B=T,g=rA,V=dA,W=cA,U=uA;else{let p=$A(.5+.5*($-v)/O(w,1e-4));J=nA+(J-nA)*p,B=T+(B-T)*p,g=rA+(g-rA)*p,V=dA+(V-dA)*p,W=cA+(W-cA)*p,U=uA+(U-uA)*p,v=$*(1-p)+v*p-w*p*(1-p),X=AA(yA+(X-yA)*p),Z=AA(bA+(Z-bA)*p),Y=AA(hA+(Y-hA)*p),S=AA(pA+(S-pA)*p)}else if(G===1){let p=$A(.5-.5*($+v)/O(w,1e-4));J=J+(nA-J)*p,B=B+(T-B)*p,g=g+(rA-g)*p,V=V+(dA-V)*p,W=W+(cA-W)*p,U=U+(uA-U)*p,v=v*(1-p)-$*p+w*p*(1-p),z!==0&&(z&1&&(X=AA(X+(yA-X)*p)),z&2&&(Z=AA(Z+(bA-Z)*p)),z&4&&(Y=AA(Y+(hA-Y)*p)),z&8&&(S=AA(S+(pA-S)*p)))}else if(G===2){let p=$A(.5-.5*($-v)/O(w,1e-4));J=nA+(J-nA)*p,B=T+(B-T)*p,g=rA+(g-rA)*p,V=dA+(V-dA)*p,W=cA+(W-cA)*p,U=uA+(U-uA)*p,v=$*(1-p)+v*p+w*p*(1-p),z!==0&&(z&1&&(X=AA(yA+(X-yA)*p)),z&2&&(Z=AA(bA+(Z-bA)*p)),z&4&&(Y=AA(hA+(Y-hA)*p)),z&8&&(S=AA(pA+(S-pA)*p)))}else if(G===3&&$<w*.5){let p=$A(1-$/O(w*.5,.05));J=J+(nA-J)*p,B=B+(T-B)*p,g=g+(rA-g)*p,V=V+(dA-V)*p,W=W+(cA-W)*p,U=U+(uA-U)*p,z!==0&&(z&1&&(X=AA(X+(yA-X)*p)),z&2&&(Z=AA(Z+(bA-Z)*p)),z&4&&(Y=AA(Y+(hA-Y)*p)),z&8&&(S=AA(S+(pA-S)*p)))}}b[oA]=v,h[oA]=J,M[oA]=B,x[oA]=g,k[oA]=V,F[oA]=W,D[oA]=U;let C=oA*4;N[C]=X,N[C+1]=Z,N[C+2]=Y,N[C+3]=S}}}}var RA=[0,1,0,1,0,1,0,1],KA=[0,0,1,1,0,0,1,1],GA=[0,0,0,0,1,1,1,1],St=[0,2,4,6,0,1,4,5,0,1,2,3],gt=[1,3,5,7,2,3,6,7,4,5,6,7];function et(A,t,e,n,s,y,r,i,o,m,c){let{field:j,cR:d,cG:a,cB:u,fR:f,fG:l,fB:b,mat:h}=A,M=[],x=[],k=[],F=[],D=[],N=[],L=t-1,P=e-1,I=n-1,H=new Int32Array(Math.max(0,L*P*I)).fill(-1),q=new Float64Array(8),R=new Int32Array(8),fA=0;for(let S=0;S<I;S++)for(let C=0;C<P;C++)for(let K=0;K<L;K++){let Q=0;for(let aA=0;aA<8;aA++){let mA=K+RA[aA]+(C+KA[aA])*t+(S+GA[aA])*t*e;R[aA]=mA;let kA=j[mA];q[aA]=kA,kA<0&&(Q|=1<<aA)}if(Q===0||Q===255)continue;let E=0,G=0,w=0,jA=0,tA=0,eA=0,DA=0,SA=0,xA=0,$=0,nA=0,T=0,rA=0,dA=0;for(let aA=0;aA<12;aA++){let mA=St[aA],kA=gt[aA],NA=q[mA],ZA=q[kA];if(NA<0==ZA<0)continue;let lA=NA/(NA-ZA);E+=RA[mA]+lA*(RA[kA]-RA[mA]),G+=KA[mA]+lA*(KA[kA]-KA[mA]),w+=GA[mA]+lA*(GA[kA]-GA[mA]);let iA=R[mA],IA=R[kA];jA+=d[iA]+lA*(d[IA]-d[iA]),tA+=a[iA]+lA*(a[IA]-a[iA]),eA+=u[iA]+lA*(u[IA]-u[iA]),DA+=f[iA]+lA*(f[IA]-f[iA]),SA+=l[iA]+lA*(l[IA]-l[iA]),xA+=b[iA]+lA*(b[IA]-b[iA]);let qA=iA*4,CA=IA*4;nA+=h[qA]+lA*(h[CA]-h[qA]),T+=h[qA+1]+lA*(h[CA+1]-h[qA+1]),rA+=h[qA+2]+lA*(h[CA+2]-h[qA+2]),dA+=h[qA+3]+lA*(h[CA+3]-h[qA+3]),$++}let cA=q[0],uA=q[1],yA=q[2],bA=q[3],hA=q[4],pA=q[5],z=q[6],p=q[7],LA=(uA-cA+(bA-yA)+(pA-hA)+(p-z))/i,PA=(yA-cA+(bA-uA)+(z-hA)+(p-pA))/o,HA=(hA-cA+(pA-uA)+(z-yA)+(p-bA))/m,OA=Math.sqrt(LA*LA+PA*PA+HA*HA);OA>1e-12?x.push(LA/OA,PA/OA,HA/OA):x.push(0,1,0);let sA=1/$;M.push(s+(K+E*sA)*i,y+(C+G*sA)*o,r+(S+w*sA)*m),k.push(jA*sA,tA*sA,eA*sA),F.push(DA*sA,SA*sA,xA*sA),D.push(nA*sA,T*sA,rA*sA,dA*sA),H[K+C*L+S*L*P]=fA++}let FA=[t,e,n],oA=[L,P,I],v=[1,L,L*P],J=[1,t,t*e],B=[0,0,0];for(let S=0;S<n;S++)for(let C=0;C<e;C++)for(let K=0;K<t;K++){B[0]=K,B[1]=C,B[2]=S;let Q=K+C*t+S*t*e;for(let E=0;E<3;E++){let G=(E+1)%3,w=(E+2)%3,jA=B[E],tA=B[G],eA=B[w];if(jA>=FA[E]-1||jA<c||tA<1||tA>oA[G]-1||eA<1||eA>oA[w]-1)continue;let DA=j[Q]<0,SA=j[Q+J[E]]<0;if(DA===SA)continue;let xA=jA*v[E],$=H[xA+(tA-1)*v[G]+(eA-1)*v[w]],nA=H[xA+tA*v[G]+(eA-1)*v[w]],T=H[xA+tA*v[G]+eA*v[w]],rA=H[xA+(tA-1)*v[G]+eA*v[w]];$<0||nA<0||T<0||rA<0||(DA?N.push($,nA,T,$,T,rA):N.push($,T,nA,$,rA,T))}}let g=Float32Array.from(M),V=0,W=0,U=0,X=0,Z=0,Y=0;if(g.length>0){V=X=g[0],W=Z=g[1],U=Y=g[2];for(let S=3;S<g.length;S+=3){let C=g[S],K=g[S+1],Q=g[S+2];C<V&&(V=C),C>X&&(X=C),K<W&&(W=K),K>Z&&(Z=K),Q<U&&(U=Q),Q>Y&&(Y=Q)}}return{positions:g,normals:Float32Array.from(x),colors:Float32Array.from(k),foundation:Float32Array.from(F),material:Float32Array.from(D),indices:Uint32Array.from(N),bounds:[V,W,U,X,Z,Y]}}var Bt=.08;function nt(A,t,e,n){let s=Math.floor(A.length/3),y=new Float32Array(s*4),r=new Float32Array(s*4);if(n===0)return{boneIndices:y,boneWeights:r};let i=new Float32Array(n);for(let o=0;o<s;o++){let m=A[o*3],c=A[o*3+1],j=A[o*3+2];i.fill(1/0);for(let a=0;a<e;a++){let u=a*EA,f=t[u],l=t[u+1],b=t[u+2],h=t[u+3]-f,M=t[u+4]-l,x=t[u+5]-b,k=t[u+6],F=m-f,D=c-l,N=j-b,L=h*h+M*M+x*x,P=L>1e-8?(F*h+D*M+N*x)/L:0;P=P<0?0:P>1?1:P;let I=F-h*P,H=D-M*P,q=N-x*P,R=I*I+H*H+q*q;R<i[k]&&(i[k]=R)}let d=0;for(let a=0;a<4;a++){let u=-1,f=1/0;for(let h=0;h<n;h++)i[h]<f&&(f=i[h],u=h);if(u<0){y[o*4+a]=0,r[o*4+a]=0;continue}let l=f+Bt,b=1/(l*l);y[o*4+a]=u,r[o*4+a]=b,d+=b,i[u]=1/0}for(let a=0;a<4;a++)r[o*4+a]=r[o*4+a]/d}return{boneIndices:y,boneWeights:r}}function rt(){let A=new Map,t=new Map;return{kind:"reference",mesh(e,n,s,y){let r=s[6],i=s[7],o=s[8],m=r*i*o,c=s[10],j,d=!0;c>=0?(j=A.get(c),j&&j.field.length===m?d=!1:(j=JA(m),A.set(c,j))):(j=t.get(m),j||(j=JA(m),t.set(m,j)));let a=y;if(!a||a.length===0){a=new Int32Array(n);for(let f=0;f<n;f++)a[f]=f}let u=d?[0,r-1,0,i-1,0,o-1]:[s[11],s[12],s[13],s[14],s[15],s[16]];return n>0?tt(e,a,j,r,i,s[0],s[1],s[2],s[3],s[4],s[5],u[0],u[1],u[2],u[3],u[4],u[5]):j.field.fill(1e5),et(j,r,i,o,s[0],s[1],s[2],s[3],s[4],s[5],s[9])},dropSlot(e){A.delete(e)},skin(e,n,s,y){return nt(e,n,s,y)}}}function wt(A){let t=A.exports,e=0,n=0,s=r=>(r>n&&(e&&t.free(e,n),n=Math.max(r,n*2,4096),e=t.alloc(n)),e),y=r=>r+7&-8;return{kind:"wasm",mesh(r,i,o,m){let c=y(i*32*8),j=136,d=m?m.length:0,a=s(c+j+d*4),u=t.memory.buffer;new Float64Array(u,a,i*32).set(r.subarray(0,i*32)),new Float64Array(u,a+c,17).set(o.subarray(0,17)),m&&d&&new Int32Array(u,a+c+j,d).set(m);let f=t.mesh(a,i,a+c,a+c+j,d),l=t.memory.buffer,b=new Uint32Array(l,f,16),h=b[0],M=b[1],x=(F,D)=>new Float32Array(l,F,D).slice(),k=new Float32Array(l,f+32,6);return{positions:x(b[2],h*3),normals:x(b[3],h*3),colors:x(b[4],h*3),foundation:x(b[5],h*3),material:x(b[6],h*4),indices:new Uint32Array(l,b[7],M).slice(),bounds:[k[0],k[1],k[2],k[3],k[4],k[5]]}},dropSlot(r){t.drop_slot(r)},skin(r,i,o,m){let c=Math.floor(r.length/3),j=y(c*3*4),d=s(j+o*EA*8),a=t.memory.buffer;new Float32Array(a,d,c*3).set(r.subarray(0,c*3)),new Float64Array(a,d+j,o*EA).set(i.subarray(0,o*EA));let u=t.skin(d,c,d+j,o,m),f=t.memory.buffer;return{boneIndices:new Float32Array(f,u,c*4).slice(),boneWeights:new Float32Array(f,u+c*16,c*4).slice()}}}}async function ot(A){let{instance:t}=await WebAssembly.instantiate(A,{});return wt(t)}var Ot=8,Ct=144,BA=16,$t=3,st=20,Rt=.25,at={nV:0,pos:new Float32Array(0),nor:new Float32Array(0),col:new Float32Array(0),fcol:new Float32Array(0),mat:new Float32Array(0),idx:new Uint32Array(0)};function lt(A,t){return Math.max(A.bSize[0],A.bSize[1],A.bSize[2])>=Ot*(t?.8:1)}function Kt(A){let t=Math.floor(Math.log10(A)),e=A/Math.pow(10,t);for(let n of[1,1.25,1.5,2,2.5,3,4,5,6,8,10])if(e<=n+1e-9)return n*Math.pow(10,t);return 10*Math.pow(10,t)}function VA(A,t){let e=new Float64Array(t+1);for(let n=t-1;n>=0;n--)e[n]=Math.max(e[n+1],A[n*32+17]);return e}function Gt(A,t,e,n){let s=Math.min(t,n),y=[],r=[];for(let d=0;d<s;d++){let a=d*32;for(let u=0;u<32;u++)if(A[a+u]!==e[a+u]){y.push(d),r.push(d);break}}for(let d=s;d<t;d++)y.push(d);for(let d=s;d<n;d++)r.push(d);let i=[],o=!1,m=(d,a,u)=>{let f=u*32,l=d[f+1],b=d[f+17];if(l===2||l>3){o=!0;return}let h=l===3?.5*b:b+a[u+1],M=1.25/Math.max(d[f+19],.02),x=d[f+18]+h*M,k=d[f+2],F=d[f+3],D=d[f+4];i.push([k-x,F-x,D-x,k+x,F+x,D+x,3*M])},c=VA(A,t),j=VA(e,n);for(let d of y)m(A,c,d);for(let d of r)m(e,j,d);return o?null:i}function zt(A,t,e,n,s,y){let r=[],i=!1;for(let o=0;o<t;o++){let m=o*32,c=A[m+1],j=!0;if(c===0||c===3){let d=c===3?.5*A[m+17]:A[m+17]+e[o+1],a=A[m+18]+(d+3*y)*1.25/Math.max(A[m+19],.02),u=A[m+2],f=A[m+3],l=A[m+4],b=Math.max(n[0]-u,0,u-s[0]),h=Math.max(n[1]-f,0,f-s[1]),M=Math.max(n[2]-l,0,l-s[2]);j=b*b+h*h+M*M<=a*a}c===0&&j&&(i=!0),(j||o===0)&&r.push(o)}return i?Int32Array.from(r):null}function _t(A,t,e,n,s,y){let r=t.h0,i=1<<y,o=BA>>y,m=i*r,c=o+2,j=(s.i*BA-i)*r,d=(s.j*BA-i)*r,a=(s.k*BA-i)*r,u=t.W,f=2*m,l=zt(e.table,e.count,n,[s.i*u-f,s.j*u-f,s.k*u-f],[(s.i+1)*u+f,(s.j+1)*u+f,(s.k+1)*u+f],m);if(!l)return at;let b=new Float64Array(17);b.set([j,d,a,m,m,m,c,c,c,1,-1,0,c-1,0,c-1,0,c-1]);let h=A.mesh(e.table,e.count,b,l);return h.indices.length?{nV:h.positions.length/3,pos:h.positions.slice(),nor:h.normals.slice(),col:h.colors.slice(),fcol:h.foundation.slice(),mat:h.material.slice(),idx:h.indices.slice()}:at}function Lt(A,t){let e=A.idx,n=new Map,s=(u,f)=>u<f?u*A.nV+f:f*A.nV+u;for(let u=0;u<e.length;u+=3)for(let f=0;f<3;f++){let l=s(e[u+f],e[u+(f+1)%3]);n.set(l,(n.get(l)??0)+1)}let y=[];for(let u=0;u<e.length;u+=3)for(let f=0;f<3;f++){let l=e[u+f],b=e[u+(f+1)%3];n.get(s(l,b))===1&&y.push(l,b)}let r=y.length/2;if(!r)return null;let i=r*4,o=new Float32Array(i*3),m=new Float32Array(i*3),c=new Float32Array(i*3),j=new Float32Array(i*3),d=new Float32Array(i*4),a=new Uint32Array(r*12);for(let u=0;u<r;u++){let f=y[u*2],l=y[u*2+1],b=u*4;[f,l,l,f].forEach((h,M)=>{let x=(b+M)*3,k=h*3,F=M>=2?t:0;for(let D=0;D<3;D++)o[x+D]=A.pos[k+D]-A.nor[k+D]*F,m[x+D]=A.nor[k+D],c[x+D]=A.col[k+D],j[x+D]=A.fcol[k+D];for(let D=0;D<4;D++)d[(b+M)*4+D]=A.mat[h*4+D]}),a.set([b,b+1,b+2,b,b+2,b+3,b,b+2,b+1,b,b+3,b+2],u*12)}return{nV:i,pos:o,nor:m,col:c,fcol:j,mat:d,idx:a}}function Pt(A,t,e){let n=A.W,s=e.camera,y=Math.max(t.i*n-s.x,0,s.x-(t.i+1)*n),r=Math.max(t.j*n-s.y,0,s.y-(t.j+1)*n),i=Math.max(t.k*n-s.z,0,s.z-(t.k+1)*n),o=Math.max(Math.sqrt(y*y+r*r+i*i),.001),m=d=>A.h0*(1<<d)*e.pixelsPerUnitAtDistance1/o,c=0;for(let d=$t-1;d>=0;d--)if(m(d)<=st){c=d;break}let j=t.level;return j===null||c<=j||m(c)*(1+Rt)<=st?c:j}function Ht(A,t,e){let n=0;for(let s=-1;s<=1;s++)for(let y=-1;y<=1;y++)for(let r=-1;r<=1;r++){if(!s&&!y&&!r)continue;let i=A.chunks.get(`${t.i+s},${t.j+y},${t.k+r}`);if(!i||i.level===null||i.level===t.level)continue;let o=i.meshes.get(i.level);!o||!o.nV||(n=Math.max(n,A.h0*(1<<Math.max(i.level,t.level??0))))}return n?(t.skirt&&t.skirtDepth===n&&t.skirtOf===e||(t.skirt=Lt(e,n),t.skirtDepth=n,t.skirtOf=e),t.skirt):null}function Nt(A){let t=[],e=0,n=0;for(let f of A.chunks.values()){let l=f.level===null?null:f.meshes.get(f.level);if(!l||!l.nV)continue;t.push(l),e+=l.nV,n+=l.idx.length;let b=Ht(A,f,l);b&&(t.push(b),e+=b.nV,n+=b.idx.length)}let s=new Float32Array(e*3),y=new Float32Array(e*3),r=new Float32Array(e*3),i=new Float32Array(e*3),o=new Float32Array(e*4),m=new Uint32Array(n),c=0,j=0,d=[1/0,1/0,1/0],a=[-1/0,-1/0,-1/0];for(let f of t){s.set(f.pos,c*3),y.set(f.nor,c*3),r.set(f.col,c*3),i.set(f.fcol,c*3),o.set(f.mat,c*4);for(let l=0;l<f.idx.length;l++)m[j+l]=f.idx[l]+c;c+=f.nV,j+=f.idx.length}for(let f=0;f<s.length;f+=3)for(let l=0;l<3;l++)d[l]=Math.min(d[l],s[f+l]),a[l]=Math.max(a[l],s[f+l]);let u=e?[d[0],d[1],d[2],a[0],a[1],a[2]]:[0,0,0,0,0,0];return{nV:e,pos:s,nor:y,col:r,fcol:i,mat:o,idx:m,bounds:u,chunks:A.chunks.size}}function it(A,t,e,n){let s=Math.max(e.bSize[0],e.bSize[1],e.bSize[2]),y=Kt(s/Ct),r=BA*y,i=t;(!i||i.h0!==y)&&(i={h0:y,W:r,chunks:new Map,table:new Float64Array(0),count:0});let o=i.count?Gt(i.table,i.count,e.table,e.count):null;i.table=e.table,i.count=e.count;let m=VA(e.table,e.count),c=[0,1,2].map(a=>Math.floor(e.bMin[a]/r)),j=[0,1,2].map(a=>Math.ceil((e.bMin[a]+e.bSize[a])/r)-1),d=new Set;for(let a=c[2];a<=j[2];a++)for(let u=c[1];u<=j[1];u++)for(let f=c[0];f<=j[0];f++){let l=`${f},${u},${a}`;d.add(l),i.chunks.has(l)||i.chunks.set(l,{i:f,j:u,k:a,level:null,meshes:new Map,skirt:null,skirtDepth:0,skirtOf:null})}for(let a of[...i.chunks.keys()])d.has(a)||i.chunks.delete(a);for(let a of i.chunks.values())for(let u of[...a.meshes.keys()]){let f=o===null;if(!f){let l=y*(1<<u);f=o.some(b=>{let h=(2+b[6])*l;return b[0]<=(a.i+1)*r+h&&b[3]>=a.i*r-h&&b[1]<=(a.j+1)*r+h&&b[4]>=a.j*r-h&&b[2]<=(a.k+1)*r+h&&b[5]>=a.k*r-h})}f&&(a.meshes.delete(u),a.skirt=null)}for(let a of i.chunks.values()){let u=Pt(i,a,n);a.meshes.has(u)||a.meshes.set(u,_t(A,i,e,m,a,u));let f=a.level;a.level=u;for(let l of[...a.meshes.keys()])l!==u&&l!==f&&a.meshes.delete(l)}return{state:i,out:Nt(i)}}var Jt={tongue:16021135,teeth:16514042,black:1118481},Vt=16711935;function Wt(A,t){if(A==="tongue"||A==="teeth"||A==="black")return Jt[A];let e=t[A];return typeof e=="number"?e:Vt}function WA(A,t){let e=Wt(A,t);return[(e>>16&255)/255,(e>>8&255)/255,(e&255)/255]}var zA=[1,0,0,0,1,0,0,0,1];function _A(A){let t=Math.sqrt(A.x*A.x+A.y*A.y+A.z*A.z+A.w*A.w)||1,e=A.x/t,n=A.y/t,s=A.z/t,y=A.w/t,r=e+e,i=n+n,o=s+s,m=e*r,c=e*i,j=e*o,d=n*i,a=n*o,u=s*o,f=y*r,l=y*i,b=y*o;return[1-(d+u),c-b,j+l,c+b,1-(m+u),a-f,j-l,a+f,1-(m+d)]}function jt(A,t,e,n){let s=Math.cos(n),y=Math.sin(n),r=1-s,i=r*A,o=r*t;return[i*A+s,i*t-y*e,i*e+y*t,i*t+y*e,o*t+s,o*e-y*A,i*e-y*t,o*e+y*A,r*e*e+s]}function wA(A,t,e){return[A,0,0,0,t,0,0,0,e]}function gA(A,t){let e=[];for(let n=0;n<3;n++)for(let s=0;s<3;s++)e.push(A[n*3]*t[s]+A[n*3+1]*t[3+s]+A[n*3+2]*t[6+s]);return e}function ct(A){return[A[0],A[3],A[6],A[1],A[4],A[7],A[2],A[5],A[8]]}function ut(A){return A[0]*(A[4]*A[8]-A[5]*A[7])-A[1]*(A[3]*A[8]-A[5]*A[6])+A[2]*(A[3]*A[7]-A[4]*A[6])}function mt(A,t,e,n){return[A[0]*t+A[1]*e+A[2]*n,A[3]*t+A[4]*e+A[5]*n,A[6]*t+A[7]*e+A[8]*n]}function ft(A,t){let e=A.smearGroupId===void 0?void 0:t.smearGroups.find(s=>s.id===A.smearGroupId),n=t.look;return e?{mode:e.mode,blend:e.blend,color:e.color,foundationColor:e.foundationColor??e.color,material:A.material??{},symmetry:e.symmetry}:{mode:A.mode,blend:A.blend??n.blend,color:A.color??n.color,foundationColor:A.foundationColor??(A.color!==void 0?A.color:n.foundationColor),material:A.material??{},symmetry:A.symmetry}}var Ut=12,Xt=128,yt=1024,bt=["x","y","z"],Zt={x:[1,0,0],y:[0,1,0],z:[0,0,1]},Yt={x:wA(-1,1,1),y:wA(1,-1,1),z:wA(1,1,-1)},Qt=wA(-1,1,1);function ht(A){return bt.filter(t=>(A??[]).includes(t))}function pt(A,t){let e=Math.max(1,Math.min(Ut,Math.round(A)||1)),n=ht(t).length;for(;n>0&&e>1&&Math.pow(e,n)>Xt;)e--;return e}var Tt=A=>A.every((t,e)=>Math.abs(t-zA[e])<=1e-6),dt=new Map;function Ae(A,t){let e=ht(t),n=A+"|"+e.join(""),s=dt.get(n);if(s)return s;let y=e.length?e:A>1?["y"]:[],r=y.length?[zA]:[];for(let m of bt){if(!y.includes(m))continue;let c=[];if(A===2)c.push(zA,Yt[m]);else{let d=Zt[m];for(let a=0;a<A;a++)c.push(jt(d[0],d[1],d[2],a*Math.PI*2/A))}let j=[];for(let d of r)for(let a of c)j.push(gA(d,a));r=j}let i=new Set,o=[];for(let m of r){if(Tt(m))continue;let c=m.map(j=>Math.round(j*1e5)).join(",");i.has(c)||(i.add(c),o.push(m))}return dt.set(n,o),o}function xt(A,t,e,n,s){let y=_A(e.rotation),r=ct(y),i=e.position;return Ae(n,s).map(o=>{let m=gA(gA(y,o),r),c=mt(m,A.x-i.x,A.y-i.y,A.z-i.z),j=gA(m,t);return ut(m)<0&&(j=gA(j,Qt)),{position:[i.x+c[0],i.y+c[1],i.z+c[2]],rotation:j}})}var te=4,ee=128;function Mt(A){return Math.max(te,Math.min(ee,Math.round(A)||36))}function ne(A,t,e,n){if(A==="sphere")return Math.max(t,e,n);if(A==="cylinder"){let s=Math.max(t,n);return Math.sqrt(s*s+e*e)}if(A==="torus"){let s=1.1*Math.max(t,n),y=.3*e;return Math.sqrt(s*s+y*y)}return Math.sqrt(t*t+e*e+n*n)}function kt(A,t){let e=[],n=A.stamps.map(l=>ft(l,A)),s=0;A.stamps.forEach((l,b)=>{let h=_A(l.rotation),M={shape:l.shape,sx:l.scale.x,sy:l.scale.y,sz:l.scale.z,si:b};e.push({...M,pos:[l.position.x,l.position.y,l.position.z],rot:h});let x=n[b].symmetry,k=pt(x?.count??1,x?.axes);for(let F of xt(l.position,h,A.pivot,k,x?.axes)){if(e.length>=yt){s++;continue}e.push({...M,pos:F.position,rot:F.rotation})}});let y=e.length,r=new Float64Array(y*32),i=A.look.material,o=[i.roughness,i.metalness,i.glow,1],m=[1/0,1/0,1/0],c=[-1/0,-1/0,-1/0],j=-1/0;e.forEach((l,b)=>{let h=n[l.si],M=b*32,x=l.sx*.5,k=l.sy*.5,F=l.sz*.5;r[M]=TA[l.shape]??-1,r[M+1]=At[h.mode]??4,r[M+2]=l.pos[0],r[M+3]=l.pos[1],r[M+4]=l.pos[2];let D=l.rot;r[M+5]=D[0],r[M+6]=D[3],r[M+7]=D[6],r[M+8]=D[1],r[M+9]=D[4],r[M+10]=D[7],r[M+11]=D[2],r[M+12]=D[5],r[M+13]=D[8],r[M+14]=x,r[M+15]=k,r[M+16]=F,r[M+17]=h.blend,r[M+18]=ne(l.shape,x,k,F),r[M+19]=l.shape==="cube"?1:Math.min(x,k,F)/Math.max(x,k,F,1e-4);let N=WA(h.color,t),L=WA(h.foundationColor,t);r[M+20]=N[0],r[M+21]=N[1],r[M+22]=N[2],r[M+23]=L[0],r[M+24]=L[1],r[M+25]=L[2];let P=[h.material.roughness,h.material.metalness,h.material.glow,h.material.flecks===void 0?void 0:h.material.flecks?1:0],I=0;for(let q=0;q<4;q++){let R=P[q];R!==void 0&&(I|=1<<q),r[M+26+q]=Math.fround(R??o[q])}r[M+30]=I,j=Math.max(j,h.blend);let H=[l.sx*.7,l.sy*.7,l.sz*.7];for(let q=0;q<3;q++)m[q]=Math.min(m[q],l.pos[q]-H[q]),c[q]=Math.max(c[q],l.pos[q]+H[q])}),y===0&&(m=[0,0,0],c=[0,0,0],j=0);let d=[c[0]-m[0],c[1]-m[1],c[2]-m[2]],a=Math.max(Math.min(.6,.35*Math.max(d[0],d[1],d[2])),j*1.5),u=[m[0]-a,m[1]-a,m[2]-a],f=[c[0]+a,c[1]+a,c[2]+a];return{table:r,count:y,overflow:s,maxBlend:j,bMin:u,bSize:[f[0]-u[0],f[1]-u[1],f[2]-u[2]]}}var re=4,oe=.6,UA=()=>typeof performance<"u"?performance.now():Date.now();function qt(A,t){let e=new Float64Array(t+1);for(let n=t-1;n>=0;n--)e[n]=Math.max(e[n+1],A[n*32+17]);return e}function se(A,t,e,n){let s=A.count,y=t.count,r=Math.min(s,y),i=[],o=[];for(let I=0;I<r;I++){let H=I*32;for(let q=0;q<32;q++)if(A.table[H+q]!==t.table[H+q]){i.push(I),o.push(I);break}}for(let I=r;I<s;I++)i.push(I);for(let I=r;I<y;I++)o.push(I);let m=Math.max(n[0],n[1],n[2]),[c,j,d]=t.bMin,[a,u,f]=t.bSize,l=1/0,b=1/0,h=1/0,M=-1/0,x=-1/0,k=-1/0,F=!1,D=(I,H,q)=>{let R=q*32,fA=I[R+1],FA=I[R+17];if(fA===2||fA>3){F=!0;return}let oA=fA===3?.5*FA:FA+H[q+1],v=I[R+18]+(oA+3*m)*1.25/Math.max(I[R+19],.02);if(!(v<4*a+4*u+4*f)){F=!0;return}let J=I[R+2],B=I[R+3],g=I[R+4];l=Math.min(l,Math.floor((J-v-c)/n[0])),M=Math.max(M,Math.ceil((J+v-c)/n[0])),b=Math.min(b,Math.floor((B-v-j)/n[1])),x=Math.max(x,Math.ceil((B+v-j)/n[1])),h=Math.min(h,Math.floor((g-v-d)/n[2])),k=Math.max(k,Math.ceil((g+v-d)/n[2]))},N=qt(A.table,s),L=qt(t.table,y);for(let I of i)D(A.table,N,I);for(let I of o)D(t.table,L,I);return F?null:l===1/0?"none":(l=Math.max(0,l),b=Math.max(0,b),h=Math.max(0,h),M=Math.min(e-1,M),x=Math.min(e-1,x),k=Math.min(e-1,k),Math.max(0,M-l+1)*Math.max(0,x-b+1)*Math.max(0,k-h+1)>oe*e*e*e?null:[l,M,b,x,h,k])}function XA(A,t={}){let e=t.cache??!0,n=new Map,s=[];for(let o=re-1;o>=0;o--)s.push(o);let y={mode:"full",voxels:0,total:0},r=new Map,i=o=>{let m=n.get(o);if(m)return n.delete(o),n.set(o,m),m;if(!s.length){let[c,j]=n.entries().next().value;n.delete(c),A.dropSlot(j.slot),s.push(j.slot)}return m={slot:s.pop(),res:-1,bMin:[NaN,NaN,NaN],bSize:[NaN,NaN,NaN],table:new Float64Array(0),count:0},n.set(o,m),m};return{core:A,mesh(o){let m=UA(),c=Mt(o.resolution),j=kt(o.sculpt,o.palette),d=r.get(o.key)??null;if(o.view&<(j,d!==null)){let{state:M,out:x}=it(A,d,j,o.view);r.set(o.key,M),y={mode:"chunks",voxels:x.chunks,total:x.chunks};let k=x.bounds;return{key:o.key,positions:x.pos,normals:x.nor,colors:x.col,foundation:x.fcol,material:x.mat,indices:x.idx,boundsMin:{x:k[0],y:k[1],z:k[2]},boundsMax:{x:k[3],y:k[4],z:k[5]},ms:UA()-m,...j.overflow?{overflow:j.overflow}:{}}}r.delete(o.key);let a=[j.bSize[0]/(c-1),j.bSize[1]/(c-1),j.bSize[2]/(c-1)],u=c*c*c,f=new Float64Array(17);f.set([j.bMin[0],j.bMin[1],j.bMin[2],a[0],a[1],a[2],c,c,c,0,-1,0,c-1,0,c-1,0,c-1]),y={mode:"full",voxels:u,total:u};let l=null;if(e){l=i(o.key),f[10]=l.slot;let x=l.res===c&&l.bMin.every((k,F)=>k===j.bMin[F])&&l.bSize.every((k,F)=>k===j.bSize[F])?se(l,j,c,a):null;x==="none"?(f.set([0,-1,0,-1,0,-1],11),y={mode:"none",voxels:0,total:u}):x&&(f.set(x,11),y={mode:"region",voxels:(x[1]-x[0]+1)*(x[3]-x[2]+1)*(x[5]-x[4]+1),total:u})}let b=A.mesh(j.table,j.count,f,null);l&&(l.res=c,l.bMin=j.bMin,l.bSize=j.bSize,l.table=j.table,l.count=j.count);let h=b.bounds;return{key:o.key,positions:b.positions,normals:b.normals,colors:b.colors,foundation:b.foundation,material:b.material,indices:b.indices,boundsMin:{x:h[0],y:h[1],z:h[2]},boundsMax:{x:h[3],y:h[4],z:h[5]},ms:UA()-m,...j.overflow?{overflow:j.overflow}:{}}},skinWeights(o){let m=[];o.bones.forEach((j,d)=>{let a=j.head;if(!j.childHeads.length)m.push(a.x,a.y,a.z,a.x,a.y,a.z,d);else for(let u of j.childHeads)m.push(a.x,a.y,a.z,u.x,u.y,u.z,d)});let c=A.skin(o.positions,Float64Array.from(m),m.length/EA,o.bones.length);return{key:o.key,boneIndices:c.boneIndices,boneWeights:c.boneWeights}},forget(o){r.delete(o);let m=n.get(o);m&&(n.delete(o),A.dropSlot(m.slot),s.push(m.slot))},lastInfo:()=>y}}function Et(A){return[A.positions.buffer,A.normals.buffer,A.colors.buffer,A.foundation.buffer,A.material.buffer,A.indices.buffer]}function Dt(A){return[A.boneIndices.buffer,A.boneWeights.buffer]}function It(A,t,e){let n=(y,r=[])=>A.postMessage(y,r),s=t().then(y=>(n({t:"ready",core:y.kind}),XA(y))).catch(y=>{let r=e();return n({t:"ready",core:r.kind,error:String(y)}),XA(r)});return A.onmessage=y=>{let r=y.data;s.then(i=>{if(r.t==="forget"){i.forget(r.key);return}try{if(r.t==="mesh"){let o=i.mesh(r.req);n({t:"mesh",id:r.id,res:o},Et(o))}else{let o=i.skinWeights(r.req);n({t:"skin",id:r.id,res:o},Dt(o))}}catch(o){n({t:"err",id:r.id,message:o instanceof Error?o.message:String(o)})}})},s}It(globalThis,()=>ot(QA),rt);})();\n';
|
|
1167
|
+
var url;
|
|
1168
|
+
function spawnWorker() {
|
|
1169
|
+
url ??= URL.createObjectURL(new Blob([code], { type: "text/javascript" }));
|
|
1170
|
+
return new Worker(url);
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
// ../evaluator/src/worker/client.ts
|
|
1174
|
+
var AbortError = class extends Error {
|
|
1175
|
+
name = "AbortError";
|
|
1176
|
+
};
|
|
1177
|
+
function queuedEvaluator(backend, ready) {
|
|
1178
|
+
const pending = /* @__PURE__ */ new Map();
|
|
1179
|
+
let running = null;
|
|
1180
|
+
let disposed = false;
|
|
1181
|
+
const pump = () => {
|
|
1182
|
+
if (running || disposed) return;
|
|
1183
|
+
const next = pending.entries().next();
|
|
1184
|
+
if (next.done) return;
|
|
1185
|
+
const [id, job] = next.value;
|
|
1186
|
+
pending.delete(id);
|
|
1187
|
+
running = { id, job };
|
|
1188
|
+
backend().run(job).then(
|
|
1189
|
+
(res) => {
|
|
1190
|
+
if (job.dead) return;
|
|
1191
|
+
job.resolve(res);
|
|
1192
|
+
},
|
|
1193
|
+
(e) => {
|
|
1194
|
+
if (!job.dead) job.reject(e);
|
|
1195
|
+
}
|
|
1196
|
+
).finally(() => {
|
|
1197
|
+
running = null;
|
|
1198
|
+
pump();
|
|
1199
|
+
});
|
|
1200
|
+
};
|
|
1201
|
+
const enqueue = (id, job) => {
|
|
1202
|
+
if (disposed) {
|
|
1203
|
+
job.reject(new AbortError("evaluator disposed"));
|
|
1204
|
+
return;
|
|
1205
|
+
}
|
|
1206
|
+
const old = pending.get(id);
|
|
1207
|
+
if (old) old.reject(new AbortError("superseded"));
|
|
1208
|
+
pending.set(id, job);
|
|
1209
|
+
pump();
|
|
1210
|
+
};
|
|
1211
|
+
return {
|
|
1212
|
+
ready,
|
|
1213
|
+
mesh(req) {
|
|
1214
|
+
return new Promise((resolve, reject) => enqueue("m:" + req.key, { kind: "mesh", req, resolve, reject, dead: false }));
|
|
1215
|
+
},
|
|
1216
|
+
skinWeights(req) {
|
|
1217
|
+
return new Promise((resolve, reject) => enqueue("s:" + req.key, { kind: "skin", req, resolve, reject, dead: false }));
|
|
1218
|
+
},
|
|
1219
|
+
cancel(key) {
|
|
1220
|
+
for (const id of ["m:" + key, "s:" + key]) {
|
|
1221
|
+
const job = pending.get(id);
|
|
1222
|
+
if (job) {
|
|
1223
|
+
pending.delete(id);
|
|
1224
|
+
job.reject(new AbortError("cancelled"));
|
|
1225
|
+
}
|
|
1226
|
+
if (running && running.id === id && !running.job.dead) {
|
|
1227
|
+
running.job.dead = true;
|
|
1228
|
+
running.job.reject(new AbortError("cancelled"));
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
if (!disposed) backend().forget(key);
|
|
1232
|
+
},
|
|
1233
|
+
dispose() {
|
|
1234
|
+
if (disposed) return;
|
|
1235
|
+
disposed = true;
|
|
1236
|
+
for (const job of pending.values()) job.reject(new AbortError("evaluator disposed"));
|
|
1237
|
+
pending.clear();
|
|
1238
|
+
if (running && !running.job.dead) {
|
|
1239
|
+
running.job.dead = true;
|
|
1240
|
+
running.job.reject(new AbortError("evaluator disposed"));
|
|
1241
|
+
}
|
|
1242
|
+
backend().dispose();
|
|
1243
|
+
}
|
|
1244
|
+
};
|
|
1245
|
+
}
|
|
1246
|
+
function inlineBackend(session) {
|
|
1247
|
+
return {
|
|
1248
|
+
run: (job) => new Promise((resolve, reject) => {
|
|
1249
|
+
setTimeout(() => {
|
|
1250
|
+
try {
|
|
1251
|
+
resolve(job.kind === "mesh" ? session.mesh(job.req) : session.skinWeights(job.req));
|
|
1252
|
+
} catch (e) {
|
|
1253
|
+
reject(e);
|
|
1254
|
+
}
|
|
1255
|
+
}, 0);
|
|
1256
|
+
}),
|
|
1257
|
+
forget: (key) => session.forget(key),
|
|
1258
|
+
dispose: () => {
|
|
1259
|
+
}
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
function createInlineEvaluator(core = createReferenceCore()) {
|
|
1263
|
+
const backend = inlineBackend(createMeshSession(core));
|
|
1264
|
+
return queuedEvaluator(() => backend, Promise.resolve(core.kind));
|
|
1265
|
+
}
|
|
1266
|
+
function createWorkerEvaluator(options) {
|
|
1267
|
+
const { port } = options;
|
|
1268
|
+
let nextId = 1;
|
|
1269
|
+
const waiting = /* @__PURE__ */ new Map();
|
|
1270
|
+
let fallback = null;
|
|
1271
|
+
let resolveReady;
|
|
1272
|
+
const ready = new Promise((r) => resolveReady = r);
|
|
1273
|
+
port.onmessage = (ev) => {
|
|
1274
|
+
const m = ev.data;
|
|
1275
|
+
if (m.t === "ready") {
|
|
1276
|
+
resolveReady(m.core);
|
|
1277
|
+
return;
|
|
1278
|
+
}
|
|
1279
|
+
const w = waiting.get(m.id);
|
|
1280
|
+
if (!w) return;
|
|
1281
|
+
waiting.delete(m.id);
|
|
1282
|
+
if (m.t === "err") w.reject(new Error(m.message));
|
|
1283
|
+
else w.resolve(m.res);
|
|
1284
|
+
};
|
|
1285
|
+
const remote = {
|
|
1286
|
+
run(job) {
|
|
1287
|
+
const id = nextId++;
|
|
1288
|
+
return new Promise((resolve, reject) => {
|
|
1289
|
+
waiting.set(id, { job, resolve, reject });
|
|
1290
|
+
const msg = job.kind === "mesh" ? { t: "mesh", id, req: job.req } : { t: "skin", id, req: job.req };
|
|
1291
|
+
port.postMessage(msg);
|
|
1292
|
+
});
|
|
1293
|
+
},
|
|
1294
|
+
forget(key) {
|
|
1295
|
+
port.postMessage({ t: "forget", key });
|
|
1296
|
+
},
|
|
1297
|
+
dispose() {
|
|
1298
|
+
for (const w of waiting.values()) w.reject(new AbortError("evaluator disposed"));
|
|
1299
|
+
waiting.clear();
|
|
1300
|
+
options.close?.();
|
|
1301
|
+
}
|
|
1302
|
+
};
|
|
1303
|
+
const asWorker = port;
|
|
1304
|
+
if (typeof asWorker.addEventListener === "function" && typeof asWorker.terminate === "function") {
|
|
1305
|
+
asWorker.addEventListener("error", () => {
|
|
1306
|
+
if (fallback) return;
|
|
1307
|
+
fallback = inlineBackend(createMeshSession(createReferenceCore()));
|
|
1308
|
+
resolveReady("reference");
|
|
1309
|
+
const lost = [...waiting.values()];
|
|
1310
|
+
waiting.clear();
|
|
1311
|
+
for (const w of lost) fallback.run(w.job).then(w.resolve, w.reject);
|
|
1312
|
+
asWorker.terminate?.();
|
|
1313
|
+
});
|
|
1314
|
+
}
|
|
1315
|
+
return queuedEvaluator(() => fallback ?? remote, ready);
|
|
1316
|
+
}
|
|
1317
|
+
function createEvaluator() {
|
|
1318
|
+
if (typeof Worker === "undefined") return createInlineEvaluator();
|
|
1319
|
+
let worker;
|
|
1320
|
+
try {
|
|
1321
|
+
worker = spawnWorker();
|
|
1322
|
+
} catch {
|
|
1323
|
+
return createInlineEvaluator();
|
|
1324
|
+
}
|
|
1325
|
+
return createWorkerEvaluator({ port: worker, close: () => worker.terminate() });
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
// ../evaluator/src/worker/protocol.ts
|
|
1329
|
+
function meshTransfer(r) {
|
|
1330
|
+
return [r.positions.buffer, r.normals.buffer, r.colors.buffer, r.foundation.buffer, r.material.buffer, r.indices.buffer];
|
|
1331
|
+
}
|
|
1332
|
+
function skinTransfer(r) {
|
|
1333
|
+
return [r.boneIndices.buffer, r.boneWeights.buffer];
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
// ../evaluator/src/worker/host.ts
|
|
1337
|
+
function startWorkerHost(port, load, fallback) {
|
|
1338
|
+
const post = (m, transfer = []) => port.postMessage(m, transfer);
|
|
1339
|
+
const ready = load().then((core) => {
|
|
1340
|
+
post({ t: "ready", core: core.kind });
|
|
1341
|
+
return createMeshSession(core);
|
|
1342
|
+
}).catch((e) => {
|
|
1343
|
+
const core = fallback();
|
|
1344
|
+
post({ t: "ready", core: core.kind, error: String(e) });
|
|
1345
|
+
return createMeshSession(core);
|
|
1346
|
+
});
|
|
1347
|
+
port.onmessage = (ev) => {
|
|
1348
|
+
const msg = ev.data;
|
|
1349
|
+
void ready.then((session) => {
|
|
1350
|
+
if (msg.t === "forget") {
|
|
1351
|
+
session.forget(msg.key);
|
|
1352
|
+
return;
|
|
1353
|
+
}
|
|
1354
|
+
try {
|
|
1355
|
+
if (msg.t === "mesh") {
|
|
1356
|
+
const res = session.mesh(msg.req);
|
|
1357
|
+
post({ t: "mesh", id: msg.id, res }, meshTransfer(res));
|
|
1358
|
+
} else {
|
|
1359
|
+
const res = session.skinWeights(msg.req);
|
|
1360
|
+
post({ t: "skin", id: msg.id, res }, skinTransfer(res));
|
|
1361
|
+
}
|
|
1362
|
+
} catch (e) {
|
|
1363
|
+
post({ t: "err", id: msg.id, message: e instanceof Error ? e.message : String(e) });
|
|
1364
|
+
}
|
|
1365
|
+
});
|
|
1366
|
+
};
|
|
1367
|
+
return ready;
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
// ../evaluator/src/wasm/core.ts
|
|
1371
|
+
var WASM_URL = new URL("../dreamy_evaluator.wasm", import.meta.url);
|
|
1372
|
+
function wasmCoreFromInstance(instance) {
|
|
1373
|
+
const ex = instance.exports;
|
|
1374
|
+
let block = 0;
|
|
1375
|
+
let blockSize = 0;
|
|
1376
|
+
const reserve = (bytes) => {
|
|
1377
|
+
if (bytes > blockSize) {
|
|
1378
|
+
if (block) ex.free(block, blockSize);
|
|
1379
|
+
blockSize = Math.max(bytes, blockSize * 2, 4096);
|
|
1380
|
+
block = ex.alloc(blockSize);
|
|
1381
|
+
}
|
|
1382
|
+
return block;
|
|
1383
|
+
};
|
|
1384
|
+
const align8 = (n) => n + 7 & ~7;
|
|
1385
|
+
return {
|
|
1386
|
+
kind: "wasm",
|
|
1387
|
+
mesh(table, stampCount, params, list) {
|
|
1388
|
+
const tBytes = align8(stampCount * STAMP_STRIDE * 8);
|
|
1389
|
+
const pBytes = PARAMS_LEN * 8;
|
|
1390
|
+
const lLen = list ? list.length : 0;
|
|
1391
|
+
const base = reserve(tBytes + pBytes + lLen * 4);
|
|
1392
|
+
const mem = ex.memory.buffer;
|
|
1393
|
+
new Float64Array(mem, base, stampCount * STAMP_STRIDE).set(table.subarray(0, stampCount * STAMP_STRIDE));
|
|
1394
|
+
new Float64Array(mem, base + tBytes, PARAMS_LEN).set(params.subarray(0, PARAMS_LEN));
|
|
1395
|
+
if (list && lLen) new Int32Array(mem, base + tBytes + pBytes, lLen).set(list);
|
|
1396
|
+
const hp = ex.mesh(base, stampCount, base + tBytes, base + tBytes + pBytes, lLen);
|
|
1397
|
+
const buf = ex.memory.buffer;
|
|
1398
|
+
const h = new Uint32Array(buf, hp, 16);
|
|
1399
|
+
const nv = h[0], ni = h[1];
|
|
1400
|
+
const f32 = (ptr, len) => new Float32Array(buf, ptr, len).slice();
|
|
1401
|
+
const b = new Float32Array(buf, hp + 32, 6);
|
|
1402
|
+
return {
|
|
1403
|
+
positions: f32(h[2], nv * 3),
|
|
1404
|
+
normals: f32(h[3], nv * 3),
|
|
1405
|
+
colors: f32(h[4], nv * 3),
|
|
1406
|
+
foundation: f32(h[5], nv * 3),
|
|
1407
|
+
material: f32(h[6], nv * 4),
|
|
1408
|
+
indices: new Uint32Array(buf, h[7], ni).slice(),
|
|
1409
|
+
bounds: [b[0], b[1], b[2], b[3], b[4], b[5]]
|
|
1410
|
+
};
|
|
1411
|
+
},
|
|
1412
|
+
dropSlot(slot) {
|
|
1413
|
+
ex.drop_slot(slot);
|
|
1414
|
+
},
|
|
1415
|
+
skin(positions, segments, segmentCount, boneCount) {
|
|
1416
|
+
const n = Math.floor(positions.length / 3);
|
|
1417
|
+
const pBytes = align8(n * 3 * 4);
|
|
1418
|
+
const base = reserve(pBytes + segmentCount * SEGMENT_STRIDE * 8);
|
|
1419
|
+
const mem = ex.memory.buffer;
|
|
1420
|
+
new Float32Array(mem, base, n * 3).set(positions.subarray(0, n * 3));
|
|
1421
|
+
new Float64Array(mem, base + pBytes, segmentCount * SEGMENT_STRIDE).set(segments.subarray(0, segmentCount * SEGMENT_STRIDE));
|
|
1422
|
+
const op = ex.skin(base, n, base + pBytes, segmentCount, boneCount);
|
|
1423
|
+
const buf = ex.memory.buffer;
|
|
1424
|
+
return {
|
|
1425
|
+
boneIndices: new Float32Array(buf, op, n * 4).slice(),
|
|
1426
|
+
boneWeights: new Float32Array(buf, op + n * 16, n * 4).slice()
|
|
1427
|
+
};
|
|
1428
|
+
}
|
|
1429
|
+
};
|
|
1430
|
+
}
|
|
1431
|
+
async function loadWasmCore(bytes) {
|
|
1432
|
+
const { instance } = await WebAssembly.instantiate(bytes, {});
|
|
1433
|
+
return wasmCoreFromInstance(instance);
|
|
1434
|
+
}
|
|
1435
|
+
async function fetchWasmCore(url2 = WASM_URL) {
|
|
1436
|
+
const res = await fetch(url2);
|
|
1437
|
+
if (!res.ok) throw new Error(`evaluator wasm: HTTP ${res.status}`);
|
|
1438
|
+
if (typeof WebAssembly.instantiateStreaming === "function" && res.headers.get("content-type")?.includes("application/wasm")) {
|
|
1439
|
+
const { instance } = await WebAssembly.instantiateStreaming(res, {});
|
|
1440
|
+
return wasmCoreFromInstance(instance);
|
|
1441
|
+
}
|
|
1442
|
+
return loadWasmCore(await res.arrayBuffer());
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
export {
|
|
1446
|
+
STAMP_STRIDE,
|
|
1447
|
+
PARAMS_LEN,
|
|
1448
|
+
SHAPE_CODE,
|
|
1449
|
+
MODE_CODE,
|
|
1450
|
+
SEGMENT_STRIDE,
|
|
1451
|
+
createReferenceCore,
|
|
1452
|
+
FIXED_COLORS,
|
|
1453
|
+
colorHex,
|
|
1454
|
+
rgbOf,
|
|
1455
|
+
clampResolution,
|
|
1456
|
+
lodLevels,
|
|
1457
|
+
packSculpt,
|
|
1458
|
+
VOX_CACHE_MAX,
|
|
1459
|
+
createMeshSession,
|
|
1460
|
+
AbortError,
|
|
1461
|
+
createInlineEvaluator,
|
|
1462
|
+
createWorkerEvaluator,
|
|
1463
|
+
createEvaluator,
|
|
1464
|
+
startWorkerHost,
|
|
1465
|
+
WASM_URL,
|
|
1466
|
+
wasmCoreFromInstance,
|
|
1467
|
+
loadWasmCore,
|
|
1468
|
+
fetchWasmCore
|
|
1469
|
+
};
|
|
1470
|
+
//# sourceMappingURL=chunk-72DMUKP3.js.map
|