Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Viewer Configurator: Add json output + save/load snippet #16447

Merged
merged 61 commits into from
Apr 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
fdba949
First pass with a few properties, but cameraOrbit/cameraTarget should…
ryantrem Mar 19, 2025
000a2bc
Remove cameraOrbit/cameraTarget properties and improve resetCamera
ryantrem Mar 21, 2025
fdcebbe
Merge master
ryantrem Mar 21, 2025
f4f15ac
Add cameraAutoOrbit and animation to config
ryantrem Mar 21, 2025
da534bc
Remove unnecessary interpolate param
ryantrem Mar 21, 2025
969cacd
Rename selectedAnimation to defaultAnimation for ViewerOptions
ryantrem Mar 21, 2025
3a0d861
Add environmentConfig to ViewerOptions
ryantrem Mar 21, 2025
7ad7648
Allow reset-mode to take multiple values
ryantrem Mar 21, 2025
5a61652
Add postProcessing to ViewerConfig
ryantrem Mar 21, 2025
be71d5e
postProcessing -> post-processing
ryantrem Mar 21, 2025
051f2a5
defaultAnimation -> selectedAnimation
ryantrem Mar 21, 2025
10a272d
Add selectedMaterialVariant to ViewerOptions
ryantrem Mar 21, 2025
4c63a91
Add environment urls to ViewerOptions
ryantrem Mar 21, 2025
0ab0941
Add source to ViewerOptions
ryantrem Mar 21, 2025
4c67f9e
Cleanup
ryantrem Mar 21, 2025
4df5fac
Switch to resetCamera + updateCamera
ryantrem Mar 22, 2025
380dfce
Re-order for consistency
ryantrem Mar 22, 2025
67994e6
Improve doc comments
ryantrem Mar 22, 2025
a0c2b6c
Default attribute values
ryantrem Mar 22, 2025
3b53442
Cleanup
ryantrem Mar 22, 2025
50d732d
Apply options (including defaults)
ryantrem Mar 24, 2025
e2ca3bc
Use defaults in Viewer.reset
ryantrem Mar 24, 2025
ff36530
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Mar 24, 2025
5a97a9e
Wrap load calls in reset in an error handler
ryantrem Mar 25, 2025
db28c36
Rework ArcRotateCamera.interpolateTo
ryantrem Mar 25, 2025
e077b65
Fix bad logic for autoSuspendRendering
ryantrem Mar 25, 2025
5247e13
Camera interpolation fixes
ryantrem Mar 26, 2025
2919cdd
Don't use camera stored state
ryantrem Mar 26, 2025
ea64a7a
Remove unused framing behavior
ryantrem Mar 26, 2025
6c4dca9
Revert interpolateTo behavior when parameters are undefined
ryantrem Mar 26, 2025
335f9b9
Simplify reframing code
ryantrem Mar 26, 2025
c61f1d5
Remove no longer needed syncToAttribute
ryantrem Mar 26, 2025
cc0a083
Remove unused imports
ryantrem Mar 26, 2025
6a5c971
Reset post-processing in Viewer constructor
ryantrem Mar 27, 2025
c641135
Reset camera orbit/target when the attributes are removed
ryantrem Mar 27, 2025
0813973
Add save/load snippet support
ryantrem Mar 27, 2025
05a92bf
Add more properties to json
ryantrem Mar 28, 2025
6561b1c
Handle snippet server errors
ryantrem Mar 28, 2025
bfec27e
Move hotspots down to Viewer layer
ryantrem Mar 28, 2025
8bad00b
Add hotSpots to ViewerOptions
ryantrem Mar 28, 2025
734761e
Switch to html as default
ryantrem Mar 28, 2025
0af1f82
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Mar 28, 2025
af66039
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Mar 31, 2025
0866750
Add comments
ryantrem Mar 31, 2025
1e3f06c
Add isInterpolation
ryantrem Mar 31, 2025
81c13d8
checkNaN
ryantrem Mar 31, 2025
00d8a0f
Add unit tests
ryantrem Mar 31, 2025
abc6edc
Small camera fixes
ryantrem Apr 1, 2025
cd60179
Add comments
ryantrem Apr 1, 2025
9919de9
Use proxy in viewer factory
ryantrem Apr 1, 2025
f509539
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Apr 1, 2025
34d20e4
Fix ViewerElement.engine property
ryantrem Apr 1, 2025
ea1f740
Rename ViewerOptions object to DefaultViewerOptions
ryantrem Apr 1, 2025
ae24744
Rename Output Type to Format
ryantrem Apr 1, 2025
09ff048
Update resetCamera to be tri-state
ryantrem Apr 1, 2025
9818dee
Missed files in prev commit
ryantrem Apr 1, 2025
d73f1db
Remove commented out code
ryantrem Apr 1, 2025
423f0af
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Apr 3, 2025
90aa40a
Remove redundant 'as const'
ryantrem Apr 3, 2025
9d70029
Merge remote-tracking branch 'origin/master' into viewer-config
ryantrem Apr 4, 2025
e0e11e8
PR feedback
ryantrem Apr 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions packages/tools/viewer-configurator/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { FunctionComponent } from "react";
import type { ViewerOptions } from "viewer/viewer";
import type { ViewerElement } from "viewer/viewerElement";

