@react-three/drei 9.25.3 → 9.26.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 +273 -198
- package/core/CatmullRomLine.cjs.js +1 -1
- package/core/CubicBezierLine.cjs.js +1 -1
- package/core/GizmoViewport.cjs.js +1 -1
- package/core/GizmoViewport.js +1 -1
- package/core/Line.cjs.js +1 -1
- package/core/Line.d.ts +1 -1
- package/core/Line.js +4 -3
- package/core/QuadraticBezierLine.cjs.js +1 -1
- package/core/index.cjs.js +1 -1
- package/core/index.d.ts +1 -0
- package/core/index.js +7 -0
- package/core/pivotControls/AxisArrow.cjs.js +1 -0
- package/core/pivotControls/AxisArrow.d.ts +7 -0
- package/core/pivotControls/AxisArrow.js +137 -0
- package/core/pivotControls/AxisRotator.cjs.js +1 -0
- package/core/pivotControls/AxisRotator.d.ts +7 -0
- package/core/pivotControls/AxisRotator.js +177 -0
- package/core/pivotControls/PlaneSlider.cjs.js +1 -0
- package/core/pivotControls/PlaneSlider.d.ts +7 -0
- package/core/pivotControls/PlaneSlider.js +122 -0
- package/core/pivotControls/context.cjs.js +1 -0
- package/core/pivotControls/context.d.ts +19 -0
- package/core/pivotControls/context.js +5 -0
- package/core/pivotControls/index.cjs.js +1 -0
- package/core/pivotControls/index.d.ts +30 -0
- package/core/pivotControls/index.js +201 -0
- package/index.cjs.js +1 -1
- package/index.js +1 -0
- package/native/index.cjs.js +1 -1
- package/native/index.js +7 -0
- package/package.json +1 -1
- package/web/index.cjs.js +1 -1
- package/web/index.js +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),r=require("react"),t=require("three"),n=require("./Line.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function i(e){if(e&&e.__esModule)return e;var r=Object.create(null);return e&&Object.keys(e).forEach((function(t){if("default"!==t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})}})),r.default=e,Object.freeze(r)}require("@react-three/fiber"),require("three-stdlib");var o=c(e),u=i(r);const s=u.forwardRef((function({start:e,end:r,midA:c,midB:i,segments:s=20,...f},a){const d=u.useMemo((()=>{const n=e instanceof t.Vector3?e:new t.Vector3(...e),o=r instanceof t.Vector3?r:new t.Vector3(...r),u=c instanceof t.Vector3?c:new t.Vector3(...c),f=i instanceof t.Vector3?i:new t.Vector3(...i);return new t.CubicBezierCurve3(n,u,f,o).getPoints(s)}),[e,r,c,i,s]);return u.createElement(n.Line,o.default({ref:a,points:d},f))}));exports.CubicBezierLine=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),a=require("@react-three/fiber"),r=require("three"),o=require("./GizmoHelper.cjs.js");function n(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(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}})),t.default=e,Object.freeze(t)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var i=n(e),c=l(t);function s({scale:e=[.8,.05,.05],color:t,rotation:a}){return c.createElement("group",{rotation:a},c.createElement("mesh",{position:[.4,0,0]},c.createElement("boxGeometry",{args:e}),c.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function u({onClick:e,font:t,disabled:o,arcStyle:n,label:l,labelColor:s,axisHeadScale:u=1,...p}){const
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),a=require("@react-three/fiber"),r=require("three"),o=require("./GizmoHelper.cjs.js");function n(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(a){if("default"!==a){var r=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(t,a,r.get?r:{enumerable:!0,get:function(){return e[a]}})}})),t.default=e,Object.freeze(t)}require("./OrthographicCamera.cjs.js"),require("react-merge-refs"),require("./useCamera.cjs.js");var i=n(e),c=l(t);function s({scale:e=[.8,.05,.05],color:t,rotation:a}){return c.createElement("group",{rotation:a},c.createElement("mesh",{position:[.4,0,0]},c.createElement("boxGeometry",{args:e}),c.createElement("meshBasicMaterial",{color:t,toneMapped:!1})))}function u({onClick:e,font:t,disabled:o,arcStyle:n,label:l,labelColor:s,axisHeadScale:u=1,...p}){const f=a.useThree((e=>e.gl)),m=c.useMemo((()=>{const e=document.createElement("canvas");e.width=64,e.height=64;const a=e.getContext("2d");return a.beginPath(),a.arc(32,32,16,0,2*Math.PI),a.closePath(),a.fillStyle=n,a.fill(),l&&(a.font=t,a.textAlign="center",a.fillStyle=s,a.fillText(l,32,41)),new r.CanvasTexture(e)}),[n,l,s,t]),[d,b]=c.useState(!1),g=(l?1:.75)*(d?1.2:1)*u;return c.createElement("sprite",i.default({scale:g,onPointerOver:o?void 0:e=>{e.stopPropagation(),b(!0)},onPointerOut:o?void 0:e||(e=>{e.stopPropagation(),b(!1)})},p),c.createElement("spriteMaterial",{map:m,"map-encoding":f.outputEncoding,"map-anisotropy":f.capabilities.getMaxAnisotropy()||1,alphaTest:.3,opacity:l?1:.75,toneMapped:!1}))}exports.GizmoViewport=({hideNegativeAxes:e,hideAxisHeads:t,disabled:a,font:r="18px Inter var, Arial, sans-serif",axisColors:n=["#ff2060","#20df80","#2080ff"],axisHeadScale:l=1,axisScale:p,labels:f=["X","Y","Z"],labelColor:m="#000",onClick:d,...b})=>{const[g,E,h]=n,{tweenCamera:y,raycast:x}=o.useGizmoContext(),j={font:r,disabled:a,labelColor:m,raycast:x,onClick:d,axisHeadScale:l,onPointerDown:a?void 0:e=>{y(e.object.position),e.stopPropagation()}};return c.createElement("group",i.default({scale:40},b),c.createElement(s,{color:g,rotation:[0,0,0],scale:p}),c.createElement(s,{color:E,rotation:[0,0,Math.PI/2],scale:p}),c.createElement(s,{color:h,rotation:[0,-Math.PI/2,0],scale:p}),!t&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[1,0,0],label:f[0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,1,0],label:f[1]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,1],label:f[2]},j)),!e&&c.createElement(c.Fragment,null,c.createElement(u,i.default({arcStyle:g,position:[-1,0,0]},j)),c.createElement(u,i.default({arcStyle:E,position:[0,-1,0]},j)),c.createElement(u,i.default({arcStyle:h,position:[0,0,-1]},j)))),c.createElement("ambientLight",{intensity:.5}),c.createElement("pointLight",{position:[10,10,10],intensity:.5}))};
|
package/core/GizmoViewport.js
CHANGED
|
@@ -84,7 +84,7 @@ const GizmoViewport = ({
|
|
|
84
84
|
hideAxisHeads,
|
|
85
85
|
disabled,
|
|
86
86
|
font = '18px Inter var, Arial, sans-serif',
|
|
87
|
-
axisColors = ['#
|
|
87
|
+
axisColors = ['#ff2060', '#20df80', '#2080ff'],
|
|
88
88
|
axisHeadScale = 1,
|
|
89
89
|
axisScale,
|
|
90
90
|
labels = ['X', 'Y', 'Z'],
|
package/core/Line.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),i=require("@react-three/fiber"),n=require("three-stdlib");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}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 i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var s=o(e),c=a(t);const u=c.forwardRef((function({points:e,color:t="black",vertexColors:o,linewidth:a,lineWidth:u,dashed:l,...f},d){const p=i.useThree((e=>e.size)),[b]=c.useState((()=>new n.Line2)),[h]=c.useState((()=>new n.LineMaterial)),m=c.useMemo((()=>{const t=new n.LineGeometry,i=e.map((e=>e instanceof r.Vector3?e.toArray():e));if(t.setPositions(i.flat()),o){const e=o.map((e=>e instanceof r.Color?e.toArray():e));t.setColors(e.flat())}return t}),[e,o]);return c.useLayoutEffect((()=>{b.computeLineDistances()}),[e,b]),c.useLayoutEffect((()=>{l?h.defines.USE_DASH="":delete h.defines.USE_DASH,h.needsUpdate=!0}),[l,h]),c.useEffect((()=>()=>m.dispose()),[m]),c.createElement("primitive",s.default({object:b,ref:d},f),c.createElement("primitive",{object:m,attach:"geometry"}),c.createElement("primitive",s.default({object:h,attach:"material",color:t,vertexColors:Boolean(o),resolution:[p.width,p.height],linewidth:null!=a?a:u,dashed:l},f)))}));exports.Line=u;
|
package/core/Line.d.ts
CHANGED
|
@@ -6,5 +6,5 @@ export declare type LineProps = {
|
|
|
6
6
|
points: Array<Vector3 | [number, number, number]>;
|
|
7
7
|
vertexColors?: Array<Color | [number, number, number]>;
|
|
8
8
|
lineWidth?: number;
|
|
9
|
-
} & Omit<LineMaterialParameters, 'vertexColors'> & Omit<ReactThreeFiber.Object3DNode<Line2, typeof Line2>, 'args'> & Omit<ReactThreeFiber.Object3DNode<LineMaterial, [LineMaterialParameters]>, 'color' | 'vertexColors' | '
|
|
9
|
+
} & Omit<LineMaterialParameters, 'vertexColors'> & Omit<ReactThreeFiber.Object3DNode<Line2, typeof Line2>, 'args'> & Omit<ReactThreeFiber.Object3DNode<LineMaterial, [LineMaterialParameters]>, 'color' | 'vertexColors' | 'args'>;
|
|
10
10
|
export declare const Line: React.ForwardRefExoticComponent<Pick<LineProps, "visible" | "attach" | "children" | "key" | "onUpdate" | "position" | "up" | "scale" | "rotation" | "matrix" | "quaternion" | "layers" | "dispose" | "type" | "id" | "uuid" | "name" | "parent" | "modelViewMatrix" | "normalMatrix" | "matrixWorld" | "matrixAutoUpdate" | "matrixWorldNeedsUpdate" | "castShadow" | "receiveShadow" | "frustumCulled" | "renderOrder" | "animations" | "userData" | "customDepthMaterial" | "customDistanceMaterial" | "isObject3D" | "onBeforeRender" | "onAfterRender" | "applyMatrix4" | "applyQuaternion" | "setRotationFromAxisAngle" | "setRotationFromEuler" | "setRotationFromMatrix" | "setRotationFromQuaternion" | "rotateOnAxis" | "rotateOnWorldAxis" | "rotateX" | "rotateY" | "rotateZ" | "translateOnAxis" | "translateX" | "translateY" | "translateZ" | "localToWorld" | "worldToLocal" | "lookAt" | "add" | "remove" | "removeFromParent" | "clear" | "getObjectById" | "getObjectByName" | "getObjectByProperty" | "getWorldPosition" | "getWorldQuaternion" | "getWorldScale" | "getWorldDirection" | "raycast" | "traverse" | "traverseVisible" | "traverseAncestors" | "updateMatrix" | "updateMatrixWorld" | "updateWorldMatrix" | "toJSON" | "clone" | "copy" | "addEventListener" | "hasEventListener" | "removeEventListener" | "dispatchEvent" | "color" | keyof import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers | "transparent" | "dashed" | "points" | "material" | "fog" | "geometry" | "morphTargetInfluences" | "morphTargetDictionary" | "isMesh" | "updateMorphTargets" | "computeLineDistances" | "alphaTest" | "alphaToCoverage" | "blendDst" | "blendDstAlpha" | "blendEquation" | "blendEquationAlpha" | "blending" | "blendSrc" | "blendSrcAlpha" | "clipIntersection" | "clippingPlanes" | "clipShadows" | "colorWrite" | "defines" | "depthFunc" | "depthTest" | "depthWrite" | "stencilWrite" | "stencilFunc" | "stencilRef" | "stencilWriteMask" | "stencilFuncMask" | "stencilFail" | "stencilZFail" | "stencilZPass" | "isMaterial" | "needsUpdate" | "opacity" | "polygonOffset" | "polygonOffsetFactor" | "polygonOffsetUnits" | "precision" | "premultipliedAlpha" | "dithering" | "side" | "shadowSide" | "toneMapped" | "vertexColors" | "version" | "onBeforeCompile" | "customProgramCacheKey" | "setValues" | "uniforms" | "vertexShader" | "fragmentShader" | "linewidth" | "wireframe" | "wireframeLinewidth" | "lights" | "clipping" | "derivatives" | "extensions" | "defaultAttributeValues" | "index0AttributeName" | "uniformsNeedUpdate" | "glslVersion" | "isShaderMaterial" | "dashSize" | "gapSize" | "format" | "dashScale" | "dashOffset" | "resolution" | "worldUnits" | "isLine2" | "isLineSegments2" | "isLineMaterial" | "lineWidth"> & React.RefAttributes<Line2>>;
|
package/core/Line.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import _extends from '@babel/runtime/helpers/esm/extends';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { Vector3, Color } from 'three';
|
|
4
|
+
import { useThree } from '@react-three/fiber';
|
|
4
5
|
import { Line2, LineMaterial, LineGeometry } from 'three-stdlib';
|
|
5
6
|
|
|
6
7
|
const Line = /*#__PURE__*/React.forwardRef(function Line({
|
|
@@ -12,9 +13,9 @@ const Line = /*#__PURE__*/React.forwardRef(function Line({
|
|
|
12
13
|
dashed,
|
|
13
14
|
...rest
|
|
14
15
|
}, ref) {
|
|
16
|
+
const size = useThree(state => state.size);
|
|
15
17
|
const [line2] = React.useState(() => new Line2());
|
|
16
18
|
const [lineMaterial] = React.useState(() => new LineMaterial());
|
|
17
|
-
const [resolution] = React.useState(() => new Vector2(512, 512));
|
|
18
19
|
const lineGeom = React.useMemo(() => {
|
|
19
20
|
const geom = new LineGeometry();
|
|
20
21
|
const pValues = points.map(p => p instanceof Vector3 ? p.toArray() : p);
|
|
@@ -54,7 +55,7 @@ const Line = /*#__PURE__*/React.forwardRef(function Line({
|
|
|
54
55
|
attach: "material",
|
|
55
56
|
color: color,
|
|
56
57
|
vertexColors: Boolean(vertexColors),
|
|
57
|
-
resolution:
|
|
58
|
+
resolution: [size.width, size.height],
|
|
58
59
|
linewidth: linewidth !== null && linewidth !== void 0 ? linewidth : lineWidth,
|
|
59
60
|
dashed: dashed
|
|
60
61
|
}, rest)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("react-merge-refs"),o=require("./Line.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(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("three-stdlib");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@babel/runtime/helpers/extends"),t=require("react"),r=require("three"),n=require("react-merge-refs"),o=require("./Line.cjs.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}function u(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("@react-three/fiber"),require("three-stdlib");var i=c(e),s=u(t),a=c(n);const f=new r.Vector3,d=s.forwardRef((function({start:e=[0,0,0],end:t=[0,0,0],mid:n,segments:c=20,...u},d){const l=s.useRef(null),[v]=s.useState((()=>new r.QuadraticBezierCurve3(void 0,void 0,void 0))),y=s.useCallback(((e,t,n,o=20)=>(e instanceof r.Vector3?v.v0.copy(e):v.v0.set(...e),t instanceof r.Vector3?v.v2.copy(t):v.v2.set(...t),n instanceof r.Vector3?v.v1.copy(n):v.v1.copy(v.v0.clone().add(v.v2.clone().sub(v.v0)).add(f.set(0,v.v0.y-v.v2.y,0))),v.getPoints(o))),[]);s.useLayoutEffect((()=>{l.current.setPoints=(e,t,r)=>{const n=y(e,t,r);l.current.geometry&&l.current.geometry.setPositions(n.map((e=>e.toArray())).flat())}}),[]);const b=s.useMemo((()=>y(e,t,n,c)),[e,t,n,c]);return s.createElement(o.Line,i.default({ref:a.default([l,d]),points:b},u))}));exports.QuadraticBezierLine=d;
|
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"),
|
|
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"),v=require("./OrbitControls.cjs.js"),g=require("./TrackballControls.cjs.js"),T=require("./ArcballControls.cjs.js"),f=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"),w=require("./GizmoViewport.cjs.js"),F=require("./useCubeTexture.cjs.js"),G=require("./useFBX.cjs.js"),R=require("./useGLTF.cjs.js"),z=require("./useProgress.cjs.js"),O=require("./useTexture.cjs.js"),I=require("./useKTX2.cjs.js"),y=require("./Stats.cjs.js"),H=require("./useDepthBuffer.cjs.js"),V=require("./useAspect.cjs.js"),Q=require("./useCamera.cjs.js"),X=require("./useDetectGPU.cjs.js"),K=require("./useHelper.cjs.js"),W=require("./useBVH.cjs.js"),N=require("./useContextBridge.cjs.js"),U=require("./useAnimations.cjs.js"),_=require("./useFBO.cjs.js"),J=require("./useIntersect.cjs.js"),Y=require("./useBoxProjectedEnv.cjs.js"),Z=require("./BBAnchor.cjs.js"),$=require("./CurveModifier.cjs.js"),ee=require("./MeshDistortMaterial.cjs.js"),re=require("./MeshWobbleMaterial.cjs.js"),se=require("./MeshReflectorMaterial.cjs.js"),te=require("./PointMaterial.cjs.js"),oe=require("./shaderMaterial.cjs.js"),ie=require("./softShadows.cjs.js"),ue=require("./shapes.cjs.js"),ae=require("./RoundedBox.cjs.js"),ce=require("./ScreenQuad.cjs.js"),ne=require("./Center.cjs.js"),je=require("./Bounds.cjs.js"),pe=require("./CameraShake.cjs.js"),le=require("./Float.cjs.js"),xe=require("./Stage.cjs.js"),qe=require("./Backdrop.cjs.js"),de=require("./Shadow.cjs.js"),me=require("./ContactShadows.cjs.js"),Ce=require("./AccumulativeShadows.cjs.js"),he=require("./Reflector.cjs.js"),Me=require("./SpotLight.cjs.js"),Se=require("./Environment.cjs.js"),be=require("./Lightformer.cjs.js"),Pe=require("./Sky.cjs.js"),Be=require("./Stars.cjs.js"),ve=require("./Cloud.cjs.js"),ge=require("./Sparkles.cjs.js"),Te=require("./useMatcapTexture.cjs.js"),fe=require("./useNormalTexture.cjs.js"),Ae=require("./Points.cjs.js"),Le=require("./Instances.cjs.js"),ke=require("./Segments.cjs.js"),De=require("./Detailed.cjs.js"),Ee=require("./Preload.cjs.js"),we=require("./BakeShadows.cjs.js"),Fe=require("./meshBounds.cjs.js"),Ge=require("./AdaptiveDpr.cjs.js"),Re=require("./AdaptiveEvents.cjs.js"),ze=require("./PerformanceMonitor.cjs.js"),Oe=require("./RenderTexture.cjs.js"),Ie=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("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("../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=v.OrbitControls,exports.TrackballControls=g.TrackballControls,exports.ArcballControls=T.ArcballControls,exports.TransformControls=f.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=w.GizmoViewport,exports.useCubeTexture=F.useCubeTexture,exports.useFBX=G.useFBX,exports.useGLTF=R.useGLTF,exports.useProgress=z.useProgress,exports.IsObject=O.IsObject,exports.useTexture=O.useTexture,exports.useKTX2=I.useKTX2,exports.Stats=y.Stats,exports.useDepthBuffer=H.useDepthBuffer,exports.useAspect=V.useAspect,exports.useCamera=Q.useCamera,exports.useDetectGPU=X.useDetectGPU,exports.useHelper=K.useHelper,exports.useBVH=W.useBVH,exports.useContextBridge=N.useContextBridge,exports.useAnimations=U.useAnimations,exports.useFBO=_.useFBO,exports.useIntersect=J.useIntersect,exports.useBoxProjectedEnv=Y.useBoxProjectedEnv,exports.BBAnchor=Z.BBAnchor,exports.CurveModifier=$.CurveModifier,exports.MeshDistortMaterial=ee.MeshDistortMaterial,exports.MeshWobbleMaterial=re.MeshWobbleMaterial,exports.MeshReflectorMaterial=se.MeshReflectorMaterial,exports.PointMaterial=te.PointMaterial,exports.PointMaterialImpl=te.PointMaterialImpl,exports.shaderMaterial=oe.shaderMaterial,exports.softShadows=ie.softShadows,exports.Box=ue.Box,exports.Capsule=ue.Capsule,exports.Circle=ue.Circle,exports.Cone=ue.Cone,exports.Cylinder=ue.Cylinder,exports.Dodecahedron=ue.Dodecahedron,exports.Extrude=ue.Extrude,exports.Icosahedron=ue.Icosahedron,exports.Lathe=ue.Lathe,exports.Octahedron=ue.Octahedron,exports.Plane=ue.Plane,exports.Polyhedron=ue.Polyhedron,exports.Ring=ue.Ring,exports.Sphere=ue.Sphere,exports.Tetrahedron=ue.Tetrahedron,exports.Torus=ue.Torus,exports.TorusKnot=ue.TorusKnot,exports.Tube=ue.Tube,exports.RoundedBox=ae.RoundedBox,exports.ScreenQuad=ce.ScreenQuad,exports.Center=ne.Center,exports.Bounds=je.Bounds,exports.useBounds=je.useBounds,exports.CameraShake=pe.CameraShake,exports.Float=le.Float,exports.Stage=xe.Stage,exports.Backdrop=qe.Backdrop,exports.Shadow=de.Shadow,exports.ContactShadows=me.ContactShadows,exports.AccumulativeShadows=Ce.AccumulativeShadows,exports.RandomizedLight=Ce.RandomizedLight,exports.accumulativeContext=Ce.accumulativeContext,exports.Reflector=he.Reflector,exports.SpotLight=Me.SpotLight,exports.Environment=Se.Environment,exports.EnvironmentCube=Se.EnvironmentCube,exports.EnvironmentMap=Se.EnvironmentMap,exports.EnvironmentPortal=Se.EnvironmentPortal,exports.useEnvironment=Se.useEnvironment,exports.Lightformer=be.Lightformer,exports.Sky=Pe.Sky,exports.calcPosFromAngles=Pe.calcPosFromAngles,exports.Stars=Be.Stars,exports.Cloud=ve.Cloud,exports.Sparkles=ge.Sparkles,exports.useMatcapTexture=Te.useMatcapTexture,exports.useNormalTexture=fe.useNormalTexture,exports.Point=Ae.Point,exports.Points=Ae.Points,exports.PointsBuffer=Ae.PointsBuffer,exports.Instance=Le.Instance,exports.Instances=Le.Instances,exports.Merged=Le.Merged,exports.Segment=ke.Segment,exports.SegmentObject=ke.SegmentObject,exports.Segments=ke.Segments,exports.Detailed=De.Detailed,exports.Preload=Ee.Preload,exports.BakeShadows=we.BakeShadows,exports.meshBounds=Fe.meshBounds,exports.AdaptiveDpr=Ge.AdaptiveDpr,exports.AdaptiveEvents=Re.AdaptiveEvents,exports.PerformanceMonitor=ze.PerformanceMonitor,exports.usePerformanceMonitor=ze.usePerformanceMonitor,exports.RenderTexture=Oe.RenderTexture,exports.Mask=Ie.Mask,exports.useMask=Ie.useMask;
|
package/core/index.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export * from './ArcballControls';
|
|
|
28
28
|
export * from './TransformControls';
|
|
29
29
|
export * from './PointerLockControls';
|
|
30
30
|
export * from './FirstPersonControls';
|
|
31
|
+
export * from './pivotControls';
|
|
31
32
|
export * from './GizmoHelper';
|
|
32
33
|
export * from './GizmoViewcube';
|
|
33
34
|
export * from './GizmoViewport';
|
package/core/index.js
CHANGED
|
@@ -28,6 +28,7 @@ export { ArcballControls } from './ArcballControls.js';
|
|
|
28
28
|
export { TransformControls } from './TransformControls.js';
|
|
29
29
|
export { PointerLockControls } from './PointerLockControls.js';
|
|
30
30
|
export { FirstPersonControls } from './FirstPersonControls.js';
|
|
31
|
+
export { PivotControls, calculateScaleFactor } from './pivotControls/index.js';
|
|
31
32
|
export { GizmoHelper, useGizmoContext } from './GizmoHelper.js';
|
|
32
33
|
export { GizmoViewcube } from './GizmoViewcube.js';
|
|
33
34
|
export { GizmoViewport } from './GizmoViewport.js';
|
|
@@ -102,6 +103,12 @@ import 'suspend-react';
|
|
|
102
103
|
import 'meshline';
|
|
103
104
|
import 'lodash.pick';
|
|
104
105
|
import 'lodash.omit';
|
|
106
|
+
import './pivotControls/AxisArrow.js';
|
|
107
|
+
import './pivotControls/context.js';
|
|
108
|
+
import './pivotControls/PlaneSlider.js';
|
|
109
|
+
import './pivotControls/AxisRotator.js';
|
|
110
|
+
import '../web/Html.js';
|
|
111
|
+
import 'react-dom/client';
|
|
105
112
|
import 'zustand';
|
|
106
113
|
import 'stats.js';
|
|
107
114
|
import '../helpers/useEffectfulState.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=require("three"),r=require("@react-three/fiber"),o=require("../Line.cjs.js"),n=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 o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{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 s=new c.Vector3,l=new c.Vector3,u=(e,t,r,o)=>{const n=t.dot(t),a=t.dot(e)-t.dot(r),i=t.dot(o);s.copy(o).multiplyScalar(n/i).sub(t),l.copy(o).multiplyScalar(a/i).add(r).sub(e);return-s.dot(l)/s.dot(s)},p=new c.Vector3(0,1,0),d=new c.Matrix4;exports.AxisArrow=({direction:e,axis:t})=>{const{depthTest:a,scale:s,lineWidth:l,fixed:f,axisColors:m,hoveredColor:g,opacity:x,onDragStart:y,onDrag:h,onDragEnd:b,userData:O}=i.useContext(n.context),P=r.useThree((e=>e.controls)),j=i.useRef(null),w=i.useRef(null),[k,C]=i.useState(!1),M=i.useCallback((t=>{t.stopPropagation();const r=(new c.Matrix4).extractRotation(j.current.matrixWorld),o=t.point.clone(),n=e.clone().applyMatrix4(r).normalize();w.current={clickPoint:o,dir:n},y(),P&&(P.enabled=!1),t.target.setPointerCapture(t.pointerId)}),[e,P,y]),D=i.useCallback((e=>{if(e.stopPropagation(),k||C(!0),w.current){const{clickPoint:t,dir:r}=w.current,o=u(t,r,e.ray.origin,e.ray.direction);d.makeTranslation(r.x*o,r.y*o,r.z*o),h(d)}}),[h,k]),E=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(),C(!1)}),[]),{cylinderLength:q,coneWidth:v,coneLength:T,matrixL:W}=i.useMemo((()=>{const t=f?l/s*1.6:s/20,r=f?.2:s/5,o=f?1-r:s-r,n=(new c.Quaternion).setFromUnitVectors(p,e.clone().normalize());return{cylinderLength:o,coneWidth:t,coneLength:r,matrixL:(new c.Matrix4).makeRotationFromQuaternion(n)}}),[e,s,l,f]),z=k?g:m[t];return i.createElement("group",{ref:j},i.createElement("group",{matrix:W,matrixAutoUpdate:!1,onPointerDown:M,onPointerMove:D,onPointerUp:E,onPointerOut:L},i.createElement(o.Line,{transparent:!0,depthTest:a,points:[0,0,0,0,q,0],lineWidth:l,color:z,opacity:x,polygonOffset:!0,renderOrder:1,polygonOffsetFactor:-10,userData:O}),i.createElement("mesh",{position:[0,q+T/2,0],renderOrder:500,userData:O},i.createElement("coneGeometry",{args:[v,T,24,1]}),i.createElement("meshBasicMaterial",{transparent:!0,depthTest:a,color:z,opacity:x,polygonOffset:!0,polygonOffsetFactor:-10}))))},exports.calculateOffset=u;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
export declare const calculateOffset: (clickPoint: THREE.Vector3, normal: THREE.Vector3, rayStart: THREE.Vector3, rayDir: THREE.Vector3) => number;
|
|
4
|
+
export declare const AxisArrow: React.FC<{
|
|
5
|
+
direction: THREE.Vector3;
|
|
6
|
+
axis: 0 | 1 | 2;
|
|
7
|
+
}>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { useThree } from '@react-three/fiber';
|
|
4
|
+
import { Line } from '../Line.js';
|
|
5
|
+
import { context } from './context.js';
|
|
6
|
+
|
|
7
|
+
const vec1 = new THREE.Vector3();
|
|
8
|
+
const vec2 = new THREE.Vector3();
|
|
9
|
+
const calculateOffset = (clickPoint, normal, rayStart, rayDir) => {
|
|
10
|
+
const e1 = normal.dot(normal);
|
|
11
|
+
const e2 = normal.dot(clickPoint) - normal.dot(rayStart);
|
|
12
|
+
const e3 = normal.dot(rayDir);
|
|
13
|
+
vec1.copy(rayDir).multiplyScalar(e1 / e3).sub(normal);
|
|
14
|
+
vec2.copy(rayDir).multiplyScalar(e2 / e3).add(rayStart).sub(clickPoint);
|
|
15
|
+
const offset = -vec1.dot(vec2) / vec1.dot(vec1);
|
|
16
|
+
return offset;
|
|
17
|
+
};
|
|
18
|
+
const upV = new THREE.Vector3(0, 1, 0);
|
|
19
|
+
const offsetMatrix = new THREE.Matrix4();
|
|
20
|
+
const AxisArrow = ({
|
|
21
|
+
direction,
|
|
22
|
+
axis
|
|
23
|
+
}) => {
|
|
24
|
+
const {
|
|
25
|
+
depthTest,
|
|
26
|
+
scale,
|
|
27
|
+
lineWidth,
|
|
28
|
+
fixed,
|
|
29
|
+
axisColors,
|
|
30
|
+
hoveredColor,
|
|
31
|
+
opacity,
|
|
32
|
+
onDragStart,
|
|
33
|
+
onDrag,
|
|
34
|
+
onDragEnd,
|
|
35
|
+
userData
|
|
36
|
+
} = React.useContext(context); // @ts-expect-error new in @react-three/fiber@7.0.5
|
|
37
|
+
|
|
38
|
+
const camControls = useThree(state => state.controls);
|
|
39
|
+
const objRef = React.useRef(null);
|
|
40
|
+
const clickInfo = React.useRef(null);
|
|
41
|
+
const [isHovered, setIsHovered] = React.useState(false);
|
|
42
|
+
const onPointerDown = React.useCallback(e => {
|
|
43
|
+
e.stopPropagation();
|
|
44
|
+
const rotation = new THREE.Matrix4().extractRotation(objRef.current.matrixWorld);
|
|
45
|
+
const clickPoint = e.point.clone();
|
|
46
|
+
const dir = direction.clone().applyMatrix4(rotation).normalize();
|
|
47
|
+
clickInfo.current = {
|
|
48
|
+
clickPoint,
|
|
49
|
+
dir
|
|
50
|
+
};
|
|
51
|
+
onDragStart();
|
|
52
|
+
camControls && (camControls.enabled = false); // @ts-ignore - setPointerCapture is not in the type definition
|
|
53
|
+
|
|
54
|
+
e.target.setPointerCapture(e.pointerId);
|
|
55
|
+
}, [direction, camControls, onDragStart]);
|
|
56
|
+
const onPointerMove = React.useCallback(e => {
|
|
57
|
+
e.stopPropagation();
|
|
58
|
+
if (!isHovered) setIsHovered(true);
|
|
59
|
+
|
|
60
|
+
if (clickInfo.current) {
|
|
61
|
+
const {
|
|
62
|
+
clickPoint,
|
|
63
|
+
dir
|
|
64
|
+
} = clickInfo.current;
|
|
65
|
+
const offset = calculateOffset(clickPoint, dir, e.ray.origin, e.ray.direction);
|
|
66
|
+
offsetMatrix.makeTranslation(dir.x * offset, dir.y * offset, dir.z * offset);
|
|
67
|
+
onDrag(offsetMatrix);
|
|
68
|
+
}
|
|
69
|
+
}, [onDrag, isHovered]);
|
|
70
|
+
const onPointerUp = React.useCallback(e => {
|
|
71
|
+
e.stopPropagation();
|
|
72
|
+
clickInfo.current = null;
|
|
73
|
+
onDragEnd();
|
|
74
|
+
camControls && (camControls.enabled = true); // @ts-ignore - releasePointerCapture & PointerEvent#pointerId is not in the type definition
|
|
75
|
+
|
|
76
|
+
e.target.releasePointerCapture(e.pointerId);
|
|
77
|
+
}, [camControls, onDragEnd]);
|
|
78
|
+
const onPointerOut = React.useCallback(e => {
|
|
79
|
+
e.stopPropagation();
|
|
80
|
+
setIsHovered(false);
|
|
81
|
+
}, []);
|
|
82
|
+
const {
|
|
83
|
+
cylinderLength,
|
|
84
|
+
coneWidth,
|
|
85
|
+
coneLength,
|
|
86
|
+
matrixL
|
|
87
|
+
} = React.useMemo(() => {
|
|
88
|
+
const coneWidth = fixed ? lineWidth / scale * 1.6 : scale / 20;
|
|
89
|
+
const coneLength = fixed ? 0.2 : scale / 5;
|
|
90
|
+
const cylinderLength = fixed ? 1 - coneLength : scale - coneLength;
|
|
91
|
+
const quaternion = new THREE.Quaternion().setFromUnitVectors(upV, direction.clone().normalize());
|
|
92
|
+
const matrixL = new THREE.Matrix4().makeRotationFromQuaternion(quaternion);
|
|
93
|
+
return {
|
|
94
|
+
cylinderLength,
|
|
95
|
+
coneWidth,
|
|
96
|
+
coneLength,
|
|
97
|
+
matrixL
|
|
98
|
+
};
|
|
99
|
+
}, [direction, scale, lineWidth, fixed]);
|
|
100
|
+
const color_ = isHovered ? hoveredColor : axisColors[axis];
|
|
101
|
+
return /*#__PURE__*/React.createElement("group", {
|
|
102
|
+
ref: objRef
|
|
103
|
+
}, /*#__PURE__*/React.createElement("group", {
|
|
104
|
+
matrix: matrixL,
|
|
105
|
+
matrixAutoUpdate: false,
|
|
106
|
+
onPointerDown: onPointerDown,
|
|
107
|
+
onPointerMove: onPointerMove,
|
|
108
|
+
onPointerUp: onPointerUp,
|
|
109
|
+
onPointerOut: onPointerOut
|
|
110
|
+
}, /*#__PURE__*/React.createElement(Line, {
|
|
111
|
+
transparent: true,
|
|
112
|
+
depthTest: depthTest,
|
|
113
|
+
points: [0, 0, 0, 0, cylinderLength, 0],
|
|
114
|
+
lineWidth: lineWidth,
|
|
115
|
+
color: color_,
|
|
116
|
+
opacity: opacity,
|
|
117
|
+
polygonOffset: true,
|
|
118
|
+
renderOrder: 1,
|
|
119
|
+
polygonOffsetFactor: -10,
|
|
120
|
+
userData: userData
|
|
121
|
+
}), /*#__PURE__*/React.createElement("mesh", {
|
|
122
|
+
position: [0, cylinderLength + coneLength / 2.0, 0],
|
|
123
|
+
renderOrder: 500,
|
|
124
|
+
userData: userData
|
|
125
|
+
}, /*#__PURE__*/React.createElement("coneGeometry", {
|
|
126
|
+
args: [coneWidth, coneLength, 24, 1]
|
|
127
|
+
}), /*#__PURE__*/React.createElement("meshBasicMaterial", {
|
|
128
|
+
transparent: true,
|
|
129
|
+
depthTest: depthTest,
|
|
130
|
+
color: color_,
|
|
131
|
+
opacity: opacity,
|
|
132
|
+
polygonOffset: true,
|
|
133
|
+
polygonOffsetFactor: -10
|
|
134
|
+
}))));
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export { AxisArrow, calculateOffset };
|
|
@@ -0,0 +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("./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),c=i(t);const l=new c.Vector3,u=new c.Vector3,p=new c.Matrix4,d=new c.Vector3,m=new c.Ray,x=new c.Vector3;exports.AxisRotator=({dir1:e,dir2:t,axis:i})=>{const{annotationsClass:f,depthTest:b,scale:P,lineWidth:h,fixed:y,axisColors:g,hoveredColor:M,opacity:w,onDragStart:C,onDrag:j,onDragEnd:k,userData:O}=s.useContext(a.context),q=r.useThree((e=>e.controls)),V=s.useRef(null),v=s.useRef(null),D=s.useRef(null),[F,R]=s.useState(!1),z=s.useCallback((e=>{V.current.innerText="0º",V.current.style.display="block",e.stopPropagation();const t=e.point.clone(),r=(new c.Vector3).setFromMatrixPosition(v.current.matrixWorld),n=(new c.Vector3).setFromMatrixColumn(v.current.matrixWorld,0).normalize(),o=(new c.Vector3).setFromMatrixColumn(v.current.matrixWorld,1).normalize(),a=(new c.Vector3).setFromMatrixColumn(v.current.matrixWorld,2).normalize(),i=(new c.Plane).setFromNormalAndCoplanarPoint(a,r);D.current={clickPoint:t,origin:r,e1:n,e2:o,normal:a,plane:i},C(),q&&(q.enabled=!1),e.target.setPointerCapture(e.pointerId)}),[q,C]),E=s.useCallback((e=>{if(e.stopPropagation(),F||R(!0),D.current){const{clickPoint:t,origin:r,e1:n,e2:o,normal:a,plane:i}=D.current;m.copy(e.ray),m.intersectPlane(i,x),m.direction.negate(),m.intersectPlane(i,x);let s=((e,t,r,n,o)=>{l.copy(e).sub(r),u.copy(t).sub(r);const a=n.dot(n),i=o.dot(o),s=l.dot(n)/a,c=l.dot(o)/i,p=u.dot(n)/a,d=u.dot(o)/i,m=Math.atan2(c,s);return Math.atan2(d,p)-m})(t,x,r,n,o),c=180*s/Math.PI;e.shiftKey&&(c=10*Math.round(c/10),s=(e=>e*Math.PI/180)(c)),V.current.innerText=`${c.toFixed(0)} º`,p.makeRotationAxis(a,s),d.copy(r).applyMatrix4(p).sub(r).negate(),p.setPosition(d),j(p)}}),[j,F]),W=s.useCallback((e=>{V.current.style.display="none",e.stopPropagation(),D.current=null,k(),q&&(q.enabled=!0),e.target.releasePointerCapture(e.pointerId)}),[q,k]),I=s.useCallback((e=>{e.stopPropagation(),R(!1)}),[]),T=s.useMemo((()=>{const r=e.clone().normalize(),n=t.clone().normalize();return(new c.Matrix4).makeBasis(r,n,r.clone().cross(n))}),[e,t]),A=y?.65:.65*P,_=s.useMemo((()=>{const e=[];for(let t=0;t<=32;t++){const r=t*Math.PI/64;e.push(new c.Vector3(Math.cos(r)*A,Math.sin(r)*A,0))}return e}),[A]);return s.createElement("group",{ref:v,onPointerDown:z,onPointerMove:E,onPointerUp:W,onPointerOut:I,matrix:T,matrixAutoUpdate:!1},s.createElement(o.Html,{position:[A,A,0]},s.createElement("div",{style:{display:"none",background:"#151520",color:"white",padding:"6px 8px",borderRadius:7,whiteSpace:"nowrap"},className:f,ref:V})),s.createElement(n.Line,{transparent:!0,depthTest:b,points:_,lineWidth:h,color:F?M:g[i],opacity:w,polygonOffset:!0,polygonOffsetFactor:-10,userData:O}))};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import { useThree } from '@react-three/fiber';
|
|
4
|
+
import { Line } from '../Line.js';
|
|
5
|
+
import { Html } from '../../web/Html.js';
|
|
6
|
+
import { context } from './context.js';
|
|
7
|
+
|
|
8
|
+
const clickDir = new THREE.Vector3();
|
|
9
|
+
const intersectionDir = new THREE.Vector3();
|
|
10
|
+
|
|
11
|
+
const toDegrees = radians => radians * 180 / Math.PI;
|
|
12
|
+
|
|
13
|
+
const toRadians = degrees => degrees * Math.PI / 180;
|
|
14
|
+
|
|
15
|
+
const calculateAngle = (clickPoint, intersectionPoint, origin, e1, e2) => {
|
|
16
|
+
clickDir.copy(clickPoint).sub(origin);
|
|
17
|
+
intersectionDir.copy(intersectionPoint).sub(origin);
|
|
18
|
+
const dote1e1 = e1.dot(e1);
|
|
19
|
+
const dote2e2 = e2.dot(e2);
|
|
20
|
+
const uClick = clickDir.dot(e1) / dote1e1;
|
|
21
|
+
const vClick = clickDir.dot(e2) / dote2e2;
|
|
22
|
+
const uIntersection = intersectionDir.dot(e1) / dote1e1;
|
|
23
|
+
const vIntersection = intersectionDir.dot(e2) / dote2e2;
|
|
24
|
+
const angleClick = Math.atan2(vClick, uClick);
|
|
25
|
+
const angleIntersection = Math.atan2(vIntersection, uIntersection);
|
|
26
|
+
return angleIntersection - angleClick;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const rotMatrix = new THREE.Matrix4();
|
|
30
|
+
const posNew = new THREE.Vector3();
|
|
31
|
+
const ray = new THREE.Ray();
|
|
32
|
+
const intersection = new THREE.Vector3();
|
|
33
|
+
const AxisRotator = ({
|
|
34
|
+
dir1,
|
|
35
|
+
dir2,
|
|
36
|
+
axis
|
|
37
|
+
}) => {
|
|
38
|
+
const {
|
|
39
|
+
annotationsClass,
|
|
40
|
+
depthTest,
|
|
41
|
+
scale,
|
|
42
|
+
lineWidth,
|
|
43
|
+
fixed,
|
|
44
|
+
axisColors,
|
|
45
|
+
hoveredColor,
|
|
46
|
+
opacity,
|
|
47
|
+
onDragStart,
|
|
48
|
+
onDrag,
|
|
49
|
+
onDragEnd,
|
|
50
|
+
userData
|
|
51
|
+
} = React.useContext(context); // @ts-expect-error new in @react-three/fiber@7.0.5
|
|
52
|
+
|
|
53
|
+
const camControls = useThree(state => state.controls);
|
|
54
|
+
const divRef = React.useRef(null);
|
|
55
|
+
const objRef = React.useRef(null);
|
|
56
|
+
const clickInfo = React.useRef(null);
|
|
57
|
+
const [isHovered, setIsHovered] = React.useState(false);
|
|
58
|
+
const onPointerDown = React.useCallback(e => {
|
|
59
|
+
divRef.current.innerText = '0º';
|
|
60
|
+
divRef.current.style.display = 'block';
|
|
61
|
+
e.stopPropagation();
|
|
62
|
+
const clickPoint = e.point.clone();
|
|
63
|
+
const origin = new THREE.Vector3().setFromMatrixPosition(objRef.current.matrixWorld);
|
|
64
|
+
const e1 = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 0).normalize();
|
|
65
|
+
const e2 = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 1).normalize();
|
|
66
|
+
const normal = new THREE.Vector3().setFromMatrixColumn(objRef.current.matrixWorld, 2).normalize();
|
|
67
|
+
const plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, origin);
|
|
68
|
+
clickInfo.current = {
|
|
69
|
+
clickPoint,
|
|
70
|
+
origin,
|
|
71
|
+
e1,
|
|
72
|
+
e2,
|
|
73
|
+
normal,
|
|
74
|
+
plane
|
|
75
|
+
};
|
|
76
|
+
onDragStart();
|
|
77
|
+
camControls && (camControls.enabled = false); // @ts-ignore
|
|
78
|
+
|
|
79
|
+
e.target.setPointerCapture(e.pointerId);
|
|
80
|
+
}, [camControls, onDragStart]);
|
|
81
|
+
const onPointerMove = React.useCallback(e => {
|
|
82
|
+
e.stopPropagation();
|
|
83
|
+
if (!isHovered) setIsHovered(true);
|
|
84
|
+
|
|
85
|
+
if (clickInfo.current) {
|
|
86
|
+
const {
|
|
87
|
+
clickPoint,
|
|
88
|
+
origin,
|
|
89
|
+
e1,
|
|
90
|
+
e2,
|
|
91
|
+
normal,
|
|
92
|
+
plane
|
|
93
|
+
} = clickInfo.current;
|
|
94
|
+
ray.copy(e.ray);
|
|
95
|
+
ray.intersectPlane(plane, intersection);
|
|
96
|
+
ray.direction.negate();
|
|
97
|
+
ray.intersectPlane(plane, intersection);
|
|
98
|
+
let angle = calculateAngle(clickPoint, intersection, origin, e1, e2);
|
|
99
|
+
let degrees = toDegrees(angle); // @ts-ignore
|
|
100
|
+
|
|
101
|
+
if (e.shiftKey) {
|
|
102
|
+
degrees = Math.round(degrees / 10) * 10;
|
|
103
|
+
angle = toRadians(degrees);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
divRef.current.innerText = `${degrees.toFixed(0)} º`;
|
|
107
|
+
rotMatrix.makeRotationAxis(normal, angle);
|
|
108
|
+
posNew.copy(origin).applyMatrix4(rotMatrix).sub(origin).negate();
|
|
109
|
+
rotMatrix.setPosition(posNew);
|
|
110
|
+
onDrag(rotMatrix);
|
|
111
|
+
}
|
|
112
|
+
}, [onDrag, isHovered]);
|
|
113
|
+
const onPointerUp = React.useCallback(e => {
|
|
114
|
+
divRef.current.style.display = 'none';
|
|
115
|
+
e.stopPropagation();
|
|
116
|
+
clickInfo.current = null;
|
|
117
|
+
onDragEnd();
|
|
118
|
+
camControls && (camControls.enabled = true); // @ts-ignore
|
|
119
|
+
|
|
120
|
+
e.target.releasePointerCapture(e.pointerId);
|
|
121
|
+
}, [camControls, onDragEnd]);
|
|
122
|
+
const onPointerOut = React.useCallback(e => {
|
|
123
|
+
e.stopPropagation();
|
|
124
|
+
setIsHovered(false);
|
|
125
|
+
}, []);
|
|
126
|
+
const matrixL = React.useMemo(() => {
|
|
127
|
+
const dir1N = dir1.clone().normalize();
|
|
128
|
+
const dir2N = dir2.clone().normalize();
|
|
129
|
+
return new THREE.Matrix4().makeBasis(dir1N, dir2N, dir1N.clone().cross(dir2N));
|
|
130
|
+
}, [dir1, dir2]);
|
|
131
|
+
const r = fixed ? 0.65 : scale * 0.65;
|
|
132
|
+
const arc = React.useMemo(() => {
|
|
133
|
+
const segments = 32;
|
|
134
|
+
const points = [];
|
|
135
|
+
|
|
136
|
+
for (let j = 0; j <= segments; j++) {
|
|
137
|
+
const angle = j * Math.PI / (2 * segments);
|
|
138
|
+
points.push(new THREE.Vector3(Math.cos(angle) * r, Math.sin(angle) * r, 0));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return points;
|
|
142
|
+
}, [r]);
|
|
143
|
+
return /*#__PURE__*/React.createElement("group", {
|
|
144
|
+
ref: objRef,
|
|
145
|
+
onPointerDown: onPointerDown,
|
|
146
|
+
onPointerMove: onPointerMove,
|
|
147
|
+
onPointerUp: onPointerUp,
|
|
148
|
+
onPointerOut: onPointerOut,
|
|
149
|
+
matrix: matrixL,
|
|
150
|
+
matrixAutoUpdate: false
|
|
151
|
+
}, /*#__PURE__*/React.createElement(Html, {
|
|
152
|
+
position: [r, r, 0]
|
|
153
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
154
|
+
style: {
|
|
155
|
+
display: 'none',
|
|
156
|
+
background: '#151520',
|
|
157
|
+
color: 'white',
|
|
158
|
+
padding: '6px 8px',
|
|
159
|
+
borderRadius: 7,
|
|
160
|
+
whiteSpace: 'nowrap'
|
|
161
|
+
},
|
|
162
|
+
className: annotationsClass,
|
|
163
|
+
ref: divRef
|
|
164
|
+
})), /*#__PURE__*/React.createElement(Line, {
|
|
165
|
+
transparent: true,
|
|
166
|
+
depthTest: depthTest,
|
|
167
|
+
points: arc,
|
|
168
|
+
lineWidth: lineWidth,
|
|
169
|
+
color: isHovered ? hoveredColor : axisColors[axis],
|
|
170
|
+
opacity: opacity,
|
|
171
|
+
polygonOffset: true,
|
|
172
|
+
polygonOffsetFactor: -10,
|
|
173
|
+
userData: userData
|
|
174
|
+
}));
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export { AxisRotator };
|
|
@@ -0,0 +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})))};
|