dishui 0.0.108 → 0.0.110
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/dist/.release-verified.json +3 -2
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonMenu/index.js.map +1 -1
- package/dist/components/Card/Metric2.js.map +1 -1
- package/dist/components/Card/Ticket2.js.map +1 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.js.map +1 -1
- package/dist/components/Column/index.js.map +1 -1
- package/dist/components/ConfirmDialog/index.js.map +1 -1
- package/dist/components/DateTimeInput/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Demo/source.js.map +1 -1
- package/dist/components/Divider/index.js.map +1 -1
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Field/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/GroupButton/index.js.map +1 -1
- package/dist/components/GroupedTable/index.js.map +1 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/focusScope.js.map +1 -1
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.js.map +1 -1
- package/dist/components/NavigationList/index.js.map +1 -1
- package/dist/components/Page/Float2.js.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/Page/resize2.js.map +1 -1
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/PagePanel/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Resizable/ResizeGrip.js.map +1 -1
- package/dist/components/Resizable/index.js.map +1 -1
- package/dist/components/Resizable/useResize.js.map +1 -1
- package/dist/components/Row/index.js.map +1 -1
- package/dist/components/Section/index.js.map +1 -1
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Switch/index.js.map +1 -1
- package/dist/components/Tab/index.js.map +1 -1
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tabs/tabNavigation.js.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/ai/AgentChat/index.js.map +1 -1
- package/dist/components/ai/AgentRunCard/index.js.map +1 -1
- package/dist/components/ai/AgentScreen/index.js.map +1 -1
- package/dist/components/ai/ApprovalCard/index.js.map +1 -1
- package/dist/components/ai/CodeView/index.js.map +1 -1
- package/dist/components/ai/CommandSearch/index.js.map +1 -1
- package/dist/components/ai/ContextCards/index.js.map +1 -1
- package/dist/components/ai/DiffTable/index.js.map +1 -1
- package/dist/components/ai/FilterTable/index.js.map +1 -1
- package/dist/components/ai/FineTuneCard/index.js.map +1 -1
- package/dist/components/ai/InsightCards/index.js.map +1 -1
- package/dist/components/ai/IssueCard/index.js.map +1 -1
- package/dist/components/ai/LoadingState/index.js.map +1 -1
- package/dist/components/ai/PromptBar/index.js.map +1 -1
- package/dist/components/ai/RecommendationCard/index.js.map +1 -1
- package/dist/components/ai/RecordsTable/index.js.map +1 -1
- package/dist/components/ai/SelectionActions/index.js.map +1 -1
- package/dist/components/ai/StateFlow/index.js.map +1 -1
- package/dist/components/ai/StreamingText/index.js.map +1 -1
- package/dist/components/ai/TaskRows/index.js.map +1 -1
- package/dist/components/ai/Thinking/index.js.map +1 -1
- package/dist/components/ai/ToolChips/index.js.map +1 -1
- package/dist/components/ai/shared.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.js +165 -160
- package/dist/components/pro/Calendar/Calendar.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
- package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
- package/dist/components/pro/Calendar/utils.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
- package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
- package/dist/components/pro/Gantt/utils.js.map +1 -1
- package/dist/components/pro/Kanban/Kanban.js.map +1 -1
- package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
- package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
- package/dist/components/pro/Kanban/utils.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Molly/animations.js +52 -0
- package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Molly/events.js +46 -0
- package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Molly/index.js +12 -0
- package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Molly/model.js +614 -0
- package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
- package/dist/components/pro/Sprite/Molly/rig.js +102 -0
- package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
- package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Ruby/events.js +46 -0
- package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Ruby/index.js +12 -0
- package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Ruby/model.js +605 -0
- package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
- package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
- package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
- package/dist/components/pro/Sprite/Sprite2.js +224 -0
- package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
- package/dist/components/pro/Sprite/actions.d.ts +3 -0
- package/dist/components/pro/Sprite/actions.js +16 -0
- package/dist/components/pro/Sprite/actions.js.map +1 -0
- package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
- package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
- package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
- package/dist/components/pro/Sprite/index.d.ts +4 -0
- package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
- package/dist/components/pro/Sprite/shared/animation.js +39 -0
- package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
- package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/events.js +21 -0
- package/dist/components/pro/Sprite/shared/events.js.map +1 -0
- package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/face.js +33 -0
- package/dist/components/pro/Sprite/shared/face.js.map +1 -0
- package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
- package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/gait.js +19 -0
- package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
- package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/geometry.js +59 -0
- package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
- package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
- package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/playback.js +74 -0
- package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
- package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/rig.js +48 -0
- package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
- package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
- package/dist/components/pro/Sprite/shared/scene.js +21 -0
- package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
- package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
- package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
- package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
- package/dist/components/pro/Sprite/types.d.ts +40 -0
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.js.map +1 -1
- package/dist/data-table.js +3 -3
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -115
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/sprite.js +2 -0
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/flexLayout.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.js.map +1 -1
- package/dist/utils/selection.js +29 -20
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +15 -11
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/createSpriteStage.ts
|
|
3
|
+
var t = 512, n = 1.65, r = "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n";
|
|
4
|
+
function i(i, { topInset: a = 0 } = {}) {
|
|
5
|
+
let o = new e.Scene(), s = new e.Group();
|
|
6
|
+
s.name = "sprite-studio", o.add(s);
|
|
7
|
+
let c = new e.Scene(), l = i.ownerDocument.createElement("canvas"), u = /* @__PURE__ */ new Set(), d = (e) => (u.add(e), e), f, p = null, m = !1, h = () => {
|
|
8
|
+
if (m) return;
|
|
9
|
+
m = !0;
|
|
10
|
+
let e = [], t = (t) => {
|
|
11
|
+
try {
|
|
12
|
+
t();
|
|
13
|
+
} catch (t) {
|
|
14
|
+
e.push(t);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
s.removeFromParent(), s.clear(), c.clear();
|
|
18
|
+
for (let e of u) t(() => e.dispose());
|
|
19
|
+
if (u.clear(), t(() => f?.dispose()), t(() => p?.getExtension("WEBGL_lose_context")?.loseContext()), t(() => l.remove()), f = void 0, p = null, e.length) throw AggregateError(e, "Failed to release sprite studio resources.");
|
|
20
|
+
};
|
|
21
|
+
try {
|
|
22
|
+
if (p = l.getContext("webgl2", {
|
|
23
|
+
alpha: !0,
|
|
24
|
+
antialias: !0,
|
|
25
|
+
premultipliedAlpha: !0,
|
|
26
|
+
depth: !0,
|
|
27
|
+
stencil: !1,
|
|
28
|
+
powerPreference: "low-power"
|
|
29
|
+
}), !p) throw Error("The sprite studio requires WebGL 2.");
|
|
30
|
+
f = new e.WebGLRenderer({
|
|
31
|
+
canvas: l,
|
|
32
|
+
context: p,
|
|
33
|
+
alpha: !0,
|
|
34
|
+
antialias: !0
|
|
35
|
+
}), f.setClearColor(0, 0), f.outputColorSpace = e.SRGBColorSpace, f.toneMapping = e.ACESFilmicToneMapping, f.toneMappingExposure = .95, f.shadowMap.enabled = !0, f.shadowMap.type = e.PCFShadowMap, l.style.display = "block", l.style.width = "100%", l.style.height = "100%", l.setAttribute("aria-hidden", "true");
|
|
36
|
+
let u = new e.OrthographicCamera(-1.95, 1.95, 1.95, -1.95, .1, 30);
|
|
37
|
+
u.position.set(3.1, 2.5, 7), u.lookAt(0, 1.35, 0), u.layers.enable(1);
|
|
38
|
+
let g = u.position.clone(), _ = new e.Vector3(0, 1, 0).applyQuaternion(u.quaternion), v = new e.DirectionalLight(16775408, 2.4);
|
|
39
|
+
v.name = "sprite-key", d(v.shadow), v.position.set(-3.5, 5.5, 4.5), v.target.position.set(0, 1.1, 0), v.castShadow = !0, v.shadow.mapSize.set(2048, 2048), v.shadow.camera.left = v.shadow.camera.bottom = -3.4, v.shadow.camera.right = v.shadow.camera.top = 3.4, v.shadow.camera.near = .5, v.shadow.camera.far = 14, v.shadow.camera.updateProjectionMatrix(), v.shadow.bias = -15e-5, v.shadow.normalBias = .025, v.shadow.radius = 4, s.add(v, v.target);
|
|
40
|
+
let y = new e.DirectionalLight(15791359, .7);
|
|
41
|
+
y.name = "sprite-fill", d(y.shadow), y.position.set(4, 2.8, 3), y.target.position.set(0, 1.2, 0);
|
|
42
|
+
let b = new e.DirectionalLight(16777215, 1.2);
|
|
43
|
+
b.name = "sprite-rim", d(b.shadow), b.position.set(1.5, 4.5, -4), b.target.position.set(0, 1.4, 0), s.add(y, y.target, b, b.target), s.add(new e.HemisphereLight(16777215, 9869984, .3));
|
|
44
|
+
let x = d(new e.CylinderGeometry(n, 1.73, .14, 16)), S = d(new e.MeshStandardMaterial({
|
|
45
|
+
color: 13685460,
|
|
46
|
+
roughness: .92,
|
|
47
|
+
metalness: 0,
|
|
48
|
+
flatShading: !0
|
|
49
|
+
})), C = new e.Mesh(x, S);
|
|
50
|
+
C.name = "sprite-platform", C.position.y = -.095, C.receiveShadow = !0, s.add(C);
|
|
51
|
+
let w = new e.OrthographicCamera(-1.65, n, n, -1.65, .001, .65);
|
|
52
|
+
w.position.set(0, -.022000000000000002, 0), w.up.set(0, 0, 1), w.lookAt(0, 1, 0);
|
|
53
|
+
let T = d(new e.MeshDepthMaterial({
|
|
54
|
+
depthPacking: e.BasicDepthPacking,
|
|
55
|
+
side: e.DoubleSide,
|
|
56
|
+
blending: e.NoBlending
|
|
57
|
+
})), E = d(new e.WebGLRenderTarget(t, t, {
|
|
58
|
+
minFilter: e.LinearFilter,
|
|
59
|
+
magFilter: e.LinearFilter,
|
|
60
|
+
generateMipmaps: !1,
|
|
61
|
+
depthBuffer: !0,
|
|
62
|
+
stencilBuffer: !1
|
|
63
|
+
})), D = d(new e.WebGLRenderTarget(t, t, {
|
|
64
|
+
minFilter: e.LinearFilter,
|
|
65
|
+
magFilter: e.LinearFilter,
|
|
66
|
+
generateMipmaps: !1,
|
|
67
|
+
depthBuffer: !1,
|
|
68
|
+
stencilBuffer: !1
|
|
69
|
+
})), O = {
|
|
70
|
+
source: { value: E.texture },
|
|
71
|
+
direction: { value: new e.Vector2() }
|
|
72
|
+
}, k = d(new e.ShaderMaterial({
|
|
73
|
+
uniforms: O,
|
|
74
|
+
vertexShader: r,
|
|
75
|
+
fragmentShader: "\n uniform sampler2D source;\n uniform vec2 direction;\n varying vec2 vUv;\n void main() {\n vec4 color = texture2D(source, vUv) * 0.2270270270;\n color += texture2D(source, vUv + direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv - direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv + direction * 3.2307692308) * 0.0702702703;\n color += texture2D(source, vUv - direction * 3.2307692308) * 0.0702702703;\n gl_FragColor = color;\n }\n ",
|
|
76
|
+
depthTest: !1,
|
|
77
|
+
depthWrite: !1,
|
|
78
|
+
blending: e.NoBlending,
|
|
79
|
+
toneMapped: !1
|
|
80
|
+
})), A = d(new e.PlaneGeometry(2, 2)), j = new e.Mesh(A, k);
|
|
81
|
+
j.frustumCulled = !1, c.add(j);
|
|
82
|
+
let M = new e.OrthographicCamera(-1, 1, 1, -1, 0, 1), N = d(new e.ShaderMaterial({
|
|
83
|
+
uniforms: { shadow: { value: E.texture } },
|
|
84
|
+
vertexShader: r,
|
|
85
|
+
fragmentShader: "\n uniform sampler2D shadow;\n varying vec2 vUv;\n void main() {\n // The upward-facing capture and downward-facing UV axis need opposite V coordinates.\n float proximity = texture2D(shadow, vec2(vUv.x, 1.0 - vUv.y)).r;\n gl_FragColor = vec4(vec3(0.0), 0.32 * proximity * proximity);\n }\n ",
|
|
86
|
+
transparent: !0,
|
|
87
|
+
depthWrite: !1,
|
|
88
|
+
toneMapped: !1
|
|
89
|
+
})), P = d(new e.CircleGeometry(n, 16)), F = new e.Mesh(P, N);
|
|
90
|
+
F.name = "sprite-contact-shadow", F.rotation.x = -Math.PI / 2, F.position.y = -.022000000000000002, s.add(F);
|
|
91
|
+
let I = 0, L = 0, R = 0;
|
|
92
|
+
return i.appendChild(l), {
|
|
93
|
+
scene: o,
|
|
94
|
+
render: (e) => {
|
|
95
|
+
if (m || !f) return;
|
|
96
|
+
let n = i.clientWidth, r = i.clientHeight;
|
|
97
|
+
if (n <= 0 || r <= 0) return;
|
|
98
|
+
let l = Math.min(2, Math.max(1, i.ownerDocument.defaultView?.devicePixelRatio || 1));
|
|
99
|
+
if (n !== I || r !== L || l !== R) {
|
|
100
|
+
f.setDrawingBufferSize(n, r, l);
|
|
101
|
+
let e = n / r, t = Math.max(r * .5, r - a), i = Math.max(4.25, 3.85 / (n / t)), o = i * r / t;
|
|
102
|
+
u.position.copy(g).addScaledVector(_, (o - i) / 2), u.left = -o * e / 2, u.right = o * e / 2, u.top = o / 2, u.bottom = -o / 2, u.updateProjectionMatrix(), I = n, L = r, R = l;
|
|
103
|
+
}
|
|
104
|
+
e?.(u);
|
|
105
|
+
let d = o.overrideMaterial, p = o.background, h = s.visible, v = f.shadowMap.enabled;
|
|
106
|
+
try {
|
|
107
|
+
s.visible = !1, o.background = null, o.overrideMaterial = T, f.shadowMap.enabled = !1, f.info.render.frame++, f.setRenderTarget(E), f.render(o, w), O.source.value = E.texture, O.direction.value.set(1.5 / t, 0), f.setRenderTarget(D), f.render(c, M), O.source.value = D.texture, O.direction.value.set(0, 1.5 / t), f.setRenderTarget(E), f.render(c, M);
|
|
108
|
+
} finally {
|
|
109
|
+
o.overrideMaterial = d, o.background = p, s.visible = h, f.shadowMap.enabled = v, f.setRenderTarget(null);
|
|
110
|
+
}
|
|
111
|
+
f.render(o, u);
|
|
112
|
+
},
|
|
113
|
+
dispose: h
|
|
114
|
+
};
|
|
115
|
+
} catch (e) {
|
|
116
|
+
try {
|
|
117
|
+
h();
|
|
118
|
+
} catch (t) {
|
|
119
|
+
throw AggregateError([e, t], "Sprite studio initialization and cleanup failed.", { cause: t });
|
|
120
|
+
}
|
|
121
|
+
throw e;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
//#endregion
|
|
125
|
+
export { i as createSpriteStage };
|
|
126
|
+
|
|
127
|
+
//# sourceMappingURL=createSpriteStage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSpriteStage.js","names":["THREE","shadowSize","platformRadius","uvVertexShader","createSpriteStage","scene","studio","blurScene","canvas","host","resources","own","resource","renderer","context","disposed","dispose","errors","release","error","camera","cameraOrigin","cameraUp","key","fill","rim","platformGeometry","platformMaterial","platform","contactCamera","depthMaterial","contactTarget","blurTarget","blurUniforms","blurMaterial","blurGeometry","blurQuad","blurCamera","contactMaterial","contactGeometry","contact","lastWidth","lastHeight","lastDpr","width","height","dpr","aspect","contentHeight","topInset","contentViewHeight","viewHeight","previousOverride","previousBackground","previousVisibility","previousShadows","cleanupError"],"sources":["../../../../../src/components/pro/Sprite/shared/createSpriteStage.ts"],"sourcesContent":["import * as THREE from 'three';\n\nconst shadowSize = 512;\nconst platformRadius = 1.65;\nconst platformTop = -0.025;\nconst uvVertexShader = /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n`;\n\n/**\n * A transparent, on-demand studio for +Z-facing sprites, about 2.8 high with feet at y=0.\n * Callers own their models, animation and resize scheduling. Enable castShadow /\n * receiveShadow on model meshes and use flat normals or flatShading for visible facets.\n * dispose() releases only studio resources, not geometry/materials added by the caller.\n */\nexport function createSpriteStage(host: HTMLElement, { topInset = 0 }: { topInset?: number } = {}): {\n scene: THREE.Scene;\n render: (beforeRender?: (camera: THREE.OrthographicCamera) => void) => void;\n dispose: () => void;\n} {\n const scene = new THREE.Scene();\n const studio = new THREE.Group();\n studio.name = 'sprite-studio';\n scene.add(studio);\n const blurScene = new THREE.Scene();\n const canvas = host.ownerDocument.createElement('canvas');\n const resources = new Set<{ dispose: () => void }>();\n const own = <T extends { dispose: () => void }>(resource: T): T => {\n resources.add(resource);\n return resource;\n };\n let renderer: THREE.WebGLRenderer | undefined;\n let context: WebGL2RenderingContext | null = null;\n let disposed = false;\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n const errors: unknown[] = [];\n const release = (action: () => void) => {\n try { action(); } catch (error) { errors.push(error); }\n };\n studio.removeFromParent();\n studio.clear();\n blurScene.clear();\n for (const resource of resources) release(() => resource.dispose());\n resources.clear();\n release(() => renderer?.dispose());\n // Keep the context separately so even a throwing renderer constructor can be cleaned up.\n release(() => context?.getExtension('WEBGL_lose_context')?.loseContext());\n release(() => canvas.remove());\n renderer = undefined;\n context = null;\n if (errors.length) throw new AggregateError(errors, 'Failed to release sprite studio resources.');\n };\n\n try {\n context = canvas.getContext('webgl2', {\n alpha: true,\n antialias: true,\n premultipliedAlpha: true,\n depth: true,\n stencil: false,\n powerPreference: 'low-power',\n });\n if (!context) throw new Error('The sprite studio requires WebGL 2.');\n renderer = new THREE.WebGLRenderer({ canvas, context, alpha: true, antialias: true });\n renderer.setClearColor(0x000000, 0);\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 0.95;\n renderer.shadowMap.enabled = true;\n // In r186 PCFShadowMap supports a filtered radius; PCFSoftShadowMap is deprecated.\n renderer.shadowMap.type = THREE.PCFShadowMap;\n canvas.style.display = 'block';\n canvas.style.width = '100%';\n canvas.style.height = '100%';\n canvas.setAttribute('aria-hidden', 'true');\n\n const camera = new THREE.OrthographicCamera(-1.95, 1.95, 1.95, -1.95, 0.1, 30);\n camera.position.set(3.1, 2.5, 7);\n camera.lookAt(0, 1.35, 0);\n camera.layers.enable(1); // Speech is visible here, but not to the layer-0 shadow cameras.\n const cameraOrigin = camera.position.clone();\n const cameraUp = new THREE.Vector3(0, 1, 0).applyQuaternion(camera.quaternion);\n\n const key = new THREE.DirectionalLight(0xfff8f0, 2.4);\n key.name = 'sprite-key';\n own(key.shadow);\n key.position.set(-3.5, 5.5, 4.5);\n key.target.position.set(0, 1.1, 0);\n key.castShadow = true;\n key.shadow.mapSize.set(2048, 2048);\n key.shadow.camera.left = key.shadow.camera.bottom = -3.4;\n key.shadow.camera.right = key.shadow.camera.top = 3.4;\n key.shadow.camera.near = 0.5;\n key.shadow.camera.far = 14;\n key.shadow.camera.updateProjectionMatrix();\n key.shadow.bias = -0.00015;\n key.shadow.normalBias = 0.025;\n key.shadow.radius = 4;\n studio.add(key, key.target);\n\n const fill = new THREE.DirectionalLight(0xf0f4ff, 0.7);\n fill.name = 'sprite-fill';\n own(fill.shadow);\n fill.position.set(4, 2.8, 3);\n fill.target.position.set(0, 1.2, 0);\n const rim = new THREE.DirectionalLight(0xffffff, 1.2);\n rim.name = 'sprite-rim';\n own(rim.shadow);\n rim.position.set(1.5, 4.5, -4);\n rim.target.position.set(0, 1.4, 0);\n studio.add(fill, fill.target, rim, rim.target);\n studio.add(new THREE.HemisphereLight(0xffffff, 0x969aa0, 0.3));\n\n const platformGeometry = own(new THREE.CylinderGeometry(platformRadius, 1.73, 0.14, 16));\n const platformMaterial = own(new THREE.MeshStandardMaterial({\n color: 0xd0d2d4,\n roughness: 0.92,\n metalness: 0,\n flatShading: true,\n }));\n const platform = new THREE.Mesh(platformGeometry, platformMaterial);\n platform.name = 'sprite-platform';\n platform.position.y = platformTop - 0.07;\n platform.receiveShadow = true;\n studio.add(platform);\n\n // Capture actual undersides close to the floor, not a fixed elliptical shadow decal.\n const contactCamera = new THREE.OrthographicCamera(\n -platformRadius, platformRadius, platformRadius, -platformRadius, 0.001, 0.65,\n );\n contactCamera.position.set(0, platformTop + 0.003, 0);\n contactCamera.up.set(0, 0, 1);\n contactCamera.lookAt(0, 1, 0);\n const depthMaterial = own(new THREE.MeshDepthMaterial({\n depthPacking: THREE.BasicDepthPacking,\n side: THREE.DoubleSide,\n blending: THREE.NoBlending,\n }));\n const contactTarget = own(new THREE.WebGLRenderTarget(shadowSize, shadowSize, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n generateMipmaps: false,\n depthBuffer: true,\n stencilBuffer: false,\n }));\n const blurTarget = own(new THREE.WebGLRenderTarget(shadowSize, shadowSize, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n generateMipmaps: false,\n depthBuffer: false,\n stencilBuffer: false,\n }));\n const blurUniforms = {\n source: { value: contactTarget.texture },\n direction: { value: new THREE.Vector2() },\n };\n const blurMaterial = own(new THREE.ShaderMaterial({\n uniforms: blurUniforms,\n vertexShader: uvVertexShader,\n fragmentShader: /* glsl */ `\n uniform sampler2D source;\n uniform vec2 direction;\n varying vec2 vUv;\n void main() {\n vec4 color = texture2D(source, vUv) * 0.2270270270;\n color += texture2D(source, vUv + direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv - direction * 1.3846153846) * 0.3162162162;\n color += texture2D(source, vUv + direction * 3.2307692308) * 0.0702702703;\n color += texture2D(source, vUv - direction * 3.2307692308) * 0.0702702703;\n gl_FragColor = color;\n }\n `,\n depthTest: false,\n depthWrite: false,\n blending: THREE.NoBlending,\n toneMapped: false,\n }));\n const blurGeometry = own(new THREE.PlaneGeometry(2, 2));\n const blurQuad = new THREE.Mesh(blurGeometry, blurMaterial);\n blurQuad.frustumCulled = false;\n blurScene.add(blurQuad);\n const blurCamera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const contactMaterial = own(new THREE.ShaderMaterial({\n uniforms: { shadow: { value: contactTarget.texture } },\n vertexShader: uvVertexShader,\n fragmentShader: /* glsl */ `\n uniform sampler2D shadow;\n varying vec2 vUv;\n void main() {\n // The upward-facing capture and downward-facing UV axis need opposite V coordinates.\n float proximity = texture2D(shadow, vec2(vUv.x, 1.0 - vUv.y)).r;\n gl_FragColor = vec4(vec3(0.0), 0.32 * proximity * proximity);\n }\n `,\n transparent: true,\n depthWrite: false,\n toneMapped: false,\n }));\n const contactGeometry = own(new THREE.CircleGeometry(platformRadius, 16));\n const contact = new THREE.Mesh(contactGeometry, contactMaterial);\n contact.name = 'sprite-contact-shadow';\n contact.rotation.x = -Math.PI / 2;\n contact.position.y = platformTop + 0.003;\n studio.add(contact);\n\n let lastWidth = 0;\n let lastHeight = 0;\n let lastDpr = 0;\n const render = (beforeRender?: (camera: THREE.OrthographicCamera) => void) => {\n if (disposed || !renderer) return;\n const width = host.clientWidth;\n const height = host.clientHeight;\n if (width <= 0 || height <= 0) return;\n const dpr = Math.min(2, Math.max(1, host.ownerDocument.defaultView?.devicePixelRatio || 1));\n if (width !== lastWidth || height !== lastHeight || dpr !== lastDpr) {\n // One buffer resize for a size/DPR change, none for ordinary pose updates.\n renderer.setDrawingBufferSize(width, height, dpr);\n const aspect = width / height;\n // Fit the character below the speech area without changing the viewing angle.\n const contentHeight = Math.max(height * 0.5, height - topInset);\n const contentViewHeight = Math.max(4.25, 3.85 / (width / contentHeight));\n const viewHeight = contentViewHeight * height / contentHeight;\n camera.position.copy(cameraOrigin).addScaledVector(cameraUp, (viewHeight - contentViewHeight) / 2);\n camera.left = -viewHeight * aspect / 2;\n camera.right = viewHeight * aspect / 2;\n camera.top = viewHeight / 2;\n camera.bottom = -viewHeight / 2;\n camera.updateProjectionMatrix();\n lastWidth = width;\n lastHeight = height;\n lastDpr = dpr;\n }\n\n beforeRender?.(camera);\n const previousOverride = scene.overrideMaterial;\n const previousBackground = scene.background;\n const previousVisibility = studio.visible;\n const previousShadows = renderer.shadowMap.enabled;\n try {\n studio.visible = false;\n scene.background = null;\n scene.overrideMaterial = depthMaterial;\n renderer.shadowMap.enabled = false;\n // Three r186's shadow pass shares its geometry-upload frame with the next render.\n // Advance before the depth capture so deformed tails use current, not previous, GPU vertices.\n renderer.info.render.frame++;\n renderer.setRenderTarget(contactTarget);\n renderer.render(scene, contactCamera);\n\n blurUniforms.source.value = contactTarget.texture;\n blurUniforms.direction.value.set(1.5 / shadowSize, 0);\n renderer.setRenderTarget(blurTarget);\n renderer.render(blurScene, blurCamera);\n blurUniforms.source.value = blurTarget.texture;\n blurUniforms.direction.value.set(0, 1.5 / shadowSize);\n renderer.setRenderTarget(contactTarget);\n renderer.render(blurScene, blurCamera);\n } finally {\n scene.overrideMaterial = previousOverride;\n scene.background = previousBackground;\n studio.visible = previousVisibility;\n renderer.shadowMap.enabled = previousShadows;\n renderer.setRenderTarget(null);\n }\n renderer.render(scene, camera);\n };\n\n host.appendChild(canvas);\n return { scene, render, dispose };\n } catch (error) {\n try { dispose(); } catch (cleanupError) {\n throw new AggregateError([error, cleanupError], 'Sprite studio initialization and cleanup failed.', { cause: cleanupError });\n }\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SpriteCharacter, SpriteCharacterEvents, SpriteReplyIntent } from '../types';
|
|
2
|
+
export type { SpriteReplyIntent, SpriteEvent, SpriteExpression, SpriteCharacterEvents } from '../types';
|
|
3
|
+
export declare function isComfortMessage(message: string): boolean;
|
|
4
|
+
export declare function classifyMessage(message: string): SpriteReplyIntent;
|
|
5
|
+
export declare function getSpriteEvents(character: SpriteCharacter): SpriteCharacterEvents;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { mollyEvents as e } from "../Molly/events.js";
|
|
2
|
+
import { rubyEvents as t } from "../Ruby/events.js";
|
|
3
|
+
//#region src/components/pro/Sprite/shared/events.ts
|
|
4
|
+
function n(e) {
|
|
5
|
+
return /难过|伤心|sad|tired|累|不开心/i.test(e);
|
|
6
|
+
}
|
|
7
|
+
function r(e) {
|
|
8
|
+
let t = e.toLowerCase();
|
|
9
|
+
return /你好|嗨|hello|hi\b|hey\b/.test(t) ? "greeting" : n(t) ? "comfort" : /谢谢|thank/.test(t) ? "thanks" : /名字|是谁|name|who/.test(t) ? "identity" : "default";
|
|
10
|
+
}
|
|
11
|
+
var i = {
|
|
12
|
+
ruby: t,
|
|
13
|
+
molly: e
|
|
14
|
+
};
|
|
15
|
+
function a(e) {
|
|
16
|
+
return i[e];
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { r as classifyMessage, a as getSpriteEvents, n as isComfortMessage };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","names":["isComfortMessage","message","classifyMessage","text","registry","rubyEvents","mollyEvents","getSpriteEvents","character"],"sources":["../../../../../src/components/pro/Sprite/shared/events.ts"],"sourcesContent":["import { mollyEvents } from '../Molly/events';\nimport { rubyEvents } from '../Ruby/events';\nimport type { SpriteCharacter, SpriteCharacterEvents, SpriteReplyIntent } from '../types';\n\nexport type { SpriteReplyIntent, SpriteEvent, SpriteExpression, SpriteCharacterEvents } from '../types';\n\nexport function isComfortMessage(message: string): boolean {\n return /难过|伤心|sad|tired|累|不开心/i.test(message);\n}\n\nexport function classifyMessage(message: string): SpriteReplyIntent {\n const text = message.toLowerCase();\n if (/你好|嗨|hello|hi\\b|hey\\b/.test(text)) return 'greeting';\n if (isComfortMessage(text)) return 'comfort';\n if (/谢谢|thank/.test(text)) return 'thanks';\n if (/名字|是谁|name|who/.test(text)) return 'identity';\n return 'default';\n}\n\nconst registry: Record<SpriteCharacter, SpriteCharacterEvents> = {\n ruby: rubyEvents,\n molly: mollyEvents,\n};\n\nexport function getSpriteEvents(character: SpriteCharacter): SpriteCharacterEvents {\n return registry[character];\n}\n"],"mappings":";;;AAMA,SAAgBA,EAAiB,GAA0B;CACzD,OAAO,yBAAyB,KAAKC,CAAO;AAC9C;AAEA,SAAgBC,EAAgB,GAAoC;CAClE,IAAMC,IAAOF,EAAQ,YAAY;CAKjC,OAJI,wBAAwB,KAAKE,CAAI,IAAU,aAC3CH,EAAiBG,CAAI,IAAU,YAC/B,WAAW,KAAKA,CAAI,IAAU,WAC9B,iBAAiB,KAAKA,CAAI,IAAU,aACjC;AACT;AAEA,IAAMC,IAA2D;CAC/D,MAAMC;CACN,OAAOC;AACT;AAEA,SAAgBC,EAAgB,GAAmD;CACjF,OAAOH,EAASI;AAClB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
import type { Sculptor } from './sculptor';
|
|
3
|
+
export type FacePatch = {
|
|
4
|
+
mesh: THREE.Mesh;
|
|
5
|
+
offset: number;
|
|
6
|
+
};
|
|
7
|
+
/** Materials and unprojected local shapes belong to the model, not the skin projector. */
|
|
8
|
+
export declare function createFacePatches(sculptor: Sculptor): {
|
|
9
|
+
patches: FacePatch[];
|
|
10
|
+
attached: (mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>, name: string, offset?: number) => THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material<THREE.MaterialEventMap>, THREE.Object3DEventMap>;
|
|
11
|
+
};
|
|
12
|
+
/** Bind only after the rig hierarchy is complete. The first animation pose must perform update. */
|
|
13
|
+
export declare function bindFace(head: THREE.Group, skin: THREE.Mesh[], patches: FacePatch[]): {
|
|
14
|
+
update(): void;
|
|
15
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createFaceSurface as e } from "./faceSurface.js";
|
|
2
|
+
import * as t from "three";
|
|
3
|
+
//#region src/components/pro/Sprite/shared/face.ts
|
|
4
|
+
function n(e) {
|
|
5
|
+
let n = [];
|
|
6
|
+
return {
|
|
7
|
+
patches: n,
|
|
8
|
+
attached: (r, i, a = .002) => {
|
|
9
|
+
let o = e.ownMaterial(new t.MeshBasicMaterial({
|
|
10
|
+
color: r.material instanceof t.MeshPhysicalMaterial ? r.material.color : 16777215,
|
|
11
|
+
vertexColors: r.geometry.hasAttribute("color"),
|
|
12
|
+
side: t.DoubleSide,
|
|
13
|
+
polygonOffset: !0,
|
|
14
|
+
polygonOffsetFactor: -1,
|
|
15
|
+
polygonOffsetUnits: -1,
|
|
16
|
+
depthWrite: !1
|
|
17
|
+
}));
|
|
18
|
+
return r.name = i, r.material = o, r.castShadow = r.receiveShadow = !1, r.renderOrder = 3 + a * 100, n.push({
|
|
19
|
+
mesh: r,
|
|
20
|
+
offset: a
|
|
21
|
+
}), r;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function r(t, n, r) {
|
|
26
|
+
let i = e(t, n);
|
|
27
|
+
for (let { mesh: e, offset: t } of r) i.add(e, t);
|
|
28
|
+
return { update: () => i.update() };
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { r as bindFace, n as createFacePatches };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=face.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"face.js","names":["THREE","createFacePatches","patches","material","sculptor","mesh","name","offset","bindFace","face","createFaceSurface","head","skin"],"sources":["../../../../../src/components/pro/Sprite/shared/face.ts"],"sourcesContent":["import * as THREE from 'three';\nimport { createFaceSurface } from './faceSurface';\nimport type { Sculptor } from './sculptor';\n\nexport type FacePatch = { mesh: THREE.Mesh; offset: number };\n\n/** Materials and unprojected local shapes belong to the model, not the skin projector. */\nexport function createFacePatches(sculptor: Sculptor) {\n const patches: FacePatch[] = [];\n const attached = (mesh: THREE.Mesh<THREE.BufferGeometry, THREE.Material>, name: string, offset = 0.002) => {\n const material = sculptor.ownMaterial(new THREE.MeshBasicMaterial({\n color: mesh.material instanceof THREE.MeshPhysicalMaterial ? mesh.material.color : 0xffffff,\n vertexColors: mesh.geometry.hasAttribute('color'), side: THREE.DoubleSide,\n polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: -1, depthWrite: false,\n }));\n mesh.name = name;\n mesh.material = material;\n mesh.castShadow = mesh.receiveShadow = false;\n mesh.renderOrder = 3 + offset * 100;\n patches.push({ mesh, offset });\n return mesh;\n };\n return { patches, attached };\n}\n\n/** Bind only after the rig hierarchy is complete. The first animation pose must perform update. */\nexport function bindFace(head: THREE.Group, skin: THREE.Mesh[], patches: FacePatch[]): { update(): void } {\n const face = createFaceSurface(head, skin);\n for (const { mesh, offset } of patches) face.add(mesh, offset);\n return { update: () => face.update() };\n}\n"],"mappings":";;;AAOA,SAAgBC,EAAkB,GAAoB;CACpD,IAAMC,IAAuB,CAAC;CAc9B,OAAO;EAAE;EAAS,WAbA,GAAwD,GAAc,IAAS,SAAU;GACzG,IAAMC,IAAWC,EAAS,YAAY,IAAIJ,EAAM,kBAAkB;IAChE,OAAOK,EAAK,oBAAoBL,EAAM,uBAAuBK,EAAK,SAAS,QAAQ;IACnF,cAAcA,EAAK,SAAS,aAAa,OAAO;IAAG,MAAML,EAAM;IAC/D,eAAe;IAAM,qBAAqB;IAAI,oBAAoB;IAAI,YAAY;GACpF,CAAC,CAAC;GAMF,OALA,EAAK,OAAOM,GACZ,EAAK,WAAWH,GAChB,EAAK,aAAa,EAAK,gBAAgB,IACvC,EAAK,cAAc,IAAII,IAAS,KAChCL,EAAQ,KAAK;IAAE;IAAM;GAAO,CAAC,GACtBG;EACT;CAC2B;AAC7B;AAGA,SAAgBG,EAAS,GAAmB,GAAoB,GAA0C;CACxG,IAAMC,IAAOC,EAAkBC,GAAMC,CAAI;CACzC,KAAK,IAAM,EAAE,SAAM,eAAYV,GAAS,EAAK,IAAIG,GAAME,CAAM;CAC7D,OAAO,EAAE,cAAcE,EAAK,OAAO,EAAE;AACvC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
/** Project animated facial marks onto the actual low-poly skin, including muzzle surfaces. */
|
|
3
|
+
export declare function createFaceSurface(head: THREE.Object3D, surfaces: THREE.Mesh[]): {
|
|
4
|
+
add(mesh: THREE.Mesh, offset?: number): void;
|
|
5
|
+
update(): void;
|
|
6
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/faceSurface.ts
|
|
3
|
+
function t(t, n) {
|
|
4
|
+
let r = [], i = [], a = new e.Matrix4(), o = new e.Matrix4(), s = new e.Matrix4(), c = new e.Vector3(), l = new e.Vector3(), u = new e.Vector3(), d = new e.Vector3();
|
|
5
|
+
function f() {
|
|
6
|
+
for (let e of n) {
|
|
7
|
+
o.multiplyMatrices(a, e.matrixWorld);
|
|
8
|
+
let t = e.geometry.getAttribute("position"), n = e.geometry.index, i = n?.count ?? t.count;
|
|
9
|
+
for (let e = 0; e < i; e += 3) {
|
|
10
|
+
l.fromBufferAttribute(t, n ? n.getX(e) : e).applyMatrix4(o), u.fromBufferAttribute(t, n ? n.getX(e + 1) : e + 1).applyMatrix4(o), d.fromBufferAttribute(t, n ? n.getX(e + 2) : e + 2).applyMatrix4(o);
|
|
11
|
+
let i = u.x - l.x, a = u.y - l.y, s = d.x - l.x, c = d.y - l.y, f = i * c - a * s;
|
|
12
|
+
Math.abs(f) < 1e-10 || r.push({
|
|
13
|
+
x: l.x,
|
|
14
|
+
y: l.y,
|
|
15
|
+
z: l.z,
|
|
16
|
+
ax: i,
|
|
17
|
+
ay: a,
|
|
18
|
+
az: u.z - l.z,
|
|
19
|
+
bx: s,
|
|
20
|
+
by: c,
|
|
21
|
+
bz: d.z - l.z,
|
|
22
|
+
inverse: 1 / f,
|
|
23
|
+
minX: Math.min(l.x, u.x, d.x),
|
|
24
|
+
maxX: Math.max(l.x, u.x, d.x),
|
|
25
|
+
minY: Math.min(l.y, u.y, d.y),
|
|
26
|
+
maxY: Math.max(l.y, u.y, d.y)
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function p(e, t) {
|
|
32
|
+
let n = -Infinity;
|
|
33
|
+
for (let i of r) {
|
|
34
|
+
if (e < i.minX || e > i.maxX || t < i.minY || t > i.maxY) continue;
|
|
35
|
+
let r = e - i.x, a = t - i.y, o = (r * i.by - a * i.bx) * i.inverse, s = (i.ax * a - i.ay * r) * i.inverse;
|
|
36
|
+
o >= -1e-6 && s >= -1e-6 && o + s <= 1.000001 && (n = Math.max(n, i.z + o * i.az + s * i.bz));
|
|
37
|
+
}
|
|
38
|
+
return n;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
add(e, t = .002) {
|
|
42
|
+
i.push({
|
|
43
|
+
mesh: e,
|
|
44
|
+
original: new Float32Array(e.geometry.getAttribute("position").array),
|
|
45
|
+
offset: t
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
update() {
|
|
49
|
+
t.updateWorldMatrix(!0, !0), a.copy(t.matrixWorld).invert(), r.length || f();
|
|
50
|
+
for (let { mesh: e, original: t, offset: n } of i) {
|
|
51
|
+
o.multiplyMatrices(a, e.matrixWorld), s.copy(o).invert();
|
|
52
|
+
let r = e.geometry.getAttribute("position");
|
|
53
|
+
for (let e = 0; e < r.count; e++) {
|
|
54
|
+
c.fromArray(t, e * 3).applyMatrix4(o);
|
|
55
|
+
let i = p(c.x, c.y);
|
|
56
|
+
Number.isFinite(i) && (c.z = i + n), c.applyMatrix4(s), r.setXYZ(e, c.x, c.y, c.z);
|
|
57
|
+
}
|
|
58
|
+
r.needsUpdate = !0, e.geometry.computeBoundingSphere();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { t as createFaceSurface };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=faceSurface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faceSurface.js","names":["THREE","createFaceSurface","triangles","patches","headInverse","local","inverse","point","a","b","c","compile","surface","surfaces","positions","index","count","i","ax","ay","bx","by","determinant","front","depth","t","x","y","dx","dy","u","v","mesh","head","original","z","offset"],"sources":["../../../../../src/components/pro/Sprite/shared/faceSurface.ts"],"sourcesContent":["import * as THREE from 'three';\n\n/** Project animated facial marks onto the actual low-poly skin, including muzzle surfaces. */\nexport function createFaceSurface(head: THREE.Object3D, surfaces: THREE.Mesh[]) {\n type Triangle = { x: number; y: number; z: number; ax: number; ay: number; az: number;\n bx: number; by: number; bz: number; inverse: number; minX: number; maxX: number; minY: number; maxY: number };\n const triangles: Triangle[] = [];\n const patches: { mesh: THREE.Mesh; original: Float32Array; offset: number }[] = [];\n const headInverse = new THREE.Matrix4();\n const local = new THREE.Matrix4();\n const inverse = new THREE.Matrix4();\n const point = new THREE.Vector3();\n const a = new THREE.Vector3();\n const b = new THREE.Vector3();\n const c = new THREE.Vector3();\n\n function compile() {\n for (const surface of surfaces) {\n local.multiplyMatrices(headInverse, surface.matrixWorld);\n const positions = surface.geometry.getAttribute('position');\n const index = surface.geometry.index;\n const count = index?.count ?? positions.count;\n for (let i = 0; i < count; i += 3) {\n a.fromBufferAttribute(positions, index ? index.getX(i) : i).applyMatrix4(local);\n b.fromBufferAttribute(positions, index ? index.getX(i + 1) : i + 1).applyMatrix4(local);\n c.fromBufferAttribute(positions, index ? index.getX(i + 2) : i + 2).applyMatrix4(local);\n const ax = b.x - a.x; const ay = b.y - a.y;\n const bx = c.x - a.x; const by = c.y - a.y;\n const determinant = ax * by - ay * bx;\n if (Math.abs(determinant) < 1e-10) continue;\n triangles.push({ x: a.x, y: a.y, z: a.z, ax, ay, az: b.z - a.z, bx, by, bz: c.z - a.z,\n inverse: 1 / determinant, minX: Math.min(a.x, b.x, c.x), maxX: Math.max(a.x, b.x, c.x),\n minY: Math.min(a.y, b.y, c.y), maxY: Math.max(a.y, b.y, c.y) });\n }\n }\n }\n\n function front(x: number, y: number) {\n let depth = -Infinity;\n for (const t of triangles) {\n if (x < t.minX || x > t.maxX || y < t.minY || y > t.maxY) continue;\n const dx = x - t.x; const dy = y - t.y;\n const u = (dx * t.by - dy * t.bx) * t.inverse;\n const v = (t.ax * dy - t.ay * dx) * t.inverse;\n if (u >= -1e-6 && v >= -1e-6 && u + v <= 1.000001) depth = Math.max(depth, t.z + u * t.az + v * t.bz);\n }\n return depth;\n }\n\n return {\n add(mesh: THREE.Mesh, offset = 0.002) {\n patches.push({ mesh, original: new Float32Array(mesh.geometry.getAttribute('position').array), offset });\n },\n update() {\n head.updateWorldMatrix(true, true);\n headInverse.copy(head.matrixWorld).invert();\n if (!triangles.length) compile();\n for (const { mesh, original, offset } of patches) {\n local.multiplyMatrices(headInverse, mesh.matrixWorld);\n inverse.copy(local).invert();\n const positions = mesh.geometry.getAttribute('position');\n for (let i = 0; i < positions.count; i++) {\n point.fromArray(original, i * 3).applyMatrix4(local);\n const z = front(point.x, point.y);\n if (Number.isFinite(z)) point.z = z + offset;\n point.applyMatrix4(inverse);\n positions.setXYZ(i, point.x, point.y, point.z);\n }\n positions.needsUpdate = true;\n mesh.geometry.computeBoundingSphere();\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/components/pro/Sprite/shared/gait.ts
|
|
2
|
+
function e(e, t, n) {
|
|
3
|
+
let r = ((e + t) % 1 + 1) % 1;
|
|
4
|
+
if (r < n) {
|
|
5
|
+
let e = r / n;
|
|
6
|
+
return {
|
|
7
|
+
travel: -Math.cos(e * Math.PI),
|
|
8
|
+
lift: Math.sin(e * Math.PI)
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
travel: 1 - 2 * (r - n) / (1 - n),
|
|
13
|
+
lift: 0
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { e as sampleFootstep };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=gait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gait.js","names":["sampleFootstep","phase","cycle","offset","swingFraction","swing"],"sources":["../../../../../src/components/pro/Sprite/shared/gait.ts"],"sourcesContent":["/** A foot travels forward while lifted, then moves back through its planted support phase. */\nexport function sampleFootstep(cycle: number, offset: number, swingFraction: number) {\n const phase = ((cycle + offset) % 1 + 1) % 1;\n if (phase < swingFraction) {\n const swing = phase / swingFraction;\n return { travel: -Math.cos(swing * Math.PI), lift: Math.sin(swing * Math.PI) };\n }\n return { travel: 1 - 2 * (phase - swingFraction) / (1 - swingFraction), lift: 0 };\n}\n"],"mappings":";AACA,SAAgBA,EAAe,GAAe,GAAgB,GAAuB;CACnF,IAAMC,MAAUC,IAAQC,KAAU,IAAI,KAAK;CAC3C,IAAIF,IAAQG,GAAe;EACzB,IAAMC,IAAQJ,IAAQG;EACtB,OAAO;GAAE,QAAQ,CAAC,KAAK,IAAIC,IAAQ,KAAK,EAAE;GAAG,MAAM,KAAK,IAAIA,IAAQ,KAAK,EAAE;EAAE;CAC/E;CACA,OAAO;EAAE,QAAQ,IAAI,KAAKJ,IAAQG,MAAkB,IAAIA;EAAgB,MAAM;CAAE;AAClF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export type Point = [number, number, number];
|
|
3
|
+
export type Ring = [y: number, width: number, depth: number, forward?: number];
|
|
4
|
+
/** Deliberately placed cross-sections, not a tessellated sphere: cheeks, chin and shoulders have their own silhouette. */
|
|
5
|
+
export declare function loft(rings: Ring[], sides?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
|
|
6
|
+
/** Closed, ridged volumes. Ears and feathers have thickness and read from behind, not just from the front. */
|
|
7
|
+
export declare function cutout(outline: [number, number][], ridge: Point, back?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
|
|
8
|
+
export declare function sweep(points: Point[], radii: number[], sides?: number, steps?: number, flatten?: number): THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/geometry.ts
|
|
3
|
+
var t = (t) => new e.Vector3(...t);
|
|
4
|
+
function n(t, n = 12) {
|
|
5
|
+
let r = [], i = [], a = [];
|
|
6
|
+
t.forEach(([e, t, a, o = 0], s) => {
|
|
7
|
+
let c = [], l = t === 0 ? 1 : n;
|
|
8
|
+
for (let i = 0; i < l; i++) {
|
|
9
|
+
let l = (i + .5) * Math.PI * 2 / n + (s % 2 ? .045 : -.045);
|
|
10
|
+
c.push(r.length / 3), r.push(Math.sin(l) * t, e, Math.cos(l) * a + o);
|
|
11
|
+
}
|
|
12
|
+
i.push(c);
|
|
13
|
+
});
|
|
14
|
+
for (let e = 0; e < i.length - 1; e++) {
|
|
15
|
+
let t = i[e], r = i[e + 1];
|
|
16
|
+
for (let e = 0; e < n; e++) {
|
|
17
|
+
let i = (e + 1) % n;
|
|
18
|
+
t.length === 1 ? a.push(t[0], r[i], r[e]) : r.length === 1 ? a.push(t[e], t[i], r[0]) : e % 2 ? a.push(t[e], t[i], r[i], t[e], r[i], r[e]) : a.push(t[e], t[i], r[e], t[i], r[i], r[e]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let o = new e.BufferGeometry();
|
|
22
|
+
return o.setAttribute("position", new e.Float32BufferAttribute(r, 3)), o.setIndex(a), o;
|
|
23
|
+
}
|
|
24
|
+
function r(t, n, r = -.06) {
|
|
25
|
+
e.ShapeUtils.isClockWise(t.map(([t, n]) => new e.Vector2(t, n))) && (t = t.map((e, n) => t[t.length - 1 - n]));
|
|
26
|
+
let i = t.flatMap(([e, t]) => [
|
|
27
|
+
e,
|
|
28
|
+
t,
|
|
29
|
+
0
|
|
30
|
+
]);
|
|
31
|
+
i.push(...n, n[0], n[1], r);
|
|
32
|
+
let a = t.length, o = [];
|
|
33
|
+
for (let e = 0; e < t.length; e++) {
|
|
34
|
+
let n = (e + 1) % t.length;
|
|
35
|
+
o.push(e, n, a, n, e, a + 1);
|
|
36
|
+
}
|
|
37
|
+
let s = new e.BufferGeometry();
|
|
38
|
+
return s.setAttribute("position", new e.Float32BufferAttribute(i, 3)), s.setIndex(o), s;
|
|
39
|
+
}
|
|
40
|
+
function i(n, r, i = 6, a = 12, o = 1) {
|
|
41
|
+
let s = new e.CatmullRomCurve3(n.map(t)), c = s.computeFrenetFrames(a, !1), l = [], u = [];
|
|
42
|
+
for (let t = 0; t <= a; t++) {
|
|
43
|
+
let n = s.getPoint(t / a), d = t / a * (r.length - 1), f = Math.min(r.length - 2, Math.floor(d)), p = e.MathUtils.lerp(r[f], r[f + 1], d - f);
|
|
44
|
+
for (let e = 0; e < i; e++) {
|
|
45
|
+
let r = e / i * Math.PI * 2, s = n.clone().addScaledVector(c.normals[t], Math.cos(r) * p).addScaledVector(c.binormals[t], Math.sin(r) * p * o);
|
|
46
|
+
if (l.push(s.x, s.y, s.z), t < a) {
|
|
47
|
+
let n = t * i + e, r = t * i + (e + 1) % i;
|
|
48
|
+
u.push(n, r, n + i, r, r + i, n + i);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (let e = 1; e < i - 1; e++) u.push(0, e + 1, e, a * i, a * i + e, a * i + e + 1);
|
|
53
|
+
let d = new e.BufferGeometry();
|
|
54
|
+
return d.setAttribute("position", new e.Float32BufferAttribute(l, 3)), d.setIndex(u), d;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { r as cutout, n as loft, i as sweep };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","names":["THREE","vector","point","loft","vertices","rows","indices","y","width","depth","forward","indicesForRing","count","sides","angle","row","a","b","i","next","geometry","cutout","outline","x","ridge","back","front","sweep","curve","points","frames","steps","p","index","radii","k","radius","j","flatten"],"sources":["../../../../../src/components/pro/Sprite/shared/geometry.ts"],"sourcesContent":["import * as THREE from 'three';\n\nexport type Point = [number, number, number];\nexport type Ring = [y: number, width: number, depth: number, forward?: number];\nconst vector = (point: Point) => new THREE.Vector3(...point);\n\n/** Deliberately placed cross-sections, not a tessellated sphere: cheeks, chin and shoulders have their own silhouette. */\nexport function loft(rings: Ring[], sides = 12) {\n const vertices: number[] = [];\n const rows: number[][] = [];\n const indices: number[] = [];\n rings.forEach(([y, width, depth, forward = 0], row) => {\n const indicesForRing: number[] = [];\n const count = width === 0 ? 1 : sides;\n for (let i = 0; i < count; i++) {\n const angle = (i + 0.5) * Math.PI * 2 / sides + (row % 2 ? 0.045 : -0.045);\n indicesForRing.push(vertices.length / 3);\n vertices.push(Math.sin(angle) * width, y, Math.cos(angle) * depth + forward);\n }\n rows.push(indicesForRing);\n });\n for (let row = 0; row < rows.length - 1; row++) {\n const a = rows[row];\n const b = rows[row + 1];\n for (let i = 0; i < sides; i++) {\n const next = (i + 1) % sides;\n if (a.length === 1) indices.push(a[0], b[next], b[i]);\n else if (b.length === 1) indices.push(a[i], a[next], b[0]);\n else if (i % 2) indices.push(a[i], a[next], b[next], a[i], b[next], b[i]);\n else indices.push(a[i], a[next], b[i], a[next], b[next], b[i]);\n }\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n\n/** Closed, ridged volumes. Ears and feathers have thickness and read from behind, not just from the front. */\nexport function cutout(outline: [number, number][], ridge: Point, back = -0.06) {\n if (THREE.ShapeUtils.isClockWise(outline.map(([x, y]) => new THREE.Vector2(x, y)))) {\n outline = outline.map((_, i) => outline[outline.length - 1 - i]);\n }\n const vertices = outline.flatMap(([x, y]) => [x, y, 0]);\n vertices.push(...ridge, ridge[0], ridge[1], back);\n const front = outline.length;\n const indices: number[] = [];\n for (let i = 0; i < outline.length; i++) {\n const next = (i + 1) % outline.length;\n indices.push(i, next, front, next, i, front + 1);\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n\nexport function sweep(points: Point[], radii: number[], sides = 6, steps = 12, flatten = 1) {\n const curve = new THREE.CatmullRomCurve3(points.map(vector));\n const frames = curve.computeFrenetFrames(steps, false);\n const vertices: number[] = [];\n const indices: number[] = [];\n for (let i = 0; i <= steps; i++) {\n const p = curve.getPoint(i / steps);\n const index = i / steps * (radii.length - 1);\n const k = Math.min(radii.length - 2, Math.floor(index));\n const radius = THREE.MathUtils.lerp(radii[k], radii[k + 1], index - k);\n for (let j = 0; j < sides; j++) {\n const angle = j / sides * Math.PI * 2;\n const point = p.clone().addScaledVector(frames.normals[i], Math.cos(angle) * radius)\n .addScaledVector(frames.binormals[i], Math.sin(angle) * radius * flatten);\n vertices.push(point.x, point.y, point.z);\n if (i < steps) {\n const a = i * sides + j;\n const b = i * sides + (j + 1) % sides;\n indices.push(a, b, a + sides, b, b + sides, a + sides);\n }\n }\n }\n for (let j = 1; j < sides - 1; j++) {\n indices.push(0, j + 1, j, steps * sides, steps * sides + j, steps * sides + j + 1);\n }\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n geometry.setIndex(indices);\n return geometry;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export type MagicEffectStyle = {
|
|
3
|
+
name: string;
|
|
4
|
+
palette: readonly number[];
|
|
5
|
+
core: {
|
|
6
|
+
shape: 'gem' | 'star';
|
|
7
|
+
growth: number;
|
|
8
|
+
rotate: (rotation: THREE.Euler, time: number) => void;
|
|
9
|
+
};
|
|
10
|
+
haloColor: number;
|
|
11
|
+
sparkSpeed: number;
|
|
12
|
+
orbit: {
|
|
13
|
+
count: number;
|
|
14
|
+
tube: number;
|
|
15
|
+
arc: number;
|
|
16
|
+
radius: number;
|
|
17
|
+
spacing: number;
|
|
18
|
+
opacity: number;
|
|
19
|
+
rotate: (rotation: THREE.Euler, time: number, index: number) => void;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
/** Shared particle renderer; character animation modules own appearance and choreography. */
|
|
23
|
+
export declare function createMagicEffect(style: MagicEffectStyle): {
|
|
24
|
+
group: THREE.Group<THREE.Object3DEventMap>;
|
|
25
|
+
update: (elapsed: number, progress: number, strength: number) => void;
|
|
26
|
+
dispose: () => void;
|
|
27
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as e from "three";
|
|
2
|
+
//#region src/components/pro/Sprite/shared/magicEffect.ts
|
|
3
|
+
function t(t) {
|
|
4
|
+
let n = new e.Group();
|
|
5
|
+
n.name = t.name;
|
|
6
|
+
let r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), { palette: a, orbit: o } = t, s = (t) => {
|
|
7
|
+
let n = new e.MeshBasicMaterial({
|
|
8
|
+
color: t,
|
|
9
|
+
transparent: !0,
|
|
10
|
+
depthWrite: !1,
|
|
11
|
+
toneMapped: !1,
|
|
12
|
+
side: e.DoubleSide
|
|
13
|
+
});
|
|
14
|
+
return i.add(n), n;
|
|
15
|
+
}, c = (t, i, a) => {
|
|
16
|
+
r.add(t);
|
|
17
|
+
let o = new e.Mesh(t, i);
|
|
18
|
+
return o.name = a, n.add(o), o;
|
|
19
|
+
}, l = new e.Shape();
|
|
20
|
+
for (let e = 0; e < 10; e++) {
|
|
21
|
+
let t = Math.PI / 2 + e * Math.PI / 5, n = e % 2 ? .42 : 1;
|
|
22
|
+
e ? l.lineTo(Math.cos(t) * n, Math.sin(t) * n) : l.moveTo(Math.cos(t) * n, Math.sin(t) * n);
|
|
23
|
+
}
|
|
24
|
+
l.closePath();
|
|
25
|
+
let u = new e.ExtrudeGeometry(l, {
|
|
26
|
+
depth: .16,
|
|
27
|
+
bevelEnabled: !1,
|
|
28
|
+
steps: 1
|
|
29
|
+
});
|
|
30
|
+
u.translate(0, 0, -.08), r.add(u);
|
|
31
|
+
let d = c(t.core.shape === "gem" ? new e.IcosahedronGeometry(1, 1) : u, s(16773577), "magic-core"), f = c(new e.IcosahedronGeometry(1, 1), s(t.haloColor), "magic-halo"), p = Array.from({ length: 24 }, (e, t) => c(u, s(a[t % a.length]), `magic-spark-${t}`)), m = Array.from({ length: o.count }, (t, n) => c(new e.TorusGeometry(1, o.tube, 4, 48, o.arc), s(a[n % a.length]), `magic-orbit-${n}`)), h = !1, g = (r, i, a) => {
|
|
32
|
+
if (h) return;
|
|
33
|
+
n.visible = a > .001;
|
|
34
|
+
let s = n.visible ? r : 0, c = n.visible ? i : 0, l = e.MathUtils.smoothstep(c, .05, .72), u = e.MathUtils.smoothstep(c, .78, 1), g = a * (1 - u);
|
|
35
|
+
d.scale.setScalar(.045 + l * t.core.growth), t.core.rotate(d.rotation, s), d.material.opacity = g, f.scale.setScalar(.1 + l * .19 + Math.sin(s * 3) * .008), f.material.opacity = g * .13;
|
|
36
|
+
for (let e = 0; e < p.length; e++) {
|
|
37
|
+
let n = p[e], r = e * 2.39996 + s * t.sparkSpeed, i = (.58 - l * .35 + u * .55) * (.65 + e % 5 * .09);
|
|
38
|
+
n.position.set(Math.cos(r) * i, Math.sin(r) * i * .7, Math.sin(r * 1.7 + e) * i * .6), n.rotation.set(.2 * Math.sin(r), r * .2, -r * .5), n.scale.setScalar((.018 + e % 4 * .009) * (.8 + l * .5)), n.material.opacity = g * (.5 + .5 * Math.sin(s * 2.5 + e) ** 2);
|
|
39
|
+
}
|
|
40
|
+
for (let e = 0; e < m.length; e++) {
|
|
41
|
+
let t = m[e];
|
|
42
|
+
t.scale.setScalar((o.radius + e * o.spacing) * (1.3 - l * .25 + u)), o.rotate(t.rotation, s, e), t.material.opacity = g * o.opacity;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
return g(0, 0, 0), {
|
|
46
|
+
group: n,
|
|
47
|
+
update: g,
|
|
48
|
+
dispose: () => {
|
|
49
|
+
if (!h) {
|
|
50
|
+
h = !0, n.removeFromParent(), n.clear();
|
|
51
|
+
for (let e of r) e.dispose();
|
|
52
|
+
for (let e of i) e.dispose();
|
|
53
|
+
r.clear(), i.clear();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { t as createMagicEffect };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=magicEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magicEffect.js","names":["THREE","createMagicEffect","group","style","geometries","materials","material","result","mesh","geometry","ink","name","starShape","i","angle","radius","starGeometry","core","halo","sparks","palette","bands","orbit","disposed","update","strength","t","elapsed","phase","progress","charge","release","brightness","spark","band"],"sources":["../../../../../src/components/pro/Sprite/shared/magicEffect.ts"],"sourcesContent":["import * as THREE from 'three';\n\nexport type MagicEffectStyle = {\n name: string;\n palette: readonly number[];\n core: { shape: 'gem' | 'star'; growth: number; rotate: (rotation: THREE.Euler, time: number) => void };\n haloColor: number;\n sparkSpeed: number;\n orbit: {\n count: number; tube: number; arc: number; radius: number; spacing: number; opacity: number;\n rotate: (rotation: THREE.Euler, time: number, index: number) => void;\n };\n};\n\n/** Shared particle renderer; character animation modules own appearance and choreography. */\nexport function createMagicEffect(style: MagicEffectStyle) {\n const group = new THREE.Group();\n group.name = style.name;\n const geometries = new Set<THREE.BufferGeometry>();\n const materials = new Set<THREE.MeshBasicMaterial>();\n const { palette, orbit } = style;\n const material = (color: number) => {\n const result = new THREE.MeshBasicMaterial({ color, transparent: true, depthWrite: false, toneMapped: false, side: THREE.DoubleSide });\n materials.add(result);\n return result;\n };\n const mesh = (geometry: THREE.BufferGeometry, ink: THREE.MeshBasicMaterial, name: string) => {\n geometries.add(geometry);\n const result = new THREE.Mesh(geometry, ink);\n result.name = name;\n group.add(result);\n return result;\n };\n const starShape = new THREE.Shape();\n for (let i = 0; i < 10; i++) {\n const angle = Math.PI / 2 + i * Math.PI / 5;\n const radius = i % 2 ? 0.42 : 1;\n if (i) starShape.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);\n else starShape.moveTo(Math.cos(angle) * radius, Math.sin(angle) * radius);\n }\n starShape.closePath();\n const starGeometry = new THREE.ExtrudeGeometry(starShape, { depth: 0.16, bevelEnabled: false, steps: 1 });\n starGeometry.translate(0, 0, -0.08);\n geometries.add(starGeometry);\n const core = mesh(style.core.shape === 'gem' ? new THREE.IcosahedronGeometry(1, 1) : starGeometry, material(0xfff1c9), 'magic-core');\n const halo = mesh(new THREE.IcosahedronGeometry(1, 1), material(style.haloColor), 'magic-halo');\n const sparks = Array.from({ length: 24 }, (_, i) => mesh(starGeometry, material(palette[i % palette.length]), `magic-spark-${i}`));\n const bands = Array.from({ length: orbit.count }, (_, i) => {\n const ring = mesh(new THREE.TorusGeometry(1, orbit.tube, 4, 48, orbit.arc),\n material(palette[i % palette.length]), `magic-orbit-${i}`);\n return ring;\n });\n let disposed = false;\n const update = (elapsed: number, progress: number, strength: number) => {\n if (disposed) return;\n group.visible = strength > 0.001;\n const t = group.visible ? elapsed : 0;\n const phase = group.visible ? progress : 0;\n const charge = THREE.MathUtils.smoothstep(phase, 0.05, 0.72);\n const release = THREE.MathUtils.smoothstep(phase, 0.78, 1);\n const brightness = strength * (1 - release);\n core.scale.setScalar(0.045 + charge * style.core.growth);\n style.core.rotate(core.rotation, t);\n core.material.opacity = brightness;\n halo.scale.setScalar(0.10 + charge * 0.19 + Math.sin(t * 3) * 0.008);\n halo.material.opacity = brightness * 0.13;\n for (let i = 0; i < sparks.length; i++) {\n const spark = sparks[i];\n const angle = i * 2.39996 + t * style.sparkSpeed;\n const radius = (0.58 - charge * 0.35 + release * 0.55) * (0.65 + (i % 5) * 0.09);\n spark.position.set(Math.cos(angle) * radius, Math.sin(angle) * radius * 0.7,\n Math.sin(angle * 1.7 + i) * radius * 0.6);\n spark.rotation.set(0.2 * Math.sin(angle), angle * 0.2, -angle * 0.5);\n spark.scale.setScalar((0.018 + (i % 4) * 0.009) * (0.8 + charge * 0.5));\n spark.material.opacity = brightness * (0.5 + 0.5 * Math.pow(Math.sin(t * 2.5 + i), 2));\n }\n for (let i = 0; i < bands.length; i++) {\n const band = bands[i];\n band.scale.setScalar((orbit.radius + i * orbit.spacing) * (1.3 - charge * 0.25 + release));\n orbit.rotate(band.rotation, t, i);\n band.material.opacity = brightness * orbit.opacity;\n }\n };\n update(0, 0, 0);\n return { group, update, dispose: () => {\n if (disposed) return;\n disposed = true;\n group.removeFromParent();\n group.clear();\n for (const geometry of geometries) geometry.dispose();\n for (const ink of materials) ink.dispose();\n geometries.clear(); materials.clear();\n } };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SpriteMood, SpriteScene } from '../types';
|
|
2
|
+
/** Owns playback scheduling only; the host retains ownership of the model and studio. */
|
|
3
|
+
export declare function createSpritePlayback(host: HTMLElement, model: SpriteScene, render: () => void): {
|
|
4
|
+
express: (mood: SpriteMood, duration?: number, sustain?: boolean) => void;
|
|
5
|
+
stop: () => void;
|
|
6
|
+
turn(radians: number): void;
|
|
7
|
+
dispose(): void;
|
|
8
|
+
};
|