import "./App.scss";
Expand All @@ -11,16 +12,21 @@ import { Configurator } from "./components/configurator/configurator";
import { useEventfulState } from "./hooks/observableHooks";

export const App: FunctionComponent = () => {
const [viewerOptions, setViewerOptions] = useState<ViewerOptions>();
const [viewerElement, setViewerElement] = useState<ViewerElement>();
const viewerDetails = useEventfulState(() => viewerElement?.viewerDetails, viewerElement, "viewerready");
const viewer = useMemo(() => viewerDetails?.viewer, [viewerDetails]);

return (
<>
<SplitContainer className="appContainer" direction={SplitDirection.Horizontal}>
<Viewer onViewerCreated={setViewerElement} />
<Viewer onViewerCreated={setViewerElement} onOptionsLoaded={setViewerOptions} />
<Splitter size={8} minSize={300} initialSize={400} maxSize={600} controlledSide={ControlledSize.Second} />
<div>{viewerElement && viewerDetails && viewer && <Configurator viewerElement={viewerElement} viewerDetails={viewerDetails} viewer={viewer} />}</div>
<div>
{viewerOptions && viewerElement && viewerDetails && viewer && (
<Configurator viewerOptions={viewerOptions} viewerElement={viewerElement} viewerDetails={viewerDetails} viewer={viewer} />
)}
</div>
</SplitContainer>
<div className="blocker">Viewer Configurator needs a horizontal resolution of at least 900px</div>
</>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import "./viewer.scss";
import type { FunctionComponent } from "react";
import type { ViewerOptions } from "viewer/viewer";
import type { ViewerElement } from "viewer/viewerElement";
import "./viewer.scss";
import { useEffect, type FunctionComponent } from "react";
import { Logger } from "core/Misc/logger";
import { ConfigureCustomViewerElement } from "viewer/viewerElement";
import "viewer";

interface HTML3DElementAttributes extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> {
Expand All @@ -16,11 +19,30 @@ declare global {
// eslint-disable-next-line @typescript-eslint/naming-convention
interface IntrinsicElements {
// eslint-disable-next-line @typescript-eslint/naming-convention
"babylon-viewer": HTML3DElementAttributes;
"configured-babylon-viewer": HTML3DElementAttributes;
}
}
}

export const Viewer: FunctionComponent<{ onViewerCreated: (viewerElement: ViewerElement) => void }> = (props) => {
return <babylon-viewer class="viewerElement" ref={props.onViewerCreated}></babylon-viewer>;
export const Viewer: FunctionComponent<{ onViewerCreated: (element: ViewerElement) => void; onOptionsLoaded: (options: ViewerOptions) => void }> = (props) => {
useEffect(() => {
(async () => {
let options: ViewerOptions = {};
if (window.location.hash) {
try {
const id = window.location.hash.substring(1).replace("#", "/");
const response = await fetch(`https://snippet.babylonjs.com/${id}`);
options = JSON.parse((await response.json()).jsonPayload);
} catch (error: unknown) {
Logger.Error(`Failed to load snippet from URL: ${error}`);
}
}

ConfigureCustomViewerElement("configured-babylon-viewer", options);

props.onOptionsLoaded(options);
})();
}, []);

return <configured-babylon-viewer class="viewerElement" ref={props.onViewerCreated}></configured-babylon-viewer>;
};
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,13 @@
}
}

.messageLine {
text-align: center;
font-size: 12px;
font-style: italic;
opacity: 0.6;
}

.textInputLine {
height: 100%;

Expand Down
Loading