@react-three/drei 9.30.2 → 9.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1165,18 +1165,48 @@ This material makes your geometry distort following simplex noise.
1165
1165
  <a href="https://codesandbox.io/s/zqrreo"><img width="20%" src="https://codesandbox.io/api/v1/sandboxes/zqrreo/screenshot.png" alt="Demo"/></a>
1166
1166
  </p>
1167
1167
 
1168
- A convincing Glass/Diamond refraction material. Best pair it with a cube-camera!
1168
+ A convincing Glass/Diamond refraction material.
1169
+
1170
+ ```tsx
1171
+ type MeshRefractionMaterialProps = JSX.IntrinsicElements['shaderMaterial'] & {
1172
+ /** Environment map */
1173
+ envMap: THREE.CubeTexture | THREE.Texture
1174
+ /** Number of ray-cast bounces, it can be expensive to have too many, 2 */
1175
+ bounces?: number
1176
+ /** Refraction index, 2.4 */
1177
+ ior?: number
1178
+ /** Fresnel (strip light), 0 */
1179
+ fresnel?: number
1180
+ /** RGB shift intensity, can be expensive, 0 */
1181
+ aberrationStrength?: number
1182
+ /** Color, white */
1183
+ color?: ReactThreeFiber.Color
1184
+ /** If this is on it uses fewer ray casts for the RGB shift sacrificing physical accuracy, true */
1185
+ fastChroma?: boolean
1186
+ }
1187
+ ```
1188
+
1189
+ If you want it to reflect other objects in the scene you best pair it with a cube-camera.
1169
1190
 
1170
1191
  ```jsx
1171
1192
  <CubeCamera>
1172
1193
  {(texture) => (
1173
1194
  <mesh geometry={diamondGeometry} {...props}>
1174
- <RefractionMaterial envMap={texture} toneMapped={false} />
1195
+ <RefractionMaterial envMap={texture} />
1175
1196
  </mesh>
1176
1197
  )}
1177
1198
  </CubeCamera>
1178
1199
  ```
1179
1200
 
1201
+ Otherwise just pass it an environment map.
1202
+
1203
+ ```jsx
1204
+ const texture = useLoader(RGBELoader, "/textures/royal_esplanade_1k.hdr")
1205
+ return (
1206
+ <mesh geometry={diamondGeometry} {...props}>
1207
+ <RefractionMaterial envMap={texture} />
1208
+ ```
1209
+
1180
1210
  #### PointMaterial
1181
1211
 
1182
1212
  <p>
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),a=require("three-mesh-bvh"),n=require("../materials/MeshRefractionMaterial.cjs.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("three"),require("./shaderMaterial.cjs.js");var o=i(e),s=u(r);exports.MeshRefractionMaterial=function({frames:e=1,resolution:i=256,near:u=.1,far:l=1e3,aberrationStrength:f=0,envMap:c,...h}){t.extend({MeshRefractionMaterial:n.MeshRefractionMaterial});const M=r.useRef(),{size:d}=t.useThree(),b=r.useMemo((()=>{const e={};if(c){var r,t;const n=(a=c)&&a.isCubeTexture,i=(null!==(r=n?null==(t=c.image[0])?void 0:t.width:c.image.width)&&void 0!==r?r:1024)/4,u=Math.floor(Math.log2(i)),o=Math.pow(2,u),s=3*Math.max(o,112),l=4*o;n&&(e.ENVMAP_TYPE_CUBEM=""),e.CUBEUV_TEXEL_WIDTH=""+1/s,e.CUBEUV_TEXEL_HEIGHT=""+1/l,e.CUBEUV_MAX_MIP=`${u}.0`}var a;return f>0&&(e.CHROMATIC_ABERRATIONS=""),e}),[f]);return r.useLayoutEffect((()=>{var e,r,t;const n=null==(e=M.current)||null==(r=e.__r3f)||null==(t=r.parent)?void 0:t.geometry;n&&M.current.bvh.updateFrom(new a.MeshBVH(n.toNonIndexed(),{lazyGeneration:!1,strategy:a.SAH}))}),[]),s.createElement("meshRefractionMaterial",o.default({key:JSON.stringify(!!f),defines:b,ref:M,resolution:[d.width,d.height],aberrationStrength:f,envMap:c},h))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("@react-three/fiber"),a=require("three-mesh-bvh"),n=require("../materials/MeshRefractionMaterial.cjs.js");function i(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("three"),require("./shaderMaterial.cjs.js");var o=i(e),s=u(r);exports.MeshRefractionMaterial=function({aberrationStrength:e=0,fastChroma:i=!0,envMap:u,...l}){t.extend({MeshRefractionMaterial:n.MeshRefractionMaterial});const c=r.useRef(),{size:f}=t.useThree(),h=r.useMemo((()=>{var r,t;const a={},n=(o=u)&&o.isCubeTexture;var o;const s=(null!==(r=n?null==(t=u.image[0])?void 0:t.width:u.image.width)&&void 0!==r?r:1024)/4,l=Math.floor(Math.log2(s)),c=Math.pow(2,l),f=3*Math.max(c,112),h=4*c;return n&&(a.ENVMAP_TYPE_CUBEM=""),a.CUBEUV_TEXEL_WIDTH=""+1/f,a.CUBEUV_TEXEL_HEIGHT=""+1/h,a.CUBEUV_MAX_MIP=`${l}.0`,e>0&&(a.CHROMATIC_ABERRATIONS=""),i&&(a.FAST_CHROMA=""),a}),[e,i]);return r.useLayoutEffect((()=>{var e,r,t;const n=null==(e=c.current)||null==(r=e.__r3f)||null==(t=r.parent)?void 0:t.geometry;n&&c.current.bvh.updateFrom(new a.MeshBVH(n.toNonIndexed(),{lazyGeneration:!1,strategy:a.SAH}))}),[]),s.createElement("meshRefractionMaterial",o.default({key:JSON.stringify(h),defines:h,ref:c,resolution:[f.width,f.height],aberrationStrength:e,envMap:u},l))};
@@ -10,16 +10,13 @@ declare global {
10
10
  }
11
11
  }
12
12
  declare type MeshRefractionMaterialProps = JSX.IntrinsicElements['shaderMaterial'] & {
13
+ envMap: THREE.CubeTexture | THREE.Texture;
13
14
  bounces?: number;
14
15
  ior?: number;
15
16
  fresnel?: number;
16
17
  aberrationStrength?: number;
17
18
  color?: ReactThreeFiber.Color;
18
- resolution?: ReactThreeFiber.Vector2;
19
- envMap?: THREE.CubeTexture | THREE.Texture;
20
- frames?: number;
21
- near?: number;
22
- far?: number;
19
+ fastChroma?: boolean;
23
20
  };
24
- export declare function MeshRefractionMaterial({ frames, resolution, near, far, aberrationStrength, envMap, ...props }: MeshRefractionMaterialProps): JSX.Element;
21
+ export declare function MeshRefractionMaterial({ aberrationStrength, fastChroma, envMap, ...props }: MeshRefractionMaterialProps): JSX.Element;
25
22
  export {};
@@ -8,11 +8,8 @@ import { MeshRefractionMaterial as MeshRefractionMaterial$1 } from '../materials
8
8
  const isCubeTexture = def => def && def.isCubeTexture;
9
9
 
