import type {VFC} from 'react' import {useLayoutEffect} from 'react' import React, {useEffect, useRef} from 'react' import {Canvas} from '@react-three/fiber' import {useEditorStore} from '../store' import {OrbitControls} from '@react-three/drei' import shallow from 'zustand/shallow' import root from 'react-shadow/styled-components' import Toolbar from './Toolbar/Toolbar' import ProxyManager from './ProxyManager' import studio from '@theatre/studio' import {useVal} from '@theatre/dataverse-react' import styled, {createGlobalStyle} from 'styled-components' const GlobalStyle = createGlobalStyle` :host { contain: strict; all: initial; color: white; font: 11px -apple-system, BlinkMacSystemFont, Segoe WPC, Segoe Editor, HelveticaNeue-Light, Ubuntu, Droid Sans, sans-serif; } * { padding: 0; margin: 0; font-size: 100%; font: inherit; vertical-align: baseline; list-style: none; } ` const EditorScene = () => { const orbitControlsRef = useRef() const [editorObject, helpersRoot, setOrbitControlsRef] = useEditorStore( (state) => [ state.editorObject, state.helpersRoot, state.setOrbitControlsRef, ], shallow, ) const showGrid = useVal(editorObject?.props.viewport.showGrid) ?? true const showAxes = useVal(editorObject?.props.viewport.showAxes) ?? true useEffect(() => { setOrbitControlsRef(orbitControlsRef) }, [setOrbitControlsRef]) return ( <> {showGrid && } {showAxes && } {/* @ts-ignore */} ) } const Wrapper = styled.div<{visible: boolean}>` tab-size: 4; line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ margin: 0; position: fixed; top: 0px; right: 0px; bottom: 0px; left: 0px; z-index: 50; display: ${(props) => (props.visible ? 'block' : 'none')}; ` const CanvasWrapper = styled.div` display: relative; z-index: 0; height: 100%; ` const Editor: VFC = () => { const [editorObject, sceneSnapshot, initialEditorCamera, createSnapshot] = useEditorStore( (state) => [ state.editorObject, state.sceneSnapshot, state.initialEditorCamera, state.createSnapshot, ], shallow, ) const editorOpen = !!useVal(editorObject?.props.isOpen) useLayoutEffect(() => { if (editorOpen) { createSnapshot() } }, [editorOpen]) if (!editorObject) return <> return ( {sceneSnapshot ? ( <> { gl.setClearColor('white') }} shadowMap pixelRatio={window.devicePixelRatio} onPointerMissed={() => studio.__experimental_setSelection([])} > ) : null} ) } export default Editor