diff --git a/packages/plugin-r3f/src/components/SnapshotEditor.tsx b/packages/plugin-r3f/src/components/SnapshotEditor.tsx index 7ad52c6..4739c13 100644 --- a/packages/plugin-r3f/src/components/SnapshotEditor.tsx +++ b/packages/plugin-r3f/src/components/SnapshotEditor.tsx @@ -9,8 +9,7 @@ import studio, {ToolbarIconButton} from '@theatre/studio' import {useVal} from '@theatre/dataverse-react' import styled, {createGlobalStyle, StyleSheetManager} from 'styled-components' import {IoCameraReverseOutline} from 'react-icons/all' -import type {ISheetObject, ISheet} from '@theatre/core' -import type {$FixMe} from '../types' +import type {ISheet} from '@theatre/core' import useSnapshotEditorCamera from './useSnapshotEditorCamera' const GlobalStyle = createGlobalStyle` @@ -95,87 +94,86 @@ const Tools = styled.div` pointer-events: auto; ` -const SnapshotEditor: React.FC<{object: ISheetObject<$FixMe>; paneId: string}> = - (props) => { - const snapshotEditorSheet = props.object.sheet - const paneId = props.paneId +const SnapshotEditor: React.FC<{paneId: string}> = (props) => { + const snapshotEditorSheet = studio.getStudioProject().sheet('Plugin-R3F') + const paneId = props.paneId - const [editorObject, sceneSnapshot, createSnapshot, sheet] = useEditorStore( - (state) => [ - state.editorObject, - state.sceneSnapshot, - state.createSnapshot, - state.sheet, - ], - shallow, - ) + const [editorObject, sceneSnapshot, createSnapshot, sheet] = useEditorStore( + (state) => [ + state.editorObject, + state.sceneSnapshot, + state.createSnapshot, + state.sheet, + ], + shallow, + ) - const editorOpen = true - useLayoutEffect(() => { - let timeout: NodeJS.Timeout | undefined - if (editorOpen) { - // a hack to make sure all the scene's props are - // applied before we take a snapshot - timeout = setTimeout(createSnapshot, 100) + const editorOpen = true + useLayoutEffect(() => { + let timeout: NodeJS.Timeout | undefined + if (editorOpen) { + // a hack to make sure all the scene's props are + // applied before we take a snapshot + timeout = setTimeout(createSnapshot, 100) + } + return () => { + if (timeout !== undefined) { + clearTimeout(timeout) } - return () => { - if (timeout !== undefined) { - clearTimeout(timeout) - } - } - }, [editorOpen]) + } + }, [editorOpen]) - const onPointerMissed = useCallback(() => { - if (sheet !== null) studio.__experimental_setSelection([sheet]) - }, [sheet]) + const onPointerMissed = useCallback(() => { + if (sheet !== null) studio.__experimental_setSelection([sheet]) + }, [sheet]) - if (!editorObject) return <> + if (!editorObject) return <> - return ( - - - <> - - - - - } - label="Refresh Snapshot" - onClick={createSnapshot} - > - - + return ( + + + <> + + + + + } + label="Refresh Snapshot" + onClick={createSnapshot} + > + + - {sceneSnapshot ? ( - <> - - { - gl.setClearColor('white') - }} - shadowMap - dpr={[1, 2]} - fog={'red'} - frameloop="demand" - onPointerMissed={onPointerMissed} - > - - - - - ) : null} - - {/* */} - - - - ) - } + {sceneSnapshot ? ( + <> + + { + gl.setClearColor('white') + }} + shadowMap + dpr={[1, 2]} + fog={'red'} + frameloop="demand" + onPointerMissed={onPointerMissed} + > + + + + + ) : null} + + {/* */} + + + + ) +} export default SnapshotEditor diff --git a/theatre/studio/src/PaneManager.ts b/theatre/studio/src/PaneManager.ts index b4f9be1..1dae54f 100644 --- a/theatre/studio/src/PaneManager.ts +++ b/theatre/studio/src/PaneManager.ts @@ -1,7 +1,7 @@ import {prism, val} from '@theatre/dataverse' import {emptyArray} from '@theatre/shared/utils' import SimpleCache from '@theatre/shared/utils/SimpleCache' -import type {$FixMe, $IntentionalAny} from '@theatre/shared/utils/types' +import type {$IntentionalAny} from '@theatre/shared/utils/types' import type {Studio} from './Studio' import type {PaneInstance} from './TheatreStudio' @@ -43,20 +43,9 @@ export default class PaneManager { const instance = prism.memo( `instance-${instanceDescriptor!.instanceId}`, () => { - const object = this._studio - .getExtensionSheet(extensionId, core) - .object( - 'Pane: ' + instanceId, - null, - core.types.compound({ - panelThingy: core.types.boolean(false), - }), - ) as $FixMe - const inst: PaneInstance<$IntentionalAny> = { extensionId, instanceId, - object, definition, } return inst diff --git a/theatre/studio/src/TheatreStudio.ts b/theatre/studio/src/TheatreStudio.ts index 26d5aca..9a69086 100644 --- a/theatre/studio/src/TheatreStudio.ts +++ b/theatre/studio/src/TheatreStudio.ts @@ -1,4 +1,4 @@ -import type {ISheet, ISheetObject} from '@theatre/core' +import type {IProject, ISheet, ISheetObject} from '@theatre/core' import studioTicker from '@theatre/studio/studioTicker' import type {IDerivation, Pointer} from '@theatre/dataverse' import {prism} from '@theatre/dataverse' @@ -15,10 +15,7 @@ import {getOutlineSelection} from './selectors' import type SheetObject from '@theatre/core/sheetObjects/SheetObject' import getStudio from './getStudio' import type React from 'react' -import type { - PropTypeConfig_Boolean, - PropTypeConfig_Compound, -} from '@theatre/core/propTypes' +import type {PropTypeConfig_Compound} from '@theatre/core/propTypes' import {debounce} from 'lodash-es' export interface ITransactionAPI { @@ -33,12 +30,6 @@ export interface PaneClassDefinition< dataType: DataType component: React.ComponentType<{ paneId: string - object: ISheetObject< - PropTypeConfig_Compound<{ - visible: PropTypeConfig_Boolean - data: DataType - }> - > }> } @@ -53,9 +44,6 @@ export type IExtension = { export type PaneInstance = { extensionId: string instanceId: string - object: ISheetObject< - PropTypeConfig_Compound<{data: $FixMe; visible: PropTypeConfig_Boolean}> - > definition: PaneClassDefinition<$FixMe> } @@ -87,6 +75,8 @@ export interface IStudio { createPane( paneClass: PaneClass, ): PaneInstance + + getStudioProject(): IProject } export default class TheatreStudio implements IStudio { @@ -163,6 +153,16 @@ export default class TheatreStudio implements IStudio { return getStudio().scrub() } + getStudioProject() { + const core = getStudio().core + if (!core) { + throw new Error(`You're calling studio.getStudioProject() before \`@theatre/core\` is loaded. To fix this: +1. Check if \`@theatre/core\` is import/required in your bundle. +2. Check the stack trace of this error and make sure the funciton that calls getStudioProject() is run after \`@theatre/core\` is loaded.`) + } + return getStudio().getStudioProject(core) + } + debouncedScrub(threshold: number = 1000): Pick { let currentScrub: IScrub | undefined const scheduleCommit = debounce(() => { diff --git a/theatre/studio/src/panels/BasePanel/PaneWrapper.tsx b/theatre/studio/src/panels/BasePanel/PaneWrapper.tsx index e6ed7d6..5fd9c3c 100644 --- a/theatre/studio/src/panels/BasePanel/PaneWrapper.tsx +++ b/theatre/studio/src/panels/BasePanel/PaneWrapper.tsx @@ -152,7 +152,7 @@ const Content: React.FC<{paneInstance: PaneInstance<$FixMe>}> = ({ - +