10
10
  function MeshRefractionMaterial({
11
- frames = 1,
12
- resolution = 256,
13
- near = 0.1,
14
- far = 1000,
15
11
  aberrationStrength = 0,
12
+ fastChroma = true,
16
13
  envMap,
17
14
  ...props
18
15
  }) {
@@ -24,34 +21,35 @@ function MeshRefractionMaterial({
24
21
  size
25
22
  } = useThree();
26
23
  const defines = useMemo(() => {
27
- const temp = {};
24
+ var _ref, _envMap$image$;
28
25
 
29
- if (envMap) {
30
- var _ref, _envMap$image$;
26
+ const temp = {}; // Sampler2D and SamplerCube need different defines
31
27
 
32
- const isCubeMap = isCubeTexture(envMap);
33
- const w = (_ref = isCubeMap ? (_envMap$image$ = envMap.image[0]) == null ? void 0 : _envMap$image$.width : envMap.image.width) !== null && _ref !== void 0 ? _ref : 1024;
34
- const cubeSize = w / 4;
28
+ const isCubeMap = isCubeTexture(envMap);
29
+ const w = (_ref = isCubeMap ? (_envMap$image$ = envMap.image[0]) == null ? void 0 : _envMap$image$.width : envMap.image.width) !== null && _ref !== void 0 ? _ref : 1024;
30
+ const cubeSize = w / 4;
35
31
 
36
- const _lodMax = Math.floor(Math.log2(cubeSize));
32
+ const _lodMax = Math.floor(Math.log2(cubeSize));
37
33
 
38
- const _cubeSize = Math.pow(2, _lodMax);
34
+ const _cubeSize = Math.pow(2, _lodMax);
39
35
 
40
- const width = 3 * Math.max(_cubeSize, 16 * 7);
41
- const height = 4 * _cubeSize;
42
- if (isCubeMap) temp.ENVMAP_TYPE_CUBEM = '';
43
- temp.CUBEUV_TEXEL_WIDTH = `${1.0 / width}`;
44
- temp.CUBEUV_TEXEL_HEIGHT = `${1.0 / height}`;
45
- temp.CUBEUV_MAX_MIP = `${_lodMax}.0`;
46
- }
36
+ const width = 3 * Math.max(_cubeSize, 16 * 7);
37
+ const height = 4 * _cubeSize;
38
+ if (isCubeMap) temp.ENVMAP_TYPE_CUBEM = '';
39
+ temp.CUBEUV_TEXEL_WIDTH = `${1.0 / width}`;
40
+ temp.CUBEUV_TEXEL_HEIGHT = `${1.0 / height}`;
41
+ temp.CUBEUV_MAX_MIP = `${_lodMax}.0`; // Add defines from chromatic aberration
47
42
 
48
43
  if (aberrationStrength > 0) temp.CHROMATIC_ABERRATIONS = '';
44
+ if (fastChroma) temp.FAST_CHROMA = '';
49
45
  return temp;
50
- }, [aberrationStrength]);
46
+ }, [aberrationStrength, fastChroma]);
51
47
  useLayoutEffect(() => {
52
48
  var _material$current, _material$current$__r, _material$current$__r2;
53
49
 
54
- const geometry = (_material$current = material.current) == null ? void 0 : (_material$current$__r = _material$current.__r3f) == null ? void 0 : (_material$current$__r2 = _material$current$__r.parent) == null ? void 0 : _material$current$__r2.geometry;
50
+ // Get the geometry of this materials parent
51
+ const geometry = (_material$current = material.current) == null ? void 0 : (_material$current$__r = _material$current.__r3f) == null ? void 0 : (_material$current$__r2 = _material$current$__r.parent) == null ? void 0 : _material$current$__r2.geometry; // Update the BVH
52
+
55
53
  if (geometry) material.current.bvh.updateFrom(new MeshBVH(geometry.toNonIndexed(), {
56
54
  lazyGeneration: false,
57
55
  strategy: SAH
@@ -59,7 +57,7 @@ function MeshRefractionMaterial({
59
57
  }, []);
60
58
  return /*#__PURE__*/React.createElement("meshRefractionMaterial", _extends({
61
59
  // @ts-ignore
62
- key: JSON.stringify(!!aberrationStrength) // @ts-ignore
60
+ key: JSON.stringify(defines) // @ts-ignore
63
61
  ,
64
62
  defines: defines,
65
63
  ref: material,
package/core/index.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./CatmullRomLine.cjs.js"),o=require("./Line.cjs.js"),i=require("./PositionalAudio.cjs.js"),u=require("./Text.cjs.js"),a=require("./Text3D.cjs.js"),c=require("./Effects.cjs.js"),n=require("./GradientTexture.cjs.js"),j=require("./Image.cjs.js"),p=require("./Edges.cjs.js"),l=require("./Trail.cjs.js"),x=require("./Sampler.cjs.js"),q=require("./ComputedAttribute.cjs.js"),d=require("./Clone.cjs.js"),m=require("./MarchingCubes.cjs.js"),C=require("./Decal.cjs.js"),h=require("./OrthographicCamera.cjs.js"),M=require("./PerspectiveCamera.cjs.js"),S=require("./CubeCamera.cjs.js"),b=require("./DeviceOrientationControls.cjs.js"),P=require("./FlyControls.cjs.js"),B=require("./MapControls.cjs.js"),f=require("./OrbitControls.cjs.js"),T=require("./TrackballControls.cjs.js"),v=require("./ArcballControls.cjs.js"),g=require("./TransformControls.cjs.js"),A=require("./PointerLockControls.cjs.js"),L=require("./FirstPersonControls.cjs.js"),k=require("./pivotControls/index.cjs.js"),D=require("./GizmoHelper.cjs.js"),E=require("./GizmoViewcube.cjs.js"),R=require("./GizmoViewport.cjs.js"),w=require("./useCubeTexture.cjs.js"),F=require("./useFBX.cjs.js"),G=require("./useGLTF.cjs.js"),z=require("./useKTX2.cjs.js"),O=require("./useProgress.cjs.js"),I=require("./useTexture.cjs.js"),V=require("./useVideoTexture.cjs.js"),y=require("./Stats.cjs.js"),H=require("./useDepthBuffer.cjs.js"),Q=require("./useAspect.cjs.js"),X=require("./useCamera.cjs.js"),K=require("./useDetectGPU.cjs.js"),W=require("./useHelper.cjs.js"),N=require("./useBVH.cjs.js"),U=require("./useContextBridge.cjs.js"),_=require("./useAnimations.cjs.js"),J=require("./useFBO.cjs.js"),Y=require("./useIntersect.cjs.js"),Z=require("./useBoxProjectedEnv.cjs.js"),$=require("./BBAnchor.cjs.js"),ee=require("./CurveModifier.cjs.js"),re=require("./MeshDistortMaterial.cjs.js"),se=require("./MeshWobbleMaterial.cjs.js"),te=require("./MeshReflectorMaterial.cjs.js"),oe=require("./MeshRefractionMaterial.cjs.js"),ie=require("./PointMaterial.cjs.js"),ue=require("./shaderMaterial.cjs.js"),ae=require("./softShadows.cjs.js"),ce=require("./shapes.cjs.js"),ne=require("./RoundedBox.cjs.js"),je=require("./ScreenQuad.cjs.js"),pe=require("./Center.cjs.js"),le=require("./Bounds.cjs.js"),xe=require("./CameraShake.cjs.js"),qe=require("./Float.cjs.js"),de=require("./Stage.cjs.js"),me=require("./Backdrop.cjs.js"),Ce=require("./Shadow.cjs.js"),he=require("./ContactShadows.cjs.js"),Me=require("./AccumulativeShadows.cjs.js"),Se=require("./Reflector.cjs.js"),be=require("./SpotLight.cjs.js"),Pe=require("./Environment.cjs.js"),Be=require("./Lightformer.cjs.js"),fe=require("./Sky.cjs.js"),Te=require("./Stars.cjs.js"),ve=require("./Cloud.cjs.js"),ge=require("./Sparkles.cjs.js"),Ae=require("./useMatcapTexture.cjs.js"),Le=require("./useNormalTexture.cjs.js"),ke=require("./Points.cjs.js"),De=require("./Instances.cjs.js"),Ee=require("./Segments.cjs.js"),Re=require("./Detailed.cjs.js"),we=require("./Preload.cjs.js"),Fe=require("./BakeShadows.cjs.js"),Ge=require("./meshBounds.cjs.js"),ze=require("./AdaptiveDpr.cjs.js"),Oe=require("./AdaptiveEvents.cjs.js"),Ie=require("./PerformanceMonitor.cjs.js"),Ve=require("./RenderTexture.cjs.js"),ye=require("./Mask.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("./pivotControls/AxisArrow.cjs.js"),require("./pivotControls/context.cjs.js"),require("./pivotControls/PlaneSlider.cjs.js"),require("./pivotControls/AxisRotator.cjs.js"),require("../web/Html.cjs.js"),require("react-dom/client"),require("lodash.clamp"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../materials/MeshRefractionMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.QuadraticBezierLine=r.QuadraticBezierLine,exports.CubicBezierLine=s.CubicBezierLine,exports.CatmullRomLine=t.CatmullRomLine,exports.Line=o.Line,exports.PositionalAudio=i.PositionalAudio,exports.Text=u.Text,exports.Text3D=a.Text3D,exports.Effects=c.Effects,exports.isWebGL2Available=c.isWebGL2Available,exports.GradientTexture=n.GradientTexture,exports.Image=j.Image,exports.Edges=p.Edges,exports.Trail=l.Trail,exports.useTrail=l.useTrail,exports.Sampler=x.Sampler,exports.useSurfaceSampler=x.useSurfaceSampler,exports.ComputedAttribute=q.ComputedAttribute,exports.Clone=d.Clone,exports.MarchingCube=m.MarchingCube,exports.MarchingCubes=m.MarchingCubes,exports.MarchingPlane=m.MarchingPlane,exports.Decal=C.Decal,exports.OrthographicCamera=h.OrthographicCamera,exports.PerspectiveCamera=M.PerspectiveCamera,exports.CubeCamera=S.CubeCamera,exports.DeviceOrientationControls=b.DeviceOrientationControls,exports.FlyControls=P.FlyControls,exports.MapControls=B.MapControls,exports.OrbitControls=f.OrbitControls,exports.TrackballControls=T.TrackballControls,exports.ArcballControls=v.ArcballControls,exports.TransformControls=g.TransformControls,exports.PointerLockControls=A.PointerLockControls,exports.FirstPersonControls=L.FirstPersonControls,exports.PivotControls=k.PivotControls,exports.calculateScaleFactor=k.calculateScaleFactor,exports.GizmoHelper=D.GizmoHelper,exports.useGizmoContext=D.useGizmoContext,exports.GizmoViewcube=E.GizmoViewcube,exports.GizmoViewport=R.GizmoViewport,exports.useCubeTexture=w.useCubeTexture,exports.useFBX=F.useFBX,exports.useGLTF=G.useGLTF,exports.useKTX2=z.useKTX2,exports.useProgress=O.useProgress,exports.IsObject=I.IsObject,exports.useTexture=I.useTexture,exports.useVideoTexture=V.useVideoTexture,exports.Stats=y.Stats,exports.useDepthBuffer=H.useDepthBuffer,exports.useAspect=Q.useAspect,exports.useCamera=X.useCamera,exports.useDetectGPU=K.useDetectGPU,exports.useHelper=W.useHelper,exports.useBVH=N.useBVH,exports.useContextBridge=U.useContextBridge,exports.useAnimations=_.useAnimations,exports.useFBO=J.useFBO,exports.useIntersect=Y.useIntersect,exports.useBoxProjectedEnv=Z.useBoxProjectedEnv,exports.BBAnchor=$.BBAnchor,exports.CurveModifier=ee.CurveModifier,exports.MeshDistortMaterial=re.MeshDistortMaterial,exports.MeshWobbleMaterial=se.MeshWobbleMaterial,exports.MeshReflectorMaterial=te.MeshReflectorMaterial,exports.MeshRefractionMaterial=oe.MeshRefractionMaterial,exports.PointMaterial=ie.PointMaterial,exports.PointMaterialImpl=ie.PointMaterialImpl,exports.shaderMaterial=ue.shaderMaterial,exports.softShadows=ae.softShadows,exports.Box=ce.Box,exports.Capsule=ce.Capsule,exports.Circle=ce.Circle,exports.Cone=ce.Cone,exports.Cylinder=ce.Cylinder,exports.Dodecahedron=ce.Dodecahedron,exports.Extrude=ce.Extrude,exports.Icosahedron=ce.Icosahedron,exports.Lathe=ce.Lathe,exports.Octahedron=ce.Octahedron,exports.Plane=ce.Plane,exports.Polyhedron=ce.Polyhedron,exports.Ring=ce.Ring,exports.Sphere=ce.Sphere,exports.Tetrahedron=ce.Tetrahedron,exports.Torus=ce.Torus,exports.TorusKnot=ce.TorusKnot,exports.Tube=ce.Tube,exports.RoundedBox=ne.RoundedBox,exports.ScreenQuad=je.ScreenQuad,exports.Center=pe.Center,exports.Bounds=le.Bounds,exports.useBounds=le.useBounds,exports.CameraShake=xe.CameraShake,exports.Float=qe.Float,exports.Stage=de.Stage,exports.Backdrop=me.Backdrop,exports.Shadow=Ce.Shadow,exports.ContactShadows=he.ContactShadows,exports.AccumulativeShadows=Me.AccumulativeShadows,exports.RandomizedLight=Me.RandomizedLight,exports.accumulativeContext=Me.accumulativeContext,exports.Reflector=Se.Reflector,exports.SpotLight=be.SpotLight,exports.Environment=Pe.Environment,exports.EnvironmentCube=Pe.EnvironmentCube,exports.EnvironmentMap=Pe.EnvironmentMap,exports.EnvironmentPortal=Pe.EnvironmentPortal,exports.useEnvironment=Pe.useEnvironment,exports.Lightformer=Be.Lightformer,exports.Sky=fe.Sky,exports.calcPosFromAngles=fe.calcPosFromAngles,exports.Stars=Te.Stars,exports.Cloud=ve.Cloud,exports.Sparkles=ge.Sparkles,exports.useMatcapTexture=Ae.useMatcapTexture,exports.useNormalTexture=Le.useNormalTexture,exports.Point=ke.Point,exports.Points=ke.Points,exports.PointsBuffer=ke.PointsBuffer,exports.Instance=De.Instance,exports.Instances=De.Instances,exports.Merged=De.Merged,exports.Segment=Ee.Segment,exports.SegmentObject=Ee.SegmentObject,exports.Segments=Ee.Segments,exports.Detailed=Re.Detailed,exports.Preload=we.Preload,exports.BakeShadows=Fe.BakeShadows,exports.meshBounds=Ge.meshBounds,exports.AdaptiveDpr=ze.AdaptiveDpr,exports.AdaptiveEvents=Oe.AdaptiveEvents,exports.PerformanceMonitor=Ie.PerformanceMonitor,exports.usePerformanceMonitor=Ie.usePerformanceMonitor,exports.RenderTexture=Ve.RenderTexture,exports.Mask=ye.Mask,exports.useMask=ye.useMask;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./Billboard.cjs.js"),r=require("./QuadraticBezierLine.cjs.js"),s=require("./CubicBezierLine.cjs.js"),t=require("./CatmullRomLine.cjs.js"),o=require("./Line.cjs.js"),i=require("./PositionalAudio.cjs.js"),u=require("./Text.cjs.js"),a=require("./Text3D.cjs.js"),c=require("./Effects.cjs.js"),n=require("./GradientTexture.cjs.js"),j=require("./Image.cjs.js"),p=require("./Edges.cjs.js"),l=require("./Trail.cjs.js"),x=require("./Sampler.cjs.js"),q=require("./ComputedAttribute.cjs.js"),d=require("./Clone.cjs.js"),m=require("./MarchingCubes.cjs.js"),C=require("./Decal.cjs.js"),h=require("./OrthographicCamera.cjs.js"),M=require("./PerspectiveCamera.cjs.js"),S=require("./CubeCamera.cjs.js"),b=require("./DeviceOrientationControls.cjs.js"),P=require("./FlyControls.cjs.js"),B=require("./MapControls.cjs.js"),f=require("./OrbitControls.cjs.js"),T=require("./TrackballControls.cjs.js"),v=require("./ArcballControls.cjs.js"),g=require("./TransformControls.cjs.js"),A=require("./PointerLockControls.cjs.js"),L=require("./FirstPersonControls.cjs.js"),k=require("./pivotControls/index.cjs.js"),D=require("./GizmoHelper.cjs.js"),E=require("./GizmoViewcube.cjs.js"),R=require("./GizmoViewport.cjs.js"),w=require("./useCubeTexture.cjs.js"),F=require("./useFBX.cjs.js"),G=require("./useGLTF.cjs.js"),z=require("./useKTX2.cjs.js"),O=require("./useProgress.cjs.js"),I=require("./useTexture.cjs.js"),V=require("./useVideoTexture.cjs.js"),y=require("./Stats.cjs.js"),H=require("./useDepthBuffer.cjs.js"),Q=require("./useAspect.cjs.js"),X=require("./useCamera.cjs.js"),K=require("./useDetectGPU.cjs.js"),W=require("./useHelper.cjs.js"),N=require("./useBVH.cjs.js"),U=require("./useContextBridge.cjs.js"),_=require("./useAnimations.cjs.js"),J=require("./useFBO.cjs.js"),Y=require("./useIntersect.cjs.js"),Z=require("./useBoxProjectedEnv.cjs.js"),$=require("./BBAnchor.cjs.js"),ee=require("./CurveModifier.cjs.js"),re=require("./MeshDistortMaterial.cjs.js"),se=require("./MeshWobbleMaterial.cjs.js"),te=require("./MeshReflectorMaterial.cjs.js"),oe=require("./MeshRefractionMaterial.cjs.js"),ie=require("./PointMaterial.cjs.js"),ue=require("./shaderMaterial.cjs.js"),ae=require("./softShadows.cjs.js"),ce=require("./shapes.cjs.js"),ne=require("./RoundedBox.cjs.js"),je=require("./ScreenQuad.cjs.js"),pe=require("./Center.cjs.js"),le=require("./Bounds.cjs.js"),xe=require("./CameraShake.cjs.js"),qe=require("./Float.cjs.js"),de=require("./Stage.cjs.js"),me=require("./Backdrop.cjs.js"),Ce=require("./Shadow.cjs.js"),he=require("./ContactShadows.cjs.js"),Me=require("./AccumulativeShadows.cjs.js"),Se=require("./Reflector.cjs.js"),be=require("./SpotLight.cjs.js"),Pe=require("./Environment.cjs.js"),Be=require("./Lightformer.cjs.js"),fe=require("./Sky.cjs.js"),Te=require("./Stars.cjs.js"),ve=require("./Cloud.cjs.js"),ge=require("./Sparkles.cjs.js"),Ae=require("./useMatcapTexture.cjs.js"),Le=require("./useNormalTexture.cjs.js"),ke=require("./Points.cjs.js"),De=require("./Instances.cjs.js"),Ee=require("./Segments.cjs.js"),Re=require("./Detailed.cjs.js"),we=require("./Preload.cjs.js"),Fe=require("./BakeShadows.cjs.js"),Ge=require("./meshBounds.cjs.js"),ze=require("./AdaptiveDpr.cjs.js"),Oe=require("./AdaptiveEvents.cjs.js"),Ie=require("./PerformanceMonitor.cjs.js"),Ve=require("./RenderTexture.cjs.js"),ye=require("./Mask.cjs.js");require("@babel/runtime/helpers/extends"),require("react"),require("@react-three/fiber"),require("react-merge-refs"),require("three"),require("three-stdlib"),require("troika-three-text"),require("suspend-react"),require("meshline"),require("lodash.pick"),require("lodash.omit"),require("./pivotControls/AxisArrow.cjs.js"),require("../web/Html.cjs.js"),require("react-dom/client"),require("./pivotControls/context.cjs.js"),require("./pivotControls/PlaneSlider.cjs.js"),require("./pivotControls/AxisRotator.cjs.js"),require("lodash.clamp"),require("zustand"),require("stats.js"),require("../helpers/useEffectfulState.cjs.js"),require("detect-gpu"),require("three-mesh-bvh"),require("../materials/BlurPass.cjs.js"),require("../materials/ConvolutionMaterial.cjs.js"),require("../materials/MeshReflectorMaterial.cjs.js"),require("../materials/MeshRefractionMaterial.cjs.js"),require("../helpers/environment-assets.cjs.js"),require("../materials/SpotLightMaterial.cjs.js"),require("../helpers/Position.cjs.js"),require("react-composer"),exports.Billboard=e.Billboard,exports.QuadraticBezierLine=r.QuadraticBezierLine,exports.CubicBezierLine=s.CubicBezierLine,exports.CatmullRomLine=t.CatmullRomLine,exports.Line=o.Line,exports.PositionalAudio=i.PositionalAudio,exports.Text=u.Text,exports.Text3D=a.Text3D,exports.Effects=c.Effects,exports.isWebGL2Available=c.isWebGL2Available,exports.GradientTexture=n.GradientTexture,exports.Image=j.Image,exports.Edges=p.Edges,exports.Trail=l.Trail,exports.useTrail=l.useTrail,exports.Sampler=x.Sampler,exports.useSurfaceSampler=x.useSurfaceSampler,exports.ComputedAttribute=q.ComputedAttribute,exports.Clone=d.Clone,exports.MarchingCube=m.MarchingCube,exports.MarchingCubes=m.MarchingCubes,exports.MarchingPlane=m.MarchingPlane,exports.Decal=C.Decal,exports.OrthographicCamera=h.OrthographicCamera,exports.PerspectiveCamera=M.PerspectiveCamera,exports.CubeCamera=S.CubeCamera,exports.DeviceOrientationControls=b.DeviceOrientationControls,exports.FlyControls=P.FlyControls,exports.MapControls=B.MapControls,exports.OrbitControls=f.OrbitControls,exports.TrackballControls=T.TrackballControls,exports.ArcballControls=v.ArcballControls,exports.TransformControls=g.TransformControls,exports.PointerLockControls=A.PointerLockControls,exports.FirstPersonControls=L.FirstPersonControls,exports.PivotControls=k.PivotControls,exports.calculateScaleFactor=k.calculateScaleFactor,exports.GizmoHelper=D.GizmoHelper,exports.useGizmoContext=D.useGizmoContext,exports.GizmoViewcube=E.GizmoViewcube,exports.GizmoViewport=R.GizmoViewport,exports.useCubeTexture=w.useCubeTexture,exports.useFBX=F.useFBX,exports.useGLTF=G.useGLTF,exports.useKTX2=z.useKTX2,exports.useProgress=O.useProgress,exports.IsObject=I.IsObject,exports.useTexture=I.useTexture,exports.useVideoTexture=V.useVideoTexture,exports.Stats=y.Stats,exports.useDepthBuffer=H.useDepthBuffer,exports.useAspect=Q.useAspect,exports.useCamera=X.useCamera,exports.useDetectGPU=K.useDetectGPU,exports.useHelper=W.useHelper,exports.useBVH=N.useBVH,exports.useContextBridge=U.useContextBridge,exports.useAnimations=_.useAnimations,exports.useFBO=J.useFBO,exports.useIntersect=Y.useIntersect,exports.useBoxProjectedEnv=Z.useBoxProjectedEnv,exports.BBAnchor=$.BBAnchor,exports.CurveModifier=ee.CurveModifier,exports.MeshDistortMaterial=re.MeshDistortMaterial,exports.MeshWobbleMaterial=se.MeshWobbleMaterial,exports.MeshReflectorMaterial=te.MeshReflectorMaterial,exports.MeshRefractionMaterial=oe.MeshRefractionMaterial,exports.PointMaterial=ie.PointMaterial,exports.PointMaterialImpl=ie.PointMaterialImpl,exports.shaderMaterial=ue.shaderMaterial,exports.softShadows=ae.softShadows,exports.Box=ce.Box,exports.Capsule=ce.Capsule,exports.Circle=ce.Circle,exports.Cone=ce.Cone,exports.Cylinder=ce.Cylinder,exports.Dodecahedron=ce.Dodecahedron,exports.Extrude=ce.Extrude,exports.Icosahedron=ce.Icosahedron,exports.Lathe=ce.Lathe,exports.Octahedron=ce.Octahedron,exports.Plane=ce.Plane,exports.Polyhedron=ce.Polyhedron,exports.Ring=ce.Ring,exports.Sphere=ce.Sphere,exports.Tetrahedron=ce.Tetrahedron,exports.Torus=ce.Torus,exports.TorusKnot=ce.TorusKnot,exports.Tube=ce.Tube,exports.RoundedBox=ne.RoundedBox,exports.ScreenQuad=je.ScreenQuad,exports.Center=pe.Center,exports.Bounds=le.Bounds,exports.useBounds=le.useBounds,exports.CameraShake=xe.CameraShake,exports.Float=qe.Float,exports.Stage=de.Stage,exports.Backdrop=me.Backdrop,exports.Shadow=Ce.Shadow,exports.ContactShadows=he.ContactShadows,exports.AccumulativeShadows=Me.AccumulativeShadows,exports.RandomizedLight=Me.RandomizedLight,exports.accumulativeContext=Me.accumulativeContext,exports.Reflector=Se.Reflector,exports.SpotLight=be.SpotLight,exports.Environment=Pe.Environment,exports.EnvironmentCube=Pe.EnvironmentCube,exports.EnvironmentMap=Pe.EnvironmentMap,exports.EnvironmentPortal=Pe.EnvironmentPortal,exports.useEnvironment=Pe.useEnvironment,exports.Lightformer=Be.Lightformer,exports.Sky=fe.Sky,exports.calcPosFromAngles=fe.calcPosFromAngles,exports.Stars=Te.Stars,exports.Cloud=ve.Cloud,exports.Sparkles=ge.Sparkles,exports.useMatcapTexture=Ae.useMatcapTexture,exports.useNormalTexture=Le.useNormalTexture,exports.Point=ke.Point,exports.Points=ke.Points,exports.PointsBuffer=ke.PointsBuffer,exports.Instance=De.Instance,exports.Instances=De.Instances,exports.Merged=De.Merged,exports.Segment=Ee.Segment,exports.SegmentObject=Ee.SegmentObject,exports.Segments=Ee.Segments,exports.Detailed=Re.Detailed,exports.Preload=we.Preload,exports.BakeShadows=Fe.BakeShadows,exports.meshBounds=Ge.meshBounds,exports.AdaptiveDpr=ze.AdaptiveDpr,exports.AdaptiveEvents=Oe.AdaptiveEvents,exports.PerformanceMonitor=Ie.PerformanceMonitor,exports.usePerformanceMonitor=Ie.usePerformanceMonitor,exports.RenderTexture=Ve.RenderTexture,exports.Mask=ye.Mask,exports.useMask=ye.useMask;
package/core/index.js CHANGED
@@ -106,11 +106,11 @@ import 'meshline';
106
106
  import 'lodash.pick';
107
107
  import 'lodash.omit';
108
108
  import './pivotControls/AxisArrow.js';
109
+ import '../web/Html.js';
110
+ import 'react-dom/client';
109
111
  import './pivotControls/context.js';
110
112
  import './pivotControls/PlaneSlider.js';
111
113
  import './pivotControls/AxisRotator.js';
112
- import '../web/Html.js';
113
- import 'react-dom/client';
114
114
  import 'lodash.clamp';
115
115
  import 'zustand';
116
116
  import 'stats.js';
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("./context.cjs.js");function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib");var i=a(e),c=a(t);const l=new c.Vector3,s=new c.Vector3,u=(e,t,r,n)=>{const o=t.dot(t),a=t.dot(e)-t.dot(r),i=t.dot(n);if(0===i)return-a/o;l.copy(n).multiplyScalar(o/i).sub(t),s.copy(n).multiplyScalar(a/i).add(r).sub(e);return-l.dot(s)/l.dot(l)},p=new c.Vector3(0,1,0),d=new c.Matrix4;exports.AxisArrow=({direction:e,axis:t})=>{const{depthTest:a,scale:l,lineWidth:s,fixed:m,axisColors:f,hoveredColor:y,opacity:g,onDragStart:x,onDrag:h,onDragEnd:b,userData:O}=i.useContext(o.context),P=r.useThree((e=>e.controls)),j=i.useRef(null),w=i.useRef(null),[E,k]=i.useState(!1),C=i.useCallback((t=>{t.stopPropagation();const r=(new c.Matrix4).extractRotation(j.current.matrixWorld),n=t.point.clone(),o=e.clone().applyMatrix4(r).normalize();w.current={clickPoint:n,dir:o},x(),P&&(P.enabled=!1),t.target.setPointerCapture(t.pointerId)}),[e,P,x]),M=i.useCallback((e=>{if(e.stopPropagation(),E||k(!0),w.current){const{clickPoint:t,dir:r}=w.current,n=u(t,r,e.ray.origin,e.ray.direction);d.makeTranslation(r.x*n,r.y*n,r.z*n),h(d)}}),[h,E]),v=i.useCallback((e=>{e.stopPropagation(),w.current=null,b(),P&&(P.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[P,b]),L=i.useCallback((e=>{e.stopPropagation(),k(!1)}),[]),{cylinderLength:q,coneWidth:D,coneLength:T,matrixL:W}=i.useMemo((()=>{const t=m?s/l*1.6:l/20,r=m?.2:l/5,n=m?1-r:l-r,o=(new c.Quaternion).setFromUnitVectors(p,e.clone().normalize());return{cylinderLength:n,coneWidth:t,coneLength:r,matrixL:(new c.Matrix4).makeRotationFromQuaternion(o)}}),[e,l,s,m]),z=E?y:f[t];return i.createElement("group",{ref:j},i.createElement("group",{matrix:W,matrixAutoUpdate:!1,onPointerDown:C,onPointerMove:M,onPointerUp:v,onPointerOut:L},i.createElement("mesh",{visible:!1,position:[0,(q+T)/2,0],userData:O},i.createElement("cylinderGeometry",{args:[1.4*D,1.4*D,q+T,8,1]})),i.createElement(n.Line,{transparent:!0,raycast:()=>null,depthTest:a,points:[0,0,0,0,q,0],lineWidth:s,color:z,opacity:g,polygonOffset:!0,renderOrder:1,polygonOffsetFactor:-10}),i.createElement("mesh",{raycast:()=>null,position:[0,q+T/2,0],renderOrder:500},i.createElement("coneGeometry",{args:[D,T,24,1]}),i.createElement("meshBasicMaterial",{transparent:!0,depthTest:a,color:z,opacity:g,polygonOffset:!0,polygonOffsetFactor:-10}))))},exports.calculateOffset=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("../../web/Html.cjs.js"),a=require("./context.cjs.js");function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib"),require("react-dom/client");var c=i(e),l=i(t);const s=new l.Vector3,u=new l.Vector3,d=(e,t,r,n)=>{const o=t.dot(t),a=t.dot(e)-t.dot(r),i=t.dot(n);if(0===i)return-a/o;s.copy(n).multiplyScalar(o/i).sub(t),u.copy(n).multiplyScalar(a/i).add(r).sub(e);return-s.dot(u)/s.dot(s)},p=new l.Vector3(0,1,0),m=new l.Matrix4;exports.AxisArrow=({direction:e,axis:t})=>{const{translation:i,translationLimits:s,annotationsClass:u,depthTest:y,scale:f,lineWidth:x,fixed:g,axisColors:h,hoveredColor:b,displayValues:O,opacity:P,onDragStart:v,onDrag:w,onDragEnd:j,userData:E}=c.useContext(a.context),k=r.useThree((e=>e.controls)),M=c.useRef(null),C=c.useRef(null),q=c.useRef(null),L=c.useRef(0),[D,R]=c.useState(!1),T=c.useCallback((r=>{O&&(M.current.innerText=`${i.current[t].toFixed(2)}`,M.current.style.display="block"),r.stopPropagation();const n=(new l.Matrix4).extractRotation(C.current.matrixWorld),o=r.point.clone(),a=e.clone().applyMatrix4(n).normalize();q.current={clickPoint:o,dir:a},L.current=i.current[t],v(),k&&(k.enabled=!1),r.target.setPointerCapture(r.pointerId)}),[e,k,v,i,t]),F=c.useCallback((e=>{if(e.stopPropagation(),D||R(!0),q.current){const{clickPoint:r,dir:n}=q.current,[o,a]=(null==s?void 0:s[t])||[void 0,void 0];let c=d(r,n,e.ray.origin,e.ray.direction);void 0!==o&&(c=Math.max(c,o-L.current)),void 0!==a&&(c=Math.min(c,a-L.current)),i.current[t]=L.current+c,O&&(M.current.innerText=`${i.current[t].toFixed(2)}`),m.makeTranslation(n.x*c,n.y*c,n.z*c),w(m)}}),[w,D,i,s,t]),S=c.useCallback((e=>{O&&(M.current.style.display="none"),e.stopPropagation(),q.current=null,j(),k&&(k.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[k,j]),V=c.useCallback((e=>{e.stopPropagation(),R(!1)}),[]),{cylinderLength:W,coneWidth:z,coneLength:_,matrixL:A}=c.useMemo((()=>{const t=g?x/f*1.6:f/20,r=g?.2:f/5,n=g?1-r:f-r,o=(new l.Quaternion).setFromUnitVectors(p,e.clone().normalize());return{cylinderLength:n,coneWidth:t,coneLength:r,matrixL:(new l.Matrix4).makeRotationFromQuaternion(o)}}),[e,f,x,g]),U=D?b:h[t];return c.createElement("group",{ref:C},c.createElement("group",{matrix:A,matrixAutoUpdate:!1,onPointerDown:T,onPointerMove:F,onPointerUp:S,onPointerOut:V},c.createElement(o.Html,{position:[0,-_,0]},c.createElement("div",{style:{display:"none",background:"#151520",color:"white",padding:"6px 8px",borderRadius:7,whiteSpace:"nowrap"},className:u,ref:M})),c.createElement("mesh",{visible:!1,position:[0,(W+_)/2,0],userData:E},c.createElement("cylinderGeometry",{args:[1.4*z,1.4*z,W+_,8,1]})),c.createElement(n.Line,{transparent:!0,raycast:()=>null,depthTest:y,points:[0,0,0,0,W,0],lineWidth:x,color:U,opacity:P,polygonOffset:!0,renderOrder:1,polygonOffsetFactor:-10}),c.createElement("mesh",{raycast:()=>null,position:[0,W+_/2,0],renderOrder:500},c.createElement("coneGeometry",{args:[z,_,24,1]}),c.createElement("meshBasicMaterial",{transparent:!0,depthTest:y,color:U,opacity:P,polygonOffset:!0,polygonOffsetFactor:-10}))))},exports.calculateOffset=d;
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import * as THREE from 'three';
3
3
  import { useThree } from '@react-three/fiber';
4
4
  import { Line } from '../Line.js';
5
+ import { Html } from '../../web/Html.js';
5
6
  import { context } from './context.js';
6
7
 
7
8
  const vec1 = new THREE.Vector3();
@@ -27,12 +28,16 @@ const AxisArrow = ({
27
28
  axis
28
29
  }) => {
29
30
  const {
31
+ translation,
32
+ translationLimits,
33
+ annotationsClass,
30
34
  depthTest,
31
35
  scale,
32
36
  lineWidth,
33
37
  fixed,
34
38
  axisColors,
35
39
  hoveredColor,
40
+ displayValues,
36
41
  opacity,
37
42
  onDragStart,
38
43
  onDrag,
@@ -41,10 +46,17 @@ const AxisArrow = ({
41
46
  } = React.useContext(context); // @ts-expect-error new in @react-three/fiber@7.0.5
42
47
 
43
48
  const camControls = useThree(state => state.controls);
49
+ const divRef = React.useRef(null);
44
50
  const objRef = React.useRef(null);
45
51
  const clickInfo = React.useRef(null);
52
+ const offset0 = React.useRef(0);
46
53
  const [isHovered, setIsHovered] = React.useState(false);
47
54
  const onPointerDown = React.useCallback(e => {
55
+ if (displayValues) {
56
+ divRef.current.innerText = `${translation.current[axis].toFixed(2)}`;
57
+ divRef.current.style.display = 'block';
58
+ }
59
+
48
60
  e.stopPropagation();
49
61
  const rotation = new THREE.Matrix4().extractRotation(objRef.current.matrixWorld);
50
62
  const clickPoint = e.point.clone();
@@ -53,11 +65,12 @@ const AxisArrow = ({
53
65
  clickPoint,
54
66
  dir
55
67
  };
68
+ offset0.current = translation.current[axis];
56
69
  onDragStart();
57
70
  camControls && (camControls.enabled = false); // @ts-ignore - setPointerCapture is not in the type definition
58
71
 
59
72
  e.target.setPointerCapture(e.pointerId);
60
- }, [direction, camControls, onDragStart]);
73
+ }, [direction, camControls, onDragStart, translation, axis]);
61
74
  const onPointerMove = React.useCallback(e => {
62
75
  e.stopPropagation();
63
76
  if (!isHovered) setIsHovered(true);
@@ -67,12 +80,32 @@ const AxisArrow = ({
67
80
  clickPoint,
68
81
  dir
69
82
  } = clickInfo.current;
70
- const offset = calculateOffset(clickPoint, dir, e.ray.origin, e.ray.direction);
83
+ const [min, max] = (translationLimits == null ? void 0 : translationLimits[axis]) || [undefined, undefined];
84
+ let offset = calculateOffset(clickPoint, dir, e.ray.origin, e.ray.direction);
85
+
86
+ if (min !== undefined) {
87
+ offset = Math.max(offset, min - offset0.current);
88
+ }
89
+
90
+ if (max !== undefined) {
91
+ offset = Math.min(offset, max - offset0.current);
92
+ }
93
+
94
+ translation.current[axis] = offset0.current + offset;
95
+
96
+ if (displayValues) {
97
+ divRef.current.innerText = `${translation.current[axis].toFixed(2)}`;
98
+ }
99
+
71
100
  offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset);
72
101
  onDrag(offsetMatrix);
73
102
  }
74
- }, [onDrag, isHovered]);
103
+ }, [onDrag, isHovered, translation, translationLimits, axis]);
75
104
  const onPointerUp = React.useCallback(e => {
105
+ if (displayValues) {
106
+ divRef.current.style.display = 'none';
107
+ }
108
+
76
109
  e.stopPropagation();
77
110
  clickInfo.current = null;
78
111
  onDragEnd();
@@ -112,7 +145,20 @@ const AxisArrow = ({
112
145
  onPointerMove: onPointerMove,
113
146
  onPointerUp: onPointerUp,
114
147
  onPointerOut: onPointerOut
115
- }, /*#__PURE__*/React.createElement("mesh", {
148
+ }, /*#__PURE__*/React.createElement(Html, {
149
+ position: [0, -coneLength, 0]
150
+ }, /*#__PURE__*/React.createElement("div", {
151
+ style: {
152
+ display: 'none',
153
+ background: '#151520',
154
+ color: 'white',
155
+ padding: '6px 8px',
156
+ borderRadius: 7,
157
+ whiteSpace: 'nowrap'
158
+ },
159
+ className: annotationsClass,
160
+ ref: divRef
161
+ })), /*#__PURE__*/React.createElement("mesh", {
116
162
  visible: false,
117
163
  position: [0, (cylinderLength + coneLength) / 2.0, 0],
118
164
  userData: userData
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("../../web/Html.cjs.js"),a=require("lodash.clamp"),i=require("./context.cjs.js");function l(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function c(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib"),require("react-dom/client");var s=c(e),u=c(t),d=l(a);const p=new u.Vector3,m=new u.Vector3,f=e=>180*e/Math.PI,h=e=>{let t=((e,t)=>{let r=Math.floor(e/t);return r=r<0?r+1:r,e-r*t})(e,2*Math.PI);return Math.abs(t)<1e-6?0:(t<0&&(t+=2*Math.PI),t)},x=new u.Matrix4,P=new u.Vector3,b=new u.Ray,M=new u.Vector3;exports.AxisRotator=({dir1:e,dir2:t,axis:a})=>{const{rotationLimits:l,annotationsClass:c,depthTest:y,scale:g,lineWidth:w,fixed:v,axisColors:C,hoveredColor:j,opacity:k,onDragStart:q,onDrag:O,onDragEnd:I,userData:R}=s.useContext(i.context),V=r.useThree((e=>e.controls)),F=s.useRef(null),D=s.useRef(null),E=s.useRef(0),W=s.useRef(0),z=s.useRef(null),[T,A]=s.useState(!1),L=s.useCallback((e=>{F.current.innerText=`${f(W.current).toFixed(0)}º`,F.current.style.display="block",e.stopPropagation();const t=e.point.clone(),r=(new u.Vector3).setFromMatrixPosition(D.current.matrixWorld),n=(new u.Vector3).setFromMatrixColumn(D.current.matrixWorld,0).normalize(),o=(new u.Vector3).setFromMatrixColumn(D.current.matrixWorld,1).normalize(),a=(new u.Vector3).setFromMatrixColumn(D.current.matrixWorld,2).normalize(),i=(new u.Plane).setFromNormalAndCoplanarPoint(a,r);z.current={clickPoint:t,origin:r,e1:n,e2:o,normal:a,plane:i},q(),V&&(V.enabled=!1),e.target.setPointerCapture(e.pointerId)}),[V,q]),_=s.useCallback((e=>{if(e.stopPropagation(),T||A(!0),z.current){const{clickPoint:t,origin:r,e1:n,e2:o,normal:i,plane:c}=z.current,[s,u]=(null==l?void 0:l[a])||[void 0,void 0];b.copy(e.ray),b.intersectPlane(c,M),b.direction.negate(),b.intersectPlane(c,M);let y=((e,t,r,n,o)=>{p.copy(e).sub(r),m.copy(t).sub(r);const a=n.dot(n),i=o.dot(o),l=p.dot(n)/a,c=p.dot(o)/i,s=m.dot(n)/a,u=m.dot(o)/i,d=Math.atan2(c,l);return Math.atan2(u,s)-d})(t,M,r,n,o),g=f(y);e.shiftKey&&(g=10*Math.round(g/10),y=(e=>e*Math.PI/180)(g)),void 0!==s&&void 0!==u&&(y=h(y),y=y>Math.PI?y-2*Math.PI:y,y=d.default(y,s-E.current,u-E.current),W.current=E.current+y,g=f(W.current)),F.current.innerText=`${g.toFixed(0)} º`,x.makeRotationAxis(i,y),P.copy(r).applyMatrix4(x).sub(r).negate(),x.setPosition(P),O(x)}}),[O,T,l,a]),S=s.useCallback((e=>{F.current.style.display="none",e.stopPropagation(),E.current=W.current,z.current=null,I(),V&&(V.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[V,I]),H=s.useCallback((e=>{e.stopPropagation(),A(!1)}),[]),N=s.useMemo((()=>{const r=e.clone().normalize(),n=t.clone().normalize();return(new u.Matrix4).makeBasis(r,n,r.clone().cross(n))}),[e,t]),U=v?.65:.65*g,$=s.useMemo((()=>{const e=[];for(let t=0;t<=32;t++){const r=t*(Math.PI/2)/32;e.push(new u.Vector3(Math.cos(r)*U,Math.sin(r)*U,0))}return e}),[U]);return s.createElement("group",{ref:D,onPointerDown:L,onPointerMove:_,onPointerUp:S,onPointerOut:H,matrix:N,matrixAutoUpdate:!1},s.createElement(o.Html,{position:[U,U,0]},s.createElement("div",{style:{display:"none",background:"#151520",color:"white",padding:"6px 8px",borderRadius:7,whiteSpace:"nowrap"},className:c,ref:F})),s.createElement(n.Line,{points:$,lineWidth:4*w,visible:!1,userData:R}),s.createElement(n.Line,{transparent:!0,raycast:()=>null,depthTest:y,points:$,lineWidth:w,color:T?j:C[a],opacity:k,polygonOffset:!0,polygonOffsetFactor:-10}))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("../../web/Html.cjs.js"),a=require("lodash.clamp"),i=require("./context.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function l(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib"),require("react-dom/client");var s=l(e),u=l(t),d=c(a);const p=new u.Vector3,m=new u.Vector3,h=e=>180*e/Math.PI,f=e=>{let t=((e,t)=>{let r=Math.floor(e/t);return r=r<0?r+1:r,e-r*t})(e,2*Math.PI);return Math.abs(t)<1e-6?0:(t<0&&(t+=2*Math.PI),t)},P=new u.Matrix4,x=new u.Vector3,M=new u.Ray,b=new u.Vector3;exports.AxisRotator=({dir1:e,dir2:t,axis:a})=>{const{rotationLimits:c,annotationsClass:l,depthTest:y,scale:g,lineWidth:w,fixed:v,axisColors:C,hoveredColor:j,displayValues:I,opacity:k,onDragStart:q,onDrag:O,onDragEnd:V,userData:R}=s.useContext(i.context),F=r.useThree((e=>e.controls)),D=s.useRef(null),E=s.useRef(null),W=s.useRef(0),z=s.useRef(0),T=s.useRef(null),[A,L]=s.useState(!1),_=s.useCallback((e=>{I&&(D.current.innerText=`${h(z.current).toFixed(0)}º`,D.current.style.display="block"),e.stopPropagation();const t=e.point.clone(),r=(new u.Vector3).setFromMatrixPosition(E.current.matrixWorld),n=(new u.Vector3).setFromMatrixColumn(E.current.matrixWorld,0).normalize(),o=(new u.Vector3).setFromMatrixColumn(E.current.matrixWorld,1).normalize(),a=(new u.Vector3).setFromMatrixColumn(E.current.matrixWorld,2).normalize(),i=(new u.Plane).setFromNormalAndCoplanarPoint(a,r);T.current={clickPoint:t,origin:r,e1:n,e2:o,normal:a,plane:i},q(),F&&(F.enabled=!1),e.target.setPointerCapture(e.pointerId)}),[F,q]),S=s.useCallback((e=>{if(e.stopPropagation(),A||L(!0),T.current){const{clickPoint:t,origin:r,e1:n,e2:o,normal:i,plane:l}=T.current,[s,u]=(null==c?void 0:c[a])||[void 0,void 0];M.copy(e.ray),M.intersectPlane(l,b),M.direction.negate(),M.intersectPlane(l,b);let y=((e,t,r,n,o)=>{p.copy(e).sub(r),m.copy(t).sub(r);const a=n.dot(n),i=o.dot(o),c=p.dot(n)/a,l=p.dot(o)/i,s=m.dot(n)/a,u=m.dot(o)/i,d=Math.atan2(l,c);return Math.atan2(u,s)-d})(t,b,r,n,o),g=h(y);e.shiftKey&&(g=10*Math.round(g/10),y=(e=>e*Math.PI/180)(g)),void 0!==s&&void 0!==u&&u-s<2*Math.PI?(y=f(y),y=y>Math.PI?y-2*Math.PI:y,y=d.default(y,s-W.current,u-W.current),z.current=W.current+y):(z.current=f(W.current+y),z.current=z.current>Math.PI?z.current-2*Math.PI:z.current),I&&(g=h(z.current),D.current.innerText=`${g.toFixed(0)}º`),P.makeRotationAxis(i,y),x.copy(r).applyMatrix4(P).sub(r).negate(),P.setPosition(x),O(P)}}),[O,A,c,a]),H=s.useCallback((e=>{I&&(D.current.style.display="none"),e.stopPropagation(),W.current=z.current,T.current=null,V(),F&&(F.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[F,V]),N=s.useCallback((e=>{e.stopPropagation(),L(!1)}),[]),U=s.useMemo((()=>{const r=e.clone().normalize(),n=t.clone().normalize();return(new u.Matrix4).makeBasis(r,n,r.clone().cross(n))}),[e,t]),$=v?.65:.65*g,B=s.useMemo((()=>{const e=[];for(let t=0;t<=32;t++){const r=t*(Math.PI/2)/32;e.push(new u.Vector3(Math.cos(r)*$,Math.sin(r)*$,0))}return e}),[$]);return s.createElement("group",{ref:E,onPointerDown:_,onPointerMove:S,onPointerUp:H,onPointerOut:N,matrix:U,matrixAutoUpdate:!1},s.createElement(o.Html,{position:[$,$,0]},s.createElement("div",{style:{display:"none",background:"#151520",color:"white",padding:"6px 8px",borderRadius:7,whiteSpace:"nowrap"},className:l,ref:D})),s.createElement(n.Line,{points:B,lineWidth:4*w,visible:!1,userData:R}),s.createElement(n.Line,{transparent:!0,raycast:()=>null,depthTest:y,points:B,lineWidth:w,color:A?j:C[a],opacity:k,polygonOffset:!0,polygonOffsetFactor:-10}))};
@@ -65,6 +65,7 @@ const AxisRotator = ({
65
65
  fixed,
66
66
  axisColors,
67
67
  hoveredColor,
68
+ displayValues,
68
69
  opacity,
69
70
  onDragStart,
70
71
  onDrag,
@@ -80,8 +81,11 @@ const AxisRotator = ({
80
81
  const clickInfo = React.useRef(null);
81
82
  const [isHovered, setIsHovered] = React.useState(false);
82
83
  const onPointerDown = React.useCallback(e => {
83
- divRef.current.innerText = `${toDegrees(angle.current).toFixed(0)}º`;
84
- divRef.current.style.display = 'block';
84
+ if (displayValues) {
85
+ divRef.current.innerText = `${toDegrees(angle.current).toFixed(0)}º`;
86
+ divRef.current.style.display = 'block';
87
+ }
88
+
85
89
  e.stopPropagation();
86
90
  const clickPoint = e.point.clone();
87
91
  const origin = new THREE.Vector3().setFromMatrixPosition(objRef.current.matrixWorld);
@@ -128,15 +132,21 @@ const AxisRotator = ({
128
132
  deltaAngle = toRadians(degrees);
129
133
  }
130
134
 
131
- if (min !== undefined && max !== undefined) {
135
+ if (min !== undefined && max !== undefined && max - min < 2 * Math.PI) {
132
136
  deltaAngle = minimizeAngle(deltaAngle);
133
137
  deltaAngle = deltaAngle > Math.PI ? deltaAngle - 2 * Math.PI : deltaAngle;
134
138
  deltaAngle = clamp(deltaAngle, min - angle0.current, max - angle0.current);
135
139
  angle.current = angle0.current + deltaAngle;
140
+ } else {
141
+ angle.current = minimizeAngle(angle0.current + deltaAngle);
142
+ angle.current = angle.current > Math.PI ? angle.current - 2 * Math.PI : angle.current;
143
+ }
144
+
145
+ if (displayValues) {
136
146
  degrees = toDegrees(angle.current);
147
+ divRef.current.innerText = `${degrees.toFixed(0)}º`;
137
148
  }
138
149
 
139
- divRef.current.innerText = `${degrees.toFixed(0)} º`;
140
150
  rotMatrix.makeRotationAxis(normal, deltaAngle);
141
151
  posNew.copy(origin).applyMatrix4(rotMatrix).sub(origin).negate();
142
152
  rotMatrix.setPosition(posNew);
@@ -144,7 +154,10 @@ const AxisRotator = ({
144
154
  }
145
155
  }, [onDrag, isHovered, rotationLimits, axis]);
146
156
  const onPointerUp = React.useCallback(e => {
147
- divRef.current.style.display = 'none';
157
+ if (displayValues) {
158
+ divRef.current.style.display = 'none';
159
+ }
160
+
148
161
  e.stopPropagation();
149
162
  angle0.current = angle.current;
150
163
  clickInfo.current = null;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("./context.cjs.js");function a(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib");var i=a(e),l=a(t);const s=new l.Ray,c=new l.Vector3,u=new l.Matrix4;exports.PlaneSlider=({dir1:e,dir2:t,axis:a})=>{const{depthTest:p,scale:d,lineWidth:m,fixed:f,axisColors:P,hoveredColor:b,opacity:g,onDragStart:x,onDrag:y,onDragEnd:h,userData:w}=i.useContext(o.context),O=r.useThree((e=>e.controls)),C=i.useRef(null),j=i.useRef(null),[M,k]=i.useState(!1),D=i.useCallback((e=>{e.stopPropagation();const t=e.point.clone(),r=(new l.Vector3).setFromMatrixPosition(C.current.matrixWorld),n=(new l.Vector3).setFromMatrixColumn(C.current.matrixWorld,2).normalize(),o=(new l.Plane).setFromNormalAndCoplanarPoint(n,r);j.current={clickPoint:t,plane:o},x(),O&&(O.enabled=!1),e.target.setPointerCapture(e.pointerId)}),[O,x]),v=i.useCallback((e=>{if(e.stopPropagation(),M||k(!0),j.current){const{clickPoint:t,plane:r}=j.current;s.copy(e.ray),s.intersectPlane(r,c),s.direction.negate(),s.intersectPlane(r,c),c.sub(t),u.makeTranslation(c.x,c.y,c.z),y(u)}}),[y,M]),E=i.useCallback((e=>{e.stopPropagation(),j.current=null,h(),O&&(O.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[O,h]),V=i.useCallback((e=>{e.stopPropagation(),k(!1)}),[]),q=i.useMemo((()=>{const r=e.clone().normalize(),n=t.clone().normalize();return(new l.Matrix4).makeBasis(r,n,r.clone().cross(n))}),[e,t]),z=f?1/7:d/7,F=f?.225:.225*d,T=M?b:P[a],S=i.useMemo((()=>[new l.Vector3(0,0,0),new l.Vector3(0,F,0),new l.Vector3(F,F,0),new l.Vector3(F,0,0),new l.Vector3(0,0,0)]),[F]);return i.createElement("group",{ref:C,matrix:q,matrixAutoUpdate:!1},i.createElement("group",{position:[1.7*z,1.7*z,0]},i.createElement("mesh",{visible:!0,onPointerDown:D,onPointerMove:v,onPointerUp:E,onPointerOut:V,scale:F,userData:w},i.createElement("planeGeometry",null),i.createElement("meshBasicMaterial",{transparent:!0,depthTest:p,color:T,polygonOffset:!0,polygonOffsetFactor:-10,side:l.DoubleSide})),i.createElement(n.Line,{position:[-F/2,-F/2,0],transparent:!0,depthTest:p,points:S,lineWidth:m,color:T,opacity:g,polygonOffset:!0,polygonOffsetFactor:-10,userData:w})))};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),n=require("../Line.cjs.js"),o=require("../../web/Html.cjs.js"),a=require("./context.cjs.js");function i(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}require("@babel/runtime/helpers/extends"),require("three-stdlib"),require("react-dom/client");var s=i(e),l=i(t);const c=new l.Ray,u=new l.Vector3,p=new l.Matrix4;exports.PlaneSlider=({dir1:e,dir2:t,axis:i})=>{const{translation:d,translationLimits:m,annotationsClass:x,depthTest:b,scale:h,lineWidth:f,fixed:g,axisColors:y,hoveredColor:M,displayValues:C,opacity:P,onDragStart:w,onDrag:v,onDragEnd:j,userData:O}=s.useContext(a.context),k=r.useThree((e=>e.controls)),F=s.useRef(null),V=s.useRef(null),z=s.useRef(null),E=s.useRef(0),q=s.useRef(0),[D,R]=s.useState(!1),T=s.useCallback((e=>{C&&(F.current.innerText=`${d.current[(i+1)%3].toFixed(2)}, ${d.current[(i+2)%3].toFixed(2)}`,F.current.style.display="block"),e.stopPropagation();const t=e.point.clone(),r=(new l.Vector3).setFromMatrixPosition(V.current.matrixWorld),n=(new l.Vector3).setFromMatrixColumn(V.current.matrixWorld,0).normalize(),o=(new l.Vector3).setFromMatrixColumn(V.current.matrixWorld,1).normalize(),a=(new l.Vector3).setFromMatrixColumn(V.current.matrixWorld,2).normalize(),s=(new l.Plane).setFromNormalAndCoplanarPoint(a,r);z.current={clickPoint:t,e1:n,e2:o,plane:s},E.current=d.current[(i+1)%3],q.current=d.current[(i+2)%3],w(),k&&(k.enabled=!1),e.target.setPointerCapture(e.pointerId)}),[k,w]),W=s.useCallback((e=>{if(e.stopPropagation(),D||R(!0),z.current){const{clickPoint:t,e1:r,e2:n,plane:o}=z.current,[a,s]=(null==m?void 0:m[(i+1)%3])||[void 0,void 0],[l,x]=(null==m?void 0:m[(i+2)%3])||[void 0,void 0];c.copy(e.ray),c.intersectPlane(o,u),c.direction.negate(),c.intersectPlane(o,u),u.sub(t);let[b,h]=((e,t,r)=>{const n=Math.abs(e.x)>=Math.abs(e.y)&&Math.abs(e.x)>=Math.abs(e.z)?0:Math.abs(e.y)>=Math.abs(e.x)&&Math.abs(e.y)>=Math.abs(e.z)?1:2,o=[0,1,2].sort(((e,r)=>Math.abs(t.getComponent(r))-Math.abs(t.getComponent(e)))),a=n===o[0]?o[1]:o[0],i=e.getComponent(n),s=e.getComponent(a),l=t.getComponent(n),c=t.getComponent(a),u=r.getComponent(n),p=(r.getComponent(a)-u*(s/i))/(c-l*(s/i));return[(u-p*l)/i,p]})(r,n,u);void 0!==a&&(b=Math.max(b,a-E.current)),void 0!==s&&(b=Math.min(b,s-E.current)),void 0!==l&&(h=Math.max(h,l-q.current)),void 0!==x&&(h=Math.min(h,x-q.current)),d.current[(i+1)%3]=E.current+b,d.current[(i+2)%3]=q.current+h,C&&(F.current.innerText=`${d.current[(i+1)%3].toFixed(2)}, ${d.current[(i+2)%3].toFixed(2)}`),p.makeTranslation(b*r.x+h*n.x,b*r.y+h*n.y,b*r.z+h*n.z),v(p)}}),[v,D,d,m,i]),S=s.useCallback((e=>{C&&(F.current.style.display="none"),e.stopPropagation(),z.current=null,j(),k&&(k.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[k,j]),$=s.useCallback((e=>{e.stopPropagation(),R(!1)}),[]),_=s.useMemo((()=>{const r=e.clone().normalize(),n=t.clone().normalize();return(new l.Matrix4).makeBasis(r,n,r.clone().cross(n))}),[e,t]),L=g?1/7:h/7,A=g?.225:.225*h,B=D?M:y[i],H=s.useMemo((()=>[new l.Vector3(0,0,0),new l.Vector3(0,A,0),new l.Vector3(A,A,0),new l.Vector3(A,0,0),new l.Vector3(0,0,0)]),[A]);return s.createElement("group",{ref:V,matrix:_,matrixAutoUpdate:!1},s.createElement(o.Html,{position:[0,0,0]},s.createElement("div",{style:{display:"none",background:"#151520",color:"white",padding:"6px 8px",borderRadius:7,whiteSpace:"nowrap"},className:x,ref:F})),s.createElement("group",{position:[1.7*L,1.7*L,0]},s.createElement("mesh",{visible:!0,onPointerDown:T,onPointerMove:W,onPointerUp:S,onPointerOut:$,scale:A,userData:O},s.createElement("planeGeometry",null),s.createElement("meshBasicMaterial",{transparent:!0,depthTest:b,color:B,polygonOffset:!0,polygonOffsetFactor:-10,side:l.DoubleSide})),s.createElement(n.Line,{position:[-A/2,-A/2,0],transparent:!0,depthTest:b,points:H,lineWidth:f,color:B,opacity:P,polygonOffset:!0,polygonOffsetFactor:-10,userData:O})))};
@@ -2,8 +2,24 @@ import * as React from 'react';
2
2
  import * as THREE from 'three';
3
3
  import { useThree } from '@react-three/fiber';
4
4
  import { Line } from '../Line.js';
5
+ import { Html } from '../../web/Html.js';
5
6
  import { context } from './context.js';
6
7
 
8
+ const decomposeIntoBasis = (e1, e2, offset) => {
9
+ const i1 = Math.abs(e1.x) >= Math.abs(e1.y) && Math.abs(e1.x) >= Math.abs(e1.z) ? 0 : Math.abs(e1.y) >= Math.abs(e1.x) && Math.abs(e1.y) >= Math.abs(e1.z) ? 1 : 2;
10
+ const e2DegrowthOrder = [0, 1, 2].sort((a, b) => Math.abs(e2.getComponent(b)) - Math.abs(e2.getComponent(a)));
11
+ const i2 = i1 === e2DegrowthOrder[0] ? e2DegrowthOrder[1] : e2DegrowthOrder[0];
12
+ const a1 = e1.getComponent(i1);
13
+ const a2 = e1.getComponent(i2);
14
+ const b1 = e2.getComponent(i1);
15
+ const b2 = e2.getComponent(i2);
16
+ const c1 = offset.getComponent(i1);
17
+ const c2 = offset.getComponent(i2);
18
+ const y = (c2 - c1 * (a2 / a1)) / (b2 - b1 * (a2 / a1));
19
+ const x = (c1 - y * b1) / a1;
20
+ return [x, y];
21
+ };
22
+
7
23
  const ray = new THREE.Ray();
8
24
  const intersection = new THREE.Vector3();
9
25
  const offsetMatrix = new THREE.Matrix4();
@@ -13,12 +29,16 @@ const PlaneSlider = ({
13
29
  axis
14
30
  }) => {
15
31
  const {
32
+ translation,
33
+ translationLimits,
34
+ annotationsClass,
16
35
  depthTest,
17
36
  scale,
18
37
  lineWidth,
19
38
  fixed,
20
39
  axisColors,
21
40
  hoveredColor,
41
+ displayValues,
22
42
  opacity,
23
43
  onDragStart,
24
44
  onDrag,
@@ -27,19 +47,33 @@ const PlaneSlider = ({
27
47
  } = React.useContext(context); // @ts-expect-error new in @react-three/fiber@7.0.5
28
48
 
29
49
  const camControls = useThree(state => state.controls);
50
+ const divRef = React.useRef(null);
30
51
  const objRef = React.useRef(null);
31
52
  const clickInfo = React.useRef(null);
53
+ const offsetX0 = React.useRef(0);
54
+ const offsetY0 = React.useRef(0);
32
55
  const [isHovered, setIsHovered] = React.useState(false);
33
56
  const onPointerDown = React.useCallback(e => {
57
+ if (displayValues) {
58
+ divRef.current.innerText = `${translation.current[(axis + 1) % 3].toFixed(2)}, ${translation.current[(axis + 2) % 3].toFixed(2)}`;
59
+ divRef.current.style.display = 'block';
60
+ }
61
+
34
62
  e.stopPropagation();
35
63
  const clickPoint = e.point.clone();
36
64
  const origin = new THREE.Vector3().setFromMatrixPosition(objRef.current.matrixWorld);
65
+ const e1 = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 0).normalize();
66
+ const e2 = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 1).normalize();
37
67
  const normal = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 2).normalize();
38
68
  const plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, origin);
39
69
  clickInfo.current = {
40
70
  clickPoint,
71
+ e1,
72
+ e2,
41
73
  plane
42
74
  };
75
+ offsetX0.current = translation.current[(axis + 1) % 3];
76
+ offsetY0.current = translation.current[(axis + 2) % 3];
43
77
  onDragStart();
44
78
  camControls && (camControls.enabled = false); // @ts-ignore
45
79
 
@@ -52,18 +86,53 @@ const PlaneSlider = ({
52
86
  if (clickInfo.current) {
53
87
  const {
54
88
  clickPoint,
89
+ e1,
90
+ e2,
55
91
  plane
56
92
  } = clickInfo.current;
93
+ const [minX, maxX] = (translationLimits == null ? void 0 : translationLimits[(axis + 1) % 3]) || [undefined, undefined];
94
+ const [minY, maxY] = (translationLimits == null ? void 0 : translationLimits[(axis + 2) % 3]) || [undefined, undefined];
57
95
  ray.copy(e.ray);
58
96
  ray.intersectPlane(plane, intersection);
59
97
  ray.direction.negate();
60
98
  ray.intersectPlane(plane, intersection);
61
99
  intersection.sub(clickPoint);
62
- offsetMatrix.makeTranslation(intersection.x, intersection.y, intersection.z);
100
+ let [offsetX, offsetY] = decomposeIntoBasis(e1, e2, intersection);
101
+ /* let offsetY = (intersection.y - (intersection.x * e1.y) / e1.x) / (e2.y - (e2.x * e1.y) / e1.x)
102
+ let offsetX = (intersection.x - offsetY * e2.x) / e1.x */
103
+
104
+ if (minX !== undefined) {
105
+ offsetX = Math.max(offsetX, minX - offsetX0.current);
106
+ }
107
+
108
+ if (maxX !== undefined) {
109
+ offsetX = Math.min(offsetX, maxX - offsetX0.current);
110
+ }
111
+
112
+ if (minY !== undefined) {
113
+ offsetY = Math.max(offsetY, minY - offsetY0.current);
114
+ }
115
+
116
+ if (maxY !== undefined) {
117
+ offsetY = Math.min(offsetY, maxY - offsetY0.current);
118
+ }
119
+
120
+ translation.current[(axis + 1) % 3] = offsetX0.current + offsetX;
121
+ translation.current[(axis + 2) % 3] = offsetY0.current + offsetY;
122
+
123
+ if (displayValues) {
124
+ divRef.current.innerText = `${translation.current[(axis + 1) % 3].toFixed(2)}, ${translation.current[(axis + 2) % 3].toFixed(2)}`;
125
+ }
126
+
127
+ offsetMatrix.makeTranslation(offsetX * e1.x + offsetY * e2.x, offsetX * e1.y + offsetY * e2.y, offsetX * e1.z + offsetY * e2.z);
63
128
  onDrag(offsetMatrix);
64
129
  }
65
- }, [onDrag, isHovered]);
130
+ }, [onDrag, isHovered, translation, translationLimits, axis]);
66
131
  const onPointerUp = React.useCallback(e => {
132
+ if (displayValues) {
133
+ divRef.current.style.display = 'none';
134
+ }
135
+
67
136
  e.stopPropagation();
68
137
  clickInfo.current = null;
69
138
  onDragEnd();
@@ -88,7 +157,20 @@ const PlaneSlider = ({
88
157
  ref: objRef,
89
158
  matrix: matrixL,
90
159
  matrixAutoUpdate: false
91
- }, /*#__PURE__*/React.createElement("group", {
160
+ }, /*#__PURE__*/React.createElement(Html, {
161
+ position: [0, 0, 0]
162
+ }, /*#__PURE__*/React.createElement("div", {
163
+ style: {
164
+ display: 'none',
165
+ background: '#151520',
166
+ color: 'white',
167
+ padding: '6px 8px',
168
+ borderRadius: 7,
169
+ whiteSpace: 'nowrap'
170
+ },
171
+ className: annotationsClass,
172
+ ref: divRef
173
+ })), /*#__PURE__*/React.createElement("group", {
92
174
  position: [pos1 * 1.7, pos1 * 1.7, 0]
93
175
  }, /*#__PURE__*/React.createElement("mesh", {
94
176
  visible: true,
@@ -4,6 +4,10 @@ export declare type PivotContext = {
4
4
  onDragStart: () => void;
5
5
  onDrag: (mdW: THREE.Matrix4) => void;
6
6
  onDragEnd: () => void;
7
+ translation: {
8
+ current: [number, number, number];
9
+ };
10
+ translationLimits?: [[number, number] | undefined, [number, number] | undefined, [number, number] | undefined];
7
11
  rotationLimits?: [[number, number] | undefined, [number, number] | undefined, [number, number] | undefined];
8
12
  axisColors: [string | number, string | number, string | number];
9
13
  hoveredColor: string | number;
@@ -11,6 +15,7 @@ export declare type PivotContext = {
11
15
  scale: number;
12
16
  lineWidth: number;
13
17
  fixed: boolean;
18
+ displayValues: boolean;
14
19
  depthTest: boolean;
15
20
  userData?: {
16
21
  [key: string]: any;