Skip to content
Closed
Changes from all commits
Commits
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
35 changes: 28 additions & 7 deletions apps/example/src/ThreeJS/components/FiberCanvas.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as THREE from "three";
import React, { useRef } from "react";
import React, { useRef, useState } from "react";
import type { ReconcilerRoot, RootState } from "@react-three/fiber";
import {
extend,
Expand All @@ -11,7 +11,7 @@ import type { ViewProps } from "react-native";
import { PixelRatio } from "react-native";
import { Canvas, useCanvasEffect } from "react-native-wgpu";

import { makeWebGPURenderer, ReactNativeCanvas } from "./makeWebGPURenderer";
import { ReactNativeCanvas } from "./makeWebGPURenderer";

//global.THREE = global.THREE || THREE;

Expand All @@ -29,12 +29,12 @@ export const FiberCanvas = ({
camera,
}: FiberCanvasProps) => {
const root = useRef<ReconcilerRoot<OffscreenCanvas>>(null!);
const [frameloop, setFrameloop] = useState<"always" | "never">("never");

React.useMemo(() => extend(THREE), []);

const canvasRef = useCanvasEffect(async () => {
const context = canvasRef.current!.getContext("webgpu")!;
const renderer = makeWebGPURenderer(context);

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
Expand All @@ -56,11 +56,25 @@ export const FiberCanvas = ({
events,
scene,
camera,
gl: renderer,
frameloop: "always",
gl: () => {
const renderer = new THREE.WebGPURenderer({
antialias: true,
canvas,
context,
});
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
renderer.xr = { addEventListener: () => {} };
// Initialize the renderer asynchronously
renderer.init().then(() => {
setFrameloop("always");
});
return renderer;
},
frameloop,
dpr: 1, //PixelRatio.get(),
onCreated: async (state: RootState) => {
await state.gl.init();
onCreated: (state: RootState) => {
// Renderer is already initialized in the gl function
const renderFrame = state.gl.render.bind(state.gl);
state.gl.render = (s: THREE.Scene, c: THREE.Camera) => {
renderFrame(s, c);
Expand All @@ -76,5 +90,12 @@ export const FiberCanvas = ({
};
});

// Update the frameloop when it changes
React.useEffect(() => {
if (root.current) {
root.current.configure({ frameloop });
}
}, [frameloop]);

return <Canvas ref={canvasRef} style={style} />;
};