From 690f7a0a561d5cad47f1aae430ef93ba6f6f8af9 Mon Sep 17 00:00:00 2001
From: Aaron Claes <52576914+AaronClaes@users.noreply.github.com>
Date: Mon, 22 Jul 2024 18:33:32 +0200
Subject: [PATCH] feat(Float): add autoInvalidate prop for on-demand rendering
(#2034)
---
README.md | 10 ++++++++++
src/core/Float.tsx | 5 +++++
2 files changed, 15 insertions(+)
diff --git a/README.md b/README.md
index 4908d128f..5ffb579e3 100644
--- a/README.md
+++ b/README.md
@@ -4350,6 +4350,16 @@ This component makes its contents float or hover.
```
+If you have your frameloop set to `demand`, you can set `autoInvalidate` to `true`. This will ensure the animation will render while it is enabled.
+
+```js
+
+```
+
#### Stage
[![](https://img.shields.io/badge/-storybook-%23ff69b4)](https://drei.pmnd.rs/?path=/story/staging-stage--stage-st)
diff --git a/src/core/Float.tsx b/src/core/Float.tsx
index 20c2dfd92..bccad1583 100644
--- a/src/core/Float.tsx
+++ b/src/core/Float.tsx
@@ -10,6 +10,7 @@ export type FloatProps = JSX.IntrinsicElements['group'] & {
floatIntensity?: number
children?: React.ReactNode
floatingRange?: [number?, number?]
+ autoInvalidate?: boolean
}
export const Float: ForwardRefComponent = /* @__PURE__ */ React.forwardRef<
@@ -24,6 +25,7 @@ export const Float: ForwardRefComponent = /* @__PURE__
rotationIntensity = 1,
floatIntensity = 1,
floatingRange = [-0.1, 0.1],
+ autoInvalidate = false,
...props
},
forwardRef
@@ -33,6 +35,9 @@ export const Float: ForwardRefComponent = /* @__PURE__
const offset = React.useRef(Math.random() * 10000)
useFrame((state) => {
if (!enabled || speed === 0) return
+
+ if (autoInvalidate) state.invalidate()
+
const t = offset.current + state.clock.getElapsedTime()
ref.current.rotation.x = (Math.cos((t / 4) * speed) / 8) * rotationIntensity
ref.current.rotation.y = (Math.sin((t / 4) * speed) / 8) * rotationIntensity