{"_id":"react-three-fiber","_rev":"304-b821974ac306fca8ab018ac867bbdf26","time":{"1.0.0":"2019-02-25T14:56:54.967Z","created":"2019-02-26T15:01:17.226Z","1.0.2":"2019-02-26T15:01:17.381Z","modified":"2022-05-15T06:03:26.783Z","1.0.3":"2019-02-26T15:54:05.323Z","1.0.4":"2019-02-26T16:26:15.430Z","1.0.5":"2019-02-26T16:30:14.151Z","1.0.6":"2019-02-26T17:09:39.691Z","1.0.7":"2019-02-26T23:54:01.667Z","1.0.8":"2019-02-27T14:23:19.341Z","1.1.0":"2019-02-28T10:02:33.417Z","1.2.0":"2019-02-28T14:22:12.628Z","1.2.1":"2019-02-28T21:48:33.417Z","1.2.2":"2019-03-03T01:06:31.192Z","1.2.3":"2019-03-03T11:01:53.053Z","1.2.4":"2019-03-03T11:50:35.053Z","1.2.5":"2019-03-04T09:26:39.972Z","1.2.6":"2019-03-04T09:32:50.916Z","1.2.7":"2019-03-04T09:40:29.895Z","1.3.0":"2019-03-04T13:23:59.007Z","1.3.0-beta.0":"2019-03-08T09:15:18.491Z","1.3.1":"2019-03-08T20:30:45.536Z","1.3.2":"2019-03-08T23:10:51.158Z","1.3.3":"2019-03-09T23:22:01.881Z","1.3.4":"2019-03-11T19:30:55.933Z","1.3.5":"2019-03-12T11:04:31.202Z","1.3.6":"2019-03-12T18:07:31.135Z","1.3.7":"2019-03-13T10:25:00.153Z","1.3.8":"2019-03-13T17:23:51.748Z","1.3.9":"2019-03-17T14:30:49.356Z","1.3.9-beta.0":"2019-03-18T09:59:38.815Z","1.3.9-beta.1":"2019-03-18T10:01:04.765Z","1.3.10":"2019-03-18T13:44:56.462Z","1.4.0-beta.0":"2019-03-19T09:43:12.739Z","1.4.0-beta.1":"2019-03-19T11:51:51.421Z","1.5.0":"2019-03-19T17:08:03.081Z","1.5.1":"2019-03-19T20:43:50.676Z","1.5.2":"2019-03-21T00:06:03.792Z","1.5.3":"2019-03-21T11:14:13.646Z","1.5.4-beta.0":"2019-03-21T13:40:14.531Z","2.0.0-beta.1":"2019-03-26T15:17:04.267Z","2.0.0-beta.2":"2019-03-27T14:14:01.454Z","2.0.0-beta.3":"2019-03-27T15:15:52.205Z","2.0.0-beta.4":"2019-03-28T11:26:05.388Z","2.0.0-beta.5":"2019-03-29T10:34:24.183Z","2.0.0-beta.6":"2019-03-29T14:23:27.465Z","2.0.0-beta.7":"2019-03-30T21:22:12.401Z","2.0.0-beta.8":"2019-03-31T21:03:10.569Z","2.0.0-beta.9":"2019-04-01T10:19:04.803Z","2.0.0-beta.10":"2019-04-01T22:37:21.511Z","2.0.0-beta.11":"2019-04-02T17:13:52.725Z","2.0.0-beta.12":"2019-04-02T22:48:57.748Z","2.0.0":"2019-04-02T23:07:03.198Z","2.0.1":"2019-04-04T21:23:48.746Z","2.0.2":"2019-04-08T10:23:50.663Z","2.0.3":"2019-04-08T13:15:08.329Z","2.0.4":"2019-04-08T17:14:29.598Z","2.0.5":"2019-04-13T21:14:24.373Z","2.0.6":"2019-04-15T18:19:08.265Z","2.0.7":"2019-04-15T18:26:25.313Z","2.0.8":"2019-04-15T19:11:05.053Z","2.0.9":"2019-04-25T15:32:52.497Z","2.0.10":"2019-04-30T17:19:35.820Z","2.0.11":"2019-05-01T18:37:45.791Z","2.0.12":"2019-05-02T01:22:36.798Z","2.1.0-beta.0":"2019-05-02T12:34:45.840Z","2.1.0-beta.1":"2019-05-02T16:08:52.133Z","2.1.0-beta.2":"2019-05-03T10:42:20.387Z","2.1.0":"2019-05-05T09:49:20.061Z","2.1.1":"2019-05-09T07:46:47.464Z","2.1.2":"2019-05-12T09:22:01.125Z","2.1.3":"2019-05-23T14:36:30.364Z","2.1.3-beta.0":"2019-05-24T19:53:28.155Z","2.1.4":"2019-05-25T08:21:56.521Z","2.1.5":"2019-05-30T13:55:48.891Z","2.1.6":"2019-05-30T14:27:33.297Z","2.2.0":"2019-06-03T16:05:53.684Z","2.2.1":"2019-06-03T16:37:57.578Z","2.2.2":"2019-06-04T10:12:11.413Z","2.2.3":"2019-06-04T18:24:30.322Z","2.2.4":"2019-06-04T18:26:42.928Z","2.2.5":"2019-06-12T12:03:54.335Z","2.2.6":"2019-06-20T16:23:01.815Z","2.2.7":"2019-06-20T21:04:21.519Z","2.2.8":"2019-06-22T19:27:51.149Z","2.2.9":"2019-06-25T15:07:07.755Z","2.2.10":"2019-07-04T19:54:20.051Z","2.2.11":"2019-07-09T09:11:00.316Z","2.2.12":"2019-07-17T11:20:12.094Z","2.2.13":"2019-07-23T12:22:01.141Z","2.2.14":"2019-07-26T06:59:13.793Z","2.2.15":"2019-08-06T09:58:34.760Z","2.2.16":"2019-08-11T11:28:29.495Z","2.2.17":"2019-08-11T11:31:30.143Z","2.2.17-beta.0":"2019-08-13T08:11:08.336Z","2.2.17-beta.1":"2019-08-13T08:16:32.872Z","2.2.17-beta.2":"2019-08-13T08:35:46.894Z","2.3.0":"2019-08-13T08:42:59.534Z","2.3.1":"2019-08-13T11:56:23.720Z","2.3.2":"2019-08-13T12:38:02.408Z","2.3.3":"2019-08-13T12:54:20.719Z","2.3.3-beta.0":"2019-08-15T07:45:31.089Z","2.3.4":"2019-08-15T11:10:23.343Z","2.3.5":"2019-08-15T12:11:31.063Z","2.3.6":"2019-08-18T10:13:41.188Z","2.3.7":"2019-09-04T05:56:10.123Z","2.3.8":"2019-09-04T05:57:40.029Z","2.3.9":"2019-09-05T10:57:32.219Z","2.4.0":"2019-09-06T05:40:07.930Z","2.4.1":"2019-09-06T05:42:14.139Z","2.4.2":"2019-09-06T06:21:02.477Z","2.4.3":"2019-09-06T12:13:40.704Z","2.5.0-beta.0":"2019-09-08T08:32:56.260Z","2.5.0-beta.1":"2019-09-08T20:04:53.980Z","2.5.0-beta.2":"2019-09-10T12:12:05.597Z","3.0.0-beta.0":"2019-09-10T12:13:05.541Z","3.0.0-beta.1":"2019-09-10T12:16:30.756Z","3.0.0-beta.3":"2019-09-10T16:36:24.708Z","3.0.0-beta.4":"2019-09-10T21:28:21.313Z","3.0.0-beta.5":"2019-09-12T18:51:41.191Z","3.0.0-beta.6":"2019-09-12T19:05:22.174Z","3.0.0-beta.7":"2019-09-12T21:17:07.767Z","3.0.0-beta.8":"2019-09-13T07:41:40.032Z","3.0.0-beta.9":"2019-09-14T08:39:39.902Z","3.0.0-beta.10":"2019-09-14T09:12:58.371Z","3.0.0-beta.11":"2019-09-14T12:20:05.352Z","3.0.0-beta.12":"2019-09-15T08:37:40.386Z","3.0.0-beta.13":"2019-09-19T06:44:43.518Z","3.0.0-beta.14":"2019-09-24T14:07:22.885Z","3.0.0-beta.15":"2019-09-25T12:46:19.745Z","3.0.0-beta.16":"2019-09-26T10:03:07.954Z","3.0.0":"2019-10-02T09:16:54.771Z","3.0.1":"2019-10-03T20:26:48.759Z","3.0.2":"2019-10-09T08:11:25.449Z","3.0.3":"2019-10-18T08:46:32.556Z","3.0.4":"2019-10-23T22:29:58.790Z","3.0.5":"2019-10-23T22:51:31.867Z","3.0.6":"2019-10-23T23:04:25.071Z","3.0.7":"2019-10-25T13:44:09.443Z","3.0.8":"2019-11-01T11:57:21.316Z","3.0.8-beta.0":"2019-11-04T00:53:58.859Z","3.0.9":"2019-11-04T13:37:01.741Z","3.0.10":"2019-11-05T14:46:15.710Z","3.0.11":"2019-11-05T17:00:46.024Z","3.0.12":"2019-11-07T09:53:05.416Z","3.0.13":"2019-11-08T11:04:24.299Z","3.0.14":"2019-11-19T08:16:02.712Z","3.0.15":"2019-11-24T17:20:10.036Z","4.0.0-beta.0":"2019-11-25T10:57:59.887Z","4.0.0-beta.1":"2019-11-25T11:13:46.906Z","4.0.0-beta.2":"2019-11-25T11:18:02.664Z","4.0.0-beta.3":"2019-11-25T14:13:54.987Z","4.0.0-beta.4":"2019-11-25T14:16:07.379Z","4.0.0-beta.5":"2019-11-27T17:32:54.942Z","4.0.0-beta.6":"2019-11-27T17:39:59.140Z","4.0.0-beta.7":"2019-12-01T22:51:26.606Z","4.0.0-beta.8":"2019-12-02T09:22:17.390Z","4.0.0-beta.9":"2019-12-02T10:31:06.854Z","4.0.0-beta.10":"2019-12-03T19:13:05.129Z","4.0.0-beta.11":"2019-12-05T13:17:18.525Z","3.0.16":"2019-12-07T14:15:02.712Z","4.0.0-beta.12":"2019-12-12T08:29:27.879Z","4.0.0-beta.13":"2019-12-12T15:51:48.766Z","3.0.17":"2019-12-18T09:20:58.746Z","4.0.0-beta.14":"2019-12-23T13:16:04.479Z","4.0.0-beta.15":"2020-01-06T09:33:19.325Z","4.0.0-beta.16":"2020-01-07T13:57:54.890Z","4.0.1":"2020-01-10T12:37:10.048Z","4.0.2":"2020-01-10T15:03:18.185Z","4.0.3":"2020-01-10T16:18:27.518Z","4.0.4":"2020-01-10T16:57:55.370Z","4.0.5":"2020-01-10T19:23:38.473Z","4.0.6":"2020-01-13T20:39:51.107Z","4.0.7":"2020-01-14T21:11:07.817Z","4.0.8":"2020-01-16T14:28:01.472Z","4.0.9":"2020-01-18T09:03:50.819Z","4.0.10":"2020-01-21T12:58:46.302Z","4.0.11":"2020-01-22T13:42:17.251Z","4.0.12":"2020-01-27T12:28:08.230Z","4.0.13":"2020-02-02T15:11:08.805Z","4.0.14":"2020-02-03T11:06:26.951Z","4.0.16":"2020-02-10T11:39:50.027Z","4.0.17":"2020-02-18T09:20:23.150Z","4.0.18":"2020-02-28T18:43:19.691Z","4.0.19":"2020-03-01T13:59:21.147Z","4.0.20":"2020-03-07T11:17:44.120Z","4.0.21-beta.0":"2020-03-16T12:39:13.937Z","4.0.21-beta.1":"2020-03-16T12:45:54.098Z","4.0.21":"2020-03-16T12:55:31.760Z","4.0.22":"2020-03-21T09:35:23.267Z","4.0.23":"2020-03-25T15:08:51.854Z","4.0.24":"2020-03-31T10:04:32.449Z","4.0.25":"2020-03-31T15:57:53.780Z","4.0.26":"2020-04-05T10:33:08.220Z","4.0.27":"2020-04-06T23:20:18.865Z","4.0.28":"2020-04-11T09:38:25.839Z","4.0.29-beta.0":"2020-04-17T22:05:00.643Z","4.1.0":"2020-04-19T19:12:32.194Z","4.1.1":"2020-04-19T19:18:48.819Z","4.1.2":"2020-04-30T15:27:01.718Z","4.1.3":"2020-05-01T10:01:45.334Z","4.1.4":"2020-05-01T10:51:21.383Z","4.2.0":"2020-05-09T19:26:08.547Z","4.2.2":"2020-05-10T07:26:07.659Z","4.2.3":"2020-05-10T07:33:00.829Z","4.2.4":"2020-05-13T07:59:32.895Z","4.2.5":"2020-05-22T13:01:14.852Z","5.0.0-beta.0":"2020-05-25T09:23:22.420Z","4.2.6":"2020-05-25T13:46:30.022Z","4.2.7":"2020-05-25T14:28:15.615Z","5.0.0-beta.1":"2020-05-27T07:55:01.099Z","5.0.0-beta.2":"2020-05-27T09:18:21.434Z","5.0.0-beta.3":"2020-05-29T08:31:29.239Z","4.2.8":"2020-05-29T11:06:57.837Z","5.0.0-beta.4":"2020-05-31T18:47:05.141Z","5.0.0-beta.5":"2020-05-31T18:53:20.297Z","5.0.0-beta.6":"2020-06-06T18:34:40.458Z","5.0.0-beta.7":"2020-06-06T18:43:46.964Z","5.0.0-beta.8":"2020-06-11T14:37:51.709Z","4.2.9":"2020-06-12T10:49:38.684Z","4.2.10":"2020-06-12T11:20:16.409Z","5.0.0-beta.10":"2020-06-17T21:24:13.629Z","4.2.11":"2020-06-24T08:37:12.121Z","4.2.12":"2020-06-24T21:02:24.271Z","4.2.13":"2020-07-10T11:58:27.780Z","4.2.14":"2020-07-12T16:17:08.107Z","4.2.15":"2020-07-14T09:01:05.545Z","4.2.16":"2020-07-14T09:14:30.738Z","4.2.17":"2020-07-14T20:49:18.787Z","5.0.0-beta.11":"2020-07-20T10:51:55.925Z","5.0.0-alpha.0":"2020-07-28T18:55:35.202Z","4.2.18":"2020-07-29T08:44:36.707Z","4.2.19":"2020-08-06T07:39:12.241Z","5.0.0-alpha.1":"2020-08-07T08:10:08.736Z","4.2.20":"2020-08-07T08:13:16.949Z","4.2.21":"2020-09-02T11:25:16.137Z","5.0.0-beta.12":"2020-09-06T18:22:02.007Z","5.0.0":"2020-09-24T12:30:03.852Z","5.0.1":"2020-09-25T10:28:31.663Z","5.0.2":"2020-09-30T13:03:21.604Z","5.0.3":"2020-10-01T10:13:28.442Z","5.0.4":"2020-10-16T09:56:45.623Z","5.0.5":"2020-10-16T10:23:08.727Z","5.0.6":"2020-10-16T19:39:23.492Z","5.1.0":"2020-10-20T21:42:45.951Z","5.1.1":"2020-10-21T13:21:45.318Z","5.1.2":"2020-10-21T14:07:38.986Z","5.1.3":"2020-10-21T17:29:06.442Z","5.1.4":"2020-10-23T10:19:48.230Z","5.1.5":"2020-11-03T11:52:35.856Z","5.1.6":"2020-11-04T12:50:11.202Z","5.1.7":"2020-11-04T18:04:47.135Z","5.1.8":"2020-11-09T11:38:48.388Z","5.1.9":"2020-11-09T14:37:03.471Z","5.2.0":"2020-11-10T14:40:34.652Z","5.2.1":"2020-11-10T21:07:54.042Z","5.3.0":"2020-11-17T12:02:13.036Z","5.3.1":"2020-11-19T22:23:55.633Z","5.3.3":"2020-11-23T09:04:41.575Z","5.3.4":"2020-11-30T11:46:18.512Z","5.3.5":"2020-12-03T13:43:07.213Z","5.3.6":"2020-12-03T16:47:52.450Z","5.3.7":"2020-12-04T11:30:20.620Z","5.3.8":"2020-12-12T22:51:28.217Z","5.3.9":"2020-12-12T23:31:44.205Z","5.3.10":"2020-12-13T10:23:24.272Z","5.3.11":"2021-01-04T12:30:24.704Z","5.3.12":"2021-01-10T22:30:31.764Z","5.3.13":"2021-01-14T09:55:28.983Z","5.3.14":"2021-01-16T14:03:53.462Z","5.3.15":"2021-01-23T12:40:23.019Z","5.3.16":"2021-01-23T14:53:30.298Z","5.3.17":"2021-01-24T13:30:18.687Z","5.3.18":"2021-01-26T12:36:03.542Z","5.3.19":"2021-02-24T00:02:27.169Z","6.0.0-alpha.0":"2021-03-06T11:28:32.177Z","6.0.0-alpha.1":"2021-03-06T11:40:21.370Z","6.0.0-alpha.2":"2021-03-06T11:58:17.507Z","6.0.0-alpha.3":"2021-03-06T12:01:30.322Z","6.0.0-alpha.4":"2021-03-09T07:48:30.863Z","6.0.0-alpha.5":"2021-03-09T09:58:00.405Z","6.0.0-alpha.6":"2021-03-09T10:35:15.882Z","6.0.0-alpha.7":"2021-03-09T12:45:54.343Z","6.0.0-alpha.8":"2021-03-10T11:09:46.679Z","6.0.0-alpha.9":"2021-03-11T09:40:53.449Z","6.0.0-alpha.10":"2021-03-17T16:42:16.734Z","6.0.0-alpha.11":"2021-03-20T15:39:00.774Z","0.0.0-deprecated":"2021-03-22T09:07:09.427Z","5.3.20":"2021-03-23T23:29:59.645Z","5.3.21":"2021-03-24T10:02:26.618Z","5.3.22":"2021-03-26T10:54:02.180Z","6.0.10":"2021-04-11T08:13:27.766Z","6.0.11":"2021-04-11T08:16:55.403Z","6.0.12":"2021-04-11T08:17:32.052Z","6.0.13":"2021-04-11T08:18:16.119Z"},"name":"react-three-fiber","dist-tags":{"latest":"6.0.13","beta":"5.0.0-beta.12","alpha":"6.0.0-alpha.11","deprecated":"0.0.0-deprecated"},"versions":{"1.0.2":{"name":"react-three-fiber","version":"1.0.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"e881853267b0f693cc0f8562c75a84b5b2360fb9","_id":"react-three-fiber@1.0.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-EZV8wIE98u4qjmZ+1rqYBto815Fui1z2qAKpQ8/SnPYY7ysi0th1zfk2t5AmzfhOUq2rtyHI+XvsmQ85N9feSg==","shasum":"3c7b94e37a765cfc2b8ec9d4e5ccdb7669e96742","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.2.tgz","fileCount":8,"unpackedSize":230977,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdVS9CRA9TVsSAnZWagAABFkP/2fftbUwYMkTuN2mjGjn\nNiaOQnUaVw5Unyesj2CRNBaCoa4hYDvTZfVdYDATEULNvtbtZfZG/a0U9rc+\nhhSjcPdzt0I5ekxHr4bvualjlA16g6Qr4se9VJtRbH8bZaw2EZY2Pa2WDvuJ\nExtJcqSR6yri0ah62bpLw6raB7vJe5YTHyzNc1eGggOuIHxQoicQR1izGc4p\nfep5rk57bvGllawg0uJm2SShMrl/zSAAbjNQqv/Eea7fY14ArUqsraFEwCoT\nm83Na/Gu6zYyGsIoStW0KwYsfv33ql5n85YTJhdVMQQGq/Dz2LrwNpwCyCKF\nq6iHLXMkaWfhzkmQJKgX/tXROuTLtvmSZ5rQwoGaFaSj73hzWBIz85YUFJq7\n3tBMd4qsTJZmGkxR00nUR9cSFcYS8f1iT9F9IqYtZoA5T3nghha5rgdzjIJ4\nipaG74t8qLEfvYdoUWG4AvLtXOfd2DG19uObp5r/E2uc5Y/GVE8OpQ0Je9/M\nsg4q1KyXpj1y8wB1uuMV8oLhWVyqtGLsoRQLLg9Cm2yUZDFf6igJOva3OlR+\nrqnyvjkqbZU7f/OGRYb5JC9VpU373IbJcbWmBBOGkYo3rdjrP2axT2VaCRl5\nZfJP8SUGGLqTKhMBrS1KI5TpQP2p0/aR/uohD8kt0KcardK541U9xASE/h7E\nijBi\r\n=KMTE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCNtYT0W6Bi5+sMvgIgUCT2BF36AjyGuyh7+/w3oB/8xwIhALLj6s7m9PSlj8paMiycgppcCAG7ol6oSzGHgF4/kLF1"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.2_1551193277227_0.40938871957503364"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.3":{"name":"react-three-fiber","version":"1.0.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"32b98d95f3906f452af3ff5448d42190dfc30102","_id":"react-three-fiber@1.0.3","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-NW6O55ioQR1Ows9EFhgjcKkk5tTJFEpbbX7Apz8TrGnPdTH8IjZbPzEfRT4aQgUk1QitnP7XddcyLvJKapp3sQ==","shasum":"9820b898d6fe64540cd6fefb906e69e24d62c42a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.3.tgz","fileCount":8,"unpackedSize":233304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdWEdCRA9TVsSAnZWagAAP1gP/1+CE0141QzwCdG0yKiX\n7FxTWWplJ/K2bChBuLwPZxT3bjA1w9uDAZ342WP6zYQsNp2eDohCeIlh107Q\nL7tH1DJQ715/FiHmoCP+K9lHKZagHOPeSAPc3F82hSlscn9pJtcMqzC/dSYE\n2EL97J0xs2DsnajSGttKao+rlLffzNrLsbeLFh755fMSFGIzsOOGSsB0bnjt\nl4tg+U1k9k77xytOIXHN7vP8phq28o0JQqeYDFsJECY/RBnDNjRZTA0qqeVx\nOLB1yLT1vswB57xV6zJYTJNKsdIIzKdAAxJ+NpJ7dLYJoLOefESkSTl3JxgB\nBZlBpo11imD+DXnSuklwMv4REs9+ZwVCC9Ngzv/S2nCeLstDbCjKf+uB0n48\nQfQ6J3+Y7qOJVS4q4i0k9kuzORjP/nPXHXcYKjLK6qLI8hSCNpE7ssxxvWmI\nh3JXc37FpyXZ3yWn82ab6eww6WQceZPeaRQoQ5otWQOkenI+r0KAIWDl4ce2\nNnAoleSrFNMj5NB2qarHxRGb0mrXoQ0yE7JtIh+Kk1TyO16w8R3SP6i92rkN\nWMaB1LqtEmKavw0n9CCUWwZ4z+F1rnVVWvp38qRmcK3aBPcLMnLzJYEG8XLm\nswykOQ62co/mTkxx8b9zVitJShDqMxNRheUDZQtgduGdNpR9CgbvuoNv99it\nbVoZ\r\n=OB7P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAG9Z+n/UWXh9T7EePPjBq4VYqlz1+5Nyn6n0c+pqL4jAiEA1ICBuKAJ0Lybk8aj9evROywzccpTBeRQjNVf2K9uMjA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.3_1551196445211_0.1856473032731094"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.4":{"name":"react-three-fiber","version":"1.0.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"4de77ca41ddc45502bf1d2c1d41a8a8123b0d86e","_id":"react-three-fiber@1.0.4","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-eJzE4R5vS+YPEMy/IEy9LMBdgDzHpm43GrMTGztdlnmB3kfqNITyN1eS+2HIWVMhGJWLmwyZkWmX2LKd+OUogg==","shasum":"2b4ea661db5dfee292fdb1e8b3e03ff36f05d775","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.4.tgz","fileCount":8,"unpackedSize":233304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdWinCRA9TVsSAnZWagAA7/8P/0l3VuF0KlF3hdtl8gml\nvqoaiBdr7SILFkzvaYYFWWHWOVIJtp9kZJHSfgZDLs6/MNKna/C0oY9Tdn2q\nqCDlDGEHV0vrLdlA6g2oQbvLvXj1hVTT7Il+xEsW2W0wHXxY12G2IPmmFWnh\nJ4AGgi46cbXEwNkZ1Ft5A4KsEsdJWl61Xx0AfSeV28YSCh9PxWhIEcKf9mnq\nO4sAcDi9AKkYqE5hV44DLMfFPIUIS297O56DKrbs+RB0pgNSSWdisNEd4k4T\nEmFmTqwdpLTTXf6FBmAqzDd0Gu24Wx1zqNqbCHd/ssn7shsi9EX8OGp/0WZA\nIX8sqVP90vmgbq3CzhP0JE+ZymtY+5+lROacSoFqS4WS/PDrhAbeK/g7gv7N\nVx4W+8DpBudTwMlBgt5GQDS46DWdYdu0pw/ByvIvWVYYsc31z3OFMomNBFfg\nFOOOoVFfHDa3eRqZOCB18JQo7wpC69Vm+PkBydJ7JzasyzHsoOPGyR2zwx+U\nteALPhKVtefEwAbSxOocRjG/stqlJM29Hr+EEfbDwzFxQn4eWvEPudWNX5PA\n13vQkLZVkPorOaYA4YWr8cA43ir3aProYCrvNBS51zWgbX2gA3ErCFsMwQ5k\nog3XpzvgeieK7CVh1bw6Ot5F3aWxO53YjQhGJDDGfvFrUH8qnmsKLnnF49bK\nLfYA\r\n=wbVh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHE1o7r/QOyKHbyUFHd2BVaQ+Gao5rb33fytiqZb9v+XAiBxpT8FS3/d5KSCtoHZH0+CLFDGCkkaqoM+WXNIvrtxLw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.4_1551198375172_0.6623210118303853"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.5":{"name":"react-three-fiber","version":"1.0.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"eb6de2295d9f516744089b2254dc1f9a714eea4e","_id":"react-three-fiber@1.0.5","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-WinsPaRvgmjzwgEXlQ7bFsXcsUeInAxC/GKqgIAPxtt14VzIfcOP5Izf1f7s1+7QNrYbQXNpeAJgHTcGFAjNPw==","shasum":"926ddb4a5df76d64c3100d96afcd93e6dc5b0caa","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.5.tgz","fileCount":8,"unpackedSize":233652,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdWmWCRA9TVsSAnZWagAA2qgP/2wcdZ79WlA7c+egY7rP\n4Ux3FT/+y/Hl4rgPxAdUadzCSDSB/1lpZhrL6pHwBZiTRpXmI14Gs2MagGxo\nklPIx/MGL5af84poUaGuFA7fRwBGQC+Qlh//61PReRcfMJbvwcjRezam4pXf\nOBbQEf5c2QKNCRLjVx0qI9NEuCAT1R5aFc4Jr0LbegYLQ7XRLBZMhNdo24i1\nS33NTDO70NowzBs5OJIFGVTJKkk7bs/7NrM7ZwJsrsMmv2XVjf71poJ4VN+t\nb6ZBDOB+Qgp4wbtblwlDoF6r0im0Z1KLjcgm0bZ8etj1BX9nTC1lh3JXcCq/\nBtE768DCpmJW8zfhQfbcIP2qvsf92ulqJyNAZk5sOKO8B7ppeNELATzBHugG\niR76MOK01w5834w4Q+41LluWw1CfRgFOLppDXG4YbrBQD+qgCqbjJnEx+Z3L\nwVQ6PyzmEyT7MXhCOzOdxAyjmMdpvLNibwsKh2lZ1Hq83ZrZNQ02WP292Lgn\nFPf0kDtBYoO0ubRSqHsIStongQBk0V5LDSw3tVzvuoFz0008VsHOku1d16kf\n/u+zbdzxvgV7a98xbfrFsHz9IYF3NpYHDTRun/E9K+frFgrRhxG6DnJqNu8f\nshJpJAokpY27uqd+cucP8/lxN2WKA8gVqMx6SCxS6NEVmO2IvEPVV5R7U3Lz\nArVN\r\n=1Cn3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCypwx4fIgoxEuzWDoNvKPxJXuzf3t7CduMGZCkve83SgIhAMpGPLYGmr//fxyHI/v01TWf9dcLPAopLHQM/dDyzI8i"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.5_1551198613961_0.8923017099558308"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.6":{"name":"react-three-fiber","version":"1.0.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"5f7d6e0507d811cd4552e70ddf971c72f69f8eb9","_id":"react-three-fiber@1.0.6","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-D2kePK46X6TkX1unHyUxI12mG3DljYcBk3E1euQP5c3TZEQ9RFNto+8z5fIMfx0dArHHpLxNZL7fo3nggl5fZQ==","shasum":"0f911ea0e9bffb170213b8376762c7ba08b97814","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.6.tgz","fileCount":8,"unpackedSize":233615,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdXLUCRA9TVsSAnZWagAAeG0QAJ3ji0Rnu/aFFMu0UgmK\nb4+ncv1R5BfcEZoqTIbVT13xf65VZphAi+ozH1F3fpH+SptGXDE7qCPfhQB1\niuygb2TWPmdqV8Yf6EotGV93ivquHNGUHPHYPgvMBpL9+ZS4Y5sfyiZsEsqn\nnDG/ntcqFc52lHScYhMcb6DEZh2D7OfnbjCBZip+vRJcQVtZ9IdiV3OHgeKo\nbpr5YNJpuJ8lVxESLwE2BXb1RKQ1DXM3BRQgV/yb447uwSGltwkAjSfEDjdK\nfU801dDUCWFou1fnmaPWVQU7vqMGD5k5iu0PM2MsRKU6XprapUylvMKHix3S\nMr7hn4ViHOOK9bKTFCvUhJ24qrk44kNUYHFuh+i101AMeON7YEZl9LR/FNym\nWVoPVfRGLO4n3kPR4Cfrf6ZdF1++TklGy+0/fZB7WiYNKpbPULd8R+yM7/nW\nFJrPhWLmL2mrz1NwSQ/5NZN0+K/5AK82irKe45Ztwv5X16faqAL66Pq8oNCR\nWlpMswntQrRHwuUvq6ApTXEviiKhUOMaV59aUwz/AL6IfvBKICwyaBXDAzMk\n7Htzjzna/Olil0nhYItTbkMsmPiZNy40HnDL+xqoDCEoFstimNEEOtRVZnDZ\nKWzIP8lFh0RddeGTf10AaK+cWOyYo4WLnIeXqsI0gVikiL+NKWRuhhtY0PO5\nznmv\r\n=riW9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBg+gc9fZcKgLZMWkl1h/IAetSOF8pl0cm5JsQzfioSAAiBMXS3sRzAHeVv1T3T5smdleesmS6nZXQhVt9Kgh7qnTw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.6_1551200979493_0.9151400729616028"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.7":{"name":"react-three-fiber","version":"1.0.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"fc1bba3e1dac9ddbfdafbf4fad753a2e54183b07","_id":"react-three-fiber@1.0.7","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-dtBIURVsdEq6gxoJ6bZgmqtotLSBiUu+bVYPvt0d33asczzgdcsuggUlX0g5b1AnmOVaS/6y7prziTMTOCxVBg==","shasum":"861f3b3823c91476adc00a854499f9b9c152e4c8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.7.tgz","fileCount":8,"unpackedSize":235472,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcddGaCRA9TVsSAnZWagAAQJMP/340WvCoao9AiyJPFzio\n/GytXWj2p4KL9BZ5R0Pr88ZupMxr34cCSLseYEvYp50elYbUtkQKP6XD3qCk\nz97vAypJtS0O1L8+asFssQ0QK4o02xIBM5Dk1TMH2w5lm8ogZ5q4HUCHnmOu\nWiKHAhBWGcoOVoJps9AScgvwtRQlq/EbF5B8YhUgTTMYvDuosP2drmHXQWiZ\nmALouSoxNTmUIBO2j0L8RqE3xD19xoVjRwTNi03JaKU5egCadnOO48fV8uZD\npw6QZBNo6W1drb8XzZ0k4WUg7rGwFxYfNm36ZwxSOYcPJSnkz9m1WfuipT+h\nR4mqIkcQM2NdhZksEh857bztr0W/EAHnE5FABaTOFRC3IlV2dup51u4Ug2df\nYe3YgEn1R+kPyMGTfd51oYdti3b8bX3f61dIR7UQzDHWjyhNv9YvpOcQft49\nMrP3jPj8f8pvYva8ffb/Y8AvQaRbpF7hPTLOMjPKMGEPHW9Oo/chUQh89Ek7\nr1PLjDmakoj4gdZYofnN5RPVMAdXM/0phuubZxZOrDGC3CIy0Iy0ainQA7CC\nehA9c2459U6F8VK3QN33S+PQA53n2LnN/nxqeOwieK6WNAjW8w3jmAqU6WdX\n7SzXxoyEj8EKN10k8kK8QKaKrEbxxTBVCxSix5Xx/3eRo9zocrkDoqqXN6kd\nHz1e\r\n=D26W\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSz7Z7ueaT0xjHTEuRncKcSB/hBGohxM+OehDA6XisNQIhANChIOyTZdCM+Tqe/ER8it1IzoTHXyZoufkSuc0SY1z1"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.7_1551225241570_0.3877583113877492"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.0.8":{"name":"react-three-fiber","version":"1.0.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"ISC","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"732e024b147b14fdc80fd50617a17909b626f589","_id":"react-three-fiber@1.0.8","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-Dn1ZB2JTf7bWt1P4lPicrNPysz3L6O1jROays3QptdkM6rtLqQZP2CPDAzp66N/Md/aYARS2LFEmNyb+9/qaWw==","shasum":"1c4ac12832ab4835d3126d962ad3e08263610865","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.0.8.tgz","fileCount":8,"unpackedSize":236153,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcdp1XCRA9TVsSAnZWagAA92AP/3YxPif/oo+vBW3jQSgE\nSWvvv8E1khTXKi7zABI8eZrVtRD1IvArQvRexfe515yxdiONCFNlIi04Fu+5\nYXb9fysVJECNaEof/HSu57ZMzDfyd+coKUxptvjibATp5eJoL0JzGgrh1mR+\nEWo1wVjf//dTZOHtiQj7YnAVh3fQU3/eHRUozmu213xB/Y8yb3opdEnK6a9b\n+3F7zEUC/HJCt4Yb49dqwzRoAgEnnfLaVcsa0317EFBqx/LmW+6pgqpmj3mq\nY0j2oJPlCKJrTG6P5k+Vm7CltLN55shiPz67iqkqgml44E8GkxyyiYefKpQz\ns+f63cN5Qb/PEtip3L6fnZq0YmuSXNwRkqjrbSpaNevYfBZpbDvTeKgR9QAz\nmk8JkyXuWdxSZjXtIKXlBb0k5B6Qm/ff6W8lyEA24weh5V0i2yURESGpq9IW\n4wnfVn0FJmFWl6H6Wt9cFkcI7jNJPxeIgIiPajAgHZpwxtiVKZkGSdgyRNhs\nQb8e+CgtBplSnHbRgo87gEMLWL/WCtQIqJv/6C13rIHHTBMnbsGmT2QMRwP0\nkqMa3MTfIDbRRkE1xTdBnJnL1+FAQWbTBcba+g95/4ZOsKCPLTO1I0dgwHor\nKEpfe5HWXAxeixYuSBnEjA4mjIH+f4Z1tUfZ432F4/3Le7br8U5Ylt6v0uys\nvWDd\r\n=bf/w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDxBwCF/cWFN+LLyOuT9Ke0PqzOQqQ4WVp1SvImeYpVnAiBnLnESFDxB5xVO09tvroRCgKziyO4e7UhUw+mUZtqA2w=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.0.8_1551277399170_0.937198316597704"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.1.0":{"name":"react-three-fiber","version":"1.1.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"7cd58f94eb45b95d89839c70a19dec131167e04a","_id":"react-three-fiber@1.1.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-uje3os4tIYYckBUxr08GUvMMWUwzkkCaATMonnzkcFYs4tY1/qvTEAfA21HcRvMfMrg160l3kb+BpIKec1V1Gw==","shasum":"99cafa260d897eaf3181ad8435bbab996ac92c9c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.1.0.tgz","fileCount":9,"unpackedSize":242078,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcd7G5CRA9TVsSAnZWagAAA0oQAJjDWRqdEbCaF73iCoIZ\nuOjEnU5Y7xpy4HPqnfEQ5Zhgk6rjrRdzJm0AIlTJYBVkfL3erfTV8OUpmJQG\nZwzLDhT7qQjyJrhvuzBitAhSYnjS19E46gwS2op6f7oUoc3CpW+2JUWcNgbf\nxkkb/uvvyYcqgXiWQf7bObROuj5VdkePJn0I/b+Gx9r2xUsA+Eb43dHlKC2A\ntQNrTzYJz/34EVqXaNSpcOJU08BOf5tmX2GXOcf9RD2QsiO/IwS5rx/O6QRk\nFQ1V1Oi0Gwg25XL0cy+I7BMxhcXVQtnziCgHt5Qd2QhANBCkpH7DoZKx2ae3\np601HQTjBav6CDHL4LR/9hmCMhcmdKU+QQTmRUk31e1C6H2gwmcYykzkmUZ7\nZQd6TPCE1zFM+RUp4gPmk1JmIOhudaHmJwA3ry/ifLebADVZT5CKxwJ5MINa\nXpQkVYzHu/kytKzzzsYlNj8W2E/bB7Rn4VhKaAhKQgVnHRrQ5wdpottGu+sC\nsUJoOLEvhlM1D7u0NfDgbByHOVZHi0jNJi/05wPFV+xdhcsYSftq/nUdT1nL\nTeqFwm3JndY0MqF13VLcA5C64xior9eHPc56jDqKFUOHS8BxEHr6UDvLCaOg\nCd0ezcdd9K6JLLnlP805ZZGj8+ZG4iuOrDhlMU4in/yJD2clPA0QFPywyP6p\ntnX4\r\n=6Co6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwtyg5liXYfGLBwGCaL7aMvdSB6KTB0vRh2Wde1mHCoAIgXZ56gQZhWyAdPIsoNr/neim32hNNI47S62K3LBpgPWo="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.1.0_1551348153297_0.8165275155341654"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.2.0":{"name":"react-three-fiber","version":"1.2.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"887239435710f8a9b1ce639118776defcef988f4","_id":"react-three-fiber@1.2.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-AnwA9mLuoetnvneWc3u8wGPcls3DEABuZHyqa73OegGb7OxesMotduuD0WOdlATL0sRioxdW7RNBCJepJTLZhw==","shasum":"b763330069a6133339b242581b7f3181927a9cdc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.2.0.tgz","fileCount":9,"unpackedSize":243273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcd+6VCRA9TVsSAnZWagAANE8P+wR3c2CI8gMkJY27kejF\nnWEApjbOtRhN/d0NCY14Os94BL1slOCKyNRdTUca5akUE6qMgYd/IDvBLpfM\nSgdvf8lXHcY0FjIqCRo58Wf5pLDoF4JwJCy40IseN29sz51yFirPUIOhq3Fl\nWLVoWfJvPSkaxXeRt2LpUocViRGi8zCz6FYyK4DQNS2N7hN/LZVX6hI+P1aM\nKFjq12/X6QmL/hnb/I11geeLMc0zweI0WijHEWx1u2L8Zf1P0NiZIRMdEe0q\nMYMpGYB0QTxafwkNxDgzgJYHegmRAcYGMpl42fV7s3UDGsgn++Kgj2etMoif\nPzbP7sBHpyMLfOBU3M7JmZ41wNEJ7M/YCu5W0Y5XPMa9uZOMvOMfkGa5J2iP\nM8fAQTZ24PKqZTv2ylmPKeja97aqSmEQEax95bUUontz97ehqY7b8PSJ+0Mw\nqvzO/vmvlqtQ85kEZCLEuQDE5Ibqdv08y33GiQEdXP+AscsIY5R6nlqjmlyq\nYIz71QoYNn9yxYMnbHpqv06vjfw0v4zSArUsk7Pftqw4qWGXcta02pQAY9eM\nOIubxEXCN/6bw/0/Kks9JXoVe3FJHF8niNi5i+lLbsxtSPCzMuzJgMmN6HFK\n6Jc0IVjYNdsaPvXryzOipaj/GWqJPPgAGRQYPJPSy27xxk8gHrn8h0CqPFcv\nmhwb\r\n=GZI+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSDFplvtfH/U/AYfUmjbPOBM+Zjhmk0DzmGhCRdoJovwIgf93zEnwRaC21rdElQcNiOltoiC5wZS7sfng1+d5PpWs="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.2.0_1551363732513_0.3445567933116933"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.2.1":{"name":"react-three-fiber","version":"1.2.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"2a1cd3ddf1e4d2ea1d4c84ee63c7231860b85e21","_id":"react-three-fiber@1.2.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-VBUYZKmSajSIB71sYUO8RvA10OAErwXp1bd4EMFxH2oic6u4qXc0ZURzg5Zu2/d3OxRR/BpO8EQ326gSQXEQ+w==","shasum":"94368d2c2d2e0408c920f0c1bfc08d98b7a5e4fe","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.2.1.tgz","fileCount":9,"unpackedSize":244357,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJceFcxCRA9TVsSAnZWagAAUMsP/Rp5fHgs2nNBrv/wBrMu\nbGFTacbgiHgRQaNdX3TUKNTJajpnD0ILV/zRb5rydiSL+Dtuu9Dqg3pJP5RX\nsh7UnG/3igr2pjDPyqzGnsWc08OwU6f7flYwhljkfLezaRhLyMRzHEnUUkPA\nkKjdXnd4JKbUWvDa/GUAp+VGNvdGQv9HVBtbfT7zGrTh8wgSYKOMYbq4xZwm\naEgU5zJygiYUp9nf7U/XmnPi6/j4JVqTXwb388qKO/d78jmmlAMS66k+tFBZ\nzCpeOd7Vfv/s5FIOOqPg3GlUIrQWVTW2id8XdOy2gAmIiWLnV5iNUp7bibaO\nVMMXUj7uQJp/WQP/dQXDI960V+NsOqLaUXBKe7FViBkePHxesJ8xK4zlo5zI\nn2rF1dDAnUa+T5Wo10k7oKK6fwPwlq8FVfdDfTtxb22M/eo9NiGUsthN98+z\nljc3kS4vMbFYoiiub7b93MhaCwx097m44YI7XbvY6aehBaJsNiFTEvok1u7b\nXYUz2NAQ0FI02rvA9d0uoDEyVBTWNDaXBWUj+IUFbVxQt0gfwqOKwYTPyyqp\nUrs54k6JZVcP+RaswYUyZT0CYqyIrB8Bvk9Dn1p3CpPa898OCoSjX9JA/1tk\nyFusSt9bvmeVf6zo28ML9F7ZR/7pNPfU21q9KudGiYXv3eMY6NgECK2zGHgy\n3uql\r\n=0gSE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDq03JV/lcrCCbDtd/qQg8Hgs0jq8FvrDsp8BokDl9+OwIhAOHdJhdbbvjmR6mPXpdUZI7KZnVtSX7lHzW7weo1J6U1"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.2.1_1551390513266_0.9385527114105681"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.2.2":{"name":"react-three-fiber","version":"1.2.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"e23083fa120d40b39ba12dd7613c81cdca7feb4b","_id":"react-three-fiber@1.2.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-U/nmpWeKeD+VvC0NlaLl1enypAerDFJ8Xwx2FXsm/bPBMdls0Oja98lTReM5CUBZlP6M4MPXB4HW794qgTnO3w==","shasum":"a586aff2ecba015d5aa8c972c8b2787ea774fa49","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.2.2.tgz","fileCount":9,"unpackedSize":249914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJceyiXCRA9TVsSAnZWagAAliIQAIbUdEM66svW90YsWIND\no5zF7Cj+M5M6Qh7uFFEld/0DnDOgwUOhkCsvfUueMjzCMnOgq6yDuwuUGOCg\ncoJuqof1ImjNYj7jgeBDfyfIgahzW0Qk8SoBelf0qMse7aPdZ47cvjyP1GY/\nhJY9Uv/1fPpXMtzDqr8XKqNgEzfSBdxzmOfw/Xr5fEAcNO39AO/uCMa9RizU\nfrVvv8k+gsP0AVobAe2VWcj7bN2Opdy9LffH+uENjiC8AAPPlZzU4YUnVsZx\nEEBGjLd8odabCxJhWK9NeSa+KhSc/QKSrGFRQe1n33Nntj1JMahPY8Adz55J\ndCqZZn2oE3KGelpGljfADv7miz0paLAtCMuxPzASUnX7IqvOtCVuok1QdROF\nw+E64Fs4VkWC9sAItbHmnUostr7GVVGHMx20/dKLKC7UFpBGlPIfn3fSTuiq\nFXpTLgtvp5CMwDfz65szv+YcmxOTaGjAbPe6CTgEgFuSdKChcHmHIWxtnuXC\n8xeldHbP+qeTuy2XyF2Z+rVrwu9ExBK7S5z6PWPYD617WbEFLNVGYKlnRYG1\nSGq/NJH0fkfrnTVYKAMljkC8pbHeKViWpZ+qPCE7jjTSTJV2NoLGXUO10SbQ\nqLBROWHAk8hVePGMXPraNijG2me2hAt+kVjm34f8cw2x9vXD7c9Nqh9JTHbm\nccLq\r\n=s7cb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpYVMAqsD1AAp18+xZ28MIuJLYBtmpIwaxgpyDMcSyhQIhANMt3kItDsxI/Uf+s6CWFvHMo2sGXOmv4IX/8IaFeG7E"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.2.2_1551575190970_0.69917530202525"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.2.4":{"name":"react-three-fiber","version":"1.2.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"0b9cf17ce8fcf71678616cec8b972e3a6e58295d","_id":"react-three-fiber@1.2.4","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-rOaNFhbIVM424zpsyl2KyhqlTPbog2PKO0KH/nt8c9ut79F/eYyBhvXp4LlSsOKjpxHbNMwIkKSRb4lrJ1LQZQ==","shasum":"3bbcd322b95d979102e06f82d6e79b2aca48948e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.2.4.tgz","fileCount":9,"unpackedSize":250460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJce7+LCRA9TVsSAnZWagAAkpgQAJh/WfC2NTnqPd1IEBps\nX9oQQfU6JXVZfy85VlexfX/mYkX5bWvyQHuLzodW9OcFh/z3JV1I1HiJUiV7\nwDMhyxfn8l5etPq7IVjLa4a3+ZPJdOfIrwrAJisbjelK12HF9BPGSQ0i00jK\nXmZbYDAXvB5LvJQ7rsvN8Sf7sqY6ZQ1u9x3A+W0mFLh+2QAXgyYG5NsVPnnW\nSyCkxH0Uu4ku4wQ1niKnRrv9lc3v7W2lF0cGNBCAHG6RZfGuz+Il0C0Sqq9T\nOkNXOrTPRMNJipoxv4WxaueOipEFLewhE6Ww6FMTsQA1eDIZgELP+aPokJTO\n7Zg66H5YCoacLL0+3OyHdIc5uFoigRfx5xrIvC5UmcK3kfiGbHTP2GGJI+ha\nvvqMClzq1UNv9acQnVDUAxCeBzDcD1ArkSH1n939VfAHRv5BcDDG56T57jFa\nxh59rorouPSZLu2AtTwI6iFlqvUJrPeY4hNcSU4Tq9IaU0bbXVGQZlxgYwzb\nQvjBiE5ryLOhaThTfPf9RSS6dXGYWjO9IyM3QfRVkfjT59ifoD04iGFH2P8j\nFPNOfLEkh3gC7DJGjrX86NpvrMBMHSQfcno09YWl11JwYTSuoxd5L9SnvXTe\n35b05C6uNT1psaJuBcKRA2sxCDxlt55Bnwi1WKl0ccBmVlZlEq0ikpyHY2oP\nXUil\r\n=w8WU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICYBo8bm+vaPtEsBfAKUQSJubR4i7zPbOlEg4pdHXMIsAiEAiU0LOX60+bXINpb6chv1W0OYiYVSFr4uM8kiECd+trY="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.2.4_1551613834856_0.39227924208105325"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.2.7":{"name":"react-three-fiber","version":"1.2.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"842806f923bbf0f136449343b50f79a48a55dcda","_id":"react-three-fiber@1.2.7","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-PoV7qvYC128ggxT6Q3LEXnqsUkqei2z4y4AKjUspgUkvd/6MBAi4QJyoenWPh/zfADhoZ800kbbLV4IITDnmsg==","shasum":"e08099c31b5b6b167525f6f7e471f85dc2006499","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.2.7.tgz","fileCount":9,"unpackedSize":252998,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcfPKOCRA9TVsSAnZWagAA4g4P+gMslxMVdm3GUGz3STmC\nNRICzxfqsrOaU1gSyDrYMhvZ1PSu9+o0sedyyf23ItArhdBLpqXevqKGOIHk\n3aMRKYNVTWL4ufwLCQioboIhV0ReExvxeVTubRo+m05sw+g20nIsbz1ummeA\nXCx43NqkJXjQtimhttzzdVNGf2X4Q9EvBMIq6ox/SQD87ZtLu76fkXF6/gRD\nMA4VNbn1b/c7j0UD0G6qrdcJo4Pp+pSJrUdZ6Exbyi7q7VIWMoORkLuqKAFu\n+x1dsNKg9+GxnMIXQNJnrz0M/Cq40AaYcvSIYRJGIJJOroqmFNQNCJfy+/xg\nmTnXvx/aumMomKy6hQxj+h88DHGEyuz+dijy/7GZVthSzVZ3Jlw3BdtDmis4\nm/zNJQvM9h0rmrNYe1jSnvCg8g0kpV4GhnDBRaAMoc867/4u5BqeSnXe+KU0\n/unK2Fj2U1X25T8PXAULW4KFBIa7rkA6JTMPydqTm5dLh99CMGuu/N3oZP6/\nVNRw9LkcvtciQ/O2S9JQ4U7Pg0zgIL5LftNt/jzt8yma5NUKbSsPu9N2dFhE\nUfoZmlmyJ8pNeycYQ0l7ygZlnljUgAYrIywAU3nSBpqAi5Cuz1jtmity+fmH\nvKcEj/BPSIzl72fuZeikxqxlOq5Ucp059/HLAqobiPh1tiVg/TbHAJCzPEpy\nDnEn\r\n=dPkO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxjYOdvjFjZs9BNMh7K2+BOo3Zh+jak07wnTPa3n3uVAIhAPAtS0QA6nhckReKxULFvpZHT2hk0zU6iQwMLu3BXWYs"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.2.7_1551692429729_0.7844413715792264"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.0":{"name":"react-three-fiber","version":"1.3.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.0.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.4","prettier":"^1.16.4","rollup":"^1.3.0","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"233a38ce2d895d4ef3fbcd6955350d4c4635de6b","_id":"react-three-fiber@1.3.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-p8i6Nmgw8ThH1fzyTTR/sLmgkFpHabapfNuhkiS6bKMKuDfo2SxkGKlOeZV0vzyNsRrO8DfBYKKHA0/BSVK7dA==","shasum":"10cc43a5436459c045d484602286878a8b96a3a5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.0.tgz","fileCount":9,"unpackedSize":254296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcfSbvCRA9TVsSAnZWagAAW3sP+wSKY44KZdQxSX12oO78\n37o/s9G9L1p8uiCjtJ4CXAsh+RyuwO0a1TpmvzaVRFUm8EcLCYxUFUDBLfN4\nKfBu8UZX5KmwOZgQc59nzVipEaZwfFZGk7ijMMXogzhcM9rFF83BfbGwcrSN\nKyBM69Gt1VpOQIfBHHezeUR9h2MqueT07bFPQN1MFswRcOVJONfozEbWXP2U\nIV855uqbaAguEnagLxKuOwcjLZyqc4D5Ztnt2INE7gktk5bR2ffAIwdwJOCS\nW+COLINwCE770LjQKdVQ88Ar88fWXOLcU5KoC4FFQ2GziA0jPHF6bHlIl3FL\naHXbqF8iBbV+dgIS4k45p3pTmYhTpQlQ2pmXILLe5fhIpktbmR04y0ZWl56p\nrSlyvE/7E3EaCnoEtGFv3VWPc3gAQMpctA25cBZlccGctrSsJhsLa06rV54n\nTLkrt0iuO3An3HS4t9+95t/iaTyREOUJbVQ9WolTD9dWAQsspTdXR69Av3Py\nTE7f8o1vsatBEEuw2hOeXdhpPJhlNlBAIt84+hlsVH5YufnUAKb9SfNWtvMJ\nBwgp4buMQ1gAf4kPhAdNoYE7OeBCTLLg1k0NM4ys9n4o+Yoky1ZTinauDecH\nH+vQdE0QwiOsJvXpGpFvqrFnOaeVrkgRZult9rynvlipH2qJnQcvj4qGQbKQ\nHq4r\r\n=XNFk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMzZ81/JHQj6YO+mG5bY9TVxjj/cdAtc2sphYykdKcjwIgTuFvbFFyR9TC3Be3nM6OsPrQpEnWzwTRaYHODOXkjHU="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.0_1551705838807_0.7858186418214927"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.0-beta.0":{"name":"react-three-fiber","version":"1.3.0-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, click them!</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for THREE-js. Driving THREE as a render-target makes just as much sense as it makes for the DOM. Building a complex scene graph becomes easier because it can be componentized declaratively with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures, etc.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nWe ship a small reconciler config with a few additions for interaction. It does not know or care about THREE deeply, it uses heuristics to support attributes generically, so we can get away without creating a strong dependency. Hooks of course hold it all together. The aforementioned libs served as an inspiration.\n\n# How it looks like ...\n\n```jsx\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line position={[10, 20, 30]} rotation={[THREE.Math.degToRad(90), 0, 0]}>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color={color} />\n      </line>\n      <mesh\n        onClick={e => console.log('click')}\n        onHover={e => console.log('hover')}\n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshStandardMaterial name=\"material\" color=\"grey\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing color=\"blue\" vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [THREE's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={ test: \"hello\" }\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={ test: \"hello\" } position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture\n    name=\"map\"\n    format={THREE.RGBFormat}\n    image={img}\n    onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst msh = new THREE.Mesh()\nreturn <primitive object={msh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this.\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop \n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './impl/postprocessing/EffectComposer'\nimport { RenderPass } from './impl/postprocessing/RenderPass'\nimport { GlitchPass } from './impl/postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size.width, size.height])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" renderToScreen factor={factor} />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n```jsx\nfunction Hud() {\n  const scene = useRef()\n  const hud = useRef()\n\n  const cam = useRef()\n  const { size: { aspect, width, height} } = useThree()\n  const [data, set] = useState({ aspect: 0, radius: 0 })\n  useEffect(() => void set({ aspect, radius: (width + height) / 4 }), [width, height])\n  \n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(({ gl }) => {\n    gl.autoClear = true\n    gl.render(scene.current, cam.current)\n    gl.autoClear = false\n    gl.clearDepth()\n    gl.render(hud.current, cam.current)\n  }, true)\n\n  return (\n    <>\n      <scene ref={scene}>\n        <perspectiveCamera\n          {...data}\n          ref={cam}\n          position={[0, 0, 5]}\n          onUpdate={self => self.updateProjectionMatrix()} />\n        {/* Main scene ... */}\n      </scene>\n      <scene ref={hud}>\n        {/* This scene will be projected on top... */}\n      </scene>\n    </>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"0b51aef73909af7bfa5b7e21dc3cca2ef6a6067e","_id":"react-three-fiber@1.3.0-beta.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-eE30GSiVotbf1iiCUiD41xjpNGEGNZJWeC6pyXk8z7i1Fayiz2JRA5I6QxI9l+l/XXaw/NdjaoAsFidAEKnp1w==","shasum":"21be4b08bfce3239904c6a8f4c0656ade6983e15","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.0-beta.0.tgz","fileCount":12,"unpackedSize":257965,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgjKmCRA9TVsSAnZWagAAf3wP/1LqzxeSA4azSHMMueEU\nZPF0qEu1/T9jqSabgfRmcQXNCFnqM7Pdma1uvBciKmIf4t1zBLeV4zI8aWc5\nYy4T1gcZlpn0+WgETjOg5yIuXXDOlDO8fygwLFHj66HAmhJsuJDfO4gVLxeJ\nGSeFhZG+gGgJZ9xAD4DSspgHhXHSmYFEf7SxfL0+//YjKS2v4vFfOUdm+7wA\nUNsv3OTo560Wm/2H42MW5uLuOdTjhA880066u4FhxqPd4Re08Ryv51S0KBNq\nw5B/BmUATrqfSlUXtaUyeJV6uhzhXtwfeJpYiCEo8NsPPO5cIhd/9X6owmLT\nj/tueeglTr9dDFUbWRj2Yp89vLxEQDgIrbV/G1dmqV+aa9jSvV4IjVl1rkDJ\nxZ2VpZbcAqQvYFE6D5UMGoC/hFMVtPM2p+AXWFl1TF0v7fusWUWpetiXReCA\ng9wnuZlsFmvDWjXyWG2P1hGryVM8XucdEnFCu5zFr8U+M0nkcVfD+6oRYJKJ\n7//paGbI//zPE3VKaNvJ6G503yANm0w/D6dEMVjSojBOynNRzwC/KiQS//uf\ngqomVASoc4aDefrKb5pONM3DWiUmzsYvRczm7iLP4mdIa0LHhds1jIklvNZI\nJnx3hXm4WPXMOYHUzfbgERPJnYLuURwgKOCd2/0wvY0MNdVhwU0qS+OG9VB4\nnRRH\r\n=f4XB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGS4KxO8E01JJtpeMkzMYC+qgbpwBry3dtUUnlfCsF1CAiBXsQxYu55QtdPIj8LfnuH96m/dkJpH0OdPN+BlnI1IDg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.0-beta.0_1552036518358_0.4174704827969513"},"_hasShrinkwrap":false},"1.3.1":{"name":"react-three-fiber","version":"1.3.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"aab306b33ee7e6c48346d854ce35b351293a5abf","_id":"react-three-fiber@1.3.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-/kY59Ovh45AfIrYb/LStyH/Ou6i1e3vZi6jaL7kCftKB2G/t5vZXEcLvCDYmgOdpTIE/ODuJbnuIFbb9Y98M9w==","shasum":"73ce61bb818da6059d8f84c2c69c8fe7c4255d2c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.1.tgz","fileCount":12,"unpackedSize":259290,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgtD2CRA9TVsSAnZWagAAHhoP+wUvKaj8AlES4InQBkGq\n36SNxsZFEfpTKKvg3ObiFD/8pULpvezrqABMaORUuOyIF573vz6cmEOxWXRh\n59wsQTwHN1CnO9psu6kgo+tHN9Ni2Vf9f+IGlBGldNNQIR/jm4nITlPXUOWQ\n73QfffOxr8vlD6uOCtaXM+nuCna05QFit2TSjpPX2EgBW0OS9DWoIsV2dh+G\nr0UUp9JX7bQT31F4h+7QQR4tVEppAHD7++Oeaetg5SWS0fzxbZn6RXAVLJUl\ny1S8v/XUQeFR0ec073cfRwP9xhbsaeOuOW7vfOMZdfzKRWlfgTh9unWE93im\n3zW2QSnhmqg1SY8jk+EPUlOtUp33HcG3mNsn2JivVkgaOCYa8CJH48LZU1Jg\ns4+cX68onLxAZ738FnwkyZsb9yTLUX+GLaF9wh7+vWup47zdPKqeN32vr51Z\n7Wh07r9Ot2e8AR+gpDrznaS/b9KcFFT1QM7Sju1bQxTgaiSL3dmiuwOu8vgU\nWAj+fKxLI4tatzYzwWkEjLZEyBM8XKHpyu2YgW4lJQ3qvQx2eOGuu2XxUq7a\nBzaFYfhVFGKjQEClf54dtAdv2VpJwdEJpj+pH1sm/FzIyktbv7UKpyc1QVwR\npp503J9Aft3aSbRV3m1EP0C8tRGhNn1ABkIi+HX4oggxGRRGZF/siVnlH75t\naQtC\r\n=GGp8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHeUcJuStm3dprOpWhfXBHQyIqZFjDxIchgEpBXTZMIuAiA5RRNiHoxQ6uaUN2OhixJP7tLRlNlr82ERsI2ZXWTmJA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.1_1552077045395_0.18298671641723052"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.2":{"name":"react-three-fiber","version":"1.3.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"4a5d545ab6f275c7849bcadc8c1a5336633132bf","_id":"react-three-fiber@1.3.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-wRoYK0iYsr+zOOVjMZgteqnJ7uGr4YrCapIS6Uh4mKovQ72XSkXeCQMBpK/yzT57gmJnkTOf7zY+vXfW5S9zbw==","shasum":"d7dd826d14ddf739582834e4b5adf4520ab24ccc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.2.tgz","fileCount":12,"unpackedSize":260123,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcgvZ7CRA9TVsSAnZWagAAOU8P/2g6SrCMW+ciGuNDbszk\nJePKUXyMaf4HEwwlYe0z1zq9ETSq+GNsGtIXqtdHuwaurJjUQgnIoF91DWJ7\nR8LzL4O79Nna3vV53acfTtSBCQMvberqBGfk8K4E92zAlEb7aOoZhUsq5gh8\nF+XKmN9AHZgOD8WTk4KJJzrZAEPQQ5Sqr2l8absWJly8Ko3/ameKcHpJOQsO\njQ3Wa16igasSHdEsF32Fk+LrDneybrCIytjrRBwvTMDXkc7bQZJouhw/gGN+\nhsBA/27Atg+9Bl1C/2J+AzqY4yjKe4LosyR63c7vhXmDofkgeI7Qj1ApmJ1W\nfGRlOA+U5vaKs20nZ5oPs1l6YqJ6UjWvLdJb11dfAX4rCJGwKoCSa0FjchhY\nupP7cj8AOdjh8/C51bnGncXdHDSvmQs9Hanou+P2rbB64JXOh5aj5iip834I\nB6gipkmXO2e1SOtUP8HJNxcylRZ4aMVrSw7MRk9F1h0WkFv3haWrNtAqVBao\nvqEDLbQLV07kVnp+VXAvDCPo43GJm7zzfi7NUhWqoURBh87V9dsfrDDfPYmz\n6m5uDHJCT2icgnGejpN4gXdjxJBF0ILyhfjxsRQEVPGAgghSIpwdbjzcD6oj\nBcG293M18h2GpPttwwUKfbHFyi86fsWYqFbf/n6GWZ1V6kU7+is8mwIq6lsP\nok0k\r\n=oYHl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBmVpNrYb9NXIOM71PK2WRbP5xcC14YERBiMfaX06xv9AiBOG1/FPvISLiKMIE+1qR5GfW3S7QqsqCkTudrqe6ci6Q=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.2_1552086650951_0.8329179101296829"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.3":{"name":"react-three-fiber","version":"1.3.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"415c470f33326eef0296d9039e84425e7fd6a575","_id":"react-three-fiber@1.3.3","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-cS0NxvOZcth3Ba/xGn/0whVPUwyh2bp+KECOUmD4cn7JZ439uSjXhheZbIOmk5afzheqALXdlr1104rriRz4Cw==","shasum":"c214d645f461b46e0cfe778fb508a3827d6d85cc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.3.tgz","fileCount":12,"unpackedSize":261697,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchEqaCRA9TVsSAnZWagAAyLIP/Rxr8LunwJtpXABQlUyF\nX820UepaVuGht+YwtoYVVzYwcKmXzyUlaqvz1FsW1tALf9ax5yxeSWzOzPbr\nAZF4A3N7UoZYa1QQG5RA5kN4UCOUn0xizp//P+MCwtE1ZilXzfD9RkYlCDX6\n6IYOL7SVuIfjXeYJV9Pk/eLjqeLrNsxccZhFfLuEIhNwMtbcHl7UjfNNFgzW\ny/4YhXXgFSBqdTcMtkyk1uU1YCYC3ftL4kkL3/HlFSm5NYop9FmxfHDaT0qp\nKe4Iq7QTEHwae5tdn8Zge+6hZmyrtt0CodjRRLHqvG7tUTmxiN/o6V8OxmMJ\ni4RVp3TofWy11ZINxTUpWXjJgcox60s4VnhYamC28jSYcCDmz2KbTPngIyXH\nHch6fKsz/W7cxl7OU1xVBaBLhtQiBYGNQF4TPxWzkQWeFrR8anxgOspgj2IO\nyxEI/cl+nNnGjCtC25duhPddOu6Q9xWvwYTyNTr6itQ2EejDS3Ac7MuTlKey\nsPZjHSr2BCqF2CMQj9YWFlPyrId4zKYuGDc4JRI1O/ayi9EgceXre4CjPSk8\nN4YVwUm3uFAP/CLY5anvUFS3rbnVk+HB3u+/0hQZOkH/3OiVdrJjcDOrNuhh\nXZtyW0kVzaxzPryuyzdZxkTMq3KrwHCnHe6IQuR1oOCm+Amn8WpSAFQl5DuN\nvAn5\r\n=v+Oc\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHOrTHnUGCiYeifTNujHVWHm3s3bypN2gz14zdGRSCzZAiBDjpCrOoHPVKvz58FGPx9pt1MnnZ35/vYIuwGkigDCyg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.3_1552173721704_0.21915229718789697"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.4":{"name":"react-three-fiber","version":"1.3.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"b0edbfb76c7e71dc3ced392b7b7cd6405ef0e3cb","_id":"react-three-fiber@1.3.4","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-nKFW0B6WXiemx/7Ohh8F099M/6RDY84zerfIFPvIeLwAA2GGRh+s1dF4EAkhFtuzZn+Ebtej1p3E0CtLRcw5mw==","shasum":"1b9e213a4a619c819ba1c8dec92dcc229b0355b1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.4.tgz","fileCount":12,"unpackedSize":262072,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJchrdwCRA9TVsSAnZWagAAqx0P/ArzAE2hSVZaJltZo0Ly\nBZmSMSwqvp+mA6DZtwSP/3X6ECwi5gROeprXknQv/uAtaPwCxt2WpuJNQsBk\n8pk3oj4L2I1/YcNXvSpx6pgVT9wTw2blMutt0ig1feSj3yQ2HaOLMDbmCg49\nr/tMSwDxkPlxSNguR4mC1rKbekID8kOddTWKXummzb9UKrqzGgw1R0FX0bko\nkTFfObALGeXY76cpoDG6u0LvgxCmthKrmnqebpOt1tbvNvfoRZ8sIoxg7Eg2\nasoxT062+cD3qhPz78rA7TfKow4Qlw5Xme/DYbVjHv4XHXdMAc/K95R94Yei\negeCIbJUWgjSWnfzgAwF7dKUqDljWyhK45NWchzRnGESj+u2bY+P+V+KabPV\n+RT/9o4Y9kVrHkqifQzpIduxAxdnj3yPSgDPjyGO1GZWR2j73eNQUsrkCAUe\nyflGTsAN8ZTYXy6vRw0IrlkB6V8itGrTXL9jshe+9cro7QRtaFMNWIzVDhLY\nR6XgGASGPkQhWyahJ8rbDRxoPUoISpWDRLRFSFdmh8lRHgJ4aLnWIy5YqjjT\nYzuOFa8cbBafpdjFrQkTzDr6n6v/b67SGXZwvlcE/wZMSGRfbYPkxEN+IiLQ\nrTxdKp6wp4UmpQsKrPYAikyp7uQ6IJ6no8pS+vz6b0URFqD6LGt9cn+/5KbG\nbIIl\r\n=5CE6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCF68spqUlOUietZYDxf+FFWX8LzrFEDmSxxLNxdrsYNwIhALAVnuA7TEjsvYQ2rUm8AXA4+HMjpd7gUPOKXWBObiut"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.4_1552332655728_0.9507172892106344"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.5":{"name":"react-three-fiber","version":"1.3.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"528656121614f47b775a5b4fe9528b697649adb2","_id":"react-three-fiber@1.3.5","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-jDa3Rh/sEzMUTcjyRKFK5UirN47UbWsoSeCfHhLdFC2z0SwWkHuh6ZcVTtrjthJnzQFTwCgBvFRP468op4m2hA==","shasum":"2da8361c89a8f08498ecfa83f4efdc5da747197c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.5.tgz","fileCount":12,"unpackedSize":261301,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJch5I/CRA9TVsSAnZWagAA/BEP/2YsWdfD2QDBBl9Tg2e2\nPom2Q3PJWAqnu8/tYNcoD6SzaEH9r8WlIrirT5D/FTXFM4qXjcO5XeYJw25Z\ncjyDzGAeu6pWm7WQXrYL40/7o/hbWk2we63rlW3nm+JihnlBcXQf7ERx1rXa\nwHLlpW7gdsuN7MW41Y7KUdTYXy5IYs+zyY5Uv+/MZi0ZU4d5R2t9ui5ZeiSQ\np+l8mb6qf2qP7vWouMVMuisYafVX3KLtQ03XimaEc7YoUIdh5QjEhhZTqpqC\n6TqpEudIAiHqfCEc5SqU3vRp6K+2CKHOYbVEwrmPcJqeGY+V77T+kxfctJTo\nB3zXeqj3XEieY3Dm5K5nvdlwoaYFn4Vw59aTQVmlQ4sN245xu7TaB8EoULWJ\nqsZhu5BqrhXuJwKQndELKWhXfRA/A/pWE6xnHOVlQFYjHl4fCoUNULdFh10t\nO9vhbOzWzfmyYOrIHV1mgxIDNfFRynxJXL8LP6LYVr8xzKOtehBPkE95aPu4\nMYrjk4RU0NtrwndUtvAj8TyuxIEb4r6Rn2jO65wa+MFyoafe41LsyRPQYdNo\nI/TXUUshdEWtu6UWG0iCpSlfuZPOX64bJI689W+AhoS6vsbGCdC0lrzVfCYR\nu/ojW8qi5r8Kb7TbDhAowIC4dHiayvbj8k2AGlO1xK4X290WKVkkLs92WIMl\nRJPR\r\n=xE5I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCU0Usta2KRUSHwpi3meGQxK7T4mPJH16X/tRstY03sAQIgG0pX0N+nfGuOyf78vc1e5RQ9ayp2rKvHCEBRd+Hm07U="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.5_1552388671030_0.9489048868678029"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.6":{"name":"react-three-fiber","version":"1.3.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"5a9c4cfc0a49178872d1cab1d6594666fcecdef6","_id":"react-three-fiber@1.3.6","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-ncXDH7j1EFDj1L94/iH0pZbqJ1DUPT/Kn/51+lVRFldslNfTs/iau9COw3RWD6k489rWWqDsPTO9Pe6B5WzA+g==","shasum":"6a05ad050cea6c5f5fb9061a78dcc58635433422","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.6.tgz","fileCount":12,"unpackedSize":262237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJch/VjCRA9TVsSAnZWagAA3/wP/RJNededVQqVZqSWASd8\nVxw1lCzeMapc4cRWnl05hjMOqgrXdtpc2lhyX1x1Qf0VQRYU10cLSTlpP9LS\nWTDn2fPa+XHti+CY6GWU7I1jjFSweEnkKkOd7505F1zKp3xEUQLON7QH2aKd\nf++1NUFlXyDs70DkgZwMZiuwPrW+P99QbUuZ40dijs56UTx8+xY2BKx1nZs/\nejwe+5nAjVzBjpiM+8Nz5vC8EzDxcQxlhyeMRcpawNmCjM2MLhh5beytGgCz\nB30sZL8ilALLGh/xU7ju1F7UkQQY52jQQZgCMAQcrMbUxGg3hEu6b/KJyQMb\nmvrEsyp1ycPjPVwpBc8KlW5UXw3bWhlYgGSYhtZuUYCduhui0jyP6CfnOx6L\nBY6qlA4I+aYtJewAZEqF6nQI1sE3UE34kKQfh0T0C5qv5OsAQMue9i5QPljk\nof8WYlFaQN6ye+dX1iVbTGD0VViRWyDQXqUtD2YN/1YOl/HniXEiIJ8QI3ig\nSUukGRlc8pvjK+2VZ4JlHazm/qsh4MOF9LjDq0MD4ygOYo/pXNEPm9G8Rnnx\nID+gE935hciTwieOr9KcFuYQep7udTAWRe3sIO/YJowv+uB3V1XnTyR88hO0\n9+Vp0mlCLfzCSM1n9hyHazQo6kXjkKT8+v1jNNrmKRCNGTuVJRKfVSiAq8sK\nK6Z7\r\n=usgT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDvsDzo0tOPsAoYO4T98JSg/T0S67MEyBCDYyBPL3KEAAiEA5OHGfD8PuhYqKmcP+3Nak9/a7osVmGcW0P+nveoJXXA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.6_1552414050929_0.14516136820463799"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.7":{"name":"react-three-fiber","version":"1.3.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"a36d8af674530487999077e8c2eb80edc02551c8","_id":"react-three-fiber@1.3.7","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-3TvHJczPRMP5/gqdzfNq5/5+uWoQIy8gicb0A8JQ40nOuBg6IZSV4DZZINLyiIQrCSc5QIP4YRGyKVbs7AqxIQ==","shasum":"5a85dc24b15adc9dfb3b0cb35518fb4120fe0dea","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.7.tgz","fileCount":12,"unpackedSize":263296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciNp8CRA9TVsSAnZWagAAAUEP/RezxuK/T11pDIXotr3r\nZrF92pBsnbokfAcoSG7ezsieHZd1pWUpX4Rhqqb/flmz5KOz7qTkPDNy38Ch\nQLUgwLKo+YImcp6Cpgr6BzqQ8xLJAcb7Zdvb08ZjicBSSJLjFAApmYvUeo1H\n+xcVqT8Dzd46Cge8ndZfkSQnNzzx4tP44vyn0B46CqYhYHEUkICIo0t0Wlu6\n4YhFCUWzellkNXU/oTHOTvDo3S+mZn7/cfw4ySY3ShZ3sdJTeD5c7cZDTWI3\nKTNf8Xr6oZ+138Pdz+sERL5KWWGB0QMFTWsCOLJTZdb3c/cB+z5L9VdoEYlj\nWFj4tykN3hF0SU5lJuh+PQRN72adqz7nbJH1xChg43LQbyYb9+aCEOAexWKp\nnuffG3a6vyePKekekNJAGstXITFLPoydTh/ML0vkCB6KaGVBaKlQiIDdFfe9\n4FaAp8M0e+KrAaFygSTU+NgZ/7jVjBJX/PxMjIXrcHGSDC8pIuSFesSVH5Nc\nxpVLUziC8/N2qOSCC/MYk9/TOHrsuF0tVIjXFZ0mMspGqVB7tjRBVq4z/l2Z\nsVMUEG5xge023ZHzsphQSK4zmg9g8KB8RdOdEDw20evzIWijJ15YexQQ4rZU\nnCCycTdWpU3N2qbzciqthQnHL9q1d2I7NKScLy1dYNiUNNOK0KQXFblZBG5E\nHZts\r\n=nybt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiRumFFzC7bSbcv8bNklwLlB5usd3iz/029mNJIBy7VAIhAPsBn2O9M9eEvB83sEPIskS6UqyvY7XT5zcahNaVKcl2"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.7_1552472699871_0.6616606061635659"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.8":{"name":"react-three-fiber","version":"1.3.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3","@babel/runtime":"^7.3.4"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"0190794b8bc9686942deb2897e0946b7c2671552","_id":"react-three-fiber@1.3.8","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-W1ZyDSnhvsWcXspazb7rP7Z6ViD7bRk7pfaw9UmajeDnZg1/Vdfa99M9uwkqV0VouZxchma8+H2HhcOo1C4DjQ==","shasum":"4a2bdc0e219d428674e4f2d7a93f2847198780c1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.8.tgz","fileCount":12,"unpackedSize":262886,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciTyoCRA9TVsSAnZWagAAdogQAI5ksMvhlAZwLhQMAdvv\nyY+TaeUFFrPd4GpFTvrF03ibIf7VFB8//LxWM9eh3B8x0v8EyitjE+hSn7Ei\nYPNEYpfTx7a7pLDZ8BNnI/eJzNpdZ48vszHAiKLhA+YSLLQB4ihVOEvkkOqG\nvqvLv2NoexZMaeMnc0kSThLtzTqAtzooLpdGOLQ0Ndcs2fp8D60bTRr0yd49\nQbHlrnFHYxXlw7OiydndTMSp9nvGNkEaL4QZCIe8QfSjTduEs2mAaxM2Otp8\nGMQ7KY5LQxRhJH8Tl9pmIog4SGo3xQw/dXVdKftedAOObFZLREu4igv8XKKa\ne0XSGmUjycfRgUl0sQyvstZEUlIne5hCLlw5CIfaOro9GX3WlN2QvaGzSyGQ\nEKzTGScv7OavMfMp6wHIiz8M5hPYJwtMPwPJ9QrVLd74+ZcqFORacOUQHB1O\nYNLGPqaJRxRAggNfk2G1Zph/TWVvDTu+7K/edyriN2R97jofeN4Mfgq/ckdB\nxUATjeoGV6K0TLMnWgu5ImJREayeWxuS/HtEfaC93szXo3JNuGMomLIwsfLH\nThP1Rg6396BghAgtd3Hs3SLkBw3wbiyVuTP9hrNNsFKhxINiInoF5w5Fmbh+\n/aay5vxZLuGzB7ldyeeXOWpjAr3jCBpWxrnTf6jhwlRSSaiJL7kffk2N9kce\nfZ9p\r\n=HKiI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCAYG3cyvfmmEGGrmQhemalTlWG8YsHsDdtODIM3g72nwIgIJzlqA7BX8FYQOsWNhHMy5tzlYwJUnophhxG6NQtkf8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.8_1552497831607_0.541933355127582"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.9":{"name":"react-three-fiber","version":"1.3.9","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"7bd182200d113a0b1eefa99a83eab62f27f62d8b","_id":"react-three-fiber@1.3.9","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-fXO8Tw+jz2GvVe7sX39n4dNZEJggY9dc70NYz0ZTH29B+tIHJ/d0yIlHqQkVOMUStTxVo8ZgwxpeCbLqhDuO8Q==","shasum":"2bc6ba8f15215b07a15f7b2d47fc6d767e8e247c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.9.tgz","fileCount":13,"unpackedSize":263910,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcjloZCRA9TVsSAnZWagAAs9QP+wVJKHNV8xvFgSYcQ9XL\nHfhJlFURPDdoODRyAFFy6+yFAIbtCjRarjolMnTqGcEGPV9/CIjmlvMqVgPW\nvMuU0ZUv6dp+5tnIY/KIQb2NwvgviqYl/zX5kO7d9/ijCPP/5nuhq3COY7/J\n6VKBett1IGn/onnRrnB9fGXafk71/C27oLFk4rgDOTYbNRt7ioIBwOhFtUMk\nLigxKkGmn2hBzElsGUtD80cDYpTuT/6i0SHrSaYHL8/J9mWxubmtuhRTic8o\n0f1LUWGKY1prfFC0LPqznPYWLNS79eHENnYQ86KApyRrvs09xG3dNeJwyKYX\nWLkgN+iV/6fanxDvC54R4+Pl9GlDC6a57MFd8sjkvr8MEct3pd9uNTdZ87t1\nv7vniWO1Kg3xeqN8MiIo+vQUw/Wc9fosv+Vj8DxJhOyCqhhk3prvhrXwk66f\ngc6vGX5tfszngTO6mr3W1mKhigBEU0Vp7uXckRxniT5x6qvkOtRs2rVljCZN\nJ5MpKwZD4wG6arJSoRIS3kr7I+Z0Pc/flRnD8GWWF+qJYM4lW4pq21mKXoJU\nzpuFAyi1bHeW6WBpexxzJKxvdL0fY+4ferno8vK9LUxj9XafIlPB4dgLRr2n\nrT1+0MDgllTPcsTiHp/cUGie1bd8C6kuspuL79ApAj3WdFvFPQLiQPsmlDIY\nCTn6\r\n=95IB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzPuUMYxLD1kFG4awXlK7TPJ3HLeDlVIjok/DAbbDUiQIhAMoE96EGOw88yPfMuIF7tfcvYfqZS8PQWM5Bwq8eRxiy"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.9_1552833049123_0.40685434310217716"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.3.9-beta.1":{"name":"react-three-fiber","version":"1.3.9-beta.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\nimport './styles.css' // Make sure to give #root a size, or the canvas will stretch\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"5b00d4b99d0708f97ef207c1860cc2235f304c5e","_id":"react-three-fiber@1.3.9-beta.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-Zze2MjJuEAO6olNOfNOs4xKZD5zz8pVKuTxJ5oquyHLkadVuMazejH0PzW11eb0qnc5fP3KakELIDMaKVgkwSQ==","shasum":"a09dad81accba979fdb5743a7a15fd1a14337af2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.9-beta.1.tgz","fileCount":13,"unpackedSize":264094,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcj2xhCRA9TVsSAnZWagAAQYcP/jUVg9PldF0WulDVs49p\nOeLb5RpVjZP2U64TGeCMw4U9NBuurgG1lH+jdjtFkbXO9gz98UvKD2ZVAOhY\n/Zyv0KArtbbIMFgDX9zM0+1MlVI4MuyJ75B9ETvih6DPoSVaZz04P3RiP0uE\nP2kdCmEPDxc7+t21vA5OrTPIFgE089WJD/6wiflZzvSaLRCg0UjGkaR0fbyD\nZXxB+doHkkm0bbedcxyqVoyBudfeMVUQJkW1BU0gQIyNL/ymO4XRr/kRT1eZ\nrr8NQR4Rcjd8Vyy4+g+KJ29Up4hFFRc6ddiSUxnvqDEdXJ3wCMEDZfh9EsGP\nHFeE05oIcoJXo0s/Kl35WhefBYZRI1kjoWUWzvKtyUNQoBfOxOABFP2IJyCO\nk+1CTXFBs2Y5V8qFt3Aave0crp+wQDLnFSLBzVb6sYUv8PiEGdQFhz/VU+/x\nsNFvYzGKgfzA37XGW9f9BP/WkWwfkvNBtEMK+siiJWsnwQmo7m0l9dnGjmE0\n47aDK3Q3leVBAkPicjMhfV3rkzLyGYcC/jlOftA1uCj7tJ+uvGticHZhfp5B\nAlumQpyCgQQD8ZcIXyEjgsdtJHECrtlWQTyZk7eePwrmIWIXnI9e9qgHEvIV\nYr05GTdjLMISG0z2lSXKrM6maDfO0pKMTPJ0oygAywNncP4N0JBOsNq7HyNk\nyIu5\r\n=VURT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGyL/bliJFDhIF4uvC3Bse7RONnnzfAvUe7Ca2sklTIWAiAJF38mu4kCB2T7sNfja0TPf6pZNHDMpYmU0vn6Uu+uHA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.9-beta.1_1552903264643_0.5016524020204851"},"_hasShrinkwrap":false},"1.3.10":{"name":"react-three-fiber","version":"1.3.10","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"8c024f4b7479cb0841a7fab3e9c39fe649a03685","_id":"react-three-fiber@1.3.10","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-+T63LCrTRChfPUp5pE92c3p2mnnMf/Ee8n5bpwcLA1ckkTtAmihQV2k0H7U859c96b5u03aZ5YtS/MaUn8Cvcg==","shasum":"3e114c26ccbf5506d3dd22e2a1c74b185fdcd153","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.3.10.tgz","fileCount":13,"unpackedSize":264088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcj6DZCRA9TVsSAnZWagAAhl8QAI1ZOsRD2KdhNKY4dSwj\nLf4twb9zq1x3tsPMQSplMDMhodKvldA5Pr7QPyGmNqFkiSHgWqF7IYy3T1lQ\n91p8gRGM4Ufw1pVVSZNfQyBrxYQhpYWoFcRT+mfgYQwQ3BJAJh0X5jSta8Em\n7ANT9Ezu3yXU1gLWs9S/B0qFwTE9YKQFAb2iHI1F2Zpi7mgWadjJidU8Nsw7\nI76QewlHeg39F4TPyLTdf8AZFGIJLcmW9RbDaOoJxAUQiLjgB0V06JHemH9v\nv1B4uqOpmER1f6wtpK+tOqicfYluDB4wi5BJliOH9vQwNkL3GBPrGsPbDS+g\n6FDRqdOyJTj3gJTEUIepPjt7MfwnSCv+Bp7pnSQqtJyCLqQTyIG08ATJT4Mc\n7KejwZ0/HBiJ02OONVIZx6NQPW5KCHznmhULNzc98kOwTCWlEoGib6P8iVj4\nx87loSEkz97tYOCQrC5OWuiK/JxV4QrwU4ZtwQNgIh1+lNU2A9d1JJx2d9hh\nV+66xtlhy+V/bqhyilxJBZmJTq6k7e1tOfq5k7zg9uljPWgzLI8yBdy7cYuH\niqz/nIXIVKO6cbJWGyZUKNsK/z6R8V9/TWxymP9Pd2S+lE0rCy32DnHV4vF2\nLfylA8OGSIbe6KoiC01If4DKeNYeIvU51EJQoHtTzQUp0d10by+2U83TiBOn\nSxaH\r\n=O2ZW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD2ceXRIf0toy1uGkT7qCMMstZQWysicJnmxnprRq68ZAIhAOhI/8WlcMhn7oihXkikNNJo17YziZcUG4YedUZ/469m"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.3.10_1552916696262_0.67470020552742"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.4.0-beta.0":{"name":"react-three-fiber","version":"1.4.0-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\nimport './styles.css' // Make sure to give #root a size, or the canvas will stretch\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"a88101832a14ca32614244edc01816b4784a70cc","_id":"react-three-fiber@1.4.0-beta.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-Ji9uTOzFC/CqTPmi1lsvS378lY4PgHV78I2ar/LhOKUFEvaHC1yTyPXmdZBbC9gpPgCMCvvlyUOiZDOBcQekDg==","shasum":"92c27d3e419c9ec8a59e08358fa0e917915ac0f0","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.4.0-beta.0.tgz","fileCount":13,"unpackedSize":267809,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckLmxCRA9TVsSAnZWagAAiS4P/jE6RiWoCaRKetR9MqVW\nNGlDU4j7hIo4HjxYPgGerE2bKcX7HU7ndDrr9dkMqO+Z2y8eFYcl7q9Wp788\nAf8NkBkFf+nPjJeETUc51vCGtPNWMdOExIIL4XksFeibXHVf86RJaE7vXX+2\nZjlqgQ6Bk2G8mZxOhQzucZLuqIlI6iperjLd03+QU+1prcZHMhf3nb0MOwnq\nSSWCjo0WqsUEEt747+Hy9ZlSY2zeEDR+SQ4qNUQfiwvHwAAbQTKdQxtc6XHL\nyirq3/PulTNTN7cP3xzQoH/FgbeGqGDH+vRJnvuAP+CmHpcEJ9Ixw7/v8mWd\n7YtzlA8pU3ElZMygpEOiBGPj/DGk9rPmDSFfnT6oaUkq7OqAYU0GnDRdEd+J\n47MT+gOQ+eX0j6lwFPp61DWs/uy0LfjVWwzKB1uPfB8JQKGWqn4P6+ikLOF+\nPTK8keDOZhYQp1Lng8/ieV4KPgxuhz0ctdLONWoLyaMgjqecFY+lHxK0pxZK\nAqIHyEAOSshgZsMKeebsE/nbjqLvwp9LDEnods7X5A98LQujagPAJv4ZELxT\n6TXzZsS0to3TJaYZ2i9AMMxIysrQYtjMNEqroClFQNQCJ8jQJaDuGQWn8Uwa\nkzoyFCxuY42SHaFWO7yMp7KY5LVnbfUd08a6K7rpzdq2haMej9GFaQLTsL7Q\ndpXh\r\n=5zvK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCh0j1czYc+QL5QZF8Zz07ZCn7+UDiSwhDFuCq+KRnfNgIhAP1HptEgBQIankpyN9/TD7ItJbjbwXRqLkvP3G3qg2ad"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.4.0-beta.0_1552988592578_0.07509350679180926"},"_hasShrinkwrap":false},"1.4.0-beta.1":{"name":"react-three-fiber","version":"1.4.0-beta.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\nimport './styles.css' // Make sure to give #root a size, or the canvas will stretch\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"a88101832a14ca32614244edc01816b4784a70cc","_id":"react-three-fiber@1.4.0-beta.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-Za7C8hnusPxg2E58uiMLH1ZKZLdl68nrAPG8SJZZaJKOL/1HRsF/BaRz2fimgUGdcVaqT0QVMWHWDqJfZvpBtw==","shasum":"13dda0487e87bdf1999d929615ad16f0f011b2dc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.4.0-beta.1.tgz","fileCount":13,"unpackedSize":269522,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckNfXCRA9TVsSAnZWagAA2wgQAIleZdCbyy+XQ1k17P4p\n+1xiSZIJywsjVlk1I/6zEBcVCeub9VjKiT8vBm19M/icSFt66oTbtUlLYONu\nh0a4Cs3irgjL/8Y9TJqimwSHPEJOxmUh7Npr6eKq89Ct0fC0j7QNo4AcMTXq\nqGp0tOfMwvy2k3bn0jGbtzF3IAOg9w8QJw4EVMzJEYZ9WGnbsL02hDdCGXuM\n9ZJ3P2HRYXBAfifp9MRTr6G501nCp9xPIBFj7uNdlIaxB7rgX9DBT8I8Dbf9\nDu+y1uUhJiW5AsivYeCQ/tMabT7VNmMS5drOPoDgO8g7rguxsZzRK1u41Oq7\nVaZ7nZcqs+qDqceBnJ5uuPDVyXhP1Dh/3v2eGY229XgpEZSP7IuJvICezcXp\nuU+pgV3McNDw+8/T6y48zVhLxSjZngmrmOqXxx4ArG/HQ126e2tBCb9b3Ty5\n9+DEYR+rwNTzLsK9fJ/UD+GBqWvo7y/oc5hN31nmo6ZosqtMWZMc8NXWg01n\nTM5GZN2YyrD1966E+nqS2suBF36yBnI1bkrj5nAGUoP8+lda66e2q1uM9g35\nyW0/ovriryqgRH7KaGHi+U8oLTMVm0dr2nE2+fvZo8DztI6vGspL+AX8DSN4\n8YHY5UpxMbuDHyqST0+5Mb7y6woIgTUqqKlX7wzJiS1iYzJFUTZM4S1+76V3\nmhx/\r\n=PlLd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGvh625crTaChaAIM/s4+PXzn15N9ee6jiAFwhv/elE+AiBBxIljIwzYKrCVec+vITM03ziJ3ZrcbVDEbhLPJU62jQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.4.0-beta.1_1552996311287_0.9834981439741228"},"_hasShrinkwrap":false},"1.5.0":{"name":"react-three-fiber","version":"1.5.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"a17311fca3cb308f910e449464c8d51b6278903c","_id":"react-three-fiber@1.5.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-2s0ut0zC4x+BfI4UtF6Qqzgc56n2tpbvz3/3XWCyCmAGvHSFnN2VJ+08FjOGm6qgofedDr6id2pt6Pv6VafHBA==","shasum":"135d40268d9efe8ba3a2ff092ebde97edf4545a4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.5.0.tgz","fileCount":13,"unpackedSize":269669,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckSHzCRA9TVsSAnZWagAAmHoP/i63pNv2oRC7UOj0pe3g\nfDclD6bg7ekTu96XPrVaEDd5Tpgs7s5umNSI8/9o9AM1xcGdgscX7OG/ekv5\nd51hZfjfGAyT89HkpFbTPJGBQeqNR2BLSJdfNLwKiG2UZwM4pfh/eAgD3kum\nhGUbtT6oFoK3yT+7AyDvprdgnKub5fBneskyErEI6Bq14QpAJdX91FYwb8Yp\nwgvLA+QALLxy8F7WUP4Zd1lH42/luHDqmfkMJex2TqxWVhOa22NT0tWT5dTW\nMXKPFkLh7bMt+TkIBJUbRSYgLCgKIhOM+ZHyOtH+Fr4yn3PdSCLZ+0ZFyZUw\nHKTf1PF/xtl9PwWzEOa4O/HuTM3pxMh+f/BSW+qCnE6FuI/BA5bYZLiH9F4j\nZknRvBNCvi222zE3xpmjRSeXFX9KO+RRbOC0MKcLdUBfq/u1QQIr+xz03qPs\nlI+ZOYGAX6rmZcGmvxnyfA7RXoWwsBpu3fIwEI8KFwYdJbcgUnW4Ufofw5ck\n7T+nijoNYReAQ7VNIhEV3DvY2eGVlxoXkdfPGNj7dnH9SriPBihg7otbe5PD\nWMPa+EuMiD4pjffN+tUPQAOxE91eUKkFsRbBv/bBpiI1BJzeTEsTREQoKn5e\nY/NO1TedaRnAiiFNjnM2GmOjr24uj11KPDriJBsivyqXV4t3tU6VLZTrOcZY\nh3aR\r\n=koWd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDT/8wkltSa9TT5/OGurjui79lzhlXapxHcjVamrqFd9gIhAKIBz17tNzWwH6S+G9BNTHLboay9aI+ZyZ723CjiSI1I"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.5.0_1553015282914_0.5300166349894007"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.5.1":{"name":"react-three-fiber","version":"1.5.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"ffedfe5cd7bcae5695b0f2d82f4c23b231600aa5","_id":"react-three-fiber@1.5.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-5DG2VZic5q0Zgc61oq+Um491vKDFckYRvm/9yHcZUv/ShGm2kypSdn7Dti0Yslm/EZw/7GABzJgOvVwEEXYo1w==","shasum":"0c15c70d21a2a98cdd5ad7961f5441d2c96b987b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.5.1.tgz","fileCount":13,"unpackedSize":270191,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckVSHCRA9TVsSAnZWagAAQF0P/0VuPIT1eokx6Vi7jqQC\n0k5Y9XJTuJzhEF2O2i/Qte3E6uGwwWECdYpKcWvNki8V3n2kmWBDWemKCW81\nt5MJgM12252IHa5tj/PAtyZtk9aVo0y/CNlIlYpL4dA75wUZp/Z/s9dqe2wR\n19jpLYPS/zzuLkIgsWfmOf2nY9BRR38OO+mlfCozGoVl2cGHHiRNNp/AqMiD\n9VFSDSUWH/inOvG+ouqwrtLYkExxMcBhKiAVdUTIXCYSijYOsLvjpphJ83Hn\noVP31xcgAVrjzXEFJs7oECB7IkocmnPqyfUI/7zt7jKtoyGpkNm4eXWITZMk\nNJNHesaFlNoNQ2q0ADDqN7aOeyH+Dv4noAIEwdUUDqddaV8OhNys9zlcAJ7f\noVF68NcJAqasRnY8mjLF7Q1pBEt7Nm4R+5z13y9dqTpjlGA2wZeUPIh3HokN\nYj/9y+ydeQ8uJ4oeif4q1fCRr/7HsainWDe7ES7F9i7snX5sCdzJypXzjvp9\nHA68GM+o9yoge5vOD3IZbxRG3zNursHjELmTaNMwhp7vtHJsADIzniA42/cN\niFaoVANftHNbbmIUGvbOa8BRq9uypvtJ/lTHKyUV8SJ8spTmVPaJg/DbvG2V\nsiAFC2B1gMiqbnNNCitWKq4nE3lgadzriKoEcRy6LxoXPIygdyHIJSQdrCgH\nN0W2\r\n=jXTZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgLAsjs1BOmQXo0a9578prRlmTtVHjPn7foznV4jOJIQIhALxOe4Fjf5IABiBLBRR2h5kP7PDsoerd1xkMW4rGk8ne"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.5.1_1553028230565_0.08190715867124854"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.5.2":{"name":"react-three-fiber","version":"1.5.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"32e44b4e98352648db12e64ec5472006d6dbc333","_id":"react-three-fiber@1.5.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-SXStHOifgxe6gZ1xfcTwPBhN7kfuRpHchrC/jDfwzguPhdyLOMfPp+mDO6vJP4suYqcjZCfATZ2vhXE021JF9w==","shasum":"340b1772cbad346666be8f4119a6fbc53c6ec839","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.5.2.tgz","fileCount":13,"unpackedSize":272404,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcktVsCRA9TVsSAnZWagAA8ssP/iLQ9D7DF6fcmW/9b4Ed\nETbrF9JHtfyGVTRC8DYdHPmqWjQJ/fwrnquYKC6j3eAGSOKvNo3kIwayDZXt\n1ygyyeorS+98wMLTv24NFHe4fOY4UO37kfYiUccC1wtjXNuP1ExvyBf54Uf9\nfBeoP5uW2pc9w2kn0nj6zwk3SJmH6G3RRynTyQqyd+I22mJWNDfcl4haSJjx\n5fNbjjYfRXaBy8olDSr/wqMjIuudbn2NpGBpBychn2YWfvwurdzegwl2quU1\nJC7LuMVtPhgTs19WvKPybhOJ9i9Z9plnCxg3faooar1A/auxuBIHfWpX+7Ym\nO1S65s6RfD41Xw9vZqnzYXEGa7rvQ27xBDESTaLVitNtFWd4w9lkIu652v66\n70MOFFe/Z810ilqSXfHxLsvrZwXYa8rn6TQCMxh7wDsbAWj1i31cdskEZcuK\n4uMp3FxtvGLXs2Ej25TM2qZ77amcLY12sfrn4A1zA+U6hasdfFhbyu3ciSAB\n8l27YgFTortFagVAkndYNXyUGkDSSdOdVPAleJ7YBQv6JG/fdeBlAcZvHr+t\nimqTKdSPMgA7Q9yWnFQCKWH061cdze9iPuY/MybOhbUvdbH1X41slO2RhkIa\nOKyHkhw8AvpP8/+XXXDS2SZJ+GJIhidx5ACyOOqdYXU00nX3/aduyTYgUSyH\nVAdl\r\n=pOOM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDLeQ93N3CpNFwYzfwfocvEwGCmWZuyW8ZVCK0GJu8LzwIgAvC553izAVWvumZcSgtGNXkcIapBHOhWl64DREmVCf0="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.5.2_1553126763652_0.1222326681446122"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.5.3":{"name":"react-three-fiber","version":"1.5.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"c37a20cc901d3a8e167a02cf976bd9ab6d88e4b4","_id":"react-three-fiber@1.5.3","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-9GJEuTwIEPRS/zCHqKAs8IUvnFT8qMOxV4ORdMY5wHgU4Od1xxRfiVwZqKf0X2bTX6HqLSnBOJXYmGHPYgLM/Q==","shasum":"5e9284e3f21c9c7c9530c8cef39d4e3c630c7b33","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.5.3.tgz","fileCount":13,"unpackedSize":272650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJck3IGCRA9TVsSAnZWagAAUD4P/2p8szjegmAlEq1gfmWF\nl+UEc06lYhAahgw7l3pKu06IBv32sQV8DPjeNDXrNInd5zA+5yycUYejUnEY\nxpIXM2TCTT+ZftbEQUGVPABo8IhqE6xhd/0xl25HLapxYqfrX/C6MtTLJTqK\nX2gCAeAqVv53vG5DccGi3v+wGwEABCekgANqbOl9CNQP0MGAS2p0oRr2Aa0Q\niSafd6WiylTDvRQi87ai8Ijqyg+UKCWYbUTOQtkEwy3R3gc+28T6BOCx3I9c\n9cvcEYOTRW8OzrglQxk8caoZEDe2a7ACmM9RGzGlWnOmyhgmwCuEz0x/ha5k\n1KUM1po7uQ/4FsmL7/gguSlKark/4NqOfJC8LsiZCDxuqOxTV7kcL4Qwb1j1\nUclY5W8itnhyagF4Ed9d1uSK4YVJxA6b2kt+s7DRzVnO/btuSZIa1Xz16PgY\nOe9k9F+7ETstMRVM3FlxO9tsE/MiPFQ+46RcXtGx+YLQ8D8WYnsW72eR2Gvf\ngni5aXumvVPjyn2N8jaS5DROCEl160l34mU5d3NVDqOJQoBODHQ7A2Dwy8ky\nl7ubOTBUS8a6nXXiDQDN5N+F6wiisU9vIqzPO2p6rXhxnGmc2dVbZn8vaUL/\nr5t3j1mqQvQH2d3iLUCquRbXWgDxy1WzWFOq9AGR4EGJJD98jrDJbs7Hn325\nH1lS\r\n=d4ly\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHeF3VeDuOCH4Z/+pdjvclWjnBVdKgtsHX8+KZaCv65qAiEAy4lzVD1TsD5nM8V0j3OLDglDoFV46DdbLcKw8M6cHHI="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.5.3_1553166853519_0.8503838402966863"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"1.5.4-beta.0":{"name":"react-three-fiber","version":"1.5.4-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"c37a20cc901d3a8e167a02cf976bd9ab6d88e4b4","_id":"react-three-fiber@1.5.4-beta.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-S7/5of78vPCXdcjdk7nnBEUHqBDS9gDrBRSGX1d5fMyZ2lpPhRcvCmPkyGGuPYOzdXT1DP2ddS7nAmBbsL6PRA==","shasum":"0a388e4b837a5f240a66e981e01cb84ec19f54f5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-1.5.4-beta.0.tgz","fileCount":13,"unpackedSize":273160,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJck5Q/CRA9TVsSAnZWagAAy2sP/iLBmLiImikzrazxyqkV\nsU623nLIkiSj7vjPilyN5nsQhkQOd5HFjhgyG07bdVfmouESw1iNIwWmwISg\n0t8m6mC5EnThaus/VIZ2bXs1z+qT+eLC4bnAojwt9KUh0hN0fJZhE5IIWC66\nrl0ts9OEvzVU8q6R8T1pkLs/jL3r3RSulqMIL0mUCzuI6VmdSUWyE0U8v++z\no3qkw6QigpvZvj8LTG9TgR2bgi4nJp09lBznrYzFy7yBhnE1D7D5hpMSpZvJ\n6Ln3SMiF8IgDXw1xh4NV622X4YSq8VP5TnOb4IF8ISJfgiW5DhcjXwQJmH61\nTm9pzPb1+Dcr23zlkt6rUGK4HGf0oSDhg2r9PDvrL/bKNNJMbvzqHnAe41/h\nzWufjnJ1TDYzCQHtxEsLBxOA75fsvo2X+odyTfGwe0WtWBZQ+CD8U/I+agCj\njY4a+rqwtC/IaIX42Myjclv881KoKn1ZeqRyHNT7gnbx0/mYYY5af+PEJImW\ntmIk8BUsNYvqhKc/m4+8jWZKxGyv6+5BQ8YY6y87FA1V9WdLZftEMEN0dOwH\nNCOfbNmXpQ+dkf68EdHNVcsivamvXGVJm56UuepFFVhh/INeyxeA7SF+iHl6\nJS4UNn/zkU3kJ6Km/1Ct5swNkhzlxwWUEUFnbEQSB552Ln/eHxMrQNcO+gZj\n/rLM\r\n=zPxt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHucaT7hh2bGSzttTGK/qysfvA7Hjh5j2HXWf0dOWmbmAiBkIyWrBogo22FGf+mrtlQbFd5KGnL+5WvhH9SyJWBtAw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_1.5.4-beta.0_1553175614345_0.36519786152676725"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"react-three-fiber","version":"2.0.0-beta.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"d68d33b16c091c9eeba2e76748ecb30382904d0b","_id":"react-three-fiber@2.0.0-beta.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-6Ce5QIb7s+dbv1UOeIBQWsXhIfFcXx48GYLovl0nNJ6G4PVjIoHONGHXMLKNQ7SZw0L9CZPthz+EJEY7pw29RQ==","shasum":"7997630585bae982e4b7ce8f345a56560a492b79","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.1.tgz","fileCount":13,"unpackedSize":275749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcmkJwCRA9TVsSAnZWagAAstEQAJdv7oDgL4p9ADsFM500\nVRkSyhYvY2dqd4Fwho5YMBh83NFvXrOCYXMx8U2FEDhB3QW459YFHJIraJIz\n/EeS1cQ3Ld+TGa3nqgJtNUVbDbV7EIUzdFmDdNHo1unJzcV/Hf6qibCIVIWX\nd/G8rdamLb54Wiyc8E+c/ZgKz2f0rWouAA3oTWLnyD6CFX74ZX2uZm9xwxkK\nae7kWXSW3UuLobD4i8WRZPov4zUEEjjyaSBBn63tvqzWDiuP87tePau21pmN\npnVlw+QDBBgLyoPwpzByX03aERdxWkkjpXMIa5tr8ulgspTB04w7xN4qjZNx\nvbwJF3srEKbNOzhTI31eS6m99X/29hWOCqdqkLa6oRVMewqhieILXPS44dyx\ni7XJxnjiv/pAFwS/OFiXxzUnVgh2s26npj/uYvSH1LJ6ddTqABv8bvcpwgtO\nP3mhSiPo0kcZxDMQWbJ2oulz1EamH+tXVys/vaQO4IJPX/0oXTZgDGjODAdr\nkrK87Paqr0vvYPCj4uWgFI7T5Ythan3zVOQZGx2cm1dKeSTEDHIHOq+vEOtc\nvxJW4Z/tGp5vgmhwMmWokpjMfSm41WAVWaiMgPaI4pGoLfKdA9dXVwNprfwc\nk0gC/FE6p1S5axO+LCL2WwJkp+ySSST3lVSxd8EKh3hMBuYQkOp/JaEcGq5c\nYRiJ\r\n=itiJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmO8GeowazYTvZ5AtWmVsSXHH9FGCt/grvUVSPGAn2gwIgVQAUM7OSON/mpUZl8RwzrREniWaeGrVGANnZestvT9w="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.1_1553613424116_0.03174423334569898"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"react-three-fiber","version":"2.0.0-beta.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"0f0498273c162f8cc6efaa55603504adc4092368","_id":"react-three-fiber@2.0.0-beta.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-O+hZ+960WjK4CysIyWes5SWtNwG78eC1dCps1fKVH0pO0K4WXthKlU70WbS2MEUSwZf9M+UCEvVQZh6Ia6VeDw==","shasum":"f5ffe0ce16a9ea680d8722e8f649e48f411d72d4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.2.tgz","fileCount":13,"unpackedSize":276107,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcm4UqCRA9TVsSAnZWagAAMXkQAID91+oDWUuPncvp0ebi\ntxVebydKF3uDOGbNB2e7NlkWF5KWvbK0jzpnBjz+6lX+QlK5EWiXr19yEGvo\nE8d4tpAvWsMA/UCu2/BQEX2In3rQT9XCnovMAg9zFU/PyCwTdCXXzlXK99Wq\nnC0d+NLfQxd435yuZeugJUfP6zS3pp2JnZjwaty579GxOX8FsGGSxStCyZY7\nwp+SIpYqJdxRv1IPXhTEEaZgI3Le3/CEgr0eUd2z7yYK/b4fBCR4RCGxvbGG\nSIJake2wfnzqi8Is2HB/RFTGon+jQ4OdTFA4/8Ue0iYvY0UupGQgDvQGS+cV\nDhiVGvi5dzhD8Z4cWrfg3K/BpLzI3Ko2m7u0QfVCxsq9mhxnxrNMxno8vi+R\nHa0kV+TpcAVT6MQ7JOYAAfb56x3ulr9FPoFRxtV7wmM140oa18kEaNFvMqYG\ngUvhXsIGu9gCeTzCKbucZljNxuTLJgItHWx5hi1I7GbeTcKmvdSmJ/Zzg21M\nzWgNK1PypeRIw+sMZQMCFO+cd4TjkQe1jtwwAh1uBj2O1kP8dEkjlL+3QnCL\n1KVKHtPzQB1hDuLKOaptUsIfRWDtZaU6PuLkWTnNWEgz388utiAE2dvTWhT+\nmmFS6FTCjV/NOkc2mzK7y2ztqXMfsuXvEcKKX57SjCePlEb0VJM3De9RW75Y\nXwE9\r\n=TxZz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCat4eg8kbL+OPI06U6yVTCDgbma890bpsAMd29K0vCsAIhAPfnZZTqnOfYvCEtDU+IEvm8usarBkDSlPxNwouWkCMO"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.2_1553696041322_0.31768543095364854"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"react-three-fiber","version":"2.0.0-beta.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          name=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial name=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry name=\"geometry\" />\n        <meshBasicMaterial name=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. If you give them a name they attach automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial name=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial name=\"material\">\n  <texture name=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial name=\"material\" transparent>\n        <primitive name=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass name=\"passes\" args={[scene, camera]} />\n      <glitchPass name=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry name=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial name=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry name=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        name=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"537a2400dfc06519bb232e068e41aaa10a8e8fab","_id":"react-three-fiber@2.0.0-beta.3","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-VBRzY8+iJabI+xcHPCCIWWURvdci3YBoNPw3sudaHSupy1mZgmderhPkEWwkVDUbHhNuaFGbVDFGduV/Kwd14g==","shasum":"fed629bf4e0d0751b037cc0957391f77f16eaffb","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.3.tgz","fileCount":13,"unpackedSize":276558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcm5OoCRA9TVsSAnZWagAAKQ0P+QCgG+AxUj9uiFzf4Qw3\nzYFUtaGr9DvHPLHxkfBJWsfh3KVB5suNJJHFJJJipfH6QXNzz39Hzpkt0yWH\nOQXqIgjxduCZ8YeXVMd8Me23mmRodPr7zfDU5r/C05eL/PU/5CKN1OwdyKPU\n1eOCY6BLDLcoO6Ob+jCzTL2OzVP99CJ8Bab2Id00Kk40b5bYSCqzjKQ0IZsY\nO6tux1T8uyDyJTbliqWC1OahZtOznpG/72PHHzzfvbuUirE6bXWXdgj8k7jE\n4G4/FreHRaqMKRXi2blGTq5sL3h+BMvHbx6vWJjMVln2I01v3IU4lOjY9CgY\nLwdlswTVZWQA8LFeT3kVaHS74nDVGYu7aOgBOWklZ0xZSN03K+ziEQ7FFHlS\nvDFGKWSpI+pN/bGHKJzTtbEOy3zRFYKk1xPli24NIzqsxZEZH7R+D2drTSQ/\nEifMsksmp8w0X11KavZepnBXxW0UXJqXPu96WFbWX9Dpdn8sYXy6TA2ZMGZF\nFeASYY8MAXy3N5a8+pvuDOqLmqc/tMd2zTIMaUhR2S2bdno4b7awCNxMDnv2\nFDs+ZnrHAKzglD5bfARYh8CGOg7SypN0rSfGgDBkxbIuMqBfDtaaHYHHsAe9\ntV/pCQHs0g6eZMgPf9Ry/HUhDw3AFneT8MQBs4O3u+JGkCPytmvjkQFUnoYt\nkYGw\r\n=dG1t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCW9nhEVSNFlZlcOrMjSbqr0tnAk5fEsOU7iadwAm5FzwIgIssKbfbFLp+9Y4iDvC3+I9O4Hk+Xl1WxWnDUZPRPjpI="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.3_1553699752089_0.6701254127256782"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"react-three-fiber","version":"2.0.0-beta.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property they bind automatically to their parent.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-component. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to existing objects using `attachObject`, which adds the object onto a property on the parent, and takes it out on unmount.\n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    array={vertices} \n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`), hovering-state and clicks. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onHover={e => console.log('hover')}\n  onUnhover={e => console.log('unhover')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Gl data & hooking into the render loop\n\nSometimes you're running effects, postprocessing, etc that needs to get updated. You can fetch the renderer, the camera, scene, and a render-loop subscribe to do this. You can only use these hooks *inside* the Canvas render tree (they're context based)!\n\n```jsx\nimport { Canvas, useRender, useThree } from 'react-three-fiber'\n\nfunction App() {\n  // gl is the webgl-renderer\n  // canvas the dom element that was created\n  // size the bounds of the view (which stretches 100% and auto-adjusts)\n  // viewport is the calculated screen-size, it's a function\n  const { gl, canvas, scene, camera, size, viewport } = useThree()\n  // Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\n  // Add a \"true\" as the 2nd argument and you take over the render-loop\n  useRender(({ gl, canvas, scene, camera }) => console.log(\"i'm in the render-loop\"))\n  return <group />\n}\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n","readmeFilename":"readme.md","gitHead":"e2cdd8700cadf08b11511a3b071119c8395c2214","_id":"react-three-fiber@2.0.0-beta.4","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-8q/Z5WsQcN8EfDtl1w2p0McEt3ic+lnvO+Hjea0mmh747oOgNUjfE6xDtti++6mNMgXsMOzzD2E5/3PMHg4YmA==","shasum":"74c9e1936b26c70bcb2beef3335f4b593fac1c47","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.4.tgz","fileCount":13,"unpackedSize":276125,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnK9OCRA9TVsSAnZWagAAwcEQAKJelJSQyYY5rH9afkhu\nefpQZKXq24TDt3i0fzX90JmGsUvD+m2w+Y4/2rGN9YqCS4MwPSx6ua2vCqfE\nr07P7jMbdigCY3FJ4d8ZBuSbLULa6MwFdesXIqnlJgHE1MSEF2kjYTm8o1lz\nYZ4OdBjKsuM8G/opU28Uri0QReOvhS50ZOZfKVFbtY+xLpXlnYKP1fYJHunP\nVO6Z3oTF0Oxye7N9bXbfzk8Toa3NpZvFvYu5Qm3iWJZERy48itdQ7tmKMP8d\n1wRkDyJTBE0E2iWcXju7zNlJmBcCkyGmCWFKkFHIxYzsEglPt3O/PNDUarMP\n14NQCBYFclV19YmWjytSAYZJBChYsC+PaS7ldL/WSVXOT4J4DLqeKZNQ3b44\nkg3/OixTLoSU01uBUns7loQVeClmg9Xl65rSqf8BeJreJbPmg6M3odTnh7e6\ns497WWuL688WEl4zq5h2lbMRO4b/53kWkA7zbD2HNUKk1tdm1Rlr3iNTt0c3\nv27vZapUJ05fr921wfewbqqqY6elaSf94K7GT/gc2XVi4OjJNWTJvIMe22hB\n2uhnGyz0iG8gW4vdb5lMyb9foU7yF26zMwFk5gTz2T+L14Smg5q/buJUVEst\nIgZqXy0/FJtB5GndRRWT6i8XaZGyngMbfd2BQXfM3jo5+7IZubBzxQ46rr2i\nPhmD\r\n=zizF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnN6l3pURpVjuP1KFkR74rgiiWxrKGd7lktIJBIG1wpgIgJpZxOw04tV/FAKlscOZC2p02yawBgNBMa+46lcXifXM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.4_1553772365209_0.9752492101359658"},"_hasShrinkwrap":false},"2.0.0-beta.5":{"name":"react-three-fiber","version":"2.0.0-beta.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`) and mouse events. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onMouseUp={e => console.log('mouse button up')}\n  onMouseDown={e => console.log('mouse button down')}\n  onMouseEnter={e => console.log('hover')}\n  onMouseLeave={e => console.log('unhover')}\n  onMouseMove={e => console.log('mouse moves')}\n  onWheel={e => console.log('wheel spins')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate. \n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setClearColor(0x000000)\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\ncamera.position.z = 35\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"521ea40010ee5827e5f73ce859e2f4d39ea4a8d1","_id":"react-three-fiber@2.0.0-beta.5","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-4+Fii6IixSDuVjRKZydUf+M2nsM75MdknfsD4bUr9At63xTZyZJ+ykGNTYyXIQ5hbs5Tp19Sx6YKM3M3joSgrg==","shasum":"a02627835fb2ac82972155ccef42e9afd2a44991","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.5.tgz","fileCount":13,"unpackedSize":279756,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnfSwCRA9TVsSAnZWagAAWaMP/1ZwnB2My0IAc2p4W/h0\nwocPxA8rL2D1WxQXDDQRbq5Bp6MOo4ZtSm1CcnLOw2aDZoOHKcKRpQIvbSd2\n4xfbft45Ajmjunx48zbpxGjPOPJPgYBWRAXQ4j5lqQeIPKolucHpm0qAcRFL\nX1peAQ+XTTSoIJG7blt+hIqvPdFNTb9u6AvubUnRT3U4sdxhmub1skfj1jtk\nZArZbYoFrm+nBsubsnGkwpSHFP+zDqJDmpKSUKbAXmdWyzpqRk+L6BR4vTxX\n98Wl6wlOUqOuWcjjQ5cdmE9izAOYtDG0NYI8bYk7nLIfFh18lGBa5ZzpFgbg\nDfKu//kzLIz4MddEAeOTOrh9IWMgekZtEpULVEqIr/UUVT8o+whEg8FrMe4l\neBFnsumWGTnshWngclHU/dd/kloIONoPTb5shXT6UWWZ+Jeq4bE6Z1BiuWGi\nSUOxLz2/zxewS8Bqp9XVO1GgLhIV57tHV6nsJT96tiR9n2edQY0Dfirtvdxg\nBi4hWMyHyPfXjrvj31SKIO03P4etxxGtnN1j+E3yh3dVyvxBIQoOZ+yxf/f4\nM05pTJhS6UcFi6Mappn3VF5OoyPU2+BmuiC/MyBXhD3Hn0czdD2M7fEiS1rv\ngfsDkNEoNlK4VN9cmaBkDPJHIuSWZ4XKB5jvcYAJh3CSnSfafpnaeXTYQE65\ne5RZ\r\n=6YMY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCzjpZUZsp061N18Pi9z7ByjCh1a+k8RfsvyALjzxiK/gIgfmyE6Df5YT0UpssCUmVwiTVBbFl0cic0ZLEVF8FkEOo="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.5_1553855664058_0.3513189281342328"},"_hasShrinkwrap":false},"2.0.0-beta.6":{"name":"react-three-fiber","version":"2.0.0-beta.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onHover={e => console.log('hover')} \n        onUnhover={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`) and mouse events. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onMouseUp={e => console.log('mouse button up')}\n  onMouseDown={e => console.log('mouse button down')}\n  onMouseEnter={e => console.log('hover')}\n  onMouseLeave={e => console.log('unhover')}\n  onMouseMove={e => console.log('mouse moves')}\n  onWheel={e => console.log('wheel spins')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate. \n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.obj.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.obj.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[\n    [25, 25, 20, 0, 0, 0],\n    [30, 0, 30, 35,30,35],\n    [30, 55, 10, 77, 25, 95],\n    [60, 77, 80, 55, 80, 35],\n    [80, 35, 80, 0, 50, 0],\n    [35, 0, 25, 25, 25, 25],\n  ]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setClearColor(0x000000)\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\ncamera.position.z = 35\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"8140f9c989779ef629f80fec9d7e9433aa5f3734","_id":"react-three-fiber@2.0.0-beta.6","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-cG55A297C0yt1mGPzVvTXD9ccQNNzEw6AUIb35mJXrVb2G+Y5X9oqzsaCjs7kQOjOvHDLpWUOY2qnY97uH8qyw==","shasum":"ae1bfe7b018be7bf003f47e60314e5b8d10c8b41","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.6.tgz","fileCount":13,"unpackedSize":278650,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcnipfCRA9TVsSAnZWagAAkLUQAJAiEXy2wWTz5y45aFH9\nMac8bS3hwqi3zyifLDSAa1BYw3x0Zwl5sJZso/3YEx+89mdNiCMuFo34PlTQ\ntRrJZmyFAFZ6p+AO6Xep3TB53WzBKtloEmO/gWGtqffdM0gLoTqm9XFKCNVJ\n8rPE4t3QGZxN0ZdTWAPmPVDmL0EBrLifmok7P2ImU8Uq/OB99ZMICMWTtlkd\n6QIXa7bWmLTn13/SgcBoZjD0DqyxrYtEYMMGszuyFS3Mch5Kh8lxGqC/6RBK\nRJ3Al7WoVZ1ThTCwidBzge7uMaSpPTuL4F399luLZLT+nxmdpwkqDgMwVLZ1\nX+VnERv3HYg4zTM1MtgLXi9PCxyJ7PS7uEbrqusV0NVaHIiO8+4zQcgtw7jt\nrgn7/QkFBdjIaFOZpACTO1r2f5Osm68/tuJJ97WUvoi/jX+qadMknRZs5HVp\nbgZVoUaWSUyqSbG8LmyU7i9+GJq8PY60Wlcx1GznCQXxxyiktU5RnA9o27p2\n9SuKDfApBIy25Zaj5jgasuO2/RThVzJVcZYDXGP0KCcIUWoAivWs8fg0qE2D\nADP6HaO3TAsfYxE0weRq4u4KPm6pRaZTtxUf0j8n8acUB5I83hlYNStY4NME\nCZFW2qTLYdFX0OHNg1zRkZdZFgW+pHvO3z4v9kqPfGwnfEednj5hG3WQnJGw\nuoTR\r\n=TH28\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCu4O0RlxOqEAUBk6Bmgb3yRotAxD8FjoDsuowWDE98fgIgTnIgPjc2kVE2yu/6V/BJ9adip7WEAJtvz2WZTC/zeUQ="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.6_1553869407263_0.38176768881294376"},"_hasShrinkwrap":false},"2.0.0-beta.7":{"name":"react-three-fiber","version":"2.0.0-beta.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onMouseEnter={e => console.log('hover')} \n        onMouseLeave={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. For now that's prop-updates (very useful for things like `verticesNeedUpdate`) and mouse events. Touch follows soon!\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onMouseUp={e => console.log('mouse button up')}\n  onMouseDown={e => console.log('mouse button down')}\n  onMouseEnter={e => console.log('hover')}\n  onMouseLeave={e => console.log('unhover')}\n  onMouseMove={e => console.log('mouse moves')}\n  onWheel={e => console.log('wheel spins')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"acba07de7229aeb08b821097ab764071ebe4396f","_id":"react-three-fiber@2.0.0-beta.7","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-b1jsNJUAjDuuj6RgBot0T1+aakb7kDbyDr600v6dyR7qirY1u6sS/Is5kUR3BY8baqaipxvZ0hndsqJIsMJrjw==","shasum":"bba5d148e0d0710bfc934727d27a7866fd5d017d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.7.tgz","fileCount":13,"unpackedSize":280534,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcn94FCRA9TVsSAnZWagAA+RwP/0oyqSSEuyEm1sSatEgM\n4tn3VcgjGpgdQk41GTaxvk0n7A0o+o5gtf8klCpUlc9dmJfuDt33160WNNB9\nKvs/BlHJX2v0atf7rBz4jQLBTDvu6PgnAAQkwQh2L6prggGfFtTjWfdcK2+Z\ntLRXYa5mL5cLIzzS9JzHp8NRYKVwFMsFX3LWVjUlpMT1iAc29vfKIzQmS1gh\nNX7GUzKHoWVzn7UQFKmoyTRsEgILTatG25rmkSX4kWrAQLyBDSdQd4TapBTT\nO2WhL2PREODgONbpYhmaH6Mh9OT8Qk1KfubLvuel9y55JIbrZeA9lfXb90ps\nX40hQa7tcftvQnPjhn0xVhORW97ZuB9OwdpNPcEBi2wwnDB0BXRLjRUWgqNL\n3+mPDmo049MLlOS+llOxBzfoaB3+3kzVCXUtSWANXP9DnQDSp4uLpw6yAk3g\nel5oLvh3aQhiWTGIgsjdoK47DF/x54HRtva1+WTl8xiBgr5ox79zpuk1mGiY\nWLVB+KEt2Iw/AoDJ4z49HPBU6Ea0ix8ruJVymVM1Hzh58Z3kgxatpLME6jOW\n7SUbEwSfPJtnMoeCmrNakkUxs+GlVj9uOYVqzorSGKrTdSG3P0dCzPuXbauz\nOH7iP4BUepP362hs5xfv/ZfFNAcpkKAfEVhDzPT9hVMp24tBeL65/B5Kal2w\nK75R\r\n=rVNU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCuOH0a55vAfppCZtHJRaJbVDVbQ/A907H/S+R9AUaygQIhAI+l8BmOX4bhR7cB1DNqxlB3hvb/go+sT0DC+N5hQTsC"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.7_1553980932301_0.16336064902680802"},"_hasShrinkwrap":false},"2.0.0-beta.8":{"name":"react-three-fiber","version":"2.0.0-beta.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP/issues/365)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time object is updated with fresh props (as well as when it's first being instanciated).\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('mouse button up')}\n  onPointerDown={e => console.log('mouse button down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('mouse moves')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"5cdce435a652cda19ebe04c3ebca1c380580459d","_id":"react-three-fiber@2.0.0-beta.8","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-6lIWpExHhb1RXSIFWp3B8tEgxP14foevWUJNtwiTcssLUdjQHDGOsJPQdJv81iMrnsIHJ6sueD+vwgxr7ih7TA==","shasum":"becd61e9a13d648508b0caa76f604850466427dc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.8.tgz","fileCount":13,"unpackedSize":285369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoSsOCRA9TVsSAnZWagAAiOoP/0OaimynmpA1MQ55wtmP\n/p1qQdrFFai/2yb9Mcerz1LALu3DhZKON5g8b9jP1nlqxELzLCBw7atUQXeA\nZZIq16oXZxfU4Ib/RyydZw0MtoWxbG9TAXTDej54bkI8KSV6tTAbjXYfAyG4\nYdFOGv/0t5BO2CdvUyE0ocRTbUnQz9Is0vLUHcyt0NHVr0Jt7RPxbiiZ282p\n6eoliOTCRUp4ijMYEhjW0QVQl7OM3E7ZjZS8RI3jiw9K0pwN80lpTSKj3/KM\nhqtDhc+iILhoD3KWxt+cB1edod6CuFEtDW6y7MA7vCrHerljUROCZCjUl3EX\n4ILq4iTIseUdv4q5H0f20tEgMTdqS963HvSbIAIK4RlE02etUyq1NIaK02Ey\nsFZ057qkXYKX3U2mjiMognm6KIjPlwTDAYhxV8IR+fhICAjwBNlVmDkovh0b\nsj9pqwxxcVdmX9+RfZZdg/CUhpW9OpLIdPV4Am42qzZkyr7zTV1T29kcQIrK\nItTf5KzRK4iBnuw9s9jSYfCZy7lUFuiIC6OXwsgXMQ0xwIAKlyMixjsfqeb2\nIOHnxck+fSy0RJFjBB/y+ykYUeCZvqTZ7KlxrNa53P9ZGF7ujsSCfP+SF6ok\n21Lzfvj3UxVa/e+1sKjzdpSCS/TWuUtYC9+UcpbVXxsJUl344vqc1KGTeMjT\nk/bO\r\n=c69C\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFhdrqHSu9N4ic/p6ylSb0NjutEfwzHD6t2g7sh5emzDAiEA8AOUMHIuf2NohKaxz1VU7AFZaUeiZErGMA9LzaKd+TY="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.8_1554066190453_0.8332844605530179"},"_hasShrinkwrap":false},"2.0.0-beta.9":{"name":"react-three-fiber","version":"2.0.0-beta.9","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP/issues/365)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('mouse button up')}\n  onPointerDown={e => console.log('mouse button down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('mouse moves')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"230ea13022cf6747ea9bf2c0d6b352a62dbc7b59","_id":"react-three-fiber@2.0.0-beta.9","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-72nV85ptk9p16ew/rZCCw8uxRzNa+DtV9GFc7RRaNhmDKI1/zpMSNGRVtAcZLq+CHxJnbeaDunsf9MxO8x8WjQ==","shasum":"7dae1f5fa126f38e68bf151e5d532f2d5058d368","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.9.tgz","fileCount":13,"unpackedSize":285624,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcoeWZCRA9TVsSAnZWagAA6Q8P/jTlVr7iU8BeY5pf5HAx\nHG6UsE3/h3rL76S6zaAmNFzeHSXW39vi+pKT8hOjAJWUorbo8KfS4sDUPrZM\n1qaBD4Yp43CmaTQbDrzLdAOO6qOTuLIy/QjpuQV7MFkksJLUzEGg5Upvmkjb\n9ous/OyEHBBPUrWpqUi18QjV+mcEsMhIrOpxVnpYQT6eVqNnpm6Dt2PIp2Mr\nY7iwLItct45uYocvXPvahH3dj0mcRRFV9Q2xDDVJsvyKzdLR4YNdJf4SMNjY\nwep8SWjf7CwANkpQwODWWkZZ7cSSxp19FYGteLb+gdpmBTqaDg8numEBvBkn\nh1R1a453B1u8isssnDySRSCAz/R1BJLDS+UbEt1teMN9Cjal6UtNFLBiK6KC\n7YFzIUC6lDrxFrIdMRNnVHUyAcDXacPWdCYuK3LRvQq4mIF6hVw5496jaES2\nGLiQQkUqSWLK1NnUZcdcL2W6+K5L8zzytXGyHukD4ky9+KnCOPRw1CNau1fq\n9Rr8xUnpRESOrTGufxYyGH2gAE04esrZkZaoC21jLVTQddP1ZYHhqdu/QmLs\nKU7USM+B3YQCIDJ3y0hwsRHioNn27hLz50Ud4tKg8Dd1EwkcJ7JgyaHcgGeD\nCeZSYV5cYd5DZDTiqeXK2ekh/eOUBiQb/ivY7QfIeZvGT+0c7XsTfDKEtZDL\nasjd\r\n=jP3N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdaLyhuqz5X2Kyk3fHj4xpZJGRjM3OQSKwq3iMAlFEEAiEA22j4L7VLGp3Fv4pFN62hYXyZorUDmKvfR8dNdXxhExw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.9_1554113944579_0.4311122745884717"},"_hasShrinkwrap":false},"2.0.0-beta.10":{"name":"react-three-fiber","version":"2.0.0-beta.10","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"864\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP/issues/365)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('mouse button up')}\n  onPointerDown={e => console.log('mouse button down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('mouse moves')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"c862771d77c4cd66a5012b5c5028d871a400b7c9","_id":"react-three-fiber@2.0.0-beta.10","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-pmmKaOUpWLWUJO5p1w4N2yIHxgBMIs59b9MOZvbhm2UqZEQZLAdNJYTHvxYihyfVoAVN5QjcMLIIKybFpl8v9Q==","shasum":"0176031839d3f5509c0ed16c31f0ab70494dba30","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.10.tgz","fileCount":13,"unpackedSize":285690,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcopKiCRA9TVsSAnZWagAAMj0P/RzwIpg14LteY/4a3Sem\nCcNXYQis/av8jnyyAlGmJD/cYaX5i1Kz0luAucW7XjUYKhX0WZ06pCEVM+BA\nmRNG3WjjJ25NdsNlWrwr6r72ucwSI72LeMzJTsbr+7NAwmhhLyICwtvDAMS0\nrLSzmWPeWmG5Q7Wjkd7Cod1Thak31u476nRmxEM8T5bXfbyNVn6K3E9IoO03\nRJPotC+P7GAlFdsmDGL/IoUx/uac568p3USp27FYGW5IxWsmuJWbuxc7GLU2\nG21hZkVH0w/nOpE3IosySXyRgpdEsN18ir0pjFEDQkPX/+MCsJ/SjAU/fTbl\nr4IUjRDNCYAeWy/lUvGPidy+pURCdZLMRWDKkmLrcbCUUZTmU5bDLpt1OzmL\nH3fv7GEQHFhnGjuOc7blz748JCg2yRHHPGBgp57KX57r3g1NsSUz474pgA5Y\n+uYFG1qkg4f/icEgv9p5y1GnkAotE5UqDHYta2i/0onmRkqQm7PGDoj+q2Rz\nQphTesAWDjo2jnKM6JbSMfazOTR01+qMBOS9qdCs0MD0Dt8qUFKKRDwKvAR3\n8rXpO4B3YtY2XWY2UzEiTCW+0WN8U3a4qLlh/nG1y2ZuHJ9PZvc3lNgkc1sw\nP31RBMDPN6xHTfhx0bPYlHWjMsud4L/8TZyw1kbRcBGbqvxEcWf3W0sHxpwe\nlS3A\r\n=DsKF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvjgQPRbN8EynM8K/33WHfSI1FtCcHDP5WombOIFDSKgIgWncbL6PG81lo2TSVBQmG8UouWbeSeAEW73l8aZ/N8f4="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.10_1554158241372_0.1131751263453824"},"_hasShrinkwrap":false},"2.0.0-beta.11":{"name":"react-three-fiber","version":"2.0.0-beta.11","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"864\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/react-spring/pointer-events-polyfill)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('mouse button up')}\n  onPointerDown={e => console.log('mouse button down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('mouse moves')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"57f1cdfafeb090b7a9d4e2675c41b92071c5da83","_id":"react-three-fiber@2.0.0-beta.11","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-36r8aKz53VDb6KdXV4ZqteDYl5+wftCbiysZNcUHyKV6ls3AT0wOaiyM1Fn3OavUZWmc8hmBqG1FHAU8p7m/CA==","shasum":"4e4a3c658cd094e247e05df8e79823dc21ba172d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.11.tgz","fileCount":13,"unpackedSize":286924,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco5hRCRA9TVsSAnZWagAAcF8P/0To9RVoCd88rK7TZHk+\no/QCR+3l9oW32s0VaavXdLtBjxuA8gKJJmFr/gjb5i8EOQ/wRzW/cQQGNEY/\nKbM/N8xuCQZPxUM/luEbPVRIt1Plzb26lXX21jnmbvWD+paqfvsUvN9VnEkv\nloJ04123cNoZJz1qdHZoLQss0/mHYZS/BNkpnFVmAAu/w0povSKLl41s99Yr\n1gAd7Ho51/0xtfSTDIbSv/aqWBYBYlc6+xjQ4Zx58KETj2lR6fEz0/z+1yz2\nblJL5X0QlqAIAMl2V34cRlfcuMWkcfqjgSxUKXJJF2VUcazcqtBc9CaIU2nq\n07JzGocqPKUEtO2YVNeWTK7+rTfcFP6xzX40hKLrdl3Y2GTcBygUmNzTkx31\np0qTjv3OXJLeVfPgk4KwsDcEJKewqX1y9e9U2044RrSIcFFSudOy58nOT9HH\nEvDvz1wX+ZZG126gGnQqugsRLDTnQt1DRQTRl4GE7BQNF7QBPL/aXNz5alhG\npKAuAJklnfIAZ5YvPkao+sq4JIJVmeqHeB3eJPjqMr+g3QKyd+l2CcUKA1N1\nAzx66NbGIMPcaiHma1Gl+N67jAl/Bl84W2n4EsjejIBPZ49lLVUcaT+nJpXq\ngoyrPCIKouuqfr7EgqtLSgNrzuxb5KJevY/VbFTqNDilh3RCsiZ052Svj3rW\nT7yp\r\n=FDGD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRMjLYMzBzO86VnAPkkYQtID1F0RJs38LeJgIDr4yKuAIhAM59v63QSuuWjTHfMkokzt7/h/I5FhzcQZIqYtcEKGB2"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.11_1554225232521_0.44892201237285145"},"_hasShrinkwrap":false},"2.0.0-beta.12":{"name":"react-three-fiber","version":"2.0.0-beta.12","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"864\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"864\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install react-three-fiber\n\nReact-three-fiber is a small React renderer for Three-js. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Three as it makes for the Dom. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the eco system, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Three in a specific way, it will be the same here.\n\n# How it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not dom element*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // These props go into the webGL renderer\n  camera                        // And these go in to the default camera\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready, return a promise to prevent FOC\n```\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')` you can do `color=\"peachpuff\"`. Some set-methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instanciated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough, for instance effects cling to an array called \"passes\" of a the parental effect-composer. In that case you use `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute attachObject={['attributes', 'position']} array={vertices} itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Extending or using arbitrary objects\n\nWhen you need managed local (or custom/extended) objects, you can use the `primitive` placeholder.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} />\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/react-spring/pointer-events-polyfill)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('mouse button up')}\n  onPointerDown={e => console.log('mouse button down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('mouse moves')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"i'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use Reacts built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will loose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"1f29d9719a751d660c1111fbf14c7211bc3e2855","_id":"react-three-fiber@2.0.0-beta.12","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-gvGBDgRqzPw14yu3qRK8vLwjMPLdyy6Xtea05rIClbti8ZFgVh8pthE1JJNDYp0+KrnUwbIvVl+94E4F+jXOKA==","shasum":"75391e9bb69e02210915b7b4412e06ce8c3dc282","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0-beta.12.tgz","fileCount":13,"unpackedSize":287109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco+baCRA9TVsSAnZWagAAWmoQAJhbW+efwrl1/lyrTOF9\n61ztkVZ5SSBW1ZgiaWEGEXyoYXtVvqhChGbheCujUpEJ0NpEehtrKlKo7B47\ngPvUHx2I/hUEEb10vW42Oj3iy9Kyepza6YdaPR2icotMbO8c3IbA7v5Th1wt\n0YX9c2oaQ8XJO0rhapXdokA9Pc63pHHE8qBQ4q5Bajglk5jw+6OvxXgMhpWW\nor4hWtcEq1tl3sZdccKCYOQVCZXQTZRluiPaTfSoxwpQ77Yuv3UcZVJ72NUO\nKixHPZ4wIh9it5fIhubfCP/PrRKCUzLsu1LIVMEXxWJMQuVEeZMS18FK+1Yj\nsSt38To4JoKr8pKxaxd0oVKza5YfcRBjY4xQ2U2hF54BylDAjtyw4I4PASal\nV16QvP4wZYFp6oys+b5REDvSzDCEiGbw9/CjHj4Ymva2sjVb/aq7BtewdGGG\n0w3ebTnsCup2aBVOor5TZEhKMR6QusAY2aQdM89cGi/ILFW7y+QukUqQjtWB\ncn64UOBazhb/RoCZ3nophF44RabI8rlNURoToYYfw3YaZ5NmiIbArD+wmenR\nafooXJfyG2WSiKfvd1/A+2n8YBQnS1F8xJ4xGAmO8kYoYGOklu3KvTcSu+Ju\n+mYyH2E5d/tQKzu6aLW+ojMj013KrLdJEQs49GV2vi4U3vPPxp+UU3Gc/lKa\nNJgE\r\n=EtzK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCit+7ca3X1Ahjmc7dUMCE6dD/RSL3RFsM/zo0dKv8DrgIgCXlunxlsYHmdTEjk0954K/HmPx7k4HLlguQeXvXuqTs="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0-beta.12_1554245337632_0.9837476232751503"},"_hasShrinkwrap":false},"2.0.0":{"name":"react-three-fiber","version":"2.0.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"fb8d51f50d6b4971dbb3da2097b6bf0792bb80ad","_id":"react-three-fiber@2.0.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-EcPk9tlRPxzNaVq7ooVv42RvzTfs5OnkqKd89uoL+kBfwMc38Q57uqjDmz4go4CFcY+soMxA6u+XhhGOgQd3Aw==","shasum":"311da5f12f7cb7a6a53646c92f1394e8b69e9d78","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.0.tgz","fileCount":14,"unpackedSize":492093,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJco+sXCRA9TVsSAnZWagAACEEQAJ4NWbtp1SCbNaG4phXk\nYiasGzSEnLrTubxyF5/hpmGkzLGAJlhlR2zABUCdgQ48Okp3EB81Z/2hxdc7\n546kq/uT+m7xzu1tGw01l94MNThEcsLxNFb+fFZUBlWJfxNz4oGBZwwaImd/\nuv6JMIyNy9EFmuK0aa0O34jaHrJeuj9WInGllUi/STH4OgUT6SsMiqnJtKv/\nY7acyWe8JepFPQr3P5SwYQfD8NF4MRqRRojk/ejKK2J17F7XoMW4WsKO29/U\nGJWtVL9fGiOjqhbeDI9mcAYb/b5Q3n87chwGn1XWLeb3Peqb3xfe0OeHLHCk\nip6YzLCtlzQEURXGtT4qeSUeBGUPdBrnjmatrXfqfjhCojrWHu2oyumijoR1\nl8aNM6SANphPA0cjhUIZCFVSINAWnybYXRXuIJhhGXPzXzAJOjyc+cItUUQH\nQiLNVIMjWENLd0pAEvNrd6xb3rYgTcH69MX/e+d0+VdNNBLWDG37Rf3RMZcS\n+vukNpb2ssRd3jFrwlkLgoaR1qinpaWF8cbwEd8Zh9nBwOxseaH64mNYybnf\nNujhRBFAz0G3XyjfzktnsNlN2GZDNFopbvsjTwZ3+LVv0Xl7eKz4RfT4lMq+\ng7EuKABzEDb0/PCA34l8rLkCaN4XYS3WqvyFUOS9YfzDaWsJoEx2npo9tXZ8\nkyQG\r\n=Kxt0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAOSK0gavn0ONWLpYLqTT9iJ0GFc5ZbrllZY+qBO24P0AiAErweIgbmCdoJUvPkc26ZBDSrs7dhScyKVUE3fjtfFxg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.0_1554246422958_0.3759921598030598"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.1":{"name":"react-three-fiber","version":"2.0.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"0b681913c1661df634dcf922db4dc9bf350c0cea","_id":"react-three-fiber@2.0.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-7qTVvRzdBQQeULamhhN30yf4iyl3UigHUOhHfqyG9z2C8oe3WUauHuoOto2IjKg6n8hb+NjE6I3UZNC1rw9A2g==","shasum":"a07656c34540d48457baee68a2686d0fded903bc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.1.tgz","fileCount":13,"unpackedSize":287275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpnXlCRA9TVsSAnZWagAA26sQAJLZ3lwJRIu1W6oJmaMW\nrq0desGJdIyGN2RUJ29BboNDS49O36Vs4Bk3t01dtF5lkf4KhAEyMsj25j+q\nVPhJYnIhv10YbQTpSce7mIXEo8puhY1A4hpMaO1AVY2wDDrPHjUXfwnH7cSR\n9WOZHYty9U8JES/R9tga5Znvh498v9aB/Md1TFHVGhfnflT+bzb3voesI+Qn\ni0pRhs8eveOdhXI6QW/jUxfwgVLy2JgAiX7aTkbZAegBZkWRP5vdH2jbSApZ\nNRb5vB2qugakFDdkXGuUh/seao4ivoMjIUH5WGE0hKVsH7Y16VeUjUSRYLlR\nJulQpa0H7MdqBJhKn94+qy9r7A9aq4kEEitWN8lRnj0XBzNa3iBQHC/Op5ox\nfUXlyd03+hsTy6uV3IdbcwHDfO7sNUqze7UAQch/WKW9LmWQOHlbNgtshAJy\nUCyAPYJr7CO7RkmmM9ZoanuOGXUoT01kpeab4hZQ2BUYDCCu5VUYUvYG9O5X\nDvowWw34CNncFrwjOtI6/bQw3mgW257vkfcyk1Mfpwn/x9MOnFMpWDW3CEaC\nXeYjKTPZUj9iPXDexMTm9ju9uqQsT5LUCXzSbA2O3G+tp4lhvOcA3tvD5JMo\nUMDqaW319AXGJ+hXAQN9f/NKwFi0MH3JddzUazNlo7qVXmQ+/uAMSE1h6wdO\npR7Z\r\n=6/ad\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHu9HWLU0bs5eb0rQRy7U3hkXRiE8twWe8ccwUHE1tRZAiBPhmtdKtQbyI8DVG8R4rVzEDGlfVshBejx1UJFOJgcWw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.1_1554413028654_0.5034463981356507"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.2":{"name":"react-three-fiber","version":"2.0.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"b5f138b97f47bb3b83c99be37f6741011d8dd395","_id":"react-three-fiber@2.0.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-bVKaLIgSGQst79+EpcgdKr2Kat7tc6q7KTxgFhRj9irRunolbfGaM+9kgvBLiaxgBkrt+t4au7ftQkLSxrabOg==","shasum":"dc0e19195111ddccecbdbf9b75c080cf34757f61","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.2.tgz","fileCount":13,"unpackedSize":288810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqyE3CRA9TVsSAnZWagAAnt8P/06G4zDLlbG9wmMmuEyL\nug4SQuu9++lk1O7vY6pNgHw7kpO9w+fHja3dLGYdOYw9NTFScN9VMkDR1xIW\nkwRnAiSXJhdSAORXhHtSv+cail9MVO6HiM8W1MolO83ztiOmyzXzKUcxeixE\noCPPBVbbGDAUnibDpk/IINqiLwFMXLgg9ZJs5/OMf713Xt46UU3w4TZSzjlf\nt1OKfMgFMRjj3OP3Dwl86oV1TOL5GsRP+pLwuqHwrsfCZh4UpWsIE+bxkRuK\ny8ivHCdOWt7NkH093aiGewXPRGmjq8+urFZ3GIMsqrWDFMzp2S80tkNGXvRH\nSHoJdI1f0LYgFfKu6JLU68nx5h3c92+R1nH4g2JiTYkxitutqTO1ErrkfBmg\nbhmcVpS1f8NTsByIKAwRMPGcZBVhFh4VOspY9U657+9Vu8jID8lMDDKrEwaF\nAcs2pTCSSbdTzPSka+LaFpP888OxDJdU1Z4EwWhAODIcw1ObaNW0n/kelAeY\n4O0VeJyMz5mK1yc5rrrUACtCeQ+pFdESoFsB+kdjdBPzfDIbRdKYWeq7mq2Q\nffNiP0IFdsGLvYHPd+0uH1OKGNQKAa7OJ0w3RCVYKma58jWHSTrYI0fJwn5L\ngheju8JLDxpVnZISzkpOUtQRjgzp7M6IECc1QyH0YeLI1XVBSdRISEoLV9FI\nI4P6\r\n=De9h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAUoTnIF8IRwAxUNx6t5dmmjm9VKI6e4fAMZz9sKLFdcAiEAqWOKQmRLvYpuOH6MRoqDBr8SkKFdQiR3FgiRGtDMUKA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.2_1554719030562_0.05835028139875442"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.3":{"name":"react-three-fiber","version":"2.0.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"f7ebc6c7a941fb5c87ed790e29c2ba2896e0ea3c","_id":"react-three-fiber@2.0.3","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-PcLa1sn3f9/FOVAS/UGLUI2myJL5p5LH1xSTXDthGYOS7L0Rb+MEHTVJSeaQqZrkWOLYaEdp9YCxLeu/FbEMTw==","shasum":"82e9fc4302a483ac0094966e279da9e7b1bb357d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.3.tgz","fileCount":13,"unpackedSize":292871,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcq0ldCRA9TVsSAnZWagAAIWcP/0dd3xx1kv6GjSqKJy32\nmj1Fo+WQlqwQoLtbJDSO1u0l0hdMahzSBPWGuNJck+LIkjFOHkXfeQeF+aS2\ntfBO/BMQy/P0sMQa714MV/Cv2H9XdLOWoSHrwsotXbHQfcjdig8Ok3gGvIKv\nFEhIaux3QbyOojd0SRJ1vPv5byAjhmzC6b/gE2+SRs4KKnLN6sYnD0PByzNR\nnC9/GTxe3MwlirZn5uWsymBumbeEKQPbDnYTpInrHRuhslea9kThohz9RHOn\nQLqIPnZpstn4y/kaG1WPdLMquUT7a8FJt3Gcc5sgs/1ZAD7yZP8woX/LxodZ\nvHUdkSKYB3IGsyQZapJSLgQK2fgFZcbU9N8pZm95zd9x9CVVOpIVIeh+evGo\nSX0tEURWgk8PcTej+41RlUyHlNxf3+mL3R5NpQRnWF0top5IZbyHpNDPqyNv\nm8E63iWBaoKDSYevSn6F9hNAUeTt7fZeh0w5bpjkzEnxeKM2hdH7clvlmFxz\nw4EgekKDC2m+7TN3AJ/cLL1/2fX+sO7bRBLFsJ7eiTTe1Imo7NFKnX/oAZBs\nonFFyuLHqknri97KYGO9d5wmqSxWZjMGn5aBkVbgQ0Sv1VmZhq7oGHRz4Lo+\neA0mKHEn/76txeWuFikpHrmUJ9cDdefnDjsu6TPv08vmdv67+8jn/jfpiSvL\n2Say\r\n=qS9D\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzeqwlM7eSJtcCmQ3m/JRSaRHH9L8vpHR1/rKDIUUnyAIgRm7XhtP5cGInP99g7bNdiEtR+YKq+DjiMU6i1HQLnB8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.3_1554729308229_0.17485382677362105"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.4":{"name":"react-three-fiber","version":"2.0.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"089af865eb1263b80586b3fa11addd68c5f88f30","_id":"react-three-fiber@2.0.4","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-mxs+5+PXN40d7Il2Ympl/n5GqN932ewbSUxyOR/yco+2zC9hofNt7WX0IYmujPLJ/N+117jiULwEw/Rh0KFNJg==","shasum":"b0d4794f3aabce398b9612165f017df5b8e9f29f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.4.tgz","fileCount":13,"unpackedSize":293049,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcq4F2CRA9TVsSAnZWagAA+D0QAIA327kltLqP0vW+/+i6\nSUilTrpvSpS3iN0ZlzLb/7KoKrdS7C7xD3uIgKe9EWHBDtv/ConMCjO8+3W/\nhMMFriAqlE+CHxQmuRtvd712lT/ukOw+LTplukF/QhRNipdb85PHFZ1wYdIG\nOnSCJISzEYKINM7N6OU9DqLxnFhCwJBb+qwmzxnj4JBrQCvDtKy+EcUyzWH0\nQyjzxZNH8EEJQ1EYHiSSHaN1S12fImST7RtbO3+eSfSG5MV8POxB56n+SNoO\nxwDNqHLObVEWdBxkkr1KeDWwsiIT0uBGOrIbEHCJVbv8c/s4uY5m3aMYi+RZ\n5+g3rP0gH6cuzodwaIrAu9qYyqf7OaMcplHaGe9rLzgKYpR5pmuhWEXDSgtg\nAsqpAekCGiuc9wl6UtYw4SpF/5nnsgrIdA2C0/Ug1wh+7XYsG2VaQgph1fum\n4cbGxpMCIJqDCRg0MZrbqLgXzMa7hDRkkW+pYPt6y9oEVsW3FQx5yoK4dKWq\nXj4sq+HrA8SW3ciBxOtmL5aVZrgypFEYsv2Q5H833TxWT3+MyRW2MBUqGZVC\nDDzIgZx01s+QbMrZtHmohV8bmH7kyvaKoSrhf+tixvl9iTOiB7UokKAxdw7a\n7J22DkDKBe84B2TTXDTc846998tWm8hi1dDcqoVmqDBdjIxVG51VgY00Qz39\nGbok\r\n=IGcS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdEwHSy/ozDvNZofcOGRFgVJQSqVSqzi08+C2X23jG5QIgcrFl1mqHNRW1cFbSNUMRP4XYGOfIRjdoRvdl0u2+/B8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.4_1554743669453_0.7139495302633878"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.5":{"name":"react-three-fiber","version":"2.0.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"587ebd7ab348be5d449bd059c3ec2b5f571f7f7f","_id":"react-three-fiber@2.0.5","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-ebYoPidSTUDyvD4FAM5HXgISCQc998DlA+RiihOatzy1sic1eG+hTN94W3yUZ8nWcv2ht4Nc3fCN5gHKzHqjTg==","shasum":"3123f854194309c044494184efe263e8cdb1b1c0","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.5.tgz","fileCount":13,"unpackedSize":293145,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcslExCRA9TVsSAnZWagAA2TQP/2HHG1lmfJ8skucuMP+4\nMkB8oChgaQdLMTKPDVk7AdsaEnL4oiML6UgsXGTwNqJzFM3SkVpuNzOgLvGr\nCyC9DLTn/vmE+ddBNDr3+bHRw43JOIdvc2hwCdurzxnCtdLEkZdClJ2cTnE+\ncUTuJLcwxNG1fvh6H/ywT5xGeL8XGq21nIp0w9/8SG8QpUOLceXYeMt0jzz5\nzbJ33pEIEa3yhYohhMhUDcBxEP/11hlHeVL81ujUm5cdiyZRzF2UZlsjjDta\npuNhpY1OxX0pp+SyP+Yg4czfoAZsv6MQbMswl80N7nc6ucz+TMEQR+FTtuXe\nBVfEVx1JTdMc7IJadkuN1DzXUdaceohqbpjzvo/5iuoGGwn6azi+zq/GwaVL\nf1Mq2xedQOb4Zq+7RVTLch6FjP/r8sIEfTT2gKUQA2PBvEocHhnpSgvQvLej\nNwFQyIAP2VHVBmUw4QU/ePow+tsjTQgi3lO4YDqhh0vOwoMoRa8hUmiEyPnl\nsV/B+SdbjQNHM0yzvGtstxQ5aPrpIGopynIN1nGkZXESrDdTCTFL4MM62nKr\nfSwEfseiMoYzt+zQtEqq/sQjvZRGkvVc/Sru78e/nTlqcdQ/ho5gJUNjeFLF\nvEuSK0rB7gXDGColQ03dY0BcWdSMmV+EUL4p+Qd5TEz7Equvof/zxgHMfHbL\npAhv\r\n=V092\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCMdIrRwMwG3hQ33yIX/xoQ4Tig1JZ7NFOqmjbamrIttgIgSH3yZEnmplT24PtjW7HceVTT97kBVWdxLSgdhDbVF50="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.5_1555190064279_0.8141032107511603"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.6":{"name":"react-three-fiber","version":"2.0.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"2c04e169a455f5060771eb59a6bd786cc68187a3","_id":"react-three-fiber@2.0.6","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-6wMHyLleyhcXb0Iqf9RjSP4qf2ezLa5dA/N/23R7M5/+IqYpi4FyOhhM9aU8s3UQ689cYXNbZD6w7idjxN+Jmw==","shasum":"2c2db442dbdfaf709b1f5daea6ec76fbcebe93c1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.6.tgz","fileCount":13,"unpackedSize":293877,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctMsdCRA9TVsSAnZWagAA4V0P/R+w/ZDdWJxO16nMH9HB\nOfdLgBWCd2hAOkg7MRDIEGxb5pVplUdR1MLQJPZVWSMUm5j3Fyb1tjzmk3VV\nvIvoo1Milb5N3idABke03+nJSVLdLJfX6R442tAYbKLGxOw+2hLpzfgB2Spp\nyGHi/Xt6Kw50R1OGjcpJ+RKHlDzIkOZ6VXgB5GyjKJxmFrHPyhg4izZOTtbi\nIchVYQbm7Eo9QH7rcd1NEnopwah0egPDRyCvG5pR7CuGWtIJ/YA2iYz4EKNQ\nRgIiAWEbHCeVsmIdsJhUO6WkfJ+emUGQkXOLXN4FoN3dH3Ho07+boF/HF/i7\n8er6DMOuxFPt1OFWVfYEAo9O0rEKO/g6p9ccGjVgAK52ypJBVKS8c/AZMJ0U\n4Jyj69SWJA5+ZwlPjj1p9MlfoYDq0emOwQpfY7krjxhNKwwBNJZD7yk9OhdB\nq0nHvvLW0+FszF3Owfg0UaDI08GFCAhHcWQcty7G7wtpnpZ0nDJWPHPlNk2D\nVghVpIzGBkP4utUQ57PDVmNuwvbNviDHFjp0lzmCcIPrqDpt6MYV1MqAx+9x\n6vb7HmD3HQi3pjHvhvLkzC+rGannNPc3A0rMxRnOvJZIy31vAX0+Hhnbp1Rk\nFQZ5kWWJJN0LKxzV84SCiaB49QQ9gHzj+HspITWQgBjtkpc8ezU5jvXZFuzD\nbL/j\r\n=nM5I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD23FA/GUA9mphWqSMGlaVYhiROETZPn6E/wZMMF9NxpwIhAOa6je5TRGmpfZM0zgBsd5M2dOLsXXQ7fABFNofmPVP7"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.6_1555352348090_0.3700254519771089"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.7":{"name":"react-three-fiber","version":"2.0.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"0793d385723dc276454ffd5f9bde0b5ec1136244","_id":"react-three-fiber@2.0.7","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-nv8dZWqXUrcmqgv8snZ8ly6qXIUhfQTHRK9HNgpL1ftUWzBxGwLXH2OKDT9AAwmsElVhjrD0GjRRIxKJmcHmDA==","shasum":"a2f887564ec6cc4bbfd712395881452e4e8d9cbd","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.7.tgz","fileCount":13,"unpackedSize":293799,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctMzRCRA9TVsSAnZWagAAm2YP/1AMga+mpOhlubniEnRH\n65ivLKyy1wzdLlNMdwofYujqFtSzIaU/8GS0GuuoUszo8+B2kdCDnuCWrp/e\n8VCR4wsxtD6XmrUa0uKRtY1XGufHg3FoCf3iimYWA+RbULyzbdOQlExYsPGG\n52LWEhgGD/0x8wuojhHkVBLOsw2DJBDVYSMxobuAAGLNAL7K2PlTEzzkd6On\n3XBkpUKKmwvOU2hNprn8GqhNfBLFZYk4AF2Exf43leq3mr4rSHM1gdrI/cc8\ngk0qcONRMqwm91VrHbWKce/WhJacDYHyrxT+1VOeQtbekHeTU1VJstNVydSh\nK1dvgdK/eZZ7FM52JE6EWfQJv3/8wyB9vwp1MA5VMbnBuZ0fVNwo7UpfqS5F\nYB7kvphVkadQQME+BtkwGMtNsetX2W4RpWJkfDcYiZ+VpVYt21s9yqdXEbpi\nHN89ASIN552F94UtmPDif7DLy7tYEeo06RlR0uQCEHpPrJ5OOJQeplx6nMQf\nF6E4+pEyaUR2Rld6VxubfbQ3W3ufFPJ+8MLfXRDYxTsdtY1xxX3IxaKgDptF\nD5W/a3rQIDPd2Ru/tBj/KubVDu3ldlyngeEec3+eUjqsgBBHz9DdtC7hQALp\nyY6y8zlQuqlovsj+vwuKG2RVNn4r2aYfCPp025j8/IDYr0cwsMGZH1TA5W08\nmL3P\r\n=0vg9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpoc0adUIx7CO8iD4yDFlUa9uz4O7ZUkBzxF04avZf8gIgOBubkhJqkJiD2ojXiO3HLSuDW2R9a0tQ2h+OJKXusf0="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.7_1555352785183_0.53012408639406"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.8":{"name":"react-three-fiber","version":"2.0.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.3.3333"},"gitHead":"19fab341df529a8ad19831fce209a7b41e062e66","_id":"react-three-fiber@2.0.8","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-X0StBJ5pwjYfXItmljM2E94uV2nwQ/2rtRsJzybdqWRanNawiGPGc30RD8+/J9c1df2fnYBPDtGpiNfJawg2cw==","shasum":"81e45e1816ce85de54f52f963bef8c3a81508522","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.8.tgz","fileCount":13,"unpackedSize":293706,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJctNdJCRA9TVsSAnZWagAA2u8P/Rm+oU6WjzcgcKzkDrH0\nz6w7luWLD3GLurAgFX46oW3BcXrmNj5X7vEL7oAhpZK4sma94NO3M2sOuGbc\nmKPDJ0SZ+ekLIWXyYhtd2y9RUR6Hw47tcw0HeZ2Zx8yrJ45FU4LoW/0uLuDJ\n5xUne+ou+q2tg9/04s4auBS23R3qzU2SulXZnCpumnnbIan8fwNRNlKOEYPQ\nJqdEnodWijEDhIixdy1JBmmkuDVBYklc5V9mnUYrDRQjTAoAcUE41Bn+3Aui\nsNGOA8Mhb9lZIsKP+Le8ftFCDkv4+MKmM7P/k2nmy6gHCyyUt3CRuxLUfFpp\nx89CAEIjTKVSm+HHi2k15UARv/7LVq+Gg8AKxf5lwXwPRAGC3kCHHmpqxG1g\nx+sgzvVTP5rfEM5klEFTJ9EccWERYKONvbEHEKgTvSQc5QhvkLGSKNExckaV\nKkHDFPWAXU6Eph4LtCZGEQLgezhsPXuhJmSCpiUB82Ll4hqyzDJW3Gf96Yg9\nWEqfVlycYSHv+M0G+I/dgdnFKfJ/9XAeK5pPeL+KffYiMAba3E5/X3B3ZDLe\nxsywhtAa5n5IfXnU5X+cVbSJWKeVUiReLSY2/yppisiCoTVOuU7zJsS69oGt\nUClvB4ttOY+n5I32q0w/KQV9lPSusNpe+cpJyPGycPvVtJU1WXsfBo561IKq\nsHGh\r\n=qiLV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBVoG8dc0BS0yAETHy1m1Je5K85EDyDgi5T6aRG0/4BrAiEAwviwnS+zTnggehjw48GozIf7QIggW7FGCdYoaO9yajE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.8_1555355464860_0.7304172203286938"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.9":{"name":"react-three-fiber","version":"2.0.9","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.3.4","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.1","resize-observer-polyfill":"^1.5.1","scheduler":"^0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.100"},"devDependencies":{"@babel/core":"7.3.4","@babel/plugin-proposal-class-properties":"7.3.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.3.4","@babel/plugin-transform-modules-commonjs":"7.2.0","@babel/plugin-transform-parameters":"7.3.3","@babel/plugin-transform-runtime":"7.3.4","@babel/plugin-transform-template-literals":"7.2.0","@babel/preset-env":"7.3.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.1.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^1.3.1","lint-staged":"^8.1.5","prettier":"^1.16.4","react":">=16.8","react-dom":">=16.8","rollup":"^1.4.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.2.1","rollup-plugin-node-resolve":"^4.0.1","rollup-plugin-size-snapshot":"^0.8.0","three":">=0.100","typescript":"^3.3.3333"},"gitHead":"b56562812bf6851d1f30c2786ccc9568e52d99d2","_id":"react-three-fiber@2.0.9","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-ZS0awiSeLvfN6dY0jAKKhh79nICIWo8950LWzRxqXR+CeVdTeplpo9qxAKjLd09V6uAuw+aHKfBqe6s+NV9b2Q==","shasum":"0ed230c30f532be68c3cbd08cec02bdc6867590b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.9.tgz","fileCount":14,"unpackedSize":323367,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcwdMlCRA9TVsSAnZWagAAeaoP/jhMbHTUP+bwsmcJbBA9\nN9bC25QGPdwfnu2C7W86GEG0cs5RzXYRYOcgouHzYSkGDRPKcRPOMufzQOhn\nHB6NSELctIrlT0rgJnaF/u+X3F7SrMpsGk3mADeHmyGnFTdNA7FKsCITFhG2\nmuoeFHTXaWpG1Qt+v+v87t4AcpUu0NB7X5634y/O1Rfj273ciQvobcGZyw6H\nV84WzQluFzBJayfAZRCLhUgEtxvBYIdZnCEOuvvTI69KPTGBK5Ykz+QaSyfA\ndu20suS+Xp7+o/oMbDoqPXTeZXwayy5QNNKKg7Q1dVvBoXl/tTQZqtNsYj/R\nalJ4+UTUvyKsJ2BykV4m8YJuUQylxHBgs6arEugrJ5GAF6iOIW0f38Cqp3EW\n9E3YRQygkoGXouC/c4cO/S5UdJdHNcrA0I1qYuHTm9H5Wk11qPUGemA9apm9\nD2RUAhvyUvFR3hhFajYfSmpubjJHVpaBDm1nnEwo9gaPAmePF5LWQXp/HdDL\n5SLTW2/jCZQfuJqV2XKOE3lU/xnsy/RNgLKHj5lwgv7b7XNYv/u3i+XsJ1NO\nmFveHSexgSiR5tVgEYssjMzj1iUESNriQj9ckQ9ylbQ/8ji9a04LwZKQPUM8\nejqqKP20vhwYG53vI1ItpPYSj/WFkOe+NkPLvmKzsbIxHADb3U+cBlI9zjk8\nRnI8\r\n=h2vp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6Al7UvxEirBL8RNJQTmB3BEYl4YQjZ28/mXwtUoEn+QIgBhyvN2i/48fsOVHlkpaWJnfliUwpIrqNh0DsIJMD2mk="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.9_1556206372359_0.2595647806177366"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.10":{"name":"react-three-fiber","version":"2.0.10","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"^0.14.0"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"a8daa1c65560d4dc0f754e4e59a3a8ac856cffdc","_id":"react-three-fiber@2.0.10","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-DSXUKzPBfcPMUK6vNb/F7Uo7WlheAqZUtMcwea6V5ZswOoshgT/2E7QeOaCF3Ko/dLTuDWxS1mHeNF/LIxA+rQ==","shasum":"01c1f5e9ddc0b11c549f5d43a9c2f1f612a5c9d9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.10.tgz","fileCount":18,"unpackedSize":281939,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyIOoCRA9TVsSAnZWagAAtpkP/3HuaCX8cp67axuANd6t\ny/QVg7u2M1ZcWKh+0NtfB7ZMoyuQvOxOWuodHHb0KWog8bJzeJX2QLo3elvp\nraSZ5ffzfCcGMCfx0OoFH7x2oBr88dGLhD8Pvu7Ctoc3NFxE4JO1OJPGRKhq\neZuoSALh3rhWBfzKU7GSkxOU0dT9lmRpcpGZyvtdhCD+ijys7QTE5ciXMwNp\np8uXMrBE6EwIxoe2iLt3bTa5UTTiqUnH1opgoE3Pv/qhjYLiCPGWZlas7uXP\npMwFqCqb9Hc4Tz+tJi1wW2MCLTyh0XraxpEZe6eNw7t4uekxv8HWp2Q+Bagt\nOgNjE21Jv481fVy0h7aLe2d0oNu4+yWgMx90+yIkHoQroUAxtHhZmREalPPT\n70wLuDDE0SC5ulYuznjrRMwmQ5t+69zTJ0HIi/K3uIEMi3AfNUsjq+j2XHJN\nOjyjJJtHSzV7aUYhxxGS5E4PrLCtJW6g6CcIxDZZ2emEkD+QJJPFN9raqbA6\nQN6NbqYKw2StqjHVsvqroE2iK4d8NgvtOFDdQ1LRUD0hZ/UPIVsiq8piyU3b\nI9l0Gc5WXD4eTIXmQbKBJIHkqpKZ9GCsPbqPmFmWFr8VMqqI6JI1L+JBBCbf\npqQXobBpg4t4eCD1ub99Er9jF7Vhd2Wd0GDdsp5IpK03R70jvFU0wNIsPNIn\nJY5f\r\n=wg+S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7oeWQOtpqcfVQCaFEFIQgeUZ04+LTSS+2rC9riVD91AIhAI7sLKPA9ptJAzTQBYnmPfKvsibZIDEIzP4xygilxNsY"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.10_1556644775688_0.4815398551033374"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.11":{"name":"react-three-fiber","version":"2.0.11","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"f096ece74bd5f18c73914a19357f6c253db031ed","_id":"react-three-fiber@2.0.11","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-P8I8UNTBfnWePcRjuEG+GwCpk3ng+UukbkuVlPbYvmVDXTqBTc2ExFSJbwI6/AzJx3kBLmi5JtY4iSg5EazF7A==","shasum":"878ae7515b668f3320f976777339d2495cfa910b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.11.tgz","fileCount":18,"unpackedSize":281848,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyed6CRA9TVsSAnZWagAAwccP/AhNI4er/WWba1AqnGy8\nNw2o3Vc4FX/TNzfQ0WFh1mXWhleavRH+2VsHtPU6wOV5Ph+zMY2fKxbfa49f\ngKnfClUcaVeSYbJUZWxzBplgPz4JJJa8O+JisomSusZMdtRj7yO9MXQFZkm9\n++VB7UP22pITa20ejffPgxuYbLHNGrzeTLn3kRwrr/KM91WzaF+azUVowsi2\naD76ezr9RgIPPBs8EEKtsxJCaxU1PdU+r3ewx+5Kl+VwPRFJFt9IpEc8vAia\nO0EMT4Vpvmfetpn+ec5CXkTrN3eFUhUL8mvEoudFEqQe/zTNnbtpWsCu7qWS\nqzjW+4BaYZ76w/4RVsCpMl68gTs+SszoPFMhVjIMcXP/QQN0JrVa5EwL2Ccw\nTZ8f9cqIL/Gb6/X56jPoJivf7vopVSMvGKiamAA4DS4A1cBTbTReUe9M59Rw\n7LEmKhKEtjDhFJe9FQn655jiH70ePRF/j4uaoeTwtVjo9OB51PU+klRozUhn\nAtpkqxBmt/3AHNFzo+K4RBj/O9HRN8kCTBAN45FLTiA3RHaFAAeKa6Umwdeb\n+KJim0+S0Vy22x+DKVVAZPRpYaTb20DFoWQvoWgk/MYH40wfL88cXDRoGOi4\n6TXzViecM2vxslQemwZKKfobru1SFSCZfgpTqmuRH4L2o5yKvgsUhl33mrwh\nrK0m\r\n=FyuF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBfzYk/7Zt+3tYv+n4+bcrznPGlWr4YMGJMcuYMxgaeXAiA2xMxMMmuDwYrHirRRqMVHUqtuiFYwE8C/ELIjtXwrNQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.11_1556735865597_0.20672981950377767"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.0.12":{"name":"react-three-fiber","version":"2.0.12","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"7d15476b99814cc74ad9e1a3a73f1f51b4786dd9","_id":"react-three-fiber@2.0.12","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-ANeRrqHlzc02FPZO/yq09K6jqRfO2zGICwkLEajEVPMk52jhZh+SNFixtDV6qQcm8RtOEMUq+xzNgI85hDe7WA==","shasum":"2f28a357ebd1cac28b38f700c83d0584c0787ea3","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.0.12.tgz","fileCount":18,"unpackedSize":281878,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcykZdCRA9TVsSAnZWagAACb0P/2FxR5llLcmO2Ti93Txr\n5U/CbVlbDcTQI8JtIPwHKVTWzY74wGXMF9ujZLqtAN3HmzMB6jYsfAxQ4dWk\nySK9GEjqTMLXI61gVoKV0i9XmOxaNNkl42Hy8PzDGjib68FlJbgEQEw3WBBM\nFt3HTixhUdckVcdP5LnXk2uYN7Fnji4FryL8ZQLRnwSDQ60o9t012kR3ExAf\nQK6Owi+Exs6Zbo5ky74jM7/ZUF4lVnoONWJrrqOnEHb+Yym8T9qL+aZhAve3\n7Dd0n6UaUJ80059Ponaz31XtF3wrBOkggSqLfSCAPUYzjA1mHM6/CEzWp/4h\nUocA+AmcW7PtQcLT3NQCL3JOjlsZSW5vxW+kLLpgsAG7cmzFW7A9AXWZwo1X\n/AsFA/1jjyKnlVv38JLFwkyoxhYoGjlY4f3nwgvgkBODL5G1ht+1Ye2yxPGl\n3Z/A0ONQi49fkzjehUnGJ1yU2/lqFYtG1v6OulCTL+Vd1ejAzPKmM6EzJQy9\n7RGq5grVF6ZzqEWUIQc4HDem2u35j39Sd9rUQqFkjUpOi+yg/Y1DBGmZqldh\nbnCeLo9v7cdC7zHemxbJAhyCO2alxet7UyItqITWSmVN4bKi43KKhM3SE6HI\nuegZNFdEYfhAR3oZYNDaOtAoEcMOB7SCnJ8Ew8ASGvVlGamu0kLLVttSdyRD\nU3im\r\n=73tl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB2L9BokUQhgW9cD5ckA9HsGhd6toQhv9KuqOZ23pHYSAiAuIj71g2aisN/jP4XULICak81RhKPHt6KdBFdqpQprjQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.0.12_1556760156675_0.08830405441687539"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.0-beta.0":{"name":"react-three-fiber","version":"2.1.0-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"864\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"420\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"440\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Threejs in a specific way, it will be the same here.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready (you can block first render via promise)\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects—which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","gitHead":"7d15476b99814cc74ad9e1a3a73f1f51b4786dd9","_id":"react-three-fiber@2.1.0-beta.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-clZfHpBZ/ZhzmrmFIF7vwNq0f/qgO/pcwQQv6HeP/XLo+Wlej11OTuiOTrutDa8nSKujkzrGiiW5CquQ85spLg==","shasum":"9a394ce470a00ea32bd30d88ca608823dc3a9b10","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.0-beta.0.tgz","fileCount":18,"unpackedSize":283941,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyuPmCRA9TVsSAnZWagAAWRUP/A4ivdiWr995RqdKoUyR\nUKOF3XqfpW+ek4iZa5qYJbkjfrY0fFSVYIUcruP6nMt5sAX+JeeCsnv9x+nv\nmSxO90sY0B3tkjb1EV+8eX9xQ7HQzCALucRLe7w7dNIMyK6LRW8+IxS0PBWG\nZzxJ7TT3q2hFQJ3m9PPveqwpOe776Jk05zVPbzOjOuJUUaDh5o2S+lLAIyzt\nEf7SiecdIQ13wiP82vmG/8Emgz9dk7PcYswGov4n2JvSGuSckb+Xm8Ehzr/W\nvJkYaj2LFrY4Djocqj6HLq+7bResi5ZCNjpNVcxS+TAD7ld4DZ0TBsK2pkz6\nQP+gHDNZgA0JzBZaAUeMWcT/9Iq6v2ohuw6jTVIXzFR2/vhRtGIlZdu6LgQg\nbty56YK+ONdifI+zSfw+LVbQ5NJJq39TSAyENvI8vtEPqsXeC5zvCHCNiT+F\nWrU3UoBA60530MUQvdQXEQnIeJAmNS4qwVQgFY44RAYIIOzDVl9mYH2Ed9yU\n2O9ts83EURtBLrcfsfb5zXhAPFQT631sa+XL2b7GR9Y1PzldH9eo5Gcfiz6i\nBg+jQrqV80Yx19nhiPwuD9pGv1S7jKftvp4NIDWk/5TAhh7CFEHKw1JrXMOD\nXsVeLWOtfL1ITVtvPDlBr/nFy9rE/uiEYrwRaPTBmELC9eWiOvKHnvl+clkK\n367J\r\n=BO94\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMgDlTPKXRmPupwCOnqdTI1YVhFVUxBnO8D0n83OFQkgIhANJ18b5N9HtsBs1KXQZuGlkMM/xiui8IAJj0vN75DelC"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.0-beta.0_1556800485636_0.43895597603538916"},"_hasShrinkwrap":false},"2.1.0-beta.1":{"name":"react-three-fiber","version":"2.1.0-beta.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"e2f9879176c6c96990768e098f3fdb4937a310b0","readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Threejs in a specific way, it will be the same here.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready (you can block first render via promise)\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects—which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","_id":"react-three-fiber@2.1.0-beta.1","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-cly2MCDHoHKzrpp+Rfc778DovW01Fr/pyTHWlNozL9jClhDSP/E1+QGhxA1Otr6DBZON8hIkL57tTYGWKYadEA==","shasum":"94bd7004e3ca8b55729ae3029f6fda0455f4c3c5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.0-beta.1.tgz","fileCount":18,"unpackedSize":284447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcyxYUCRA9TVsSAnZWagAAHpMQAKKRWCtU1DngQtJWYmfY\n7IOIrLHo5ihNREq64LJrwInGz/DVaNAjOz+ccm8t0MbjDE0cLMXd7bX6WBmk\nCXOsQPny5RRZKdN2Q570gcTsPbRsGIjvOiR0CKXuAD8d2AEA8M3MgwE5nNVi\nYRLZReuk3PER/wHwYX0AtHkj0AMFij21qnv61OCAiemDkq6exc0Qx09bcjwE\n6uNQknUrHmMs+wGAb4aitjY83+lNbbesBqecU+bIaFNHlgEgKgObtNeIEh00\nEl8Y81FI+ecyS8O39HcUAHRK5u+kPYCOxaaJOdS3Nt1KsUYK0A9UALe2wsgo\nXyLTB1m6Hg46qRZyTQlBHw6hy9EH+jTFE+JUALLlIrHqKVL4a4OTG9sQDfme\nlDktX9v9zW1PR/UozN2f+yTS3ZocqapgKFbEneyQbDpMrMshMuXcBUAvJH6g\n1FRGNuXY/uULl28gD7ikZuCHbTAxFF92gWEHdYDjyUb44kSNRoADpntrpMIk\nKRmFBrEXVt4jvnutwoX6F7FO1yAtgo4CP7j+m4RVqktRda0Dy+uAxme7jN9m\nY7g7tmM/AQ+yBmG5Gjnc43RFFnqZvrrXQwPdorr7GDyvfrktorGV8ZzM/4xL\nkHQ0k3Q9E52btVQj7hzZrvVZqG8/9313+sZdeEb/3n6O+xzveDY6YT0X7/Y7\nJW35\r\n=ssnx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDdy3mDXsKAZIHOhTb+MZDsr2IUqiG2cCS3X6a56baE2wIhAO2QPoPtQ7xzh0Ud4ByGhTs3hsri/8GaAAXDd8SZvWfX"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.0-beta.1_1556813332009_0.3139716533337962"},"_hasShrinkwrap":false},"2.1.0-beta.2":{"name":"react-three-fiber","version":"2.1.0-beta.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"ab7595d655c045ff0de1fb7c11900d9fa4e3ff6c","readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"430\" height=\"232\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Threejs in a specific way, it will be the same here.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready (you can block first render via promise)\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects—which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n","readmeFilename":"readme.md","_id":"react-three-fiber@2.1.0-beta.2","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-oAaZ18odBQhwCatcH6eAFQ+GqovJZqNmfryhlytnDEbZ1re4T6eN/lgX0u2/PsuIPHPLEFFKhh4m/pIKrC+XtA==","shasum":"659c5cdef5def7fdf34b8d38e52ce9f3b0f4463c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.0-beta.2.tgz","fileCount":18,"unpackedSize":285046,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJczBsNCRA9TVsSAnZWagAARFIP/RzzcoTN15XZSYenwNgr\nLumvJY8f/913bvO7A7HHm/D9K8bLu0/I5Bd3B1uBEPMIKo1DsthYi1vXAILz\nAJJ8BScN1QbNmB9cO8rQdF2BQu3vvf+JXOGCZ6JeiRFXVIdtzE9a+HpFkqpc\nrhB3YFQif7TtUhsQwXhPW3J5y4q4Bo/H57YZJV0MvjiIfck7ObEx6NbBjrOi\nr5cq4aF28bsD4sJFIyLGLxARKvPtvY5XAmzYFb81D889pixxDJtKIaEf133B\nmwu+pUjnmNRHRDe5RXlA+74GZNH8dc0bLfV2p4RmqQnuT1nNxUD8Bck5n9KP\n7+VFNxcLIt+v8tT50yq6Hr5Z/HcEG6Wnvijt6dGZPze0VEXnos4pB3kenkXc\nnjOuvaiTtWFwz+E+AuJf2DM2A5MykesHucWobaT1PMsIQK82l4t90ch62YWy\n7gYFWKKAUz2Kx/N/fV5BJpBiX6NA1vRaoFsz8I5ufF3jXZkMacwuBR1iLOYo\nzsOLmseo1AlWR2yQzM31YtvBL4SlWsqJfeUlDwpRfVPDu6qTZzcDPUMPppY+\nFCJ/pVzps+rY6EbheS0YeareCf4ArcoT5qQY/TEmCRq8hOP89Ov9yhuVXaZN\nIiuv0c0udzrl3AsffvlmPX6p5OS11oyBf/HV+KxBxXIh0oIQ5Mj+SX79AQqn\nk0/r\r\n=FqnV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDM4Owl90WzHB7HOXGu1H5NXMcLTFC9lMxvojycpNBKnQIgeJy3SDSnFXbjPsp4qXTJX1bb0DbdXBQ6Metb/CjjGsc="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.0-beta.2_1556880140181_0.6989626863620735"},"_hasShrinkwrap":false},"2.1.0":{"name":"react-three-fiber","version":"2.1.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5"},"gitHead":"0123fa689c76045a2ea00c7cb406d35b54f2db48","_id":"react-three-fiber@2.1.0","_npmVersion":"6.4.1","_nodeVersion":"11.1.0","_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"dist":{"integrity":"sha512-3m87uwvCOQpQdKxv1DrCy+nrAbJXWMza9E2UYc0nMlw/UiryJwbM5eyQe5Rv6+9o1gHzES6vzwSQeiK+sjPmPA==","shasum":"e5dc187e506cb1321b6beca12786db1c3b8d519c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.0.tgz","fileCount":18,"unpackedSize":287677,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJczrGgCRA9TVsSAnZWagAAEDoP/2HCm+bbp57jProagyYa\ngbPrxA/TA9GwOEG9Vq3T8wvOoiY4LWfCejsEPlga0iEPZAx30SZbYbaCGucR\nWcs/DklhF/MIZawjtmGn7rri287c8a2jfpwoePHksXxtk7t1OxXDm6i66FL0\ngxyCGniSfkVnLEF6oupZoPbC8KJ8ROGQ9e3bFP+u72qC/KPBPPEaX87VGp4P\nZbbXv1OFelAAc3UTcfTP8Ia7/N3k604sXXQCZduJY+BhCiX4SflsZi84q3cN\niLQ3gLVx+y1wzbxy4r2FOcox+ib7+vdfOpgwiNdxhYLYBGU0hnUjEIhkfvor\numGQsED1deoGZgX0/5lqMIzOFqNdFQYOzXhbKXJa1r9Nzo3KhiOhArOXJQUm\naI3MifS7kT/vbn6tEUFVPg0OxbRkBzdjh+TRJ1FS5IJ5Bw//tmdIXprv3EAF\nJplc75hRT2EhS3cpRYj02y01MZnM33L01tZdVI7kkRDJ1/Y1fTVKOxWu+go0\nxgzFJupKPfUxvvhDC3AcW8xs2wwmsfRwgjS3+29ysz182KyREaOHryMgGBg6\nih7+6m587dVlllziQt+sHD2YKDzVS0pnMxRZPwNnrIfbkJTGQz3EiLclDMHY\nZ9P/r/VfN2NvkQ5CMS6RvGwt1GwhnD53K3BBSigwoBvNT6KXm81GcGjnypFV\n0rW/\r\n=PR/i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDJioZSbpuSa6MG3sp4jcZqwIxhJdaZSKc+qEWwWKuUFQIhAPm6X/yTQ7GbMeNEkvjTVCCjvP1awllont5Zzrqt1Qh2"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.0_1557049759806_0.935693916079718"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.1":{"name":"react-three-fiber","version":"2.1.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"434bbff1195bbd5573dfa4d3820ae989c4eb53fc","_id":"react-three-fiber@2.1.1","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-XjAEOcD9vdbRbv4L7pakjQpW6Sbt7vEzupa+ZqPaCb6jYG7xDwY61NA6foWbCiMLBxe1FsAXYZDnM2PrrXF7DQ==","shasum":"16183835cbb5db68ae4611468c37580c87be8d48","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.1.tgz","fileCount":18,"unpackedSize":123092,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc09roCRA9TVsSAnZWagAA928P/1DtJ2L22B5JQsCLYwfj\nRi1FEALO01FNSKBBoFxRTXBErkE91okEs2eZrrxJ3W8fn9zMxpyTG/HTrX04\nLly7dc1ax/LDkMdUsfYZ7caz4jDUTZZgqVBuocxz84VChWtkOa6SBZ4KMjp9\nIeDpZT6Rq5zyXlR/cYt4vf03sf/paXsU5vaoAIXMnAVMm48BaBNzztd449mq\nQLHzvjAvJAz5Iu5HmrQi4rn2t7QvMCM/6yKlmuUi42fUNZaMUZyckc3Gogcy\nMg0kv6n4K34hrqIi+LxssuLcgcaIs0UrOgR5T7T2pcQ33RmD4+g7b4Uc+jHh\nzznm7Uvj7VwUuDQQyBSAQ1UVGcvwzoeusjDmAIk6sTXOWn3xjfUTWHIReLiq\ngshLk1XRJJpaGtCXYOO5Q0xKqIbVbice2kG5VdEkr4dEj1YNTcXOtychL31Q\nCiWn5wJWXPyFc+s9KofRIxiBBGPj8AkwzjA4eUbD/8SMiM2f2J9YCrwkf3BU\nf97hBZWZRB02LGvsQcGHT4ttLZQZGqHddDOn5B2MonPgVheJUB+FCJ9v99dF\nafYqkUaxyPuuTDYCkRofXa5TSyUMW1UyI4PlpeDQ4zpmfN86JvsHe3bTJ7Pc\njGZ0epgqe5gR6s5r1GefgP8FRf267lT3OvMTz+IL+/I5ARLlPtGvwlx6nMRk\nrWzM\r\n=y9l3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHIBoDwlcvGjqEkMlr1R8l24Por5keoNikVyN2djkdHyAiBkTNErnvWxVg5brqIPGWABEKtmqRWrHRHEnJ68DRdckg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.1_1557388007351_0.21616083536502195"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.2":{"name":"react-three-fiber","version":"2.1.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --jsx react src/*","typegen":"tsc  --jsx react --emitDeclarationOnly -d --declarationDir types src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"82dc043f475bdb7f174a475d5d122d4f47ea2e46","_id":"react-three-fiber@2.1.2","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-rq1MFhlkEfUkNztEA5F0UscKNbHznqqN3JlyjNHGwPWPmI09Qe7akdFsUtq4sPdnn2bR+IQpdGog3i5PW4eUNg==","shasum":"54588f6e924e0a313fc9b2ff745e5034a117aafc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.2.tgz","fileCount":18,"unpackedSize":123297,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc1+W5CRA9TVsSAnZWagAA4LoP/jrKRbRJ87YvQIXPRui6\n7VD46Z0HCH1FA22q1bIxSYIADUYEYmObi1Vi6oUNvSkCt+rRYLyFOl44hCo9\nYmcnl+tJkPHIhJy2tGA80EOv8qpwCrjXCL6RMtnbQNfo5PSQN8lPnt6mIx+v\ntPzDMKPJUmJi1j1oXiZNxAYIT7HI4/SDg27RybVSZpOFrbCZN1kKezrTrxTA\nvONdbxmjkAyI/vl2HjOKAFK/QgA6HghsgHF7NYDXyrdSSMabLYlLtv8z6QmI\nnffmgtaQKdyE6gFuVzK8DTMm9VNpBmhWR1+AQ7xg3EXvxTJ609sAZh70+t9a\nVNnX5xqHuL2m5g9Dao5ejBG06Gv3BhGieuj4u/m/U4tW6X/XuUbjo3vm3AOr\nnF8pPd8AsaaooUbC+R7ciajDo9EVLBrwxr80SM5ArwuURhWz2MoPe5HR4OF2\nqjgo5z9sDONMj2KsJY5x4bC3//Zk813FFDJkBChyhWIV2ZjZYMsoD/KJXFW5\nRsumRUr6URgQXzTu5bBzKsVdF3irGlKST7/AhRmxhnoXI7qzfekN1V7jbAsq\ng3aDi1zr8hDDo5eT7rEf+Dh0F6LqPTwI/Hbbhfl+0480uns7uRs8Bf40dpm0\nM1c7DZBfXIP5moNqhHBnugmFR2TaXV+PytX5Wl0o7wtzDI0EKYOB5GK6fHQy\nXgCy\r\n=HG8w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdW5wiqpjmH3zrnOJBZ4bBAUnZTqh2HLungtmlHti3pgIgWywX8y9YPQwFOcplBrai/5AT/9rpjupjodObX8L+nys="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.2_1557652920975_0.6094659046342277"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.3":{"name":"react-three-fiber","version":"2.1.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"97dbfda0fd7fc1083d5768f7671a154a13eb271a","_id":"react-three-fiber@2.1.3","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-GjzyB+2XbI/ZpwGUNoxN9BUuBvcxp/R6D9/8Ij8llXbwTCfrGpkHRkJHR41Mv7nhpDH9rA/w58KQD8emiLXT1Q==","shasum":"99b4e677da736e8ff8f2df100131d78b5a5df32a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.3.tgz","fileCount":16,"unpackedSize":128206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc5q/vCRA9TVsSAnZWagAAkycP+weqDljMwjDKqIBlmdxW\nUIuEVJ5lE/mMBJCq+EzsRbkCxLV+UeENXXcnTvByZ3pOYmkWhqAOX1684YY+\nNd3zDj5+NatYQOexHaBrN0WiX5doSUf/QFMnfL9x8FPr45WssvRgvBqMwgw/\n6GUq9mxK8A9Q/wqPUoPB8I45aj2/DpZ/p67gcD5KtDMRhpk++buOww16aPnR\nUkCFyeJRthDfIZI21XNKuykqlNpyRNMNJGAF/2LU8kC0yHsqMACVaqIpl8ag\nbip1D0YQGanhc4GSCRIX8WLR224ZUIpxcqxt/uflGP+Q6iIacZFJKlvS0nCT\nDsrzkVhV755NTfpezZJUFFkaR+TwMt7obxpAAyj7XAYsWbRRu1fCwUdib4XN\naGwlgSkq5gpu6p3k8Pjc1z64mmqrEnXqA2EgHFa4m1y61AaB1ju4VjXxDW7J\n/lTIgNLd0zDbqxbktcEo0Kg3DlmbKJbJ17JEMl1WNqVols6F5JlV3LSm/wq5\na6NChzVJkwTVTXPUsIC3DxIAF1cJSRJCpY+dvuKzLa2nzcJjiFX8vXw9YpqS\n6/rEbhIrE9tZDJ50iOeXIrZGuzQlcOp+rCRkGIGeMdxrXb+GYMiuKmm/BsJO\npasuuC25frV6B6nnKezHrZcqdGS3kXKkguW17qBGGRcYcTHSPnxMyr+fKTbN\nf91O\r\n=kRg4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGeS+btuZdJAzxjc/E+hTuSt9sCj848cUkv0zOk1wCp9AiAjRILIPFvF/MZrvjjRysyAUsu107vpYJ36v2GaXkMaAA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.3_1558622190200_0.0184389739797024"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.3-beta.0":{"name":"react-three-fiber","version":"2.1.3-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n#### Difference to react-three, react-three-renderer, react-three-renderer-fiber\n\nThis is a small reconciler config with a few additions for interaction and hooks holding it all together. It does not know or care about Three internals, it uses heuristics for objects and attributes, so that we can get away without creating a strong dependency. Three is constantly changing, we don't want to rely on a specific version or chase their release cycle. This library works with version 1 as well as their latest. At the same time we don't want to alter any rules, if something works in Threejs in a specific way, it will be the same here.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices, color }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  onCreated />                  // Callback when vdom is ready (you can block first render via promise)\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nYou can nest primitive objects—which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used *inside* the Canvas element because they rely on context updates!\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, denpendencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Receipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas.\n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n","readmeFilename":"readme.md","gitHead":"97dbfda0fd7fc1083d5768f7671a154a13eb271a","_id":"react-three-fiber@2.1.3-beta.0","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-CLcx/pTX26MbhpqdwNa5RhGarOltmnCSGdYXXWF75vki59zHu3/lATAyXkfRS/v1beROFyR4xJNG/XMtGFLVjA==","shasum":"c68df6dfd8f3e13b0b0bc318ff2d95f7a8e45927","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.3-beta.0.tgz","fileCount":16,"unpackedSize":129233,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6Eu4CRA9TVsSAnZWagAAGusQAJjlBNbUxTjtFcDppKKI\nI/YVl+DSKAlEIQd1Al+X7ds5FGYoidCBpwcICfqIrr5YM52n0kzdXQMgo6AK\nfKlaF/s3ETkpNtSz3rWlHulVV58t3Mz3v84RjJb4iWuJrhorPNk+6nB9i3/G\n+OgrO+5MoL2vjLirCW05k6Y8Qf436+cntBY1DJARF3ySFiGI+qX5q9em2Y6X\nAeM4H86lLCvMj2IEAz6v/AvisEvS7H0RBrIBHLPwFEzXTijjgeWIbcQktPhG\nTEawMHA3ee8/Z6fNDowJsmTe2s6aHCTV5hHptfVSheLsUTVxL0+cwXTMrwuH\nVwv3VnXdXxYFb24H2jHHAGm8xxeK90dSfyzlOd46/bOqduY/ydQfCBDJ11Ht\nSkyG/hXeQsa0QXRt0ruDghOlzmUReZYGTjcouGxKFZOVR+diVZ2aqvnVH5KX\nOKpe+2bqZbWfjtbMRti87xplhBgpDOp4qjvyF92OazjcV/Sy2Jz8d1Q34MP6\nXxjrWNDIAkPLHF+EvNIoOo2U39nvTnoA9AUotOqYuUElk34ohcv6Y5elwavR\nwhGCHYP3Lfzq+ssYvq868TTczdrYzO7rIo8omzBVSSl5wiISOFg71B7MyiXo\nBMRfQrSh7iqkZk7uGCKtC3sOyta9j2Yo4a8WlBdS9lxhf3aVX8WtlUr6mY30\n13e0\r\n=7htz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHIYOH6l+is9baoZdtOw5XrdlHpWTzFx7Ju8pF4tF5hPAiAOO7xf6sQuWR3UETXi/ZGmO4wuGesovrf6Tww4h0FfiQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.3-beta.0_1558727608030_0.34793790665286517"},"_hasShrinkwrap":false},"2.1.4":{"name":"react-three-fiber","version":"2.1.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"f2efe90fda0d456d8fba38d79495006628c5cb25","_id":"react-three-fiber@2.1.4","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UBZCCvuxcpiikzo0EaX28kQoiYRjHOXnux9Sdu0hvoi2QaRhN4PR+W33DD4sc4CyKI8uhf/hJTU2Fzf2uNNKtA==","shasum":"a3c74822b73d3a86fb459cac321a231ad1332094","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.4.tgz","fileCount":16,"unpackedSize":129778,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc6PslCRA9TVsSAnZWagAANKQP/jLH79oU8EJ7oCSbCaSi\nYK9Q7fSZWRQrMMg3399m1ammNhP9840ICcipgr+SZzUEpdrskYkaJuTrRaEQ\ny43SNaF4MtFgjdmwiQP0qzmlzkhlq7bts0u2IChgA6OVLI58JE/o9FH+RxUH\nNroUoRNeQm3976O+rm8m6TIyaqZSJkJNjBK5UoSR3eV7pBw3Uaonj2ZrOr1y\nYdIr/aw5Zi3vR7YlVAmR2LJTX8NlkVRHD6cSfCjcBeVUcNFQLBYx0kSVhXXk\nLXga2oHvfTn1OOu6UBjARlu0iNLwxCoXAFWkOGR5q1IVGift33YmRfSbkhOu\nrpxB2qzcJ5/pkInOJXSjTESmvlF+Mn4UGHGuIvnYb76jy/QLUbpY5NCezfMJ\n9dYqqH1qpDBZNIGXkm90L6QZj0qzIK/Rg0JkQzoOLtCFpvsU7NupfRjdZnB7\ng8IQCNbpulALCMcXa15eUyJOmnUk+kwgOKIonNHpsfnrE9daqT/OoZDmk8Fm\nq/ssgO4IhVRoPAYfkgm+YBHdWzsFD5Uya+iU6eIiiLCVKeVRRi9/e+04vvcT\n2KPjX1h4lsCrssVWbhX2sX7+LA7TQdU2yCTEpIIoD/acg+Ba94BaUR0wZpDm\nQ4s/GAGh0NaAQOdkUqW/UQZUv31Q0/dsw9eZ3fzA3JioAXlN92vVvLNp+dYG\nFLhg\r\n=A0od\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICVmGw59/mr/YSYK6NM3BKq7WLNkQXWJtez1kH6ASMCuAiBM9Kn5milb+WhbpLja9Dmo7LCdPuT/oNLyX3N3UiWAQA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.4_1558772516392_0.21581603133511362"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.5":{"name":"react-three-fiber","version":"2.1.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"3af71597e58008c2d4da84af29a7e38ef71fd4fc","_id":"react-three-fiber@2.1.5","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-vMlzzzRNTH8V18blWqogNh/8z3n6ncbCGXuwVYRJBzsranC8Ld8ABFFzDDikmsaSFMxzhTNJizOqWVSovldEtQ==","shasum":"d379a23d01cba089b9516ed683354ecf6bb3350a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.5.tgz","fileCount":16,"unpackedSize":129912,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7+DlCRA9TVsSAnZWagAAZRsQAIuZaWaTZUYCsQYJ+MZV\n1dAnpB6SoWSQIOC2cB89FnK4ozaVIcqGRkFyw2kEfw4CjR+GrtkOWtnrFgF5\nwSpggFJkPRF8vQw3vhrSFf1mN+0hAo2Riw90e3nRr22H6fJA0gLdHWF3hGC0\nvT/l+6z3dtznN2KBaiqw0F/IE6gUhmWeRJ2aFR6nWkQPSDuHKNJLnFxqCfPO\nHWhRq/HaAA5o7ZRGw+ks5GsQv/Yger+0Rj5yVfmX+HorFazquQ0y9KBSD2dO\nsZwxtFgfn36vRmH/FVqRTBGXEu68pZqqnY+5E5g5kGBlc0+z7jQmTL4n8IIh\n/0jCTjjhlIUHQcMwbiiwRsvvnwRuFDT5zfmz7TCeForu/9LqsMcnXEbwYaXq\nmt5nYcgtIq7ihgCwU6XOj67d37S202cA8rg9SC4YrXRY8H2jqZZfDiUsfy+F\nzaJuMtt7n9O1DDteOASVKI7VtaQoR52Ceu5bnIjKEqe68kgKIxA9HCUDInCG\n/m5Mj2cL0BX+DcxDGOiaD8JAXNm8GXN+XGDgh3w5SnNaiop5CQo9ciwdCRjD\n4N9iVpBBRk0jahro6zE2259M9Cpu4bVuO1haSUYBKVOLXCYChZ0hDXRt4a/F\n8TweFEoKRwCNm15CXfBMLwanGjfOl83GlGVdRexmgGA40vuc6ghOj5V7fMmi\nDOcx\r\n=RMJG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwrhfZ9OUeAdhb7N5AI+4Qb716ImGwDhAZzQWhTqNEtgIgbUSzdkUN0BNhKM8fmN9Z5WYcsGTybCH6KcfENbi1GtM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.5_1559224548763_0.8955197317528976"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.1.6":{"name":"react-three-fiber","version":"2.1.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"4cef860005c943a5c915936864f2a47d02e1a4c1","_id":"react-three-fiber@2.1.6","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-e8ewBweKXhh+Plmv9r2tqmRlX/Ho2P8IGGhAbpT5bhtHXmYlJzo9pMdTj8KYJ/hPB5ggt6xfpq91T0UAjVrBqA==","shasum":"da7d63d079f58de5817c7f37e43b40bf0488cef7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.1.6.tgz","fileCount":16,"unpackedSize":132634,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc7+hVCRA9TVsSAnZWagAAMBIP/R498z5QPnxoNrxXdrb3\nmxOt5egE17RMeTbr+dYAW19RUXaCzcz1UpAhLZrA0Fo01ybOVQkj2P9iksCE\n0MfuP/TdoW5aK93J4DeSxFbfJrlPijhUGmvhf+anH8fEdx9LhwDk60N4dPK5\ngpAOD4C+SFQnXUkspoqkZF8ez+yZqGxJFKhfJt1RAqaTuDGvrjD0RVu/C5Mh\nBNRVFzNdCZFtLxBPrbqWuFL7xfYQG334nZ+M937fisgESybyW+OB5X8+o1zc\nBGwSCgLa6o2K9lJAzY7pUYMAZyaBNDoNXIXolG7zbqiz/MAB90L2F3S9mBqf\nrwhywE8svuKp+Eu4uPfANneN8XIFAqggA5d3Ry19f4sMozZkta4+mwLWO6Vl\nb3RNPWGz0dwQ2/Ol7Es5v6Se/Bm8sGUP4BBYZOXJXS0s0d932LK8SyYcmSvx\ntlb1l+ziaGS4YqNW/m34/+UGSSgZe+2i/0TrAo/2+OQlUxF8JEtpZOnAe6l3\n7mzKVNnLeIuNRz8oUNRi2qSGbPV/uYQ3xWBOBjgMIU+X0nnF8/kMMfBf1SIS\nHQckHQgkzp8n9aLtGZZYJNVGuUfAgtzneCObmo4T+YaTwbRLPMK+ZFbgboOS\ny9rMdrXwNVjZTYY80WzK1lkrjSPCRBwKdUpgvfGJpOlX9+d8h19GB83m3kb1\nqQ3S\r\n=bgDp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHonKZogmWJJ4b5IDKlwhdtdqL8Y99KNxjrQoJWKwGuuAiAHCXvumVUMHs504yOrrmO+r7JJaklQ08nT1EUsH+H/QQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.1.6_1559226453175_0.27250638293839935"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.0":{"name":"react-three-fiber","version":"2.2.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"2e8abcdd0f118117dc6c52d6e4e6237d87ea9426","_id":"react-three-fiber@2.2.0","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7Z/D2JCPkOVAaekBt63l6DIiOi4esdyJCvxXZIH7u2NlO1ue5yMPgvTUKjJnG0gyK+657o8gKgA7kRBhoqEU/w==","shasum":"e5d05005f531cd85add3c86fab510c0417f8984b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.0.tgz","fileCount":16,"unpackedSize":134988,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9UViCRA9TVsSAnZWagAAWrIP/R7klN4Z8l0ae/M6QTdM\n2Q6s34mSJ/2PG59vbk5d8TKFdZrH/H/+gqal2Oa136NdvmgNvVWsYirclXPi\nxD6Oxlwdn/hj2V9xEX5S9eLCZSGrYCw7q4WFc9Ndg9saiO1q+L8/4+6z1gES\nDFI26xg+rAI/N8sK9dripIVOS36bVQ7wBpNNXnMmIbBdxLHprCwt9w3M7CsJ\n4XieauopGZmAlpoIYVkAD1tlLL7OVkit44wLGh6nKsKIAgk4jFmkL/6EIVWm\nNstLSRWwE+KfeaROxlGxK0TIDlp07Y8fA8UO6IVD6vKEwmbNjr8Mk2WJg8aW\n+m8P6ieq+LPr00nge2SL0U5M9jHIthPDiWlDW746XPoKNpg1zsFcOX0+1VVm\nxFUuOAAXHeLtvabl+pHm1eZrffwxHP7HM6YrKVKiQkfbN7Skly6U0EYtseXL\nAou9j7GREqH2Cll1sfFlsNM3h2JYSytnR9O5kRrqd8Y7bZeXpccMmg6E5Mm0\nV1zjWhK08cCCNHKBD1cQDW+IAgDsiV79ulXLcQXas8HvsJ41wmpH1uFDNXso\nFjNSNcr1YBeZfsVY89DTe+L58Sj4jq8unsk14lWyal1mY5fwVqdb9m9l7zhf\n79XSiMOdbPkJn/9p6L9ZZ11wGwbysHEtWxEJDJkj6fWFnGYH8uf08Q6flZYa\nEnkF\r\n=fTd2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCH05HMNRBVvK3Pcc4z1PpnQiQYbteiGBDM/u0w/V6KlgCIEzGa9iZ912WSYDq1Pw39kLovy2bHz589KIYJALmbYXQ"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.0_1559577953524_0.3198179012398663"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.1":{"name":"react-three-fiber","version":"2.2.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"eb737eb6400edcfd1a3ecd736293f81341892d06","_id":"react-three-fiber@2.2.1","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-bkUDX8WfgB7KiJPtIhljxhNnGjneaYW0E/mTSWnEj+eUwECWjyHJGAL6n1kg6+FZEUHCu0FQbnXiMRJsVtB/UA==","shasum":"d48e210053579a5c1e44efa84b4eea24f0d9cc29","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.1.tgz","fileCount":16,"unpackedSize":134988,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9UzmCRA9TVsSAnZWagAAJmoP/03EoTqZi9B2ty9McXUN\nKkxE6lQwbp1/m0IBGQlP3KppzEtxn0AOgwxsyrI3YuSzvH6eT5y81K03BjDV\nxBHyZ9C7VbZGsvv8WjSH9cgEX7oTcFxZEOg2rp4V2RkJF41RqvH/k54JKaNF\n8yNi6LiwE3fZy3CcheZlIX1tf185O/ZMHq+otBAOh1qfxCHzxGXhoUeU+6iI\nKhnnDaCRGZQ2+B1NxjigO5nQvPkBv34VrkhoJhvlTHWpoz3NP9BGfvo5VFXh\n1GyZAgA2KYHhlduQofh5NsOWMnSmqSPjnuGcOgBoGnpDzrq4kvi9JePPtbTP\nv5CBlm8X9mnQv1uqXND7XxXm6/B9jcQYF6v8ZZwPTtHrDVnwQ41JEboWGdeB\nVRsomhtE6v95NWFkiPYszU/0ZIonwzEV962d6pUF4MK6kvJEEK1eLQinEHyH\n+Fp7Hl2Pugr+kUtMDuSH2ubw/7RgIAwVHyGs1dLh52LOW5a5ImJz8bnUTtv6\nZqmuMLZHuxhABCiBvgOCxutkQVVfZCtLRkdZ0aJWsCu9/qljRqZQ9kFhxID+\noA2wah/wp+S0xAA+HWnlRI6UvdhzowQK7JoyywqK5ausrJ+382yjcXHh0yl0\nEJq9Iv0M5ajdpC/d5peBKqZ41KHcIgSsZtg6ktAwf9IhYczjyAv12nMNG9Ui\n+qEy\r\n=bDuK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFmNsbgyGOW0G4suIt5LoXEIJcMw/6OEi4+tdDq4pIySAiBt3yb7PW8ESoL+v3Ii/njfTrviZCtPePKLgY3Mx0TTuA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.1_1559579877477_0.09277174476173089"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.2":{"name":"react-three-fiber","version":"2.2.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"64643c58012584b2b060a2f83424adbb99a2c505","_id":"react-three-fiber@2.2.2","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-k7WPMewm05sd2CCWG0cUc0RWZnytMRaKf1VZp/SvSwR2HoC/4IJlYn8Gix56/9276ekgaOC3B9MxpyF0aDBzBw==","shasum":"4db1de47df961926acad6c81f3d9a2ad0aa05193","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.2.tgz","fileCount":16,"unpackedSize":134988,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9kP8CRA9TVsSAnZWagAAY50P/2d4x+IrADVDRfEPV2IC\nT02HrFSXdhyFoRqEQ1lRi+aRC/Hri8A4KV5x3/pPL2NSB/HPea5M2yrUk5tL\nMI91d9ZBE4fQBYqkwiY52bROUt34JGzSSTHMPJM7K7nnHyt++u3feeM/qOfN\nbFDlP5JFMOYLj/8z7BRiH9jzAtJjqF35cRZcE8i8UmGW7CrQKTqEsWEcy+5H\nAad794reyetxP1A99FtpS1Wh6xF9sQmYVvgbdylnK09DUrV3YnB8QYi7I2nu\nJoB65Vp8kQhqtTtxwqnsJcp2z7C9BHO/mwBKHMIHMrVBqheoq9MB/TI/j2C8\nWJUwPjc0vtXLQZC49xo916FOB8AQ0oqPG4LvQ062LqtWJJB+s3NFxmF3wDu4\nxVhuVKBy10q3KKY/dMKODWv53tWUlvMiiSy8WhGLhuR3fuea4jpmP7KaxTH0\nCbaKKsMQrj0hCEqJN1g379ak7TbDlc+6H34ZtsJTpA3HP9TsDf/2Pr89gnHM\niGbBHClTbHyf/1S1n08r6WZ4yfjBjYiLjf2+9UaQuUea3nJNdaLC8+BSlOyt\nwp1QRcbdTr44+ktDPadGTBiRe2V0cdcg/VJcJe/JS5gNtxjRiXOuhIKByA9P\nncDAC+Orsz/SdokB/TAdfZzAekf7Jg6/gMbjq8VUOU+IFaOKih5ZzrIFIY9h\n24s8\r\n=SnNH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCC5K4RMtGb88GVy5w+LS1D6TX91abbXAJCTegt+kYNEgIgN8zO+CCETHXJ8aG0wkWaQgTOvO7ajyHVe3eYSlvbyJs="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.2_1559643131265_0.059326465057902844"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.3":{"name":"react-three-fiber","version":"2.2.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build && npm run typegen","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"66c09dc3d3ad3dba76a973a1e4014507750aa3a3","_id":"react-three-fiber@2.2.3","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-y3qkF6npMg0CNbFvXa9d5oIlOCZul6iuoh5Q0VzCfS1qpjOHCK0anIb2yDXleIv/6b/2ZyIH1EPRPxkjregbyw==","shasum":"3295dff21b6f80b97394acd50da3a0189e319a04","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.3.tgz","fileCount":19,"unpackedSize":135193,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9rdfCRA9TVsSAnZWagAAl20P/A/kfYutOyMloanVwmkG\nhqlosMHH3xNxJP5QHO0b7weOmI2Ra+E212ajLT6jb/poSfiLZ2mUHm9+gf9b\nmULT2kl7AASx0JqJfopdvn2w52Y09xAtl5+Ov9dQlDk8BjcUdJ+QPNEf/7sW\nXJlwR0d98ofTlXQkOQjZHCffMRy4frN9jfj5bJlMRDe2zPfWGa8FRPZvS4aL\nhnVDaKqYzZvpognHIz2fTrkZXSVo2P1Q5eWW3/YnknAkfNfjCDKlT+51vw1V\nxEiXJj6j9ikd3S3j1rNfkk8rQSrE24vPmmXkfEtkCwxjcPZ33Bl1Dq9zEflc\nSVwBCehN6+DiRcPsOTYJQoGckt7QuCc5TjJ8dFwvZ6uGV8ZvM06+nZnKxO+r\nswaxvsWRPem0w1kzJ2dRIWhPX6BD4nuz2FXPXhXrgvG2FzwPzeoleiLdZxVI\nkKa36oKdlBt3yvSC3wTFd1p7cmCJRfa5HynOmVGpxp4aC9u1/eWnflN0Oubb\nikGflHVj8E985m/43OV6acOz4n36cqqDoBiLa+hFZRrKHNvSFddoFr8Lc5o4\nhCCycS/kO3YgESIrDQ17Y68PlNQfCm76dkQ02NfCyqZ8fvjcd84+cPhVNGsP\nwA9i6FUZkXnDa/yCJSWjBueGpcGYDWDQ/3PaN/udiSLxmqOP27O9pwLqYyl2\nvY/B\r\n=Iv4h\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCbHBReK/qRshvcB2FsTETWapIt8JI8ia9vYi1JG+DZ9wIhAO+ZTcKJXZAXYUHBHKvsJSBgPtk6p11GudzOuBnUDL+k"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.3_1559672670118_0.9049366279615381"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.4":{"name":"react-three-fiber","version":"2.2.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"34fe4f35d67d913a68dfe8895056bd67a1e49d80","_id":"react-three-fiber@2.2.4","_nodeVersion":"12.1.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-D+7PpPImWj0GyLvguvuQygUVWnw17KpAZypcEnV6EhfnaJlGpDsI2y8BmA1pz3EobJEcHebb7Hvtr+ul3Ym4YQ==","shasum":"a20671e5870d8f2e470d670f22b8276359b963c8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.4.tgz","fileCount":19,"unpackedSize":135106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJc9rfjCRA9TVsSAnZWagAAWl0P/0BfAaIUNCBifu2VkAxm\nixzekNAs3DwnRtWKMTyNWTzy+KPmcpZjPhbqiNY0HR6kJ+xKo3wITYAtyTSh\nfqZWZ4oD2Z13QUWD0SP+9Pbt5/13bThj40mlzSz5TIUlgZlXdvNlG/zvascd\noWC0cDtJfPV1cucafJm/iXC4fgkw6ClshBpKsNDdJ2spImxUKkxslzBfNos8\nx2bh/xPijY+yzs3YqXBMRYo48QRkDWzKJSMvBqz0HRqoQJRgN0+hVpqQofoD\nBaZlEOkn3ZZ0e8UD8AIUY+9gMbdApXe0MBV7aarkTh17ywM+LF1QAEeu1SG2\nnSiq4xCDwXXkZ/2lUOyProc6iRV4tVpRgX6qHQgqBB2zMEGBkyrOPZ3yA4Nj\nQeYk07OE8OwrYK16T9YEq8WIbHmZhr2vISxcWzbkZUoTYT6RDc0qs0/FsWu3\nomLgflqjBqXstPoUh4LKFGuzA8I/yRNYtklHpGW8n1LDG8xvs3LLjZhjciQU\n98YkG+qXNOqrcJvX43WPXzFM9m6aPuCIhADNPxpSLABiEadTnDBjta4huiI8\nudtACkXtGeIDPZTyfDUW7Ui95G9g3wpgb5XSCWkn0TH7enujYCD3lHZ0INiL\n4mdUbNQoNIESwKooXKoPqjUMtEKQw4G89ytqLBExB7VfIKvcOpZZ2qhlbUIB\n3wPf\r\n=XQ02\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCzLO7/0tZI4kIs2p5usdHwRtLUsohB/fboakeDUgJd6QIhAPzdGG5wF+EdTJGIgyUUntaxXpdfMHkVF/2oaw5DYCzA"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.4_1559672802797_0.250415788704613"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.5":{"name":"react-three-fiber","version":"2.2.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"6843e94ac081d1a275acf7cd641d4d27a762b372","_id":"react-three-fiber@2.2.5","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-tqiFjFH+jMuzlXFWxhDBssTg6N/v0W5nZqXUxU4OyNYAtp3pOwp4+wm4IzBc23WGpVmDrxA5TpX1lrKoBrFpSw==","shasum":"5b1140805d45725a19aab3074cda784bc020cadb","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.5.tgz","fileCount":19,"unpackedSize":135864,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdAOorCRA9TVsSAnZWagAAA70P+wZMVRSAPEZog8iN6EfH\nwcbkCg7O1LaIR4ppfMZfzBQ3pbVAClTdkku71hw7FeXimAkEznTeFEDLMUvT\nlzSjroQ8c3nEX3AeJvmLO3EGEiGhsw0ZfZ+ptUc7/QdaPB268ft73LG+tXzi\nuU+0NWTE+kJ5lfwx3mW0gdOs21B0JXI0w0RqnDpPZVHLAH6kzbEWNcRIDUA9\neFe+zggmVlJPimUp0rMle+gEvWMev39PiosTneHx0qqzIDaSY5kA202KHGnl\nYienQdJcjRFbFsA+jqlpuM89804CwiztmgHvksLKochFgUQ94H17z0YSlqck\nPfDC2dV3r3q01cYK4HrHxcUNwcthNAKWgVXccUVF7MIdSxRbtWifaDbS/+DA\nQDoRH9QcU5snGjJ8fmKazYa9zk0mv5JehmbubpexQDKcI0J9bQqwXdKo9ErB\n+m3NErpwSDnuv8jVJNTIr96Mbrc/fKa17Kfm4HBeCvWrfTm7Wu3F86ds59BV\neL/KYNHGzihpg+ssCC7U414z13dFylRjIbtfqepoiy8yK4CyOR4HOnnXCO2I\nHuD5bG7ONuaKTlOhaAuK1S6HECuZFyD1ICtp4EaoTX9dLSkh+quQIu+CVGwe\ng1aIyjM6Zm3vmWxbJiT/FYdUn8RJFEmpwbvohotkzFA7QOdHCyiDLpVvNrRl\nqeAS\r\n=oJEd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCswus5UvERcqYI5+Yu00W7B0iwKjiYnD5+pSBqlhgYPwIhAJ4IDlTnt6HubU/mnkTikqY62ARj/BX3cWXkDAj9iQsD"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.5_1560341034137_0.14801094652064717"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.6":{"name":"react-three-fiber","version":"2.2.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"62c1672c94f786ebc90efebb88b7020dace1ef1a","_id":"react-three-fiber@2.2.6","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-o9AfbkOUBzjPq0HTkoNt/m/FJ8QhCvKsKu89DaGuwwX32O9+m7mTfUBazC3+nU0UUYLwqY/bPV3UU6YVeFsy5w==","shasum":"0656424a36df33fe03d9ee4a81e42244b6979ec8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.6.tgz","fileCount":19,"unpackedSize":136745,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC7LmCRA9TVsSAnZWagAA0e0P/2IAqsBvIS5+gIrt24TC\nFsSl1mB1s4VlQ9Q3C4GPYMhfx7LROrLlw/92NniW1y9o937eUTxJGN6Xmq1E\n2CHF5G9tQ0S8PNQiZAm11dMscim7EGhVNSx6Kex2rFEtpX+fAM57J3xD5Dww\n9Ovt1m88x4ouAYr5+oDd+b4EHPP+XRrVVDGh19mbucbBfBv5FJsCXnuhRX8o\nlYIYosjhWpootMLkEwoF4kGHBLBMaUWfY50b6bjmkV36yP9N8hE52HSDn/JL\nvnDc9RTQLQBFn4O05e8Ooq02oQ4qZG3PtFnoNQtPzc4q/GpYI9whBPUV4hFv\nhR7H2fMW9dfVzOd7m7vdItccAtoCt8/R9asyyJCALvB+Li2I+jOSdzEOfbuX\nB+XK3rMtWhugoi17d+cck3RHk8gPkvvIRMuGcuuk/S0XVL5OQekh951cGtvM\n+ZEppXhNzeJauYnxGVhedKssshWjBBSIkUlpRYnQSZhDxYkCiGSOxz69Ck0G\ncDIl7emmjxipzmahgHivbP4usutIxkOu9aZemEMRKaM3iGHEvITNp5Y3f8iz\nEo1w72HzcTsmzMV6fOCP/ON7UE8kpNlXXV8IVAVrlklRcXA1ZM8y01cD1Bgp\ni6Oy0hLsm+PCXpHMI/xrynO0IcloTphU3MsoLC/s+kp2efSf2/ETH3fMM6Xi\nTG6j\r\n=KzhX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDif1d5b+P3NZqLsFvbPMe659kemaV8LvLnSgDSaXCb1gIgFMKFl0Id3NceNNulye2Tiw+hJaHF/w7hun/ZP76VpC8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.6_1561047781654_0.833994851261608"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.7":{"name":"react-three-fiber","version":"2.2.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"962c311c88766c81f0bf56c53c79507a2f324cda","_id":"react-three-fiber@2.2.7","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-zlhbz9MakCUGavaoMNF9QLgba6mZ53RnniCQsbf9+lG5PMYnigjRzgVzORZJyG1URqFyWwzmNmoLNlj+kMHw3Q==","shasum":"36c3f3f60205177f3319470d58f4c3cf19b35725","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.7.tgz","fileCount":19,"unpackedSize":137181,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdC/TWCRA9TVsSAnZWagAATdkP/2iM15nXMp75ckIPF62V\ntthxEBsLuVW1yBkiJUwNAta3SlsKcwdRG3q6XBMrDJPOCe25jZUHq1zCTOK+\n/JmjQUnKRgfRy8Ru6cWxuGjFLBuXwu0tDoyYH3BTTfjlKT30LQBVxJYBmhcy\n4Gn2xhkJWur6i3phbedcoE8uVOCtK8ewREuzqrDFLO6SsdAxbIxvRlVPyKxn\nyc7CqbitU19VhDYah+k+ilDl6UDzmIzBSS2IVfCfEJmvUIkURm7DF2/ZI7Y6\nVNh8d5f8BvoloB/i6ZOg748Te90GWyrdmVKY1gCuhb7n7nTzmeido5ru7bah\n5XnTNaSJvOkHDR7BMU32kq9LtDNKqEvqEeI3kNa90cYM2+zl8Aa0Mz78F5rv\nZi2UtRI/Sx9LHhOKv9RE6m7avUuKkwnBABqqogTg/P6jr1DxCTpbXSs0sco7\na/h1EO4f+6ALOVwfI8XrfIROMHMrKooAit4GkoMKEsS0Cyne82hc5Q3CVPT3\nPHivHsEG4YfRXPd0+QpSCamK0xNOOijAAsNhCb1iOjA0wdqRbZ9g6U0DAOEh\nogypqCK0TDFrE9nhwdzicqKVsCGxF2ddmFEdqMDVP2WXRMzPs4gKUwzf4tVq\ndrdQmWvtWz+WT9hnoanC0daBr43ZyU6MKwVnu+N5ai9QsB9uerjQml8NblNw\nY7hz\r\n=eN8A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCxteO4bEZ7lcypQngcRaj+J2Dd9awLj+DUlj0zedLVIwIgKAiG1+tMmyKxLivZaLueNUTGojkEI49s6mhUU7aDY4k="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.7_1561064661322_0.8972940871339927"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.8":{"name":"react-three-fiber","version":"2.2.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"d4870f376ba1009940af79d6707e97e9aab941e2","_id":"react-three-fiber@2.2.8","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-IwcSPvg6FoZIcP47/RJhZ5jI9yx5I7JeAZjVF23eYsN9lsYSV3gayIjZmwYBbzOYwWYlxEtbIiFyTdT1aDswfQ==","shasum":"bcca68a2be1815ac97da402a2c1a30a5fd66b5f2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.8.tgz","fileCount":19,"unpackedSize":137140,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdDoE3CRA9TVsSAnZWagAAKj4P+gMXuOJUjHDe+zdeg1RU\ncr8eJBZqYwPdo3hQIvgoyg/z2HCXZNldyAMMT0VgDnTlMK7aCFgC5H3tz+RO\nG2Kcr831ZFpXfvH7ao8tZZ8GZmXEc1T0NahLuaE5y47r51AOC6Ph31lRliAM\nIXoyRne2WriBj3Sya5yxE4hvi02C+Xz5V6XhAOvwrCt7xAtKUaWEYzzOczAr\nztsCy036w8o6Q7xNJO/HGzL5c/zdp6UwAV+vBBT4ZmCp11kW5lM8HSzxVsBy\nknTz0q0QwWMGPIWFpR4lILlMQTLCVfi5CbXqpr9d58HJgNx9GJyTKVDkjvTZ\n8MoxGzWNz99iEp97MjhFkBCocxgRSX5BrHYiGqmlMt4jLPvQSvHZgAcPP2N6\nYhn223Q8YP2ReD9dTeIeLCCSxT9dP33eAUXyVoBLfZnr22qajrRrqNePAne4\nXjeoxCPI9B5tBBzQ3HQl8kIg2E5fh5nrdo8gL95/TiivC4EzLluMYExnbbim\nj15lGzVA3BKkJXWTf8WGfcXrDTB9uLGQi/7KM3Ze4BJp0i6Qm8tJGVpHk55Y\nFN/AT+iX0jF0TFFhpxyy5+R5MWMONzn8lN+B5tIAJN918nQF2L4GduUSxDIT\nNVCxqRl7lWiX+GsfU4h52Z5lMkm3PQ83eu1I+Vdxa55+P9QNzObJmJOGiazT\nwk5F\r\n=E0UP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHk3Rrlx3hdjKNTITOQ14H4so0XJ6QRHFW8xvQq6BCyrAiBNOCdOEUyteRFNDstbGQ7gn7NilehaDLj9Dy4HOwcSvg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.8_1561231670983_0.2611691830392846"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.9":{"name":"react-three-fiber","version":"2.2.9","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"b82cbbb338c334d0dabb445f46d15d35dcbd173a","_id":"react-three-fiber@2.2.9","_nodeVersion":"12.4.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7UFVrqrMLadKSMkxv9ICgZwAZDMjsMR5digGaDK/ASFVm0JZuBZ2rTNyZQzoKDvSANfEpiW4Qx1Sw9Li0KJlJA==","shasum":"26391ca3edebb2216d641d0c8ac9c8a5a4b8ce2a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.9.tgz","fileCount":19,"unpackedSize":136919,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEjicCRA9TVsSAnZWagAAr/IP/3IK5UGoH3rSoabh5h31\nwThLV/0smot4CHdkpAPL+2FmAPU3S5GqfS/zeazhdNOR8YMWgC4kU5oehcZo\nmPjGemsYn5BQvL+NA1DuoIZdHCirs5MnpCNVsgSU/hKwA+V8K6HXh4MALdXD\nvDSNiqnWPf2tweJCvyQmKECIrJzC6Nr27+m+guy6X09IqVwyxNRMB0IcD7xo\nJmC1YdTth904QCvR5EQEzIIXcxTsQaIXx7eeg2s63/Kfv5uNQ2wHiYJ7oGIa\nB6ICVMk1VacJXz3i3bTlNqXoZMgOZIB/X0LaJ4kLKzC6lWr9N8n9AfXYBexb\ncdu8tqzAQHic4CWvvH1Xf0/pdoVeVaFsqSt60UkXHMTjvTUx25IltVJlcH/x\na6z8/0xNp03UxbwMP5jlen9sAZcEkJrhbqlpLmfMNCmXMrRY3wAy+wp6DjL+\njqvEjzIWE3M4OUrSDV6u7WUqzYlqa0CWKykAG9KIQRhxnhcQZQtcwAE2CY9G\naFXbDyJLSlgXgyf6mITQOr64BiJmuy61Eo28j9LCYihvH/XJ48xdfatMROL5\nEMwk3LZQ0tWca+AWTdF+2f3z4ZR3c7c96T8chphP4Xf0oNLY2SRU0aXfM3dc\nxXvQHt3UftkZQR4QhU7e0BXulccA6yNfayJWJ/DHDwFWyPU/FxfFb2dRKafo\nYq8e\r\n=saW7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBaAOQj1yqgWrEZHaD3bbFAaKl9H9ZfPI0w7clKMq0NbAiAmU+0SYzmAIqEDjfTEs1KvNgoBqq5dRoCEvVh8qE7DcA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.9_1561475227618_0.5445561093623816"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.10":{"name":"react-three-fiber","version":"2.2.10","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"f0c85bfbd7da70223c93837f0d7303653a44f5d9","_id":"react-three-fiber@2.2.10","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-SDftfa3sWVTFEB6gl1AKnGs2XqErvqzHWj8yEpkyQWTFcgYP/bfSvjaTvLETp5OybWW+k9DLvC3iPkpQeCQyGg==","shasum":"a901fbfcb718cd8c12be5cd48ee3d93b176182e2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.10.tgz","fileCount":20,"unpackedSize":146654,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdHllsCRA9TVsSAnZWagAAiRIP/RUP/7uQEiwLIP2jun6s\ngYOgomydBEaN0x42d46/DhMCLlSSpFwH1ryBZxZ4XwvV6Wpuu4c+GQQVlbyc\nNtwfGGrhEN6TGOXRSFISSCbnAvECc1xgRVDyFJZTgGXvJ7aToHMgirobboO+\nt8O//JzmBvL0nqXkOiZZf0yIECe9jUIZraxbokIlGly7D+LqrH9sPxw0PChX\nyHBDpLNN88WAkKhbQEGYV5JQJTNZEFMg00wCGTzQDA3pKJp8qhscroYGdSiq\n/8bEryF8Rpq1DdwKDbXZC6tMJxrehafUTainYoxoqB1ewKA/ODmnRx/WzFMj\nQabEJX2r5CfrFW2XYDkb8o6S3jIth37+b4u4DCEvDFaut/MEoEn2B7WxJEt5\nfDVcSk9cPm0ELsjZ6k/bdxHj8C0MXxoJ85t2XHwCn9huhtvmJN8PXAgHOalP\nIbOT+Nhw2ff8WJG2knQivxRceCXXCa/nB8Fki7f4kb996yxxi9ikwaHs57cn\n72vWp3OqMdNg8EPni1yNUjd8+mdKEC4bcFDgx0vi1KJPVA46dERD7h/cebG3\neLOa/M3BoZDiSbf3eUdC7eM2AVuutBs2SyM1lwrNFqyWO7WJ4GHkDFpdth7C\n3CPq8KsA97PQxj70ZiMaLIEAmf1TV/qZrqaiA7oMRkSHkHInQkwRUBXlVL5w\n8mR0\r\n=uXKB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFKcV64+BrVBVAibCgEGlRzT7HL1wQbQTuE3ZfW/1k4gAiEA1EO7RHgGIVHbrsMRKYEACHe3RPxfYWvMW54iCET/ppE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.10_1562270059938_0.18248428699157904"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.11":{"name":"react-three-fiber","version":"2.2.11","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"b086eb2d0c116fbd719d42081c12c3f2cc7315d3","_id":"react-three-fiber@2.2.11","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-6iuJycGbmz0TkKgR3HoAeiJZKY/rGl4AQRxtzCp4H5ZS/6JjefM6mmE5YxF3oFfBuBvTNhnmnWXV67euBUmYQQ==","shasum":"e9eb844c5386a51cc6d14d9ef3811ae1448ca934","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.11.tgz","fileCount":20,"unpackedSize":147278,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJFolCRA9TVsSAnZWagAAkwsP/jTzMGodGtsRP3WMKtwm\nvBMmUvoXR4EUb81pkzTG1rDQOo/pbsQaVVGY1UKBugLJV9S1BZ3OBNVBKqY0\neOOXLGArIBzI90kOxN4vTWuYodp8oELn5cXISV6+5JOx3L+dGHV6KIknYEEC\ngpWzgKTnDbU6NZ+geW2Zl1V5txyhlf8VYVrhtlNBNiKl3dpG3z5idOUWu+7A\nBgmlj5fO9Ky/dPzmhOVXkPe5VzmZYb2k/G9M4gPZ49WqeIpjqov1OWnEdoQP\nvabtvxFq4HSggBxS+GzTkbjWgA8z5/7jVl+LEp0ortjzKLJeX9yjtlDjEate\nSlZbWlAcE8oZSeAGsT3UlD5ftHVAteGdu5uCHd8M5EWJphmnTPdsWZcOT3/k\n+T8o14SZ7BpU2gFuJB7NKYdtSeGJunsJeuHIjyS8IR6mOmpJIzdngDWqXAVe\nVyLlvLaUMMGmG29+xmghrRe4RkCdPnnbrWMSq/x03gqF2QWJxD0rrGIqMQnx\n5JGF7vFJrq22lg9IOvyruNCBMrFjBx5PogZ7vhYBhF4MYnn1uXTyGMAarbfV\nXamBjyKzFm82Kdnxk+AE45kINZRdrusVV12pTvdFreuss9RkfVRxGNuiOJ4/\nalFRPWM0I9QD9QfNt0EzDpmZx4Js40O1eYlHSY8mA9CSoJW6usi9NBCdv8kT\nY3hu\r\n=EBqx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDVLbDDYjvLXXofRp2jmMHbAWsFuu1H5MFdfHQ5n0HRqAiBCnSAbEAbUqD5ojOZPt6ssy78alZFuMcqyBiB+BK/cgg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.11_1562663460169_0.8717794110268873"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.12":{"name":"react-three-fiber","version":"2.2.12","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"eed40aa03e65980b7998089db03aa0a793102fcd","_id":"react-three-fiber@2.2.12","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-OmLz958S1S2q+tzKMx+gOtt65Fbv4OeDUiTNLO8QQhOG4hEXL6gvydBp15Qm2x5LGk6soTg9TdsKu8bbYHaG9g==","shasum":"9ad0302ebe852945f1f4dc9021b4492d13889fc8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.12.tgz","fileCount":19,"unpackedSize":138566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdLwRsCRA9TVsSAnZWagAASOwP/1KZNyHKQ3mjMkn4IPKd\nAaomYxfJd52SG3AIJmsU3jilPOByIuWn/Q53sF1+l1Rv9kv22K9xBXtnujTQ\nEwoivrGo4zHDhMGtOssMTEBR4Gsu2H9Fhn/sp77fqFOM6ad6BCfnZ6GFlOKs\n1S4JbXQIrF7Ns7HdU0YuKDN7nOhIuyLe3kV4C6ihYEmObFbJ/tJPgcumypQk\nnCy2dlPXwJf/tnhyQvvCoiRBGDsbAO1EMKZPqzLU1xI73DPgYI0buETFq4f5\nCC/8omZ+CPpM46wV78MHYoVPsCjFNzDlIHvAMde5znnTgppTSvs4gtGc5H4J\n8vSuaLn07BKFwgo4VC3W/dyHqxzN4dIjIrjWf5ckF5hls19FZqM3V/Wht4KB\ndQgwStLaHZ24MAXDf2KqcMlp0RtdQLDRVx1fYx/X0OCrUT7y+haMyEqG/p1u\nkG9Ao7nDrWViFt1ce0XITrNzBvHi2yJnVTYUL5uuX8kPyPbbqG/5PtOzulF6\nlvGAg+hTP3HI+JrJ0XZo2AzbgjMDAoSrR1pem19H6jIaqazhz2gkKRP185Ki\ni1kt5ZijoZVOTaZSx++bYjycQHaipV1Mfi4PBOQoNjfCfnWNOlS6pM8XP6gi\naVz6gB/C/dvA23FWS1CkNA6owRnYXOO/bqLz9RRCC06WZifz/hQlzlInA3J/\n/CWD\r\n=VZ/o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDkecPFStjmRqiBXg6ews3Nf5Alp9EDamcA+0qkqKhudwIhALpd/5QVlMHhdUz/8lQ+WAHTJdnupGciIB9t1YzZOy1M"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.12_1563362411898_0.6759241015081341"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.13":{"name":"react-three-fiber","version":"2.2.13","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"3949f32cc4b7ef5de29d0edfae6cddf0789c4887","_id":"react-three-fiber@2.2.13","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-p9CIs2JLlwiwiBHZSEahlDfkzt/I+T96hTj9MpysXn2CDuq+8VqUPDFenexYzsYvrGXal+gq+BF+SQ2e23AcEw==","shasum":"aa23737b80e45ffadfba35ae8dfb89259d9338bf","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.13.tgz","fileCount":19,"unpackedSize":139012,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNvvpCRA9TVsSAnZWagAAgdsQAJGQDNMTQ59y1r1cQ7rl\njHVqGsh67d7OndMhOmLrb3YLxpfZ2LElJf2784OaTx5VzzJFGyGjHaftpZOQ\nvavkao7mKy0tzIt0FCMUzjXkDFvY2SUsuU0betSp0qEwlSLTV19vPUS46qdr\nsQVkuoWll0nm2sTSfjWQbUyQxg53dqBXmuHxs99j4inFef05KbXL/w5T29la\n0YOCSus5+dNFB/HYZG03b13Pb1FBg1yefGr3lNvzAGK5Y/g0kx48m8J9/bmQ\nATF4h4s3YIFLEqhYuySfAdUyxhnMD6zLdTADB3PbIDxBDShwy3TY0aF8J13k\nd6PXKtfUVMP56vjWrJF9Oh3M0/giZjoPbmENvHDlX71YjxW2CdlLPHun/sjP\nAScG0+hRTimHIF3KeVn517Sd4OY2o36UPC2OOOspDRy0ltVxHqSwPQK7WLp5\nn9Brk0ZFr1S1JJKd+0RZ9jBdRkEktHJVSdI0zrTUhp5hqOOXyFnb0kBhYXd0\nBRKISgrwMV/gKu0skwSo/Er0+8+QcGhWz9y/eI82AwQCSUfVtnU9pIwAZvJS\nefXW7ma/cwK46oycwVnh6f9m9aTgnlB1+wfUu/KHBFpwqUx+TRaTNAGUe09E\nWPJI2kGoJJJzA0ceIR2aTaGX+jYSYBfd3ioMMPEaKDX4LsfOuSdkw3BFqPT2\nFl92\r\n=TbWU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBqc0Fvk+JQa9XzVw3yriUFZI5eprpVWZCZiKhwAbzSXAiEAhDmWybDMIGIk0GMbo3p/G/ag3YiLcLJUNYKKaSHikYg="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.13_1563884520956_0.5120503290762728"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.14":{"name":"react-three-fiber","version":"2.2.14","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"19b7b427d7fa8447e50ef28f2eab6c8b4ba04224","_id":"react-three-fiber@2.2.14","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ANLbGBRdUZC+L18pOtC5vJfU92mLLs4a5tDIpjdD//IyYoEACJWc0Qy069hC6hOUdLAZBq6vyRD8EPOuxJCtHA==","shasum":"df07a654335af90a3ee80020553cefbcc41553bc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.14.tgz","fileCount":19,"unpackedSize":139048,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOqTCCRA9TVsSAnZWagAACncP/1jTkpf5uSVVDlaXQRjg\nHP6jHw+azlRjojGiXASz7dcR7KfgHNn5Q6ZXhLnW3aE30Vh98lIV9edJfgC9\nxiluiMqfs0OtXhRpC0MowxpW+xAdLYci5HGPfzTpCH3vtAffuhAgIeE1+mGU\nhVr/klkHQqXkamdcwqlRC3nWNThwRygMPxCzzRrcuiBfi2ZDs16b+e6loVK1\nEHmhQiWObuuV7Rrzq+aj2NyC9xSFFvPfQB2ImUBOCFt+bhnyV0FCAELOJubm\n2nRWmXZlE6hU2rBQd2206vXJKE8A0lzkoXw2Rq6qsMsqNH89o8bJdK79ScJM\n0358NBrh7CmH5oTyD8sZ1kcf2gPdBI5u1tsFDzrRmUXg1KJDIYJRZo7zxAF3\nhQGEk4qpXzQtLVbtwuRzdiVroIQmNjZ+K8nxGAMzlx9tlHo5a6gHhZuURkVQ\n0Op5iCHKnXTDi9XyolK8SeC50DoqiddIciTy5XfKNKKKJmMfK1ovhJnXOV7U\nGu5j3eM6MeEdebfdj4U91bb9Tw4oGE2OdC54vgPpsh3s+wK2EaB2NwjfKfX1\nnJbfDzxjGSAskELdsz/x2HLP0Ym/exGodbg6ePsYxd5O5BprCZiG+lFCOeMp\nLEzo6GPr9yA1SisaP84DnFMp6/ifNZ8LrglDTBzLnxhEuICrDz00sdwn276U\ng+uU\r\n=bOX9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGdVs/vaaFPwuX3kXjgby3T2bJ60uttc0O2CFNfK43ymAiBjCm4o+4qMtYZJUJKjX19YFnmNMhrAWaf0YF8oBiXCnw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.14_1564124353632_0.30115699174103083"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.15":{"name":"react-three-fiber","version":"2.2.15","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"f5aff35b1e75fcdaaf024dcaba340badba2644f4","_id":"react-three-fiber@2.2.15","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eDtuVfeq15Xmgs0P3U0i3D1yRjoEr8qAniL0bnZ0JPb41L6fsDvqe0YBFcQUYccYYPAFkJc58wMCP/aPtCD2Vg==","shasum":"154dcb449f34f842f4d84196779dfcc6ae86320d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.15.tgz","fileCount":19,"unpackedSize":141234,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdSU9LCRA9TVsSAnZWagAAYs0QAJ3Di9rpe2H9ST9TcUWJ\n6WWm1+0oSPs3Rmj9gmgfR+HTu4U3ukxaH/F6pIBMuL4rOg6vPkVwCDh1XNtF\nKG5NHeSxziF14+dr56i3809pMQwMIwdJzXqXxcYhniXycOdRmgpfYGtGHDrB\nPF3CoJQjDYYlmmCr/60QDsQdZ+4l9lH8sGcUYMD5YhvifjncWXeOE142wAmU\nSGjo4ED9kD+nCgSUbd5ycJLTEm1wUWJq907S7C2D7/CLp6UOCsOKKc7CP0dD\nx8cxaB6BjNOG2EdOR4bb0SnfCY2hdVznMGeg5Hxa2VMMFk9V984VKk6987O6\nIMZotidXJsIBT+Kf0nnHtg0unlvmBn63XzzKewK5fzyqPLyPPdj2l33Ftboh\ncqNiy5s5W56Wv1WF9GyPxIE8ZLVUrlAqMV4IanyDsTC0W311/4GPGWxS2Z9F\nGgQXrgB1lAsFZe2wd5DVIzzdeJmhdWWBFlmrJ27Ztl9laon2BBJXZSMZ++/w\nfe1eqrY88J/n+TMW96REfQo+EMsKtV2SCsPb17XdUD78zYmbAHcexed4X/mN\nt/8NSCkpm4f530S6IVRSq4XWY1Duue14AOUqtkgaTyq9lpExWjxvZHL9Qwp8\nmiR8T6nDJNa7ycyMvXNApBrCnPooPpahK1RYY5jECGpMCnELk2dwJRIiaFh4\nsOJg\r\n=IGS3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC7bQlNvGNFZgaZ34ZjwaFL/6Oi9vVGcs6YLiiNr7VcLwIhANxMQDI/dWKVvJXn81/Y0Kj3UOVFPGDVj+G9Slnm6PTN"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.15_1565085514640_0.7904689943163254"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.16":{"name":"react-three-fiber","version":"2.2.16","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"0a343a9d703f4987b19cd94a4fd4d0116f6e8397","_id":"react-three-fiber@2.2.16","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-7fGe51kXZ5/lRMiVZh+w8lOOGtC5r9+JM5OE52GEni7FY12YTLcBL1GoCUNwvKHAsoW4+spS+H4ezQdxJ3PFBw==","shasum":"ca69ec47d89ffc22584b6d268c5698f625f7d3ff","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.16.tgz","fileCount":19,"unpackedSize":141189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT/veCRA9TVsSAnZWagAASLkP+wZL6SpaXyZR4EjkG2Gm\ngKDQeuvw2ig/Bpl/u+wBnYyla0bpY/G74dPjqGjWi/X6ijnYNKIgxwE+tP03\nUY4y6Vu5ImhaFqvaH7U0kkipgkpoyeLOV3iSxKKOawv+7BLhPj3sNm8miYjA\nWnj0vH+6GAOdVcJO5Dguh8x+phbBjJVkds0SalYccex0U7kax22TbIIZFza9\ne3c/mPs+drbQTofh0I6XPHe+YliPfd/xPtpuCb8PzU9aWaksND3/zmJ+ZDD4\nKBJO8xnES3yaf4FzM+3fU1RzBgTJJU7WKReH8Lqm1hz1KCkTbCzAWFC8J8tV\nFCYX0sx2brFA3dO5TIb+SN21/qNTewgyXlw3qY1I3S9WrWeTYJT2tL5DYE5X\n7Jgmk7sfTkHPxfidKmauyt7ZoniM5Q41f0iOAgShFWoLElc/A6GF7p4kFwiK\nPJ8kKkknR5ZqykxW6qOjYcZ8gDn/EFleGg7e9LjqrJ9+VGsRRn+I9AAHFOqZ\nWAvDUf1bG27Ai4zveTmx79mMKLZxUmCWeWnheirsNAGDs4Y8SfYmYE1Wcvv/\nA2mZSOY+8OaLawvwGbt5z7+c2m3UN4BcrY3yLii8FbGUdjUWJxEzbkzmWRy8\nBlSXgnLDn45UyBE/56lFI3ukcXmhuOnxL7ti8JEQsCRpmZ1t8aw//Ek/7L10\nGCTE\r\n=1UsA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS0zHaQttAQwzAQVsQPRhwTuHliLZmELhNDjKZ+p7nWwIhANL3JImUUKsW46TpzVwcnRIpoh1RaUbTgML7d3hMiFoN"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.16_1565522909270_0.2788564746062745"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.17":{"name":"react-three-fiber","version":"2.2.17","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","//":"The typegen script below should omit the '|| true' once remaining type errors are addressed","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.11","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.8","react-dom":">=16.8","three":">=0.103"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.8.15","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.17.0","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.10.1","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.4.5","wait-on":"^3.2.0"},"gitHead":"4c0435e9eea19248bac743364363e7325ee78e64","_id":"react-three-fiber@2.2.17","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-TCDbC5tmylrxOFP4o8dvryis8rkdFZImG4JAI7b1v7vbd/DbIcUXWni+6/y4tk36uY2EJZatfUW4pAeXYEBYPA==","shasum":"79e40c815cf2f3731e86869b6fd55836a5dee7fd","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.17.tgz","fileCount":19,"unpackedSize":141243,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdT/ySCRA9TVsSAnZWagAAy4AP/Rc3OHrshxS/hSu/UUQn\nQbeAUEici3dL2bVEZ8MLsFlJ05Yd0T5ksX1NubRZh2UphR/lNf5ulLcnPJ39\n9FYLAMJVARvvhdxsNBvqqPwQT19lhCb4khdr9E4dLqX957iD+WNRlYLdDd5f\nXJhoDMpmf0PznurTSjzKD6/zcNwrA/z3sqQZ0xvFEgCRjxZ/dr6bBCa2MaNk\nGaz4IqRnAenrbDc5Tmv1ATted97tkk2qbCzaXR+9HoOr5krwZKXX8vh5VanM\nCvJxxp3atYlJJp6mxDWcoSIhYiCrYfjtqtFBku/HoF7ndrUP+phF+2lIhjCG\ni/obO9pEpamN/JVMcQlT0XfQVM7Wfgldw4enNHMnfXV5TDlD7qQvaYTDRmGT\nf+PVl/NdYazNAGdpKTny4soIWQsxOTIfWk2sh83rn+qLA9JhF/Tij+8PUPhE\nEAgTFWdRTEAS7LMRisWoadfv6e4Ngdnd86bqwKgC8YQ+WTEk5aKSWqgaTkfj\n9ltTexHcm2SqfIZKqfcrisvLo76IM0gvtqRfE0qCYbsrHxQnRcOy11kn/lV2\n6wC8PGqjppJEiX34g+pZgZC+rKbFoB7pqazXdmM2yzdnW/yGEe+rMpaymiPb\nkEdHGKRV/VHtCFGeJxmqzN0s8VsX+x4dahWgwtwtZNSMYClXq6OgI//jYuzQ\n9KxQ\r\n=Te2o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwpkKE5IJzAYyxvn+yqzuwmyfwVn8Z9B0TdgA3VVXRYgIgGTRDQUdjgbcohS1vIOiEJ11BIqvSwABqyF1NaPOZtts="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.17_1565523089979_0.26320916199337385"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.2.17-beta.0":{"name":"react-three-fiber","version":"2.2.17-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && tsc","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.21.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n","readmeFilename":"readme.md","gitHead":"578762075ac201acd2863a7053c2926c7d98693a","_id":"react-three-fiber@2.2.17-beta.0","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-96G9J0UO2HMDxfwgu+1KGs8Pw07z7eVf4AD5uL7OF5v1xplrw6MOwLlwQ+QTIq+lxzVfTDTB0My2T9xOl/VoLQ==","shasum":"ca7dbe63d61ded39604f2b032f49797aa36de085","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.17-beta.0.tgz","fileCount":19,"unpackedSize":145304,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUnCcCRA9TVsSAnZWagAApxAP/0sJnVyyHfATluBg03ff\na03ZeiqVedhGUj9SRIYeQ0RoeUCa3hd7QTUGbCqJpPBM1lEQqn1tFAGxcgDo\nvJQY0WYOeJNv9jE13RFfStsLzRfEK38b4ExnMRQDFD8bjUIUpD2LoRj4gTpy\nXPOQz6hpQIscab3/EpAbUMBoz4EDD0Wz4CjTLya+DfBBcRjYMnAKaPGyNIjB\n5Qp5Rc2S4jLNoW6o8rdR/1MxiLXQ4GvusYRfD9Xb96ZC8xIqEABclbl4B2Pv\nSN2WntGZGLdIckZ02xDSp5W8l5jV1yo5GArmLPWkxqE3Ty7LL1YUs2lmyE9r\nUfaVJtRVab4SWJ7638oFgw9/yfF4W8SYC92CG/jl4OTrkV7ZVjRMh0Cef2SS\n73vpo+UBHPAdHYcE6BeyFxCoDxSZtw1RIQb6VF265ragueM/iuh8pcvLETuj\n60okGYtUziyudvPwu4YR7BI6zq2ZzCCJAUWcMTXAIFOSwAlKWVLHT0pomwAB\nCEjYhWfdO4c9yeE+9cDZ5/oTrRynQ/PoppoCIaQADbHHAQL0YVrPU17jKpH3\nHgSruyL51p5AcSrwcG63iib07VmCKAfw6rU7qrnOnnpL99FuJr0JOAQsulmH\nvORAOtcHd3s0dFboNIS/CXsAmuQF9XCh8aBzM8S/cdoILm7xBUoGFO1K573Q\nHL/T\r\n=rzBE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDYoIqo9roXZu7AOdFtn1JD+bVhgt8cdNNCcEg7Ub/bjQIhAKZr92sIhMzPNQQzztmcL+V8Gq2xDuLUorw6MRdQbgv+"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.17-beta.0_1565683868176_0.03381719513623116"},"_hasShrinkwrap":false},"2.2.17-beta.1":{"name":"react-three-fiber","version":"2.2.17-beta.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"^0.21.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n","readmeFilename":"readme.md","gitHead":"578762075ac201acd2863a7053c2926c7d98693a","_id":"react-three-fiber@2.2.17-beta.1","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-KrPRC3Qk257oO+MlfemVuNjjGVVlVbmUt5EH8Z5iad7wpQm+Sl03NnIFZQjez3SECxK3PTIu1npDk3G5uIL4QQ==","shasum":"87d482e493faf25984fb24e9bae469887c795812","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.17-beta.1.tgz","fileCount":19,"unpackedSize":146380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUnHhCRA9TVsSAnZWagAABA0P/AwCr+EE7qHxSnQO4hoO\nhIntAWLWdArE9kRuWrR3xhqN1c1NPYshXfLO2V+p4q24GoxZcL7D9G3NBnhm\nA+0J8zY3iIHISsXv7AivYJzeoAqdeOmDAXNBDUarbwQvAAiVdiuDkYpU8Bi4\nC2gBERrRhF7pOGLfKet1Q4JLGqmk1nOJpKgBc19midP4su0iO8DdN7paD+Mv\nacn9lEaLQvOLQsT65Lm/ZZ8VnD4Zdls3+QHhiEmP9GPKUHlU357g8mBJy9Lx\nl/+yTnsptZpvoal99ZyL43Ytc6yRJT5gXfsO0F/DgPplNNcRNOabINlJb/nn\nTIN6EnRkAuZInLJjQ/A1gVS1CiOya6stsueiSeFDX7hGUdSSp0YcKMeMBUto\nFJuom2ubNnoLtqACRR0GtzQVY5VugTUwQBwoQVMt5Ffc7+5cwWZ0nquTHAOl\nhjdmzyojZKBfKu+F5PHOx22FYa+MIngNE7WXQZ4Nj32he43dHW4C+nyk0ZHy\nfFiuSatZlXux15Rd8RlsQQvazxxYU5Oq23YipaERJEW7gm9S5J/I6N9+1PDu\nF6tk9+q4kI2RVcRFfPq/GR6vs+HeQCJeRZPsCD+YaY+vwUFUPqeyaMFm/5b6\n9/+Gsn/hXnhNTf9k7XSzCZJEuM1l2uvN1bftygmNwahECdbG/HzHtSnnzP8j\nbfeX\r\n=1eZl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD0LdvrVqlCSk0O46lT6EUJhHPFjZ1N4CfUJKHcDy3hYwIgV+jjg6ihTWwBzttsP+UxnqIe/zeDRcIKybnYkuv9QWk="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.17-beta.1_1565684192720_0.09470662702061694"},"_hasShrinkwrap":false},"2.2.17-beta.2":{"name":"react-three-fiber","version":"2.2.17-beta.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n","readmeFilename":"readme.md","gitHead":"578762075ac201acd2863a7053c2926c7d98693a","_id":"react-three-fiber@2.2.17-beta.2","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9Za9GZEcsXR9CYXAF/+cdqRFzBOo2a/FoKs0GsuIj4PxXXfXM1lJTisK+iEJiUi/VFqvv4fehSkkZqN5pBpLEw==","shasum":"ce675fae909ec3ea8640d2aaf1f7b88aed59f8b7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.2.17-beta.2.tgz","fileCount":19,"unpackedSize":145904,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUnZjCRA9TVsSAnZWagAAmO0P/2l2lrrZ+EXeXWQOQ5Yh\n2dTe1Dx2DslFBTnoyeIhmEgfxPJGTlvCNZZ+aRuMkXW/qx8tqNm95YZpF+mR\nu1QhstnSbuqngMMEKKjhEID0cGn2jWJay7K7NgG3zxLTuYtadEk6CYAzbIFC\nW4yM9ikq7TFmoiFi9OB9ab9Bk5NTTOpgpp5LbKeqoQeNF3gkx9gV5i9EX9lU\nmTjOOwHU+ZBcNLIdCPPrYB4bDjdTxA79g9/roCC3Ou5JPQFy+VdpJJsT2+8W\nl6CKainXJgnJJIUXkLYzHaUkar+QcUAbChB2AnkmGxT8w3KdpAp8IDAT/aVa\nVDlMHh/WRAC+zhY73fBX+pXJmYSEEgIOLvQR/lEmA94MQTfkpxtvMdidyOmk\nNjwhBcXXvBclCDePl3LgtGJ82vFHhCOMAaU9y4uDsvUWFmoAUZhH+TZbvfnp\n7f1bKlHfBaKi4Z7j1gReuesVnvrs9oWSzDvOornxpZCWoahK9TMR0kgShpA5\n7EsvkH9pAjwZbQzX9UjMYA/Uvp8iBehR3OkwntI4cOS41SmYeYn/My96sO5M\n15gxqMAKguTlBpZb8yqpFE38N7uinl1s0bY1GJwPfZogRg+QadFo0XZ++lEC\n/FYsi2n4UNVZTqV3WuXDoRaLpNJV+pIAbXxwGRsi4x2iDOtOkL+p9aBVRZv9\nsw+T\r\n=rei5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDxHE0HD9NhgN6Le9oVa19REqATmoKbgRDMqe8mrL4ZnAiAVwaHt9gN2zQJz8jARZVQuDNsodzFBSharTdx4seQa6Q=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.2.17-beta.2_1565685346682_0.3538910491211791"},"_hasShrinkwrap":false},"2.3.0":{"name":"react-three-fiber","version":"2.3.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"40393d70a9ec2bddb28a7a4ca3030fa7210370e7","_id":"react-three-fiber@2.3.0","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-czj5yp+xieAj/xt4MIkiNVX6bE3C6rzqQNxKejhbuyqgAYZ7kLwCcEzOWveotzsENGpDrMVNUWsYWhZuvM07/Q==","shasum":"348c670d08ed3364b463922138010ced769ca9a4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.0.tgz","fileCount":19,"unpackedSize":145880,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUngUCRA9TVsSAnZWagAAKOIP/1T/r/2rLRRNWN8gNDiQ\nD675Z+na9hMd+yp1ur0OQWrplIvS+Y2lYVUlLZ/0le/VGZDytm1pWzEtMKj2\n2SuZQpOSjhUvj6NZGTJQV943nztiwmdTy4u8mEAIDQRnBWNxTH8ieD5d7Q/y\nOibKEo+ILpi5Pq2H4K/UwDGH0etvbtWYrNR5uMKMmQOa9nFvce/H+9nGBwCK\nCoQJCJQ4RKeB9/USrthCheF7k0rnGmrGlRj2ou7hu9QCK5jK76Pw8lGNat4V\npjmSZyzy/DZR7yrli2hdgjDl/nUDsMQOl4LfP06Tb16B481QXRAQbrogTfk7\n4BHjdlxVM6wh79IGYIzkStYFGjA1q8SAvREp0humPLlVy7naC3Aehvfxjw8L\nBhPWcsdwOq2XzdnHG4c0tcbLkmELmGOOrrwnwG23rpjBLdt7QaoEkpgkh4HD\nCQwEMW5N+Eq4wJF8OuZR1ydOrfnj9wkQtGsXhP8DKJs4ZTOzBbTQS6AzgaLc\nob0nXQsDwTdNEKne3PTywt2m5qnPleaZrvw+3HZcNo1iLLDZG2uSG0mpq0fy\n1ODYAuL0K9IrBrJCSRFpbZT/du6C78OTlhjDbg8fCHuH5c2mwbt4ybha3yCB\nLbMBEHDMMYTq1kXFfTG+BHYHO9Jv9C9GlAt/AEzAyoh+Dfzqk/dkZcGMHUPO\nOnVF\r\n=3AgK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEy2aLA33c6/R8iCYz1HBPGyGSVePtOr8vX4w+PmzcuWAiEA9dyHjg1RBFVAVjZq+5TKZhydgzGr9aNiuDX3uuMNtQw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.0_1565685779321_0.9314684521457606"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.1":{"name":"react-three-fiber","version":"2.3.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"28795382887c0e3f9706af1a47715dfd06f872c1","_id":"react-three-fiber@2.3.1","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-KTVd23m6Lf38IjlADNnj9nZA/Dya5si/ZFvRi1RmBBkN7BvIrt5wOZvICYD4iCIAaPBzoU6mPDnZZ4kCurWEWQ==","shasum":"a431cb12d4284b172e1a989e841c5b1565e4409b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.1.tgz","fileCount":19,"unpackedSize":147735,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUqVoCRA9TVsSAnZWagAA8qEP/2e5rT042+zGbLohu5uS\nhvVjbPx7VCviDtUlfNMc0J7s7S/Sa9epf3Z4gD59S+W/i2H8BaR+FBLLJIkj\nN3cObIO2KsGcGAIQj68lZq2jDS7nKdaq9UOGjWm4cfpinUxj4k2nkerboU/x\nqIHa5u+rTMSudTegkFLD0KtWm1LQ7M+zY8wRUvv6zrJVJSN+ltsHBuqsrFnA\nxs1kMrYsDbBUQwZ66FPUcmhMUZPT7MmXmygyKeTSKlNSPOCqje4e6KpXurTT\ntoQUVhTsgsVlbktJzu43rlgowtNIC+EzNTkwYbq32zcfbXKiR3uRqomr1VxA\n4TcYdSD0O3v8ar7gN4uUTYKu2W/j72OI95bEhtQrBJkYkgiVDpEGJ1BV00AO\nYkyNdRW2NUqnvyheOls0TZwXjXOmwQMxpkMugGBmLKbRSgXegyioXoV/29Ak\neErIwuZMB0tVUbRh69wcey7fS5lMErw841Ein4Bun/z2CN+44d4J3SPBNb97\nB+txiqmoEFQx4hlMuxtA7Vd7AJEa7oJr26K3pjtsZbk2Xd/tGjbv66isQkRz\nDI3YYc8L7UHmS1j+JEIHBtg5bQVnwEsFuiT3TlAn7ARVel/Lw+8rQkORZXFD\nsewYAvZSJZIbbsAc7OCCqhVM3BckfkUsDFT+nFK0LBlSAg2qlSEOLzrlDGlT\nkpPk\r\n=YNeo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDF6PZoUnsT528pnUmTY2RbaTd0ij+YROttutvtn52WqgIgR5Kb5+8xIcmkspDaoFRs5FnQPpvudu+SJp3xkPFax1w="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.1_1565697383578_0.4242546788420769"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.2":{"name":"react-three-fiber","version":"2.3.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"312e3df5c45a9d02c1b8761704ae4cac56b40040","_id":"react-three-fiber@2.3.2","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Gz6uG5FXcuDj72QZ3pNwL5nWlVOdbYAszvXnr5V7nQLBNtmmgcwg1J6L0ToDxp9V5vN+QQR6mTuvFneEgfus4Q==","shasum":"7f322c4f6dd77e5c3898139255bf7d911015e542","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.2.tgz","fileCount":19,"unpackedSize":147655,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUq8rCRA9TVsSAnZWagAASj0P/Avh3gjWun5hXlijbxtn\noivE2ezdv6yKHZ8+lhpihyp1Q40sNKaFW9dCa8Svp4QLy9AjG+R85NMllz35\nNgCD7d3oGGNQZB9Bg2iPsDt5TVnkVEgaOZiflFbWiPFqlm58XvYq804+2LIO\nrmqjGLD3i1tTr//T/Cyco3US6wMND2Y5iXl8ue+xjScK0YxpxjbZDh0g12ac\nReAISx94YaPYe46/C8NPezCqJsK63V+J98/SVRoquAumip0GiwiOjiaLPyGM\nmBlpr0NppRuG+c3/9vg5oENnxchFa3ND+vNOajo6Ls+5WtDIzYL04CUbsqLO\ncJuxvgTcBchmfXkQ0kbkj+unn+MJI93PpugY6yRX2mwrNb1xiQAyZ0WX2ueO\n3IXLlGkqo13aIjf8Xio7XLxVu6VJmJ0f0FobgUECtGAyqfPWA/UdC3CSeTA+\nCwn4EPx+DlGnQoO9Wiv+huxmniROXrDOJcBwDswRAQploDnVAWhVVPP4Fq1n\nfitPW5PJ3+7HHLyPKWGggUkXEdN7MJeytIg+JfQmsPB+1GC9K8+ZC8jzWUC2\nZCna1d2mCmqP+fNLdRis4ChVKyG5NKQQ0ZWOUYp/wLe3lWwhYuqGU/i18tQQ\nLH5AVZHfHtZhCOWARnm0n3FVbIQKTRAEr2xSf2ccmIURFVXzI8SZrPTEU2sA\nQeHV\r\n=YmsT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCPf7AdEHzdeTq9wnGHBnpP3W2aKi34WDnrQ0Kjv/gotQIgAcXoVfVGJdgweDcrAgme9mXq8Mz7aIL+Pon1U7s2RyQ="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.2_1565699882232_0.6475746785075096"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.3":{"name":"react-three-fiber","version":"2.3.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"789def9feced3d46a6e8edc69a0b818578ace644","_id":"react-three-fiber@2.3.3","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-q4ZI9c5I70nIl+ffqmU7u5Am1UxwgU76Wovn+w3othf5UsladNPYSWn6ROXy64BdaaXFouQsmf4aM2zC0maduA==","shasum":"682264f4bb02bb383ceabba288c11903836f85b9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.3.tgz","fileCount":19,"unpackedSize":147684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdUrL9CRA9TVsSAnZWagAAXdEQAJ50CH3ah9q820RIoqmJ\nksiLlDqP1+wvmZp0JX8v3ZXG1Gxo/UHVYjoCkfKmYERkwekPCTujKxBEmGuv\nRxQ3VBHN1EUrMXbLqi6C/nAJwTZYPCAl0x39X9BST/YEuDqnweNrrQDUOmxB\nutSN/RBy4EXqfnFRvSsZqkLs6N/7o8q8x/mmz3gMJCpiieqaUCCa51DgoKn9\no2UGnxA2LEsuqMIHcGTHhgJNG5P6yPcnzuOXrbcdNWEeI3O4tTjTKwfXuA7w\ngwVTjJXSKlgFstx/HM6qp9zy7VqukvQMLF6iqvSTL7yhC3fCdTq5qP3GzOmH\njgBxz5e4a5M1O5G5oh1GASQWG1QlRtGZ36kPkdar27EArGKXHt3bYuSCXDeT\noGFaAG/x6UbYVXUCperhoRwxtvmsduSGxTPANbwhKl4yKRozKw5zX6tj0rtg\nlV+1CHTLoNoP2oH3YTSsb4VbeSklw4G5tps4/nRAAeETJwV32LNMqd89N8Me\n+KIyWh3uPullsqT08A0DGqaZ9h70sffBWkHSpXxVznebQVkxRjg6eKxrKFro\nk2jZ0w9hEXwQDOK6f1SFFOZJ296QZh4Zm56lEQs3QNMm7GDh+N4M2yClP4Bo\nGNKdmy9LNjs4wV2TRwaTY/jww9aZqhsypn/ged2BlAdYnD3IuXc1R9OQbJLB\nRmxe\r\n=hNdy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvWfwgKGuQN9W7XwZSM0sl2kZDUaUW1CsNtOy0cpzEJAIhANcX4WQJJk8T9+GMtYvECYzd0M0mOKOBOn3JG7CN67b9"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.3_1565700860565_0.5164862105200418"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.3-beta.0":{"name":"react-three-fiber","version":"2.3.3-beta.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependence graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n","readmeFilename":"readme.md","gitHead":"c382fcea0e3e57f3a9dca11b681d9804202599a8","_id":"react-three-fiber@2.3.3-beta.0","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-T+454feyuFvUqPcG/BzO48UVq4yHGmouyXGaHA6+tvH+GnJgysRycqzkV+1UT+jcK7HcIYGzdQ67z3u+PwMaYA==","shasum":"ccf1cb180ceffe1edf4811c1adb5284e9385c139","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.3-beta.0.tgz","fileCount":19,"unpackedSize":147794,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVQ2bCRA9TVsSAnZWagAAO5EP/jRrT2TPGfjdeMF73eZN\nKgW+WPDhKZv/rcAr9Y1QCEq9j6CUyNquwud0dgRa6WDhIMBZM/z0Pd2paHNS\ng9IOBnY/XIWM41ieZ8NV9vyYdqW3YFtIMz2s5UGR3agh77q7/HFmIHW7OUHe\nyc66bZWhk8yyWk5ETO/SgsqyLa16uAJ8dazR21ZcGpV7KLRHkwK41tsw9t0i\nRvujJcwGuuzed6Ljr36U5a5m0z1hc4jmw2irV7ZOTJK8Wyi/noJLxGCW6iqJ\nNtGnqXgHXImUKe0AD6LoaolrkDQ9jjmkzYRSHTXqYiDJMtaxKBIshjwxvxoW\nISm06kiRh8yEfQBvNTLxPcxUHCClPrwnpSn/f08jwRTVyCZbjwPAYe7nyV4t\nGQA+yp0FBgkBaYPsAl8Q9GU5DtBDXWhtMV9wlAtMWjwVfWMkijT9mnDwHkxc\nvgnwxoPeewToN504p9HrEEFaIfX39RaOplUgCIJpffEgzQwajdLbHF0J7xKF\nlC2LSN9kdX66nNvA4p7bQYW2M7x51IBAwvOSDFTfDpxmEHdWkyIJLhrnz6Jc\n+y92UglBDIXDGTxFV+WKglpGKToYoM62mvJX/DGiTs+ilMmhrIN9XaacSjjA\nUeHIlim8iIxawOet3/LGXzls/CMTcqY+iI1Ky1ejDyLJkm+tNqECCcJ1v38E\n79yR\r\n=3ESp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDykzjqengQaxybf4DRqHPgquxO0s2GPdmhKVAN1VtX2wIgcxSTrf1IKk2NYx0sa4Ix3KH4Z43m1zNfuIvZ+L1SEgk="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.3-beta.0_1565855130926_0.6726518820596994"},"_hasShrinkwrap":false},"2.3.4":{"name":"react-three-fiber","version":"2.3.4","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"5bf86a40d597e83d283851069fb94cc541feec59","_id":"react-three-fiber@2.3.4","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-hU4ecIjGskmFPYl6/KSA5L0iCxsC/Tp8IBF7tgujkLIk2QTMkPzgpADJ4srumuhp6kw/ZihKlMW2KQBlL5ZtOA==","shasum":"3879c147d180b30bb7c65ca0f89533a48909d718","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.4.tgz","fileCount":20,"unpackedSize":162799,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVT2gCRA9TVsSAnZWagAA3XEP+gO3QNuA4j9tMnI0tQPI\nszQyXv4tP+4mLAYGRx6NcgCHGkuw9Mm6tKZ9qN38sQjpHb24sYX0VgukbM7K\n4v5J1j6hqkmSMcxpItoTCaLHrmj7g0FKJpho03SiCFolS3+PlGd+gduEFEdE\nVVyCywN5UceMJ9qJakBXV7+AOZpcuxvyIZjuCQbi/YsJAmLd7INP9wxRoEnm\n3q2fjiW2V22CfNQut011BI87371k3u8fUKtLH/BM4oVFpbeYRJczO4f9uHS7\nRQa5+wt/6JRJhojsKO4ZLAl5bYjU1a0ERSoYoCKuf4GKvPCzxensJYbuXuZk\nLnBwsumv+XuJRoay9XQNxLBjN/7kqCTOiWo8bkbTdOiezL9f625ExDVhlIc5\nanyFB1ov1TSurjtFC8urJGaDNDqileuphVzAe2/u205tgwQGdFK3BmJHGCUu\nDaz9q9QfwJ1g+sSNIJQT3qmUTC7Svq1ETHKkUib+XnuJprWoloP/6No9aSoJ\n5BlMBz/piJcWSM7SH1kDxpD8zE+GDrOIQtlcNFuwinS9pS01+Lmxux+uvrXB\nye2mx7FZhIxZN76RmPpgHMAKD/5p76rc0vtBSx4J99WwnFR2GfwGac5QTpwV\nHvNL57rcE2imbRkyRBOlRu/q1DuUHxZLNZHuzzwLZhLsXROozx4J8u8T14un\neJYP\r\n=Q7FT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFMQ9pt1BYmjvpfkLI04rV2sM5f0YQ3mXp3MMnBb/rZCAiEA9lxGF+l5Z0fzQ2qoAQH6Qg2Z6OLmmVaX6qFJdGsU1a4="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.4_1565867423217_0.9168445329936976"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.5":{"name":"react-three-fiber","version":"2.3.5","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"6e468764d3b529091f973bc46b4051cc67173ac7","_id":"react-three-fiber@2.3.5","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-uEHg79q9mOd2nQLIk49pw7P+BPXimYyb6rvTFVplp6eBTbw2aDwk6J9JuqU25gwQyUoHH2Gnp71LTDUleiIAJw==","shasum":"461949b91a8d0069a5e61035764fc660e6b636c1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.5.tgz","fileCount":20,"unpackedSize":162904,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdVUvzCRA9TVsSAnZWagAAhskP/2sAwy3cMhPwMcmpxq5i\nrawihmvlta3KgCQRr52g1WiXm6vL9q08q6StDSWVvee+jpD45iJ9/Hu4NuPj\nYa2kGaLG8Hv0qtjKdqVtMFJwSVgfoutlFEND1gDaOjt6+gPdUEMSRdWhtxCx\nu22BEwzwmolAF5X53BJ9BQ+N6cvi4RMm+dXB8iC1zwfnQAY7vOgK/9msuLvB\nCW4sh3RumIloSQikLtKJzsqTbxyoyCLaDjtDr4byvsLazJsz8cX5BUJwQmAw\n1GSAehSIDzSIoeWn4+rjCh2gMZhFpnXF9V7otYmk6OkAnJvISV6K1FU2D3bW\nyrVjPg5S215cnUlgesasa7onPHBfBlBGN0gRuOfaCjXdMWvHqFDKS646nYf4\ngXvX8thMnqcAcERIX5jJLLj83imIDgDzcPkOC/3Iu1XtHRQTzD7FFV8bWSHv\niTl45n4cGJy9WNbZjHpTAbgO4wAzD5097aw9BpHo9Boz2t8Uz1KbF5eOY3EH\nTd5hbIjtxmylapzOapNfyjC6p52AhXz3Ajrid4L3kCbK4dtkRNCO7WHvtkSv\nzdmj/Uz4djXTkeu/sN+OSePHwn32vijxohqDbLWliYzpboKfnfStzwkfujAC\nXOMMSDl4BPURWKtvPOa2mPBw7HY/cITsuYnuTlkk44zx8tbDkpxp9O9a9ruN\nJEqE\r\n=umFp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDmUdJNsncHJmmAY3WKRIrmkE0bUvQO7qAILTooO4qLxQIhAMG9JRy9UMmiLXYNXu8va+6kysqSf+Gwaj1+UC+pt/KV"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.5_1565871090902_0.7142743708842108"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.6":{"name":"react-three-fiber","version":"2.3.6","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"75762a4aafb15179f5c7f856cb1b597113e03328","_id":"react-three-fiber@2.3.6","_nodeVersion":"12.5.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9wx5hvf54Gazg2fDQZi4TQ1Nk771O6j4VHgNCv/wAp6RW6c9iGV3BY1FievUQUOq07nj+J1zUX9U6bTRmtd22Q==","shasum":"33b2ffe10be661fa969db17477a8f229183228cd","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.6.tgz","fileCount":20,"unpackedSize":163204,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdWSTVCRA9TVsSAnZWagAA1F4P/R6Qz8wjfcSKYqfibVHq\n+5oYsqIJBZ3FpujjHNKa5imXVCRG9s+e0dNOLhpEv/ZPM5PXXmU77JT+turi\n1QNMHejb6unr+Z+qRgnYzU541EH2woWs3vXI4eA2xu6y0TikW/t4Q+MQ7MNG\npyRNkCdRnnNrNmQerzLZB8JKRdhnrvyoRvkYt+V4Gsdg9TGhPjvz2SVEAECZ\nqxG0+eA4zLUZ6STQR1uJF4j4O2DkqmcNE/HZD4dclEIgP7mRhXp6RCKYPnAc\nOUPxUDEiswwKlxCIogUFAAVZdR6b22M6bKO8S0+fL3nH0baUa5LZexeB3UYU\nSuqA1ZMXws0DOqv4OAtWWpxSpJD/mromt9bI0dxKQeo8x6eWzqinv2hrgcvZ\n7RlMjTvKstGL8clQ2smXfKyUS7y+OEMqIsW0b3RyqKcRI/9NO0mbcosEyfcx\nGPH0PEAIGgYUUFCEKLs88nnrMPckoq2QriY9AaXt+MlNTY2aMa1Jhjv1X3RW\n2r3hmHWUficAZXh6h0g/a5jI4aK6XACi1M3TMTVIxOMNK+axOT769vAqFoed\n6RK0Bk3gA4WzUGe4uQ41if4rw2iYZ3qsN/yyn2lmGvmUZw2gTD5Q4R28Fj49\nGzI40nD7XUONzLVpbAg9gOmsmsLjc17pV6APFn1i0sPeB1EG07ysL5GtWC6E\nsxRe\r\n=DNeB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDJ9GHKBq5TyZgn+fhw8rzg+bfGCtHSfGLWbEh9xJ2owIgFmtYs9KhyLP+w8/1+U9c1S5+louATIJyfobR/eDibS4="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.6_1566123221058_0.20036207206497458"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.7":{"name":"react-three-fiber","version":"2.3.7","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.104.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"bd26a830ec238b301e6b6a153964a3ac932149e1","_id":"react-three-fiber@2.3.7","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-dnVAipZXi5yLE+maIa/95rzc35pN9wq4eE3Icbax7RJpQEiiVDElT50/phcl9Ox4Pe4e2F3b9lz/lvNDZ2xmLw==","shasum":"2910adf9083e2c690a90ed1c2b87357c2c79a30a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.7.tgz","fileCount":20,"unpackedSize":169025,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdb1H6CRA9TVsSAnZWagAAH54P/RnexWYKJiL1b2v1Tu+f\nFT9pjW8z4Z6d1oc+mnqoOKNyqbMGKcVqmHa4hH9neGq8mAQ+C3/m2+9rnBNZ\nz0/FBe6FrmI888pGhpBUXWrUP02oR9yxG6K2h72CK+NLA/sko+VNK9JL+Srs\nIKgZxZk40MKO3HoUDOjbIMZyIfpz8TLWKTRuIcqpZcvpwymikOJ+IV7++OsA\nOiXxRl6dMscwCcDYB0I75Xp8+qdteji4MSbcTxqPgAixrmNuHGObpkMYUwer\n5rrKJAYSdP/zFTmkdrD3S5EiX/7yaW9ZVHc9R+JSYy6P/orEUdTKeqG8MNTL\nJkaeYIqOkhT0azXJOv9XzsyQ5Z1xMuITooJTRJ8/lm8uex6+rE5p56nIvfIb\nQ1Bk42DJ9BFvHjShKKit9qVb8NzCXgeoUENY/3O8eLYwUz9vHvrH8ecxqCde\nisxK0ijI/WdEcS1Mo5L6YPxGscyoyLgMhP61fb+3o1gkrHqzS8ryJr1hYIYk\naBpbkv6TIIfct86cOdX85Ph1mdb42SK2SY8KMbgqdRZgSsUFG84YcRb+2JJI\nv3hpDAS9jvNuTUc8WyyA7mQmXwm1519ykZrVE0th3ypYCYTBW8y1UcisT1d/\nwy2UQ9pkMNlB9vOME2f+ZzcHsl89tZq49tZMqs/vGqbDcfuJyuca2k9qRCUH\nIqvX\r\n=cJhY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFt59avfpXKCO95nACdAlnoLA2w4lJT5zyxxhukTmlkKAiEA4SPLR8Z13OKAWUHBm3DYcLnHf4ZRtDwZOJHSY3go268="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.7_1567576569790_0.9247081934027348"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.8":{"name":"react-three-fiber","version":"2.3.8","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"4ffc578650041b50d9afd608ce937d9098e0c3c0","_id":"react-three-fiber@2.3.8","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-9sPrtpDT54KgLeslPOt+JDdGa+BJSnmlgXrBV7G1yeCcHMnKnerHhdXfoNyzRUJHDj3UZLo+eBPYwb7NIzb+2w==","shasum":"4a314e2408d0b90e995655a526b64aa9b8f5bb28","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.8.tgz","fileCount":20,"unpackedSize":169203,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdb1JUCRA9TVsSAnZWagAAheoP+gJKMo7NebFVCKdYpCSz\nljKQzX4ISsGuPSMtj46XaN/xuZpNw8J4PhKvFPfsm+DONA56sqFL5oqVv4u8\nsfVSRiczpHH79real1aea+0kNNRpxl7P8q4MqWVt2lIcuxiC7s1fJ2OnEWoj\n8OrkwDAp0mRSyvMPGOOeRV/vmOfx9TudoKqEOp9asUJ7b5rwlHjUSN7/KZiR\n+YH7hi5oKFyThG01FGdALGSmPjLXjeDdDTg72Gxm3yr62JeHIScd+T1VoYcM\nqkQUlLMlNamZFFWJh/eUXnPySBvlu3zkK9QYYFwJjDRVaDFHRJSrcYfa7gBH\nJVukg1uHg/EJOkRxhmDe3KOTFCC1WAI8jGioYGAKreJlbSm2o4JrvLto9zdS\nEjLrqM4ehds+3Ua1eIDjJuE3yt1Whgco9uEk6ExqxCKb4+DKdVNao6e9+rWH\nUcgXtvibh7HDqh4Yv6n3RXBF+IWYq0dH6tRE8+Fo7lHk21PYAqpSIzmSb4FJ\nOCYPlJwgJ26u4N/tErYjo8voah5tSeLZOCOZeKUCPLpR0is/Jv7A65AXx/Uf\nDO6lY7Jnxc2Y0gnKMTpSIS0Pujsui7zoyspVC72ujTZJdrF/jbzKQshY6agB\n0BOZ19aHwekIa/CH1KOTLX5TC5IYp6/TzebHWIDoDUQyCqI82o0dvY2/PSWD\nTOGd\r\n=L1GX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIERMODwhbjHmFxIHc6L61qOWpb4mSZzzdlCUQmJKXQ+TAiBisyCvyZ31Wi/8RodZ6u9sceSdDL8umUwaj5uxKdYPmA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.8_1567576659886_0.5911730057492519"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.3.9":{"name":"react-three-fiber","version":"2.3.9","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"e05566b3331433865657403419f44770fc6c63fb","_id":"react-three-fiber@2.3.9","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-idhXqQS6tNguk1xR6fOFdNrnvIzl3vqlw8C1MNu73qX9N0KeKBYFlkWGiAqnhbTIOWJfT4G0T4QYdc/S/uU0/g==","shasum":"9c58825cbfd17a373762163415359bc26b6696db","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.3.9.tgz","fileCount":20,"unpackedSize":169203,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcOocCRA9TVsSAnZWagAA9qsP/3wN0VBM6LjALOTi6lqR\n0yiiBUnrdxw32TyK/hplTCFDSwUGYdh+GG+MI9qpEyv+3seJJmDx/KQ3KTvn\n2+nX4Uid54ME7HX7NnYDz+jHkYzWuqhR+wlv1uGo/7TAzv0qraniHR8G4L3X\nKH65r1wtXv6wBC+hXE6ljyRn6X1pyOJIQs5HLE60xPqI3o5o8yylYodtEm/A\nw/Ep2ZwqgieHjMma9q1qTw1gEb7uJfJAuGyOOPaPrpXBSQI7MHcVQl5G0xUv\n3hHWPPX/aHQVCpP3EAeByqnNedzfVDWPl7lTm7MfhhAiM5G7ccv3TmKkfbYJ\nk/xc4+zyaaDjWdLBqGWxfOnbrY/NZUw/rGkFO8Y3CNUPZq0+Qekrd99zMh85\ns4RjmWACZNCR3fW5L0HryV1cfvGMnxeko4lmB5/FFqSvnGoG/nxGWLM3V18K\nSeXALv8prxQ5mfcJom37XmApbKBl9/L0vGRge4rVDa2OvTIgPB59tsEaaGc5\nfyu0pqvmDf9AZlg6TU11Baj/W1/K017RODc5m5/LCPlQ4HlCp3CE6REjVvP1\nuXN5WrKiMYFGKIdKpik9OR9JFgX5d+3HwZS5kqK50vWk466TngESJ3YIrJKx\nhxt4b4O+GKqfTnAL+caCDsCEEgWCa7e/Dul6T9aXirI8b1OpzsIRCY8ZFrM7\nRhLF\r\n=BOA1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCyd0Uyup51r6Jq6EUgXc21HJqA4zCE3uYC3jvifxJ9dgIgWuYSqIdKeRk/U9+s3JIz4w3yM4aSPy1T3NC60EeJGVE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.3.9_1567681051886_0.6551975842414106"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.4.0":{"name":"react-three-fiber","version":"2.4.0","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"772c4533af8bb05facb8eb1df3b6025f4fdd9747","_id":"react-three-fiber@2.4.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-OrmwuFimuXJRSnjcqSmgmvh7earfkjdoyMwIqK6EgOtQVpJX/NnulA4ixphjfyKPug0+arYGTQnPYQXCJwSASA==","shasum":"98f429f72e9d7c0692f98300695e033473c6d658","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.4.0.tgz","fileCount":20,"unpackedSize":171080,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcfE4CRA9TVsSAnZWagAAxxgP/i2wd6tfQdFMdd/uHJQL\nnJdrHEP6i4QGKbSXI2LaMM7LoVWoql81IorxKZABRZwPsu0wlpcOtsWT7n35\nVXVp/6+BrVCty22MkbLRPw1mluZ9SNNtqXe9muRj6/uZlUZSZbHiC75quToM\ne4AHeG4JoczzC/xhp7x5Kl78mtKcm0oG8d6MiJ06V21jg18HxeLTYaAuenZl\nk6UzFqRnI7n/JrBN+ZJAgfsBEtRFheL7VDIxPrdWSBt1Aeg4FuWaOi/j73hT\nKp52DtqcyaLDlVk+CzNYj2Nr40ILwfbYPSiX2Bvn3Ok86DjdceWk9s8M7nMi\nUmzkXBFUWrt1evZLxHjWgCwQBikDKdUl0rxV3Zz2bVFM8QC5JOjMozNie9tM\nHgbF4oKk6AYKxTP4IB+oF4ZpiVr55r9g9W2fArDRoCOJhvkhl7Wi6uRPNOn1\n2xsORtYggwRbybyC6cUvUKZIfkimOxoSjQs4pKRSCxhxhWgpf5yJrasD8mIt\nJCSMThQpLuusjGh798TYRCxN5dMB8F+7w0q2mn6GYuElEbKhWonP7O09Y5oK\nCyIIOnJwE5oFMeGyKOhST4D5iS9jrYyLhqNKgdxGnvioy6bm95Nph6+bYEPQ\nkuHZHNIU02tdmF1VhmdvZCIZ1GRm747ApWAkWQcx5IfcXZr+PaXP+w5pHWzf\nfuGN\r\n=nycd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCC/wlI6jYrgb/GDiSxBXOQDNtYcLV62OS8s96pk72xrgIgLYkJiP9OC8ZmdyAZKyH9bNN/a7ZfaGK1DjlXCRi2JjE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.4.0_1567748407760_0.7760787559417264"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.4.1":{"name":"react-three-fiber","version":"2.4.1","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"1b13611699c6125ef5546be2a4238ef4dead4d9a","_id":"react-three-fiber@2.4.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-+RBJkxLq3eBcbniIY4tlGSKHMBxsW8ZQFdhv6qL+j5FiypCwMZqYApizcteGeF/875vo4Fc2/OyBZFCXoKHV9w==","shasum":"e59c4f77c415a0784b96ef991c865d211823dc39","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.4.1.tgz","fileCount":20,"unpackedSize":173095,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcfG2CRA9TVsSAnZWagAAfYMP/RRcYE8ldrEVTAXy7ttJ\nIUNk2fXUPLaB1YtEuhLLiBUOQ1/6/pLWUWs980hy9XYE268amKQ0VjjbHuxr\nR/uIwUIZ4MYTNFZp4E+z4wzF0VxtEt3qii+int9BiQWwA0071JzMKWWBviUm\n+r/qy3h01ni89aSq7l8Gb4HgHbZ9S/Dannd8ZjLlonZuDzPUBKU4pDBWHfrW\np1hEuoIO5oEb4i8Pw/rUPjuuSfZXXN34lpMP2aEZowoqa9HP5BNLCOEPzd8M\nMsAkZHDXBU+uCbpheNNX7bDbCt/E4blnEvJVjOpXj2AzdO8ka8g7XL9RnesG\nk8mzrVfRa1KBoxyCEGCmNw9XiLrx3Ca8mDXmDAUm5HXjA2squOukJyYJVAM8\ngY8rdOIOUkKsqSEAcqHkr8sPWn6WB5FMCH7876lUqTZ+xo65pupzWwJ1cCJY\ntmFhrtvhMi3PX2Ykp8ES8kZN1IuWcGSo5/x8LVqUvnjK+r6rRVwn2PdYhA1i\nO/IpeGSxcaEunGuBx69xKJc+JiPzzL8F/4lB4t0S9qTJQ4PzcsxhZTrP/VJG\nQiyedpgGVaZ5cNu5d16Tn5BTHXGNSXP8zRsEHAKmxTi04wW2JTOXq55/UUMu\ndXWkz3oWZMzJv10W4PmEG5PuYllWxZfXULwV1Y681TEWIsl1Edcn7tbrZAjf\nwBVV\r\n=lY2f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDuKkDByKacoprr8253fznjRMCwqx6/IXA/jJVUIbkcFAiBgP4KU4a5uQzS7fuGFmPOcDkLtL9RYZDEXxYgpXtiu2g=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.4.1_1567748534011_0.7963515210431222"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.4.2":{"name":"react-three-fiber","version":"2.4.2","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"5c9a56dc23c208fe4809f37d7e28007c8dfc6ec2","_id":"react-three-fiber@2.4.2","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-b3kNoFTbgYPCMPu0PzoVrM1si6R7oGhd5eo0f6h18f4zWQV0LRLJnVxdenrV+BDgqvzULFNmQNzKthQw2gi01A==","shasum":"b49c415b9d338aed5ba6acec97e3b8e98d238e4d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.4.2.tgz","fileCount":20,"unpackedSize":173376,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdcfrPCRA9TVsSAnZWagAAu1cP/RlaEgiaBCny+ZhPzVJ2\nSWYuIrvESGoISir5mXXT6S7aDpETij8o5SUS/l9ZlWipdECKrkdxcI23LD0l\n6yXmQoAB/AEVhcyw/wlkFSy6rbdownOmfCsC+jxkQ3hL2jTyjMyr7OYph5NV\nGerNf16pS/RsvZ73RmGvB60Qkkca5tfkAln5ova3LUADwarZ/r8QuLVWZPqZ\nP06vWjVXVSLxCYPZy+vJVwqPj2HSA4ZlEGoyrlUiM5snYwO+3mEZDwZL8myg\nSerWR59i14i8pazjRyOQcbFvj0lmzlAqUsNX+B3VaXZPVg73IUnrS0b/Ns+h\n2ffLfSUKrRXe8c587lyeTjEvz2RCxxmy+tCg8NxFIcBGhBmUiMmrGeziOzyu\nU0oTxx0/MjipOQUWsrf4oSX2Nz3M5LM+chGV+JHU2emCmwRW5kvPECjjZxAV\nTDdVdaiPJnnNvhZCA8UAAXaOED5ACUPWPzsYhdjcbjzVibwmw83VHKgR6Bhy\n9yLYth5110wLK8GsmMtCUN4m7QSpx+exPb3VmdBDl2FsHae+dtCYMwHuo3y6\nnz37poIIb2nocPe3/GS+Nz1Sju6qIkmTaGsxWhX/MVIZV6mUPGkKQrHouiM6\nJA2ePRblXMeq0MoAZWH58aFI3bu94DIGgzVqwH9Nnrgza2oVaTovKCFNOfMh\nrHzR\r\n=FIq1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkRWUQ+pHpddo7Zh/AI+hgcpdsbxtPCRqXYWiDiw1uDAIhAK6H/7RbkqetAbDjNWXbWcj5SYUq7UlvIzz8oIOdCKmI"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.4.2_1567750862302_0.37321906815831896"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.4.3":{"name":"react-three-fiber","version":"2.4.3","description":"React-fiber renderer for THREE.js","main":"dist/index.cjs.js","module":"dist/index.js","types":"types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"gitHead":"ad95fa7e073f60a06c5dedd9383b8529d7424fe8","_id":"react-three-fiber@2.4.3","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-XL5GxJyoX2FY1UjdPmlKU95+NCR7UIVgI4upQEXockpp41K5z+hXoC3S8gvJbd0XfRs1dii1uk5F9pz9vp/IvQ==","shasum":"2eb16d2ba7a8b40e37a8a994507745b2769162db","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.4.3.tgz","fileCount":20,"unpackedSize":175281,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdck11CRA9TVsSAnZWagAAuCsQAJWRiE2Rb9On8y+7mRX5\ncku1lN2uJQsZcEDjfTdTUEuXZU5yhTpxsSXo+mYOXAEAEL0Vvk6hfLIMj5BJ\ntCsQ9gRJ77ZYgaoPbxD1QoRTk0wK+AiBQsECQsPTSkaVPYAwbwF4jr8pJJRT\nI1Yode9eGlvEx7ksx91t0CHs1h5241V4mdzwM+7hv9HZXBUuvEORP0mqL2QC\npHn1LFkXrnKthj2ImmA5LRPR/lWJUDgTv3IGxRCefkcCEgGFMjDtjdqLpqUG\n2bt698GD2ZxpdlCm5tnW2v8bmEhrMy90e9L9b3u7GdUScMoSv+AGBxChz3Gv\nRofGzgHpAEn283bdCDO+0LqhXRGIwf0nCOcc/8z1ZJIs1lR4GooMD1PGnG3H\nNXsrweT8F47KbjaCinmKnX3OPVqR/IN+0k4yct+36TXsbRPz1MCG01JkKQsJ\nY252HZQKbd9kU+XICEYc6fz7kYfJK7/4+DxRnYTYopDrgsKbHf0HRN0Mapx9\nN81yxKyQk1+kHCHE2jpYHdDdQjeaG4pD/iXYDRGJ9pkvmnp0BU/iM5V/pU8z\nna8WNnMAsXSnt8aMO6Kyr+ptwbVo4X82EgZw7vihpjszbHhryiEO/MaWoKL4\nt6DahCoALS605l1Fz3Glu/6xLJ2WrQ6fyuUCxHPyHLYWu5YyXFEemB4zng/q\nvJeR\r\n=LXqW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAi/R4hGXerF3JY4qxZJzll177oq3dC3BipOk2x87L/sAiEA/A9axgrsHv+fkrPz/TKo4yuBBbc+k4JKWXKPCZJ8hlc="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.4.3_1567772020526_0.7346848388183826"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"2.5.0-beta.0":{"name":"react-three-fiber","version":"2.5.0-beta.0","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","expo-gl":">=6.0.0","expo-three":">=5.0.0","react-native":">=0.60.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"optionalDependencies":{"expo-gl":">=6.0.0","expo-three":">=5.0.0","react-native":">=0.60.0"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native (beta)\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@0.105.0 react-three-fiber\nyarn start\n```\n\n#### Limitations\n\nthree@0.105.0 is the only recent version that includes required files for expo-three\n\nThe `onClick` and `onWheel` will not be triggered, react-three-fiber uses PanResponder in the background to detect touches and presses.\n\nBe aware that performance is limited compared to ThreeJS in the browser.\n","readmeFilename":"readme.md","gitHead":"687c9ccf6c55009a5426de536c0d63f0eaf34fa1","_id":"react-three-fiber@2.5.0-beta.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-0XUXGRX0/aubd0cJlfy/N4dfepAPRHn4fQcTQx2z0XpbkqSj/wzRoUIh4vHF474Ih3FCmWNYC6/x04oGtw2MuA==","shasum":"39d9f3a0a0874a1a933f3e580470922bae4fedf5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.5.0-beta.0.tgz","fileCount":31,"unpackedSize":258184,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddLy4CRA9TVsSAnZWagAAzr8P/1sHUZ7Z4v4pQyCtA2D1\n7Gmu7jc0ldjCiwsmXorU0az2u3RAfMJ1tsSiy4qXD8RsOqDua3BmqJNuRFlg\njrrpSSswJwOOA6AvroTTRC5GTcklDv7o8a1os+Jy8pWL61Bgg3/Ixpzr0EpQ\nrDghrnkAtK1tfXt32zmp5E7Prcx9N8J5ax0Kn4DSKsdq4KtRxN1MPswgvWt0\nws0G10SWskSf3vdtl/zB8BJCrN313kKkiPKPRSM/Zpbj7MJlvJ0yO3xvKNdw\nIbWjAJU0WJ5i0T1GxJGwRJqmO7HO6whhn+FO0NPlDyti7IeRkZVpXMREESg+\nimD2EsU762pryqwFDHOksDmE0+JSVsXo+R6MUWVIGdr4avc/5rSJc8GwVSy+\nSG20VqnJ6jVMHgcrSaYa3COK3StHr0o8ZSsEUYrbid/0EhBoqio6URR5I0zZ\nXynHdXdBhzQ0jGKjHNeaIGoVnlyyj/kHBw5eZs6jJmd6y3uyHGwfgAKCqf+e\ntQ7xr7iM6PPskaqS9wN4V6S/kqyG9epMFa4YGQL51oD2ErB7uxi5a9v0bbP6\nGbC0qsLrgjOJHknrrnBuSywlhFXrWEmhtmZtPuYcdk1aLRKi8wgt6ai0oFMs\nlqsE2LNKM4Caiw/J/U4VHbZo5o7zdt9aGHt46NCHNcYSwVG7UuJHMH+vSuOo\nYG09\r\n=H72/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmQBo/cKdwImwgu+0GWLF+KgSzZuOEIEikdC+iEIrvnAIgC17y+EvXnpcxRplaA6wyPeRnL5qe99n4xidOWxnsARw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.5.0-beta.0_1567931576063_0.19075630146546718"},"_hasShrinkwrap":false},"2.5.0-beta.1":{"name":"react-three-fiber","version":"2.5.0-beta.1","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useRender(callback, takeOver=false, dependencies=[])\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useRender gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useRender } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseRender(state => console.log(\"I'm in the render-loop\"))\n\n// Add a \"true\" as the 2nd argument and you take over the render-loop completely\nuseRender(({ gl, scene, camera }) => gl.render(scene, camera), true)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useRender, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useRender(() => composer.current.render(), true)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useRender` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the scene-graph.\n\n```jsx\nfunction Content({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), true)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useRender(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)))\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction Main() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <group>\n          <Content camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </group>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-userender-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useRender, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native (beta)\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@0.105.0 react-three-fiber@beta\nyarn start\n```\n\n#### Limitations\n\nthree@0.105.0 is the only recent version that includes required files for expo-three\n\nThe `onClick` and `onWheel` will not be triggered, react-three-fiber uses PanResponder in the background to detect touches and presses.\n\nBe aware that performance is limited compared to ThreeJS in the browser.\n","readmeFilename":"readme.md","gitHead":"295eb260dfb2d701dfaebbdffdea54091489c2b9","_id":"react-three-fiber@2.5.0-beta.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-kyuRxkKD0bnk4KmnhLbRMDXgiXRK5cgJJBetxrub+ekNfnBWN3WPkK+A/yt66nvZoneODdraEg7HaDWhPjWtwQ==","shasum":"380999bb17c3de693fd44aa5572b2565f7ac64c7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-2.5.0-beta.1.tgz","fileCount":31,"unpackedSize":258333,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJddV7mCRA9TVsSAnZWagAACicP/04vl9ELbFvXk1O9VBFG\ntKpFAVRg4YBgIaQ/MPv1uY/SVU0Tu3iCAcgmrVozOgBsoy2smoTxthsB5vHo\ngvEzRy5445XOphmAo8JF6akCbyc+w03IUiQksgy/P3d8q+yTB7V5T2qqLXrm\nGVkPE2z2Bu+MVarkQh8W0jaffGZHwlayDj/LHkfxF+rGRncDc2lbOySJbigR\nEvgrQuHcIjnCxJyg4sAHYNFCfqXNHSooiFflVoar07qZjnBWv+wIsvv90DV+\n8vRwzMQP7DpQSNzR0bgyyydu0ST71LfccKq/SSXedUWiw0xxLVp/ZS/qTc7m\nsSzGXgcbEg5/IKvKcQo2RhmrEqqwc1lCv3dKbOhtpwHIoPVzSKjULEHx7ybv\n637u/oWqyKCc/z9ngo3VnPmONOvyRpbdDn7MP5briDp5u2A4kLc8rsfHyGe7\n6x0RRQE/PXJFiLrVTGZo6eJwgeubyuwkJriFiOWqMGJzdP3Lynxc2OCo+wWN\ntlvVhsuvrUqndbPYds13Mt0xHcH4Zglhb0LqoNSRbuvhJ+vTVvZZ4Ekbapfi\nl3BNFs2vDP5+JoXUK1PBGK4Ao4uTBNKe0yyjlH5+irbvCi5DRVzGeh6HOvWc\nTCmKa2w5MMAa2xSqD/aj840rYsT4X9E5/kTtgNidbb9jqr6iM7qkPeBsAuWQ\nLGOG\r\n=blDJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHP1ehC2H+hNnw+US436Pj7kM8lKtS/OtG0cglkEBvC+AiEA2LMxgT8pjcslPWjsL5AtLAoon1fnTnhm/CQ0eRXZ6Z8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_2.5.0-beta.1_1567973093784_0.892114981421195"},"_hasShrinkwrap":false},"3.0.0-beta.0":{"name":"react-three-fiber","version":"3.0.0-beta.0","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useFrame gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 100)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useFrame, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useFrame(() => composer.current.render(), 1)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  useFrame(() => ref.current.updateMatrixWorld())\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useFrame` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the priority you give it, higher priority means it renders first.\n\n```jsx\nfunction Main({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), 100)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)), 10)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction App() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  useFrame(() => camera.current.updateMatrixWorld())\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <>\n          <Main camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-useFrame-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useFrame, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@latest react-three-fiber@beta\nyarn start\n```\n","readmeFilename":"readme.md","gitHead":"ebd82c4800c42544987c852ec632575a274b73cc","_id":"react-three-fiber@3.0.0-beta.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-kx8IXQCNONX/RaZqvxOXuNFO6edyxVh3yeucySS0yTdFn4YDDk7Yy8ry+j7mYXE/0XL/2UOkA0vBuqWiNIrsKg==","shasum":"a132773ef1e7533ad1d2993de15a8a8341ecfc31","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.0.tgz","fileCount":31,"unpackedSize":261712,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd5NSCRA9TVsSAnZWagAA8gcQAIGhGGDhMGE67BG5Dlsx\nQhLKF+RL+sL8A7N8di3PTtt2jfhgKtYgwjLHy3+BXOaA11HA1zK1NTErPRu7\niiqoS6zAt28nfjj9mTEFwWf9viAKJgd4f4KSKE1ujXdPnIyS7LZariMLx5ug\nJYM5QgpJ3SO5QRQgJgFPRhUi48VxWFyQ7MEQeIlUNjnlIqHcBtXP3aaNQmwd\nQn/BWpUECIJQ0lv/BvxkIAsxEnTyEtAeqngsTwQK6wcmvOG2OApDu6sOgkiC\nH+Or/Y6YsbNedtz7EnnNmamfUpcuClI/2U5YbgfaCssBQelvS8XcEHXKyWVc\nKZWhbrO0j9UacSvgbn3yrt9zpoJ6Gpzga+B4E+S2sH5w85+Y7C0eDmHDwqVA\n7nC6ZB7MhnnqSrrKOjuTeVA42ABSRZ7kcOUcX4qMIe7BPPUACNtBp4yJYlPy\nHW9fAp3hqAWdVgymKzaJK2G87XtyOMigWMKWKI4tieiLutpyuqO6Tpmr3mau\nD7LP9BVe9VNiQ0ZJPBV/KahNPAVOG2BdvY0VTX1xn5aVXidXKBGIPp9wwTOM\nSJdPssPOeFcaIBagFrQCaHY5yYi+IUSeOaVnVQJN/uva2IOMI3vvXShKn9+g\nJORW+zQLvNyo5t3CrETe4PttYqm/n03DbpCkPnXHaynCrcFREG1+pq64jmmv\nBirX\r\n=ZR6S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEZGds6+VH52oaQb48FsWqERqdt7XZn9LVe97ADcp1xNAiEA48uj93eLs8P/Y2JqLVMxAnq/FE1watHcR0GLAyXZlg8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.0_1568117585317_0.35219453987955296"},"_hasShrinkwrap":false},"3.0.0-beta.1":{"name":"react-three-fiber","version":"3.0.0-beta.1","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useFrame gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 100)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useFrame, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useFrame(() => composer.current.render(), 1)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  useFrame(() => ref.current.updateMatrixWorld())\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useFrame` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the priority you give it, higher priority means it renders first.\n\n```jsx\nfunction Main({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), 100)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)), 10)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction App() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  useFrame(() => camera.current.updateMatrixWorld())\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <>\n          <Main camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-useFrame-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useFrame, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@latest react-three-fiber@beta\nyarn start\n```\n","readmeFilename":"readme.md","gitHead":"ebd82c4800c42544987c852ec632575a274b73cc","_id":"react-three-fiber@3.0.0-beta.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-ESIJuhjLfO1tLV+X1EfKz47o2J5w+CADx12VgqgYCm4ZUSzQJhlsHL86/prluB1VHOpxoOQ03nEq3v1iu+YkyA==","shasum":"159d5c562a1004119ff72cff041473b08197ce51","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.1.tgz","fileCount":31,"unpackedSize":261916,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd5QfCRA9TVsSAnZWagAAukoP/RxXLz9mWj0VXrp82bMk\ncqufjAVWiWZxqjwq52fHmguqTuCl+aW4cfxaaXHYUjwvn86OnB/6carnGjNj\nc5Ac4N7EwF1U/RnVYneUnzd1FY6Z/VF+QIa/5EW+SdZ+7+d3LATaUF/7shFj\noP+LXUA9D4izsMxP9UtWMrwZxwXiv3G4qW9dO6601z+JKFlRaaRv7N2VNWzs\nb2iNy9/YBeG1yWnIH5fkeYDjtQ7q5y4R01L+1Od4ZJCrREPAByfeBtQzFQ0T\n8an4Q6rbkhaIX29RsMjDph6vN6L10mGP8tgbNdtseSERJvpPzXPzMdqhtUgy\nj0jSBO7EFu6t8X2BlOQ99kGFw1yQCTCaJuXPpWx7Gc44M3MIdaSp/RK1o5zM\nAEG2QChN10prbdzBuiXO7Qf7DuGft8mVwSfJ4Rph2IoFslU4EU8+PjKw7DfV\n2IwJszGX7KYhq518xESpndPcwkKpjn/ZlZUyhBA/hPjiLLpi/SgCvLeMWUND\nstE9sYAPlaRqGMDapXm/xE4r2yWcP5f2Sj7hjOleFuz/1lFWdOaMTEhkdnAT\nk6S91vCD6gqmTlB2RQFvl17POvn5Y4lGKwIBguOAG5fFCm7vLO0+sTyhjAsr\ndzgA0h1sN/snmE7fjm+rfpjPQwkguXoDXjtREKS4e6BZRrvrLHS+xuio//4l\nWHnA\r\n=YjSy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDqapGYI15yk4jiy/qunitAL89vdgUXQVygK6EV8IFtoAiEA2VwTkvxE8v9yOZAUPDMRBQ3ENiKfAeD5QnjX5/lVCEk="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.1_1568117790583_0.9650517384441464"},"_hasShrinkwrap":false},"3.0.0-beta.3":{"name":"react-three-fiber","version":"3.0.0-beta.3","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useFrame gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 100)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useFrame, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useFrame(() => composer.current.render(), 1)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  useFrame(() => ref.current.updateMatrixWorld())\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useFrame` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the priority you give it, higher priority means it renders first.\n\n```jsx\nfunction Main({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), 100)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)), 10)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction App() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  useFrame(() => camera.current.updateMatrixWorld())\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <>\n          <Main camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-useFrame-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useFrame, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@latest react-three-fiber@beta\nyarn start\n```\n","readmeFilename":"readme.md","gitHead":"ef3e0c9ae171f7c7fda560f342757e49ec4f7771","_id":"react-three-fiber@3.0.0-beta.3","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-8BpDdd2+IiHQLub5qBcwd8YQS7NShFR8/C9wC3FZmzUSOaFMBQX7d7tHplVABiT9+sr37H77O3iARBsBGEhodg==","shasum":"eaa7311e79e5864aa872b449f71b46c7c4fb1965","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.3.tgz","fileCount":31,"unpackedSize":264271,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd9EJCRA9TVsSAnZWagAACQIP/RGugw3XScJ7+EfPGDQN\nnH4Bj1XqVSLVxpPpdZ4VE597vUCXML5tIRqEgvAh/iHWF/hl3v8ChwvFUboE\nny/HccJcIWJK5b7yDLxTjXwwNNiL65ubW0g5u2t/vfuiXHolHxmrgKeOwFLt\nb8z6V7yDtONo4reCBt2D9oz9fgmkj4bRs7+w8hdQ3OMCiUf3U8GveS4dVfwh\naLTPsxByrl6IBfhSDa51tqMa+/o+qVNJ+YsYj2x9n216e5TEeOzigq1+Oeqm\nFwP/eimMYCUN13QacDUpIJcdy8rtL9bTWUvVKd87H7EehbuFUdkCxjENA/iJ\nmAglHBxNIgl7hkcinNmjStgCQzmOVEZMQrGSfAOwE1pQoE0Ibr5GL0HPPhUm\nErmxUdKQmwnrlpE7wQPmMszdUlZ7fdeHkHJYkY9cynr+AldH4ivCjk3mftud\ne7hhecpshecmVL+8YE3IUdMMsqqpcRH+Du70AkSTty3LNlUm2ko0iDCtKD/9\nFXN9OITePD+aysD+Z4U6quEnwI5Jv66690JHrftalc79g2to0872DgyLIT2n\n6pJj/2zL3FFO+NziauGFcdN9bJi8uQGf9Im2sfJ1HD6ALhAzjLgkcxewjHT1\njdXxi43NeuDFgXnCrRG5LfOLJNUXXICRyO5ajf3XGe8SlH8APcV9yH8YyuOJ\nxbyo\r\n=nBQp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFaqGsYEFhr3Gcsw1Nmj9dC17bNHuEBiSpSH96klDiN7AiAC7M1a/YN3H+yav2OxGHr0Zr5FjVMaIIXZMGQ9HT+nmA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.3_1568133384577_0.24875628423552287"},"_hasShrinkwrap":false},"3.0.0-beta.4":{"name":"react-three-fiber","version":"3.0.0-beta.4","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.107"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport * as THREE from 'three'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { Canvas } from 'react-three-fiber'\n\nfunction Thing({ vertices }) {\n  return (\n    <group ref={ref => console.log('we have access to the instance')}>\n      <line>\n        <geometry\n          attach=\"geometry\"\n          vertices={vertices.map(v => new THREE.Vector3(...v))}\n          onUpdate={self => (self.verticesNeedUpdate = true)}\n        />\n        <lineBasicMaterial attach=\"material\" color=\"black\" />\n      </line>\n      <mesh \n        onClick={e => console.log('click')} \n        onPointerOver={e => console.log('hover')} \n        onPointerOut={e => console.log('unhover')}>\n        <octahedronGeometry attach=\"geometry\" />\n        <meshBasicMaterial attach=\"material\" color=\"peachpuff\" opacity={0.5} transparent />\n      </mesh>\n    </group>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <Thing vertices={[[-1, 0, 0], [0, 1, 0], [1, 0, 0], [0, -1, 0], [-1, 0, 0]]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults\n\nCanvas will create a *translucent webGL-renderer* with the following properties: \n\n`antialias: true, alpha: true, setClearAlpha(0)`\n\nA default *perspective camera*:\n\n`fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nOr a default *orthographic camera* if Canvas.orthographic is true:\n\n`near: 0.1, far: 1000, position.z: 5`\n\nA default scene (into which all the jsx is rendered) and a raycaster. You do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Three's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('indianred'), transparent: true })} />\n```\n\n#### Shortcuts and non-Object3D stow-away\n\nThe following is the same as above, but it's leaner and critical properties aren't re-instantiated on every render.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"indianred\" transparent />\n</mesh>\n```\n\nAll properties that have a `.set()` method (colors, vectors, euler, matrix, etc) can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('peachpuff')}` you can do `color=\"peachpuff\"`. Some `set` methods take multiple arguments (vectors for instance), in this case you can pass an array.\n\nYou can stow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" format={THREE.RGBFormat} image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n</meshBasicMaterial>\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n</effectComposer>\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry>\n  <bufferAttribute\n    attachObject={['attributes', 'position']}\n    count={vertices.length / 3}\n    array={vertices}\n    itemSize={3} />\n</bufferGeometry>\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-color=\"lightblue\" geometry-vertices={newVertices} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `apply` function extends three-fibers catalogue of known native elements. These objects become available and can now be directly instantiated.\n\n```jsx\nimport { apply } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\n\napply({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n</effectComposer>\n```\n\n# Events\n\nTHREE objects that implement their own `raycast` method (for instance meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll.\n\nAdditionally there's a special `onUpdate` that is called every time the object is updated with fresh props (as well as when it's first being created).\n\nThe event data you receive contains the browser event as well as the Threejs event data (object, point, distance, etc) all merged into one object.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nAll hooks can only be used **inside** the Canvas element because they rely on context updates! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { gl } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n        ...\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { gl } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n        ...\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the size of the canvas in screen and viewport coordinates. When you resize the canvas, or the browser window, your component will be updated with fresh values. \n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nIf you're running effects, postprocessings, controls, etc that need to get updated every frame, useFrame gives you access to the render-loop. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 100)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nSometimes objects have to be updated imperatively. You could update the parts that you can access declaratively and then call `onUpdate={self => ...}`, or there's useUpdate.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getCubeVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n    geometry.computeBoundingSphere()\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useResource(optionalRef=undefined)\n\nMaterials and such aren't normally re-created for every instance using it. You may want to share and re-use resources. This can be done imperatively simply by maintaining the object yourself, but it can also be done declaratively by using refs. `useResource` simply creates a ref and re-renders the component when it becomes available next frame. You can pass this reference on, or even channel it through a context provider.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nLoading objects in THREE is, again, imperative. If you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc, then useLoader will help you. It loads a file (which must be present somewhere in your static/public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n  </mesh>\n)\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Recipes\n\n## Handling loaders\n\nYou can use React's built-in memoizing-features (as well as suspense) to build async dependency graphs.\n\n```jsx\nfunction Image({ url }) {\n  const texture = useMemo(() => new THREE.TextureLoader().load(url), [url])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshLambertMaterial attach=\"material\" transparent>\n        <primitive attach=\"map\" object={texture} />\n      </meshLambertMaterial>\n    </mesh>\n  )\n}\n```\n\nPlease also take a look at useLoader, it was made to make 3d-asset loading easier. \n\n## Dealing with effects (hijacking main render-loop)\n\nManaging effects can get quite complex normally. Drop the component below into a scene and you have a live effect. Remove it and everything is as it was without any re-configuration.\n\n```jsx\nimport { apply, Canvas, useFrame, useThree } from 'react-three-fiber'\nimport { EffectComposer } from './postprocessing/EffectComposer'\nimport { RenderPass } from './postprocessing/RenderPass'\nimport { GlitchPass } from './postprocessing/GlitchPass'\n// Makes these objects available as native objects \"<renderPass />\" and so on\napply({ EffectComposer, RenderPass, GlitchPass })\n\nfunction Effects({ factor }) {\n  const { gl, scene, camera, size } = useThree()\n  const composer = useRef()\n  useEffect(() => void composer.current.setSize(size.width, size.height), [size])\n  // This takes over as the main render-loop (when 2nd arg is set to true)\n  useFrame(() => composer.current.render(), 1)\n  return (\n    <effectComposer ref={composer} args={[gl]}>\n      <renderPass attachArray=\"passes\" args={[scene, camera]} />\n      <glitchPass attachArray=\"passes\" factor={factor} renderToScreen />\n    </effectComposer>\n  )\n}\n```\n\n## Using your own camera rig\n\n```jsx\nfunction Camera(props) {\n  const ref = useRef()\n  const { setDefaultCamera } = useThree()\n  // This makes sure that size-related calculations are proper\n  // Every call to useThree will return this camera instead of the default camera \n  useEffect(() => void setDefaultCamera(ref.current), [])\n  useFrame(() => ref.current.updateMatrixWorld())\n  return <perspectiveCamera ref={camera} {...props} />\n}\n\n<Canvas>\n  <Camera position={[0, 0, 10]} />\n</Canvas>\n```\n\n## Heads-up display (rendering multiple scenes)\n\n`useFrame` allows components to hook into the render-loop, or even to take it over entirely. That makes it possible for one component to render over the content of another. The order of these operations is established by the priority you give it, higher priority means it renders first.\n\n```jsx\nfunction Main({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = true), gl.render(scene.current, camera)), 100)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction HeadsUpDisplay({ camera }) {\n  const scene = useRef()\n  useFrame(({ gl }) => void ((gl.autoClear = false), gl.clearDepth(), gl.render(scene.current, camera)), 10)\n  return <scene ref={scene}>{/* ... */}</scene>\n}\n\nfunction App() {\n  const camera = useRef()\n  const { width, height } = useThree().size\n  useFrame(() => camera.current.updateMatrixWorld())\n  return (\n    <>\n      <perspectiveCamera\n        ref={camera}\n        aspect={width / height}\n        radius={(width + height) / 4}\n        onUpdate={self => self.updateProjectionMatrix()}\n      />\n      {camera.current && (\n        <>\n          <Main camera={camera.current} />\n          <HeadsUpDisplay camera={camera.current} />\n        </>\n      )}\n    </>\n  )\n}\n```\n\n## Managing imperative code\n\nStick imperative stuff into useMemo and write out everything else declaratively. This is how you can quickly form reactive, re-usable components that can be bound to a store, graphql, etc.\n\n```jsx\nfunction Extrusion({ start = [0,0], paths, ...props }) {\n  const shape = useMemo(() => {\n    const shape = new THREE.Shape()\n    shape.moveTo(...start)\n    paths.forEach(path => shape.bezierCurveTo(...path))\n    return shape\n  }, [start, paths])\n\n  return (\n    <mesh>\n      <extrudeGeometry attach=\"geometry\" args={[shape, props]} />\n      <meshPhongMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n```\n\nThen ...\n\n```jsx\n<Extrusion\n  start={[25, 25]}\n  paths={[[25, 25, 20, 0, 0, 0], [30, 0, 30, 35,30,35], [30, 55, 10, 77, 25, 95]]}\n  bevelEnabled\n  amount={8}\n  bevelSegments={2}\n  steps={2}\n  bevelSize={1}\n  bevelThickness={1} />\n```\n\n## ShaderMaterials\n\n```jsx\nfunction CrossFade({ url1, url2, disp }) {\n  const [texture1, texture2, dispTexture] = useMemo(() => {\n    const loader = new THREE.TextureLoader()\n    return [loader.load(url1), loader.load(url2), loader.load(disp)]\n  }, [url1, url2, disp])\n  return (\n    <mesh>\n      <planeBufferGeometry attach=\"geometry\" args={[3.8, 3.8]} />\n      <shaderMaterial\n        attach=\"material\"\n        args={[CrossFadeShader]}\n        uniforms-texture-value={texture1}\n        uniforms-texture2-value={texture2}\n        uniforms-disp-value={dispTexture}\n        uniforms-dispFactor-value={0.5}\n      />\n    </mesh>\n  )\n}\n```\n\n## Re-parenting\n\nWe support [portals](https://reactjs.org/docs/portals.html). You can use them to teleport a piece of the view into another container. Click [here](https://codesandbox.io/s/three-fibre-useFrame-test-fojbq) for a small demo.\n\n```jsx\nimport { createPortal } from 'react-three-fiber'\n\nfunction Component() {\n  // \"target\" can be a three object, like a group, etc\n  return createPortal(<mesh />, target)\n```\n\n## Rendering only when needed\n\nBy default it renders like a game loop, which isn't that battery efficient. Switch on `invalidateFrameloop` to activate loop invalidation, which is automatic most of the time.\n\n```jsx\n<Canvas invalidateFrameloop ... />\n```\n\nSometimes you must be able to kick off frames manually, for instance when you're dealing with async stuff or camera controls:\n\n```jsx\nconst { invalidate } = useThree()\nconst texture = useMemo(() => loader.load(url1, invalidate), [url1])\n```\n\n## Enabling VR\n\nSupplying the `vr` flag enables Three's VR mode and switches the render-loop to gl.setAnimationLoop [as described in Three's docs](https://threejs.org/docs/index.html#manual/en/introduction/How-to-create-VR-content).\n\n```jsx\nimport * as VR from '!exports-loader?WEBVR!three/examples/js/vr/WebVR'\nimport { Canvas } from 'react-three-fiber'\n\n<Canvas vr onCreated={({ gl }) => document.body.appendChild(VR.createButton(gl))} />\n```\n\n## Switching the default renderer\n\nIf you want to exchange the default renderer you can. But, you will lose some of the functionality, like useFrame, useThree, events, which is all covered in canvas. [Here's](https://codesandbox.io/s/yq90n32zmx) a small example. \n\n```jsx\nimport { render, unmountComponentAtNode } from 'react-three-fiber'\n\nconst renderer = new THREE.SVGRenderer()\nrenderer.setSize(window.innerWidth, window.innerHeight)\ndocument.body.appendChild(renderer.domElement)\nconst camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)\nconst scene = new THREE.Scene()\n\nrender((\n  <mesh>\n    <sphereGeometry name=\"geometry\" args={[1, 16, 16]} />\n    <meshBasicMaterial name=\"material\" />\n  </mesh>\n), scene)\n```\n\n## Reducing bundle-size\n\nThree is a heavy-weight, and althought it is modular tree-shaking may not be sufficient. But you can always create your own exports file and alias the \"three\" name towards it. This way you can reduce it to 50-80kb or perhaps less.\n\nGist: https://gist.github.com/drcmda/974f84240a329fa8a9ce04bbdaffc04d\n\n\n## Usage with React Native\n\nYou can leverage Expo's excellent WebGL port to react-native and use react-three-fiber as the renderer.\n\n```bash\nexpo init myapp\ncd myapp\nyarn add expo-gl expo-three three@latest react-three-fiber@beta\nyarn start\n```\n","readmeFilename":"readme.md","gitHead":"48a19e3b593d7bfbf7d23efa79c103b1f540738b","_id":"react-three-fiber@3.0.0-beta.4","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-E0mHx1bidXX5yQNqW+rbOZsYsQ6RD+Gp8GXd1Ef8Kin/tXF/ZDAVCFWnGMOnBwb7Bk2Zm2+rMVxyi3uTiKHI+A==","shasum":"e9a35e23ecfd9292d0512908c4016bc0fe20cf88","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.4.tgz","fileCount":31,"unpackedSize":265311,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdeBV1CRA9TVsSAnZWagAA5nwP/jAC/qeFKIaeD8VhhtK2\nk4oG8fIzjG7SyuDKzZzvU3ROIyPTUY3ZN+Eax0w3cI3SMdDY17AHjuUtG5A2\nIFCtrEXqBD6hBUyhRNQw8jAwNK+S7LSAwlRDoMrZtfxJtx1ufXGH6ZbKHKRa\n7QN1wYBLGcSsoGxgWds6O8X7z6hvwUMFr0wvglXnyjKjO5qi9LzRHdTdgibD\n4FrJ1Y6kWdIARrw+fS+KYrAc0farZ34m0pseDkFI5qV61NwmKErfzAOh7ieG\ncAUUgKeAzIauo0xB81eVeHQLG9+qiLEPPQy0CjrqjvNC5pCbg9/HSiuZp85x\nT8iKaCdQtGc/UlmOM5UPGvgKzNHCjHWJHCMO69jtMtmHuuT815Fqy+yFX8RH\nO3WDuEuiKQ+/Q5qNsjCBwVnNSAVSUWbRbytmBiyhZxQLPGFkTKRJBK7on3ip\nb8nZYBsh3xYVkLMb+ONzCJy+BCPxOhVkTfZbaENBcOGCFQwQq4mhtyogyr/Z\n+E2sRP0cUvcdHS6PsnT5br8pCnDuWLHkHIVHKcBCB2XgFN4LGvvvB+JGYAos\nkendY5R982dA/JRlkvNbvBP7l0aS8Fhr0aJUJbKqmPynupjMIuxj3rQpEhfS\nfpwobxVC7eu2awLkiDQ2R/ne/jvc1QGBlfgdssJJuxXsDEpPmTO72St6JNfU\nrSSC\r\n=Dnno\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCWl+uB+E79PwsPZjbiGuMeYEQZWuZLJiAJ3lM5Q5HAVgIhAIRV1EU9nEBuFekdkADKUyrNr4AI6F0EyGWE6zyQA6sz"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.4_1568150901104_0.09211345532721227"},"_hasShrinkwrap":false},"3.0.0-beta.6":{"name":"react-three-fiber","version":"3.0.0-beta.6","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0","three":"^0.105.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nWhen you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc. It loads a file (which must be present in your /public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"29c65ed6f23ad1578d9f3689ef1c43f79c0d1150","_id":"react-three-fiber@3.0.0-beta.6","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-P9iOgq19s/VLHDN/A0TvDBix9MMM5Tv8Hq5Wb1JPifhGwVtM1nC6Wk9HvsKZvdXE2qA2iTGQvXrEwmORvdvJ4g==","shasum":"8a57cad86e695455c1476578be2bcee59db54919","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.6.tgz","fileCount":35,"unpackedSize":272392,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdepbyCRA9TVsSAnZWagAA450P/3ZZtKdVplcv3tun3V8k\n0viMzq8bbLfT9r3Omeeaq+Qy2dSdsNjvu4KJKrh2UA6b/9agHLsSKv4eHRsR\n7b9KtRQbzhJkcaKEeL6MpqxRM9B9m7djyUnxqYDwEA+Q3LT/EdK/8dNRiTU5\nOjZjqsTdCfo/7xgdV1twTcU5fu4WxqPw4UslmIwf2EHIVLuxwh//PYdm2HCr\nGpRlttumy4w9ZbDnBkhxYoroyhZh+IKVurWDszzo/vxE4ZOvxEusqnfX6Udy\nWSbv2HtFtvyLOX4IogPBb6DZoZf3y1gLQB5TlaWFkG0Wv0xkYfbPWAFjf0zl\nN8EL5E4lkWVvb7182ItHoAPNNAJdpClLlokBKTobwV7MTDeTIi6aAFYTmJ8J\ntzwto3lBeWzZcOdlk7IDT3xRXHwjnZ+mAzESTPr3cMKY/BAkg19bHPRfLvlH\nNkrediiAylFDZwNXIKSBhsuumMSkBscXDHTBR7OXZutj4HodcjoRTLHtdGQg\npaY8glcfUsIpGTXUd2bun66XmqI3uT7IdKpGjmIEXpLObsnFi24hQ/cEbPZT\nLehTiXTm+qntagOkroDWDIxjhaMgLD7WPGKtv3fUcLwE+htXnsgCiTj+IsEd\nW650rFq/EOiwbrp1DXw5G6JIAgfAQ/asiJ0DpugiY4bmVZmNVlgss+hFjXk2\n/yqi\r\n=G3iO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDz7OlAD6JEZXTiFsikDXL0PTmsABzk5rRU9fTVS+RDAAiEAxAemeLIlhfgTedcTD7aO31W/4PesljXKh/mNKnHCt34="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.6_1568315122057_0.8948149957996807"},"_hasShrinkwrap":false},"3.0.0-beta.7":{"name":"react-three-fiber","version":"3.0.0-beta.7","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","draco3dgltf":"^1.3.4","jsdom":"^15.1.1","jsdom-global":"^3.0.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nWhen you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc. It loads a file (which must be present in your /public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"f494b948cb888e25612e8c0328690fc7bab78017","_id":"react-three-fiber@3.0.0-beta.7","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-Zuh8AzseTGa9oKm98djvArOXfcoFF7spHvygVg+b0pRYyZiQmJkmC8g62SHRTC2QPq+bOVDvH3Vt28yLNSaKpQ==","shasum":"69739eede268f12ce9d5f680b0fa6bac7462051c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.7.tgz","fileCount":36,"unpackedSize":288867,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJderXUCRA9TVsSAnZWagAAAhwP/1Hebjb02GIblFTZ+wWN\n7uPcp4MbqolEvndlyqqxhGRdIJXM70nE9mcP213FFnd1RnaG3HBDY2k/ppji\n8F0e4StchHCvbaROnEQFFfgdWZosfAysLrN2AXzc30SsPEEQaL3SifN4XFT6\nGdwttDXmDq551V9zfSTgco2t8MZBFNLW+xcpKECxITeKoNZ9Xw5A7s783Ow2\n/GX7REQp5qBde3CGOUVLthrB8X5WyL6jZVTmhN77gpP3DQ4vgH4RcyUMJMV3\nCFgEczlWsugMYnFZy0opAZmlOl/fjpRct3DpAyALSmff2wN0cbTWYg5ojgGh\nUJ8Lr4sageILH3mlkW1E2y9Vi9UEfkDag+QjRmnXwbfjQmRnRSkNxxUiap1I\nPDg3b1bk7vQo8m2SnrGQ6fx2zsqhJ2GVnKgLOtV/sdj99Vnw46+215Gy+v/o\nF1N53FGAzy3usx2IZUiMv1jZvyHKjaWL9mEwqxQow1kvlCiZCQr+kIfU/H1K\nlNjeMygiEucDFcFaQQU9nA65zGFOVnesspRGSe5aInftQQivREnnwv81KjTg\npcUqev6kNIi3nCoEXRhLqQyyPP/xEMuruRBVViKISAqNSIeRSzT1wLc1OcpR\n+rUB6Vm1gIopdGu9UNwoKd68dfG3c39WrtP94lcbZ4ETZgMIx4n1QdA+qvZX\nyMW/\r\n=oLth\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE1bIwIOsFbIV2N6xBgmATYxcls0PWSApGB8JltCIJpYAiBmU4lwJJXhdrOAORr43skLOUiSAIquIWX/8LfLAKKxkA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.7_1568323027427_0.7326276240297187"},"_hasShrinkwrap":false},"3.0.0-beta.8":{"name":"react-three-fiber","version":"3.0.0-beta.8","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","draco3dgltf":"^1.3.4","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nWhen you want to write out a loaded object declaratively, where you get to lay events on objects, alter materials, etc. It loads a file (which must be present in your /public folder) and caches it. It returns an array of geometry/material pairs.\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst model = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn model.map(({ geometry, material }) => (\n  <mesh key={geometry.uuid} geometry={geometry} castShadow>\n    <meshStandardMaterial attach=\"material\" map={material.map} roughness={1} />\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"f007b6a676e860e56c3801bc4e7a20ec1381ae17","_id":"react-three-fiber@3.0.0-beta.8","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-kY3yMKuQCP9+1jZIS7XbJRxatGr/2YB0kpJ/eniMzAMYqEwBctca/bTz4JgrucVTI3QVNaZhsJGZFXW1XqGlzQ==","shasum":"3efd51a0be6755cf33ff41427ead670d6dd48109","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.8.tgz","fileCount":36,"unpackedSize":292390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJde0g0CRA9TVsSAnZWagAASHsP/2HTibHfyPfVZr8zzt2m\njhwp5ZNP76gWAwN4WS5rpJQw/qj9To0ImP7bp0d24CPRQTZyXbs94zUqGFbo\nJOK1K0AZosB8eh1lJUUkXVxYF9BzHG8wTUFNv06vjSDZVadF7CKt2SHPClZ6\n34UqputVwi846jM0weQPBiRJfVZ8bAsfPXe46CkqOsGc4N+PKL1SP/89Au4g\n6GH6qASOVe810Uqj4Lvn0L6K/v2EwWrxNu4VYUDaGUcTrRLNtBuMusO7fNKy\nIwYP6SeDmbioacRH9IaHrRsFxT+m2tmWJS28/TWXRIQh9MMI8lEBgPqB82oH\n9OXuyuZ/9jN+/2dScOia0sNx4UT8vDE1TMBrCSwqMJrti2/FCbbFaBEIsQd7\nWa8z7HhrwZ6a45WodVQtA3CCvQbX8PcOYYSpF8u99GhcBxGbY5cPmuL1nIKi\nIdMelOpqZyYa5kb0qIS3waiU5FkjgIgXhs6HYJZqTSzXyDmBu7QBtXHcCr+S\nNmijtElEfnpc7d2Rc4pCP+hPXkA/ROllobR9I2IrwerM/8H1b1rdQVmhSIh3\n08TAVYFVRapNGB96H+/G5SvpavrcM7FIrY2TnKPM8j4Bfz2sGrExE+sgwvNG\n3R8r9/CxvVUkhphql1tzlNLxM5/Ie/vm4bugBu3P5vStIzWsRWrzyk3+S82I\nSGDr\r\n=nxhx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDzcKItZC3Snho1W1Kj3Mmxpp/EZJvyHYZPqX5omiUz6AiB7JMN2H/mo20C/72u32TewEqmHCTuFafYjFMZj6AzYJA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.8_1568360499838_0.8207747900118898"},"_hasShrinkwrap":false},"3.0.0-beta.9":{"name":"react-three-fiber","version":"3.0.0-beta.9","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","draco3dgltf":"^1.3.4","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  mouse,            // Current 2D mouse coordinates \n  clock,            // THREE.Clock (usefull for useFrame deltas)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"2cfd6ea354bb947cb0040b0ffd086cdb3bd91caf","_id":"react-three-fiber@3.0.0-beta.9","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-v0sQ36FL82TQUiicOpPxIwQCpSjmgEIUM3fa+fH4G/Ws5b04wGZHX0jHbvFDHwslKlowzarxb12z+wCUnUEgJg==","shasum":"aa846dec8ead8cb27f29b16ed8d3c13834907255","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.9.tgz","fileCount":36,"unpackedSize":293452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfKdMCRA9TVsSAnZWagAAtc4P/A91hc3BDgQfe2TLZFg/\ngOiHefJ/Suvk7a2l2zvKhMqnPmCgI2Ytwrj8P6m98P8FoZEgusmXBUhd8Wo+\niyQmxMddymKw2GICT4Czy4n9i3Fvm7aFtMOLaAso2MT1fS53n3lhUhMqiJv9\nEZps5i8ocPkSQ5cdMlAUbgGdVVq0Gc6Llu9olUtk0ANp6snZGd1rCp/mv/sI\nHF1iUb3ZsJ8qBkjO+3jJolGRs+XV1LerUjgpQJnLMgmzo68PZHnat70Sn5QG\nU9g1WlZBTvpF23bvxF83XCRUsT4kGEDdFo0nYcKPac7qlfNil8EiEXoQvFM/\njdaV+Bqv0Pys/KKuUsyDvX0upaKv9Cr+ctY+Id6oqrudGA0p2PvbQcSsW2ht\n4LTh6SCM5sPyaDGH1x96OJR+inwiMcBzTykpypbCbmt040ERAAw8hjV6Zjep\nO6B82FGtzP0qsZ33bDxQUXYP+B+IF6bR7NT0bn0/Sc2ch5WIOMEs0ZwI/knl\ncr4tls5//UOTFQSdLxBkw26PCpEaZ4JUi4i2uIXHn3pfFQ/LrtDzK7tV5mhd\nx0kVlfJ4u07S0Dq1FuWpgPmy93WiGhY4BoqjYWRI/GUVj+msjcboBGYXrK4Q\ndPnz+itcbXVncDs5u2//G6n2FYSqcKx4CmL2AlBzuryAXabZzHfH4D0ASUNp\na9oK\r\n=RoHq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGKXuNqt8z70ahxdQFzwX0F8bWS8E+jEI9vhji7kR0egAiEAgITahOJ2ZitpGSvIEoxvozDTdd7tAGmCi2pEcB7fwLw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.9_1568450379703_0.013908030775894531"},"_hasShrinkwrap":false},"3.0.0-beta.10":{"name":"react-three-fiber","version":"3.0.0-beta.10","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","draco3dgltf":"^1.3.4","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  mouse,            // Current 2D mouse coordinates \n  clock,            // THREE.Clock (usefull for useFrame deltas)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"2cfd6ea354bb947cb0040b0ffd086cdb3bd91caf","_id":"react-three-fiber@3.0.0-beta.10","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-oX1r65G5GmlX7chBLcjAbObQf1Qq7N1nXU5oZfaPTX46VuRQtDKyyT93zV9PNVffsED3AjNJwcZU3T6rTk/ycg==","shasum":"a11d8fa702c82ed0f4295a50446a5cf4c513e027","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.10.tgz","fileCount":36,"unpackedSize":293664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfK8aCRA9TVsSAnZWagAAB3IP/ik6+VuDwe4KGYikj2/d\nGMScNGTqMBSftu4GqmepBuIpWHpLw+uXELEA+LZtf1oC3xIzFliwrOJZa0AS\nO8fDxASGzhCIFDrnjBZDIInIRIDjbxAOm7RR7y8g/Vdn6/cWo2Sd2i65oVYH\nd+NC2tPLah1gxZVseHHCXYpNdbQdDU+TlkIQe5FYQ8v8H2smlhWz3IkotlHz\nZLjAA5mt0QQn8hi70B3jjGwBKRQVSAgjjJqOHaZa4RU5J0M40kc23M1gXLjD\n07coiHqwBgDR18fByMvwSdeNV8le09XdVie+rsGS5LYqbKa/CSN9CCzWdy1n\nym1FLZWTCkVJXzlWMRlB+n4FMwAH9PnUnAsYnIDVibpNaNIUr8H1QWtsBbfc\nXiNQTaJNQ4Eg3M6FTd0sB9eHgSo42xjmv+zDqEARO9fHAu3rGS3PdRzNQssN\nYqp/bSGHnj/21UNKdJHwfKdcWTNkELuaghe+O2WHAEkZ6RHzM6nrLDdZg605\nQZ7ys54xgZVuaPltYelkId2JGI414UFxA2vss/g0sc8LmLIFpTM6iJiSPAlI\n9R1se8QiDEPLL56ZOzSGkNsXuK7xp+Wo9FMrPCtL3ZKbzCc6vWEcsNNPmtRU\niOvao+6kcfYHMElS/j6Zcjho8vaYnp7jlN7w0bWQK+i2rNcIzYaz2DNePSUh\nbUVm\r\n=DuPV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMndGlqioMN+/RODC/a0S/WQlznpcIZZWNobtQxmqQ2AIgFFKGndB99fJkzqjD6JpBuoJ28MBziqmVsssZk8fR8+8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.10_1568452378206_0.020465889970160633"},"_hasShrinkwrap":false},"3.0.0-beta.11":{"name":"react-three-fiber","version":"3.0.0-beta.11","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","create-object-url":"^1.0.2","draco3dgltf":"^1.3.4","jsdom":"^15.1.1","jsdom-global":"^3.0.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  mouse,            // Current 2D mouse coordinates \n  clock,            // THREE.Clock (usefull for useFrame deltas)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"0667a4059bd687c199668dd9ce40acb26a9035d1","_id":"react-three-fiber@3.0.0-beta.11","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-U70M8Lwt7H9skJJ1LlQCnwPqBYLkdAQKmTHM9ZDRO/01pLxFcwy0OEku7uMAPTEkcqza2fLcoaa02jwLLs2Arw==","shasum":"94416c810f037d72c7614698618c01a06a85d494","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.11.tgz","fileCount":37,"unpackedSize":334427,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdfNr1CRA9TVsSAnZWagAAiMwQAIKSA+bxH2j/QsWkaL/K\nJpNASYNLRCvrdoVCtmvkgUttkHIcxGQU0GnzAz+as+7sxcN26KdT28wO5qjN\nWrVEkoz86ceu/ZaznVGmYj6ot/uNoR6StR7YrWIYy99wekGOCfzwhvJnAiv1\n+vWqvb74fa9DqSImTSj/ckuu7njkTYFUQdYtmd7qZ+ttO3rbqWJGncSVl6lV\nZarY3aqP+NiUxZwVrFucXcs+l68yOgmVJiMRGs9PzrnC50fXZNHeucpk/20w\nlqL2544+fEmsldzykBim55YBqlqriNdnJAn/WKcTNaBs6GBAkHa9pT7IOKiW\nEYAHdenMbUnki+cVdeHHmZI97i1rWpxvkS9/AVCr1EjOCLEe+5cCU6vEdiUk\n+sA/MewnXW180mQUJg+hxOFXzl5JpwsJTcv9P2ZGWXRSgg92ZPsGfXUJqsK/\ng3Lhh7HcCnLJ27FierrqM00L/wHpANHq0aAvdnuhXw3znqh2cBEEmny/r9H0\nf5JT30eARE036SmG1gZ7AnB3Gg8ATq2wLY3AQY1I9cD2iJsobMwgBjkdEkQD\nJ1xyKGsHj9BX5AHSdjvgnqCvU6ML+vuMhG6AVs6oSDgp43E9/kwAXuZCcSt1\naR4Fbs0E+2s+cn1ltJbvVf9AKeYt+EEtWmekPV+ExYe+dHd9EZXCx4T7HIRD\nEz0+\r\n=6FJL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHJY1aEd2jAoGIu0pHLtS52u53v8jASf11L9hlckHVFVAiASbfVxQEiOrJxF6KVg+GnW35iTw0+VSHAgB0EhZ1vSGg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.11_1568463605138_0.2769594816036096"},"_hasShrinkwrap":false},"3.0.0-beta.12":{"name":"react-three-fiber","version":"3.0.0-beta.12","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","create-object-url":"^1.0.2","draco3dgltf":"^1.3.4","jsdom":"^15.1.1","jsdom-global":"^3.0.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0","yargs":"^14.0.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.105"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunciton App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunciton SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunciton App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  mouse,            // Current 2D mouse coordinates \n  clock,            // THREE.Clock (usefull for useFrame deltas)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"90d5c700be724799737422013e63445bf120917d","_id":"react-three-fiber@3.0.0-beta.12","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-Exlez0K1Qj5s5ZRZ41FQRE9DrGKOwTOL/d+kzupuA9qaThrG4C20K72NrGusRxUv3LiPpwYBERMQwgVJHC54wg==","shasum":"28a1f070f760858d4be3aa6102071abde3b03efa","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.12.tgz","fileCount":37,"unpackedSize":336129,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdffhVCRA9TVsSAnZWagAAkJcP/0HmNeD2W69+RXJ0buah\n6n6SLtpkkEoy4qbAk4uagcr+SWPqxTCBMK4m/Ro2P60Qy3RS64Bfzov7MeG4\n/TQSfndjj4aF0aCHeDWjB262qbqPCn7iEDaX8fASb+num0bC1WCWFT/eEKxI\nFihBQtnUDcQ8IgU7X+Uur8iXMoOX6lEJcRxtXWbPYCg4vVaDt/f+ggtazQ88\ntVTjuXxj0ILkuc6KPCNnfoneeAPI10OvDjzChheW8nwFX4aeo4+BxKqLTpiz\n1Q3ZiWtFHbp/2CittmqSbVu8OV6+v8ymENHxGFbip7fw8CBkOlu2QDoOMNAl\neFYkZMUix8F57OrFSTrVy0W89mkcVSRZPYs8D9K4rgwsTEh2ajZa/FvRXcb9\nqEH7RtdfXt2yYc1v2rFwTaVYknzdotjZFbAvItz+zy2M6kBOtDb4xJRF5iq4\noR3hwCkWLdmBQ2PAK+S5Gr8j8F45ZxkcqEvN30c4s5vQyt0AGpNWe0ddwGB5\nfN5WoLQsDaY6fm/KDQcKqHMVB9cI9sQ36ID0zUw6TJNv1tIZYXkMi1MnNW+P\nnmftJWpVrvZa8/ubj5/C7J3Hmqds7ILvy399hS5vstNCR/xXgrqhXZF/+w0X\n8dZeEpOOM6hi7gJnQeBvXHLnOEPVAlkWrYKMmcknszqGDerGkhxAGZ43kd39\niBq/\r\n=ayc6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGV93FCUBjSUpQTIeeiyxq1022M+Nt4imABrzzQVBtLOAiAP2r1z1Bdf20Pp1R0H3M7y7yeHCqQzs1PdkOpfVgNa7Q=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.12_1568536660232_0.5259860792912383"},"_hasShrinkwrap":false},"3.0.0-beta.13":{"name":"react-three-fiber","version":"3.0.0-beta.13","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","create-object-url":"^1.0.2","draco3dgltf":"^1.3.4","jsdom":"^15.1.1","jsdom-global":"^3.0.2","lodash-es":"^4.17.15","pointer-events-polyfill":"^0.4.4-pre","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","three":"^0.105.0","tiny-emitter":"^2.1.0","yargs":"^14.0.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","three":"^0.107.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"bin":{"react-three-fiber":"./tools/index.js"},"readme":"<p align=\"center\">\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, *not DOM elements*!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like \n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a *translucent WebGL-renderer* with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default *perspective camera*: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default *orthographic camera* if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default *shadowMap* if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default *scene* (into which all the JSX is rendered) and a *raycaster*.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: \"hello\" }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })} />\n```\n\nThe problem is that all of these properties will be re-created on every render pass. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: \"hello\" }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position. \n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')} />\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n        \nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst { \n  gl,               // WebGL renderer\n  canvas,           // canvas the dom element that was created\n  scene,            // Default scene\n  camera,           // Default camera\n  size,             // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,         // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,           // Aspect ratio (size.width / size.height)\n  mouse,            // Current 2D mouse coordinates \n  clock,            // THREE.Clock (usefull for useFrame deltas)\n  invalidate,       // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,        // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera  // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate( \n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  }, \n  [x, y, z], // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,              // Adds a global callback which is called each frame\n  invalidate,             // Forces view global invalidation\n  apply,                  // Extends the native-object catalogue\n  createPortal,           // Creates a portal (it's a React feature for re-parenting)\n  render,                 // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps,             // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nTools (GLTF-to-JSX etc): [/react-three-fiber/tools](https://github.com/react-spring/react-three-fiber/tools)\n\nReact-podcast episode: https://reactpodcast.simplecast.fm/56\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"a781c99321a98c93028ee7b77bf2f1b27b0a8cf6","_id":"react-three-fiber@3.0.0-beta.13","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-fncgGSRjtxw6Dumwwxb8U4rjmCOtaFn45vTvGdtm+BjYMKOpTrGR0Q9FKWNLIIfIVYfkTQXf7d/Sqk4/S1XlcA==","shasum":"3203d10dcd471d6fe1e96d1dfb46bfb87b80f550","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.13.tgz","fileCount":40,"unpackedSize":338494,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdgyPcCRA9TVsSAnZWagAAWPEP/2XAqmDhkT2TBkdI0xBh\nf07GDNFi8IwM770v6WIDY3KpFUbAYRID2oJpARXOymY79SB9Mc+m2iJO5axw\nx1YEGULYJotnfgK4cdsgp50qYQysNOJMGJ8Zp0DxYVd0nZd5/Jzs0djjSYtE\nFtjukkL0hYXo5JBoxC/VmX+cEhH+pOv5JS2KGDF6geYiKSShKYOkZF8aGfjx\nfBgPiSVr2VHdBR4iUFpApCVYSsyh96eG2RjQwW3Wy7AzCvznFtj9g0ISLdP5\nKQnETpzsVaBt2dNWzvdC9MfuV0HaDkDYTRIkAeOGB7Gwhd9Q0151oBJC2XnI\n1HG40P9ksvPAF6Ko1BeWMUp+iauj9alZ9DK0ZrFgKM3zDTFGJFHD1s6uRwAh\npuJsj+eSGiX0q1ODyVlERS7l55jn/jSxufhsdfEiK1qgKUsJmR2kbIsfwAWN\nFiXQ99LItYYmCwJFBdD3VCTJ7GS/5bonZbEembrY3pfyyfZ3AWWrcDSn3ZrD\ntPu5FZeSZ5sM/zxG9jtPBSEvKA878QJcSKMdhB6Wa+lgnLtruSPyFxERswOg\np+ZzXBw8fvTQ5toKGfJUNI0pDDJ9kXm+/5EOafT5WEJih2fWNC0HKNIZBBSy\n28rkqztjue4fymuX2XRObfuXtZ+1x0WQ3KFnnKhWpg2XYOJuZq/N7ZA0w/Zj\nvVEW\r\n=9Y3U\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGXUwjet8exaqiPEL9ZmZydzRC+g6Z55iVhtMp9pSvEmAiEAkECYZF35SaZdmDRrWF+7wV5BIvolsie++Mf9k1Gck8s="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.13_1568875483322_0.20470757001541884"},"_hasShrinkwrap":false},"3.0.0-beta.14":{"name":"react-three-fiber","version":"3.0.0-beta.14","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n;<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass }) < effectComposer > <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree()\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl, // WebGL renderer\n  canvas, // canvas the dom element that was created\n  scene, // Default scene\n  camera, // Default camera\n  size, // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport, // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect, // Aspect ratio (size.width / size.height)\n  mouse, // Current 2D mouse coordinates\n  clock, // THREE.Clock (usefull for useFrame deltas)\n  invalidate, // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect, // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera, // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback, priority=0)\n\nWhen you're running effects, postprocessings, controls, etc that need to get updated every frame. You receive the internal state as well, which is the same as what you would get from useThree.\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\n// Subscribes to the render-loop, gets cleaned up automatically when the component unmounts\nuseFrame(state => console.log(\"I'm in the render-loop\"))\n\n// Add a priority as the 2nd argument and you have to take care of rendering yourself\n// If you have multiple frames that render, they are ordered after the priority you give it\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nFor easier asset loading. This hook returns two values, the asset itself and a look-up-table of props.\n\nPlease do check out the [/tools section](https://github.com/react-spring/react-three-fiber/tools) which contains converters that allow you to represent assets declaratively in JSX instead of importing a pre-made blob via `<primitive />`\n\n```jsx\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nconst [gltf, objects] = useLoader(GLTFLoader, '/spaceship.gltf', loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n}))\nreturn gltf ? <primitive object={gltf.scene} /> : null\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect, // Adds a global callback which is called each frame\n  invalidate, // Forces view global invalidation\n  apply, // Extends the native-object catalogue\n  createPortal, // Creates a portal (it's a React feature for re-parenting)\n  render, // Internal: Renders three jsx into a scene\n  unmountComponentAtNode, // Internal: Unmounts root scene\n  applyProps, // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"4718daa4b8d5cdd3127fd9da7bec8d76534421a9","_id":"react-three-fiber@3.0.0-beta.14","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-zUcuJMlYxY/AgWeufvKSUw0hD09jIR0js+MAygritZLEqmwBqwBe8cTSowSjO5oElbo6GTDnr2+uKLNn++F6dQ==","shasum":"25526ea138ff8410c41262f63c34f35e8d2e63b8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.14.tgz","fileCount":35,"unpackedSize":268810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdiiMbCRA9TVsSAnZWagAAWdEP+weLAWV6C+5NJncZTA/y\nPX71YZROt/Vl3wX2bxvrRqQhJnKO8koutdsQ7bLEp7FhyPy2OuWQPXZaBDYN\nIxEY8clHjoK4DtmpvBESpSaZJSu5eGiLsawnVFEZgMx+4dT065G5vbUTOg1L\nYPANrZKBf91F7vcnau8eAJ7WtPrnGNsERo+qi3C52SHgqxyERn0w9Q+AYcBG\nMfD4ulCAZcc/73AohF3/NrQwSHtjKGFJGAr8o2B2CBnauXlw42kaU5LnfIXt\nq4pd7FUU601/6rpBLE8iGgqNdhpcC4S9cGe06DH8GRCBELUhW0x0I/PfatUK\nQMt16rDWCEqeFB+SYbxe+w7wm9hbkWhb9+iH6KFWEwTGY+gudNpUmFjodwLV\nOQK6FSXvCW3T3v5g0TZ4oBlIBvcClTzus44GAFBwjcIjaqkgVJ1b8Fv/G1+2\nhAgsYUavlFh77udoMePIWAEir13WFJNtEeyx1/kHbUTDDxL5P3pqeKkw6KwK\nn3kW0l/W5nM9CgTVDtOF5LnIdC1QQkngc1N34OFC2cZOKHd5zFEDcBBbWZJi\nGv9xhPDJNWLznzq0thaDvyPpa6Hcvn2d/Aj2gT+/uMU7DBjgPbCG7/2a2lxR\nHJ1wurQyWs2r5P9ewEm2I1VbE6oeKiEfQGstBcC0exwApWePySF4ycy7rfEQ\ncmEu\r\n=ySC4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHMzfIeKtkCgNEcasqeGcZie0wEc67XGK1xkjppFQ8tDAiA2OPqX7Qbex+aKPrnZrMZyQDK3Cwo+BMmlFxDjj/X9AQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.14_1569334042730_0.7121052422113703"},"_hasShrinkwrap":false},"3.0.0-beta.15":{"name":"react-three-fiber","version":"3.0.0-beta.15","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRation = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  canvas,                       // canvas the dom element that was created\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (usefull for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. It returns two values, the asset itself and a look-up-table of props. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nfunction Asset({ url }) {\n  const [gltf] = useLoader(GLTFLoader, url, loader => {\n    const dracoLoader = new DRACOLoader()\n    dracoLoader.setDecoderPath('/draco-gltf/')\n    loader.setDRACOLoader(dracoLoader)\n  })\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  apply,                        // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"d191e6788e58a5e8f07569d9ad70d0ee95b82cbf","_id":"react-three-fiber@3.0.0-beta.15","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-XzV2DDzwP3FVFQsOJrdRCQahPI+gKsOXAX74OF4RMNs5eywLjhHsjVzugQZ4+iBwfzZNDtbUicskvf1QiIZD3Q==","shasum":"bd7d5b3a212649d28389da60fa5a9701aad339f2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.15.tgz","fileCount":35,"unpackedSize":270710,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdi2GcCRA9TVsSAnZWagAAzVsP/0gB4Qb1b6pMXrLcemgQ\ntMzLJxBXSIkQ5CDvngzjfaPw8+cF1wfvQMGG4C4iSXdF2BR9V07M9AZfZt6S\nT5yArDavB94PpOxhF3qHw9VUZdcSUnAhFg40rahM1s64076QIekL2uJX+7uV\nbxdWaIj4e+eti2c+G8UlyjUIYBF01Ia8d/x3J8akIzNj8z4dQrv4OWa8INUa\ninjiAutOa+YtW2xTiMLBCNM018twXmKZOFWwk1hQoSUDirmlZpylOlomUcZU\nNATBX6YsMRDFIkliAUHuHHomjvXrglqzDl7kJbjIe68v/pAIeltKIXSsUFKM\nAtujk7Pg+KVGj7dfapMqpu6BYpSZpCbwIWVSnUXtRSWX/QTtqQgDVpN7Z9NQ\nJYx3sZ4bCELHIQdNP3HjpCtRl6OLHoxwpNJ25+/Ea0ftYnPm5hW7TX2+/goS\nedGal5ZamCQW2W2fgdiReSThTLgPgSmDpy61ocF4BCLjXnWYafi8vk9XXPjm\nIVVcgn4oc1NOX5kSlwaIVP+E+h1fqr3ybrAGORZ42UUq2vQAsLHwf+ys/rol\nxfyaM3wW39jE57a/5N9fWQYY9YdBfTni6eyeaJCf7HHpUWZ2V4B1BelffqmS\nV9wuPsZEUSjqKuOWT7t2oyyVpSPB86i+14jc3YsSbKDAngt0rW4PPlnSGqIX\nZPIy\r\n=eJBL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE6sXtoUg8BBHQ5jDNIKwvl8BuETwJj7dZvhn2bhA1bwAiEA7jMeMWy69OAhnic8R9yqoBuT0mGi8rxbq65Exf1wLbc="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.15_1569415579606_0.14852484248977005"},"_hasShrinkwrap":false},"3.0.0-beta.16":{"name":"react-three-fiber","version":"3.0.0-beta.16","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/9y8vkjykyy\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/tQi753C.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"172\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\nReact-three-fiber is a small React renderer for Threejs on the web and react-native. Why, you might ask? React was made to drive complex tree structures, it makes just as much sense for Threejs as for the DOM. Building a dynamic scene graph becomes so much easier because you can break it up into declarative, re-usable components with clean, reactive semantics. This also opens up the ecosystem, you can now apply generic packages for state, animation, gestures and so on.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.z += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <planeBufferGeometry attach=\"geometry\" args={[1, 1]} />\n      <meshBasicMaterial attach=\"material\" color=\"hotpink\" opacity={0.5} transparent />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  orthographic = false          // Creates an orthographic camera if true\n  pixelRation = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('hover')}\n  onPointerOut={e => console.log('unhover')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  canvas,                       // canvas the dom element that was created\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (usefull for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url, [extensions]) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. It returns two values, the asset itself and a look-up-table of props. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nfunction Asset({ url }) {\n  const [gltf] = useLoader(GLTFLoader, url, loader => {\n    const dracoLoader = new DRACOLoader()\n    dracoLoader.setDecoderPath('/draco-gltf/')\n    loader.setDRACOLoader(dracoLoader)\n  })\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  apply,                        // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](https://github.com/react-three-fiber/react-three-fiber/blob/master/recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"9693d2e2d99d6184dfd0f24b6ba1685153849ad2","_id":"react-three-fiber@3.0.0-beta.16","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-DzwkNb5jG+OzKt4IbkOivcxz5aEz7YuLMy3k7GrIXKoAXSnWdRFrLm8Xar2+7oIBL9Y9ePXbpFTT25GldkxhSQ==","shasum":"908932ef6fe17c52add25c4b27c7e64fc2efc0d1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0-beta.16.tgz","fileCount":35,"unpackedSize":271035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdjIzcCRA9TVsSAnZWagAAcSYP/ApjmH04NXykQddugf5K\nyP5LtcJgkL7KQJK3+Cju9mZyMTbWbyKhuPnAsT3BHI/m/Q4VMhrYqddto4zH\ne4ENSkGj47/RoVvb8iMLQ4OwL8zoUEMwVCUD1CrzqlJ341kNrI522pXkbtJ0\ndif218WS8v2xm5m7IiPQ22nebBc1kapJK1IIXCHidLfHuO/iDRin8pNNYGMe\nA925iLKfi6+a/n2rFZYJf/ghT3OLz9WoTMC0iC2ayvpZZyuhP7BMGg+rnf46\nT8yGN8jsl9aQ2Op13NY+uBtYMVMeD+pHq1aij06cTTtWm+85MejJmMvytxsv\nGrJXCe++67ISp9+FYSvYmjn0J7bno57JlYvGt3ZtTSCIL5MrW/HTRS360dqd\n/v9ZOk6pO4trvveD/8rlKmyvVG/9RgOzCKLPJTMLzbttpcrgzWXr7gXCnTsw\nN/UewTVN3q95TAGJVPl3FkC7OotwguCMkVZxv2Hr6IPZooH4O6lj9alBXcKC\npECAG41GuBSPhmGko2wcRJ++CjEj8tQRbIvIzJl3GEi+qZ6h6Al0DV1wZ3Jo\nNNQNmxdggaIV+YQHGN8Gnw4PaYhKHiAqWesQ0A3bhTxgpywkqxW58VCJCCB9\nIRqZLWamaP+oEhCuo4QJeH4dmub3x+Aioe0aTOGn31tx45QPXOOyzFVqPcC6\nxwhG\r\n=+Z6Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBNyUCctA56+4BryWhDAnIW3DhkaOTQUGFNTY8ikWyzfAiEA3OVkYt4SHWf5qtyB+o4IG/cOCGYiVhjLIsTs0EEv5uM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0-beta.16_1569492187706_0.54204512905852"},"_hasShrinkwrap":false},"3.0.0":{"name":"react-three-fiber","version":"3.0.0","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"03e28545e93ceb49877aa14ddcd8d01a4b4057b7","_id":"react-three-fiber@3.0.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-ZRD1UPXwnKHHQpyvf2BYC/RM6sfGIVz0gmBwZLVi2Dk4LqnPCvgYYblfMTba4uIfMncsMaEOtP4rgt9x5OGVZQ==","shasum":"d287f7aca35d01276b0e74c3eabde4a85d7b861f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.0.tgz","fileCount":36,"unpackedSize":273106,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlGsHCRA9TVsSAnZWagAAIZ0P/jaAbS8qrI2P/uFhYh4P\nM620A8y5qZc904Uy6L3vlHIs3GIP44WQHuSuWd2xFV6qhrybc+0b5Omi40G4\nHV22rO18XC0i31SLSmLTLdZjrhVTqdGDdpKmm1oAjSLzvS3z4ox4ZBGGIES/\nxMNjic3/27vgMIQd4SHQDmFd1RYGTvZ8lADJAgX2Qp+3WhYcegkZ2meDKIML\nCAb86SoC9Eh4yPEJEKafNhev7KBQFHxb7M+S6LUND0ietGwIc8I+LT3wsjc+\nrC2q9IOIw0Z3U/aoc/9wYaAC7IuHZ371MgK6UtKjRf6smpnUPDN7bjnVK6AV\n4WFTfS66YB+H3TQz9qD0rMFZMN3t0p3vLqjUvlBevrqi2+0opwvdfIfMPh0O\naw72OYYXGuodLd5OBTr+bXIjv77RXLmolBWANro2SRQknxY3MaGzZ9xb2Mvx\n/MsptCG0GCsPYRslkGA2pv9XNr4YpUiHKGDpiyeKGpxexXbXhxtxP0Tl/fnE\nhdYlVVVuHUe7Vp2SO9jtc2LvGswltYvxxlvQbypm2gkdVuTOnOBUib9b1sZq\n56rHLhBX/o5l1kRsaqtFAKh8FPV6cXAe3Uym5QlGKsApPBZELO7I3Y3N+QAH\nKQWKOF3/XYFqaOLG1ldiawAYdaCOvUC5K7ZL+yuqZQL8WBTtYiopO60BeeKu\nAZN4\r\n=A/Vh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtSDgelN1I10P2ILxxSk6ZUX1BYT3slIPFPdjwo0mi/wIgKor7MnMoHnaqlg0pSsauWy5pPt8j0Y1NYKZwOKeLTZI="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.0_1570007814520_0.3876772810935769"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.1":{"name":"react-three-fiber","version":"3.0.1","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"799d21878a472f7f2bfb2c7051c5f84a56bc491f","_id":"react-three-fiber@3.0.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-qQuN8VNHzaNRWweAR8JHzC6YkFPRFPOJYmkXyS//R9+S3777gHvsf0uY4ZtxsMnCynjgDxH3PbkbsPYx6sozbQ==","shasum":"dfdf7ffdf6f2492981f400ee0e888504fd499ffe","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.1.tgz","fileCount":36,"unpackedSize":275962,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdllmJCRA9TVsSAnZWagAAGAUP/0mt0t6ipiDICnL7vrHM\nwYq3xwytuTcdnY+Ia9qgpZ8A/kYqx+S+0gHqZtzt+DKHRPWE9UjW9OcTma/H\ncHSW9CUBFVZlc1998gX7D1LI0L4iA0e96WIBiC9/q+L/UIzx4O2iqmlH38pc\nTD4dlZs6a5xh9iysJsFLtRv8PYPE1r196sdkCKRgx+qDLJmMwdlkBDqhtEyK\nkz07RY9xxOBs8ZdDDPsd34y6pN9ro1aw8T7Pl/RmNHMFrQ5k14HAA1YEKvXb\nzocY/Wbrw7w70+graODuW4U3HowZq6u+8I7T/036zNmJfUL+Jzvb4/1TbihE\nQOFbG+rmCcdwQJxFx7p3VGuoSbuzlOi5pBGitknz5VD1r4wafz2BTzbP9tPz\nDhOHmu/nJQW3O9bqlDRerbJE2Oi+2NZoPQ7ZbHJTKdljlzKnzZMtKXxejQ5l\nI2gNWwg9K+vJymAxNVbb26YOpGQcHP4pF2aw0URz+3KGX7hAi5sR39Ph8/Z2\naHLVWE0JcbYfq9rjgdldFCEep5uPi4ckgnF8i9PI800TvM1EDhb0iCDaVLvn\nQqE0t+Csnavi2UCL+AwhZ32ZhLN6S+C1lTq5S7A1Hkr2Ee2PPMwR29BZYfhm\n0o1emfr7rqKor10jM1+hhibm7jxOhaVJAPnNa3vSkaC0LkriPI4XlzqXm1WA\nSI69\r\n=TTCS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCwNrToeKm2gwsil3ZdCOQlydEM7kg9bGKNDD7Ogo7b3AIgRREdYsDoptAy/dTWis0dzLd24wPplqe3JCWskM56TfM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.1_1570134408643_0.22154200049631623"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.2":{"name":"react-three-fiber","version":"3.0.2","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rimraf":"^3.0.0","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"8d03d7c8b804e412ed5a800738d726898b39bcec","_id":"react-three-fiber@3.0.2","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-WNp5o4Nv6cHFhXEa8iDQszLMnYPmh5lZPeYNfU2ZKcEuxhjwR4f8GNdtERUPn/3Sb8f+N6MG5ZJ/tIFDzJjIrg==","shasum":"4fc06b2fd9676e1383a396cd95db0ab4993e119a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.2.tgz","fileCount":36,"unpackedSize":281431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdnZYuCRA9TVsSAnZWagAAVHkP+wcaOvlQ0u+O8OpqFGGq\nKRV3NmRewI5Xgrlj7d/c8odC7vmRnNZZd0UsuhV7q1HAvjKsbGRx/0750FwT\nNNV1PwhXpYQY5QNKvs3OwFvmjZjTs+bjXkff+JDS8A59ublG0pWQ0abNltX4\ngdzRs66Ed8jI/Phx9lDoNtbXiFd1mAeKsn1qSFLS9ewy3OzyIXuSMFo1YVjL\n0HO73+jwteJS6a0taGIzPGFE8HjOqaByFvp4b+tTqvlXE7JyiK7kJ8X8/ZIj\n5D2/6rum39bKHqHIvn5Ok2fy7Zp0tZtGpCfeUJwY2WWcWq4/S7eJ+qn1qIPz\n/uUOAKwajtFaEft0af3gpvvrOG8G4PqHRZYvr/XBLyvk6oIBbDLV+aJ90K2U\nOzgbl3mTFkrRsdpu5Svf3oGkI7gcX5DyAO/lHwnJos2qp0aBpEOJ+oRS9PUX\n3wFW97XNTbN0HRzrtygFusnXLsqpAUvh7goG6GFjKs6r/IgrzrEEBV4X5J3f\n3Wcc31nfUvxrbiLMtbhJjjuiUSnzfwomE/YnB9twoQee70xz2lqXWf6Y/KjE\nuGPhB2mCfcNVPBysmcSBsI27S0Svy8jc7touVPG+TBz8YL/4l7Veq5wAM6CB\n9Jvtl2GhnnTE71Cj9tqhyGBGYQa7PzcTHYyM4bdxkJyMWqcfVTQMrcafwwbL\nOsG9\r\n=XDPt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgR9e1IfDHQ8EaUA8U5ZmaUsVYkk8ZodhC9hnUTKpmAQIhAPlsdcfVzgDbWUiOEzbRfzN7/3zGGNcsfZBrsgJtzTEx"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.2_1570608685276_0.3319119018236292"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.3":{"name":"react-three-fiber","version":"3.0.3","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint ./src","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.4.4","@types/three":"^0.103.2","react-promise-suspense":"^0.3.1","react-reconciler":"0.20.4","resize-observer-polyfill":"^1.5.1","scheduler":"0.13.3","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.9","react-dom":">=16.9","three":">=0.108"},"devDependencies":{"@babel/core":"7.4.4","@babel/plugin-proposal-class-properties":"7.4.4","@babel/plugin-proposal-do-expressions":"7.2.0","@babel/plugin-proposal-object-rest-spread":"7.4.4","@babel/plugin-transform-modules-commonjs":"7.4.4","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.4.4","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.4.4","@babel/preset-react":"7.0.0","@babel/preset-typescript":"^7.3.3","@types/lodash-es":"^4.17.3","@types/react":"^16.9.1","@types/react-native":"^0.60.11","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.12.1","babel-eslint":"^10.0.1","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.2.0","eslint":"^5.16.0","eslint-config-prettier":"^4.2.0","eslint-plugin-import":"^2.17.2","eslint-plugin-react-hooks":"^1.6.0","expo-gl":"^6.0.0","expo-three":"^5.0.0","husky":"^2.1.0","lint-staged":"^8.1.5","prettier":"^1.18.2","react":"^16.8.6","react-dom":"^16.8.6","rimraf":"^3.0.0","rollup":"^1.19.4","rollup-plugin-babel":"^4.3.2","rollup-plugin-commonjs":"^9.3.4","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^4.2.3","rollup-plugin-size-snapshot":"^0.8.0","typescript":"^3.5.3","wait-on":"^3.2.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"43eebb160be39b42d6b1b808250d30b147b48f76","_id":"react-three-fiber@3.0.3","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-BeqkHsmy4hGVsOO9PbxvGtbO30i+qM4a5NBYMvOuNT7dFUvzzEXVLQ5fKCbFp7Scvz7c/gEQp46jQOyjh8PUcA==","shasum":"7ec3413102d04e3185c625497141ae8bb5a358ee","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.3.tgz","fileCount":36,"unpackedSize":282062,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdqXvpCRA9TVsSAnZWagAAq+YQAJD48bk7RhkeK5ADOMno\njxFfyaBQQTvZRxuTmt3Rrt/PMYW0VKSAR/exbgVPa7vMyWKoab2TBDvVgLOa\nB/sKwRqIcy6tK0shw03e+S901v8cvrQGtjoNOXwCaBqyQfTAb1wksClVRn0L\n9e1CdOm/Xbe21R6oitHvjmFFvt2ppJeQZOLeXsM4ze9RpmJ9yXP4PYoWX11k\nBSJftOIsQSXVxeU26OBSbRsMyHOzo8t4/UiXrg6vgYsy5ZUiu+adRU3C5Bgo\nk6I2qjUGY8hMjV0E7CTNCvicMNUTP7TuFgUStIlx53zo8JZ0kuOaPIGa3Nji\n0B79SIdVldPmlqeRadF4eaTbxKp15iXHcn9o0M3MCBLn1LeUuOgeEbOazq2v\nnkoM3uWCYKRr7QgROn8nXx0fPTBExvdkTDlDQoC0TUQ7vyfjO3+ep3s+mtZJ\ni6sUP/2lSJC4cSWzkT8D9BaOTsOEnphLOhmTVKuFEBK2JsocOEMrNxr6U8Ie\nyEHeLC6WepmqwaRceHzu8j3AkkJfoTYQ6LoAE6MrzZNpTpQcd8/UEVx3Ov0J\nlnEYIHG/qCnUDMxiZ3moXXxHaPRlkqbOoGjMmW7fCh8QsOrcv4QlyWThSYsL\nGYfHy7KMWU3E5UKy7Y+iIzEl1uEjBLcaJJhZ83bC3D6sDwjeOWWK4PuuBqhy\norNX\r\n=FFPG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDeB41TAXWFvXRs4jOWnNZqY25mKxxMOKq/YWhLbSi4BAIgKi/mLyIQpdPmLKWmrTbBfayknJZRaP9+BUF0YOIn31A="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.3_1571388392379_0.8215463238875471"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.6":{"name":"react-three-fiber","version":"3.0.6","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.6.3","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.109"},"devDependencies":{"@babel/core":"7.6.4","@babel/plugin-transform-modules-commonjs":"7.6.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.6.3","@babel/preset-react":"7.6.3","@babel/preset-typescript":"^7.6.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.9","@types/react-native":"^0.60.21","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.5.0","@typescript-eslint/parser":"^2.5.0","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.4.1","eslint":"^6.5.1","eslint-config-prettier":"^6.4.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.1.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.25.2","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"894992dba1e9414171dcdd36a51ff7d28c53d5bc","_id":"react-three-fiber@3.0.6","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-mBmWYpmM+QTaqWZSIIc/Gqc8CvnHbhIjabZm/dXUTAGjQ2wgZNNckc63YmzhEANDYfrZVEiLcjfQbC3PyvOCOQ==","shasum":"047755fa4bc3f162811c6155b8017789598012a0","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.6.tgz","fileCount":36,"unpackedSize":285934,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdsNx5CRA9TVsSAnZWagAANdUP/jBirBNHZGAzJBUyFtjO\noHUjnyJ/sA3UBUIeCUh/zUqjPnwT4mkm9HFVFrJICnFJwe5NB0TIkVhaEe+J\noRBdY9kuwP185Y7HNxVXTL7WmVeAs0WPBFg+vTiKy3BHHoED6JptG5+Byb3o\nh+/UdWJkAmLDYraTozJhFEK4hpSZaFazOnlC3533F8BdUk+KRlTmtKwvMXWz\nvuPiauuA+j8/l2tNXh1j8KJuRvs1+GH9xM+7UPsElDKyKpyBAfflZfDn8AiU\ngb72kMKP/eUrpR1lVFV6FDH1YTfw8zmvdvbaHwRlVKkaWU53qEk/iG/HC/QR\nv/+n+bOUyDDIC9ZT3UrH1bgyIYsnU9kFiDQR9xunitVSmRfnIBjn3wy14Dee\ntFgu/4St2I6T5SHPYlaxAKE2Owgcsv/Gcq4zzkbHFjh6TOCN6gNxAZiYoIiK\n6ogN5rNrg36+NhpIEfLOLFGuBXUMKF37rFGvNymymVw71+FB1PVdLy0qjWi+\nigZUXWrIM61Tvy46W2bvFKwL9LeDs70aqRpFKC6LewWXnCFqFeSp3SBMJQ6T\nO8yqfirQWJ+BkRo7XkRbDc5r/Oon6WZZd16DTs5E0BjkX+Nn1o5z2TRYWBnG\nWpwDcRHRw2vskY+Jb2lxZv4jvu3u0KI1xg0fGqe9rygTRTsU1vzsvrm/Olpf\n1oKU\r\n=b4r4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBQ4r6ntG2Li9ENwVIjRDrghCNwnnWcQblFUmjX1vfOPAiBQ0zyK3IIpifzsjF0aC7PT2LeqcgBciDoekuAMBKxagg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.6_1571871864903_0.7930478495868287"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.7":{"name":"react-three-fiber","version":"3.0.7","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.6.3","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.109"},"devDependencies":{"@babel/core":"7.6.4","@babel/plugin-transform-modules-commonjs":"7.6.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.6.3","@babel/preset-react":"7.6.3","@babel/preset-typescript":"^7.6.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.9","@types/react-native":"^0.60.21","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.5.0","@typescript-eslint/parser":"^2.5.0","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.4.1","eslint":"^6.5.1","eslint-config-prettier":"^6.4.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.1.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.25.2","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"368d96900aa432041a1bdd300b22298bfca3e18f","_id":"react-three-fiber@3.0.7","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-LU6ZU7/RlnqjPV3nfAafn497iJ3hl9XqSuhRfppp6scz/z4TIetJtdKdw2y41JpU/O1inKMtSd0CWXVzbSrCtw==","shasum":"d913273c84a3997265f9d4e7559cc7efbff69fb1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.7.tgz","fileCount":36,"unpackedSize":286044,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdsvwpCRA9TVsSAnZWagAAA9wP/j4M0SwDcV7AD2AGNBW2\nBmq79Bjx2MATC597kUG6WF9QpUizb5sSw469DpZodt8wtKQT04Kf/WvZk57h\nRDzY7LF1ABgc6/NJZ12lPJ5U93Id0aMdLHaf3cU68SPfBk671YEb3G5xfPaP\nQVI7LPMoVl32DZxK6nS1hZpMmTJcN15qYKINkHdNwWx8AGbFq5BO4dkx6ZLL\nvzbD8VB1ZmIMUwz7g6D2/Zpq+vb98dBz3yeQ/R6ItQKLEYeiLiZh5pB5lx5/\nOYScxEM6BWdJ2Qc7Dam8Ai4GJYvtsbVCsGmGiodaZEtdrQeKxDbVqPShyOxR\n2qq8yPO0HVBOk+Zf/UDIL6icGiTE+PMNCULJWYIRCz5IBb9cWEkf6gUtAIyM\nWWnFxTtSDqAl/IEOlSXbsuQJC8bjjQSAgdc1oVl86nofTrVFsH2Zqul5+VkH\nykAtbbtyp/tlCbp2olMwAESNw/1Xca4+AIvTxIHF1y2Glf8BgfJUKb9CfZHb\niXw0Z161+hMSvswuLKw64MvXoB9wf16HB1k7990UIgZb7IlriXzMwBu2OkBb\n83lIkrdzW0sDGlnDk/+E3AsESnj3pKWxnoPQfTdrHHc/LHUxlE1/bZ/EC3zj\ngPN1ylXqnJHrAIueHjL3uY4FixHGeZagtKLYDrZ5Jj8/7zYU9qe+oyySf6mw\nTAMd\r\n=pM6I\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAEl54p1ilsIUQPzD/PPfM8Sr95Pgnkvwte8C+12PZ9JAiAhbgsU6XM6GUzfoL6LZdOC4ZDzXzMPPeinNV3OCglw0A=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.7_1572011049357_0.1122875742666436"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.8":{"name":"react-three-fiber","version":"3.0.8","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.6.3","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"devDependencies":{"@babel/core":"7.6.4","@babel/plugin-transform-modules-commonjs":"7.6.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.6.3","@babel/preset-react":"7.6.3","@babel/preset-typescript":"^7.6.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.11","@types/react-native":"^0.60.22","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.6.0","@typescript-eslint/parser":"^2.6.0","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.6.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.2.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.26.2","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"6864ee14e2d9e6fc95e07688f7c4f1422fd68857","_id":"react-three-fiber@3.0.8","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-ipsAi+mM2/D93aLT21EspXuRxk4txT14rb1JwuBIYF+oIfxHwd+3QMHxfUHj1N9YiNXDPJv49U2JS6af8wAV9A==","shasum":"58e720539a91fb6d7f8080a7ccdde8c5f5437767","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.8.tgz","fileCount":36,"unpackedSize":280445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdvB2hCRA9TVsSAnZWagAAEQ4P/1Bawmvadl0R9jF1+kK4\nKfwZTfdlYZ2ud3JkEvFo+aO/cD0DkO7w1U1OWzD5QENxcMorQg1UVvPQ3HCE\nr0FUgymni73hN5OA3sJ2tjhqUX2C3/4gJcUe1R7XY5AA+EygM86+SBiS5KIj\n0IqEAZWb7DSbQaYQ8ZWRuoKZCoHfrKo0myxwjD1WfpL4pkOVMah0AmZ0uTgU\nvz/Kvc54RKFm5Oe3nPeD2cD+BgKAXqAh37HiXagEOwLzrt1lofloz3VAgk9u\nTQ8y5ayOUFG34cCOXvKhRuz7GdkK674x00UqSlx9EbkVYQE9mI5I2cC9woeX\n9908TOf9i2ZRXaK9uxr+FZ0I3Ox11mUyT1yDRgSs/F6jFLdszcSuOJxMVqEB\nS4Pwou/ktgEsytHLpMskS3yIQndQ6vIH2mu7YBU0T1sZPlL+IecG4fZF877J\nzyVmIJZRLX3L4zJQJaQ6G+ItgBis3MZg1Ny1ssSDvP0uDM+mmuagrYOeH1e5\nvH4nHPwH5jwEAT1tpOOg2MW8EhtzY135dx8quFMYS3MIyi4nmjUllD61wV25\nViigaowNWVQxKdUrm/WIh2c0NePv8CpG9uB/S6+HYjL9Yd8YvaoC1bzGCg15\nrGuf2QjqfQTgNiWWaOD3wvoNUCFOG2R9mtx0FJdYePQG/RxdCddTcMrx3Bq2\n7e7/\r\n=+NDZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEwOL/py3V/pRBOHgGm2JU8KIlKKosYTmAM7N6w1JAi9AiEAzLSRI1UUAJc7ZHgPxfeH+TBSzlepV+78szuVM0oYG14="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.8_1572609440810_0.2791325896013457"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.8-beta.0":{"name":"react-three-fiber","version":"3.0.8-beta.0","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.6.3","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"devDependencies":{"@babel/core":"7.6.4","@babel/plugin-transform-modules-commonjs":"7.6.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.6.3","@babel/preset-react":"7.6.3","@babel/preset-typescript":"^7.6.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.11","@types/react-native":"^0.60.22","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.6.0","@typescript-eslint/parser":"^2.6.0","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.6.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.2.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.26.3","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enabled webgl2\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n} from 'react-three-fiber'\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","gitHead":"cf3879e8bc06ee32f7b217977676247f55b97049","_id":"react-three-fiber@3.0.8-beta.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-87axEo0OwHligBosQ+UaAdtt9qSxTRUs0Mgs5iVNWiflJByUyOhWbBixe7lvpaSQlBHvw3g5CTgGCxBIq8xEig==","shasum":"5bb3e297882dd55382b554efcae1ce64e6f99b92","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.8-beta.0.tgz","fileCount":36,"unpackedSize":280993,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdv3anCRA9TVsSAnZWagAA+FoP/iIGU2tUHvnZTfSYC4XO\nonvDyXFgsaRtRDjWTfhud6/cpKHMGNwEQTclbCmictjmC3OdXs6Y+egCysxa\nR19HCxCj61F9EXAujlXMR0Rfx3cc1JFYqYLZdxNWiumMhyF9t/Vfb1Ud5CI7\nGs4h3CVIJ2etJm9J2mxo3VtMEKnt5hvsCjLxVuPwtretqCScqBbnnQ79tIIM\nOfLqMkiWvLnJwlnoBtt8AGZ9E3HD5GG/ThZMRJdm3xSgNgR3bxSFzzyjgk4u\nr593C2/xKZIqWH6PEkvPi3mEcE8IBB5DENqVm1d9eH3cDOayDcTe48Y3jLh6\n05/JY7ikqD2O1McDivbEMxArFlAPUrKAjn9TMu2L0MjT5BRojlJ0n1MJphwx\nluuZpH5M3oNhv5zby/OYBq7fTYGpiQo8oArsX0KN1yLiQSqw3d3MpQ84++xh\nilcl1plHa0i5x8tPULyJh1OS/tjR9WemFxrtxr0xcq0rCH3RW4GPN6FM/N+G\ne+FC1JqO2AMDMKJTwD4nQ2S1WBKRNZldG6zygp4XbsbTpHRkeeb9mEuKkjA3\nIJxmCPUQH9ATSwqO64So845QKLolJwxbF2lqOWFlHbrCPm7I+1eUq+mMC0pV\n/ysT/tVNGDRcYc3DrQYdMDEzIdp+iUoJB4P+OaYX+JVBYmqQ5/pf8j0yhVZi\n/h5g\r\n=NLvR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGsgb8KmAXh0cSphdwqbSlPX78qokyN9G26JAVdnggq0AiEAnrUY7D+pZDAj0LeMFmu9mM6jcX99CJgUwt1bqE1HDSA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.8-beta.0_1572828838664_0.7911970407529305"},"_hasShrinkwrap":false},"3.0.9":{"name":"react-three-fiber","version":"3.0.9","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.6.3","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"devDependencies":{"@babel/core":"7.6.4","@babel/plugin-transform-modules-commonjs":"7.6.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.6.3","@babel/preset-react":"7.6.3","@babel/preset-typescript":"^7.6.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.11","@types/react-native":"^0.60.22","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.6.0","@typescript-eslint/parser":"^2.6.0","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.6.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.2.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.26.3","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"faaba2649e5b072b4f86eb635719c9716f7a3586","_id":"react-three-fiber@3.0.9","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-UshwjGd2Aj/Ke525OsEoFdwOrWu/TYaAmZn/9La8UN62nIYdAPlEkYfMfgUEX72tEXYVKYOtZauwDyRXGzx9xQ==","shasum":"9d92460a377d65f2d2aaf2d0f0280251da6f0ad9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.9.tgz","fileCount":36,"unpackedSize":281206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwCl+CRA9TVsSAnZWagAA8jwQAIPINAAHgS3GRIua1Qno\nkbgzAzEhdAaxcgWuY4U1+wyFfXLOoVHtsIHshPlaBb8LEnVR5pkf3OPOJxQC\nya+vBi27uANtVSYaet8kL69Yl+Arj40dxpYAaLZCmlOd7AgFOWLvyLrUmZJ/\nXuTipWB9ClA2/Ccy97cdlsWq6FntgUtF0WmEmcvi+v9V2iHU1qBY2zTlsVwt\nmnU+x6ref8FkucADs30KouCmnldIs6GV0Ga0z3H/x4PjRHCP8GonZhxdBFPL\nUaus6jlIkFflXvxzEwiqS9H98faaQoASvDoXMZXduqApMlK3qZwsHe9bEEaQ\niEJXBn1dJdcYZeEjWnbMUJzPF7BF/C0mybZBchGJw8e6Y3HWJKO8F5L/DSBM\nBXDpFGaeD7xl8aGK8msL+BUiUq4C/HaFNn/HP+gC+B5hJFyp1qx7VsonOwqz\n/UBTdKFj//CvZCbeZeDI9ayBxjsHIHf4k26YqDA/JaDZGwsIgodlzzWQ13np\nPojdfPJNQcct4gT15sjLYTlEHoXJ0G2QxGulC/6YcmyN2NX7i85JLWH3EH9X\ncsYdPEzgJ6hxglm7HGwQSuu5zjpIKLD2+F0fptdfCOHvcRGW2AoLW/APBeyx\noPeekSkqyrBOJdRFT0BHZiqyvwPk2f5ngREcfEJOjmku/QFwQ0fhcOcyRzRO\nLuPr\r\n=Z6YL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCH3xkOiLPDZwvcFGNVoUlmM/WVKD3mUb6CwYBRweREqoCIQCWFy6Lp72Qc6tvWvumcG5hWlPRI+AwQ6upLs3jIKR58g=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.9_1572874621487_0.4683508505089222"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.10":{"name":"react-three-fiber","version":"3.0.10","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"devDependencies":{"@babel/core":"7.7.0","@babel/plugin-transform-modules-commonjs":"7.7.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.7.1","@babel/preset-react":"7.7.0","@babel/preset-typescript":"^7.7.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.11","@types/react-native":"^0.60.22","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.6.1","@typescript-eslint/parser":"^2.6.1","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.6.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.2.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.26.3","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"f8111cccc025914edd66e82eea61a66c0596d184","_id":"react-three-fiber@3.0.10","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-/g4w4WQw1AlYAXDu3Mo+zSNMP6/QNo+/UuJTeinIC3GU9a/vqwQ7vMjODycp+F7CiAqhMn+nTIpL6zp6Ube/wg==","shasum":"1fd49c035bb108e0158fbc8f3d2444c3a62f8c21","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.10.tgz","fileCount":36,"unpackedSize":281314,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwYs4CRA9TVsSAnZWagAAKdwP+wUTpJ8Nk1L16Kekiocj\nV/TcTZy8WU5C4pi0NDSt6+rjXrojQZY5F4L575FvDiKYWQKalPB4pLYuhTYD\neXjgnJ9PfL8fN5khsq+mpL7hpLmrQ7ApdqmexYtgb5Cd/Pe7Lar5nnijFSun\nx83FZ0bCYS7IKtdiWcvq/nzxGMFOeg01TDznig+Fe50qNuvYdPB5XzvUS1VJ\nnvH1hy8xiQAgkFPbaMwZDGs4tfK6UslYNKojB6SLuELKDzgxzu5/s8w2pTuj\n+C1+C8A3FxJrdKjzoRj3/3LFONQj41O0UCnMvtTur9/H2Dzsq/6Dblm/IuRS\ndjwKHjyOuIL88dpGG1Zw+BVItQAqUATOvOsv7O/KZKdxfKIGyhKB9MnVP3VT\nQBe151l2p/ZYT6sIjNNHWpz6IXU8P1CJ6nWR6yH9ckAeIAOGyNau+QSbpv6O\nX5QJLGpXRrAAZQ5McKchPdagQ0xWoEfmzRgVDJ53SZTsrd+sHxl4nUJXH8H1\n5R8O19P23Q2g/BKzjViyiyqvB8t78qjrKHPsJbQhbApdLTWtATIrRzWWnsc5\nChhgIcCcFw2kpOlL5dQ7IGeZf+ykBrukK6Y+F+xBpRF7vZj/M4fsqq1IZz+V\nT+6uqRNvQ5Zrd7agN/eNiz3QDVbgdXC3yL2iStz8y9FZ+qnqmez+rQ2U7UBP\nwtfO\r\n=IMFR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlzT2zpSDULvjMlb0CMqGfmVh4qckNu9p0v0UHY7+/NAIhAIRV2yNoI5nNo297UJDoUWA4ciaPNqe+YxIwTvoqJMwT"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.10_1572965175515_0.9197625978286521"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.11":{"name":"react-three-fiber","version":"3.0.11","description":"React-fiber renderer for THREE.js","main":"./dist/web.cjs.js","module":"./dist/web.js","react-native":"./dist/native.js","types":"./types/src/targets/web/index.d.ts","sideEffects":false,"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c","prepare":"npm run build","eslint":"eslint src/**/*.{js,ts,jsx,tsx}","test":"echo \"Error: no test specified\" && exit 1","typecheck":"tsc --noEmit --strict --jsx react src/*","typegen":"tsc || true && prettier types/**/** --write"},"husky":{"hooks":{"pre-commit":"lint-staged"}},"prettier":{"semi":false,"trailingComma":"es5","singleQuote":true,"jsxBracketSameLine":true,"tabWidth":2,"printWidth":120},"lint-staged":{"*.{js,jsx,ts,tsx}":["prettier --write","git add"]},"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"devDependencies":{"@babel/core":"7.7.0","@babel/plugin-transform-modules-commonjs":"7.7.0","@babel/plugin-transform-parameters":"7.4.4","@babel/plugin-transform-runtime":"7.6.2","@babel/plugin-transform-template-literals":"7.4.4","@babel/preset-env":"7.7.1","@babel/preset-react":"7.7.0","@babel/preset-typescript":"^7.7.0","@types/lodash-es":"^4.17.3","@types/react":"^16.9.11","@types/react-native":"^0.60.22","@types/react-reconciler":"^0.18.0","@types/scheduler":"^0.16.1","@typescript-eslint/eslint-plugin":"^2.6.1","@typescript-eslint/parser":"^2.6.1","babel-eslint":"^10.0.3","babel-plugin-transform-react-remove-prop-types":"^0.4.24","cypress":"^3.6.0","eslint":"^6.6.0","eslint-config-prettier":"^6.5.0","eslint-plugin-import":"^2.18.2","eslint-plugin-react":"^7.16.0","eslint-plugin-react-hooks":"^2.2.0","expo-gl":"^7.0.0","expo-three":"^5.2.0","husky":"^3.0.9","lint-staged":"^9.4.2","prettier":"^1.18.2","react":"^16.11.0","react-dom":"^16.11.0","rimraf":"^3.0.0","rollup":"^1.26.3","rollup-plugin-babel":"^4.3.3","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.10.0","three":"^0.109.0","typescript":"^3.6.4","wait-on":"^3.3.0"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"gitHead":"6c2af9de5f7308ee0493ebde41d180560925b67a","_id":"react-three-fiber@3.0.11","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-vPMcYPbrbt4kYf+YZT6TLbQtQkBTM8Oa0vGagJaedJNeZmJvXWKlL522m647mbY85Gk5jb8zBrk3BJQxr/j1eA==","shasum":"7cc58099e12642d24dd2adaccaf492190c5c557e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.11.tgz","fileCount":36,"unpackedSize":282530,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdwaq+CRA9TVsSAnZWagAAA8sP/R8U52R6Yqf6wY2SFEnK\nuKLXGC9huQqJNqiU+BJrdFJuaILhCcuDf+x6Vk6Oq0PZkrlETDcbzHYo3KRi\nGzFbS2h/BN0rntkrmxXqGjsZYQgTZ/gpaQgbZY7zI6ICT1yGvyRSW9cfjKJh\nBASbEwZ90DNQBXhOjz6gSu9pyK/UPyeiftjqRl3xhRROrw+HnDMvGhxaZQDZ\ny4/1KMsdVdOvA0xSLKy/B3m+EU4GqSf/PhkYoaU87vYUmdDZEV+IGCrYAbPo\nMzgRxtm8casKoEvi6zqCaQG5W3sFsJQ3DoX4RYM/4hHJ+J1VFFlWdMqtQbS4\nBR+Hlp5gBXuSAjYqY0u8jsyPI/ZApnnQoVGq5DF73lkoD36XvMHa1zfMyrWA\nxctX2rBR4RqKp3T4V9P64SkiuGvixfXOvYPJosQqmsDGUFHKyRJz+5KMUctQ\nK+zhBoeMT1o0uHdZUHGtzj4KEcfT6rfQ5RydJt2ql1BwW8nHvOZU1rcZETss\nX6ZmhVaTFP66uhDikdS8Y5HAzq9IuHPiRtIo3UI1sQsSQJQ4ccUSb29+h3cs\ngDmx9KzZHRVzMGa0Fe/1l6y66l39d0jcMPD1Oxs8JR2Xhs8F/RBo6IzP4Zx6\nuFEwyh8PrOl+pw/uDQCktBiD9aZwhgrJQ1khwHpFfkRXXqQbBkiwRtbbLYdm\nLFR4\r\n=ztpz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOQVYcwrwxY9e2gOuaydMTXfjmFAJ3o8BxV/johafY6QIgPwJ2kRPmLIIrP9smPm6sJuZX3DAfuH199fEWUXxZVg0="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.11_1572973245819_0.2353088948366413"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.12":{"name":"react-three-fiber","private":false,"version":"3.0.12","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.12","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-ehSRB2pLtEzK/z1f4ijR/nmi947aGa0ZX0NAChHizi/IXWvhwWJV7DqugVR+98mmM4yZRPxxTMcuR+AJ4Mgxww==","shasum":"6d7cf09dcaf5018a2084a26a5244e56a352adc22","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.12.tgz","fileCount":13,"unpackedSize":204672,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdw+mBCRA9TVsSAnZWagAAy1cP/RLqS1yaysfyIDjerg2K\nvmBEQUJfG/WQi9z9Apo/1FfN+FbbQEDtqoSBV159My3C8fMe/UcuIOsbaIPc\nn1WPq7vRyrjNurfLZApWkbVoauuCDJ+tILhjBT3xv1Sz3a/bM5m/EYLVl+Mv\n5iXVp45q2SoYguv5pBKneUyCvF0VVJxUIawyzBne5hmvWoc5DmQEZuzBKWyi\nn+FtNdHEwn0tVxMFLFpNA6zQeeOkjXor2D/xyTiId/oaPx7IAkp/5sppAtBl\nTAgu7rq1HLsWKbFTRjF+VeT/SLyGmCDh5KlYFZbRISLhFUt7H8DHe/hsA7z1\nB5qJEXcIWSsiLN30KHz+oYq+B5qoWLvP+a3NscQhgP/Q206I/hpUzV+FzLiO\nHvj9F+1qSZkuXpOwrmL3noVDfP63gamrP+/ji2t++db2nptN0QKytl4fsSGh\nmJFrtybOkUDwddM/3pD6oZ5bOef/0AzI9c7wd2Y74KWBj7vXHsa1FtTlqELy\nQerN5kdf0rp7xZOVZnzS86uOS4eOtWfgAHzL4UP9XB1TDomd4RM+XyaA9qEA\nc/BtbDQgm/zmMmsRYOfJvda4icvCAaV9k+s1rq/fL+7ESv5yLS3NZlbdDDof\nWyEHs3aGXjyWiNRqqE7YHc0OeUCRyARy7lboGBgTPD+pfU6yum2r2TxZMgVo\nPeTp\r\n=XiuG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC4vp85ywoMbUzX6NFcoP1tyVfJtv2MCK5sqqn+oF1wDAiEA7r6fcmGeKuI9aPktVweiJFHa7t4HUVS+o9BEw26RXtE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.12_1573120385209_0.5094331431017072"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.13":{"name":"react-three-fiber","private":false,"version":"3.0.13","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^1.1.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.13","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-osRXChTJozzx9pp/XsjVal0ImCO5a/cFERXb1T/LCTZAywgZmror1BDVjKOA3EsuA3ZNxWCUZrxYhSMRaB9vaw==","shasum":"1c06838851c1b2b2397051281d6e99a77a856c7a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.13.tgz","fileCount":16,"unpackedSize":205231,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdxUu4CRA9TVsSAnZWagAAgpAP+weAT1sUzvcZYjY2/V/c\nRLCaxPC9Ng4ij+hiHJOpZw9my6gRasLY6qCJ/t6z7IAlMqE7v7hemqyIbdQ+\ntnfrYjD0Wc2V67+PSnNT4CTOjlNIl2X8G2CDVUl52bXopZ/+k/b/jN6V53mI\nWwtBN6aG+QaAQA6jXQKWk7KuBAumq9APMABcZ936knx8mmgX5mdK0HD24fN5\naPHNF7YZmmeP0WQVQGatfVIJGVWANadhwz1MMtSdGeG9P4lkKxidbcJy58JP\nPiwuOYtyGwc0OC4H4ksmJjseniFxfVgTo5S10LIa6N1jQsm0Vdk3nHB0BuUF\nM968ut9qMg62N5Gn2iIv1qaHZeUOs9bWS0bIAp560MrcCmCJVcMTp/20t4VU\n2qiNpKVgKfWZE9CH6BJSREukRZrj2XU9EjAT9MdlctR5zqZN8mOPSZyVtVRg\nyNGRgk9snltQN92rLozuvflgvjHr7kCMLGQ8LGIBkFXs+0YdMhwaE3Lygu8p\nkRZZNrcPWQLqhujctDGkWrJCJ7k+myGzOAStBhFWxN630d4lAUNvNRu3pLZf\ncN9V/WIXYpfxcvjNX0RaUKRXcZOV2ecCrkeLd4R4Atyor/3PR2s2gY6Rh/zK\nqXetiP/Jk3HijrUM10dae5oF8tWS3uuUbzkTlpO1ztt9zJEhJRZIo5zJVFKg\nsZ31\r\n=vL4y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID87Jh0JRuaipaRk74NtM5hN8b2Ylj5C51zTQGPeB3g/AiEAgNx2y+nH5xTCF4fyFJgp5s3PLbUtAo/3WR/lF1lbUOE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.13_1573211064159_0.894564074788492"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.14":{"name":"react-three-fiber","private":false,"version":"3.0.14","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.14","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-XPjQXj5rj08i/GtnWVdYSiKBEZVccbtIuofvfesBeUev3e2rKtPlw/OBe2Yhms5kaeuxt5EoZDZ83rjQ629rLQ==","shasum":"4181ba5af027aa915716e83d9bd4df7e7eea4545","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.14.tgz","fileCount":25,"unpackedSize":211419,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd06TDCRA9TVsSAnZWagAAQAgQAKJ1ZJsd8YUxkkxwkj0L\nrNoOFPXb514McmTrqWlubCcsQsjFM/DNNxL4ayOPhaj3wql8N/icfGCkcBRS\nz8Jo39PstOUwVsdLDbLnBptE2VPRC1sY4sAWOJUD4MoVBqkMiPrE7qDGzg9p\nGDU27XPjPLfrp2ZN3grSApARcetuk6oTgKmw2wda4pRjmbVF3H+IQx0P9g7B\nkgMDaf92zU/WSDEELt9a+DZ3vYyIqP2kG4PyLnc6WpOk+LU+poOgmg4IXwxg\nt72C+RKhCm+Vuy4PimLO82FEkrDbbyblKnlINVaSsZgKyyFsJE7z1mBNTM4x\nmcISUnDsq+oq8WKnH9z6e2kpnxksxjPq0ZW+vL+ssaCIWkmixLOdhpeqSBnM\nz6gQYNYYvp0xYXNArFSTaj/tpGYrlL00ncNZ7mFeAcKqvzzQkfhvo239WwMe\n8JSj1QQY5untGPfTvKihHdReQh4RIN7voUWVUwE2PtG2w7W9LU22i5l0N4nj\nanWxAVDdz/PN97H1PHwws5WuvLqH8Qmwm517vKuW4v8H56gWtntPtQJOKc+a\nZC5QW0h+8boBGQsGIdf4uro0LIUL5qJ/6n90GW2ZNlOFEM0oPx0p+Ykarqy5\nAYMwfFr5UpEdSIBV7hFqUqp7oenKFoCtIEnL2bNAq5qLoYfiv8vFOOf+UGte\ntct6\r\n=sTg6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC3Z6VEYD616m/DHrfqBTEa37CX45C80F4xB32CzgpnNAIgIKclbpTSDEUbL/6SW+rKL5owI/VsJssDQlunRdOqHkU="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.14_1574151362502_0.6318801432030612"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"3.0.15":{"name":"react-three-fiber","private":false,"version":"3.0.15","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.15","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-wPvtwAySdQCks1Af5srig89BgXBflikbaTRTZ8g1b+LYpLWlK5gSJCjzVbcn/sgFB2VbM+fOwQonWNnJ9PT9BQ==","shasum":"eaabbe5c2e59358d35a566ec825b2eb396aa94a4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.15.tgz","fileCount":25,"unpackedSize":213851,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2rvKCRA9TVsSAnZWagAAEt8P/iwtd+63GyJQlDdXlp6u\nj4wO1ob0MDwLFVTgu7r43OS5EkEBHdlzPZQa+bp/Czt6Eta71lLBDm60lpTW\n0gZhZd6Dl8Jt3SRL8lywRcQFjoV84jxfAh4iabEu55g2oqUmH/9mpJ43XyiM\naJqqZbvJnzCNxz5hjGhNu5+cwkaCa+17YenYlUq4QciqCfqa+NDkds29fR4C\nvcSZL90EzjHIwPrD+EY3qtY4z25jG7LJlGuupS2vh+ZH1xz5uAum8klDjl3u\nG40HruRLIWAUktVq35BZAEvCIgjK4sS0Ee4A1mn/eeWBqWTCBs7EqKJ7X3mF\nHdC1bUUjIEDrk+6LMO7aQ+ea1LXzv234AOK3EVjjC2xfX/A20vbPvQgFL8yb\nBCEOkjBnCodDrDfK4JWBkBZzGEH266nux4l9XIsoSiFrtnZorbzKt0laaI9F\nH9SdjYxrIpQSFxjocOojXOFbWe8ilDDbLCUcHLZu2uqeMqgLwuhP8YlSzjGi\nrxk7ekJ3pbFF9zTnPLS1LJHzK8BS3+n7jNI/Xi5xexLHaQ3OJloZImrAe2+f\nPETtZUyfxlIwXvPdGgYkChJvBTW2N1N86HFjWOJcVTO90tiWBRyYKaJvLQtr\n2ffYPaLgRv1wkYs1NBKadgSri6DszoDrI6S19CKLbOXao6ZIvPrD3pIAc4se\nP30k\r\n=tobD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMIhyNTInTva9908QghibL9PnnqM92KfJrC5Bo5KWiCgIhAKx6Nv9YzHeFEidJAJ4BeRYD5gjd7nP0xib/8Kp4ieaG"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.15_1574616009877_0.5777895873478833"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.0-beta.0":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\nfunction App() {\n  const ref = useRef()\n  return (\n    <>\n      <div ref={ref} style={{ position: \"absolute\", width: \"100%\", height: \"100%\" }} />\n      <Canvas>\n        <Dom container={ref.current} position={[100, 0, 100]}>\n          <h1>hello world!</h1>\n        </Dom>\n      </Canvas>\n    </>\n  )\n}\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.0","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-q/Z5stIWooqYiZMo1LNOgois40lD57TH+8dapb66L30YODSIYUHNHBog3sQq2xL3s7D8Wl3jpLXKGea+uyR2bg==","shasum":"6705768e5360ecf51fa51156a8f932a1540ffe4f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.0.tgz","fileCount":31,"unpackedSize":367495,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd27O4CRA9TVsSAnZWagAA4V0P/jxa1Vxy5FKikLg4P5i9\nkymACPL7qIE9HK4+zY+W4zaocwZ8SiL+s/LwWS4C9N5DX0thsy64hqBysqDL\nc62oyMgP6Lj8sTORzmcNjkberXQN3ViPcTAo86XqU11qoynaIWOQ/iR3MYvp\n8apckxVh9CG2rSHol330PwlDWefppMiEUVZolewP0x4XYEmRIP68X0+QDw/k\na0LgaX05LMdO27lOW9dGy/tO/HWCUVeg+vvPB4+sz67AF4sWCvhtGjo9jT3F\nJ1F0Dh0rCpikzteRub81xKuXbNrfngT4+fzDYXPWH6BNKnLnqww+vVQKzyOm\nYhUk1URWNdBotgFuHT6QcKk/xhxbAcGa91uQW+wAvrfTGMxUtt++pT+HjvT0\nbzkVNVEn2HWDNJNTnq8A0ijKvd+0lfLZuRb+jNFtudmlYxNA1AzJ2+nwIJFf\nH+02mjXUgFzCGQXpShsu+/bjKdxiKeRQHHX02hWvbAKtqMXrgl8pwOiyjRg7\nMT1bB0bwx65MlDJzidrk7uOasVxcbyODf66tsO202Tk+wA7Vwoo8EQfJse+G\nfPCkxB8IJNpp++5VEw7dA7XY6CR7OxhTx2C3RgoZh4Lsh7Hh0RkOtXSJ1eqt\nwRt5ESQ/z0lmLkhAWlHSx6QsT5ZlOziHrZHyT4DJ9Swgfasxqtdwq131iWQQ\nQkFt\r\n=C0DA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCrWzdWwhNH10lP+/Nyi4RulGvRpq7bMYT+DtlOLItGAQIgNt9JnNR3qBLcSXhVOHOb6kQsal/RT+o/qAclu9cLClU="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.0_1574679479557_0.5428685919285094"},"_hasShrinkwrap":false},"4.0.0-beta.1":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.1","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\nfunction App() {\n  const ref = useRef()\n  return (\n    <>\n      <div ref={ref} style={{ position: \"absolute\", width: \"100%\", height: \"100%\" }} />\n      <Canvas>\n        <Dom container={ref.current} position={[100, 0, 100]}>\n          <h1>hello world!</h1>\n        </Dom>\n      </Canvas>\n    </>\n  )\n}\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-CtJTMIyYHXvmrPM7jV01+25PmKieC565pky5zm+aoU8CFgiV3/gxWZue07AgWaD+8S6kEl8fz+i+HMygOjG5rQ==","shasum":"71adf368d3a4092b874eb50013b82cd7a4cc9295","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.1.tgz","fileCount":31,"unpackedSize":472960,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd27drCRA9TVsSAnZWagAANLQQAIftmU4mfr2G1J+DSmPI\nw2/LPSvWsJGRJPm1pLQAqWHiNL6fjntQSKaxADPTj/A5WXDmcANn538/zJOh\nrWIz/LL/7ROfigsRJ0Y3NW06ZENvLBRSHi6FTIThe2cIDZNqfox3Mgxpfq9J\nEReEJu4+k4/nBWgAYsHT5dt1XhpVPJpFdFhyvzvss+Z6dj5126FTwxh5FGO1\nl8iOapd3VmHkc0Np0jty7RCLjq85CtH1k1naSW5WnZi/t/0mCFI0fA3iPdX5\nxnOPMsV1K2jBzI4VIXbe5rtvjJ255zjLY54qcPmDqiFv8bJ5usuHsb4VcvCR\nfywyulJwNkcYUIVOEBKdFsxkbw30wKqKMcRhWdqkjvYZVZI6f3caSZv/tcQt\nhsHtkdyStOdxmJSatfJKARuZrzvywjbEAGgSoFRY2yKuk+V1sRFLTd/cQhng\nTWPEqxYynvkyne3vMxRi7K/PgLRNJ59IFnlETvK0j2XIW4K9zo5GSSnQKNHn\nJw25bYSU2Z9WNFTyLgeHMC3UZ6UjfPnU2LOx87F7LuCCnYVTaGt0STTGxq5E\nCX5/EcJCU/Ov4vmb9iIlCJhrGQWLE/H0yl1dAXQLSasj8KPBvHPCZgA62MXg\noN1zA4IKwkLLxPg3Z59cEDPWJLj/ffvJ6cNo/tdNoYENaPODlwaetMtTe9Kv\nYEbb\r\n=5/On\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGHmKvcluE9asTQd1TiYmXna0vD6k8tFIZonprNJUvOnAiEAwo2/tebxuuxFYiMI5I/3DYzqksLDl21Mumv5KKSC5oU="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.1_1574680426615_0.16077417086715928"},"_hasShrinkwrap":false},"4.0.0-beta.2":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.2","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\nfunction App() {\n  const ref = useRef()\n  return (\n    <>\n      <div ref={ref} style={{ position: \"absolute\", width: \"100%\", height: \"100%\" }} />\n      <Canvas>\n        <Dom container={ref.current} position={[100, 0, 100]}>\n          <h1>hello world!</h1>\n        </Dom>\n      </Canvas>\n    </>\n  )\n}\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.2","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-+9UDNk/xZ5PlmVrF40KO1lNpmrHYhaafwdT7+NWq3IbSY8D6zT6DX/EhW8GXW5+9Nm9e8MRmrC3/8JH1He91zQ==","shasum":"f869c8cf24c6cd1a7ec7053395bd30af415b47a8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.2.tgz","fileCount":32,"unpackedSize":475899,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd27hqCRA9TVsSAnZWagAAJJkP/06TLnNS9fFTnuGanXk1\ng8fEwPSpjVxcLJo6upIvA7W1N5JSFZiwpIhVYN2WXUjHYZimmzo+4TO960U1\nBdT4YAVe/x/fKXjlqh+D6j/Pmw3/eLyoz9fBc0eMSquxCBAAiRFpSyfETUjv\npCKN7AGeVMnz63FbvbfFqT8bbL5F62ArxDmVwK2/o2vUb6yoXneqSWMylwTF\nCjoNN/cFmz4hCB7tW90DJqmbSRP+ljMVDWVdx4AZTN0l488wRcgCwZF820LH\n0YDmi9w5siBHcefVlDPwrw2r3w32NnknwMYa29477nEAj7aPtEg7aH3B7uFN\nZ4wZGNj6MDSKQwCH8eeKuBNCjQbOsWRfU7nn9ItwEs7ltHup1IyGfHMGeZoA\nM1On5UlPaPV0fDVksZOF3yWPbmeBsXeS0iyLl8v/roNeFDnQJGjvSyuU2+RO\nB9yxlqRbSYmlEQhIexACz+fi+y2om/1bKSlmxC6PcaWiYYEcA5A0ZEjcoi6X\nv7vZyGBz85/laxddRw+JX08ITNynBP4m7n6ynWvn2uBCmYDvI51q3ty5lIxR\nTT/GR5IDq/y4j5cJHvi44Z4d89GueVHFe5oJ3Yk7jgd982z+Pw8utYqeMf+z\n8ox9DLUH1Th3Axw9aDSvIsv64Z4UU+Nh2eEsbsMiQqkzrhHfSiTQREWdRoya\nmQwO\r\n=JSpu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDFE8NLrM35lnzFltfnckpjeN9JAApE7HJqEFE47nAIXgIgJFW8ZvFDug+X2UiM+LD5aQoSynT30RzC+itl3w9lHuA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.2_1574680682442_0.8363520639547481"},"_hasShrinkwrap":false},"4.0.0-beta.3":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.3","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\nfunction App() {\n  const ref = useRef()\n  return (\n    <Canvas>\n      <Dom prepend position={[100, 0, 100]}>\n        <h1>hello world!</h1>\n      </Dom>\n    </Canvas>\n  )\n}\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.3","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-XgPoWL+u81+ER4Lhu8kBen4P4AwwdiJQ/YL9BAgUKSaoUWfI3N2107ew3XDyol+wypi21XgJ35eXAlUvqJDwWg==","shasum":"36cb117c7a6ae85f9a8a808c3ecb42dd2e705df7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.3.tgz","fileCount":32,"unpackedSize":478142,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2+GjCRA9TVsSAnZWagAAvaoP/05wriywdXZfmZYc+nKT\ngfM1Igu4Uymx0E0KEad/NC80McLAEKnPiJ7VKs4lD+bqYQkhcuIcxj4b0g96\nGGtYEBjmBii+gt8QQL54X8AlppB3LE9vV4hwSo//4xEU4MXdeqHBAlzsJp1Q\nQNE0KvVOOIpfE61MbQ8PZr7QLFBfgxqZv0PAx13NspXkynHwMRyclvk5vnmy\nC4zvWqsftYuTb8w11uFnQy5t998nPFdKQvbjczekf5Buon7h/SxCwTHduNZJ\nYXKS3zPEg4LApfvWbb+pvLL1vD903Gug/mKoQgilI5lBHH2R++lPPA8LI1Yb\nOES1LZg+NuCA8A0sxvgP5wh7bCNlWre9CNHewwEV1qe4i6iRKSoOz4yoS5l3\na90wr7Rg3tv8Z/8u8j/wxh1SlOk5mukZ83TdeBpuMZMWV0ZdIOnbF9huPSsZ\nHdCe+Odgye86+kas56JY1tUrCOUh6LAxlKxEeSkYnEaf0rXbp2ZKeKVJaQje\nuz66LIPGlJaHO5uqh8RMwpToXe/U6gUyYsUQq+nBDyOdxckLLhSKdOUlHrid\nl6b2SAEXxULe+bV6OYmPgwxWD5CcO51CWPPCiBvoovNs4dzaMdAvVaXjJQom\nGmCiUg0zIjwhqDi+2FWU4f0vxzllUvEq5TpCdTaxlngKl/SguaqsKuwpecHF\naRg7\r\n=vzAX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFLN3ZP7cbcCudSUjG4OdIwt5uIpVLPPomMrq0/t6puyAiEA0bhFN9o5wm/RDcB1aGNzENkEUsSdfGruvOfzinX85zQ="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.3_1574691234824_0.7248222142641851"},"_hasShrinkwrap":false},"4.0.0-beta.4":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.4","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom prepend position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.4","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-9Le5ioiEVYX3AL7JeYNz4dtaMbUfMAgHHZ9f0tkKTinH6DkW9N5BzVrclMtJRS4LgUMlAt/x6VjipdshJAJNSg==","shasum":"3870b75c5b218a67ddeb8033efe107886364bd48","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.4.tgz","fileCount":32,"unpackedSize":478065,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd2+InCRA9TVsSAnZWagAACUoP/R8hUHEeVlF1YRfEKg+U\nYJZpBCqexgkFJteZS2POFPYRE9t6B+Oikp3ZmR53JdLDR3FzW0YM1LeOCSfA\n7wvNxiabu3CI0yL1hITcz6iFfWs1HC+fTxbDzzHi8LC4dqf1mndQzKRK6GRr\nubddKdjjwdls3v4JrMbM8yTzJ5Hj2g/6ZYQxHrWKdeyXr0NPjVnTIUOo+0NM\nATvC/kwuzw0EeTYqqLJMHKvl2WTfWr1pmSH9ZEHjV4hfSWxMrdLF8rZSPaDA\nbhUjAd4Yk0ht1fEKHzmL3+pUvnZ2uYZhCPoGzxK4XrpVzelaxg+piDWl4smd\nFRxlc2+OQzjaIi6szYnkjJy1JO4MC2WpXa31OteUCbMVyyMpim9csLgYs8wl\n4umlAaX4UrFxTJmoVan9Us5l14CRtEiKOjLQIvO2FVkIrJZb55MnXxM5ro1X\nRn2UI3ZYP9tbCAZvpRCa0sW0mxatEFbbrAfFTIWtCNk/54d+7dZnKcEOUaKG\nDfMUBeEmXXOFX49OhTCHbaHbVgeJ4VQeYPOwUDmiT/gXqK2vikmiCicFy7lc\nVnC7dS6lIiCQ+kll7vZhFHm1oUMGMfwGmCbN3NeQJrGfzoCYM3qtQuU0ljQz\n0UOgrB7mEn/I+XSZsYdlEd9Rj3oWzR5lKm70EVimU84OlIFxZ+eaY5LxbVww\ndeHW\r\n=POiB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFYRJ9tp6BSY56MGNR0PECQv9s3ADIMOx87KAZgYEnsPAiAbg8jHtCAY2CXDR2CuLDIWunM0gaUHWHzXmOhzRvKGhg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.4_1574691366682_0.3777125154154206"},"_hasShrinkwrap":false},"4.0.0-beta.5":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.5","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom prepend position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.5","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-xCGOLtO+9GtNalh8Lf+HtlQupLxBFAqS+6sP5evHnoxmK1R2obEnl2qKeEsft9bolGjYH4Qnk8oYuu76bqYuzw==","shasum":"9d3531af272f3caacf1849da075501ae8a7cd864","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.5.tgz","fileCount":32,"unpackedSize":478552,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd3rNHCRA9TVsSAnZWagAAw6EP/idEIO/x0i0Gbn3QrJiO\nI0x3DVDkkh/XHoo0nZMjAS+zEs2pxyC4pPOyqRICV2z26k0GZchPp/f54hX+\nCdWRp0yYpc0F5YTLUuc45ApCvv/SaSZWgGqgVllLkfpDDOcJkl3uCWR8mdV8\nS8REht8zYvDVm7f97SR0UPR5qZbkYEenLGMV50hn865bA11yzEbJpGR3538a\nJN1YoHemxtYE46ZcIm74mZ7pKKd/jpCHBYCfI1rzw4U3nFXk6NKNTtZvGs42\nYDqN0o0S/UfgELcka+CM7gp8bguuqthUHFyc259bKw3/lvUfZm/s1HjFdVQF\nutaX1pGtUjtd4N4Qlqmvxb1Mmwn9KH5vJKHAVvkU3anRPHdPfk/9mM7p74SD\nqsnP9AdCL/jdIBWwTC5HqUuPr5csPBYa6wA37xJLfBm/di7j2J+FA8BcoX9p\n4FyJDOOs9zAYgGVOG+BcwxmVmtROFFhl1uGTMBSefqRZ8qcoClyXnfaPIYUn\nNIe43zB0pVT9Wy13VXLtCsNC76ajNVTlHF5Gc29mGwQZqdbzUZvG5bamThFb\nkpU/oIjL5xTKhcRc9YlIqqOUQ40z+/VxgfkfpsIDNcBbhZefg622/Lcl2gyE\n/yhVLZ70Q5BwIXc9zl2YMeajkAZTN7/DZd2C+xTnwxPQNlVneNkM7TRestU9\nznEo\r\n=WFG2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDthBb2EIjETAbX32O+BT21RA8DMafemXg9VHiDBXEDuwIhAMDve79hglierAmX+m4Al09Rd1XuqU/gpZ6XZe0KTrOH"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.5_1574875974805_0.29548390624650045"},"_hasShrinkwrap":false},"4.0.0-beta.6":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.6","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom prepend position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.6","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-CdF0zGJ9xJx7GaYrxztK09cbmp2bbBqG5GtBQk+6OiYQLtFpsnwBVtSgo/ngaiFFuU/xi0gtf0QDVLJSeWLUcA==","shasum":"ab7e67f848af13469374361ed6b2ec7b144ce111","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.6.tgz","fileCount":32,"unpackedSize":479196,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd3rTvCRA9TVsSAnZWagAAIaoQAIvMOq8xv4HdLuYKts5O\nVJ3pNBK2N2+hNBk+NlL0q+eYG3Ffsax+3HLyBJbhzT/OHn5TTLXRkgP0cS8/\neKhm7itQ3XUxNuGKIIX95OrHYpFMaHl8kD0iHzk20EZ00WkOeSKYG6vwcYPA\nlx1pumx7TTqmWfqU/oTEDTWjZGKvB4YPmXXiw3a6rm/DAD6HgZpP4MFzuJxQ\nMB4qcmDlGtJE11xMfwmcqfC/7Edc+g/WCh1AtSPBPuVvVuGVrFBw1biYzxLn\nuVv1/XayydpZwNGRkgcOT1EfLQlZ44dQOH8/6QFPKKY+gOA8G94AaVeFcQxf\nIbu3y/PIn6+INOx7u72dr4SFMeqT/T8sASZY750i5vv9BTRGw5ROQrVwjl82\nCt+w719+5fuZDTerry6bBrXHNA1oJsm7GsEXJDPoDl4W3d/TaZyJ9yMtgI7z\njcUWBEWHtGgHUuNvZkqxoDkZxuXdc4j+8s7V9IKpwZ1UyDrMQLnP3nZmD9Oh\nzBNnXTqo+H7cbimoXHm5uXe7QDwnXgfctlnK5FAeVHmljtLTxpNDc5OzOMc9\ne9GmFotwKqO8qVRkeGX5KtVfoUmMGrEckVIjUuXKqRa9NoeYbmZ0p6Gj+vgf\nT5dwS0dGLCJPp41GxqMRelL6ig5VIk9c7jm3X2+MPMqQ+jeJoX63E3J0j+CV\ngYAQ\r\n=DfFe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBXj+KNcDhaIKialxAI38S/jyqqJHW6M7BjqLV3t8nZdAiEAzL7ClJYE8xsBWJ/xfbFNlVKUbTqH6nbDzc3yllVny0k="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.6_1574876398951_0.47012864266012944"},"_hasShrinkwrap":false},"4.0.0-beta.7":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.7","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like a generic `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a separate dom container. They will be projected to the groups whereabouts.\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom prepend position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.7","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-QCR0vWvnBHRtfNOHbjuyGV3oKzG0jlFPGzovjXydC5dLTPxncjrv/JU9YPM2KaXXs7M5MZ7G4MkTKNnaJQhzOg==","shasum":"765f89f429723f27fbf6749815872af137be013c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.7.tgz","fileCount":32,"unpackedSize":486119,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5EPuCRA9TVsSAnZWagAA7AQQAIjC0x2fxQ4abHYaZz7B\np1xcH7pCbf9uDf850DPuzxt8LjKMgcTpKudJybELH5hVCDrpx234OTq4wtHn\n/2mRRjLA8+KMv6gmLAWI4NIHYvdEfJtQDbAi6H7yJplt8XRBLwqijiWgDJgO\nJhDIidhByWV3v7rOT59kWSE8yJswaxuCRUkF9BqKLIFuEdJikoZJeJqUrXh+\nmNBdwjSZ+RqdVxf+PbcClEb2gWeoYVVgMzVF9oQq12LMkQJD9+F9429N32Io\n7CfqW1XA77kfgm4/agCwd94YWp9HoXiCDduVaBsU/a63iQ4TKDnlb5vS8QyJ\nr1pD8EeAabRpsF98N0BbUKjSrVHO5xGxCn3IqD5RsjeaOhlcXbqAkn/FFBkQ\npZDt1bjZ4WgomSuMIQsXWrlK2XF5kZ/pe58t+qQQq+2lb7uRlMaN824IG7RS\nbzm1aQpt1Uo9Acp9qtex4m43VX05wkROwdUqhA/wG1Mx6tv1RUivbEOj6NQZ\nq7NpOE/OuHCMRXLUW6wkjN5sepTDhEQOneRflqNNSngVVRGycAN1vVfHyjFA\nM90VkWlZGfO72azKA0xvXQxquUmvxLT97i6vuIzedQzFqQiDGMdKUefWPv0w\nPHpOl/aEqrzsiGPK2tIeBV3PcQ8nMtAmHRVuOC7xt+74FJWBsA/GHYyAG+gN\nC09Y\r\n=h98i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICy4zlS+4N+57M4p8nM0WK5JiCLqXNKRgdiPsCXRKAesAiByZzG+eToUsCUXK9isPoCCuveNyABAkvKGfmx02CW5vg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.7_1575240686424_0.8353246638283969"},"_hasShrinkwrap":false},"4.0.0-beta.8":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.8","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.8","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-u1wtoEqlsN1sSdjGUA7teo9Sfa5o7Iwmn6CWuXRlm1JXUnhDgoPYMpkjAs3Bz/LkJpuP/xXLgZL5XnaYgB4mSg==","shasum":"cd6d14afd7e608fd6ad0ff6d041334d2f2144824","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.8.tgz","fileCount":32,"unpackedSize":487006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5NfJCRA9TVsSAnZWagAAY+EP/2XExn6qvIKvjCw+vpzI\nEYJ22jzmXWoLe74y/Wq78e6NWrmVUWHRZLizOH7g+xUhIn7MUo9ksCSDrtTF\n+jD1I0ZMvHFuVCiWugUIP3Rd+mw1+KAsZyaZXr6Hk/68jRqA6Z9HF7BaOTBQ\nS2sbezsRsXf/AInmsa08YP2rYOzb1dAnqvfBpWSDr3Sk1mfS11NONs6SZ0Ka\n2oxyoI7q+odR4kyf40EwjX+rDY9Mdhc+QftyOP30vBEi1pj/W66fGpW0W54e\nFl6/aDyG10/xHVmPaGstnart/ToDtuMALRckyG+L6lxbqX+Ez2HSRk+Iw6Fd\npnh/JE/UWR5ZBE2zzfF28qhuGTQHWk1uvNB7ceLPsWqbl4486a5iYZ6h4ZEE\nuOCGCSeCpGaXXR67SGFl8MbqJXnjzOD87GBGkCutZcMVPtl+bA3yqxewmmF0\nu4RZCWYgqDllfdXB7j/0fqcn0Sc+oJevSf5WPrQNAJWx3lPIAQkNd8NgZqTK\nsGdgJ9t9mPjD/sGTD6legB2nLp00oNeulAJvqJWIZ30rzEE6rcI++TMvdDdP\n2F4Aqwk7ycXjgP7JzWpN9kX/+z4VzROhVUuUgcCSnppfmrX5f0feD8VAzkmv\nWjPJTDAPTFm3jW8ws7XIi2cfwZFzgqxAUxwKHIgnQvjedi5zf2GynYGL6HzX\niMjn\r\n=ccHC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+FjIgK7TnQd/OyoK3JnoDHB1KEGMmF5epsZrLsbRMfwIgIgT8TXMqddqanbvdmtQhFo4Rh1y/QWBQSr32v0G9nCU="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.8_1575278537112_0.4410173513579174"},"_hasShrinkwrap":false},"4.0.0-beta.9":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.9","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.9","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-Xu8STV6n0i2zXDOWExDIx/Dt5GgE+XOL5CCyCKpz97GUtTU6v0q//00c2eiGCwE5nYazrDQIqhZggCyEtbmyUQ==","shasum":"ff48cbafbbfb504a5af31390d2b4fb399b34563a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.9.tgz","fileCount":32,"unpackedSize":486958,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5OfrCRA9TVsSAnZWagAAFZYP+gIymaVBhD22/v3Zxu6u\nd57Tl0R3qGe7E8KOnS7oBCTrlVrFDnR6feSiZVp/wpRBZnGLSaBv7y2NgTDO\noSXLa24rjHukNq3A3GdPq2Pu53P5bAcoMgYz3iAoBgueaFUDrtiXCt0eBzDs\nFpm12Gjmx5bQyh9QOQjGBawLNi7MHztfF7GoIn2j6bhkenglcC51pEy91zXR\ndJRhG7JzZjMbXU+kmPR2Y54w08DGUayRF2+dfltyddGEuAb6LbkIfT+l9RQs\nFjL6h8K6ZjCgyrrkN/oJ3OdKg7aC2n1AXiwmVXoNKF0BoRb9wCWUbw08dkwj\nVCrXyF0ft4DYfYvP0B2l2JMNa3LucZ6s3+MxdosC9sKvsV+QpVDypkC4rk/r\nEFxdRMhj1fCoxaMoTi5e+3ZC4Y/OfBvUuRls6Af1s+g22GSwRPqSbJUROLfi\n8jI288AyXSV7m1zZYIrKTu1psroc/gBvRmeMqfQSzM+eG+RaGFgpwy8iALK9\nOO5f9AYUak262I7k4AlkDarn4jbK6N/SpOb/zYSYzwqmABYLAlyEDTDthoj8\nIYhuuuQ3qJtQS8OCAInkwOZnrvY1hZUXhhK3KgRmrO9OgtzBvaRr40lsf1Rf\n3A8p3JT5PGRCsS9r1+g1gx2dJ84U1dM2mPzYfM6J7wqr1pfgoSZrANK9A5za\na7Np\r\n=ISAv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCRROHT2WYNilvGZ+Tw8sMGLpu+Oaab6nlyHq/R6Lqm9QIhAMn1IKGMYt/HUszUCF7WWvzMoKDzQ3BTFw7apXs1e43q"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.9_1575282666654_0.831223652778279"},"_hasShrinkwrap":false},"4.0.0-beta.10":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.10","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.10","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-1uinkSUaTCSwhsEWGfBWPJpK23yXo+AQspKIfheYEHZhP4bwoch5G/+KYAwVZKtGT/9Zj5r8CjqCbPb9r8JoCw==","shasum":"202064f5c1477c899a5aeb5c7084a78c595d9a73","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.10.tgz","fileCount":32,"unpackedSize":487003,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5rPBCRA9TVsSAnZWagAAxoUP/0iCGxKWLI7Zri5tY6Gq\nQXy4Qse+Wm9ELMtmX4uGK4Pdwc4GiUurS/lN+NFyewApftOcumNZWw4xh0zt\nYnofLcOFXWQwZC9Vk0c2jDDUapeZ4q4i4Tbsx0dVYTXwfXXS/IXr4MjbCJW+\niGjK2xs+ickfYWyiq802W7jTHDVMMYhieyZkQAW7Uy6pY+InRhMAmbz+/SwL\nWpRuJwow5BGi5Rchq9Z4DIyqNKMBTl9M+08XsOKMvCpJq8n2Q/9+6JKE51/t\nP3hHjdUlVuR0etny5x75mqL+h8/Y2tdTC0zebcvpu+wA4P6bHgI4sbGRpuxU\nxLjwPKMWGonLOueo/5E6aLMsMCBwJ25YhP+D9Wauc1ja9A00F5pUfReGvJuA\nCCAuMyjX07wcYQx/srtKRQzE1LmuxfLNNvKwsNL8InKmQkXCVkT+XqVhmRgS\nEJ3ZnCtaGZWEsYzqlSnss2++ktpojjEfhUHfW6NiMCq1zXIzKKYTu9URRAKw\ncNab/ctC0apFj35LSzXoo4dR4GmlGbVKqhWqPIr+e8Z7xr9KghvsfmtFrsw6\noi1cNrYOSjNzfe2hyxdpsF/F12ySC+Gb8QKlkv9icULceqfsCYtx2TdSvy6d\nNqc5OMVXGjYIPcOxiNFGSMvM+WkdMjbojjLGpDFLFi/uwPoUBBy2eWzJ0cmC\no1az\r\n=srYj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA5aDUuItsSWxVEkT84WZzs/zOq319PR3TLbHDZfbHHwAiEAh1ZQxICa4JVDDFvY7TU7mL3xK2Ar7CWP9XF4rryb168="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.10_1575400384883_0.704760298427211"},"_hasShrinkwrap":false},"4.0.0-beta.11":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.11","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.11","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-OQ6cm3hEKNGvaBFBLVkwTbuOYMeLGHYSBjRJip+mcu6m+UYhSWuW5SwjCHYZuGuYpf0pMKoLku6ckP1q5u7dXw==","shasum":"eaa137e3a7d122207e08ca4cd72d94fd8ccdf873","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.11.tgz","fileCount":32,"unpackedSize":488923,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd6QNeCRA9TVsSAnZWagAAIzgQAKPlDw4udM8awt3RZtcR\nYrNqV74Vd07bzKoxdN8PeGc6o+XBnV5Brof5pnnEyCnO1vUmw90KetYgzf0Q\ntPO45TAQge+w5fQ/kULbLDbcjeegplZGSJU9oNHnAYXoZ8cM5Cztl6/8mZCM\navlUQrsdfhDJtxZej3kXO0cBtxjT+J+yTbcFttmPKekmGWVd5OSUGU0RDolq\nzOQ1jxX5YhRL3QyogGMrcN5ODKtbJAqOAplpEJrmlGrnaUo4hEgjfLdpy79/\nnKpROUdObalZFN1BxTSOW+lqRST9815hADOFAFRV6/AP4RZbUBAYpHCq8Ca/\n8Po/WtpKa82ykNB2v6mxsUZ63Bk+0CVyIhlgaAF1wUJO8v6BqPUlFUBBguDl\niOZqb8O7yT1bk8bx4UT60I1FSUGkGNWWIjvE+pjOKDnA7map4kNNASPA+qCl\niqp6I9r+Z9oMcn+ZLC6sdWnA3eQ8d3Tfjkk5I+ACbeeSGvmt+YQLygIBM9Uv\njLjW5+A1YqC+KLR7btl9iQCXV+AaCq4S4yyKSSHx2I09+JeecPPr4z/6VZwl\ncOIxrCWLlCPMEpLiyuGHDp+Qa4kHhOg3eMsL3lz0GB5SThLekjW40KOO7D6J\n5lcFMArLJas1Fbt/M4EwdIyvLDNuE2Iro8/5KuVrvQ3AphxDt7sRix6N9zpa\nF5MB\r\n=4x5o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDf/rmI3GrS/VIFKECX9PISM364KCB8j3cCDAN564ZIPAIgDElXazHUUooT0dY5phkbylxUgfIJKrqm5j0Tape9QgM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.11_1575551838315_0.40304150858685905"},"_hasShrinkwrap":false},"3.0.16":{"name":"react-three-fiber","private":false,"version":"3.0.16","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.16","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-PJvq9qRRbGAgjWk5b19TdaKQ/1K3Wfz+BzsHFAb+t022QlCMBbmNKcPsDslgNOMybBVHxXqhx+Y9JEbdvIzzQQ==","shasum":"b71092c2510615d1c941fde737c9f68d72662c07","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.16.tgz","fileCount":26,"unpackedSize":222452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd67PnCRA9TVsSAnZWagAA93wP/R/4kJBeF+0Yt99cbW6n\n9f+fYzlp+h6LeDvSdBpIIB7ixggDToN83xTnfVvOtgsmnFjTmnTBBrjV5Nf7\nEsf8PNbAN61KvJjlbG7gbN0R3ZAc14wVDswMfkvhs1fzg12Dn2wyyY/P+zGK\njuw1AgyeLhod3L3WFF8bLaP8wQkv/DVa93Aksg0R/GjQM5y8Loj4z4z8qpa4\nP4ynddI7gS7dWYu3ErRwX3hrPzMTUSWaa9iDNArmU5E/9xlx7u3xB7F7Fxxk\nIo09X2lIE7dAYVP0EnACcGoSQ8HuP9duhuNAPCr9ia2qhNRpQkHJXZdteMn6\nKG56/ACFA4Gx4UKdXzhjQA4d/ZMvsxtoSFlJacvWdmrlVxdAO6sZx2MRHkhD\nzBcSOltc+etVt3cBW0VWiLECwsN+W0fs3jR6nzNgu3JlZEJLjDkoqdKq+EM/\nJGAKmlwAwn2oP0SPMblzwPg32qx7lUvCKm6colq/yHwB6n7eaD9dHiE2kfy8\nF2qALKtc2pNfStQj1pVvNUPCHdD4f3AkNyb4wk2qWuOkmqcOne2J7Z73pM3v\n+Rlt9zsAMt/lvL2OzB5gbNOx1TSex49tXbg6y0ScAmJRxzVlKoauO9XCpf9O\njHwDevxRrUxmnWbNnL17+XhQ0TXlyU+w1Dwbfsi5tmIF+IslidPNu90bUo0d\nL5QJ\r\n=jW5u\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDk/dNi4cfGywa6/5FNveTE+0CsxFOAM9JMDuPG8DTHLQIhAMThXZu39OpZ4XJYX/l8RB+24t2daTYxae4p5yGa0BCD"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.16_1575728102488_0.6723325367760602"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.0-beta.12":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.12","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"# What's new in v4 🎉\n\n- <Dom/> component for super easy HTML overlays\n- dispose={null} to switch off recursive asset disposal (good for useLoader)\n- concurrent mode\n- cross platform architecture (with ready-to-roll targets for react-native, css2d, css3d and svg)\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.12","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-AgE8KwZt3MRF7X9p1KPUowAVee5YTUuijPhBPxSUB0Q6Qs+iPv4Hh8CfLgBeidBZwy6h/2IfQG4X1QywUAUvOA==","shasum":"7b857bd6ba9afb0f6e5d55cb9bc136c1b6cb289d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.12.tgz","fileCount":32,"unpackedSize":489893,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8fpoCRA9TVsSAnZWagAAxIsQAJA8WVn+RebuI6yhVOo5\nfaeKcUc2o6wQp18KNEn1hSYbr3zDsuMq+AUwrITGPPV5a4ZnSr5DboiPwj0v\ncu0wUFrF8ofb+6gdvoELqJ1wetIplvHAfJ8yFPHS40D3fx92HrqSOms3UJbQ\niXwE1gu3tDfdZZ1oDPj1AxZ5zGpJaWQPm1aRGCzNOeyqxR4Fq1LNEouvesI/\nohmv0wJZ2WAGNatB85wu/0Y22DRsz0PlYaHMZbWoHxHuh3jA7cNtcGkn2hiC\nfCZZ83gLTRzkQ0iV8H8SRY+iajKbeFTM40P933RG+sy8zYS+ep0gJR0lY7pb\nOKDcjoJvjv9Uuq+f4Iw6yAwnmO0nstdfzw4slf+sByRNM6BQqX7/m5JCKoIe\nI+lC24ODaW0Kc4SJ5yc6Be8H17rFDYXQAts1m/T725zW3STE5stSTh5lus3S\n4hCHp+7UHkYQpHzK0/0Lnti2EXSMNokyV5b0otvp27eCRhtwHFWbazrMIa16\nbr8FiOldgj/DdW47kx/52cuazgD+z/5y5FFheEcf3H/zLTyPDzlKEamWgnGC\n8gLGPzGdg0AE3AuXlzZghR72RI/ySDwvg18xd27cqlkg1UX+lnVrI7gCIMZF\nrhK9FAc5XJq1d4J3aHN1cTZSX83PBfNXXXaNtH+D7/47D3YDt+dy5FvRUV8D\nA1K2\r\n=4NMJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC/eM4FHPS+CUATADzMT9CQeMVdkq76kuKaGK0tycWA1AIgJ90Yb1k5htItYDEDUwtl6XcTPNa3lw9BcbOIHy216Z0="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.12_1576139367708_0.003068775544599278"},"_hasShrinkwrap":false},"4.0.0-beta.13":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.13","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"next","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"# What's new in v4 🎉\n\n- <Dom/> component for super easy HTML overlays\n- dispose={null} to switch off recursive asset disposal (good for useLoader)\n- concurrent mode\n- cross platform architecture (with ready-to-roll targets for react-native, css2d, css3d and svg)\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.13","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-o026tZa/qSVbeWgNwv6wsOgnLVasf1zRZf6MRwk/5zH/y6m0BSdAs1MCtw0at7WfVrsskQyHM9DSYurM1o0sbw==","shasum":"0afb7850e2a9c1e7c1235e2e01da4ff6a312e1c4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.13.tgz","fileCount":32,"unpackedSize":489891,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd8mIVCRA9TVsSAnZWagAAgRgP+QE222e3pkz2mU8jVNQd\nGcnwcfmnyBrQkRLdWI+FUyssw9ozMtta62l9weZiV3SYHf3lAXuV1e3YT1Pi\nTqJ5juaykvJoR2X1WxWpjCgmyuZPy5rPM88Oo/DugXMz1SejqUokvZR+01Qm\nm8usZSgwBwBg3pjc0WC8KWApSd3PtV/sA4H+JjsMvcTFeC6aIsjIoE5PeJCj\na7U2hSo5asWTW11rSljS8W1aJ8qh0WZij5xR12Bd0XDnVp62kbiNjkqPzldx\nwU8UAKsJErems7ZHAyvqi9ITYHtBxP4XzGlO7io7TQlWhaiohMp3q8Moljnl\nyUD9WI85Qonp6H8ymkSpnfSPnzSK8aBCJHnnHfsr3yYI3JLfm9bTIKG3ygsH\nlbL6+KNtqdLepEJPFko2Kuplm1TV1VjlmgYTLwJ5sgaYaEuPKaprNnGZF0d5\nGbW428j7wnXmuaBA7fV+haNLahcRD62FZuxasX0zjweKJlhx8tW+GhpN8avO\nECIVH6SWRlsHSEI5yfCeAHirNTpeEVEc0c9phtu6g+zN3E0AZi4yCPkQTP+I\nxeIEewG/Ash86Ld/Euh86HNtdPAxwXaj8DliS08tuRwAVqhcjUbtLSVqdPOz\n5vCQfDmxrn/HNEkCRMulp/NMWtQ0JvIF/x4uDmuBv/yV0W+igld8j/CJjqXv\nSozD\r\n=YuH0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDE+B4goHeD0PqsDpKyNo+4yhLv+k+RkHWRNoJkvuRPPgIgZrGvyuQcKcvIGRdfdq9h1uso63//FUBgIcwmXQIGVWg="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.13_1576165908415_0.8593722811809072"},"_hasShrinkwrap":false},"3.0.17":{"name":"react-three-fiber","private":false,"version":"3.0.17","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^2.4.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@3.0.17","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-xAA8IpNZVkr6CncXcPtzQ0ypSGAbDApfalokYPiwTMRyK/AN05JXkAwVjUwGjWSs8X55LWJkz8DK94sKUSiYxg==","shasum":"c9300759f4307fcf823ac283c36cada1ca11857a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-3.0.17.tgz","fileCount":26,"unpackedSize":222622,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+e97CRA9TVsSAnZWagAAmCwQAKKhHwQ4FAS2AzKvrXPJ\neOS7ZE0fvGNrXw1+uzAy+gW2eAoZ1lj4KNReSeMFwVtEnri2nXVClTRWBrSG\n51eLLZxlxXmNf7AP6tW0ZgvcQnj46uVVkyDX09qyDE1wvTYtHRLBix8DGzLZ\nL4bA5n2JrsKOXMtgfYDP5FONTcwLvljhXOrlBvAnGRsDoSwzsbUlCYax3sS2\nYz+nsLz0jjQL7wGM+QYjCbKCBKz0wD+rGt0mCSsUeTpFTfmHZ6/gI4xQfgpk\n5HGyc13IARGX71We9ozbzXJ+RhEYgvMuyOZNyRMwxIcQ/DwIdtbHVzHdHgfG\nfcD2vueO0hB5Ihn9cpQ+Z0eaZhDpMmvpKpHzWaB8A6H8uckzcF417CcOASQY\ns/bOgqb1hE7K6aKUU+t8tY9FtEsMzHPVNs4q8j/2nU1VxqvOxje11zJ18hWl\nyRlpl5lh9DdGtD5n0kuXDFxbrdWyAl3OcEePKgLyobmfLy4oxxgcLfljlNCP\nKCQiTpR9+PRL4kbs+2kCgK7JJ1JcRjpPCJo7CogI9DfedURbUijie2f1ZbUV\nW/ZHFLvmXSTw9e/sPbl0ok+fCJf3ByTI6+Qh+abgyf/6AnO4af40+5d9Oe0e\nEcoCsUPEQFYjl4e9lzWk0Zjl7JtDIBksUbhbj5H5I8/HZUaGFhe3i91GRnP5\nQ2Wl\r\n=U9J8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEqiRYFYjhS2Ho3i74A0pVp9z2+sTtvLNn1HWWbJ4hZMAiEAsALJXcmzEuZBCxQJBFDvdcwho+SaRUGkqrR7ZBt5AMQ="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_3.0.17_1576660858544_0.995909673017342"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.0-beta.14":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.14","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"next","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"# What's new in v4 🎉\n\n- <Dom/> component for super easy HTML overlays\n- dispose={null} to switch off recursive asset disposal (good for useLoader)\n- concurrent mode\n- cross platform architecture (with ready-to-roll targets for react-native, css2d, css3d and svg)\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.14","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-WG5qJlr3nw3u587McwhToaal+nDm8L/6CeGnoy/WZtX6rUG8O1Z4lAkG7mgvv74rSuZXaPKYcnMC110+YvUwZA==","shasum":"2bcafabc643ae4448559f83de6cb9264fcaa17d4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.14.tgz","fileCount":32,"unpackedSize":491767,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeAL4UCRA9TVsSAnZWagAAgagP/jqS67B4QjnN8GOmB7xc\n50MQoEDjFZgJTKFN7Y6c5WfPvgFZdO+EfLTZ7RTIyLSXkq/mc1+KwhtIEKon\n7i5wN6G6HYN46L7B1XdI2YOpeo9zq73ueItSJxBYFtAJSwL11B1TFyXrs9cY\np5/q651+mE/icICMXoqj5YTvHbhhTUQkJeYkIphsWvdsWXnINmWG2x3EBCp7\n9/fxvg3I/dSK04l12q0L5apoMvnc49etCvDMBtv5cLNc7TT3qKO82aC7QUX2\nIga7jTefJWDL4K8yR/GiKNBgCDUZ8bU0d6k/m5+bkmR+FttEdnoF9MKG3egV\nQxb+wK56vNlwcgga+CkMco2p2ACzKG42sAg4g7JcqpBtnVKzd5LMQyt4E/Ri\n6HxrX/gAaH+QKLHH6uFTiZmGSAvb/qg/FIaByBS8NyRB7dOffv1m31FjR2xg\neT9eX4s2nz0R2X1S4NSZUIeDSidTNm4kl6WIvCpkDCHBmSsonRAIDYN2uDvH\nRNSEOr2B/9U2cXUMFeymfn3zkO3V6CUOUdm5MMTFn2+BYtn6h53hDYfi6HgY\naCmM8H0rJfvyjVLxm2pm4DjF41WhGxLFFInyhK8oTWrunzFOusHNrr4vZw3H\n85uYo6D0AT4ELvhNpCQ6SYh9F4QLqLSzQNVnAxpfEzcHiok0MsJqbeeAeZYW\nF3Yo\r\n=snDp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAydxBEaLQc32Wq15bsdGbJLhbl73J9loCS7PFODmtifAiB1Q9kPF5lY9ZIDvj7DyM9vqeh+nBPPNeW5KmXy4s330g=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.14_1577106959353_0.5374379853086284"},"_hasShrinkwrap":false},"4.0.0-beta.15":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.15","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"next","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"# What's new in v4 🎉\n\n- <Dom/> component for super easy HTML overlays\n- dispose={null} to switch off recursive asset disposal (good for useLoader)\n- concurrent mode\n- cross platform architecture (with ready-to-roll targets for react-native, css2d, css3d and svg)\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.15","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-F6l8sdWzTu0+MksoApmJvDBaOVnQ7/NtWHMccmKG4GG7fgIlIJHAKBWiJ9/fGPEQVl55juTlcflUU8QeiB4EZQ==","shasum":"9a6a5fddd813e02570dcee58d5c199c4745e8ab4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.15.tgz","fileCount":27,"unpackedSize":491156,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEv7fCRA9TVsSAnZWagAAY1AP/i+7X6lDs3GQxCES8Udu\nXLGImdcEBvafuoTV4mFQ3opPo3vh3BYSA4QHkTvx1r4Ced9c6kTOxf/AX7jP\ngBJn2W18QqlAJMn9X+yveK6Ipyz3H4rhPF22h8Bt9GRZZ+ek+091R4EmqPgn\nlpuW8hCdVfEhtuWDU23FWl55xkc8NEyUKE4/Z2CJeOdZ0gfD0fv06H6NXZ8P\nWKX99mnWk+apDkr7EZq98C8yh+9WYSM1aP7Fx/ajNKY/OsnRTAMHg8zSkgX9\n8+1DWn7UEeHaOYwVNc5kqat66MMG8vc6dxdkd2fKQOu/CeaORm3oIP2oxkOy\nBhMLMCblWAWU26lYSETY+R5yAK/M4hKtkmu3HBpjE9u/mMpI/q0Xbb0FF+uy\nypmU9+qLyqxXj3yiPH0aULvKf3ZK5aRTUJRASOug8YW7FwfNLUSkLpEPicZS\nI8NSRBXYDwWVAHeca76X+fR47azwA9ADHv6ZMBA8g8Ou3MZIe4PzwwpPaImM\nb6QZzCigJxuO6+seCngzyZg7i71Lt0RkBaph2pVbosaYQyu5oETJtaPo/UnW\nP0iygRfJhr5fAW0nldD+GoArVDLusKgRx/Vnunui839Atfgk0ANWzGK14TFM\ntGfdaSiW8WmM4f4GjXtc0NYKDgkqP+7oGUlV6bCwUeJMQgmXKaj6VpTxopWU\nXEPL\r\n=vkK3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBFIf396bG7DfY6RxrVooY/27WC7nTXQlAibq19Amn7oAiA0fbirg4judnGBoOU5QvoTwmxISXyKmCkzDGDzlJjYCQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.15_1578303199128_0.8383263420967968"},"_hasShrinkwrap":false},"4.0.0-beta.16":{"name":"react-three-fiber","private":false,"version":"4.0.0-beta.16","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"types/src/targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.1","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.1","react-reconciler":"0.23.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.17.0","tiny-emitter":"^2.1.0"},"peerDependencies":{"react":">=16.11","react-dom":">=16.11","three":">=0.110"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"# What's new in v4 🎉\n\n- <Dom/> component for super easy HTML overlays\n- dispose={null} to switch off recursive asset disposal (good for useLoader)\n- concurrent mode\n- cross platform architecture (with ready-to-roll targets for react-native, css2d, css3d and svg)\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-untitled-game-i2160\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/2Ix4Du8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-c671i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/OwxJQfx.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gestures-dh2jc\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/ZJ04pRJ.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-gltf-loader-animations-w633u\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/UzG518m.gif\" /></a>\n  <a href=\"https://github.com/drcmda/learnwithjason\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/1atWRR3.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/react-three-fiber-suspense-gltf-loader-l900i\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/8xpKFkN.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/387z7o2zrq\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/YewcWL5.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/m7q0r29nn9\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/LDddjjC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/jz9l97qn89\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/zrhe5Jc.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/kky7yk087v\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/jemlXzE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/ly0oxkp899\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/vjmDwpS.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/y3j31r13zz\"><img width=\"288\" height=\"160\" src=\"https://i.imgur.com/iFtjKHM.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n    npm install three react-three-fiber\n\n#### What is it?\n\nThis is a React renderer for Threejs on the web and react-native. Building a dynamic scene graph becomes so much easier when you can break it up into declarative, re-usable components that react to state changes.\n\n#### Does it have regressions?\n\nThis is less of an abstraction and more of a pure reconciler (like react-dom in relation to HTML). It does not target a specific Threejs version nor does it need updates when Threejs alters, adds or removes features. It won't change any specifics or rules. There are zero limitations.\n\n#### Is it slower than raw Threejs?\n\nNo. But it could potentially outperform it. Rendering performance is fully up to Threejs and the GPU, react-three-fiber drives a renderloop outside of React with zero overhead. But React is very efficent in building and updating component-trees, this can make a major difference.\n\n# What it looks like ...\n\nCopy the following into a project to get going. [Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n```jsx\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Thing() {\n  const ref = useRef()\n  useFrame(() => (ref.current.rotation.x = ref.current.rotation.y += 0.01))\n  return (\n    <mesh\n      ref={ref}\n      onClick={e => console.log('click')}\n      onPointerOver={e => console.log('hover')}\n      onPointerOut={e => console.log('unhover')}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshNormalMaterial attach=\"material\" />\n    </mesh>\n  )\n}\n\n<Canvas>\n  <Thing />\n</Canvas>\n```\n\n# Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n# Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, position.z: 5`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, position.z: 5`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"receipes\" down below if you want to bring your own.\n\n# Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too, which is good for awaiting async textures and such. You could use React-suspense if you wanted!\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it.\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n# Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n# Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n# Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Further information\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\nLearn-with-jason: https://www.youtube.com/watch?v=1rP3nNY2hTo\n\n# Contributions\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.0-beta.16","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-nKX3b0GyayzVDvk08dLl1AYSTZ4/3+6qV+zo4Bs641dJotkvv+PyJJXxstNMgY8QQfHRbCPcRwX/ABuAMukUPg==","shasum":"95742630593b6134af6ca9b44b77d192b4aef1ad","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.0-beta.16.tgz","fileCount":29,"unpackedSize":491606,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFI5jCRA9TVsSAnZWagAAZ+kP/RsLf3ht2iqTl/vKLFtn\nA9a2uuMt+T9xp0jLVYY96xCDlDn3JVzgGYojF8jHfoXhZN0r4fE7JDxdFd/5\neSYN3ty3nPogzICvZ295Qu2p3mZJtlVOCRpZ0Gyfiv1DGS3XNv/aP7FhN5ep\naSi/R86jUhV3qssNCoOzU36PAbX17bqcqbGZgLxs5K2nRv3FNAA1QZKl83ET\nRky7C/vfDbZ3/6tvn49Z2exOjCl7sebYPJNK4WOK8tLvdgaL+/oSj37AXHXY\nn0pN9/tp/SuNqSF1oiUOmZWPFIicWbWDHU4J0z/A7SPrOZ5+kIYY2Jv29uyF\nsU/4nkTjEan2Kxv2tnMfZAOJCCtq1E+kuBNbD/ptlH0gY039BxJ0IUKJYKqK\neTJNwMxmBU3ocYkmkF2DQbzuHemGEYzZgiaQLU/X0Cz18HcfdDfb7ql0bgnM\nAirTEx0YJt3zRuMVgeGffNSPz/1Lv3FXPXDS5d8tA+dj0u+omW/4ogbd+TSI\nl6zZAhshB+8fOCXCQObGJeuhzvZYKY9hbm3+tLQFeKT/gE5PeFyNSoXfwBM0\nQJTHpNjZ7K443mr2m7GM0FtX/cgo5ssDX2cm2Y0ZiSYuzJ7xeIG/UPXQWSJq\nMge7BxsdjxQ8VD1kK9/JeiR+j3xoLltJVrR3/I7APs/qCA7kfaIgshXORaj1\nM9IO\r\n=lWtY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAnYjujVZp8I74U+izeI6raa4Hw1YLVoG6KnHuaW8cG5AiA6cXCwxJQAvtCvYkGZOdSfPJEuKX0Ec78GiwoGri4Ffw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.0-beta.16_1578405474648_0.06590976667127735"},"_hasShrinkwrap":false},"4.0.1":{"name":"react-three-fiber","private":false,"version":"4.0.1","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web/index.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.1","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-5u508W0Xm4JS7/6H5Vv8+kyep/RlbKu/HW5qwbex1lIFyod88evJlOVccVa7O79SxwBBPPGmEdlnT55382id8Q==","shasum":"09a3e13185f5a6acdc0354c31922bbe696bc41cc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.1.tgz","fileCount":34,"unpackedSize":612942,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeGG/2CRA9TVsSAnZWagAA+9QP/36CwyaM53EVtGfUONj+\n5oBjEF+kzI1/gJXvGVc9KbxS7/JP8vNBTMkl/e8XyrSInS8AfLBa1VFRUEwL\ngvB+WY3Wl2RyPHSlrK78ORhN1RgQNo7Eyh6vCj2nsEcGMEHVGoM2PVtgftWA\nt0CYr3QwKLtuxZSAnf+B9EFc702KK1OGs0MaLozKh99rc6tCcRTpV6mQsleA\nJDgSj02ibAIyQC74mOf6LgZ+6W9yweLtKDjsPjNYn4CYIv3s+J28b279buDU\nspeBMPefPVxBIKX27ILHYzOquSNjnFKQT6ejxoFLQK8uS2KMzI07z+pwcaTP\nRwu4ccw/RtI+h18LfUNWYbsthD2crxxfqunVu4yjN2792BlUGXSAR3lEEK7X\nlJoMsPJFEtuFk1KYsDPJk3yWG6ksm4GzqrCjuiuDOK6m/+W3FNq9RUMPKHuL\nAD2mhqlwZ2NujV8zP8teGW91E87wJGte5Dh+OKobN1Z9k65qbGeWOAy3EczJ\nA3Mj4mIMVs9ejfxJ6K67UeqHx4zse2tl9mRnLcYsomsIkgUeXOntpbmM+n5l\nIgshC506GoPOw48P1/J8NIWgNsalnWQwV4oz29m/u9XZp9/UTXqjelN9+SXd\nmU2TXHYbKdfgY3s5OFlmC0dC4YT8rlgBBO2BNV69SyDCqyFwOyKpan8DIKBM\n/Pjh\r\n=ADL5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDH8OG7hhNFCCidMFdgjml66llff34qoy0jpjBJwRXRvAiEAy9O1SKRPkpxaY2/Xp8+1kLmd/e/gNbZ9MPykUZUweKg="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.1_1578659829810_0.7774311419570727"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.2":{"name":"react-three-fiber","private":false,"version":"4.0.2","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.2","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-2FtZp6nx3XMUI1uznWUhnKKu8zHNxDJ4J6/iEM8Xbsc228Sezlsq6dR8IsenVykvb///6mfOHt/R2EHyVIHDQA==","shasum":"06385b57f98e762f31d694c387b432a977ea27b9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.2.tgz","fileCount":53,"unpackedSize":674027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeGJI2CRA9TVsSAnZWagAAAYoP/2Y9hiRqV3OS55yyEFfI\nl1GXqZ0HkG+FnihDydFrL7P2GOpkU6/P9W3cLHXVEBmr0LZrnmaJuzcJ9Gi1\ngjHmM/8vzc/leBpMFyzdw1cS9RNqJ5dE72gtOhdY0nkHsFAnDLXYmMRza2ju\nmkmok5wgdwzQvVhdhWiyPZlvigoZxuJzvRLkBkGbQvfseqNu/hADAiwlJ7Jt\n3C9ipYwQBWp3pJk1wotMEWxZ9Krl+meJVNPOtDFZaLIiglLum+GDc0Yst8Ce\nx0CADbJ6rksKaRWhiAZ/4spC0eVfQyrfvW620AKTrFJRxAwWYzpwStH01tX1\nwscHb8FSgwNGqz4ds4HirDmbFTGydTYBzO6JC6umK4HFlZ4D3UzQRXB2QlNj\n/xU189TmHevVYR74tyoYymEwujN36Aoih+7UYZiP75FHDmHdYOwShdYQ+ZMm\niD02Q5V9VpIMxNYXA1iFANNfb9GPyHqaham3bjEZ9bslBV/lg0VYBCyX6jbB\nwdv1F237vzBFWw9njpwlaiic+JTYWx3u8tcs7zv4zppfq1Gum61GImGfjr4T\nOP+HvyJOXQ+cB5Uu+rxqTpiG6+biXFseWoMMz83NsPOD8Qefcbm3DT9OvAn3\nyqieYBrZY13mT8XCZwOzTT7q2UljSFF+IpE9Qsp/cUkyiADIPlqwtdLYBEh+\nU9G1\r\n=Qh6J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCxf2QSWWDfNMG69Cyt05+sDWeM/hQIw4ExjMTXpy2WbgIhAIN3zniDWNdHeG/qIVYuaDukSQujkTeOobcpmnvFIsvt"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.2_1578668597940_0.4779476874000632"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.3":{"name":"react-three-fiber","private":false,"version":"4.0.3","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.3","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-hGeapc1Qtd3m558M9hwbEWfHj2+mPrpaBAl3GTocv/xxkd/Rm+eHjkot8BdVXFPlMhfY9L21QbBM86adCa3U1A==","shasum":"56f3ad42d00315d86b68d6e463c67e5ebadcc104","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.3.tgz","fileCount":53,"unpackedSize":674051,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeGKPTCRA9TVsSAnZWagAAhoEP/iXcPcc/3gBCH9b7PPL/\nmf5AyycZhRJqQYOMwUAkC+htixuY3b7Bz79hlwknZlFD2iYUulrOCh2ZiiBR\nmXm1BrC/8rWyUbai33VxiFE5bL733kHDKfKLyMGjHiMUOOosxk1tiX7gE89o\nRLGZg5ihBUdIc/rcWK4YNlCXTpBPz9CcxDUv6DUO2P6dDSmjGS5563l+kYwZ\nLMfW/dXUko6kixnRvtlQYa6670FNU03pMjIhmKOCfg/khK4touxRtBtOehwS\nJHDpZCnlrtLQNXywj8F0A6nUeOUC8POL4/jPaFTSp4MzuhgDZ6RxxqYWQuNw\nL4LSSe+syrdlaT7Eulny77b2bGoJcFxI4Sx0SGTFln8qOSyOIanzqq7+8hCF\n6uk/ITE+Lv+KjNdXy5dFXsOxhLdhgUWjClhvBLjhCwQxfslHbGRgI3fkP7pu\nwSrjM/0WrFGq1vmC6wlxu4syqD3C+GMk8V/x0L2EbjhNV6Tca0PsNaFolBHR\nT3YrGl3qb5XmDhFRMc5mNsv/fQKyHYw3630wLI+lVl71D9lATM+OMsTzdZlN\neQMAMQvtXK/Pf5XeKX97tvFC44871/kxRY48mMIX9YRJyMy95bjbZhYcZhgN\nSgVEif6fxCnsZuneC218XqXO5DovjHjQARrsBkUC5OaDecXtVdEzNSzZsN+j\nA2Jf\r\n=3y1N\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNtd6OHxHwil7GXwEWHyRngtoavzReMEM5Lu896KIwOAiEAp4GKGJWFxJvY+4ofYiHEfI2tQ51hWDGk59UJqkCc5L8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.3_1578673107419_0.6649676401100129"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.4":{"name":"react-three-fiber","private":false,"version":"4.0.4","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.4","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-cjG+gEngheziECL6V6Y3tWBU9BMkvVDlsuBqE/I82fKjadYpvHfRVYA7JFbFr20yS+6eOuwF0qkm4C9w+Y8EiQ==","shasum":"66e9e3921ef5f4115da14500b508c6a13a2366d1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.4.tgz","fileCount":53,"unpackedSize":674033,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeGK0TCRA9TVsSAnZWagAAevwP/R1KZ7NwRbB3/pjb0BHG\n/4XZao1aZBqZYC1v1noqgW0qiE+m3bW1MhZThQsbEdzvJRc52dy4kCP6mkeW\n9XcB1Yo67ghzWcs7UxdeNuqxgcvw/v+PwmFLj1bQbQYCotuzvR1CGSHt5HWR\nYY2XJbNUXmjQW/lr0wL40SAizC32YrxWI25cP/qJ9/F2Ik0hfwLB0eDXs+h9\nTzLQvhXrE/35h4bOMaigkT02HH5OotiQ81Jn6fZIR3gLrBkGB6UsgB65F23X\n2sjxieASvUVHMD69loPUM10T7+pm+o3a/tZKafcaQCHX7faY9qEkqHhpyLcW\nuCffxL7dj+3G3+VSY6CIePJtcFjIXqcv2DJMD+h/QWJ3SRxvDyWGBuKN7TT4\n+kUVbqI9FyXnwpScU0Gmqztbwegu2mmCWaS+Rqj6EZbE8q9MyUQ19mMCNQdA\n+0iwC5syM4ZrQncyGu0NOQ16TibZHf1XHei9zIxiI0ftFtdbWW+pTk8cXYeK\nQs38nmr68UmrnPMr+WAWLDnQsDxquSsJKTgrp2gp0TIjkbUeqOugXSUTUqW/\nSejwj+B9FRUOwjBSbGjDx/Th81z29QnL4Thixpl/nSMZalzBf+/pfCYH5cyr\nF9IsVKL8in0UCF1YgrOGK8M5725YavFqzsiWhScKh3uzFp22D2JgyAYu+0oI\npRsp\r\n=CR5L\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDG/c9tcTrcFE3i9yEnuYQbOgOniDoZ6/gIbcUfWu3QqAiAWP+dV2RfLL2p88cB+gMFbw8OaMJvvjkxVNQeu9cJk5g=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.4_1578675475161_0.8839287086787484"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.5":{"name":"react-three-fiber","private":false,"version":"4.0.5","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.5","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-Co509CbvK6DqT/Ktr7kaPsArq8ASzAtRv0vOrE4nyCQ4MDkoZBD6arnjcyjMrQrHKBZjj60E1zATv+5vqRS3NQ==","shasum":"d4e1677a1509fe4d27dff3fa93cb550176373c1d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.5.tgz","fileCount":53,"unpackedSize":674229,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeGM86CRA9TVsSAnZWagAAt/AP/2pJwoFRDL1x3r+4IeEj\n2giOQQCAPQ+IBV8STXHiWtJaIYjOYJ64fl3xcxUIdmI6nW9Pk6qAegUQJf3x\nZtgOxnMplxMSeVpOJYFh5cPbZsUohRitqCWse86tif6Eqxl6Zwm7bxOBisW1\nTEZu0Vuyw8GapR08aJBjHQgd/m1hobOdbpL9khGHkIlYqTVF4lAC58tLZ2Qf\nPGkrQV8mgxjdfB1AclPBFsTOQK0ZyjyNKinlu8z0C7tlns4F8ug3wXK5AeJ+\nyNnseGvTjvhbnGp6hhidMrcWZR8ZwM/haacS2nDqjznD5up+rEqhWRQ7AHam\nGhI0fCwIK2+RQenDsrFzdSqruZvHhUISR+TOW+qsH3L00W1Ba557UpG6nmX9\npJuD7CM+u+STUvqw1zjHcDhN7pAnEeMNHUjs8/bESB4JMJL0bkvbc2YQUSdd\nZ3h4OMVGOZP1nD0oqptlzpSsUUkEGmxd5dREILoFbaJb0NVCQMhE4BLEf24K\nsiiAJ+/S3BqzgDhSgUfWyXUv+KyB/gYVNPZA5ITeD06WjyR11vCXP/iIT5Im\nT9ba8J+06E5JlTgg2EUw5ZgtcEa2dCnL/XX+Zjgo/wFNXmyFguQcsYiDlRQu\nL8Yp201I0pUD4lYOurc7uMheZ09ZQg+ERdEQsfam3xOOohCTaDmMo2G9cq1c\n78Om\r\n=HJnU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+np59grSYRajh2OWVG4fYoT9jKU546Ym1x/NSp0LBVAIhAOVfmfSezr8dmB29SyMsQApLtRE5ad/FextV4TXLFSV5"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.5_1578684218228_0.26018538003445313"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.6":{"name":"react-three-fiber","private":false,"version":"4.0.6","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.6","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-wogWxRT2mv1kf8pLqvyHCupvuxKmFbPkpNZIq2mB+qhwzkagMqX5nUU7vAIe/qFIlYakoA22PDKZBUgwdU+ggg==","shasum":"d6e5a8d1cf9b6ba3825b4fa8794d891b59583f09","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.6.tgz","fileCount":39,"unpackedSize":613761,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHNWXCRA9TVsSAnZWagAAeMYP/2Z0QLiHJVSniR24qiWr\nKarb83bm11qgdF+7eVj1/zeIALfdFmP4NN63x0V0qEk52QdCtl/GLlp0M0/e\nPHSWNeKcrt/v8PE4GqSPeoZLw9N0GGlRkZ6cwqm+M2wmEw5YDpPcs0qia/Td\nYi13fjsl2qjXoglYjXETmpNd4cYr82n6/LftWsH8hNqSfa9atZPt94zq4fiN\n0UJimv1pPl4YMxHyKtp9/NpCUU2MJaDbTif5y7ydQ6Cb4Xv7r67226jh69l+\nQzY0OIMKzGK0JbRojvXaJQPeTYk5xQEtDed0fPk41EfzeofVd4z7mhH2U42x\nPD/uVTt8MpPydipUCcNiNN2Ir2V932UBY/3E290P48lUtH5+D3yIpxMTm7A/\ntd2TliTL0aj+i5ipHyyIjz1wBMyhgNh5pYpwXvV0LhMHfkSRe6zo9r1KuGmm\nyBiXDW6gWJv/e2Pb6k6paab2xa8xTLCA3FFV1MGpGAOp10aoA16r1eAS59ar\nvK5UECU7g34ZD13O1Za/f2RrKoSTO6K+kpF4HCiO1OiSHPZ/+LyXb1NJMzzA\n9HOMWroUJ25hjhFdV2bR38PrTDItfSIC8fE60lkTutaIjcVBU6KNpbgWZdVl\n9ZxSXaCmYOpj6CYDwP1dniHXptix7LAn8zi10dYRSqDrPwwULfHvaJfvPQYI\nCdEj\r\n=bqN+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDL/ZX3li2kX99Nn6TZSTJpITikPYCy0ti0Yvfc7CugrQIhAIo9YvhpSz6+QPbpQ29CMsIP5IB9kCLVWBxMcc+vhHhK"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.6_1578947990764_0.40369001397159465"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.7":{"name":"react-three-fiber","private":false,"version":"4.0.7","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.7","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-eB8nltPTCh5FqKRvaODwNtqrNgA/yeTaXLhwyoKQMW5dI+GJsjJyWAftRKQShfQvkG6FiAsOjZf33EDT1d7ZdQ==","shasum":"5461fb2e6d5dbc0c1bf8ee896fbd8de865442324","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.7.tgz","fileCount":39,"unpackedSize":601878,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHi5sCRA9TVsSAnZWagAAPYwP/iskHHS1ok2hr5yUhcMz\nMOlHAIZEucY4iOk+n37DPTx9FlXLzAJfEJyRTfiOiMD8i+lEaJ/ojWKav2AX\nGIAgZtKM4YraqXSCY/zlO34MzwH+fthuYg9lH/kv1f7ufRIYq17rULUWrso4\nepdNe6n++eYxw1cRhSmzLmv2HBp4xjKUvcQJOVyPeQLnMY/kWLk0Bl6lm7dk\nD4NlhIQom4YwgVLauPeb8isj0LIzebAV+y7Scz04vpp4lQz9Sbunt1mwpiUy\n20IuFC5AiM35fjwdGA78RqZxTcorgPIeiiWwHDSV9plQWWxEjlwNEz5lfG1z\nE+GUq/RXYxyxdmuhVFwvTFHBg+oFaVQjA4fAIF6oF1CZINzbB0h0Rm4QAC0f\nnPI1F+eajmDjI6uyZeNhVxi7nW3HO+glNR+itOCvxmOlINaS9SPm8hBmZOk0\nKuFmDI+32zfyIGr4vUcoTEJXPSFjI5n4E9Nx9Lr+LA8LSlfpy78R0FUsVOHp\nm6Z9SJs7tqJSoE3vVRrmr67jqIsLYDhi3TxjxiS+ViN7Gfm24YqQivVk1CLa\nYH0ps/DbemWoxdIytnxuEfQQzLGQtqYkSp7LX2gl9xIM1D7sAPxP9t/xxMx+\n3V/vKR4AdgrNTOzHhTmHOnFcewBb9ooHWoz/D24Rm8U/7tm7NgZNJLFYvv4U\nd9iE\r\n=xFq7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHYiFNaW0L/57Gb6i8+Z/2X1N1NYe/9GU0hBmnVUNl/pAiAaU/Xcv8LgS0t890R1DaWjutQgXbIfC/Ob3kTQCUlAWw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.7_1579036267631_0.4649738080392758"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.8":{"name":"react-three-fiber","private":false,"version":"4.0.8","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.8","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-9xd9q8HkT7r5N4x8UMJ89JSaMDbbnU0HAFR6pbE+K7OHvYmsRz1Jn6dUSZ40bivQTXMnqa1m+1fy7gP1O3y19g==","shasum":"45f1a35df51aa81f071092008af93c336015aa74","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.8.tgz","fileCount":39,"unpackedSize":605648,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeIHLxCRA9TVsSAnZWagAAi8UP/RX2jqvvHbGjypx1kRF6\nj6Q4RdsuHf3d/Yeq1sZGXoT4JI1gJ2uX/Crcvw2IXQgAl6yBo3ny19tKNyBF\nrR+kAaBjaGLhkqkRsr9W9A1Nf+AbLuzEdCYIxFNzdWHtbQVsfKAyOJXzhacB\ncSQpKQlHRnVwfg5NMOcNIvUNWiX4VoybVAm870sabiaQiw1i16Zj6+KHxlzw\niwyW+vjFtaUYk4VlJ9cThph0qLmqrc0ROtN1JHP3l5AtGlhZ82oDpd4k/+iQ\n3vXoOfETuUjjgesHQtM1d0Ji0MSUUmqVpeWJHztgtEyYnmUoGL6Rl4whRGEs\nQEW8WH3WB221NcfiDmiw+v2HLGv8rDRv7bMxlzNw1GILSgO9clUcuE+pmJF/\nyaIwMGMsXFLoeCbQ+7lGzGVSJz93wZ92RSScy3aORstJj6/idweq9Avu/0EH\nCfs02bXpPJqF4Rq2NxVxCD8nOk/2VwVWgCyZWIX9JaCS+Lmx4KPetLzkG9cB\nPDC23H9w45hzcmbwDWOhNFw2dQ4i95lIEkoJEgBF+Wb85jcHwuRjlWVBKQRR\njj4+3KnsD+qI0ixeU4k1TPML9f9OQMpoo2irI7EUyEV1V4Q4lRppmfCE9xRi\nFt2SFrzJaERtJ+qwjAzWyX9hSYZxJCuyhC4uXmgnJgyxj/p4rim33ngUj0YN\nQV+h\r\n=5leJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDozsgilNEtvYBsFoe6zn5C7v8CZKaQ8amd+qWqtZXjfQIhAL7wXtWAN5/MOYOLBQ6syYisaXWdOxASiFPFQ24rVTmB"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.8_1579184881272_0.15993945803915954"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.9":{"name":"react-three-fiber","private":false,"version":"4.0.9","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.9","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-wSS0U23CzhuuR7CKrr+sO9KmOOAZFr8B/djduo4OcDZ3FUNsaehAbKhMZZ3qz1k3QigCZvtF6z1P5SjYrLLefg==","shasum":"eab0ae8a1b192660cb69987d4c54bb30e5807ac5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.9.tgz","fileCount":39,"unpackedSize":606624,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeIsn3CRA9TVsSAnZWagAAVLYQAJcMzOs2i6Obr1kd9yew\nRKWq1hV4bRTDt6BRlevZ1B5PUSzrucdtImdIMCLxXZyOP8O1jJ7K5S+mZogj\nga5Phfg2ExI/Jqp+1YZPfN0sYn06MKBJCz8EWi3FN//DC0w11wNOK0aWOWkP\nvicN4ySIIfaGmucmIHmxn9Z1LT+e6+LhPFwMzQ3ZxK0s5j1X1cuqCLZz6vT+\nt4UyOiYKqS5PZYd1T6Bl9mClm8bqgAhq8aLj8komokUEmNiuNkbtPPs8CzNZ\nZbH8orYyqxXAq73NIT1lj2Ol1CEAiEWdqeACMswkVqkmm8ZpK6UWwfaip8w+\nIp1jvhAczzZCsqhyaepzbyuegUxJzDjUHpUEsXEa/ohueL7nJEeDSAvD00hT\nyz9Lz7rtjloToraYo7ehVhAZhdXssJl657WQSPCv/rrOzGDUlrpHsMxOVDGs\n5smNic/lIYaI9w59BzRMLIX/cip5FJCKEZBlf8/9SG3FVD6iSp2DduDvfI89\nne+ntVMW1G1SNBHAotdmXi8RGWn2YLBsIikzD2wt9rWzCwW7RLJ8OtA3i9jv\n1CmdtgJG1baSaoJ7EFyrucLbAbryn5vueTmXXJhO8zB6Ytk50QKNWPwaXAOd\noAJFEP09dajuedDqo56fNQ5JnYz0HgcmRFsZPTfx7Cvzz0Furn6vEIvsI+TB\n21Sh\r\n=wEXi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEBddDZF1gB/LIMmFu9GlaVC4vP1cjjVHyuxCX3QWACFAiEAz8KISc7p87uNBk0AKs2ZI4YEk/L6xrsLf4Vd5xKQnC8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.9_1579338230628_0.39611365472433424"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.10":{"name":"react-three-fiber","private":false,"version":"4.0.10","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.10","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-aHhBf8FghP7piAbuoYHH3yz2ouWaH/efbWaaAb0g/ZKQkIFM67LqzHLybK0ZzOiVOzMJXALEMJF/VV1cDeBjVQ==","shasum":"c29e8a9ae1be5cf194716c28abcac1204eca2bc9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.10.tgz","fileCount":39,"unpackedSize":606931,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeJvWGCRA9TVsSAnZWagAAzTkQAJKj4AeZgS0KpyJ7z4PI\ny4NI+OCkabXTdXpg8BandSSvOSQTvzD6KdmpIesgaSUdSG5Ywrduc0Uc9ger\nYxiw7GBUgDsWlQP7a4GRSQOpAyS6lAGauF9u7vyknpO40hVzG75y9qmK6sGo\niq7/S4/2Hpz07LKa35Cf5Y6rn2Sf/e1cxU31a9igLgoBP9nfGqwT/AxGOidL\nAvPfISyTEQAnXT3gTmBKknJ1goP5H90IgX+mOpHBnE+EnNdLxMtCbPHka62r\nOtrD0ahOQA6mustOME415obRd1qlk1edhSRiAtYFta+m7Hwx9F9ESwrAAsOk\nKBho3GQe4/kXAazWlohV7tmDRX0hyICVGpD+J84aoy2Xu2tdQKCLO3T5Ly+I\nkdGZBSMRvG73me87WmzSifo2HYLHAaMyiKDmqVDMYEcjGYUawNnEft/5GISr\naQPFeAqSYssbvGwUVX1pttiIoHlYUZJzr3EVTyiyN4k1z6Tq05Qjeu8ETdW7\nq7e4AP0nXFXlBK4hYL/F6Q8ctulALer3RNHk0FwkV29AUG2BeHE0ZKMrSxKK\nYwoXkzi+rcs7SH22G8PU0qLcORIYQFTSbo//1pmBac4hhAfe/kFYiSOS8OC4\ngPftTD/WyDj/ryhSzwsSDRDuDD2PCsGXLWW79KIgezG8AHCsK2QC/0wSzm8a\nYKvG\r\n=Ge8e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE78tG6zLqfFnJ3pIoxYcTuc8ksDyvd6RDonUkZl2cuYAiEA/0ciev5/flzNVbMQUMS5FMD3LLm8DLz0fFQ7vnRYwSc="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.10_1579611526083_0.106590042586032"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.11":{"name":"react-three-fiber","private":false,"version":"4.0.11","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.11","_nodeVersion":"12.9.1","_npmVersion":"6.10.3","dist":{"integrity":"sha512-7VUdwU1m8FJFH44ggkDc5K4Tjxzulq/wuDpYyV+gALD0qUGPkQFnu4GVx0U3fCGPnI95d6ju8Xshd/S5JNvZYg==","shasum":"6d2284b0c8ac93ce10292f387eba7e1627a5a1aa","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.11.tgz","fileCount":39,"unpackedSize":607306,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKFE5CRA9TVsSAnZWagAAA7IP/j+5rU3t2AJtJgpQTcHp\nMnjbaBK7/LmEqFSmduU5lux0HS4VJg4kLdHLpRqtDEnWqVrIFxzGnWN3LN8L\ndu+ZpZrmq+Ph8KxC3PqbK48XiBvsKFOsT8C+TI/fUlASZBOaYQjAP8hGI+oR\nQFhvgywshc6DHJtVZWrNhji00GbK6NaVFabXbw1iC92RaW8ChHbrZdHw+U+k\n4JqcnOauDGC9DQHshDobQy3rHIcoZekFUg6PpOmPP0fufVaXFcCGCOhBQ7s+\nyao1gXhuapDRBPthiB5bTSCRras+BOpXj9wlAiYH4bSKGhdv0KNJnDoRI4LS\nkHyS2+v16CLVQEUsmxOgL3epf56l1AT2FcXI60s4Wn/njgyu4YcgS/yWpf2i\nheZbG2/t/ECPlk7rKKLx/odvUYPQ7rAK5ouuxiKKfaM1tX79zFwgcrUpopma\nI8XmMmh8bYKt7iEQz1D7upSn5fcnsmSKyKEp0M4h0FmMTths/fm5ppuJHFz1\nQj01u6Ra0g/zGtYz6QK21du0B9eMtT1NoD5zlzAyqKMbUhWsu4hYmR6i72aS\nNiGtOHyblYY/jzE2IiDw8x1Td/ymnVIm0XaqlldTGS9SluSqNE3/3WZDNM9C\nI1NJRk8KG+HCZaMrycaciEENWDy9XB0iLGjPXyeVyxaUaYZjor5ENJDqt//g\n2SyU\r\n=xZQu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICRJ4t9PVyQ9n0VrYFR7TDgB8nlzIAonS8wFg9k9fccfAiEApzZP8nu2xlDpD8dbx1+J94IvE+AICk8ZbWqgiQSu2dY="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.11_1579700537027_0.7444511484093825"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.12":{"name":"react-three-fiber","private":false,"version":"4.0.12","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.12","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-+DS0XzNA+P1TnX+v/BCqeJYQzIoN1vtcQBC0dGBPEwsPr/kDJnfOY9Ri+pSl63vIXas/Y9mw5rOGwFl8w9MVjw==","shasum":"b1a2da73137cea49af91dfd932da99587ebe6146","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.12.tgz","fileCount":39,"unpackedSize":608899,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeLtdYCRA9TVsSAnZWagAArvsP/3AG2qzHEGlDZ66q57Uw\nz7872Jia/FD+D1Sr7HK6HwlkiyexX+uVnafnexuJP8ErACH5TJuE7X/7FxzG\n/wkRG3rqLcSw3aEfTGrWqdDMa/0LXQeXk5A8syJuku22OZMoRri6H7TxtwMX\na5WBV1OG/2BO5EItLrl04m9NMRH4DhOFPg6t/K1T5I7tnaQc2JWZaepMom2S\nSVExb7+HQ2obIEnE+NfVUZWZeT7jSjHWLN7UzRs/qYcbJ1yh7rW22vbTaH+o\n3DITkC2l/GyfXTa0TtOLXFXHNL4pvquYwAPYR46M81jzEuCK7RKHGK1q6PFG\nw+V/0P9WaRkg/PgMLkUJI5z9JW88Eh/ZvZXF11r8Tpz5O/sopZ8ouzj3Ns2S\nl9cEkYuHQLS5ALEJHSiuKm9Ln9EW9QvZKRGi5KBDQV8H/T6TKu+LRRQEg5gz\nMwsJL6d1zKqXg/qa2AsA+Ph2j8flM7uI39gR03irvQ/Tv1SyR7BKHEYnN5YM\nz87FfIjQ7iyQ7ehicNy1p357fCEFJjg8QTpCeNCRpC5H2ZaNwHyUMmrDXEib\n/RuHRPqICHcbBEB84YNizwjBAbVCXgypG143wn4I4seqvM8C2S9yhi3Ktzuv\n2nJQ+dfztKc8flpJfoMhuIMSfaF0uMVXKlj9rpTYyBhHENAPjRjif/s4AO77\nXN9R\r\n=cMh0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGEegIEA21iJ/v8VglntSZ8rxW6qDTbZTmuyNEurWCD1AiEA14ipC90Q1LZ1/ymSFCJIU79+SuzI7095EHKELG5ZDKg="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.12_1580128088082_0.2013716930704057"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.13":{"name":"react-three-fiber","private":false,"version":"4.0.13","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.13","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-s+BPKi1MYgleOgNu67SiovQN8imnE3kQNOdI/jiwoydUMeZewuT183I34LKHSk8UOoYfE/1usGXK0jCUcJXiHA==","shasum":"0ecbd99dece613be07082d57ea0aa40fe73593d2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.13.tgz","fileCount":39,"unpackedSize":609820,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeNuaNCRA9TVsSAnZWagAA0usP/30TukLtLOHJTComa1cQ\nRiLv6QUkMIN/iaNAsIIHMdNgFQ/ySmbTXzHddpMbh8BCjeoa20jW4sAGpmox\nLjz+DXRAe73wV3yREhtMMNuK8gkvTm9y5Jpz6nqmUkHZB2gi0BhgsPhr6797\nIuv/dPdsUF1zW5zInQLBHPVCgLUcoJpBynWBLY4bSVfOiyEZ6uaVGVHYsxTB\nCHIoPgA2dQ7vaJQNbqBRrx++Zh6KgJws+gHfTwynT3syq2ql947iBenY3Wza\n+RqEFbcV2iaqhqUdSyhc1xn+d1uG0O3iS2k63gDpGA+2oGVY5wNX+Rkk0X7c\nhJAzuz12jRf/gTKU2uviKXHlpUUTGrbvYnU1dNaMSRgHDlU3jGmsu7AYYOeP\nhuU2olMD3wUvGsjxpcWC82ALlrHB9qGshGgvGobwGcKm7qqSfzLzn6kGp5gt\noz/0dDJJd12lc9gHods77+t6E0bb0DqhnjpffJe9ZOCeEO/6sODHpW+HUB7O\nENSmKiLR0tjRNXgnugl+OYz76MGK3pQfxajjTRgCMpN52boetKKh+wlQ60f5\nuXwaKMJT2ILBx+dEXuVw6ujzfeq8Ded9JpWMJ701OR7xCp3+6UTFxoeGhLoY\niUnP56oz8Kl8ReoKWzXJKo9QPbnyYaNON5Vz9Nh0jGjBrXK7tBKXe84v24vv\nDX/+\r\n=9uvh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDVaylT6+wRIvSRHayy6gzr0shOwDkehEXBPuCfKiD81AiAT/5wUvUaVsjWGSYbViELfve7DUU6tjEVKhHHwtxVFMA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.13_1580656268642_0.38614980712288927"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.14":{"name":"react-three-fiber","private":false,"version":"4.0.14","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.112"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.14","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-drfcNAGmEq6333i9e2zs/hfDRnWlyNUhNx1PaRYWBXyZZ5WHYGJHdDg/T4VsE7YEAfDtw5y5JR0r7WV5feCc2g==","shasum":"f1daa98b86f8f0ab8f6ac1e0c1172895736547ea","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.14.tgz","fileCount":39,"unpackedSize":610060,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeN/6zCRA9TVsSAnZWagAAWgcP/2G7/pNn9whnwtFS+fYJ\ngPTrcUVPDIoud71rYhRTiRaezUDWmjz8lAA/GeZngq7dfPLfajVMsyIrrjTh\n7v0KxdLT1WY9zH3JeuHpwwWKYE4/7BcSbMyXm1v6QfsHwilLTLRyWeoluK7L\nf32UMeQalcZ8FXDfY6LSi9t+a3j+0V8UIvneec4p9ueh2OQknRCzdSJvu0X5\nIXAf3SrOTPGs/rRoPjIAfAMiitDU6G59yv1jVIz0NMUa9Z7GKvUIOYfdhh5B\nlGYFbnO645P5PQy+eI6e6t3bJzHgyJse8+bI15a5dvutd+S3bwjAs/S5pltr\nxXNKkCdjMwxuuC+3tvvYIBsDCsVmtEdZnLfW8fZ3HTQJSeKV8R+qL1sx7HVu\njQ37XZqtekHRzZfwvaWYGepf0GFEuWxCdQCp0rIV7AWY5Qn5G+S6mo5j/r9T\nWASyAY/O48AKvhi27e7wcRLjL8sAr3JK2g0oXRMHwKd1U0MGhUK2DEAPzFQO\nob4PA9/0OhW1mFuXeDVqovyy133//Th7gs1v4lBJZuMVkdRwl1dRCQhyw+90\nd1XQMFFcn+GUm6PNzdaupmWDY+jD5BZwb+ar2IgUz8qJ5fxKVva3sfsJBqId\nq/Tv6yG2hneskA6YXk+Gc1Mdh0JxLyQHeElbai6sggJe5/8b5cbOQ5nijj6O\n/CGW\r\n=/8s0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIqZ35j529n7Hdn+PwEBWOG3YTw5FrEGi9s/RYf1d8ZAiEAphiXO9TPNfybUr8JNYmYcUqN2p9YJwtLsGzURRfgfGA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.14_1580727986779_0.7231294643345503"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.16":{"name":"react-three-fiber","private":false,"version":"4.0.16","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.113"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.16","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-nkOfNBCA76P+Xtw1vaTRggR0djgfcpKCHLM1fSATJxbKLLtapCTjlsFadByrt7+EnKeHHvYUfdkCD1WtNnuk1A==","shasum":"8d806b687aa5aab031aaa51ae1ae1ba6410c3030","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.16.tgz","fileCount":39,"unpackedSize":608956,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeQUEGCRA9TVsSAnZWagAAoSYP/1yhMxcFNBu8L5oSjH7h\nZBexOq4Qstr7QoNMv3Qyxt493/BtRV9WXd8mFwf4WR1xi1UQ33qGKQIrueb+\nsEm5XzYrOXHec8mc36i+KowTgEeyik5Bg8LqYeglgmvBro+24Y/uUE17WNQn\n05ZLCEk6ourlpRlwS5m7sYbCFVVYDANzVfxEuAEPYzMFWxLLKBVuLcKVEDJR\n8YJgK36KiBdOF7yc3A6mVhvkxA+Sirhvbi6da3z2FSs0XdBo3RqdEHfqMaok\nFw4CWL2IV4s1t6aqmcTYtB07wq5jYCl3YF2OcU54YqEaRwgMT0FVIQxM5uQ/\n06Ddrzy1QPiZMErMu2Xw6LpH5aUo/qYeNUxbqDNMvJG7DuP0npWsjcsYbXeF\nLi6I0MxNK89jDqhp+iHK/Dq8ulBjpF/QwIG8LFm3DWW5miBZhcxTih7736gw\nFklXntSRrTIptl9/O0WZRJ/ez8Wx2LvzpLZBfhG78Rwz8FAPAWkFa4f0hl3S\nxiDBFHCf0YEY3Qap4UbxbLp343YjFX7CC0vQHvncE0qIYCIV4+9IsTOk72+k\nv/FsSy9ViFUOUAJNrKKhCxtoBSDl05SwphCaZkeOfZJK+ln98Z9GljWzX05h\nRH8vNA/iIFS28L6Bqv2ddDaWuHCi2w5Ybn9YFQb56cD1hoGddD3GfdJyRnHC\n84QJ\r\n=W4hC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDo8lvRtUiC2rXfM37QMya7SSUl9zwFooBBKsr+LTUpAQIgA1nXcCkuuyp/rNz29PABKUutos7pf5ocC6VIoVm/X3M="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.16_1581334789779_0.29406365329810336"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.17":{"name":"react-three-fiber","private":false,"version":"4.0.17","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.113"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.17","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-rjXg/acRqPJhmMrEIselR0m73/syfYhxk2RCL07ksS3j3kNVO+nLh4hPd2Kh4qd6KlO0a5n/g8RoeyDINf8oBw==","shasum":"cd6af5225744ba9c81da695ad0341956e1caf33e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.17.tgz","fileCount":39,"unpackedSize":613546,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeS6xXCRA9TVsSAnZWagAAdnUQAJnR9b6//Pqg7SdAwe1F\n1pwa9S6Qrnb7FCi67MEO3JufSaHStB02vvTi4M+MAEBljYsInkFgFZ7eNTbj\n8Ll1yFyXT5cSCWggzdfxbvl7PfteUss5wbyWvDR4UF88ygMM9uRY8pRimGmq\nuQqLTQ8YUfJo/Ktf+rZ22tbP00+MI53fLVh1Gs8jg1jqHMNoasKU5uPPcXUN\nnUOnaiZgTNm5Y3J+AmuDhtYWS0KsMUIJ6dCISxWCW2WTQUZLQzixg/fATWFE\nt+QUPjRJ9va+IH/pulyPv5XR/3+VJEjdQNcdzoBZ2SuZUfoO3vTEldXn1i4j\nGUhSU1SlQg+NjHEuP1l1sNmjr2XM5q2LEr+xlpJ3n58JI796G8zauf1pnvmy\nXHYYnIc4ODNlQJskLyuMQNG71YG0I6g/2r2rFy2NnXgg19Dm1dUwVddQUV1M\nGBUQ8hEINkl9pr1an+6C5PwIuyP9om2J3LGuykWm/gUy4QTtrGV1EtpPzyGm\nJ/kFhpV/HdnVxpL7Xwu5FZLv0+offuiX5b3UPr2gcuLsp3y+UZessVAW6gPb\nmy9ELibw1ga5Dzo6Hg/JgTJSxF+sWJjlegvVr4awasLv8rKiqpb6CErAJtgQ\nWeJ8utfMkN3j1TyNDCxtvImxVgUlVNILL0xPsWKMlhVdBzYEcLe8STg3ianG\nUCQN\r\n=Bb5X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCM6VTSHY+2+S+EcTKtQidRfKvSTMcpB1XRvwVCrF+I9gIhAO28Q33f8RD6D/cNqQiNFGJ+JyP+5M6xNHUlc129St84"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.17_1582017622909_0.042071578558850575"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.18":{"name":"react-three-fiber","private":false,"version":"4.0.18","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.113"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.18","_nodeVersion":"13.8.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-UyaOckcnN49bP+sdVW2j/wfOXEeT24F8lIusUX6zU3Pr+joWgpk1SBXeFxJ1K5prlSxEnoNJMofzgKEeRURKqQ==","shasum":"82f9924fdaefbbbd3e504af929eca09a958b23b1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.18.tgz","fileCount":39,"unpackedSize":613679,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeWV9ICRA9TVsSAnZWagAAA6kP/2J0Y133L+AVkHPtflRs\nL+uTYsR3D/26i6DEIwEqPAXusQMfV0pi9RZ9XwOMKSQQxdY4BV6mgLw82MF8\nsNRSMx350iabgqLYlKNsPU2yR+jSxsM/T59xE/JvNvaYlErWxyNzVtEmUXKj\nlttij0/fswr9XzF9Ep9+nrCzz3RXxMhZAhuHPdwlOAqqLjeA+9TkuxoWaLGh\nW54k9TpKZGrHAEXQthF+tFV55yEzsDPR8eq++WkwKeNZMGdzkg/dxgTo+/QP\na2mIn8FCY1SjujgsWMTJCgGW+1Y2ou+SgrGB25jqWnNhgS2xH3fsonvtjB8Y\nANgai7lHvDpdPJX1JY7fS4/2Z4RWb947izIZXVm68/NFu73gh1Rdnj5P1YLx\nmmpmTi28k2rjRr0UL8Ca50MZ4e+0XPeKV09yGsNnsGu84yHHJ3TbLQOcSx7M\ndaGkOdblHeyEf0S4m7djPFexd6wlnxJnxB13DcNDbC9N700ZCXqA0zhuNySa\n23EdgQ/2VcQH0O8eFaOBNxSYRbVzIkId+aTusYl6bHqUwWIqi3BmJxDykX/d\npeldB8m9/AEJ2AzdT0RDKN6UXp59hcDXxU1nh25bJ/glm4HUC42zPKc96+Ex\nLksfxqqySLjnLaCbRc6e6kOgqZfKmUA5MqXTxSO4hIKkwdW4PFBGV75DK00H\n8y2S\r\n=k/p1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDl4nn/f98U/zBgNEq9uJoseF+2+quyUKbdTQRPa6bdzwIgVglNfeyfZKp0o4AMuI8x++ZG2x0M8/NQn8kyNvw9f2g="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.18_1582915399410_0.3186758239861067"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.19":{"name":"react-three-fiber","private":false,"version":"4.0.19","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.113"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.19","_nodeVersion":"13.8.0","_npmVersion":"6.13.4","dist":{"integrity":"sha512-D3cMG6KrsyE9Oj+t0yoQpAMGSxkGOChoBjS9vmZjg32DUZ6NxRAXxVkEULutcBuFSLWek0ye8z+MUeiDwdqYAg==","shasum":"b266267df489152f1b4cc11607f8634d152cf633","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.19.tgz","fileCount":40,"unpackedSize":614410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeW7+5CRA9TVsSAnZWagAAXocP/3nEdAIWrYNqTb+KGeBm\nrWj2WsxISiRh1mpJ6eUbU9M8KWHvrIrKtQZTXuxo6xXU0b3f9yUgo4dfMW8t\nJzIMfYKatBUYHwjwQvTBZ0OyCB8T+JijperqNsgQXBlu38ZncicEKPfcJ45w\nT9E2SNS4npR6PpN4cFk5xD0Lr2xvX8fTEq67VMsj3rIz6bslSbqEncFsvrWU\nXITDN8cWXkRhMJH+AqM9JtYETzjMxdkkJCZl3MvDk/7rpU0b/cB4JmFcXV8M\n+SoUcRy9jeqv/CvrhPP7uMGVvgtKyj0MtPQJbGbYroZ+DZ45OojjxmiTflAV\nER/1ORi83tzo+rqi2+46epy4sfOSorsCoZt7wtODWskBNhAEQXqv/tLJ0i7k\ncDyNaWfkf/dq6xZ5KcnoJ+/Fs633Sb8Jn+sMKPEX+ymwAMDtMttqLmd1nt3w\nzPN70v30HVW45g3NFa+t0M4NLHz8i9slk3hMdOGBHcakAOyIKNaY4Rcwq3Bc\nvc8rlmetGGSftEixtnFulliwK2fMCbn0IE9J7s6V3q6M1ovsSUq5FTKBoiAg\nel5kVU6zmPLDTZwPVyFP15YARQHecEWAMnclRL3ZH/TOsp1wYskEAuYX4wz9\n+yha955/2CB2dxWteD+IJ0uD74mnC1xoiqak+EuCndvQ1KtUde5lWM2wyhxb\njD7b\r\n=/s/a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMnitrAOpXuqm7Irufzcs02KoVD3/ImH+Ba/BAGlYqjgIhAIumuXRWqIXIQoZECVD/q0/366R+xZtZ3G5lTRIJehNN"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.19_1583071160911_0.8311356302303841"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.20":{"name":"react-three-fiber","private":false,"version":"4.0.20","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.7.7","@juggle/resize-observer":"^3.0.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.24.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.18.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.12","react-dom":">=16.12","three":">=0.113"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.20","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UL0p2mQlYG/bcwTnxWNyDbR2KaKN/yXcZdAGqyzp4b7UUA81HEnk01wNZcxrS8RodYFRznarjyJ/emDI8tXKKQ==","shasum":"c043f504a97fa5b5f0472515c768cdbc1c840ac5","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.20.tgz","fileCount":40,"unpackedSize":617029,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeY4LYCRA9TVsSAnZWagAAZe0P/iI3qjnb2q7NqLdjw2HL\nW0mGGgKIsZ1umNMOOo3g93V7znTFXfyXiC1rwsB8v2NwqVLFpE272LM9Y96R\nGzYMR+SzHmPoEltPkd0q/Fuoz6TM5AGo8E9BmOlM9bFAU64xa/Xb/Zv9CVZ1\nawSkf0UHnzOed6kEuufUjVsl4bZOvyeDsyxb2KSlgmb/H3KmuY1g6CGjf3GF\niDC4j6/DqZmuhqTF/nBs5MENf8K9Vl4bKtHbCd8ZjQE4lNI5dfJDhzsYgsow\nh4QU0VoHpfEf3g6C2u3MNuwrMoHsJ3k1Kzrxz3aVVrt83CvIA/prfGJ+BwYE\nWltroLTDsvOi+FqF2j+4JfHElMI/Pe6SY1bAnRd8/Wl+ujc7bHHrldEIry4D\nQThkW5LKw1aLtkXW3ZbZ3pWU+kuv/UOy91bRHd2mltXU+7RbvUZbyryOxSJJ\n0QBeeOkG2VEZ1am7w5SP9k1oSEIJqp8XrasqtoX0sMBa169AVry7tWrTQj1s\n25sShKl2BeklNs0LnnRmwKNmp+KseyICKvdWcYimpRi5lgA7pnd/vkg3SK/6\nzLl8dbQvS7YGWnVJ5O93/o3yshdhch0VvAVaa5vcNxolASrJNAGHZ7YmhcwS\nSCy4rQexhFefsfHwBJunKzky6fgHijUkL0EiBAAAZv3iuWDjkC9uBxVfDVjr\nO9hn\r\n=B4+V\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBYzHws9w6JFTS8sMs9QtR2L3iu8t8yvKB/EEgflSABRAiASJ+s81KCZYxrosF8ssyuaYwidCj0XDnhhl7s6SCIf0Q=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.20_1583579863675_0.49922600361510505"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.21-beta.0":{"name":"react-three-fiber","private":false,"version":"4.0.21-beta.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.8.7","@juggle/resize-observer":"^3.1.1","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.114"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"[![Build Status](https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master)](https://travis-ci.org/react-spring/react-three-fiber) [![npm version](https://badge.fury.io/js/react-three-fiber.svg)](https://badge.fury.io/js/react-three-fiber) ![npm](https://img.shields.io/npm/dt/react-three-fiber.svg)\n\n`react-three-fiber` is a React [reconciler](https://github.com/facebook/react/tree/master/packages/react-reconciler) for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and santiy to your codebase. These components react to state changes, are interactive out of the box and can tap into Reacts infitine eco system.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n| | |\n|-|-|\nLet's make a re-usable component that has it's own state, reacts to user-input and participates in the render-loop: | ![https://codesandbox.io/s/rrppl0y8l4](https://i.imgur.com/sS4ArrZ.gif)\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n  \n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n  \n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n  \n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={e => setActive(!active)}\n      onPointerOver={e => setHover(true)}\n      onPointerOut={e => setHover(false)}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshStandardMaterial attach=\"material\" color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n[Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n#### How to proceed?\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). \n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [sandbox above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like). \n3. Robert Borghesi's ([@dghez_](https://twitter.com/dghez_)) [Alligator.io tutorial](https://alligator.io/react/react-with-threejs) will lead you through the next steps.\n\nYou can advance your knowledge by reading into [Threejs-fundamentals](https://threejsfundamentals.org) and [Discover Threejs](https://discoverthreejs.com). Looking into the source of the [original threejs-examples](https://threejs.org/examples) couldn't hurt.\n\n# API\n\n## Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_! It stretches to 100% of the next relative/absolute parent-container. Make sure your canvas is given space to show contents!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  sRGB = false                  // Sets encoding to sRGBEncoding, tonemapping to ACESFilmicToneMapping\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n## Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"Recipes\" down below if you want to bring your own.\n\n## Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too:\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it. Never add the same object multiples times, this is not allowed in Threejs!\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n## Automatic disposal\n\nFreeing resources is a [manual chore in Threejs](https://threejs.org/docs/#manual/en/introduction/How-to-dispose-of-objects), but react is aware of object-lifecycles, hence three-fiber will attempt to free resources for you by calling `object.dispose()` (if present) on all unmounted objects.\n\nIf you manage assets by yourself, globally or in a cache, this may *not* be what you want. You can recursively switch it off:\n\n```jsx\nconst globalGeometry = new THREE.BoxBufferGeometry()\nconst globalMaterial = new THREE.MeshBasicMatrial()\n\nfunction Mesh() {\n  return <mesh geometry={globalGeometry} material={globalMaterial} dispose={null} />\n```\n\n## Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n## Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates. The hook is reactive, if you resize the browser, for instance, and you get fresh measurements, same applies to any of the defaults you can change.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} dispose={null} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n## Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  addTail,                      // Adds a global callback which is called when rendering stops\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Links\n\nNews and examples via Twitter: [@0xca0a](https://twitter.com/0xca0a)\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.21-beta.0","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-9h6dKm4m2TRfo6x2VfCI0QCGqC61jAOKLwTEp0gpoxMeiI2tC+u2wSob3unEPsOmOb8av5/d+N8TC9MXTAo+gg==","shasum":"ea85e08adb0cfce7b17702df0fe99b9e93a7b367","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.21-beta.0.tgz","fileCount":39,"unpackedSize":613841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeb3NyCRA9TVsSAnZWagAAqYMP/jPjW9oGZVry7tUhQLqE\nGYS9bTuogCAQFI+J4BvIi/X7olhACt6YpcU+e6CKsVhNFr6vgnJ+2F90/tIk\ntF1wI0+0MqjmuDd6O7rC9b+nx5CYV6wzj2D/DNK23ja1dkzpd0uj3INnsQ3R\np7uGjXDoIYZtIjgmaLxMmC7WgJlBza4hb6ggUew+GZSRyzwdVhRjP7Uqu1Gr\nMR8OEi+Q8y9H9j7UQK6CdhiByOOybxm5OESJMrxguVTq9QeqsZJI38A+uOt3\nCVPTzjWq0NnY9WozSM2VsFu8d2R6APhG7wit1NzF8oEhngJqXESTa0/Y8Txi\nRjLdL3Wz0zB/pcB2/Sg0afFNOwwv20sUmpumLJt4i43/4OaMP037malAMnEl\n4EJSLOuPpux1SDLt2bOaaSVPo1Kfvt3zSUV3/nG+g1O4ygeG0NDeCGTXiJcd\noONVLBHrn8NtVk/TPWNnd0QgcQXqB2i24EmBAIQg8N2Di2l0kW+e0MjFLmo5\nsU0r2+ZWnlMNtvAt5xTDZWvdptzm3wIaak3coD9xM1NqxVu0ck9+HHT6gUXf\nRKC19HGS138xV+S1cyJA6CgRyHPUgZcunAgB/1QRkffu3qBNSyncJHIalBXL\n+jKHvcfIJtXeHagC/YzX4yam345wdXgFspujY/y15RZQ0AabPdbdjj1L583c\nikWf\r\n=G2Tu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID0uU1racC9FlDEkQ7Xxw1dAo49CwMWMx5fzOrj8F813AiAXX0PZ0sw1qv1YWmlaB+VYm9nNIHBolPAjR2whazNSpQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.21-beta.0_1584362353768_0.4386398351330205"},"_hasShrinkwrap":false},"4.0.21-beta.1":{"name":"react-three-fiber","private":false,"version":"4.0.21-beta.1","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.8.7","@juggle/resize-observer":"^3.1.1","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.114"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"[![Build Status](https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master)](https://travis-ci.org/react-spring/react-three-fiber) [![npm version](https://badge.fury.io/js/react-three-fiber.svg)](https://badge.fury.io/js/react-three-fiber) ![npm](https://img.shields.io/npm/dt/react-three-fiber.svg)\n\n`react-three-fiber` is a React [reconciler](https://github.com/facebook/react/tree/master/packages/react-reconciler) for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and santiy to your codebase. These components react to state changes, are interactive out of the box and can tap into Reacts infitine eco system.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n| | |\n|-|-|\nLet's make a re-usable component that has it's own state, reacts to user-input and participates in the render-loop: | ![https://codesandbox.io/s/rrppl0y8l4](https://i.imgur.com/sS4ArrZ.gif)\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n  \n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n  \n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n  \n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={e => setActive(!active)}\n      onPointerOver={e => setHover(true)}\n      onPointerOut={e => setHover(false)}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshStandardMaterial attach=\"material\" color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n[Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n#### How to proceed?\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). \n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [sandbox above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like). \n3. Robert Borghesi's ([@dghez_](https://twitter.com/dghez_)) [Alligator.io tutorial](https://alligator.io/react/react-with-threejs) will lead you through the next steps.\n\nYou can advance your knowledge by reading into [Threejs-fundamentals](https://threejsfundamentals.org) and [Discover Threejs](https://discoverthreejs.com). Looking into the source of the [original threejs-examples](https://threejs.org/examples) couldn't hurt.\n\n# API\n\n## Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_! It stretches to 100% of the next relative/absolute parent-container. Make sure your canvas is given space to show contents!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  sRGB = false                  // Sets encoding to sRGBEncoding, tonemapping to ACESFilmicToneMapping\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n## Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"Recipes\" down below if you want to bring your own.\n\n## Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too:\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it. Never add the same object multiples times, this is not allowed in Threejs!\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n## Automatic disposal\n\nFreeing resources is a [manual chore in Threejs](https://threejs.org/docs/#manual/en/introduction/How-to-dispose-of-objects), but react is aware of object-lifecycles, hence three-fiber will attempt to free resources for you by calling `object.dispose()` (if present) on all unmounted objects.\n\nIf you manage assets by yourself, globally or in a cache, this may *not* be what you want. You can recursively switch it off:\n\n```jsx\nconst globalGeometry = new THREE.BoxBufferGeometry()\nconst globalMaterial = new THREE.MeshBasicMatrial()\n\nfunction Mesh() {\n  return <mesh geometry={globalGeometry} material={globalMaterial} dispose={null} />\n```\n\n## Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n## Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates. The hook is reactive, if you resize the browser, for instance, and you get fresh measurements, same applies to any of the defaults you can change.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nWhen you want to share and re-use resources. `useResource` creates a ref and re-renders the component when it becomes available next frame.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} dispose={null} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n## Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  addTail,                      // Adds a global callback which is called when rendering stops\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Links\n\nNews and examples via Twitter: [@0xca0a](https://twitter.com/0xca0a)\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.21-beta.1","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-V6f9nRsxKJ7EpziszV2zEGWUGZW1W+P1mqZXGWnfmVyugjGpF7ATOr9L7mZt6ylkzd9cHNM5o2gSnVscf7b/cA==","shasum":"e828a1c0d61b44f33ac72d2cbe4240690779479f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.21-beta.1.tgz","fileCount":39,"unpackedSize":615681,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeb3UCCRA9TVsSAnZWagAADnAP/RMVT3qKk89uZDSl4+Wr\ndR53vFvFG8Bfv4VroIfZfuXFWEwp3/3rvKJniHoehqvPJe6lw/wkZ2aGYq/X\ng7wBKqofmcQiUaQx1RLRO/RigsZPyaojasSN8Iw+Qh4WtLvBV6mvsRFlQSAs\nwSEzzGhK0MMhw9JnZlG2ptcGMernxEmTyTOI9BB3LUa98l5oTuYJBmez39/S\nuHWQq4FGEpRiXn8nqOXAS8c9KkQYuVcAtuTMHsGFYj2ErirkShZptHVr3DrI\nNHBN0l04DRknenvQEhIdfuSaMvLQ7gQwQIH1FBukpwA+VAYGuHBHUkBVbiRI\n6+kds1MGQ+CFvyVgKVmmdHMOc912fCeqN7KavWsq5muSNsfwRwhSkAED44a2\nJCdjH4/txnYU0/txENspOssmDI2kvntujNRIOytKjkBVkYODh95tu8BBDmL5\n0MCa/6MLm+TyVCua5B4M6C68nzuX4ie1Y7yTXOBzOejWqarR7AkUtiTD0dop\nl532g/k+l7pfcZ7g1NbVsXeGlfglkZ0uICOGxQQco0UcBN1quq9Ps0sAqR7+\nja/AOX+6HAE117tklyGwq9RCrxZDc5DPhldUZVLDwCrO4wvcsxnaUs07Pgbt\nKAWOPirpnp40EMwW8wnwvrgdb48UveWiScyjJ5yTSe7o8wnQH4AZgz/kKT+L\n56p1\r\n=1OCi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD6shXSrn2305HzaVZr8CYVUa1/iJZLpBsEuL9nwSmvBAIgbSJG2P83W4ZqpEXMqGn5Npckg/qvXmjeidInDkZlRBE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.21-beta.1_1584362753819_0.03567246720326711"},"_hasShrinkwrap":false},"4.0.21":{"name":"react-three-fiber","private":false,"version":"4.0.21","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.8.7","@juggle/resize-observer":"^3.1.1","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.114"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.21","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-mCd5cvN+tpvhi8tWrmCCKzld/t//NUNKOy9MbuVYiDZ1SgVS9xfXEUKOfRwreMv16VD+EfpGgfoJBw1QTp+2yQ==","shasum":"4c5523da83d68cb3ab8d0042a9a43e871a4db76b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.21.tgz","fileCount":39,"unpackedSize":615604,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeb3dECRA9TVsSAnZWagAAF+4P/23XxrwRayNIrErJI6eN\ndoHdsX6dB3U4adPLWyM4zIwnIBeelKAJVnewK80YzqVAg15c+4GQd/fHg2i7\noA2/6umpttd5HKvwsaDHa1+7gngR0QA0W9T7osg80JGcu2Ddem1eqU7Es/D9\nUa4dXd5JlgC7lwFaC5M+C7eFxZ5GXW4Usu8F+5mvjXImn6w5oOx7rseW0FW+\nq8eY0TArG5/aeDFrWJsLpe/ww6Fiumg7qMHRX8EK3omQIqW1aujaH9SjmmuN\nR/nuC6UJe8cp3KZd2AAhFxjeNOC36jKwUaGhx+z3tZY1et/5R+HCq0Ze+LS2\nORR6bnXGfTm6cJ/SkESXS6ZJIpMhRqkAA6+G3ZKAcCv7DtAdbCFkaJNwBE1N\nTFblx01KCQKH93dzXZzinJsdQcXuVDknY3fgL146Ou8/PIp1imDzCzD4/+3X\n5lMwey5/vdZJEgy8u9qFmCqV1RhGwoLwVh5VfW2MzMzqe9H50iYEHHGCNtcN\nryaKqd97LtiQIO0SjWeDTKuS7gDrSs1CgngD6elDQpcym/BRw3sYuZX0+IY3\nLUWd/dEaAiQoFNKAMP4kiwb26qS6ZJJ+hQ9PnTaCYtRggoCjL6kPFU5DBNTb\nqcPjkQpMQd/Nc5dV5LKAF+evFwuLgDdyIOp+NsMMBqaFZF7bi22/b44VY0t7\ncuPx\r\n=jKfz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHManGNzk5DUR/iGEbHmS4BTFZ7Mx/JIpICgG9ljOjLMAiEAz8o34R1YIlznDq72cQ1odhpcoP69GyXQW5/NWMRgo74="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.21_1584363331551_0.726206555723079"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.22":{"name":"react-three-fiber","private":false,"version":"4.0.22","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.8.7","@juggle/resize-observer":"^3.1.1","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.114"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.22","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-sAf/9WV5r3j3FIPXOV0vkv40jgqGSYxIIMF5prZp9nS6gHOWWiXkS+HeD6uO1QU4it/GnrGWLGd0cqoT8Ba2hQ==","shasum":"a0604ab0b581f2671859c222276a50159e9feb13","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.22.tgz","fileCount":39,"unpackedSize":634136,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJedd/bCRA9TVsSAnZWagAAVsUQAIOFu47nWsSpu8OEKuum\n7wBnxmFFJYcCKY1iktFblMnQISFwMQ+WKgb7U26EsOqU74lehFhMSPcrwgAM\njNi4EWnTrEzttyIzUWjnx+Ja8IB4K9QQHhKJzi2OnXr3Wne3mZcn0WguOldu\nTry5sKAgvTPYZtYw32R5XuYIfIFRGt2jS89qxjxSum2YyU0g3Ng4Yr/YbDwf\nEUUrLH0uLTO1bfe7p+3Ke69FxvoGHDJY3Uq91HnieYAqEKTsjNqBFBKk/kep\ny6VMoQqADSMFIvwnBfoXzmXx+cqUyonxZowDR1ewt/5Q35QnsbmnlJDoFvB2\nBYIgYYDetuwBMViiO0Tc5QlMAW+VdUrLoHZM4ASIyWxtTaUijeTZTVbxBCa6\nXrK9imaZ3+Qtpm1lI3nJolXkTboBb8cXRmRKQZi1dq7CX7ksKBbK8l7Hqoww\nP/H1qSM9slAyXwiu3YPe9atMT/T1DG8NF6O7NnO5nOUydCxpbHZElv5GwxOW\ncUKuLv805me7KnpyyT1tkeHk1uCS1KYKBrCn4cGpj27jBjP78orOEeDZNFrR\nCpIGzI9EBp1Gi57q7ODTo1YDuiNHBZGBeSBoNQq648zw1Sf87beBD0oLFyYL\npFzO0YGXEGjOeiwVbqXk6qkq7YLVU6/an/PZjn80C94pVRu7LNIcLkih5HJW\nt0xa\r\n=JwIv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH6Swyhque8lkbh3KNLHm0uDasvIg7Kd2qR2T/lt3OigAiEA/A1OPZex085nPGvph9WZsNoi4faN9AjCTyvQ27T5oFo="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.22_1584783323112_0.6643978939278143"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.23":{"name":"react-three-fiber","private":false,"version":"4.0.23","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.8.7","@juggle/resize-observer":"^3.1.1","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.0","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.114"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.23","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-ZF15NoHsXFp6MFblNMAwVpGxo4TRkPeJ045Za8lcelRaaTHlR/ZhoeJWqyGfMHTWM8Uzq8w2qjgQGGyx6xsMZA==","shasum":"a6165d9484bdd9914e95a5c1c789e002be914b3a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.23.tgz","fileCount":39,"unpackedSize":638476,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee3QFCRA9TVsSAnZWagAASLsQAIhSZqZYAz2igF5siIKt\nFHdhanTPhps7Txwd4KCA5RR2R4hkjdjdYbFuhJCDD/UJY0X/Gy2Ka09w6seC\n0UO1DCd52ljLiSWcSIWw2r6Erb2XV0xcPETZJ9tCNItad+3FpPIY1ujOIOQG\ncWTvCxL2BtX2ZWnfZanf1T7inIronqBe4YENpXtcnwX/vXtdF38GYwc9KUJ4\nGnvNkyUYNOdyGtP63kspxADFhHr0HE1byMYUBndZydyrvIkE6h4CYredXLyG\nwUt+ES/0aLsEFoiTcbWt9fhNqKrWJRDUzJRJUj5Z4/7Vv26fIh4n9/EUrqgc\n3lswQ2LaBVbtOshisf4r2TCXcsjALutxGUwhldl5sD7VhUhRsiZHZGQcLQ5V\nYY7LafjZhyGPDx0iO1hyUysuuFq5Uik5tKzcQI3pfQboC6ClaCRnPCSiNcK/\nHefco9/R6ZA4b1N8Z1CAu9NfhGi6GXcJpyq16oKbSTmYgn1lGCsu8dhk0UCJ\nontTq+LkVHxrNEhyjeThcIK6QLdgr2EiugW+Y5KvFhG0uRf2ulihgKljfT/N\nk25HhRxMd+3wy9OjPAhmQF7z8ZdRTA2oG54UIvDBTSYN8KLd4pNvW9u3cUQ1\n6pKMNDqC+7HsEb9UMBOXSWHqZ/jxbcoWuPB/Tg7DVFq3MuWGSemU8qx40jxE\nchwh\r\n=eshM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOIt1sFZkCnTna3/K1a3ePuf8RS5oQCuXCziVxFigoUwIgd0kjoOTz18hlJ3Mfe/3gMnAvimwug1wCaehIkbhcbgo="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.23_1585148931672_0.3879310496029085"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.24":{"name":"react-three-fiber","private":false,"version":"4.0.24","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.24","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-pVDB1wdsozzdB9kZBB5s+op7yxCfhi+hOeOGrYnL2eGKvDeMIZfNzUKEXkXtEiuWJntH1ArUQxiKnzrL95QqLA==","shasum":"58ae9d8da5b213f5553020f39a7f23fe5f6fbc75","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.24.tgz","fileCount":39,"unpackedSize":644045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJegxWwCRA9TVsSAnZWagAALWAQAIpBvnQQxCfseFrazayC\n1ChQ66NcN871VwrTiaTOM87NUO+zfZPGK/PeLybMgpZQMLqxZO7E/x76JnFj\nGrIWBMPtXT4lye/7ElnoO45rQwNcWhpJ3BhpkzSFR95T9BbQAzBbekj+eYPV\n67GxyClk26BUrZzsqbWzbTUw0d2ktk7rLVBm1GOfF6yj8XJQWJqiMoTNJjCL\n4nB801l9X8AhZOlC0V5NXZuBvVEd6NInEVK1FyFNlLIC7WAR19vYOim8M5S3\n2L7vC6uKy4GRsVAzd8YCOuFNepG0L9JIsW4y8D75IdcmHUGU6AsiCZ/+3QA3\nU7iWZxFz+9xkBmADrSFhjSL3Wi0km6uB8NTq37sLMQiwc2O0GL2dRJOTLR5i\nGLeEp1yvJW5PDddOKc+p+hZ5b1D963EZbtxGrV2XXUcy0Wyg0Zpom7E8g8Ut\nxYeROkNtMhI7ysNknTCYN5ah0Nhlq4ht9ll7nvpNjHfwYu3vqqsL/dyPqJ5q\ngeaOgWEtgefTIt6oB+GBFWHv8tlOusbQBNqBzIb4FJx1cIgfsUP2b+sO4Ya5\n0bMfOZ/cGEvFb8rUIRgUieSxcI14RiI3eMKyQbZtf7v4zm0OZpZvINo0R1Sl\nHYXFtUjcBx0jRO20Q05yOJmGXQ/8dJmNviJgV+d5oCnlxjE+KAM9kVYrSMVI\nZ239\r\n=2JqR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCgN02R9hHbQGQvBLSr2hMgD1n3r5tJF7dQ8rkXv6rpmgIgQEHudaWU3qBnHZ+k+AMs31HykeH2Vqgy+fiZL87SGjs="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.24_1585649072171_0.414108028669794"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.25":{"name":"react-three-fiber","private":false,"version":"4.0.25","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.2","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.25","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-0lviEXsNB6G+QczQ937Sac6g6+dnXTFcUBZMb5vtKK3nr27UgzIAKT3xglgKKybSlIMs+wJlZNlSHc02SxtjAQ==","shasum":"222af36e0df23b5d99a51bd5062db4f64214b4a2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.25.tgz","fileCount":39,"unpackedSize":644165,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeg2iCCRA9TVsSAnZWagAAluEQAJWyJYFmjhCx7DYTI6fD\n8oQ48Sje/NAa3CPfOUqEBAFibkJwbjExYX2DEPycFkgAttirTYwdf18tzaR1\nZl67K5d3+BPPz1holAoGGkp8t/So6Se/7o+8yqFudxzFAWBzDXi1lmyMnexY\nKgBshCgNH7C7PI0y4+VUYBocJKr7WVTg1Gwdr9mkBXQN270Ov86S3bsBS3ci\nKS6HzrsQ6GSJE7YcdH7FUI9DI3nbP9kcwll5zcfKXAZjJ9NhQt/k0FtapRuR\n2OqJptLNKhfW+8waXhxo5PGbfqX0EehwQGT/JrfbEfJE75qS6w7Kr9xh+PIr\nxfn8uWy+Rr7PvJyonkpnkG83d0ezkk1oYw7Yf8mB69Gydxe82mLOy7LT429V\nxCfH+DxXBowo+lhC05Ryu2Og43RYwkh3gORmbfkO6pXiZQxGeQ0Jqs5E2Bu8\nCIOSsF6gScuZdGDsijZ9UBSADVHhIwuVJISf2MZpN7dkznPuWMekeMunQ2Uw\nLy0ttPr/N3ipdqJCpuSRkag0RmrqcfJ6kEmLb4qw4ndpwPhZwyCSZzhB4/uM\nJouMVIwjFnDbs05QwYK2tJCxJV5ezXqLqGQMWTHt8g+g+PeAn3VLFNgWqb7C\n60UqPvF2lF2RHShIasAgtHoxQwUmtSiwexpN/8l6PMYuvGGZe6z/lp5+SiIb\nRO5V\r\n=3fY3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCmeJcaLcMKkh0vyJXyIkuQQtvZcX3l2z3lhBuNqMoFYQIhAIx9dpes0iQSYAGwdpfY0VK8figyrBMB18OZe0nwL14K"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.25_1585670273543_0.6678999611282728"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.26":{"name":"react-three-fiber","private":false,"version":"4.0.26","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.26","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-KvkY9u8CMgKoTWbyKtTnthMBf5hbwdYcRpzkBuIIg/LclveNl85A9wyH+37j4xY6xRa2HIZcs3oJmE6ZhQAMSg==","shasum":"2af0a10a8dafc6b68e0e1e098135eba8df39ed3e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.26.tgz","fileCount":39,"unpackedSize":643790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeibPkCRA9TVsSAnZWagAAv3cQAIfYLBMRr8CPumOkF23f\nL7dUaPTBiRs9cP4pNbNZpwzUdh2QF9jIuGt58v3jZCcgESDry6n0ZxhSavv1\nWyUXGD0/3eIVUbdPQQLN66Jb1qmlAayKs7qRfarqVmlO0dMmqrF7OXmKvxO/\ny/PmIpK7sx6n49p2YF1RPeH2Y0KKI2X2alK5rf3KN9MyiAmZSHwMxCQEMh94\nscbc1RFwCl3Ik/i0W9xCtFMNkU3hl1jpqM0mRk5ADPQ9pkKppCigShf72qGD\nYMp1StFBNyYzG1Uz0opLsL726+9KHcPqLaIRWRc8kitm65afcvCmXZhN4nlk\nwG1ezT0UhsE1U/3ZBFCe11ZQbVd4IbhtOVNd0t/AyBgQb7+YtTptXVujX5dE\nYOLf9r787jYpCrqwPKleDAj5I5wUhUIgGsSum5RVkNE7qB2S1p/aEH+60Y3h\nCOH2MZu1wk0bIXcim1ikIq/2GWlIXv065uqR0rVyIdHiHLA+lGk085pzqJUL\nl2vRsSITxqLWVhAg++GlF45V4WdLBJfIZVJEuQaXajj7vLuYtICNCrWq6LVU\n23XE1+ZdlSrPanzTaRcUi+Fk/0CQTWNmqE6GuzcHP6UwSk5lW8WYMppFlvv5\nixP3QurCcCyYxC4xjD1HCxHX6ETodskYRyVIodnsMzsr5fdMcam3EY4/9A6T\ncCCH\r\n=VOyO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBJC1OzinW4kpi091TzKM9GTGBi+i4BMiv3YjuOtTQQAAiEAnz8b4DtZmgiyqNPujRgI5xv/s9SZrA0eBC/o5yoihX8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.26_1586082787940_0.1912875614213161"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.27":{"name":"react-three-fiber","private":false,"version":"4.0.27","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.27","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-tvuvFX7vCJN8pgwj6FijdjSXp4AVDR6+AUf7rqg0rWcIMmwr/ztk9mRolum1oPD8Zt6X0Btelo4mFxpOSMMi+Q==","shasum":"92ef0745dd437552009f98bf0ce0e5fe8532c17a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.27.tgz","fileCount":39,"unpackedSize":645800,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJei7kzCRA9TVsSAnZWagAAsaYP/1O4h/b0CCt+ns2eXIu5\nWXLvq30ykkX8ncYHrzpmTCYhdGEZukGOmWcy/PfsYLWmnXwclVaDotS7Ifee\n+/M1sNGtDaBRoRKuMAKxdeH3zxqV82RSS0Wwf99UD+S7ZHfjfh2j8A5wmDzK\n/Vnwgylrpw5gOIz403lqfYX1b/MiMm5UQQNJVHhRAHllpGuzPA0BMPY39a3Z\nqHhDqGn4L+s1OO9Fd7cU645xCOzR8JnLDetYcGgE6jK8l48epHXP+JH2VwBA\nbZbFmEQRpr87MGAJyedNcXw8V5kpAeaUpUmUB9bP9cHfclKPTa74u0ZZfOj9\ntGpwz87OtM46TH9Buyyq7iobmi5iwIpbmORm+JT/EM1+kcUbtcxgl4LVPLoZ\nyJpWZFKf8K4qmiS+KDMuw7btTX4UrJ6hJufc9pVdw14Aqh+S3gcXAM7xer0r\nuCBA3PMQ24mvXz7mhI9r5JANNquyhp/2jzy9Mv4WyynRJY5SrtJb6YXqFM4x\nJbT3FIgooYqkHA3WU36F5Pnk8B2AsMSFnY3spXVB7uA1xWakonUWQsAhtN3T\n4+qx0YmIKyUHWgQX+qescbFndgLXMTfXokMucqkRKqscRDJ3YsMEzg3vUDSx\nY1ny3DgmaI8CjOlGtoDQBE1MlhoXCvQy056CbB8Cn27Ire7AeutmGKgazT6d\nyUCk\r\n=hl7y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDMECVyXYJO37jUMMr5eWXeU+0Ud1c7DCVMGW8giyW6TQIgV5lgD7MyXjXHHod9Sz3lvCorHcyFJrF93MCq+44X2HQ="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.27_1586215218721_0.8974543579481029"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.28":{"name":"react-three-fiber","private":false,"version":"4.0.28","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.0.28","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-5vWXy6c76okJk1XZd4vhOIAEDKtICcH+eSf1zH/Ztae6/NM8Sz36cg7MhUDqvqRxYLoxtztxtZts0/J2zzM2lw==","shasum":"3f93f726378c0c1eba0a044f304e72af8275e236","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.28.tgz","fileCount":39,"unpackedSize":646018,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJekZASCRA9TVsSAnZWagAAM9YP/0SrX55MUqoh6OzreOWL\nufwO09qKnmBlgRruN3065bn11kDVtxofWORXOgUJMcuR8KC1HmuZC11AXqv4\n8lwcyqXMzPMBr//w0GGrtc5HroIOOR8HPDBMrcGYThhE8ERswAC/z8xaioqM\nCymPvsMpCzyg7XYuyAm6b4rc4RQ5HEHKPMde2HzyDxlF6r01IeZh2a1VxKe9\nC5wrfIYnFoH5gJoJEzC2cCygIkfUVoDBX9mETWPVFrazZJOhCaG79nJRfqOV\nae8WkvhXyH8/BXsAqeRkrvTzqlzP1VtrSJLWj+KpUCTbGqwGot8O3bAewYVs\nbOXUdNPZHjZyQtyob+w/2gQQxddDedi+nP+5X1QYyW93f2pDbIyV7l5kScpI\ngnntqGVucIIAVtEFqTY5Mp/nzS8xb75HXUeheJ34SC0UKlllLGFxdIps7VRL\n7ILxJnxZsfc7l5qoEFjTQ9QhjH1wPO4O+wBWmt7COFwThALc40GyQTo4Uexj\nFW/qqcd2McLAeklqoNhuDpVZekJ4Pd+vQ72Eed90VvxLJrtyWJL87YTwcKUH\npzXDwZtvKJL43zjrqWL1X8w2bL2J18SmBNF4PB9kniK6qMjPb7L2L3nEC6Of\nVtKP0bULbtMZP6wbkAFPFP8CfPFtNq/OIU9gLMM9ZOg4dsdaVNfOsXVbHR3Y\nv4oZ\r\n=4ZSE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFlyFIAIjXC0ebYqbI5WRq1HreZ+uwWR4RCYFl6re7qIAiEApgv1QGgOSVtgyTL/GvEzECUxhAzQ6kb/RYd6ZbRaL64="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.28_1586597905654_0.8658005802453594"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.0.29-beta.0":{"name":"react-three-fiber","private":false,"version":"4.0.29-beta.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"[![Build Status](https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master)](https://travis-ci.org/react-spring/react-three-fiber) [![npm version](https://badge.fury.io/js/react-three-fiber.svg)](https://badge.fury.io/js/react-three-fiber) ![npm](https://img.shields.io/npm/dt/react-three-fiber.svg)\n\n`react-three-fiber` is a React [reconciler](https://github.com/facebook/react/tree/master/packages/react-reconciler) for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n| | |\n|-|-|\nLet's make a re-usable component that has it's own state, reacts to user-input and participates in the render-loop: | ![https://codesandbox.io/s/rrppl0y8l4](https://i.imgur.com/sS4ArrZ.gif)\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n  \n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n  \n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n  \n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={e => setActive(!active)}\n      onPointerOver={e => setHover(true)}\n      onPointerOut={e => setHover(false)}>\n      <boxBufferGeometry attach=\"geometry\" args={[1, 1, 1]} />\n      <meshStandardMaterial attach=\"material\" color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n[Here's the same](https://codesandbox.io/s/rrppl0y8l4) running in a code sandbox.\n\n#### How to proceed?\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). \n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [sandbox above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like). \n3. Robert Borghesi's ([@dghez_](https://twitter.com/dghez_)) [Alligator.io tutorial](https://alligator.io/react/react-with-threejs) will lead you through the next steps.\n\nYou can advance your knowledge by reading into [Threejs-fundamentals](https://threejsfundamentals.org) and [Discover Threejs](https://discoverthreejs.com). Here are some general [do's and don't](https://discoverthreejs.com/tips-and-tricks) for performance and best practices. Looking into the source of the [original threejs-examples](https://threejs.org/examples) couldn't hurt.\n\n# API\n\n## Canvas\n\nThe `Canvas` object is your portal into Threejs. It renders Threejs elements, _not DOM elements_! It stretches to 100% of the next relative/absolute parent-container. Make sure your canvas is given space to show contents!\n\n```jsx\n<Canvas\n  children                      // Either a function child (which receives state) or regular children\n  gl                            // Props that go into the default webGL-renderer\n  camera                        // Props that go into the default camera\n  raycaster                     // Props that go into the default raycaster\n  shadowMap                     // Props that go into gl.shadowMap, can also be set true for PCFsoft\n  sRGB = false                  // Sets encoding to sRGBEncoding, tonemapping to ACESFilmicToneMapping\n  vr = false                    // Switches renderer to VR mode, then uses gl.setAnimationLoop\n  gl2 = false                   // Enables webgl2\n  concurrent = false            // Enables React concurrent mode\n  resize = undefined            // Resize config, see react-use-measure's options\n  orthographic = false          // Creates an orthographic camera if true\n  noEvents = false              // Switch off raytracing and event support\n  pixelRatio = undefined        // You could provide window.devicePixelRatio if you like\n  invalidateFrameloop = false   // When true it only renders on changes, when false it's a game loop\n  updateDefaultCamera = true    // Adjusts default camera on size changes\n  onCreated                     // Callback when vdom is ready (you can block first render via promise)\n  onPointerMissed />            // Response for pointer clicks that have missed a target\n```\n\nYou can give it additional properties like style and className, which will be added to the container (a div) that holds the dom-canvas element.\n\n## Defaults that the canvas component sets up\n\nCanvas will create a _translucent WebGL-renderer_ with the following properties: `antialias, alpha, setClearAlpha(0)`\n\nA default _perspective camera_: `fov: 75, near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _orthographic camera_ if Canvas.orthographic is true: `near: 0.1, far: 1000, z: 5, lookAt: [0,0,0]`\n\nA default _shadowMap_ if Canvas.shadowMap is true: `type: PCFSoftShadowMap`\n\nA default _scene_ (into which all the JSX is rendered) and a _raycaster_.\n\nA _wrapping container_ with a [resize observer](https://github.com/react-spring/react-use-measure): `scroll: true, debounce: { scroll: 50, resize: 0 }`\n\nYou do not have to use any of these objects, look under \"Recipes\" down below if you want to bring your own.\n\n## Objects and properties\n\nYou can use [Threejs's entire object catalogue and all properties](https://threejs.org/docs). When in doubt, always consult the docs.\n\nYou could lay out an object like this:\n\n```jsx\n<mesh\n  visible\n  userData={{ test: 'hello' }}\n  position={new THREE.Vector3(1, 2, 3)}\n  rotation={new THREE.Euler(0, 0, 0)}\n  geometry={new THREE.SphereGeometry(1, 16, 16)}\n  material={new THREE.MeshBasicMaterial({ color: new THREE.Color('hotpink'), transparent: true })}\n/>\n```\n\nThe problem is that all of these properties will always be re-created. Instead, you should define properties declaratively.\n\n```jsx\n<mesh visible userData={{ test: 'hello' }} position={[1, 2, 3]} rotation={[0, 0, 0]}>\n  <sphereGeometry attach=\"geometry\" args={[1, 16, 16]} />\n  <meshStandardMaterial attach=\"material\" color=\"hotpink\" transparent />\n</mesh>\n```\n\n#### Shortcuts (set)\n\nAll properties that have a `.set()` method can be given a shortcut. For example [THREE.Color.set](https://threejs.org/docs/index.html#api/en/math/Color.set) can take a color string, hence instead of `color={new THREE.Color('hotpink')}` you can do `color=\"hotpink\"`. Some `set` methods take multiple arguments ([THREE.Vector3.set](https://threejs.org/docs/index.html#api/en/math/Vector3.set)), so you can pass an array `position={[100, 0, 0]}`.\n\n#### Shortcuts and non-Object3D stow-away\n\nStow away non-Object3D primitives (geometries, materials, etc) into the render tree so that they become managed and reactive. They take the same properties they normally would, constructor arguments are passed with `args`. Using the `attach` property objects bind automatically to their parent and are taken off it once they unmount.\n\nYou can nest primitive objects, too:\n\n```jsx\n<meshBasicMaterial attach=\"material\">\n  <texture attach=\"map\" image={img} onUpdate={self => img && (self.needsUpdate = true)} />\n```\n\nSometimes attaching isn't enough. For example, this code attaches effects to an array called \"passes\" of the parent `effectComposer`. Note the use of `attachArray` which adds the object to the target array and takes it out on unmount:\n\n```jsx\n<effectComposer>\n  <renderPass attachArray=\"passes\" scene={scene} camera={camera} />\n  <glitchPass attachArray=\"passes\" renderToScreen />\n```\n\nYou can also attach to named parent properties using `attachObject={[target, name]}`, which adds the object and takes it out on unmount. The following adds a buffer-attribute to parent.attributes.position.\n\n```jsx\n<bufferGeometry attach=\"geometry\">\n  <bufferAttribute attachObject={['attributes', 'position']} count={v.length / 3} array={v} itemSize={3} />\n```\n\n#### Piercing into nested properties\n\nIf you want to reach into nested attributes (for instance: `mesh.rotation.x`), just use dash-case:\n\n```jsx\n<mesh rotation-x={1} material-uniforms-resolution-value={[1 / size.width, 1 / size.height]} />\n```\n\n#### Putting already existing objects into the scene-graph\n\nYou can use the `primitive` placeholder for that. You can still give it properties or attach nodes to it. Never add the same object multiples times, this is not allowed in Threejs!\n\n```jsx\nconst mesh = new THREE.Mesh()\nreturn <primitive object={mesh} position={[0, 0, 0]} />\n```\n\n#### Using 3rd-party (non THREE namespaced) objects in the scene-graph\n\nThe `extend` function extends three-fibers catalogue of known native JSX elements.\n\n```jsx\nimport { extend } from 'react-three-fiber'\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'\nextend({ EffectComposer, RenderPass })\n\n<effectComposer>\n  <renderPass />\n```\n\n## Automatic disposal\n\nFreeing resources is a [manual chore in Threejs](https://threejs.org/docs/#manual/en/introduction/How-to-dispose-of-objects), but react is aware of object-lifecycles, hence three-fiber will attempt to free resources for you by calling `object.dispose()` (if present) on all unmounted objects.\n\nIf you manage assets by yourself, globally or in a cache, this may *not* be what you want. You can recursively switch it off:\n\n```jsx\nconst globalGeometry = new THREE.BoxBufferGeometry()\nconst globalMaterial = new THREE.MeshBasicMatrial()\n\nfunction Mesh() {\n  return <mesh geometry={globalGeometry} material={globalMaterial} dispose={null} />\n```\n\n## Events\n\nThreejs objects that implement their own `raycast` method (meshes, lines, etc) can be interacted with by declaring events on the object. We support pointer events ([you need to polyfill them yourself](https://github.com/jquery/PEP)), clicks and wheel-scroll. Events contain the browser event as well as the Threejs event data (object, point, distance, etc).\n\nAdditionally there's a special `onUpdate` that is called every time the object gets fresh props, which is good for things like `self => (self.verticesNeedUpdate = true)`.\n\n```jsx\n<mesh\n  onClick={e => console.log('click')}\n  onWheel={e => console.log('wheel spins')}\n  onPointerUp={e => console.log('up')}\n  onPointerDown={e => console.log('down')}\n  onPointerOver={e => console.log('over')}\n  onPointerOut={e => console.log('out')}\n  onPointerEnter={e => console.log('enter')}\n  onPointerLeave={e => console.log('leave')}\n  onPointerMove={e => console.log('move')}\n  onUpdate={self => console.log('props have been updated')}\n/>\n```\n\n#### Event data\n\n```jsx\n({\n  ...DomEvent                   // All the original event data\n  ...ThreeEvent                 // All of Three's intersection data\n  object: Object3D              // The object that was actually hit\n  eventObject: Object3D         // The object that registered the event\n  unprojectedPoint: Vector3     // Camera-unprojected point\n  ray: Ray                      // The ray that was used to strike the object\n  camera: Camera                // The camera that was used in the raycaster\n  sourceEvent: DomEvent         // A reference to the host event\n  delta: number                 // Initial-click delta\n}) => ...\n```\n\n#### Propagation and capturing\n\n```jsx\n  onPointerDown={e => {\n    // Only the mesh closest to the camera will be processed\n    e.stopPropagation()\n    // You may optionally capture the target\n    e.target.setPointerCapture(e.pointerId)\n  }}\n  onPointerUp={e => {\n    e.stopPropagation()\n    // Optionally release capture\n    e.target.releasePointerCapture(e.pointerId)\n  }}\n```\n\n## Hooks\n\nHooks can only be used **inside** the Canvas element because they rely on context! You cannot expect something like this to work:\n\n```jsx\nfunction App() {\n  const { size } = useThree() // This will just crash\n  return (\n    <Canvas>\n      <mesh>\n```\n\nDo this instead:\n\n```jsx\nfunction SomeComponent() {\n  const { size } = useThree()\n  return <mesh />\n}\n\nfunction App() {\n  return (\n    <Canvas>\n      <SomeComponent />\n```\n\n#### useThree(): SharedCanvasContext\n\nThis hooks gives you access to all the basic objects that are kept internally, like the default renderer, scene, camera. It also gives you the current size of the canvas in screen and viewport coordinates. The hook is reactive, if you resize the browser, for instance, and you get fresh measurements, same applies to any of the defaults you can change.\n\n```jsx\nimport { useThree } from 'react-three-fiber'\n\nconst {\n  gl,                           // WebGL renderer\n  scene,                        // Default scene\n  camera,                       // Default camera\n  size,                         // Bounds of the view (which stretches 100% and auto-adjusts)\n  viewport,                     // Bounds of the viewport in 3d units + factor (size/viewport)\n  aspect,                       // Aspect ratio (size.width / size.height)\n  mouse,                        // Current 2D mouse coordinates\n  clock,                        // THREE.Clock (useful for useFrame deltas)\n  invalidate,                   // Invalidates a single frame (for <Canvas invalidateFrameloop />)\n  intersect,                    // Calls onMouseMove handlers for objects underneath the cursor\n  setDefaultCamera,             // Sets the default camera\n} = useThree()\n```\n\n#### useFrame(callback: (state, delta) => void, renderPriority: number = 0)\n\nThis hooks calls you back every frame, which is good for running effects, updating controls, etc. You receive the state (same as useThree) and a clock delta. If you supply a render priority greater than zero it will switch off automatic rendering entirely, you can then control rendering yourself. If you have multiple frames with a render priority then they are ordered highest priority last, similar to the web's z-index. Frames are managed, three-fiber will remove them automatically when the component that holds them is unmounted.\n\nUpdating controls:\n\n```jsx\nimport { useFrame } from 'react-three-fiber'\n\nconst controls = useRef()\nuseFrame(state => controls.current.update())\nreturn <orbitControls ref={controls} />\n```\n\nTaking over the render-loop:\n\n```jsx\nuseFrame(({ gl, scene, camera }) => gl.render(scene, camera), 1)\n```\n\n#### useResource(optionalRef=undefined)\n\nTake advantage of React's `useRef` with the added consideration of rendering when a component is available (e.g. in the next frame). Useful when you want to share and re-use resources across components.\n\n```jsx\nimport { useResource } from 'react-three-fiber'\n\nconst [ref, material] = useResource()\nreturn (\n  <meshBasicMaterial ref={ref} />\n  {material && (\n    <mesh material={material} />\n    <mesh material={material} />\n    <mesh material={material} />\n  )}\n)\n```\n\n#### useUpdate(callback, dependencies, optionalRef=undefined)\n\nWhen objects need to be updated imperatively.\n\n```jsx\nimport { useUpdate } from 'react-three-fiber'\n\nconst ref = useUpdate(\n  geometry => {\n    geometry.addAttribute('position', getVertices(x, y, z))\n    geometry.attributes.position.needsUpdate = true\n  },\n  [x, y, z] // execute only if these properties change\n)\nreturn <bufferGeometry ref={ref} />\n```\n\n#### useLoader(loader, url: string | string[], extensions?) (experimental!)\n\nThis hooks loads assets and suspends for easier fallback- and error-handling. If you need to lay out GLTF's declaratively check out [gltfjsx](https://github.com/react-spring/gltfjsx).\n\n```jsx\nimport React, { Suspense } from 'react'\nimport { useLoader } from 'react-three-fiber'\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'\n\nfunction Asset({ url }) {\n  const gltf = useLoader(GLTFLoader, url)\n  return <primitive object={gltf.scene} dispose={null} />\n}\n\n<Suspense fallback={<Cube />}>\n  <Asset url=\"/spaceship.gltf\" />\n</Suspense>\n```\n\nYou can provide a callback if you need to configure your loader:\n\n```jsx\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader'\n\nuseLoader(GLTFLoader, url, loader => {\n  const dracoLoader = new DRACOLoader()\n  dracoLoader.setDecoderPath('/draco-gltf/')\n  loader.setDRACOLoader(dracoLoader)\n})\n```\n\nIt can also make multiple requests in parallel:\n\n```jsx\nconst [bumpMap, specMap, normalMap] = useLoader(TextureLoader, [url1, url2, url2])\n```\n\n#### useCamera(camera, props) (experimental!)\n\nThis is a special purpose hook for the rare case when you are using non-default cameras for heads-up-displays or portals, and you need events/raytracing to function properly (raycasting uses the default camera otherwise).\n\n```jsx\nimport { useCamera } from 'react-three-fiber'\n\n<mesh raycast={useCamera(customCamera)} onPointerMove={e => console.log('move')}>\n```\n\n## Additional exports\n\n```jsx\nimport {\n  addEffect,                    // Adds a global callback which is called each frame\n  addTail,                      // Adds a global callback which is called when rendering stops\n  invalidate,                   // Forces view global invalidation\n  extend,                       // Extends the native-object catalogue\n  createPortal,                 // Creates a portal (it's a React feature for re-parenting)\n  render,                       // Internal: Renders three jsx into a scene\n  unmountComponentAtNode,       // Internal: Unmounts root scene\n  applyProps,                   // Internal: Sets element properties\n  Dom,                          // Project HTML content\n} from 'react-three-fiber'\n```\n\n#### Dom (experimental, web-only!)\n\nSometimes you want to project dom-content on top (or underneath) of the canvas. The experimental `Dom` component behaves like an empty `THREE.Group` internally, you can transform and nest it inside the canvas. It's children on the other hand will be rendered into a div element and projected to the groups whereabouts.\n\n```jsx\n<Dom\n  children                      // Regular dom content, text, images, divs, etc\n  prepend = false               // Will be projected in front of the canvas\n  center = false                // Adds a -50%/-50% css transform\n  style                         // Regular css styles, will be added to the inner div container\n  className                     // ..\n  onClick                       // ..\n  ... />\n```\n\n```jsx\nimport { Canvas, Dom } from 'react-three-fiber'\n\n<Canvas>\n  <Dom position={[100, 0, 100]}>\n    <h1>hello world!</h1>\n  </Dom>\n</Canvas>\n```\n\n# Links\n\nNews and examples via Twitter: [@0xca0a](https://twitter.com/0xca0a)\n\nRecipes and FAQ: [/react-three-fiber/recipes.md](recipes.md)\n\nGLTF-to-JSX converter: https://github.com/react-spring/gltfjsx\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto:\n\nBTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH\n\nETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@4.0.29-beta.0","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Ir3FNMkN3RdM9qOeTjinCeY3V11N9YUgay5FvwJcvBQrjofWQ8lGgmwwAnFGO71OfAIVupT5GsrNYArqceyjzQ==","shasum":"0473dd1f74798270a65af18b1bd5a7a717acbed3","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.0.29-beta.0.tgz","fileCount":39,"unpackedSize":650611,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJemigNCRA9TVsSAnZWagAAIFAP+wWkYt0TOy3p9HnYBh2l\nH6plBbSONdiiK5P901izmhUhXOj+fMmakKQodRdWAdra2vMX+sCHmOnHR/aa\n0cuoz/XnzckBB2m40NSnrUV5W6Cp81nc/FEOnw+nZyKHGxogJXK8l8KHjzMH\nid9sgkcksQyssrVTLckHouAyCP0r96vTCbvoBpCrhLiGC8+RUxhKjrSklQYW\nxc3R1zGHDA3IK4GguAFfhiCKY8djD8LcAncVKNRERtKxvqI0tTB408WD3OT1\nQMVR6a8m2omdVI/2YIzwzeK3tuVHGYS2AR+ObuKG48PEUZYq+mUPNuWTEJPB\nsEQGDcV4v2UXBcYk7PTRetWTOKLKT4KTX2OPSgF+XDkK9shEU9faafd81kkv\nIM28/v7F/tm5hvizxr31699YUQBywen6Vnd2Lt9P+uj2IKEqZjwiPs3oScpz\ncBVB+tXSstpGkvEOhjkk8RkteYYHa71T9Rfxa/ulpzDdkPnYD7vMm3QDQJj+\nEMz5v3SQAdY5VdsrqiyWZPZcQHPdb7vSTfAgWKGC0YDSN10lxfgAmV2HGK9c\nNuUBKqk1eVXYMDfe78Ym9B4E9RLB9UUlSdQjARM3IYCDRQB/NKJJ1ANcQP8h\njDN5/PGSCXCfH8Qog+4akNSsDxge2+YtCfykSZem0KXI4c6Gnxq4fSTXvEU0\np9M2\r\n=OlPg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDB3YnmZr3LnWEwnTLrCW2BfA0HJv0x81kXbaQUTsJnAAiEAxeK5DlTlZ6UgJiSl0qcC5QIIG1khaadV60rC/8u8mV4="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.0.29-beta.0_1587161100376_0.07235126990186624"},"_hasShrinkwrap":false},"4.1.0":{"name":"react-three-fiber","private":false,"version":"4.1.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.1.0","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-EPYY8WJuDYasFCJT2bSrv0VJwyRMD6C2QO3iWaVvxDhCz+/VyBo7zzAuA3Nan7ojmve+xWGd2Kv9W9bSAqv81w==","shasum":"d898dfae132300d8e84043c1e50179d3fcd58e51","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.1.0.tgz","fileCount":39,"unpackedSize":655513,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenKKgCRA9TVsSAnZWagAAbP0QAJS3aNIAy4poawyJ/NeI\nv1nAXAKHRmI4ks8MZFLRzxCFUsXxhZVD9jV+iHIqwewHoilZ/tpXSEVAblbi\nxzq0zi4RdikDtLAnI9hBQmI5NYanrR5Y6mU2wT/iiMcJSj5R3qTZ/ZZ81VVb\n2ACPairxu7BCwL2EId7b/5U4vlLBEvGOxafT2cX9c2voxkFackWc9Qq1M2hn\nwISn+snAUINnE5wxo+jSnIJXdb4dK1xyGFBKEWIfFmU03UVg88QAhDNpEKZZ\nyWuntLkt3MXyxIgoULx3coolyOZCe6CeYEyHG2iuqN0ighEWgcPNrmcOBU8i\niZiYEBEnG0Nhcidt6AVwc4HK057GGF+cV8/F41e6TKRfEV+fDfjTiw1XfDAa\nN8dMxw8jmXIHSfY4EMy5gJQ+WWCDQ3oUfvNdzpLFROZcNtUd7/ddrxIqVWyW\nuEDASPF80A3zCWkU0Ml5QclsZe71WJQdZpcUZC8R13li3GlW6OrTokn8RHJf\ng0d3bVkzsR1f3eOyW7jcAwXJQUmbPtQZ69mc56OrWFglqxQVEM9cH08frDwq\n40VpbXI057CmmTyBqoHjwgfyIJqGWJpCcGrQMDmjTPmcxQHx53BzCvsTpWfw\n7YUIFXAsM31cjyCmfeojIB1aEYNYNWjkI41xRUkE+ACuHLwedmmVuwJGWY60\n7bdz\r\n=g8Sf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3kPWhSUnkxRbRvVM1/zJ3ODSV2XZI0Bjgupwt2T96lgIhAJysJkGif/tE5UBX8QFbVjzrMuVTcOQr9vxinVlyf+Q7"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.1.0_1587323551981_0.010894807399426387"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.1.1":{"name":"react-three-fiber","private":false,"version":"4.1.1","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.1.1","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-dFvG8ITjMD1p3qxHERuAl1B1tCOW8YfvWWOxyQVUO1wjkvdBXrMZ272cx//2lTF4y3O59n08M8nudN/kNAPQ/w==","shasum":"441e2000bee0dc5872affaf189d8dfa6739d5c0e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.1.1.tgz","fileCount":39,"unpackedSize":655853,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenKQZCRA9TVsSAnZWagAA0YsP/2mXOyAEeH2YvGEqU/5S\nWW4ISWdW+EO5qL48xOVs1DOQG2qEoizYOxRTIklKPfCCn27F7JtC6uG1N+eo\nEzgK/40g0ix44x3azMtYC6d0NWymJfOAhAooQrSFti8eb6BprqoWTEUZGs3D\nSYkKmKOUkyYypR3pR5h6dsdzF+MTlVw6GL8hH5wYMMQAr8193OScieTd0dHD\ncZcTu8PX878tC4qQn0OdNFpR1MbKjFxH2wJDr2VBXS3coL6keYPEpdp04kJc\nXDxn4zrzYg1vlwGqAtsf3h0EAO9yV85kBxqFjwJwQ7ML9QM4HnSS8VVaNQLD\ntOAiECca7xcDCz+E/l8OPzlL45ErQsZWLQW7tP9B8kck4wggHQ0fTxE10qfK\n54ME0wbnu9unMQMORkyjXF0l15VEoqErgsM8dSgZNYN3VXNvWzf7GvIWXDF6\nA1TPSpC+S0TSVECtZT5pka3c5rk92QTYv4K8A1Xor+CaSXkdbIGFN34HegSS\nuiCiaI6g354Fc4cL3HzQOmCskJfwdCfsAkukYvJg/gRkHtxKLHqX7r9lBiep\nGz3g+DjNL4UoRCAkcb6TCkLGTdB+RV9KzQt7DILTSNzCJxGIdNtML9l0qj+r\n8OFr+f2DmfA8ENxUhi1bcarXJ2InKZo2pkJRLZ2LCfKhcEvcOgI4ZDZNDaGh\n/yml\r\n=aDJ8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDAFBsKGHyT7FKND0ckvV+k+k4AXkb1tKFYCGIufTEieAiEAnqqO1DLNoQ73upsx2Wq3azwX0nf6L+MDk8HIZzOfWy8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.1.1_1587323928566_0.5413247965999153"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.1.2":{"name":"react-three-fiber","private":false,"version":"4.1.2","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.1.2","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-eVV7QnUN/gfe9Xvq3uuJ9qTNB162Uai8Id37wTkMyEla0q3lFVZ7r1dBtN794YKMCgJLf6DOvT2N7ppqQ1zJ4w==","shasum":"55d6931a979b662f5b02e5d54ee4646a982366e1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.1.2.tgz","fileCount":39,"unpackedSize":655950,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJequ5GCRA9TVsSAnZWagAApycP/02eQWgizT4kLbF2Y8J0\nwf18OjjEtQCAoFcY1IrSi+tDX6CoutVAl0a/jBkS0rkpkzVbqdYGF9ADjqPA\nwKF5TTHXmibJ2aWNpDaCUlxUc6xWi7Q5MZPzwQHgyzIb5+58rsHoCAWWJkDu\nS2v3jiKQJlSNBhug93+VpwOfUr9/yclU1D07OBMNl5Fa1OhPLhF3mKJjdBz/\nw5GZYDkTwLVGrHB96F6TnFjijj/vnxo9TJkpgLO18+vCZV3VIbRnPkEA9hQ3\nd3eFUH439KkRGdvfI2E/JbplWuv1NgVBYp0jWzuM7zh70omrthN/fybmApRW\njhunXYSmRiAWqT3LMj87V9yNlXCDefx3FzSbDAx7tNEwfTS/DNvh9qn22ee4\nDEHEouQfejII83wfeDRZxhPuG5atUszVTM7YbPbyLWeazbub0SnOjyWdR6GZ\nH95hoxYLoSiouJqFiMKRhphw0bLo/8pmkKqbLkmaQg42X8R1hV+kbw0/EEGT\nchn1aNjAjP3iMK7cuOix6o7qAcrwMTE/FgMAXHeOS1xeus+1ujxHeMymN76M\nyLdF1flTc2Ukn9G7hnh4Sbmh3N1M9DBA5T2sYLCadJlw3z5uSLlQSDMzhBRb\n6e64Ll58RG7kXgWuc55m3EK51J6flJtutZzpLKOC2cBMwTh8TJuO1cjwxtHs\nSmN/\r\n=+iic\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDt+dNcDMEPHhsS4RLVwdBp1ZoUXRtdwk746vtn7WdfpAIhAK1eRRXwpMQfygdHG3rHxku4dYGDeaHLnRXPD3W29tZB"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.1.2_1588260421389_0.20882722530518505"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.1.3":{"name":"react-three-fiber","private":false,"version":"4.1.3","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.1.3","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-0u+E7zd+xlwecg6i9aDSuTuRbgWJyAKF50wJMkrm9/zQaofHOPIJHjxMQc6zpVVVKK1vuwaw2b6N1DJVPpFCXQ==","shasum":"5aabf319add8154a3f3ca1ca5b8164749fcc1f3b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.1.3.tgz","fileCount":39,"unpackedSize":658380,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq/OJCRA9TVsSAnZWagAALtcP/082yCyji7a+EurRPdB/\nGjDcLDPOvVQZK6cMIpr3ihpwb/1F+FwTPgt4qulYNnasRVkaYEk7Nxd4QagY\n0yJwlnMBkLci2tZ66EiIzJyblG8bFKB6jsYkOuJ8FazAiXr/HCDc8f7U5Ly1\nzkn0FdOw8bl34LGJBq9qkHBZ2qTdr1f5cc0UIfnabdQ9nN9HFgLcG3wukFHW\nwvRSkDe5MqsGq+pob/PK3iOh+FGGeNk9bw1a2J+ys5SaGbofLbRn78octKyN\nz5wdJzdJOLo/nyCU3EmZnJ3Z5orNpC9RiQmmat0YXsqjAxzc7uNCV6aN/zaI\nVhb5j0EYmLtnThWhCyoWWbDLG+dWLWonOrwt4nmUAcDbUkYx4ppzlnw3kKx2\njPZ2f9DZthmHDVyq4G5IBttfldJRYjlJm5fGYPol1mpa1QGcUS1inwH1P++h\nBjXVsJayaWocln1zqZli7eQK9j6zc+XX3pa/tqBSki5xziYtOINmUyh/6MHY\nUjuB5q3n/hTfJmQmUbMUlQoSrnjD+PzEChCi/a0ypDQAYNDWjATYMZSPh5oZ\n4j1TGwp7ojYIpnt2V0r3Od7bbpByZI3HEVFC8/YXzEqb/MDE6Di1NQFQVCFB\nOqOeDQWGNIAbmDGeuqzcd6kLs3ciimoIisb+xnLEqefn42GsY87Z7kWgaC7i\nk0ze\r\n=Tdes\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgDkPJMGZDGGuToWelTIiIySv33fspwYjSKHrRCDQhugIhAL7yeqkgwjHpweaOVH4TeR7bo8MTHfPv6Q6rNHF4jxsO"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.1.3_1588327305117_0.5813360005548831"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.1.4":{"name":"react-three-fiber","private":false,"version":"4.1.4","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.1.4","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-c1NchqRPAP27GQchSKkpRgz+XwwPvRJo/cTjPWQmX0H2MqnIu4vBTV1GKBqn+uWeDHjjfcWHZyq8zH5JccP+NA==","shasum":"55ea847f6aa7bd88eea077c1212151343be94427","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.1.4.tgz","fileCount":39,"unpackedSize":658559,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeq/8pCRA9TVsSAnZWagAAYD0P/ju7j3TEIswDi5SDfanM\nuS71Dl3LRbKtYwlKSoFCLugLuT4AkAPtRSf/a8ILtLXhwTitrYCRfsRgLGuB\nLSEKgLh98xG0P8OwOoSk/FVda4qf+beePVOB4/qC6VzeKwibGCMg+ovh9H2R\n2mU2HNCXHIsCSvfVlT0TyrYxwlKtRFZYU6j46reK2REki+Qm8r4RFlS6WlXD\nRde0rDNbUXAX+KJ1xEF3doGwkUI275nrXzwyFirc9e5I4rGws75K/C++g8an\nONiFycay2QXiISJYl6gr3B+DhkKhJmsmbWaSl2j7TB9+JWORTg96faBTXqRy\nm/c5Unhih0b2A5H2hRL3ddMefA32C5Y2WguUcD5c4eT37RK2FKBQHQ2k9/Qz\nQo8ZIEjyzobgRgCTGYJGUoI99V0ATlHvZMvKXJYDXsYY/xowFQDbmmpRbI5q\ni1wdHPyo5bq8aHFTMu0jPp6SFOmuiVfnl6NItdZkXfMkoQEaKdVW0hfWJT8O\n7qEylFnPtc/3SmL0ixg/gbHW4y/kAXR9EZt1ysTtIp4FetVGVe5wvu7Az50s\njAGiUGf8NvUm8dIixsjiLAL4ttZptKAeAl9O5ajsTO+vhcADtEYGe8+ByCeb\nn5XigevOAM+q5en39iyVBZnc9r88d41RNuItGGcwxo0SgEYSMJs6yKruVUWL\n99Zv\r\n=Yqn2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAKCQ4jvvQAAThaeuBu+e30na2Ksj02FruA/7BfjbNKGAiAxiYxIm2CndTOA4LnIvv+OrIDfS4uUmuhPOL6/DzAV+w=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.1.4_1588330281126_0.6822593645641644"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.0":{"name":"react-three-fiber","private":false,"version":"4.2.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.0","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-VjquGW2iGTxrfhqE9d9s1D+LwMe1GCPONkiEHCT3JBsfmPv+bqIadwbpzlrKZngmANH3+KgEaMLD3KS+NxZxcw==","shasum":"ce3cbd528069b663eebcff4a2b81d45ea3e02bca","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.0.tgz","fileCount":38,"unpackedSize":643802,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJetwPRCRA9TVsSAnZWagAACloP/jEW4n+4q4NIdVLf0s2X\nAgPldzpfhWedP1xELqT3OOYY8R/f6879v84MgrdZDZ1ml50VYIy6J0hyvivf\nlB9dYTBV+OSz78O1NMvuxqn21stKAGR/dtCzAm9VvLyItZu/IE2nenhX33LF\nzQh6SWh4zAieMIlpMn7HhHsc7xi7Acn6hcYSjoyeKMgLf8eACm7JbTjl4Gke\nfjn6N6tdgsjiO6X51uLbBRBXUNfu7zdQ6khr6eY10QBgT8TQ/c3AHV6LNjHK\nShJluwhTm2vlU4F3bnXeph8hRLMl9MIYDMmXYvmPYMMaTPHXQdRLfcy9vz2A\ngSutJMcHfz0DZ3ebSXWs1B8QHD4Xgt2HZbg5LwzM6uxBL/zt+vyhAT4UNJ0l\ntkc5quZMIwEhEvAEm2iVF1xTApc9mxu4KHsFSUOIRL0BC/eRD+P9aNc7iohc\nXI+jboH0siO+ueoxcm8hQoZdDEafMLUwsMuJuHjlILGuDk+BFiECg2LSqMBz\nnjojaDIE/9Yw7Fc+Cw5KlHRL2tSknGc4I/9uoPaGmnSygvUIYDbPbnMW7Esj\nAYfEcf8wNmOJ0sIS0wJ7FTNkT4FQz7J2QiJm89C4J+gNBlFgI9W8pskU4q7K\ngekrJH8VLhBd6GJMxWZkH5nySKCFi6OrfJftVQLoff4NZkp71IeBM18W12mr\noCuw\r\n=B9n7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9i1DBHXclGEcFavYi2m9wiz6txQY7RHP0t5wuxJmQdQIhAJ9UsTOVJ9ohGmgv7V8pOKi3fqNDDdClxVwKu0U70fLf"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.0_1589052368347_0.9962638571509139"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.2":{"name":"react-three-fiber","private":false,"version":"4.2.2","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.2","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Mi0wQv9YfnxwscmiZoKImKFiSqeYlJp7DKYjMPngE/v2C80sK5Mt1gJBDcvHewh4JR/YIzRWLlR/8n6KeF/pwQ==","shasum":"52e00ef249f1ac063b732ca2f922eaa0aef4a677","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.2.tgz","fileCount":38,"unpackedSize":643592,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJet6yQCRA9TVsSAnZWagAAOeIP/1pk1/d/cBh0GOzeYsra\neZP8WbFNxyXjZRrKd9FmIk++GFytE8aDMYDbWvRNCNMC14W68qF5Sl9ST7/k\nj22nleaP5LsxLcrwhXu1IeJL8uFOlAgx9Q87c4x+pIvErpjmEoyTgWBCAN6N\nnYhyySRb724ppK9XCFNlJoyC6WnizPQaPQKJbbcH9WBLFgwitM67G4mPuOu5\nvlKp4GBBDhpq/QflEJi9YuMsqrQvTgQs06ooE38Xhxdql67rZ2x9pPBzfRzk\ntoNjTjmsKz4R2I1BxLwBBbKt8LaLKH7R87Zrc8jh7BWhfHWFeTofbAOWfOrq\n/TUFs3p157xl4cgb47OSDoTzw5jBMFIX9zQ77HiFtpU5lAXhWVqOXU4Ss1VR\nCPR6EkLSrfTjxjtIjPskRZinH10QAQjjOSdy1ueqLz+E5suVOhY4/DicENaf\nEgbkDCuYezbFY2vQ8YsEHQQqHZYtnptxSHKak+h7dU3YNAqKWpEPM9B2ROwu\nAg9XL8GTa/3meJ5okTSpCYKb+oUGB2Q5gEkILN/VVQBQu/H1zpwCJo+arjv1\nDorFoXMrHxfFqVb/HzSXTvbPRxwfmGDAekkN1hTc9mPwAa3IUZLadFSL+VjQ\n/XfJ6II2EVikD3aITWVwsY4LjP+iNmhxJtfB/u1T+IvVhGg0BUFM2uzyObYC\nyO9e\r\n=NoMv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDmpfLGBOY4exSDlJPXXsVoPFLjXTgXtWrAQaMGuAR6RQIgTF8KJSDZxBe3Jgv/RFwEdxXFAr/UCYaGoXzYsSPkXs8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.2_1589095567465_0.4168363016452885"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.3":{"name":"react-three-fiber","private":false,"version":"4.2.3","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.3","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-UzPF4a7SwMdn3jH6xtNLK/P4MRecCnJ51mKTNtppLRefj/s6iuoP5S95LhIXgpNwt7UgYMim7woCfwzhebavaA==","shasum":"34252df99a60afb1da133a6e0b6109cf3e6811b7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.3.tgz","fileCount":38,"unpackedSize":644282,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJet64tCRA9TVsSAnZWagAAJWgP/AsBGMl0E114KdxWaSoo\nSGNnJngJ2frWLQd9MyCGpVIiTQX3NugQhgmp+XbxAkUTmXVZZlOqgsRvxDCc\nwftJBjrIX/auhZNI8GlXFl2IXM9G7p5QVTmGwyn4vjQH5JcwVXJGUp2h0mtU\nAnBKAWnc7sETq3NvmtBt/Oen0AuuCAUAK2qCAp3NW2t9cMvrfMDVia8tUfg2\nDI5r2kHM/XjkigIxSFRHwGEJW9o51rIBRbVn62xaxYBBQ4wdsk7muMNzoGac\n5TtuPYG2dsKHZB2/s3Pv99G4xkmA/dUXQWhXlWsPXCHI0YlVk1LNvPpRTxpy\nVtdBaxP6HYg4xSWHAnc+W/XvXAYk3d6+FNj+2XpgSuSULup/wsf2Ge4IT+Fe\n+2wr0IxBh+3SSRiy/O5nTObJnysHdeFFJCUyxxsFMo6q72ADU8cBPv0SIb8M\nRYA08jHhAv0sNGHpp/x+8jn2JCOpcvIdM+uQsP5rjHuEmqcFrKrllpr//x5E\nsJnXAH96uffZLCQ6xdG8yVRoXIbg27vMYCKsQkRA+Sn6tDyjX37cR6CvqJX4\nQHlXL1BKqkgV9W0vhEzh4irxMYlIReDW0zp2QoS34/1iB2CVkL8Sc7hez+T4\nGWKQnaQ5caP/+Cnk4GMrZ9FYyOH/iCcR+sk9tJNFn9dPFNF9O59BDWcaoxkJ\nlH14\r\n=+ln5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIC/DH8avZQb90MGbXRB/v+GU0rlIIlQiZURQcarKSeG0AiA96NprpMfZW2Qzcc3jLYwY72OwO4OguzTxTvRbFytegw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.3_1589095980588_0.6426666802522847"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.4":{"name":"react-three-fiber","private":false,"version":"4.2.4","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.4","_nodeVersion":"12.0.0","_npmVersion":"6.9.0","dist":{"integrity":"sha512-6fZM6yGfnmLmtadsSvAL2Lw1I3VMF4Y13bmufLStKVsex+Uzs+b0nTAi3RQwGWJB8MBwaSYY/Oh7a16ME9eMvQ==","shasum":"5693e0994c19bd17fe2a92b05b5ace4b85f3a9bc","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.4.tgz","fileCount":38,"unpackedSize":645241,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeu6jlCRA9TVsSAnZWagAAESQP/R0qZV3+oCX7CG3/Wm8g\ndOXxp9RsybVi2H9pK+zWe1uPdZrvTgogopz1c+DUsc/wiF1PnQmZXHHVoEOY\nnuYE8WyiLAmMrhYyq76N/XnBhTvlqMOyiJx4IiMJ3Z5IOdMMbZtVY5xoeJ8s\nFJvSckA25UudL+/3SX2yDXm4H3M1usRyUTXXT5zkz8TyRH88oQpMPGZajAFo\nEIIwq4OjSpZjWECU3INLJ6a2meBfY9RFKpBbI4kkAXO2/JbCL1FQpVDXck4S\nC3K/h2X4TdxrE7LDRO0a4A739+V4TS/z5L98Mbv80fp/DvcQABFytoNDrdH/\nVvH+w2vwHSRYAg3cgV69ioPDmyu1ANALA6lKCh5mow/nw1khgi7gaJIY8EbB\naL0IS4g+HveUlhNyc8vDl+BvhHOiy6sqznsOzN1lpx/3rpXvdHgz9Lp3ZhCj\niIzJkHu+QfvVbL48yNu0RiUkB7x6FFyJnZPw/bW5lgwH9WrPQzomWNmsTr+4\nTrWZVXDYMdibL48ylKcqUtbONM3KOUXYUtJgdV4feWwaG4cQ3xwYkhJTfMV7\np2tOdudGj4SBxriByWHCwty55Ul9TT/AHQKLHZLNLIuyRg4p6FDwsItqnA5l\nRPZKZYVXZvITgZOqdNpTjNdCfe+R9ROoXaZdfKxhNYd+RiA67PbxX/MWY5yH\nV+RR\r\n=+hVW\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQConuG2GfH1J5My+dN7tNoy8vBu0Hsc0kLEpono72+60wIhAKw6we4Y/kYHgiB7ziR9qCqVppHnVVkpN0vceKcxVkC7"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.4_1589356772452_0.894504413997081"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.5":{"name":"react-three-fiber","private":false,"version":"4.2.5","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.5","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-ThZOTtJsQuSCPtpO98mkrEUe1sKRu28WzDQd19pUFzCy4eJeNtucUU3XLaYiqfGXYRh8URsWvv6/sj069iK5qw==","shasum":"d597c51cfb5d566a1deba0c2430920f1af7234c8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.5.tgz","fileCount":38,"unpackedSize":630854,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJex80bCRA9TVsSAnZWagAAm0EP/0VQrLXACwgSZCkJalNG\ncu/SzuALR8rukJKpl82PDVtpY7Kwq5GHOXCrcFk6HnbqrAyM5FA8gF6944Iz\nXegFjqX5v1F9BAUvnkt1HmRNE8wTAWr3nUjY/FjWtOR3rnwiEF1Xj4IWO7LN\nWvG3O6zEU4sCpW6VcF8IjhBZ36/VAgFULfn2hSJRt3c7h/ed0HkoRhn8ztYl\noWWQRbCWI18hY0IVvV1avF1zYn1jbdpo1LigDUJxeuHvb/Flmar0CvDXB92u\nL+WlIwUCNNzxmnO+u5SPWEiPTDhi3a8yPgfWTmyakAipP4YeLrx59USn/lo3\nTsg2ZJiagqkKronOqL5lVM4clwLvytJc5GExJtcnidut9tE/BSmWgGEZ+42M\nJmDjpr8QZyl2ycLU3KiW7CMhR9aQFzSjHDo0CI2tgTidRgjhTbI4nEfPckIX\nMcYuTxXdycITm/W5HqzjGGH5Uu60lyFGto2Jm0nla+UUAjVAhdcJX6D3BMR/\nAOs6pKgIed0c0JgcKxluW8U6rtMquII6WcgKImJcB+FqqPsItoU4Yx7yYB20\n/GYVsaFjPaFpML82wTSXiCWAW22v1Jlig8w0MmUmU+MAhNd9DRLSjZn7+xu4\nqKCPdd3FvN0/jnllAv5ivVviFLivAUzOjdIX/xeishQcrwDI1ewClW1uP8oJ\n/f12\r\n=STuO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBv6CvKviN2CtSWh4uZ3/DGihemB+WmHOUY8zSd+Lkg8AiAgJLJ6PSnvmPTb1TNbD5BmHAD/rit/K1mfgBLWrbXilg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.5_1590152474676_0.6040575651096447"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.0":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.0","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-9oCPt7mqqtuSju2FfTolZpjvdSk0H9T9VJGLSUhYcrRSDAncFnefDAJ1t5TChPI6T21gmjm/pgZD8+v33wPxjA==","shasum":"388836961dbadb26a15928d546ae82d73775ff2e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.0.tgz","fileCount":38,"unpackedSize":622870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJey46KCRA9TVsSAnZWagAARl8P/3B7pMZOEroGnwz/ekEX\nxuWUostT3YOWqvrzHlxT8gop/RxYMesvneKzHKQLD83obhhpG+66zbJUJMXP\nVUCvkGDLrv7S1S0QLyLl5NBZm4qVgAPPTRk9AjPCEgc1zfWlQU1kpBPDYxd3\nLrrmfxeNEhLzYNwrrXYn4QF1gO3UuPcInyct+k7Sz+wzWU52MTOuv0RhMad9\nX/74TG6oheDl5ShwZqfwZIfl1F/Z3lSufbLIBvRVzGAEmej/SKdM/v4Lgxc4\nNO5TTnm6srstY00oz7RQmzSY0atbnCuEJ5Lbkw6HkBxZuMc6Ze7JwTOUZq12\ntJnVtlMYAZ1s/u7B/q/rSlDB3mUdTRnS8G9jDcRR46mcBh/CPNIU75Du4gc/\nyVCbU9MCJCR2Ew+qxbFx7TbybypBnHQObaSutJ0y41+hJMG+mbkSyyarayiW\n/xDX8F7x9WWgCaPP314VSdGqMjYPOFsMtwQfQA++AdG6wC7xNZrj4GymBHdZ\n+ERBAgxYpgye8mbX0alSzUdHNzerGP6JSLeUhr26SXK6Yicv7gr/yh9HvvUD\nWGGcIJDXCGZrooLMZfGhEAWngs99bexcR/Roo9iQRFfqMNkhkmPaKkiRx7zb\nCYdCt8odwz9t3pPxTrpfDnbXj8HmuLZBHm57YL0bU2IX0EESvnJNWNyZ5fOV\nrgK2\r\n=PwVv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTP2pxK++K3FCSDe2KuUlEkMX5U8ODGoOdEbuM1PYrZwIgF8E6hZUcb/QA3qucQ9hta2E/1dwXWRHvDdIOkFhTGhI="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.0_1590398602207_0.8920778527638944"},"_hasShrinkwrap":false},"4.2.6":{"name":"react-three-fiber","private":false,"version":"4.2.6","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.6","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-rdQxB9hxMqlPkFQuVjygOCticpqr0SfVMOAcLeK9lO25J0/KrMkyyL+63jJAfOmDDtAOlfNJlKJ50vXWX04seg==","shasum":"36721ac1f8cd10e380aff834ef4345891d18c420","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.6.tgz","fileCount":38,"unpackedSize":630952,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJey8w2CRA9TVsSAnZWagAAaFoQAJF6hP+D+qLwq0zwH3kb\nNJrPu7lj2IfpJ+KAaz30bFlCUSzHDV2RvCeYqJU9m6q76x2nxrR92jgxe10H\n2Oz3Q7gSSSpRPnadft7v1/FUrEkTr220ZMXzFy4LkzS6u98ItyCFOPrBC6p1\nnOAUdxbDdFSUD8dqh85NOHbfM3DOzi+0umRtr7E9PaBLMq2y8UKbFveJyi6+\n8PD+E9y+N12p73d9x2giJ5xyIeYHrDwGtsLam49Tuu72FxcRUJlg/0qlGGB/\n5u7jJzZD1bpLYdyhol2/WIWidJ6vOdFTD/+Rp5ro74Yxg6tXt1RygOcIZv3p\nUUjTo+3DV2pNIYUGtKU+/hwxfOgJfHpVD/DtAL7r82EjnQJUBtgqBl56kuHs\n7q+21M0DqkmMSekkyuoS0swDI0TMCCTLSgCN2XfxN3XnKjPRgPHUdwqNCzDe\n488loD740RAbWRxD4CU4CuXqstyZIRYqKN54N3zJAwoaaFPE09c5v30lDHpz\nu5p9Rga0hDxH+J+QAMNwjDjwJae+piFiBU43t7w8JXFhvddyRWO606CF3Xhh\nSOs41mCaGPYNFMV3nw5Yw8WGCeYBMKpTcTfjiHALMkYVIMq6G7K17T4XY06C\n03R0pKuZwRUlNqcJJyeKt9TgBFOjjUy0Uv63SH/JBOPg9WLgE4s8HYHXppQS\nJ7fc\r\n=+yyB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGMRmK4KuRXNAzGcfmdbNjZVqRS13qzXKtQvFG12avXaAiEA8A8YjXgFyni7g91fstlFOSOoK6gb7BXy8DUHQx/pf/Y="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.6_1590414389790_0.48108177081807635"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.7":{"name":"react-three-fiber","private":false,"version":"4.2.7","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.7","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-MMJL5M1IVFrdLoPwqZuCVpPhO4+AUmw6sabajabT6276fmn5NOYnmxAMI1YLJt7dMBftUv8lrj0wFhOVvpU9aQ==","shasum":"1dcae4300f24ca07d76b72aef050984039908229","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.7.tgz","fileCount":38,"unpackedSize":630952,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJey9X/CRA9TVsSAnZWagAAvOIP/RoBvYeeCY+zV8kunxok\nSzCx9pub6HhPmJYWJWnx+1JeVRQ7QvEEdIIv/vOeSmSNQwqucBbfANAATfJW\nC23370wOzTu5jzwDbigE+6d3/Q7e0Ux5QZdm6L2+g+nRMtIf7ue6DlMQUWYe\nEKYqiqu00k8/Zld/dwducTs1ffTmbF5UWb3TBpwR9UiV6Bd50WwaxMNThOUi\n33Pf3DD7ab/tEGTm98DcfIM7J5SfO+kFZAgdQovcaNi7xBrffUKN0fQ+3H3e\nGmy/QQir6246Tmjw9gYuk8qPTF0P2FW7haRYRi+6+B6VPYX6UwNSXywrBXPR\nnHBBLUWiPRvlHZDohpQQclhkWBqdYn46bNH3LZSA5u16QcxhnELXlDkk0mps\nDH4wOX9xvfGIvw0ThJVX31aKhryb8jV6+ADKiUwxB+Kbegn2KTKwNSekLJCH\nRytRwuv8aQKg4Y63yshMqWi0RCijhOjES7Pr3RcZz6QbDj09gY2BU22oRx6+\n04YIBqLuy78ZkkThGT6VFzazzdj7cxVWd0s6uX1u9nRnyPey0IvPnqnAzoQM\nx5ANfZBAKWGhINfJUtKvqOEpm0p23TjEQfT5u+nuXXjgBAJR/EKsARZop74q\nuCF46wKrszi+am7LM0nITH6jYbOgpyyRedJUYivfxdJimUNBGFa+z/yV8t9b\n8z/4\r\n=XRTG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIErYeBncuGR5iquprp9gi66aK0NCxm4UWWlaEueoKQXlAiAZIMEfzZfMwwGgGuDxRn4t87ZkbjzExfgbxTe2YZmPSQ=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.7_1590416895301_0.8089287001619976"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.1":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.1","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.1","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-I5iI8GlTdiGyZmUVHb9PWh+2TR+UaBYvr7mysS72apAE7zP0kEdULyYFHM5FZYG3ssS4jCbptYczEO859nFJ0A==","shasum":"2508686fad43086d8c95ae2916946b780aee6973","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.1.tgz","fileCount":38,"unpackedSize":626212,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezhzVCRA9TVsSAnZWagAA8mwP/1v2c0IYTey2r6a7mmgZ\n7aDnJVnf7Kjg3Xi57dBTHtfWEcpCZuOZ00WQaysHQagLfNUXQU9kQQrJP794\n4Jg9KJj+KezT4cXEdM6wgGryoRXHDxarSOObYirl5D/MYgipzuegnhJan6Rr\nZY5EVtFG5cOPwpfiHUwohpdKcg754geYz1oGwpZa+z+Xd6+wuIkRjdjXMpZA\ng7kv2kPB8enQSwS5vzRdK4xun2K3wSqOLCe6ea93gXPYjo2LkEpZxMsPbWHH\nA7WmqNeReuGSFsE0BcOx2o2UgbZp1/rxVLjgajt45HjB8E6mDTtKuFy13p4a\nyY+tlGRRJ2CsJo+IYpiF38941rSzJdAV9xjGtJ3CCpnWlMF66ivZZi+UBvfb\nAAa2KrfBNQMIgvX/PTDt1JYSgH2VXZOwMQonYTalQ96emcY0EHOxqntlC2mG\nE4CtV8sf/hNLfLkAHOxnuws56eKY0iwbnp0jNuCXHs4jPX5jvQsKYt7CTEtF\nxQxFUrkBG49nBlGbQaV9CJ2Gf/nyuV2RrDfqxaCtIBgjLJcRJbuM6i2lQdgR\noyBepFvKPrjqlt6jMp1TO4pJ8S4xAwvPGprM3qpbOQ8bJ4qE+640E9ft8Csy\ncKv8fcYMQC1fJ5m2c/HZrxViQzrILndJHiCvJczcy5E+f0NwhlntoOjGA1tB\nj23P\r\n=aPF2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH+nozXJlktuPTlDye73ld5EpXXMQUMUFG4zY8+5La/vAiAP8oxwEvPGSZLAXUokhnOFEc10YTCYIMXVFw2gCieF7g=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.1_1590566100813_0.7761745980467765"},"_hasShrinkwrap":false},"5.0.0-beta.2":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.2","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.2","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-lfqjdyngYVfmaI2nBVeAuYweQ29lQzOYEKF6Ej/naG8gAg+Rkv4uziDwcY3QftproXXBz45k4JCm7qrQ3YbyCQ==","shasum":"697e2beabc3e2c106e797399728a33611bebeb41","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.2.tgz","fileCount":38,"unpackedSize":624558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJezjBdCRA9TVsSAnZWagAAax0QAJNSQzAiL76lGyfGjsFT\nZtyTRUaFG2+0Nsa8hk3ti2lJHxOuNkLrM2yu0tYKLnvBMqmiVJhPGe1U07f/\n+K65hcbc7/e6all9NX4XsoPX+SkTFj1VTk3XbI/1mwQSOLMNAUCJM56yjh4X\nfnjn24+xf3GkxQxP9VCW4vxqP7+Nu4Fs1vvB7bVsaTx8WaF32UOOpgnGvzSE\nX1HklsgbVJ6PvdZlscRvm0VkHTwB1K5g3Kz3lyCpngSJ/37GTXl6R69sRAw9\nyK9Y0zAp/6bhHhjoiDKO2LRPa0s+NuAyYnIKggdl8zmFwVjs4Cn/Qt63zX4H\n7RmJTfYjlyKWazyJrFumBs7y8NOJGdfk7MzLNgN89ax71d4dxTt+YPnz+e0j\n478Ndhc+TcWpONWd8o+/SF/QzFZHAomqkhJvS/wK2ArLEjsMszlkvUxLbK2s\nKrSGaPgFW22624OJonY0k95yvQNh9Wl/iIas+ncCCpDfYqpBTuWXtlYW/B1O\nn2K8vB2zA7zCRrSdLuyEnpCJNXXGCQ4QZPsR79Ma+W3TIQlFuUn5WLb296Tx\niX5zGvSbe2p7ayvtKlet2mqcpEltcWqFDfIqhlWb5xepdoW7jOLpUm4fodZd\nweU9f5cZFsHnSg6G3drKwlFTAjuFMru+ayg2RtrEayVAivGVp1wxloOIRWaN\nchtN\r\n=dPKl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtcA7wpU9uhvPn65IbLauPHq2lstIgwW4/+kS+9BDAWQIgDuLjWqlIgC+ZXMye9fWjpWNNjVQYQxT1iYBu6CNtvLg="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.2_1590571101070_0.20219861091484237"},"_hasShrinkwrap":false},"5.0.0-beta.3":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.3","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.3","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Ivar2LZV9koIpX1wDnOC6yXHriD24KE3pzfDDlqB3GsQO2bvQNoZRN6az3O5ZkGj4xmeLmMJ2CIoQZ1cnAB0HA==","shasum":"596a834e7f4f3a3180fd725f1c435e25d4c13ba8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.3.tgz","fileCount":38,"unpackedSize":626080,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0MhhCRA9TVsSAnZWagAAHMEP/1eN4FGZh6poDLwt9cLp\nqmnJeAgWAMKE4QaWOnInN2AEw+uzWyVbxDqFgHqirrhJFWgmrLoD/zDeJPCP\nl2CZx5s/TMOhxb/7E1xiitz5i5OEBGmHNTM1AnvgdyVl/OSWe+e5FBL6G+p9\nggkaThgt0d0sAqVWCwh4vEY8oRHp5myiPmgLOOVJkdjae5Q/90S+CXRGiEEv\nRQGofkLRNN11cS8iXAYebND3gykOCt9D6H5g8PH323cYXUOPKPJuMEMWqEGQ\nGqdqvoxLPteKuZ81PSDpxE792BWw3nocLFCS6wg443gOoCI2USUb+6hU0eMH\nRmmqW2C1EYv4qf32E5YjXp9Xx/pngFBPdTlDi+8FRUa4zhxl+USCFqUdZ2vf\n0+dzCK7Rg3lnZxbuLgkjvd5l+0+qlMMxyE4S9AYbHC/9/zrVecL1gxsNS0M+\n3i6Myrm1qRT/jOvfb8phcZChpErqq31G8JZyjwoJO3uEOgpcGBGwR/PDAp8D\nKGE2rwXT8Q7eDB1CIl/WuKBYdcCCEyA/apfuJcRNDAOJt8ZXHlnr6sfVZII7\niTLDTTchE6WFRHse4H9Rpc9gIbE2/+jGdnZwuK38UgevAebSCL1HuMg/cpTK\n2roDzCbT4CKRrpduUYFzeJX6F/JtAsA/MVzxS6MqnrI6V0Wpoe3OfZONnZKj\nFhP9\r\n=kClV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHulqhUL4Hdjh6CQsICmQGDqAsJJ6/67STcBnyVzMv1jAiEAzI8T3N1hp9ho4sLQpBPvywdLoZFKF9neu3Zj8fijRZE="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.3_1590741088932_0.5514037284980713"},"_hasShrinkwrap":false},"4.2.8":{"name":"react-three-fiber","private":false,"version":"4.2.8","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.8","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-/0NiheBNP5drtEQYg5icBNldG0AlVjqRS1XV8bZSF0lx8FtoefllKp+B43B1oS94EU+z5DbTKTTYTwjIm99k5Q==","shasum":"b46b5d621dbffa3945655071b4a3098ff5c11414","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.8.tgz","fileCount":38,"unpackedSize":631252,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0OzSCRA9TVsSAnZWagAAnvIP/ijxbVr0gp0Z4er5M7jT\noNVVADBXX4xRtpr9eJ/aJ/Z2dqm9Vx9kSQXgJILdyCZWSXFIuPGBQbejB/uP\ncH48liJTlDXImL4szHwy4wmGYNjbcXeQnXdmeh86c1qg/jMrmuNAK2G3f9By\nBC8ympBkSo7KmStsj9pfMmryPLs9TRVHSKb3JGhwMBtIJBX5KACjodJQpbno\nStMvig2nyokiaJuN8gO4O5bfPcQMy7v9m6HLj5whCJipgC82h06olCSDqb+p\nNa/rtSZluL7K5TkHumYxsk8vAcaV/eGsz86xiruzHnrkhFYWHUgFTXTzA7fr\noc+qcWE9zLPmasE/HJdbYwE1JYTm3DC8Wscjy1vS7rjTA/FKjNCS7LLlsOai\n3UccFFk6xkNPOFMWBfigO+NVtiDDlvqETTAlT3CTBTlPSL5kKJ/G6/8Yn5Sr\n/ajyYWd58rOWBEjR07WS2DverC5pae9VSP7Ktj2wn8fs9hAf/wnfm5l/zG65\ntKSwOL2xdHe+zploE+Uh++HdVw85AedtbF6QCCDQRwau6N2DRPIH0R4cqAKz\nalQskz58sOWzjAF3JuaGixI6LZ8x1Lld5qKDx/zwY86wpHOSXKGIa41aOgSa\nfC3pVBqUO4tOHDREF9clN1kiBqdA9A/rER0xzEqBE6FW0G2INNt7INzI8WDY\nlB0z\r\n=vV4H\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBKrWDimJc1sFoxRLa4tG6FI2wTIVJxM1HjaHb3bbQCzAiEAkColoss/zzLDW4ToOjk/VjbB7e20cls4o9nQ9tgESa8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.8_1590750417522_0.6870382726176543"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.4":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.4","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.4","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-SghmfGXw2bfQmnRycVkpOK1DYG579Rnz67apCxJVHGO5atOStJv3UX/Z8bonMnnvkudBmy7MhziacN06GfPijA==","shasum":"798aae2e118aa623acf9020c7b6cb52632d4c3d6","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.4.tgz","fileCount":38,"unpackedSize":624660,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0/upCRA9TVsSAnZWagAA6pUP/3oS2+C0KV89nGFYvsQg\nx50gbDnDUDoDue0rNGDCRt6kfv37Zl+Ji6Ctt28mAq1W+SISxlZZqJDCrYwg\nU/4KvODWzM23HG7fp5dZjvUHwNKfsQFwcVRlgXvEv05BV1L9eMtYyg9pZqF5\nkA9gfXE4iHdEmRACwswS771b/RBwwsY8CQNOfvAERPo+EGdD/uqNy6/4AfDB\nRrXD461ruHo+bql74gAubKtDnzuHU/Oslu0GwFtywXdfMYbgHdK1kw9BO7L3\n69uswmvMIU2TH3QcO5upAjT74bm7zMu/LEndtEpXJChpAoE2CFbMBScxLYKB\nIJPKVPym/f5MsWSnrjz0JkUqMRPF9glIqZM33MjWgOKS3yyHO8kWTdcMsVrn\nr/wgzS6VnZKSXlpFaQRxVazA+r6R2iW7yazHepy5s9Ral7C3rFkNz+cV3+ri\nwo+NrBaV9yL8qzCZyFTPLfmv3ZBN7a54CluT5s8cu6byDcxFA8jwINVfVpwB\np9iIvguR6kbfs9YS3zVqwC6/myLQujry/9DmPF8PxuItquRM9aau3Rwa2ghY\nWjVhvfkFHXsJm5rTo6TNHZR8pfrqTvuu7SHCTzStyHdp3mJTm2MAcLjUneMf\nZDEdTsEwPjyCxVxBdtsmthJOZhAOs6WcpA5BJlbKYxUlVTPDj2JoDxm38KYe\nntvH\r\n=i6kN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRyYDfiP40gosqpji1MzkfM4sP/0BmypIm9nIiYmALNwIgVJ+LWAb2jpMqtdCsd/MlnU1Ad4et4bon63hMbkuS39k="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.4_1590950824966_0.06616153684881376"},"_hasShrinkwrap":false},"5.0.0-beta.5":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.5","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.6","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.116"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.5","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-qMpYTzPasgqSPw0ITtSu/W7NzrcFLSJlRQRI8r1xVRrzW0gdFI5RtMKWaNLUHW8SJ55qmGlNxVcX46lO8ahMTA==","shasum":"fc4d783fd78043fd58966ebe6149172f48c67a55","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.5.tgz","fileCount":38,"unpackedSize":625015,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0/0gCRA9TVsSAnZWagAAZRsP/0Ih7KkoD37t00/tVjbb\nokTWIKRbOxfzd5Eew9QhEbQHirGR3wbJl/vbxOLg0FZmPwFb1NoRLBGjoYtZ\npmHw96CNZTQwvEZcUalIO3NNudWJ3m1j5w6iHvfAum6crJgjXiMXarRB8cFE\nt/CeVzNTdAg9L6NEFx4YmOmwDwesQKnnhMT6txgZd5lXFuZyHwKlJz1II7xO\nHyX0SprxkfgHmOY9DOdrp2ksMEgDl3QVVVs0SQWGifAWg9kg8+5DA4d8qQTE\n1Kw3WSQPv9wdATkVx2yFAb+cQbqYqkn28Vjqfl6c/V4HYe4P2/A8Aoe98XE8\nFzYq/O8Fy/hf28MK+EokB/u9Pa/0WnzlkcJMgi6+7n4o+ny6K6t8OIAUFlHd\nV8JjiXlai9tWcYOUkCtVpjOdEVARTQ8Ei3HW2ihv69Pr7Tcv23ZSgHFXKF5G\nRn947pzPaFFYp3FW5ZMFaTl7KKguykr7iPmcGLF87vwhT3LxEzLq8cf2jbdz\nbo9P2WN39RcH62OCzoyij2MhSukJT7cIoMbRplIBj9DlenjeOWpvhnwhRfF7\n3Sq3AtevJQGQVRatSslsBfYynz/1rFFr5yNdcXsUCrXQQRaAouRfj1hghcV8\nljpvZS8D5x9s38lhsWviHuzoGFAlAZsk8/t0VlzWLR0mhapLhMTi7GGocvo0\nUytK\r\n=YCpx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDE5CxEUeEDkhGKe88dfrWWzAIW8IEN7p9PK94eztWzsAiAXkx90BPjk24t4J/LxnTXQjGfPG06V6dWuqJ7tUOEBRw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.5_1590951200147_0.2608502338531782"},"_hasShrinkwrap":false},"5.0.0-beta.6":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.6","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.2","@juggle/resize-observer":"^3.2.0","drei":"^0.0.55","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.117"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.6","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-c7OSRan4ZObO1zHHJ1RHxv1sk/PN7yRvdckxv1nPTI0xNsYuUw8sFc/lQHWCzdNMoCpN1ZidVQ7OpAa/TixV3A==","shasum":"bdc2a10d88bc1c08fb9f6aa2ce85d2a6d7408e93","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.6.tgz","fileCount":38,"unpackedSize":626728,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2+HACRA9TVsSAnZWagAAp1kP/2e7rCFaUv+8PPuZb0yR\na85PaQiimGafXyhBAXFNRPjNWhQg7WiDRhCDSx3Af5wUcpzvwDADmWB/qAab\nyb3Dbx/9hspj3Vp3vMCLUdzww0k6MM3gqhgixske65wonRHf7fV2ykjlHKPL\nOadGp1tquT5DZ/q1yCH1uwsokDV8YW544BJdq87L6BkbXiuVETOkCL49GEck\nN878IXIz0+xPMvzadLtblus2BLFZtx+GiaJ84aaZ6LaqfrI7C/6i5VSo0ggK\nOOvDykE3QGtstU1QTdWkaTa81uimPkum/ReaaxBp1vuiTBhVdv9Nh3HHer6i\n4MJ+7qrl1nC7ivSdp0C9cuzJzd6EKmLt2uGBEJEWhcVcyqkZ8M6AqjV8WpXg\nOA3+NcHvnExXep2qEdrXltEJkvhGCMDTt2O+Ovt/bDyKNon+Vk0yRk1i4Fmj\npwMZdUBmJAkKCDvUrSEbDOzxEjON/4c1jf/touisrXjpnjjvbywqgGt0uQ5x\ntGoc5ciDMaAu/iTI+N5lcPVv/pAAjneUTabfORPV9mVFpUqYGDo7x5tkitS8\ngQur8Do6HUdBLEGAV5ULozDZdOmSyzpS0ExWVcW5n9FqTn0SnbJ3tT8VxXpZ\nklOTeHG/dBTV5kuW0VhyC9bTPSKTgX48uic4lZuHhwamgYehRH68zOkZIP79\n7/uY\r\n=B+hk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCG05qu7Vbl8ifTKzfq1jVUVYZLxbnSrJBFGxnzU1ywdgIgSrzCvjh+LbkQcbO+NFSCZ0u54xKP8wgfPld+n7byrOA="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.6_1591468480286_0.36149077451703526"},"_hasShrinkwrap":false},"5.0.0-beta.7":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.7","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.2","@juggle/resize-observer":"^3.2.0","drei":"^0.0.55","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.117"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Eco system\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.7","_nodeVersion":"14.2.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-pf9vKTJX7p+oKUiE+NjXv4cnk8YVQSc/B9e0CD2hiYea9hXoVhT+fR2AYjdu3OpfGu+Ayt49sk1LZCAkrNwWgA==","shasum":"fe93ea50110ecbfb489929202395dc13a3d7144c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.7.tgz","fileCount":38,"unpackedSize":628163,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe2+PjCRA9TVsSAnZWagAAmzEQAI08gpIYDjiP7BJZXw0V\n4XktkhNNWZVCkqUL0tc3bBGIhfN/wqZKZgWNoHb5bvQrggMuxsyj3b+iLyf5\nYkg43MT0jqozhj/RgrtEZwCQtR/mH1vXRRp+6zNZdhlG416cc4PmoihgfEE5\nXpcS1itSjymp2ge2wZtbFVGHgVo1w97ytIvxa8btg3Z0x2xnDECcIx6rL6St\ny5KBuKhZvkRRmY1rFSuyV0aRQXeblZal9iDwiVICfaklXbUdAnsAo5/Cigpc\nWyF5MElVY7AONpX3v+8tqucRPzu5bWs4s6Kgw4PhzugnzOKIPXBUglXDr9Y+\n6SVxOOcjb0t18MYsm23QXsHcH8nOw3A7PKWFl2rFlWCIopYACbH1C9se9lo6\n5qmOLS3k07iUdTwmK97HSWkmvI/HPlcTjt4unRyppoeMSvRSMLQPYJ69xOPl\nc9A3Qzxe+PuwO1xdj2piHgEnfLYs7xcV1UM0A0hvHAI5fXqNYlV1zigLO1Xl\nf3dgfL8oUrwDihKZkGXZ3ykRiurH+UOERsjFZnPTlqYJv4ydw7n+Pg1sVtu0\nEEsCKJfmyA2o58bhkAmupZ8oWjLMhCpRjw/08Cy0bwlstiwcufZ+v1AdnRdf\nvka5KLc0ML06AHoKoF9GQxiCluW1Jx1lRHjjdRiGQVsBH2MIMuySMkElLY07\nZXDf\r\n=yhJp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFMvZNZD/dJv4KqIoOWVb6oz6+N0f69yH0D4AAcEDgSEAiEAhKXqYAE3s5btcQ7n0Mt+JhjK1qJ8IfUiG8YoEBKakbw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.7_1591469026757_0.16059989180054668"},"_hasShrinkwrap":false},"5.0.0-beta.8":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.8","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.2","@juggle/resize-observer":"^3.2.0","drei":"^0.0.55","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.117"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.8","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-WSK3zrSZCh+Pn682hKpW8p4w6XDNsGyKhf/jSLEM9AtdfqAXxlnNqkaLAmJjzsqsWkFUPeRfalQS7xFxV4FeEw==","shasum":"6c3f0a6efe67fee0ba92bf4b282ebbf632b31a0c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.8.tgz","fileCount":38,"unpackedSize":629974,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4kHACRA9TVsSAnZWagAAve0P/jU6zTJGZbQRhtE8Ll1S\nVIxqO/MSkrMpZgvNSEtJWZnivHjS+tXgiI4y1JssyS3VXSpRAnExyqxUy3fG\nWEjPrFEYw2RMrIzkHOdefix4sb7GO/vNK3R0S4pC8SsG/dWx8QQvcXnP6ctg\nlwVdpVTO7W9dtERjGoVdScouRaTv6NSzzCLPcDRzTp7hwIUUqmSlm0W1U+Nd\nZElwhyE5ajPWkNLdCb5jKHy4OS49Ac2tolgM0S/EA0RsO2Ko1a+Wse/pAec0\n5aiklvchkL5lR00FyVGvzfWEWubpQCU2jlO58PkJYD5OcmDfiUn5j4wDLPpJ\nh8FLTll1w5bR/wyCp9uv/hv94O6cFoNuBdflrUgHeYNMaOJEE+NS8TsJxRTx\ngZP/1xsDEZGNFsQ9IHts9cwEm6HOYGkV1oiY+HlDq1Kl/xvDnf2CyJ8CJieu\nQBA98X0x/BRFh9o0xKik4a/xpc1LG+5f2Nfm0JeMpjUyHZwu9t2qfBbpnwEg\njDradHfSyxvClYhPFFe4EBclKvkOK+IKnelbJd9gks51LoUhPdi2KYvZgtNx\nZOsmGVydaEVmEBMmuPA8hn9NssbDOLWpK6TM1JDgort5vy9xJ2x5Bbbh399g\n6RD7/rMZVhFJTlwkEayR1v399N/oWMsuSg/Oth9WMak9ZsPkokOZbn1QcNNe\nJCzm\r\n=DoYC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDwPv+MqEwLirz1hAOQEj5yiuH3M+z8B9E8LcPQWikMuwIhAMxYaRqs5lQFsVNPLiSel+IO2hltCgN5qG+NwkdpNgff"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.8_1591886271479_0.5986579645810206"},"_hasShrinkwrap":false},"4.2.9":{"name":"react-three-fiber","private":false,"version":"4.2.9","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","drei":"^0.0.52","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.9","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-xU3YMI0iTCX20lBNqtoBWfIn8iLT3N7id3PKFNdQ1WSgPcr5Ph/9Ys7zcesJzPl0LW2L6oFrPn+yaAVQGVlENQ==","shasum":"d3ee71c794c1e8f568d3ac3e681b8799bfd2a6c0","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.9.tgz","fileCount":38,"unpackedSize":632617,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe413DCRA9TVsSAnZWagAA2P8P/Rf0Y9lnFDfsdba2MOL1\nTTDRihiU2I3nG9wrF+KBouS6h20w0ENY178hfDpMJv1/IoB7qDVuenZ8p+Ux\nt6TzGcVYUGVJ7SSohRcN5wriwJsJFotxXqhi5g63TQ1EeEKYPljH0fUmS4/3\n/gHankzTHERUHrYkDbciRkM9Sv8mFVBGNkmp0fVDj6k4rvABehRJitk30C8D\nvT3+j16wjLq8NKvCSyplps2yUeWSxulUefMQizNSu9lMfzZR1vP37SmhSolI\nDG4s7UR+BNCJ4Y/Ze+54UuTgxnf3LC+BiM+WC5U8wd+x4bIt0LOfgebbJLK/\nTWtMFwdIvKtodLyTdGrZrc8x6del9gZO2OEJio9Ls64W1UHdzWTsQu1s0lp4\nUWOei5y4F/uJg1AAsXDICjC+lSDIQlJcQiLtqNcVl1BQ5jUpeeL4CBe0WXj+\nZuL99yQoAnpnThl+5Q8AiMdyKESUT85Oz18Ef+QKQBew0XP6Fe/X0ZxFSbZz\n2w853EAfp6kvFAVMeDuPBceuaPoJuT69kwHVZkIRZezygCQZTv59WT/VOOlv\nYhQ9apZuLXfqyneRxamrxSRwon4lvCU3EBOkd7hW8vIqTHyY9SEERvT9Vi7j\nnkxeM6Fp8e+TYk7jUcJphIVBIF9VVKSLaPJcCCfwxVH6lsYXvgeeBNEAC1Mx\nEQfX\r\n=Hmse\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBwrjWyXy/yF5Fglv/gY1E1a+K3I5EdHbof+0A6tMRLAAiAnq+RPRwHDN3ckJ1xL3X7ez7z+NL+p51LbGcipcao7zw=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.9_1591958978374_0.4592167953481978"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.10":{"name":"react-three-fiber","private":false,"version":"4.2.10","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","drei":"^0.0.52","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.10","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-6H16mduQrq2CXk1S/bX6547KkJyFhEHvOidKf553CkQIjV3+1OrRNqeVxqDC1Y47xeqo2Sn/nw06AGeqT2Cqtw==","shasum":"68ebd7e710ad2e357dd6a3db7c5473bbd6f792cf","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.10.tgz","fileCount":38,"unpackedSize":632636,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe42TwCRA9TVsSAnZWagAAQykP/1rfFnOj38/PoVNMimf6\nqSqLVHj+Ju6lFgkBsCwCnYptThEI3Ce+cdByJ1tRTXTBJ9xDlayS46ojp+si\nGjQe3izWhpr9vntDFAshCM9f8G8X+MXIEMtilhX8wXdgsDpwhfERl71U0eH5\nxeYdA+iqHnPuovlxB6W9UIfCPR72lL4w/b8QOxkwFv5ZzPYlbDuoxm7us2Kg\nGpeFPaIq+4v/kYU5xVm1SS2eQyYt/ef2Wt9bG7AosLejxr65FwNJ5hXuH+vJ\nZ9v06RTeR4BpBknnLfbT8pv5v73YGJdpIAihh8EtnvS6hWka4fhxHdJOC1CF\nVrZagrFMZwd3kd7nn8HSNdgfgvosR+p7acqtoJkCup0xNq6ZDIGSw4lAl3vK\nfk6EYG7v7pvxnkmi253aD7hb9hUg26RvsmQJQ4ZdWDO8LImZSWA2yjv7uBFh\n8X/9GWtgD6ChFpwxZIUzBljUKIOz0d3E+PfLd1ZOXLTuUfcnyjXacjJxwMJp\nKBuXYNO8PafcWhNgc52xRVvHQCfnnV6DuBGWZ9pTpel7Ill7oSzjuXDojeKS\nqoive2wir9svWCvA/Xf3YsBfAxJied+ypUfdwm0GMYOFRbdbGc7pJQC3XFS1\nilHSRUdNn1kYsGB97SXzaQKI1CVttkqSxoJDMrmqzcXrVu+j1076LqP21l0r\nmovb\r\n=kCXx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHsbB0ltSTDPSfAlFuCIB0SM2UUwz9saYIpcMcmjMkhKAiEAjVlo86LobkJXMdosy8P/BP5slGInMpDcGJcA+JH5OSs="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.10_1591960815896_0.43529475617405167"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.10":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.10","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.2","@juggle/resize-observer":"^3.2.0","drei":"^0.0.55","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.117"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"288\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"288\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"288\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"288\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"288\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"288\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"288\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"288\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"288\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"288\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"288\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"288\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"288\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"288\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"288\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.10","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-FZLTYBBE4Y0xWoen6DR+b4JxKafhoRJtxC17jRnkhknZLJYs1nITGUx4E2KY5ST5nkUHgJgofheks5QITd2ZKQ==","shasum":"2a0466fd7a993a74feb6d189fd62583b009cd4d2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.10.tgz","fileCount":38,"unpackedSize":634772,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6on+CRA9TVsSAnZWagAAGFoP/1Uq3eB6JVapd4GoTgCd\nhN37r+wLrg3zizAie4sJljsw7Q1yAAvLeQ0KSTU/sa57ax1LakwStwa4nlDB\nwCQ+/FQ1Dyw3R8gsHffosPGWRjxwY8qPeUGpXht1Rb1k/vF4alXL1/rNHHsE\nHjfo9It0gapgtling/eaZ4VBTDsLD/t2Pat3wppQwb0Wg+hVGSe9ctUhtGHG\nGdwk3jWuYzpmhV64BveRyrI3zd/hwrQLcH+NJLJTygsjWHct9oWoTMaE9R3u\nQaU+BtemfbmEloBsBvkZy87Gif8+pbwQk8EfuBFxmfkT24sxCozet9fxfuVG\nHDkLq4aQz2TJ6CzR8bnZQBKfC8/HMeVdCiVhzCsiBHdIBDwgDHZJErPxpOyH\n9wJ9ST4BkkSiGrq2CFlMt1Hh+rV7lqRSIGT+OZSw0KRvxFo7k1gBxM9Y2x6T\nYYIe5NnMO6RdR4et6VCnd7L1SnRU6+0mRHAYqRZC3Mf3y8RYfcRA9bYnqyUM\nvrmsge9AWbG6Du5ZPrLOW8z13AUNhJhw0A9Tkrgl6tvDME5Et80Cn9c6yy4G\nGhKWOWBxUTZ+uqpChxAMwErZJfMk1yNIC/g0CtmbP6326vn74NYeEGckGADO\n2kQGly8C1pX0d1wGAKgE8AIyGAHpE8NAOs2uzsSqxWLgTFL2zXAlektMr1nn\nwzQX\r\n=+9TF\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFs8UnyZYTjx0qoU0iDN2vkTXBLjkqu5+1Gi06ZMIIMJAiEAhTcwXrwiwKuQrX5cnmYnN/riP9j4LM2I72eTPUP7m38="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.10_1592429053381_0.8429823701717112"},"_hasShrinkwrap":false},"4.2.11":{"name":"react-three-fiber","private":false,"version":"4.2.11","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","drei":"^0.0.52","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.11","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-M8slX+aFyJ58M270u2V7A4WIQjzWs/CesJ4WusWFOdszt6vAc83OUCqIN0+Z7dBEc/f4CWmsiTwpRFyTRnUsyw==","shasum":"8dae1aa359b32c886be1ba80dd454017c15d5724","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.11.tgz","fileCount":39,"unpackedSize":636501,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8xC4CRA9TVsSAnZWagAAkOYP/0QpjGchSt7fZFSPlhdL\nsW5etniNerheNLg7PPRSIpmnToeN9DCPqVh3hx8CQdPnBLjOtZnzW90qymAR\no819rSb3Tldor6zLbGyx+H+n9E1V3zgFvB6yWUx82FgR/aJ3rm/j9r3jesm/\ngXjktw/h47SvNdu7XpGGXD83jDmOIoMhTzrVD9hIBvpDICNIrKmVEWp2Wl6T\nOsjwrLN4RmbhqRGMymQsIxLuEYroL2RtXVl4i71xbwPX/U+yJaVqSIr/cgMb\nq6hPihJ5l14TKDjgJpOMwj85gfNoEffurREwLZt/+GL2Xz0zWBWsIVaowRSH\nVyfXoSs306mzDXLNCbAX4u+e0MGR576o8LVaOYXmskaSjEZjrteg0IppGfdg\nU/29RkWwPsaK4e2395g/yhIcn+gZvWnO0BjkjtvPBpBfWlDs3L+vbhD09Mki\naWl2V3B4PMigE+kR3N7cIs8Se6+2oyF3U6ufpd+cs6rn6t9bEiYW4NWME5sE\ndo4Y9LIzznh0w04gqtkmf0trL2WPXt1dyzZO6fGjL/ZGiWYzPreglI/Bq9un\nH7G7APiM5NBQxVyNSkb8UmDOB/f88EqGjg1HKM/xnnlVNFfEHLV5KKHLplRS\nMN4HFKla7FaoVoxlYdPAF/Q7N+dsaD2qS0aNo6jPFvNkbZ8JifJtRNwxN0+4\negTz\r\n=W2SX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDr9iYG8ZsBVnKQtD7IT3wJsb3AREtn81jL94QZbD51rgIhAPghrMm/Pher4kLkZkrfA+sFFnxxHxrsXkAkhiMUObqf"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.11_1592987831933_0.39249614065038596"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.12":{"name":"react-three-fiber","private":false,"version":"4.2.12","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","drei":"^0.0.52","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.12","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-d+oSJ/BgHWvZQrUV3Tu+Wn1H5reQAhLaMsmD7z0eojrjDBg2azWoWTaHY8oaTGDFWTF7dTbGUe5qwRUApJ+PYw==","shasum":"036bd6e9b5f0d1e66ac698a21f88b5291754a739","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.12.tgz","fileCount":38,"unpackedSize":635749,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe879gCRA9TVsSAnZWagAAgWYQAI54pfyAaV4O072kZCuK\nVYZK28tVjU4/v9LCT7P/MgGEH4kRQJiXAx09i3JCRgAWvnwygCek54J4ThvV\ngU9vp7NL2HSGh+jA2MpLLrDo2XJIq2H9MZlphbe2pUuNYQYER3+QtiKj8FEB\n1tPFyR/Chwje7YGgdgQLUzLSbnj389MlBAyjGPOOMR1WlgNPpbm8HnyLB4l5\nsyS+TB9UxEC9/FIkvmEexjpLQfT3ap4AjpBc2qRBvb9CI31dfpMP4BxIn0Xd\n8xA/dzXoCA9mHivDvKKjeaRSEd+y+fZwrja5FIUx1jlxYXMqi0inBhri6bxm\n5mifuo0T2U62Yhz31TaWUUvOpQdGN6H9HGoUE157mz0yakva8hshRU1zEbkE\n/bORCJiO7UhZmJVLLTA+uN7XohMZEICkyRlAVWCQSHcywwwQ4oqX39/q68jS\nkEIPhyqyfxzdyNtNaWn1Jw1dK1Z+jruInMc4OM3zffXQootuDp0QijMFPuNA\nWZxfzO16D68yuubmzF3MvR3iMBf/8h2NcrfaWazyo9WbQYolWAsmKo5lGyRa\nX+P0vhQrwQSgsY5yCsiVgvRo6M01OGbi0RQtzGSzkSkd7cDsmaPLgl+fgVer\nEHXp4Ml2gZgespQBpv7SgG9FO1zZBaBiZwY5NO4eWMih0hGzMywUEZTmefMQ\nAMH4\r\n=ak7X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCeqF5eVk7Izm91JjY7jL49nea96FUzazC+4IU+iMyLbQIgCr8+C38iaQstCzDJQAy8xlPyXxhM5/TE6cE8Uf8spTM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.12_1593032543975_0.1854804364708984"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.13":{"name":"react-three-fiber","private":false,"version":"4.2.13","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.13","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-BZ48cqWIcnOAPRtOYyPXlNUQDKbizJDY+uGhjWD1uHogBxUpuOyTGvMrm6fd6PNqvq70RRcessUeO2szBwJn3w==","shasum":"1a53672507301101d77723ab6291eb2248875d56","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.13.tgz","fileCount":38,"unpackedSize":638390,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCFfkCRA9TVsSAnZWagAAkPIQAKBZLq14KEkePUQx8Qy/\nnfLg20YCqHpCQigWC6HW1CkF7NGyufnXn5/eXNt2vSNGSkekMQ+C+6BE+h8p\ncWh/W9KajxYs3nUPldRD/8bV4bp6FCVpi5SSMXRuqv1HS3zCIRxfneccdeIG\nuoBQ1bSkyv5xPeS25E1AYlOB4BGf5dHHqrvixQirNUxIDRYdraSk3EbdCtVN\nEveOeLS9/+51KLN4N1Y/duEsWdtmWw0eSCCNB3z03ozoDQMcb9erykQE/VBF\nDP0q31T8L+n0nVcurRhcGK8r9OjC9zPBKti58vVvuyLUYuvWjl+0jxhyGJgs\nkkIB1OGy/fELHHjyADCCP0NO9tvMOqX7bLJIHrptW5Cep1XZexyHEmRRPbzV\nTlF8Kc7r8lMVpyv1/0C+a05COEny4ugOGf3EnhWW/fEKNDnbVKu0BpsciE89\nPJmW4XHFheNbehXDiAvJ3IDWtIgBFzteujUwEXaEm15tCWE4FhenCLIXXltg\nrq+r6tLrhNQUl2QEj4NCb0kF03tjGfARZjAAUpCZ7ThfIJteld6Ad2bPIlg+\nZaKXddX9NFopj14qSMtkAfYRh6MbY419EJC+XBKWv8W0m8F3zOe/IzGDnoSE\nEDsqsi5+Lo9ohVjvRoBcwW78ZcZlaCr1KViymHt0Z3ecwca9jgl5kVATMBjy\nDbgw\r\n=XEh4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGO3ovWBn7DciT7GZNB0/tgDKWJ3cmfFknBdza2u90YRAiEAwtmklCdLN9IUR75N2OxTcZaY98fsxGp9XbZ0XAigzdk="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.13_1594382307525_0.49547557426977407"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.14":{"name":"react-three-fiber","private":false,"version":"4.2.14","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.14","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-dXtebOLoevmna8lyTJykirqqeGviv4lZUwByQy6nOlXoeCaedjh7IhphR5d3QHHyD/0ou3gclBZ8nMeZM+e4sg==","shasum":"8a4f614471b752665740cd061db48bd2da1d45bf","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.14.tgz","fileCount":38,"unpackedSize":642824,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfCzeECRA9TVsSAnZWagAAr8oP/3frD8X+M+rv0rUNVB0A\nT5HQYbKsMIZ89HTPNXnOkC1Y7M+HTtylrI+NATjUsvMisHXrAB9CvG8omp8i\nTq6xB4uUemcEsOTog2/vSBQwH1ZKtdQxrN2uBfLMiWlfsq35bQdgL7fvz380\nHUiBZe46Quvu3WIkDtjBvDCHqlh8TyHdD5LniyRbzANWJILCDGWpSdIdwjJh\nVmiBZx00Y2X91HAsaT5300gbKjBlu11uKSq/F9YBUx0X+l6u4BnO9rTMoRPu\noZSUuyfIe4qUJ9SQHmhvq163OqwNMGvBkgAmS0adAfmFV9LCpvUs9edRxvfA\ngItidSwDQDb3hky7t71N1CoWl980Y39Vr93MYPDLbO7+Fkrf8FKrjqOauJbI\nUPYwJPM+k8fb828yn1jmMIQ222fNMcbukhCjwJXBzUgkiDIRKpLuzHyPWGSa\nkqQUArlvUZsWitqne8nHazviAbv0ymp+xNA6FocISEwulkiTIEfJq2aySPuS\nhGm5iPcF0jYCv4p5vD9pjDmN/p8lbp9+TZOhWhMLxn7O8qTP/9K6N3mbTcF1\nGmZlinduDJMZOOBKRVOl3cGwm6rL0YyYQv+8p0G5AFBfiNcUdWw1R1p/AP89\nLlrLH9n3ooa6BXQWtfx2qEkYJ9QkELPt20hIcl1Qnir+ZgVaHoJKCfYRWcfb\n1xe0\r\n=iIxN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIExejBUuna/xtVHC/FOIugBOzL47PtbpngvXqAbECVlOAiBdyngHNWrtZG9IEvgzxhv+FJCCau3pazjKghTdhEdLLA=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.14_1594570627895_0.31756368000923274"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.15":{"name":"react-three-fiber","private":false,"version":"4.2.15","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.15","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-lP0LIaov+9jkrG0cWtYcGs+9ETjosyP7pu9A8cd0UT2MZoz6BihJQhtcqPR2GCNAso1o+tbddb1yJPskH2hTkw==","shasum":"de16c3dcadcc520e149ff5603cd93eb04606dfb3","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.15.tgz","fileCount":38,"unpackedSize":642684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDXRSCRA9TVsSAnZWagAAx08P/3l9QdMGu5+cH2jJH1Dz\n1+NvRrrYkIUFevJqYXI0EXj9EzLqP5qlb953p/vxaGPzQXxAAzLkgpHiBv+h\nGBrMucbxWxFLWVQzQpkeiHF9V+mYkmvYUl1CczLHtx0t9CCNZrkeS47y5EAe\nJjYb+apMKZDI0SjhWFCmW51hjYwNGo22bhKUuRlKDwPXaoaV+QbXFo4gaZ63\nnAXjBhHGd3rqwcOvTy3rhxN5bOtwJrzS8rlRow0IdtjgdNgWJQ0wCE8PNS3M\nH05Rv2Cc6d17QuK2BeVxvZEXKa52ift5DdMpZwcpVVGfRosMjFb62ssQrUtx\nP+nItpGdCFWrNhT0fkzEMSsoR4w2kRPmr1dOYe+6p3EFwvEd4U0kNKdgqncd\nlAgdq+MJNvpbUUmGO+nhx4Gx+lQ6DKqDaV9nv/pQmvGslObpXsAUeuLwBTDH\na2vMTwFjfyFcDX+3SDIMAzSSfnVwQXHjwYNfa9cxpteLy4E43F+OJ62imW1p\nF4dq+OBU3cxqIuCnJY07f+bUASRXDszitrsg6PzPeGla8TyKRY5DEeZXPlpS\nj3BC73PIi4fdaU+cfV0Mc44ghzIct/FDOCgNCrcw+TCwCNlptHnSOUG4YW7X\nuvWF4juNuR1LEIRsLIxaNDrtufe+0wJdm8cYWwFlzk7kzHIL9CjVOOpAx8zp\nTf9j\r\n=8h2X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHGUcevY56X0X59yG63HRuEqc8C7lNsZE5pLTu9u4vraAiEArlurTLLJ0pTPpJN++XEyDjpX0Efe1JmUXSuFynRJ2kM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.15_1594717265361_0.518779815765041"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.16":{"name":"react-three-fiber","private":false,"version":"4.2.16","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.16","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-PjyBKENJx2V3uO3pjUlyGdp3zIIIqPX93Y5CipVvegscHgazO/hHaHAc/PUfEOdC3XXx7sn1BFOLx6YxTR1zGA==","shasum":"5f01feb00db68429c146152b06bb767b165868c6","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.16.tgz","fileCount":38,"unpackedSize":642684,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDXd3CRA9TVsSAnZWagAArRwP/j8fD3uP4/Rd45aP2tkz\nJcvUIlKAvC5WzByAL3GIQ8cGEvy1sJafbo9lpyv06hKexh2H0DalWEq+SERh\n7+1eQI6wPmifUGHxLLX9gXp2OhkdJS16JbO2dtJUAAAOc/pmhEq4yu8LFYlH\nt3Puo1AcUqqH7RaldHGUiIwBn/rDvCN40tmKlWMwNuulknoIvKBOGL4EbXoR\nA8aLgWDdE4YAjlyabEcgDpl/tY07QwNIE7JamNxT7+Q6kbjqXlVCRtmHxzWC\nYFTpUF4Ex8T4AkD3GBwJEVX/8hNMChzvuIwq/UIiMHUp7D2F8FLgWGxAExAx\nPEC2O85hp27hq5JnXI73yVG5UDM42zAuiEuo/53b9aw9ZrL7TvJfXc0h53zg\nfyIgxHN799v3XrH38KwDWBg/nNjBa9fvAm4fvn6nY/736bRfT5nUbuGgH7cE\nJcamzIjt41w4DaE/gtxU22qAsD7PY2kH/W06l3XhE28P7svJN3nG6hK4oDfr\nl9Nfn9vMTvs/FU0iuDi9WdggFWLKF3Ob4p+t/p10CeqnYFVttI1xk23r5NjZ\nuudbOuarSRNncpIqdJHreGRVvPikyHt64w67cEm5faJ7vqHdDdiA6Mfr48dC\nY65v1z3ZUwsTXyIzCJYhJwZ6sDaEGZ9RvDErGtu7Enxuxv+r6nxX7Mz5N0vh\nN18z\r\n=cynd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCnIZw6t4b0gnw8Ja5QyCL0zG0V+LaZxqG0wc9vpFUbVgIgTVTdO/4wxEdmGpBorUQcdj+j+439hIb0L22Wioltcuw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.16_1594718070539_0.6623128888396956"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.17":{"name":"react-three-fiber","private":false,"version":"4.2.17","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.17","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-7hst8PH0sJ/FbAmImXQahLxCNEtFa4+9kORuoygjwB4vLqE0z+m6w5gBWNk+ri0R4/85/o17worgcRgGcNXuSQ==","shasum":"2f9e9f03d9a2bfe6e21521130965c19a39e44edf","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.17.tgz","fileCount":38,"unpackedSize":642692,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfDhpPCRA9TVsSAnZWagAAcJkP/3KiT8oZ42JcodLN4CtF\nIikqJ5TOqjWtbGa9mnAr7YgZibCh5uR0Uo2F3yzqax1WTYTbPQ0I32ISf+t4\nzzeYOl/J5+Hjwo6V8tDAyJqECpYKCsfBAwv+PTDNI1XrHBG11JgEx4Hh+nE0\nrsaN4ViBAJ7NrKmGT+5h/rUxMf9UN/qs1GaPPjrOyOhyX0J51yi4bCdLGtqD\nC1w3cVIn0hwpFUvG6misWpZjctOEEjdwMAJ4Jzt5MqGyBSlOTvOIh1xtl/PD\nqVMZls944/cjS+WQNgP+RFq7MHffFpuyQT957QPl45tHjwvMunT1d94pAIfc\n3NHcxunMWeJd3TDntYZtWzO0wNqDCWEy3qQZ5xc5XpP/dKJXJTJHJpZKKPjT\nmtWtWczpMKRIzZ65XGKz8eff83HiUtC3aeVHmekLphtkFX9X41zUwLuhMiSV\n42YDlx4bWNZgRZLQTHRJa3NulYFxd6azOpkKcnsi0UuYXaicSSSad2AVb6Oa\nDsW8Dof0d9hnxEQ+CdXIKsTSNqCTb6aybY58f4JeXfK5IDNUMLQsGI19uiuD\no+E11Y7KEmCDZ59ruoZyDdkAKuiA4FlVlit00/tLqxB8VCOP990LFnx+cnu5\nVO/UXOSbyfaIFEeWNqVtOLW5rMDC+mZeP/ggo3hbVJc42VHjJwBA2nesko0P\n/0zB\r\n=RHFr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEhQCNqQZlfTZHJHf57HxqrGtJeB8FdcB5LHzcrRGrIpAiBm7miqVOQYPzNiplZRrMg+pKvxb7MTSVeNMxki8aerjg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.17_1594759758583_0.015160880277792943"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.11":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.11","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.4","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.118"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.11","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-TBQpVhwT2qT0nLUV0U2ZDpWn4xEgdmxyhLyB0rN2RW3D6TfFNR+aoqxodVM8gOztIhO+Ecah6XBelhduN8Cydg==","shasum":"043ff2c5a73817521007c65420c3e5f1e2c02cd0","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.11.tgz","fileCount":38,"unpackedSize":645028,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfFXdMCRA9TVsSAnZWagAAiBQP/iLaKhrDdasmAXt+t54G\nPhdxrWb2mlECRAPgugW9wj1LjTKby/AKLMY4mcyMcHd4yuBkCMUZWtw4kQ5/\nEjwshtUvcHFWIRdm6IBeqSeUipoJxGpSCVC50/xZe6qTvS3O41Ii5wSgxA2S\n1dGWJ/RtPtJbZKy2f6+Fff8VdVirZD8ZushNnengLfFux30cVCvy/uT9XYsI\n3YaDaMSP0JfR8+9UvixDhlILXJn7H96KumuBYndXs1PRHH+dYYMQzZvv/HZD\n5jTEnGtAQzy/kj17NJ7wjskf5o4lyML8yDkQEGoV1qMOLgQBNJ4lBEAQ269V\nFnbwI6g0nrbzGgkpDpHSw5QhVh/TKzqKxRFK0lhEVdr3AE+LmJWsIB2nhXyY\nS5srvYs25jZNzvgM4C1SNb2EjMZNCZ9OGxldjsVFc8kTVp/1WEmO/HqOaxvo\nXzfOl/rk/8CE0ChsAaLGdXcNMIIUo8CBr+79jOdj/zFBF5bVXOelGEPfZcTv\nc7NDWLB22fqK7enYbs+derxjxe53NqAcY0LffI5Mmptm/fOJ7G7Vknj0mjLz\nMDmiRVHWE6XWapKuHTdOw3Cc3iMXFiXuncxLIsMOeqvBT9TgLkJzXRNLIBec\nbnGBHHAEYZkzApc3MqcBk1nY1JjQ8BV0epQwAVrNRcTRKObsW2Pu+8xtHi0U\na/il\r\n=8YaT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHynKFhBsaVXEpMTDbM8e0MItnpwEdge2kpX7e0GUO9OAiBhuxX53tEeJlILZwJh8OQSfWVxkF89U85erPYeHfx+pg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.11_1595242315611_0.20035629999908577"},"_hasShrinkwrap":false},"5.0.0-alpha.0":{"name":"react-three-fiber","private":false,"version":"5.0.0-alpha.0","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.10.5","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.118"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-alpha.0","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Y7qEnmHNhheWzXOcza4NpiM9ERRHTNvYQp1/yqGARAuuOmTR8E9quIvLL8N7QWKu9P4biEACSvS4QbBFaK8Ejg==","shasum":"94b774b3708183262f009129f02b7f7b7df27ed3","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-alpha.0.tgz","fileCount":38,"unpackedSize":1175626,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfIHSnCRA9TVsSAnZWagAALNwQAI8R6ZycDkFqW9zC4ZKB\nAEpE3FrrgK5MlQErGwL4dVcKtWbAVxPPRG6VskTYcHgxfUz1T6wD6TU5qkMX\nUY7KydCMNrXxNQIpE8rnOAVfNMkhtUr3+/K+spq3bzliwVY198pdDGx7ZSE9\nwk0jNDg0e86go8Plu0mp7+P5Bmy4bJi4U/3KoTAJqVrkq/h2wrfIn4JhOfAd\nqXrRQ0Huq6wg4+GHj6xORyXgXeoiupom2EI2Bj6xMXmSt9eLWJ16oDMHwW2+\nhYQaDAj51QiWni44pf7Ik+k1F9U8sMRnyMnmfJ5c536E2d77HzjCD7Z1OjVz\nGjedCWYtuL4Z+tvFXeS1UFx/BxcaC9ri9UEOhA8hIpI54OBt3wykWy/IYoc1\n2cwQmpLp5veRqzWsVjdvxyWsvYBg69ifFkg4gn8x15ExGV8699BaONlAj075\ntM7cN4hQWnyQfpKjsyr8NNDT9cXJkIb1aKB6xNyMAECNn2VJ7ho7iIr5MmzT\nn9W39BiMMtfFKE887Z1fhwzG+XzxhXE7K6bwRCAwwM332gefaD40yGCetIk9\nzuZ6lLoPma0juLSM/nu0uWgQ0smnTH1dwXlxAqfnT4mIhqMH4gOs13wsgrF/\n7c7FQk0hXB+rYjpAJFbD5ndDCO6V6erU1IT1CZcKi3a2zajChdo+boosg06Y\neqOE\r\n=tMgX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqCMtqrBydQTyPIpcSPcrzYroMtuh9vRfKGvR0xW2e4wIhAKqGXeS7vBYDXLuLWVYl8MtmquTk+IJxUi1HE7AsygI6"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-alpha.0_1595962534830_0.7850567487219353"},"_hasShrinkwrap":false},"4.2.18":{"name":"react-three-fiber","private":false,"version":"4.2.18","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.18","_nodeVersion":"14.4.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-SbLXwTPGqreGIcZJbtyBJPtm4WenIa2KDF7kJaTIgjhQh3kqN/fBq00R1fpbG780bvxxmU6X0jMsh8owufsKSg==","shasum":"3927d0e21b4b55e992634a73323415ac58750bf8","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.18.tgz","fileCount":38,"unpackedSize":646183,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfITb1CRA9TVsSAnZWagAA9iQP/39usMW+aZW96AnzitGm\nr9cWJj0d9pZKe1f10xe1vkhmjcbtVt6U6wicc0bmb/9ApG2ZLCMoqMs4dRsg\nAnpvsR2uMaHdwoeaVhlHTdu65VHmClLILZ1KPfrnW9PbYrzDco0+FT4yuXZn\nQuxCNE7wth/+yxY9pUNp7K8b5YcqN+22fW0x7ETQ57etdg4lNNrZr019WitE\nl+BCbQW5vAohnaxp+vxEmcuHALfJgNV8T0cJMZ5LU9JQ0XpVkEpR2/n75VA6\nObGo6oNKKfTJzNyIvjIxrXrClyQ1V/8rhNExa4PSObv5NCyMNvgB3FTTQOYn\n1aBQZVoQNyY1pTpzoDrenJGeYTb406nXpC0XHyOKBjOPy81ZaNm5HBkBQMp6\nZ4Frzx5S0+6sXRN/72QBjY7vwaqtBZW5W+ekNqhPNYldvxRNd7YbIWXBq3IY\nRr+fjV1dIf01yQ63+a0vqT7t/A9HZN5h0JsH4Ge+aMTpW1Ii8usKa7yWiXxa\nKJTYuX1cF21rsYXGidGTxwQM3jDqhS7Ho0CRshK2/X50BbCVhciXxt1IhuOU\nGNxvVmbNvo2XPl5yGTfcmihjh2TWPm1t1T3NiRoc/JodeSEv+65772BIViMg\nCx1zOTmQyqZ/mdvFK6ZMsS7CA4i2enIoupdXrcG1NKnBzVtkWbT7cpB9VoeZ\ni173\r\n=mwoL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDT6+y5cBGpm1ZxbIM3lI6capvQQxnSg+CFZg+2UzGjTwIgJNRw1Dq8t/w1yO1au6gn/0WA0fzpE7eM48YVMv5WhKM="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.18_1596012276473_0.8662439069818855"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.19":{"name":"react-three-fiber","private":false,"version":"4.2.19","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.19","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-XAQVJKFL1O4RIClJYhiyKTtqaLODfbUZnfd/ubauyZZAiezDnkzQeUZDevGQ8eYcHWs8V5qmJWUSfWpxRGiuoQ==","shasum":"64579a14fa5cedd6c6685b57288445802d63e2b1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.19.tgz","fileCount":38,"unpackedSize":644082,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfK7OgCRA9TVsSAnZWagAAVPEP/iPvo5rFkCSM/+4WaLQJ\nifgNmuMNBXYxCIMHO3cBBT6ZiNdvpocmBGKUvi316FVRnkEa6nchZRHZG4+F\n3l5tvTwp29lxsCiccZmlkgKkplRDJ3EGX/jn6fplM8Xbnq9tdXuWtmAvlJQX\nUf8xf3QwH4/4RVJ1C+XrcBD56wRhah7VjpUiF4rSQFgq/m9updmv6JCaJ6sd\nz/ooIdb/lvukMVny+vGE24lRzqY+LGJqZIjZtO/HMSgZv+kVqWr1nfXIfgcZ\nWD9gYWxcikVYGxHwpzJFNa5lcMGsrLkdaYYdU2gme6BgjdUrgBANuumd+FyP\nc9JPSrvhS54l+dMDNNwdUtZn1Q1i7A1G0KkiLI4KmlPMoQxmWQZOxc54vl/I\nI5antIebH2Ko5hcB0TgQtRJlqa24gB7a1tV05N9P2chutbZ6pzYNy79JQXfn\nlZMTCarhOeORNQ4UKuDDCkF9nuzE4/nlXsq5JfHVyjTDCauRPISg7FcmwM0O\ncWeATfSQKfApdJRerT/E8T/amn6qYIGtI8vB4yktAIcSz4q7IMODvoTFMao9\nzA4avUSu1jtAS8aX0i3M+jjqV4pYj9BtbGoj9Z4dNrM6QY9WiodJwOOsLxBu\nc+cH51GX0Juap+wKB2JUKvNLSfmBOa+hlNFhRXajbrSyBhncyYpKpAgvrn6G\nNVbj\r\n=SvC7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDp+y62izWTwLlz0KtMOZBKGoMWiRYEZPjl+RNb5vCG6gIhAP34+Xk834mLrJtn288A8ZCeifVtahABnP456vcPspif"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.19_1596699551997_0.8817230765739961"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-alpha.1":{"name":"react-three-fiber","private":false,"version":"5.0.0-alpha.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.10.5","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.118"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n<br />\n\n    npm install three react-three-fiber\n\n<br />\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-alpha.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-XJC3DaDRnyJHSIRVPeIQFnjBL7BgUgoa4thpYQrPhMHQUjZ6FFTYZNnmedGMcPt8ImJxZ+xQjlcWd0m83aaNLg==","shasum":"ffa1ad9879849aae04e71e3d1ea639ea5f9eec47","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-alpha.1.tgz","fileCount":38,"unpackedSize":1305155,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLQxhCRA9TVsSAnZWagAAEBEQAI26bZfvq5hXKTCO7p4d\ng7px1kNZg4Kci9Cu79tg6EeYsR1j+s5F+s4xDCCGRTIVhJslsxqC4NLpW4LF\nWtOpqU8IB5W62wKDaKB/3r/yqcLUd7HXPR1Eim2pbVy6CxH0h4hrzUu4Zc4+\ntbnO5IcB6lEFwSJnigene/pEbYnqeRmfuBOylOyoyNUsyNqB0592YhkVvMSL\naybsNmZMJqvQL82UEi/5CMroNibnzQVIWekZ/qZPHAGyv5JyrUPEZ4RK6aG8\nOamHfQQFDHzuwpQJVx6pkHTLstCioXWzjT6mB7mW0h7r2561o4/oz64pPpq4\nkwCxJKrSQ67lfUoyVDlTpY1+IPCBDWeC3gkiTQc3U3ZHnsGZvARsfAPlJT3b\nt62OB3reFn/9BLqQvENBhR7qsq6rQfM02VIMSEJMDK0Kq7E3gJD+4BUqz9Dz\n9DOkft3/HS3mWHbQdK8BgKd/bG+BFBYEG15/v1zkVm0WsIkrNoZx7sVNHzcP\nHwVx13NFpWlxSKWaUzaIt4sEeMjW0zFDpx6JDaIvfKADPhwVdBNhtURsVr7+\nJPjo+5IXMH5BBxnoI3k8Js+9s0UzHV4xQJ4ZXyYx2vslllbI/HvpDV99X0ec\nkQ31IOXHb+2zqXaMwyZpzvBDCyVlpgQURh/BwYj1LV0T5NWoXUkwQgAaaajv\nEaW+\r\n=0cG8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDGBis9DSWAH+99t7wFf5GvcwCPpSEK/gUG6xpsABMpkQIgEcBzC2Ps/6DsJGwW2zWN9VPqR02zUDk3TQrMZGOb/Ig="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-alpha.1_1596787808390_0.6522712000730726"},"_hasShrinkwrap":false},"4.2.20":{"name":"react-three-fiber","private":false,"version":"4.2.20","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.20","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-M5TCdGNKvofe37VMXnhbabgRDiRm9rnfxOmMFuLa+H9FiiLT3wUMMgE9eBmLh3McKgYXURETWKkNDePeQ0J0JQ==","shasum":"2689c005689f7c706cfb29bcf7f09958ff900b9a","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.20.tgz","fileCount":38,"unpackedSize":643966,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfLQ0dCRA9TVsSAnZWagAAMfYP/jfjl5AsJZkVkXHAkD3p\nncSlDp1iMLWcIekT62IDRCeAN4wCuQoRaM4Q5MhCGXVoouBcuGG3jo0L0wYK\n6KAf8/1mRm9HqNVLzI8USkLFoPJCBzp5Ld5+YqUNbH+/HL1YzP5+xZsVaD+H\nsfAyzg47XwyaORFbJuou26BKswlIqJ9eU0+bRdD56VX9+APvv9h/XUZa5w7X\nJMAQDL6U60taT1y5nlCThsU9I5lKdGiw1gpvFbXe9sgNNI+Oy+NWxb3vKz1M\nfV3l7sJWsr8rSzNfg8EM18aVYukDjocJb39ruNJiUkienZfi46ITEEhpDpk7\nvNZqZIpbguFCuJiNVMnYwfXT8MAeeJylfeB58jmgu7etVQZ5v0mVGWrpv2x0\nCSnv3Rgb+9R7bE+Ycb2lp/J1l6s3B5cAiLb4Shfja3lZLRP9375oE8XqcnAy\nXYqY4F6/lL9XC5VqW75GnR+YEfwSXv0Cja9bfhoLni0TVuGBtzOxY/+HV5sg\n10bycoKceLZjKDbGtjdfmpozCyboTqHuvRWPza9Igf8UCGJkoXH9TGEHc7LT\n0OsM1kKUdYKc/uPQPIlSfmnv0RLch8wR/AEWTr5VqVqIREyAFBkU2MZvvAzG\noNTgIhQphRpb/Ok9u82kclQPGXwf0KD09/j4tr4e1CnMmfRaZ5eD0a92LC3G\nSx8S\r\n=e1oJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDKDl+tPu9NZ1ixSadonY5kfM3XruheUoVxjIBZdb9WjAiEAmqauTcX01OUPDWbqNEmlUwOrBHZZjVGRV8F5TnzJ8i8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.20_1596787996618_0.2388931723492369"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"4.2.21":{"name":"react-three-fiber","private":false,"version":"4.2.21","description":"React-fiber renderer for THREE.js","main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Birkir Gudjonsson","email":"birkir.gudjonsson@gmail.com"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","dependencies":{"@babel/runtime":"^7.9.2","@juggle/resize-observer":"^3.1.3","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.2","react-reconciler":"0.25.1","react-use-measure":"^2.0.0","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"_id":"react-three-fiber@4.2.21","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-lbopEkL36cbAaG/y+iEGT1EFbVaVZBrOe2XGt2+HxsCL8AeWWiQQERo1HYiiqFc4p6DuoNq1hhOSxr1TKQjXuQ==","shasum":"bb335fee090a44f2ba48762a8c42308c31f4238f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-4.2.21.tgz","fileCount":38,"unpackedSize":645412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfT4EcCRA9TVsSAnZWagAADj0P/2zpBRe+U4cyJEItrAzF\n3imviWLljGWcKoI7HAask9kSemKVXYHlcN21kmz1M6Qz5myxovvHtKZnxE9J\nvt3NIb0kd0wm3MVhCJ1I3MZ042RHJzb+pdBDwtv7pK6fABWYd1eUdOXbaJZ5\n/89bYWeG5ff4vjwIfjjdG38N23KWl7l94EJL410HezxiipAQ2Mbc8SVj+vZY\nB0I2islk4z7yLK3vboOzx2XgHXxkECtxdiqDkjgGJ7AU3l9Spq1206SX/eUh\nrUsZbeqVyCT1UGFfvBnTnu1Cb+hQOk9MD9MVLl7lzTseSl4/lriVTUUYIJC/\n8ZOPg9DZ0zMuGg7wa40+RwcMEPDNZpR+azTB2mENk/nrOhFzT5JGdQb0RsnO\nWrmafr+mngJgjzYOC3h0CX6ENOT6dcQlg7FrJmmn9TAdbN+3f+mx/rQ7zLCe\nG97pFtjr5jTzQOdPjOJtfo1tZkqYgpuu4DcIqEoOyNFX/IZS92IGH+EYT+Ep\n1uZ6yYKct4Kk94D7yYJXHhHon6nHIW2WiscDHJ9MMDiubD/7k2IdEvy9K4Je\n9S9Z41bEXpVgiVVUwKU7ZhAJt+VWvJYZaKS9dSpBTFomZOgBW9YQdxtX2u3Q\nPVp3CavpamWj7oSEt+zn3uLbnZJocGkvm0IBLFthMSj9HjpZoyjf3XT6tfla\n40sA\r\n=p7Hn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvwjcLDfEJL+ilsKjRi2AAcXjcCh/AFG/8BdBGXZ93BQIgEUE5spjT2Sw9qDRpwSU6QdZP+LQ0fEhdXq6/pUW0f+U="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_4.2.21_1599045915894_0.9315854679375359"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.0-beta.12":{"name":"react-three-fiber","private":false,"version":"5.0.0-beta.12","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.10.5","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.0.0","react-promise-suspense":"^0.3.3","react-reconciler":"0.26.0-rc.0","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0-rc.0","tiny-emitter":"^2.1.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0-rc.0","react-dom":">=17.0-rc.0","three":">=0.118"},"readme":"<h1>react-three-fiber</h1>\n\n<a href=\"https://travis-ci.org/react-spring/react-three-fiber\"><img src=\"https://travis-ci.org/react-spring/react-three-fiber.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://badge.fury.io/js/react-three-fiber\"><img src=\"https://badge.fury.io/js/react-three-fiber.svg\" alt=\"npm version\"></a>\n<img src=\"https://img.shields.io/npm/dt/react-three-fiber.svg\" alt=\"npm download\">\n\nreact-three-fiber is a React <a href=\"https://github.com/facebook/react/tree/master/packages/react-reconciler\">reconciler</a> for Threejs on the web and react-native.\n\n```bash\nnpm install three react-three-fiber\n```\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with Threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in Threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just reconciles JSX to Threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific Threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw Threejs?\n\nNo. Rendering performance is up to Threejs and the GPU. Components may participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => (mesh.current.rotation.x = mesh.current.rotation.y += 0.01))\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(e) => setActive(!active)}\n      onPointerOver={(e) => setHover(true)}\n      onPointerOut={(e) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n---\n\n# Fundamentals\n\n1. Before you start, make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene).\n2. When you know what a scene is, a camera, mesh, geometry and material, more or less, fork the [demo sandbox on the frontpage](https://github.com/react-spring/react-three-fiber#what-does-it-look-like), try out some of the things you learn here.\n3. Don't break your head, three-fiber is Threejs, it does not introduce new rules or assumptions. If you see a snippet somewhere and you don't know how to make it declarative yet, use it 1:1 as it is.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# API\n\n- [api.md](api.md)\n- [pitfalls.md](pitfalls.md)\n- [recipes.md](recipes.md)\n\n# Ecosystem\n\n- 🌭 [drei](https://github.com/react-spring/drei), useful helpers for react-three-fiber\n- 💣 [use-cannon](https://github.com/react-spring/use-cannon), physics based hooks\n- 🤳 [react-xr](https://github.com/react-spring/react-xr), VR/AR controllers and events\n- 🎮 [gltfjsx](https://github.com/react-spring/gltfjsx), turns GLTFs into JSX components\n- 🐻 [zustand](https://github.com/react-spring/zustand), state management\n- ✌️ [react-spring](https://github.com/react-spring/react-spring), a spring-physics-based animation library\n- 👇 [react-use-gesture](https://github.com/react-spring/react-use-gesture), mouse/touch gestures\n- 🧪 [react-three-gui](https://github.com/ueno-llc/react-three-gui), GUI/debug tools\n\n# News, updates, community\n\n- [@0xca0a](https://twitter.com/0xca0a)'s twitter\n- [github discussions](https://github.com/react-spring/react-three-fiber/discussions)\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n\n#### Sponsors\n\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/0/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/0/avatar.svg\"/>\n</a>\n<a href=\"https://opencollective.com/react-three-fiber/sponsor/1/website\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/sponsor/1/avatar.svg\"/>\n</a>\n\n#### Backers\n\nThank you to all our backers! 🙏\n\n<a href=\"https://opencollective.com/react-three-fiber#backers\" target=\"_blank\">\n  <img src=\"https://opencollective.com/react-three-fiber/backers.svg?width=890\"/>\n</a>\n\n##### Contributors\n\nThis project exists thanks to all the people who contribute.\n\n<a href=\"https://github.com/react-spring/react-three-fiber/graphs/contributors\">\n  <img src=\"https://opencollective.com/react-three-fiber/contributors.svg?width=890\" />\n</a>\n","readmeFilename":"readme.md","_id":"react-three-fiber@5.0.0-beta.12","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-8wHUqH2Xlww5sOYG0QIoQxJOwXSEh3SWXSGpEbosmN+9Rxv1E28m6sRwpoAtmVmFzzo/pcRZjVXl9IZv8dstAw==","shasum":"614d3707cd48a32173d7ac3e38e70f29f7f72606","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0-beta.12.tgz","fileCount":38,"unpackedSize":1416452,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfVSjKCRA9TVsSAnZWagAA6ZIP/07AC7CpRDtXTQOU4h0G\niuakYfGpbuOKefMstYwIV8klfAJ2TOyBF5af1px4r0trst0ahqF6OBNazzI5\nGieYjiJshPhXRoeQUPvoF8DQjHCIgb2eddoGz/O1dZwd89bxee6z9Yn0MwTZ\ngWQRZnosxgheL76pnpV95HyiayUwkCVi5uIUZ2HEaZ6Qp2JTt2dr4ELnSX/U\n9J5TNj8ekk3XkyH/6vci1P6+OuaOdTez5fZ4fzXvBbgnZXlbs6QfDBTr2y55\n5r/zCSoEEAcNM6w/9t/9RFmGXRTuCnq5/eM22Z4Gc8L12ZRgUb9X6e9jRQ2B\nktF7c6IyuuN+lIHXawhd0OAv8JBaFpA8DSYgSBhVJcW65TbifiboSaF4KpLE\nl46Z/KQ9fUfynhdytbGweInSd/TSm8WMOcFGA0vnSaZJHuJcZWlMI/u8k6fj\nlYNUnIEmIztfTYq9mQJSIdRXAgJKFyZtJ4Y/cvMmo4dQaWcWsvnGddOQshA5\naf+WhPB+mA/CDNLnU2RKRrb3tEU5zrxX2mvHjV03NwMuiw0yuPMe2DDyxY55\nicM/EYdrkveyglLumqlPObvBFRG5UrjahQOS0LcjvLbGD5ytsykrpCzNlOS3\nxTbiPDukkI0jgl2RDzMLPVb2u2zvFFVwY0ahIQKVa+K3hZrpQ8cZ3tAz1Ifb\nYUtq\r\n=2/H9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTnQ/3GhjKHiaZl1pBI7gc2kfBqXYXC1vEJSoPvBYRwQIhAOhWytX64l8izksm81An/yTXXgOe6Of3aBw6YJhGhuz8"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0-beta.12_1599416521743_0.947195900050678"},"_hasShrinkwrap":false},"5.0.0":{"name":"react-three-fiber","private":false,"version":"5.0.0","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0-rc.0","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0-rc.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0-rc.0","react-dom":">=17.0-rc.0","three":">=0.120"},"_id":"react-three-fiber@5.0.0","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-EHqmljYhbtKl1ZXgoYzhwTDyJRRn2X2w4DTdINwI6+w5Jei5aiRSYp3avoDDKafEBmb/uDt2xejY3wQ1GfhFCQ==","shasum":"d519505024c883db2dc8d1b90a98a49aa95aefa2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.0.tgz","fileCount":38,"unpackedSize":1425054,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbJFMCRA9TVsSAnZWagAAG9gP/RdFBIS9Lzrw9XPOVeyH\nKaEe+UWpi946hMwipH5YuBgUu4w88FEsQqmCK+J3jV/VHAw6Gfup5MIc9EfI\nXa7+WQksHokGatnU4/sVOWvJg7/yG+LvathNBWWZwS5YZt55YfiJdhd3m/a0\nsURm5DUEaXT720nmagKQskO00PyuLqIkiwAshjXB2zzSQSQMqWGCqgLjO8jp\n9HgdZjOaZpnGLHDmQGBa3Vwt3YkYsbdGHe9lZfSdjaZ286P0qqFhOjedEf7C\nwUk8AC1yjWWFFiP07c7hrXcwG/qJkwbHeWdThXqzjnsy3s9Zr7myjaILMmgg\nXV7ObM5OnB/FfLYAG1myg55iysjky0iGWxDiQqsB6h1DdEQpj9Cr+3DBmipy\neXoUGyHOtT/QwUFnqJbD9wDOZz7CbUjlOu0ujSKxqdIoIXXcqKG8aT1ZOCK/\nepAT93mU19CLXDn9FO1HLm6Lqv3rBbrDvxNzzNU+ETkXP1NM2K4NsEtmMLfI\n1okLBSS8areBCScmk0Zx0elQVFs+4wgQTAwixjsn5+ky42fT/T23QmPhZfQe\nbn7ZF7I2auXCUG4XeT9XZUpTWHCBHDVxjWcFLd411WNURIPOk3UpXLXwG44N\nKa4Hq7UOnsUwijUvh8FXGspBdr6xjj7cYD4jGEIjHydU45cQITiL1ibQEu26\noiG7\r\n=ebc+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSGXiWEkHpZSvkTdl4smPK8Q/p9SgdwfR5xP+cRrz7uQIhAMu3eBQ6YQRke/OdUSOBY2BAP2QMx1ffnHY+cvNFCZsv"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.0_1600950603528_0.7132954585415978"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.1":{"name":"react-three-fiber","private":false,"version":"5.0.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-oBixjyauAUXK7PiUOqzUo6v8aXtWd1+5WQ0lNgxd74gvk5v+f3+w3qM5QOA+kuKyv7jUrYNk75bLtU0WbaH1Bw==","shasum":"15d40dc833e7db8926634887ed43fce902fcd5e7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.1.tgz","fileCount":38,"unpackedSize":1319187,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfbcZQCRA9TVsSAnZWagAA8vMP/0fHPH6ksiFLBaMF0Ilr\nu46eJqfaGWBoRuMo3RknfT+927KxCpSlzzeVR0iFGfGOdMzHNWcaA45u4inC\niuCjvSMYIeNFImKcMBCgqIX3h3k/giLWq+EzfCiLbV3LNgO1PbUmAf52wHlD\n/jacjsQWPT5n5qRVRUXPyde1UxCPrh/1s3OKTZhq6AEMlG7feU2iWzGkIeBq\nbZEs89ARyaBmQAMmbZrZfJGS0dwx4LgMzZP6H8N7vIT3E3eFOsSEnelaTZHE\nupclHRrCBW37hZzzoQitAWZsEZMHh8ov1QrhgrqFHx9VCFCuMLBtGscyI8Yn\nLQ3XHlcQye0NVLJgFfW/FXTwNy/2UT2/pJfxipv7RKkbtqHgaAGjyZrdqEGV\nJsO0Y3vBQg9vNloi3rGrMcUMST9zYyPAe5FLlJAuTolg3CXAnUVSwENUaIDr\n/TASBpDX6J+IaqR2i1n5yFXeePLNtNJzwczPJawszL/yxSkU1p2KPvsFBPR3\ntD7o97M+xNQd2K3gnOHGy0mmuY1LsEmQq7YQzdHCUr9+fpv+ag97yyQTNVoS\nAoIABq8bLZel85+BbQXpGAS20F9i0Jtt/hjQrIYJp/HNqD4O+rRrm9kGLPBl\n/bg9qQ6LsoTu6P81txX/aqZMa9f6VF7hRQ0SKP4Bsdaxk73TyZz86tOlHhPj\nYKgG\r\n=DL6i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDZY925T5LrLb/WsXE1tT7G4bHO3NFM2KFCaaj96voc+gIhALuXY72DvhiCaU5CfmIETNdqG0sF30mKwl7wJkkIP0W9"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.1_1601029711406_0.8565740254764465"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.2":{"name":"react-three-fiber","private":false,"version":"5.0.2","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.2","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-f5Fk6JyvFrkDqjIrdBK2P+OOP7djAcxQxCt4nu/PKd6u6N4oyzRnkSTgzXSsi9QH1Gl2LnhfOWOQBQUdMp6CGA==","shasum":"cbbb4194fd9176aca09275908dc0bc5229f4741c","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.2.tgz","fileCount":38,"unpackedSize":1320468,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdIIZCRA9TVsSAnZWagAANggP/2JwlSjFnYf0cYCe5yj3\nMevkH8POTlzgGBvStgc5xXsbS1un9bTbhqpK1rtbZe4zUNoZUnJmKki6q6JC\n3FbCBp8dAoT1gU0EtWSF4bbLRGM5ssT+W8CdvXDXrsPieE+glxMjt0h3VHgw\nQKxF9L1jIwzQPAm0ZhHyhGs549VRk1NMxpefQMO7nKp45iOrwTgHmd30+3Vx\nOz96MpYzPaEMBCgm4ctblTHPu/IiFoU0JW4dQZZKiXAHBWa4jjGYG2ynLwTz\nDijqlNk8leTZGZayPPLXK5Nfwc2ZnvI23H5+QkgRg+jxGkBc37D5b467a/ry\nIQ6VtxssjYW2A/2d9Wi30xeVUofqlUFUC0n6xk7NpBLy3eLSufNhDmpJFklD\nIE5QLh0zwaKkS48CT8fd3QS+krV5nX60dgPEQLMToaRpp3OZAAHvZ/YpbswO\nLDZgSdPcRtGlB4IXwd5qHBPX6LOhaHYQut62VkcfF90nmEQGyyymoO8Ke70u\n0bR4v6REZrnlSwRyLmYOgK9Irx9F5Lm863w0feF0gT6JIYPcqrk+T8cGEXLn\nnFxeW3dYOy1B2+OhmjBDNkLuWOWY8aO5Rv64bG98+hL9Nn0/53szNUMn8olV\nhO/b0qEGeAEskaLfwaU7b/9sgyKKdf8J1+xCJ5N68u0qXG9jatEUflzv2D7w\nILvP\r\n=y9pz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCHKrxJPtah9u/sBChRCnyv1Ed95Cyqq57jcIUSXaJOjQIhAOlPX7ES4DxW3uAReEHx1CgQuLBNh9WV2DVBYEICNgVc"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.2_1601471001289_0.7940234464147278"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.3":{"name":"react-three-fiber","private":false,"version":"5.0.3","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.3","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-UPbxF6CdLpHyEFvZ46X1EL8FgiZd4l3MWCwySiPOmCQ5v7f1Lavf7BiQDZDI4pJdpG14HoiuabxUe6EEyhbT/w==","shasum":"d0764b3f4598139b173bfe507e4ccbffa1a421a6","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.3.tgz","fileCount":38,"unpackedSize":1319295,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfdavICRA9TVsSAnZWagAAmjgQAJXwhWhqq6+BOGZW1kY3\noCamFNbAmCuR77BbqPOnwV8syLjy/VzQv+gXhzbuDjCHCdqyBqmSMGrNfIMT\nMHk+b0najGt0iRIzl+905fylMevaw+DBfsbDRlpKcvK2bq+5ujgNzir1zvit\n08YTXvenqwUFkekkW79GDkmJ7vOy/YjJgVICrBtioBlWXdUzgZ2zCkgdKkES\nzQLXaFnvHHgQTvhQ1/jUY236PFz5dNeUmkwu0fKbM11BlTMufDcHuNP6FtBc\nGUam0dIUky1tWRG/tOWBha8XlumjOVygyLEHBOGWFRbF4f76f9IhdrL950uj\nUsunWAYvxyrdjkn/ygdLO8ZIIkesSHvKmcves8ED1cqr454HhNJPMlplrs5m\nPfCfu2gpVOZueZq1tAGWDK7fsmCKz7eqPhvzmS/OYGmiJ6GoowqVvmJZyX71\nkzcA92dfnNiAJyZl3ELLBNyRd8UkK2TkBJpks8GfkQAdAGXRup+Np7v+IcW1\ndDaNOTCmDTM1o5hD1xiimuqXWsROlPCEYQTWLGhKS14upOchuqBiSOsn+jFR\n5WQB/01cD2biZcZNbHxRa+D5kYLfIXfZ0H69Y+qY7XSmW5A85sS/2Oqi1ElN\nyLQArRWeb36v0IlpcDHzxyy1Gyl8AVM9i6PYrvG3qvg1SEPnqLND0VbZAKqU\nE18N\r\n=SvdK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCoTRb7ZbhP0ymlu+CAlueMpv8phMn0t319OmzReDOIcAIgMTxq7v5ojVPdM/EZSPa683Z+IxXmzGyTgL5+LIKNG2I="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.3_1601547208142_0.7349304456357681"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.4":{"name":"react-three-fiber","private":false,"version":"5.0.4","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.4","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-Tpw9rIStMzYPORkQQdjtu9ZIGkZazz/kkJc0VW5ZuI3K9nCWWzmFkVq75OvmCutMlHdu5/eWk9kJQaoYKmtmgA==","shasum":"f45736f92207e9b60e8f741d2db9d5ef2983dc5b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.4.tgz","fileCount":38,"unpackedSize":1320036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfiW5eCRA9TVsSAnZWagAAuT8P/0fztoS8y6rKH9j6xpFH\njwJfkCvUJjiT4t2hwXhrtqZb5t4VBIonV6IFvs6CKxp6seo21NAZFaxAtf77\naip7Df/BaDqshDOx4ZRlyMaEeaGWETsIVjBTJseAxiixbkdOx1P259O4Jq5P\nAK+RcjXLrPYB0JnHmT5V+XcnooNzcQIS6JsLpmDxjZCk4nJc+y1yrfenW0Yj\n8zsFF0SXWUlkEbsWKCCp4VVXIh6JOI8KlLvukD4dkKFOJ2P3i37MyVe3hVZs\nT/rXrC0AV50JvW3WfWG/rVZk7n3m3DvhFnsky9qHESILv5qYQZbDBtgvxPX+\n1YghfePGvdr1cW6jaACGBmDiCWMno/gkTWR62vtDb58l5JHeHHYkagsU1QrA\n02elyxq474aw0rzaf5TTIKeasa922c4rayltqGovw7lMv0tPUER3pDgMFDoq\nScFOjgGrFZsVnRkKYC+mA7ljeY3svb0PV9OdoMTckQqf6Ob8tG+VkGSmPvsT\nD1yPjDhEJMr6ibVOKkji1TpUiEawDdW0iWNf2l/iyv9vst8CRpLdxvNyX/RD\nYsNDQJUttXWbN9Jz5XynEJMFPcZVbVQqdQ1EmUSgLmi60I+VXxHAI7sENEr4\nqlkfU95op4xYqx6IuqINPiBf66zHrVSyIUlcc1q7ZW/HEKC04eEYXHxA5NXS\nKWq2\r\n=STpX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG+p8SQbvhmo4tQaVOV3UxJePfKekqxFKYKpaQGmv3dnAiEA2FTcd80ro66bbgTSk33i+/OMWWRwTPujYNOmSrwg+Bw="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.4_1602842205394_0.831267107287539"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.5":{"name":"react-three-fiber","private":false,"version":"5.0.5","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.5","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-alZbn8zUw/7EZAfbSCYnSEVUfS1y+NyYBcdLgZi+3ahp/Xz2wt7Hnq91ZaHZhj//TMwfcIUJNabMipOoQqV0Lw==","shasum":"10c6db2790165edbee89428682e3385d77e1780b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.5.tgz","fileCount":38,"unpackedSize":1322125,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfiXSNCRA9TVsSAnZWagAAorQP/3j89zXnsg45geZlx2O+\nKhnqlp788NxffvVgAOG/Tl1eW4uPjG/Q2Twe+nRAI80sM1qF2Up0fqp4eygZ\nKJraOwVdDwxWfzm817DX2dTKJcmMlsgxcbxQMPx9PA3gWYOAMgyyVnCWI9a1\nxlWjb6dlXp/s6xr0qknv5spT3+vvAuxi9ZCXZWvvGdccckordh1H4ViHJYhK\naTpR5L7lGmmISRUfiPFDrR+5LWolC8KsaD7C+N5vKHKTtroHjR2DSIUEZ1di\nkhL6JTUjqk6ykGS0q89sHxuMIct/chVxv7g33Tkuv4OhFEjgX5vS8/z7huly\nB9JJu6b4gBYWU8yHoW9Q4TQ12lP7c7vcKx8Fw/Pff5LPXsJqTY3V+AJU4+tt\n2K0gnZ6NxcsM8HPXrZPFofeWQ8Wn2HXqCtm72hjzyvVvIippGV2+xjmkVtmy\nODgtd8m4aDU9Zx7AXqWHhi9QKGTK4XW+ti02saUQXFQFIpNhoDE/Tz78/rUM\nY+BHtALyTpBX5gi90SzNrsUDCT+G6eWlH9AbeNkz9Fq05KbRbup95T2/5mbj\nwQ+D7Xmnb2Wa8Knp1gI7evaoGOw9+nRlTGE2eJ76kbgCvYJLuh9sJ+o+xAkR\n9H+rHfA/0wAEetfttg8xjAmmq2NjqGJXZ8HiPgxXTdxn73ATePNjCwE0/gKw\nzk29\r\n=i29f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDctlaaYTovYW41/hEYbeuJN1fg9J4HINdm9Fa2/wVIdgIgV56GxuE/s1PlZxlnHrRhrHKXFbUB4sOmwaZhHaWNqRY="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.5_1602843788427_0.5834051728807181"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.0.6":{"name":"react-three-fiber","private":false,"version":"5.0.6","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.11.2","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.25.1","react-use-measure":"^2.0.1","resize-observer-polyfill":"^1.5.1","scheduler":"0.19.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=16.13","react-dom":">=16.13","three":">=0.115"},"_id":"react-three-fiber@5.0.6","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-QFmibD/XfWxqH9gZI6j/LDwFVBzXKDaNmcOELjtF3qyl0SENmg8r0bfaI86u5G7EbUY+cRNLSrjPpwKyMyscSA==","shasum":"b02074fae1c9418dd78b45c3745dc4c4ed219fb2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.0.6.tgz","fileCount":38,"unpackedSize":1322533,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfifbrCRA9TVsSAnZWagAA+fQP/jDQEgm5U8BM3HHIcWzD\n3Kyt1f4tofuf0hq+XxkVCFPM+Tg2u5W3EA+2xMS3FIIFPXhSH4trodW2FotJ\npOQUxbBTEmuxU49jPYNI/snx7Ji73ygj19kL461SXDQK2at1d7WcjFZKG9TE\n0GyEkEfGQJKpo20rdk98Sk0s9c4c35H6a9U6lXNN+oM+OO/cx/YNhJURv1U3\nNwrP5B6ob7GZzJfoFNw1dwZ4NXdtJuHH6MvsYl3zE2AEkK/BCS55T8mSCTXS\n+lqbibDjtdBNDME3ZLXH3xyhrGYEGe5k6oGXddInsO7axJXkgaA+ZKxVVhcu\n+SdUZcB6P0BgD4UCy7ocpRX4M/yUT6rwPzOlDJrYftl0aGZ9NtQbg9IS0DpG\nDWfwX91z8R1/8Lkf1Zr7aY7jD2wwMjU9/LcYgEchshH0QrTMHjMVom5MqlJE\n3pxo+ZpC7GNCmKoi5M6XBF1w2vpDBU5Q/OiMp+rpISK5ct125hYqGeOs+msU\ngeM0ZcJxs7eZ0HpOHxC4yZjISLBeCE59Ylujuw8qbOTGpP8DJdCe8+MhQyeC\n0SNDnFmhi07zEK0mIjm2O3LpgTQpaShjygQEZmAt0bWtXpHqtb27qPbv/1ZS\nKUGVf3aI9rJXMDNAVE8skwPIu+HCU5Op08QN4B1lDGZ5ZlsOa5OHPY/CEjYT\nAmGh\r\n=Hbe+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGcmX96crRbw/7jy9d067Ar+AG7Mj+TQ1T0a6ubj1mcSAiEAuBwLICHhB0v33JZbQSqrp/I08+0n6TnA4JfeH8ecSY8="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.0.6_1602877163271_0.17024140034910418"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.0":{"name":"react-three-fiber","private":false,"version":"5.1.0","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.0","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-lGbX1fQLz6JSEgSJXcFmMFD3u6vVQp/DDfYpP1juXIIKxCIokpJJRKF/koTRcMiy0pEWr+70G4ABgxn8Srypcw==","shasum":"7a46d20b98e8f84b0ea02e696c1b17faa17db815","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.0.tgz","fileCount":38,"unpackedSize":672102,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfj1nWCRA9TVsSAnZWagAAKwcP/0FS/kUcKVWNBX5y1nWu\nCobJQ5Cdn3GDeWEsFFz9gTm+irLGR04uAONIRXGamgIoJS+q88iNNaFWMsF4\nksaBOk6ZNE+bPP2270m4J8D2Gws7UIOh6EAUvVSdrQEgEe7ZM95hqvvSDXVk\nkWOFhrmecrDfeAyEGsNkuqy+Tifl77iuPDznP6t3BPW0IlPuh8EuigCGOixg\nXh3io47dXvm8xVmxyknxxlCV/L77HvYM4nnS2NqC9/B2GOBB4dpZUiHL7met\n/XXkEMNRmTqxWDt6KWhdJPAXAP1I+3xP0grEJ/qouc4zluhpigOG3k+LPiFv\n6zIbSyZDCJjN19HWMF0jSH7YChj2iTUbXbYy+1MScGd+ITX4WgEIpmOxKJVB\nhXNE0i7+Im1lc/OhRA6+Okr9SZCBuhsCIlL92j3fUTzj9ThidFo5i6tGSR45\nhjN+qhSvExOPjT6B8faTQUzKZWJUUdnx+joUSNREx6brlAefniLkXT+LkfEg\nicnBTgwl3D1jJBCxAo7H7wedX1qksL2Ejg9QaND82A3qShf6uhimVKo+1ro6\n+f3gaRhXTkF0VYlu7/CI7bU9ZRzaPpKCl3Bzc6D5ZI0iQRvKcFWTqtlOjJyA\ny2YnIXGM4W1pytH+g5B9rRHx44yRyN2UlJ7whTPqHX+msyEYLOKoJ2EdY7j0\njmQ0\r\n=9q6w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCKJLDjW0K3uWmy+iT9WbAiIFBIKHdv27MWninqct/ThgIhAPYZtpaJ1gF21pokMU3lWE3bAIBUk15Ej4UGFYfBi+JF"}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.0_1603230165781_0.43456023015673684"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.1":{"name":"react-three-fiber","private":false,"version":"5.1.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-XX0jOmG/V40WODTldQYsY0nFh769eQAaySi4nvuyM7GPv7kpqi/9SEq+UxHnTfo2JLO6mZKb+kaFJwvmaO674g==","shasum":"bc87bd9f384f3c4b7cdb37467b91aadc5920082d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.1.tgz","fileCount":38,"unpackedSize":670772,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkDXpCRA9TVsSAnZWagAAMgYP/1fGXIZZH2TMRkSrYa6I\nSb4VwojoRDY11+ygn54eOso5+uaTgfFYcHu1YoodQXdVWPiLlT54O8g5CWA3\nLrNuPITrlqQUcqTXfiyAghqqCGVbHyWEo4R1moXvnoc6QWUzGsqN6/dv8Pxs\n4bH0msVVSzFsbK7rJaZQu14Qh5OZ00mcmQhxxi8GBHcRUaJ1mZwE5u7jKL+h\ndFJ857LBZf/2SFTe8BK7wzKimAT6CAT6Co54YLobwBhA1wvQPt6Hl6zGRjhA\nA2dRMLlMBqp6r7UNlacFN6KTvF89KUwPQgLUOOMbfhbKnLysXIc7WjD8HvkI\nNE3ebrAHODMMJ0D3R3L8BBul/n1m2ZXJW4SM3Ohi0Vop0T+9ADVhHpIhVmw6\ndCmuCPn7OPJXhreXj8fM8vW2IAVQi5DHvzl1GfpWGychIn54aBmHjJ0iT3h4\nrQXkGTB+JtSBngGMm6ynFKcQGdhF/+q1KOzsTbVSGX8CRUMH2IKHWoQ0pajs\n0W9gSagjqF2pP+x19Yeb9kgXGIS+ReO4XSligy/1eWvHECjpolzJsSgVkaoN\nkZx/MVqPeVO6YHfEmtutMvy55xfSjOz7qZYkeEp3JfoRpslARf9zlr1dJEjB\nZA5URbopsx/Ms4q93T4uFaD7qtmJdfKp548U/GCvzILwBN6d6uYdldXG7+l2\nLUgv\r\n=ZZcA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB7wsB/6Phrw0JuN4J7QQdG31A7Z7yXSmejujjJOK/RrAiBRNTRxOdvUjj5keMzY81B/sZLRJ5QpQjc41Nk35z+VPg=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.1_1603286505098_0.24049164128249934"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.2":{"name":"react-three-fiber","private":false,"version":"5.1.2","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.2","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-lkcv8smKiXdNszTsTwROYhnhaOAf4j0ERnpnWZnBAbS/kep1HZ0tukS+GAq/jd/xEtvAfpj/+u+5koVEKUoQ9A==","shasum":"0f464b48caca7641d03dc682f366205f05a2f324","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.2.tgz","fileCount":38,"unpackedSize":675887,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkECrCRA9TVsSAnZWagAAcREP/A+GvHEG/yiBzI13APYQ\nX2tulTrGGfjZojGzHAaDutLVtC+ZKwquqFR5SkFVllWveP4gaFEOCUvOXBP+\na0+ennRqxsDDQWKjIJExBc7MdKriHM0oDtcGg05PgZN4KvkbBnXbo9JHmANF\nOxVfamBgsi1X71aIM3Hm/eLbF76wWwq2GYqpUsyZCGppBD22qXqcG9iz05dB\nGcXK/x5JL+TTpKegtFgxLEBt4g+zwHFXdVYhieWIvvxiXN/H6oxVgVwvzCrN\n0mQMmy3efCcKU3vTC+MnO+gcqNJixWFzh4vLD+3B1TXWGhflIIhrwcDT3MtF\nwtNeW8mFgsouAsKBcS308/jlUU/TVzxUh1g2w1V8/gEJ4/16CJtlvkufzxPz\nBaYfdEEFbQKzRHtzmgfDDXbUt7RALY304kq76o77dgPb/9zzSYchdDtxhbOK\nEV3GHFR26bwieuRa8kO6Ne7o8c6lyMdRnPludy5zYCf9YAyqx+RXWRsC7KtR\nfKLKF6F+aIkD14CKOmIbOVn7DimFUDJMQA912yDot3hzqThjQ9dhYC8oacM+\nX9aVhWgH0vhPo8IdonUeAlAkHNKwiZIMfHd/28z80AapCmdMRwSfCy/1ZC8b\nVVfzjk8iiCrD3lFxiu4XEycf1agqpzwOXYIEK6aut1Rss8dTKDd7kCDYajrL\nAv1o\r\n=J0hn\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICcD5v6SmqJV8vc2vCMdHOhNFjzHFYsB8wgLfRmqS2LtAiB+m4JVCUM4kS1G7IKTFqnPODX/HEfulNgWTX7gOPA5Og=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.2_1603289258698_0.35826320319604554"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.3":{"name":"react-three-fiber","private":false,"version":"5.1.3","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.3","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-lJ4DTAEcF7tHmW3yIsmAfGm1t4BkMaRd8X1PqnCnz6KmodtVy8x+D5LXTiSGqeJ0a7HCN39cDKEmH6yLwfyw1w==","shasum":"ec815f82a53e2c294d4a8fa4ec5ea89cfd279413","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.3.tgz","fileCount":38,"unpackedSize":675877,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkG/iCRA9TVsSAnZWagAASncQAIE7UdEVDJ72xxGgv+Ob\ntbgLwcbKBsmqH0ybsMj1mvOAyiRRb0snt5opfDQF3ZeK8DWGnHx/7Plk9WBQ\nk2wP4sQrgLGIfGuiA3wE/C/fAr8Vzf7toutoxyB4nRwkBFXWvB2fEDn4WefB\nwPm0nJXAig7EvShEn1cKr6KlEjv+a+hYTJPdqTJBgA4GZoInAau7sid9MgVA\nzpupOVXerf6tZBYw6ZL5d9o3Jgr2iZT+vs14TvNXd7RXu7UmcE2H124UPh+k\nZYO8uKS0o1XZHHrPc8+frn6Eu1queixdJhDIYbGVCyIRt/q07J5jb1demd6U\n+f6Y7DvQmeYHHqszXF1pjpuN8y0r3fBDh5U5x/H75+Gdu/JyuKPSQqpybHkl\n/3hMvKA76JKegyrWBS0GlEdBOJRwiCNsHP4Ssux9E3s9Ho5YM10xqylcIT5u\njjN2xhWD00mM8glCZdNYgU2a7hDUgoQU8bjfuNYk1eThV/dQ8xXIH9zfGQzk\n1Cu3Al31X0AsA7fRMMwUMbUvFQW+gFBh+8V4iW4bLz72O0ApfHdtgUw9duGS\nCLIiIDRZGUzfUMjRsFQi822k6pMYF3kbvwiNSJzwY4LaHiDEHzhF8YXPYKs6\nR9jIxLl+Bol45ZGVwWlA+Z+FAUQzNfcpkXI4LcmaNScK9+q8iNgkgC7BE365\nz44q\r\n=fTUJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAqrs9HBYE/nhZpTCemdF/NJP14eOuBseEwtAgSVJ+PsAiEAlVxLKdv0ZnouMS5oX85VlD3RcRnbLFIK4pyiS0xKEEo="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.3_1603301346199_0.7937799884352588"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.4":{"name":"react-three-fiber","private":false,"version":"5.1.4","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.4","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-ReKiKwKKOOfL0OVljOvyWHlQ8t2yV9OffyBDvBqxq2F8gHCe/cTE+PMFRY8z60HK+5olX+177fTh0PqR74rBAw==","shasum":"ab156ceb629ae89031176a047f46af76512b308f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.4.tgz","fileCount":38,"unpackedSize":674412,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfkq5ECRA9TVsSAnZWagAAhvUP/3Td/XCgHcHo4gHQ1mQq\nSVv2jiVCTmkMl8ceIZbRwVBKvKZ4wx661/f0TXmaFlFWqqz2jUMLfW2lanpd\nR3mcaN+b4V4YOSD9AmSYefqUirwRKcKyMvP1welEllFlLAbdwUcxC5K28Zmd\nXRJ2CbQ4T1Qr6YTH4Kx9Y0+qaDpBpoVktu+yCo7wQIEUl72ceTORiYrrAcu1\nIfkM6bahxa7IQiuL0AiV9UGflBuvz0hgyV3oSQGsSj968ZBQuglWK8hCzfOd\nN2up0kWJoH9RdgPR1fSVG25a1sJ76nykGGfJFFpHDfk1VZ07wUSazyidJ/+M\n1vl7Fo85J7BLCYsRaQjceGxR4Aq4zeXBnNUc+58t1lF0f3vpiCQTcJdb24AK\n8Y0uNn7nfW+QwnPt+UcQA8ic4o6lj6jsEbU49H2/R0LgSFpL/O1DM1vw2J8v\nnd9bY/4bNc/KHVr3cLDK5+6Kp7iZ/v7lWLiUnoyW/7dgSYUnSsqVza8pZnyX\nXkGmpkkoU4cqS6ciKBASxrWTzVmWpGgEh1liGmSq/VIx7Uhen9HrYT+U08DR\ns42R7UUq1UbTO7l7dt2StiOqEI4jmZLfQ1xYQifFMhzi2Kqhm4/ZLNDewcTX\nnWSltHkR9jpbHmmo/G6lnDLtoR3qTRHXGv+QCVXBbogs+YOUCGO111yw8iyv\no2Q1\r\n=4gbh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICNFNJhiNDIphxGbA3ygjl0QO/oTbtGKoBgnwTuURKi4AiEAxsnzx9LcuAGbqI4aUd9v5XaQ9AB1IGzJnK3hqElzYow="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.4_1603448388097_0.9079803591262805"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.5":{"name":"react-three-fiber","private":false,"version":"5.1.5","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.5","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-6wVxA/9ePERYm9RG2ID1cpi2PlFS82VtX1f5/3P05khUNPXx2tZBaaOZDdLr8ZYKdO/1uDT/ukEkIko8s3Si6w==","shasum":"8f6aa8145c37bd4c4ed86547ba7fdb5a6ac9df81","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.5.tgz","fileCount":38,"unpackedSize":673203,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfoUSECRA9TVsSAnZWagAAEokP/1jF7sj0uJhUPOYqmCLF\n2YV6a6FnoXitEk26rBlQauTAXtHgJwOEHN7gpe6rMH7oJkRtmcXElsQhvveP\nevxUGbPvmovtClCYUfOp/wdpLPFBUNJPLwtKF41Olr+zgULIPjK7RnZKag3r\nlEJQ2+EIVlWegZvpi46hHGbdKGvLLgH+u6NCJeLSNcORfqdNiwGtcHhgXJKV\nKBf5eTv3kl/YBOTAT6WarRO+Z6GIlrzcy9HgfDywCh1l/BWlCbFvKatYxZ5l\ncStMWgkTEv8/CS0lzVirpn6Re7YQhnr8KBcL8qnwhKfa7C+sC4EaGKcD9HUl\njjYfxC1s/n6hSmPxgBJVdEwgubljHR1EgOQe+3jJ2WTl0E6AQmnEMpj3yFat\nxyXoju+8+qrzjyKJeOsJt8r/eI1rVd3YyQbu5huNUccHocNUAualweRqzzaH\nMxVnW0/jTD/2I6BHesmkxPFJG+EgLdW7GnQpESJoQPxRAgiLL77mSZEUUu5u\nAvsmvu8hGMgKGg1tCYfejIX9hyiWOjzUKTzCbSqvRgwx9wW378WdXUqq7Rtp\n1efwxzRJJiJjyV/7VgNHOHrsV90XptJ0BMg6CnUelEIIwrAQfvekbVfRGgB8\ngG0QuwBdCeFLNj9pT/HVEnknXFAIILk+NldyTA5/08R1/NVqjrOmw/nXymjo\n/p01\r\n=eZ6O\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGa5ZySIBSHLByJUUo2PwZyLARxmadyKMFutoYRhDg/XAiBPx5tcFeiqqP+ey+/oKVLBvE/732stZ/ityesrhS9B4w=="}]},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.5_1604404355642_0.604307203253172"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.6":{"name":"react-three-fiber","private":false,"version":"5.1.6","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.6","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-Xc3SmhvZanyCq1xnixsbVI06coAQxW9FCFEaUjeYzVY5lAbViq3JL2se1kEjqfTZDpbDMUQflkEt9VT5xoDhiQ==","shasum":"48c3ecbb044a4abdaea9c78eec74f9a465eee45d","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.6.tgz","fileCount":36,"unpackedSize":673287,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfoqODCRA9TVsSAnZWagAA9jkP/iXUr+mhc3FCOx59OsuQ\nKJum0oj77Fgqizayt9M0BbShlhAWElVVPRQZCSwp+BEfIQFGT6i6ul+VpS5e\nwRKyFcIi7W8l3E0YJkjGAriALlK3hc4FzrS8TTkJPqLsMP6v+OJpgk2DzJd6\nNeG9smlptxhtnCucwHpIn9YG6ZgwwEngChi0BZUP46e3Z/SzAYsdQ/3KlYr6\n2sG2W2epziVvKd4w/4ybyeRiVUkOa5DZ9FwFVIPKJIETlcZM34u0YGAKXqAz\n+9WaJAMDdRytTvl43TKyM/53JOzHdKrcVEizjFRNsvb9fsQLL9O2Q1d14GEo\nfYw46Ozb678jZyL7HlO95NYODrWTx7Ocey9bsxy5i1jSvDt8qyz+evhPXTWv\neEo0hVfS5a/u2QZ3Vi4kqSu3TSTHebf4XldTBZ0oQAaNAQnV6rXjjmK5zbkT\nHxwnDAWgHujO/WiFOjNO2g64xaRMWZxJ7BziNpIh10Kyw0KJqJEoXP203FrY\nqnVdVq33bVLgxMm9+J/gh0CQNVCS/mjEWEmbeTLXUo7+eynXtktOJcIGPh+g\nf6cmL4uRux/K97E5MntESDMVCLqVAs7vILc+AaeHL6JwZUj0mlBxXtpLFb9R\nsBf1ox2Qk+v8386o5vcLRIhL2r9g7rO4C5zTydBAy0G5TTJ9jIEBFBhblhsz\n/N1T\r\n=dqlg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEzINpPM43aMx7zgjzaKuoaPMR6kLvu+cbZkBQkpr7FsAiEAg/Ieikaco/Uc380AFUW9DgU69Z4Iuc+hXl6S91aJE9s="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.6_1604494211001_0.5104902637421791"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.7":{"name":"react-three-fiber","private":false,"version":"5.1.7","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.0","react-use-measure":"^2.0.2","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.0","tiny-emitter":"^2.1.0","use-asset":"^0.1.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.7","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-K4uQvxF/NGHW4VfCTbqVebZpC4srtS8fMeed82PWEu/c4ZLxaj5K2noQ8cjTysz+uK6om5vy68W2/gkOPH+xCQ==","shasum":"53bc526c66ac00be54720e807c9d8ee90997ef0f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.7.tgz","fileCount":36,"unpackedSize":673627,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfou0/CRA9TVsSAnZWagAAMuUP/12cfmZKHHZzXEFLEhtJ\n2TOiUm0wwhiniSaI3XmuRrOw8ceeB2bLT/OrncOMte+GbZbGm8+LOX/MTTAQ\nvmBsWRKPJTJezB2tf2Os5l6l0vcbCqqzElssVtN2pzgXregX8FbOaljOu6xs\ncxLRuuIdoaX+NrLhoBtu3lEbJze6M30v4UJRn4/HhMrmsAGRAMx+5gVQvnlg\nf2ERTDqVZTQxirSE9aokYLsf1Xza274+gYPfJheDyhXoXTBQqrkIz1V1lBmR\np2rnem9qOMFacWMcj5HmiZHhwVcIYLTgd029XJ6hfcD4M2/eZ93KKzoieQx+\ncvxc/3Cf7UhXchn+e3C944CUjRU1ZiZ/TF8neEtBIlaKrQGodgk0jQg2uAVs\nIwuE14d6/iV7cgRis8c0MEJDOs51gA9SVTxI8Zmt3Vr5U87o4PCriMTUqvf1\nQKyhATqwBeWTPvtrfcyBxiaCq30NC20ZwTIkSpHx1c4MVhaebimpB0/3MV1q\nQyAkX7M0jjKUAxFBNIoQBeHrRjQlqdQLotU12HIC6LeyMORonXi0u5UtEVX1\nNg4swsvSt/qBY3JcLuKi0YgDA3YSs4Zg1TUdQ0qEe0SKtg8RWhr16KSwDd0w\nJXLcapEls77fVJr5wIL2197hHYvx3q/XGbsG44wokX5tIhE/1lyJ22XHTCZ/\nWxf3\r\n=VxWV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDOcZ4c0j2ORjEXMzM4WFDWofOPNdDiI4C11o/GzzLllgIhAMy6o2Rd8loB/kvOV+Qo9j9tZCTlXtaMENpDHGgHqTyi"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.7_1604513085777_0.03390304236550734"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.8":{"name":"react-three-fiber","private":false,"version":"5.1.8","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.4","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.8","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-jlN6PV8BrFehlpc1Bh/TRPmQ6jMfB6pl80OacwpM9moPCMFfQB7MODNaeuFaMsRRhYXqj90oqBfIJgsE0WKv6A==","shasum":"480997032f9b24b854e4970bd457ab18a120b1c4","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.8.tgz","fileCount":36,"unpackedSize":673547,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqSpICRA9TVsSAnZWagAAqMMP/RYd5yljnMW/0P9uAJ7f\nagliU3SeLoY3hav+VmRqCTDXrZcHf0ds1cRQ92OgknjC6eCRB+J+skswS4QM\nz9y3qMpMQYFcSAtNv8dKM66xTbzpr1M9VgYedswTrpNtLk/YXzCoxqrhoVtC\nOKfXDiOGaXYO9lsH83XoaciOo2D2IHkAitoszJxKtig1WjhoaLasnNTlRPtO\nhL4tLF4SKXDTg/8bXd8FjEZFCCbdBCV7FbM9wyXT/swKA2mGjsMzXBg4USU3\n4NWu3tA8khyra7gH/nuXnT4f8Kada9qvJx8DEJUAWGonqD8RIGknxwWgKtoI\nt++RGvJ+cmEVgGRUvTui8wnH07wAqxzNyeejWwPyAoVhbjoumP//FAvy9Zw4\nPPwOsvdEGE0/6Hevx8W/+fX0ZogfLD4uMA3t5t+HsBuPwa+yj3QiGYvBWCq/\nBBtGiRKJMd3GR5PWaNz8w0BG6XYQp3jpkZhfd0wynq3YyTbos6KkRx/KYvX/\nsco9ypOaFF0N2XZA51naI0veSCgfaOLeZ9zBzgAohFLYOsGCV0oe7CIAcGSa\nazQea4+QKOAJlgIIh9Kzy2OQOZ6gM57FT9SjhxuSbnLUgUa9eeNvSqgcKcV/\n9tfbHNhnG9eg6bie52YaX+vqEI6nOoCYx7ToGxidWHUpLKyKdWeFGqyqDz+D\nVhmr\r\n=BXRt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCiLRwSnVaL/FmX3cMLROBX21bVOw9SKOnfgw5nv7P74gIgJpLB375khCLke2Smnr3gf3APdK7BFggxtn5Wh/3IkGk="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.8_1604921928177_0.5977787647744546"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.1.9":{"name":"react-three-fiber","private":false,"version":"5.1.9","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.4","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.1.9","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-Gw6sQ1CR5WceuVN6di+vormJCCEaJtKIqWsNxW+iaN77HPNdhICOwtHS96j8+3u/BB7j4nOl4rIBDE36+hk8qA==","shasum":"58e9c8cfd6f4cf9ed735f6d7839f5d7a000f2ee6","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.1.9.tgz","fileCount":36,"unpackedSize":675922,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqVQPCRA9TVsSAnZWagAAGFgP/0g3nTmJFgk98Y4TxZrS\nxZZKn9arShTKoCdKX3T/SAsV0HjqgxJHzEfFv/rcPwjzV+NTsJ0zCxwp9xvL\n9Zz/y0he1uJiBvn2JZrYq5gTn2Mj+p+e+zHwkWtc0fliyH4sK57XUqDMr4US\ntLypwEO5MNnQgmCpuYYvdC5fjF1ORRWfkh+5f+zVKCWpbAv9okmTfpEF2p/G\nNQpNoyg6mL+gwKzVpvdYCRfqsuzEdtj/Qd0U7jfKRd/mX7yEiMPou02D9W0N\no76h7hvmR6e384JT9dgs5nANGziEEX1S+kKcAKzx3HUZiWi6axVVHX0fr3k3\nOkRkNgQSjHMF/16Mt7suROyTjIR3disz1KiXemDnGSQ1iX38f7yItViXD/Lc\nMoEzuAHajG/Jqe26ymRnWwXdPT/3YPII4Fk+pGBOvXDPk+f+E+E88gUr7Dv7\n3Ld6oG3D+imFXKmcmMuk0MLYAl0ODIlb+FA4ekoFqdT5yw4LgznOO6qPFPKA\nlwP8qBpzFSr5s8IPKA7rHstLiq6GabdkqJCvgBn5wCmaIHl5eoLFB6D+Q7Og\nDoxYypqobtYOaSVSAS4dZ+wOmE7HhBMpcsYtQ/liHvetjwVJFYHff6gaDIcR\ney4+GEtV8rsTIrPc1m23fftNplcL3XoyNjUlL/vF7o/Im5MeplxPolS99hKl\n7OnP\r\n=UKGy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDQn7/tjXleWNTukfCqKcmB2Na/aN5mjDlZhM1Se8fD5QIhAL7X/KVTA0P/5FKVkGn7xPmJwCdmyLgunXv99wUprePX"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.1.9_1604932623262_0.37184750597974325"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.2.0":{"name":"react-three-fiber","private":false,"version":"5.2.0","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.4","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.2.0","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-xajqHumGZSewiuXHmJp9wD36my/QJAX+3b3Sh8U90RT/chEYU+qzIXD3MoJlV/iRTPMhkNnjgq15caNcYYTzhA==","shasum":"0d1c27dd79114ac31ad09f9f0da26d288da5c398","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.2.0.tgz","fileCount":36,"unpackedSize":678040,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqqZjCRA9TVsSAnZWagAAulIP+wRUqby/cghSA1FR2Zym\nrQlZYXj+/SS3Cyi3bjvaDAPbmn8PfxFDFTfVMPGQC6SnumxYk60kpEYvyorF\nmDFeAfnQpzXd9h8cDhvhA+b3t6zhNKsn21aSROuOYmv9AfFJ5VZgRkUC5x8w\nFFaULayiye6pV9HbYSTrbZnnG50xYPYayZOX+wTbTdBJClOMo30bkeuhNIma\n/ntSmsRqO6EnQ7ATC34HsAHABAQ9Bkz1aPQWqvgUS83Hb2eHVg3EB6wTvcdI\nJEG3i6QJ/LdhAxFhn1q85AnfAzYpsYbO0h9TydbtApWEa1uAqMXD3xDZe2sy\nTkzvkJBKD7I7GFbD7/eePweIZ51ZnES1nZ3OuDV4pPhl3VQ3Yi7cTSc9Vz3j\nkbn3gnjZkzzc4rlZkpd2vvY9cx4wQHUfmHZ9tjThBX9+yHWUl1np3N+htF0o\njP0Kqjb4tMnkbRd7vxK8K38Ah2POHJZhHzxY6VrJDdbpkYSbUuH4DyAtJPer\n/d/3biXX4qIi0dWCmRB4VufCkC+I22AFHjFd0MXTZ3P6s3xPp3NF/hRd05oj\ngSSdOSF8EX0JyjP5qil+u+cy5JW7biKydKNPpE3Wq0CRBr/PGDRw9ivbJN80\nPvuYxNXu7054PzINiFqycoSmlHkns4TuvUVi9Uxhj4WhuIPi/UohTL7Ez3/a\nU25r\r\n=rDW5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH70XrMsaYLn6jpG6YeuP+gWA3hfcSeIc9W6PMJR+ErZAiBG4UU8fOrykoinJmG1Nf4iyltEQQM7jsIgS87xGNCzPQ=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.2.0_1605019234438_0.061535423945825674"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.2.1":{"name":"react-three-fiber","private":false,"version":"5.2.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","@juggle/resize-observer":"^3.2.0","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.4","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.2.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-fhHbdVJre3E8SKbCjJOXA4xXDZIhSsIsBZcmhgSmwrVuMZ191wtE96fbxNKDADb3cunfMSrr4Her+vfOnoQ/oQ==","shasum":"2d33e3b1af039795b01fed0622318cced7173fcb","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.2.1.tgz","fileCount":36,"unpackedSize":682319,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqwEqCRA9TVsSAnZWagAAiyoQAIrfZCXou41IQZG4248O\nPSOlVxK+bE7ZLpoLakDdACaoQyOYe6IgXmAVtcRS380tLLzEG/Slh5oLtDmj\n2gldJukHYmoTvM12ydvJaPJ2pDILS0yht37U6mUU02ytsw80IcDTIuSwHKst\nCstZkyKVq1h+I9RHgSGGJ1YMCGMr9ecwtXSzqSSct+HNw7i0jSYIrpjf77jE\nDDXuoKdp663ZBSlibqX+VnIi19h72l+8iRIMMKyrnS2ff1b5rdUG4TqAZA5G\nhvBWU2COHYAX78JYGD4kJO+xNIdLWYcPVZ7ZHCRnZsAgUsGejLvX67nz4Q0A\n2gV0qyoBVGvIHXIjxITINZG8Hgi9c5mGhWUmeKOggXYW9eNLnY3Hmx19DX7v\nSXPiht6wVYi7JM6wFbuwC+DzfdocEwvRGy7ICrdQkR4elDFCqPKDKtqWIMgo\n2FKSBUeYp9VLLFMpnf1aFDOMh1QAywGLWu9NfL/4MvcvGjrc8NdOpksQ/SmP\nWbj4Yr8tLARIcixP79rCvPDeS4ZbF86lD1BWPVK/6C4KuTavC1Dp4rTQHWHg\noRFj2cXhJV6P7h/Bm2cs1kecdTkAmU1jPisbmjsu6xhSPNK0Juxm8SFcvyfC\nWVUUdsvxT7J+hE+j6Snpl6NeITKMaH/HI+cU/4quWpnwuBVTq5OcwOpnxV8+\n9TL2\r\n=TIwG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIARYFlTiFtqgOlxMVN89FTy+7j60NeQdH/Ipe0gfIENmAiAvyKGSvB9re5D5Gl0Vri/zhvUOqLhXrCsqf5wu6pJiGg=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.2.1_1605042473848_0.3788596293060884"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.0":{"name":"react-three-fiber","private":false,"version":"5.3.0","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.0","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-cBcxNGTbzlIexs5p/S1uen6dgYWbnl/Lq2TP3PPP/s2o2vOZHVmnhoaSUC/ThRr5/0X6GTuFmBw04rGrIV99Iw==","shasum":"043cc2d195570a497ac66f4cb1fad41686be41c7","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.0.tgz","fileCount":38,"unpackedSize":685130,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfs7vFCRA9TVsSAnZWagAAyqQP/jxkSHIZMvFQW0zAn47v\n2a2mx5PKLCtmTYo+yGAMd0q2QlcfLPgqJdcrqm9CF2lJl5EucUAvQQmg8yxT\n/ZLB8gto2Phof5K+BlVoXKPbyw2vSCGXOZsHW87RYj9jsmguulfNeX53jqcL\nv6PD1ffjRkpvd2HKfpo+e5UA0qQ/I5CLubYA4Bs04Q040MYHWmAMJTFCm5xK\nNRo6MemPvbIJipS9kvIBrev3uxyCIi9kPvznTfwD4dN2MSfpnbr1duwjxjHx\ns8ovdzpMGGy7L1RulZEh+zEDRWCt0zj6HhfVWY4IlUJsitQn0c5jGNOAQpWU\n83j8Vfb6Re98ZX3seZT2gyIFmFfL9+fmzLGN97QIz/G+88qWD9i1N9Ay52o9\nfBtpZtt71PbLKaej4HSYEkQyos12VuBGI9jPPweO95M3Vxt1/kDE7Di62qnC\nmWSINpil7RFkA4g479upNoBuuaA2OGON/qVe9+uDTYTexEpTXf4G345QdFvG\n3E+pW3XLIaBe7+YtqgBgnrqEpOimQT7GprSCX3s8Ws0KB3W/VHj52PiadMXN\n/gNhv60u8mLOKDZVkBxhSxKltGMc+7RMGdDAqXWBV73OTFmieQwwdUD/fPeh\nlai1ceR1ORW2OIkoQg4TIRoibzTwdBLdKCzNlOceun8pPAczqyimU0LQLRPj\nVMuk\r\n=WKmt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBnl9vY11jnMoHICg/sM6P5s1IshuVBQ1ZtntC7EyTIUAiB3zeuxtu2gPuIJEs1GhpaYS0/WYjMrHKloBC6wJe3cfA=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.0_1605614532840_0.3671770700661843"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.1":{"name":"react-three-fiber","private":false,"version":"5.3.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-nKj7TgDoofyHiKyBNuJ60UqXlCbgjEeQat5KAZALOaVMXw/hxfDtk0lyDezKHW91qLcUcUo3FBrpJSjwsU55mA==","shasum":"d68ffe5e1eebfa81255bde86aebaa622b7b6d538","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.1.tgz","fileCount":38,"unpackedSize":686666,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJftvB8CRA9TVsSAnZWagAAkMoP/0ENPh+JnFrYFx9WqzP1\n5bQDkQLP05BPce2CjN1tm+fyuL0M9KCxFPSP7LcKgs8B0fDlimPjsTnjULP/\nn1kguPWM6gaFWg5l9OOf9CmsOpJ9nVgaz8hhgyBWpkZvgnUFkGM358UEsQN8\nISt3Gue9+uM/kf6vqHoRm7pJojDByA9blViF/R1A3wYC4zRHqWJ5c0fFM4on\nCSk5AcavR0l6uWtVJWMdD9w74Sdak53W2EbK1mhClHWcyvz7lG6sjHAtcBGn\nqJeun5BvBboR88eCAY+P4aZ8mKvZwjpSF6IBhkZKxb1YIW66hSwIyGNtA6BS\n0ABfJGzhteVE1h8xptM0O1vpViJ/0ibr0IYX/GLIaXof8CQsn9dbxs0xEmy+\n0qYHXAQVHaN41z5HMnukA7C/QNF0s1glirEilVbrJ6NYs4ZEMUh+lXFS4TIM\ne5ium+hNP/yYNl8zV7X2uCoCsYKBO5i57+vx4o5eN7L6YYXqRzh7Cf9a8KT9\nV1DENSytlpcK6jTwsEV8eDBrjjuVhnfni7MD33xc+jJtU6bdjkjIcUdj++o3\nHVbaf/rtORkkZRHyNXeEnmSEkw4nwE0BrJzw2hYwANUFqkwrJ82q/VIjz8aB\nKlU05X4FexB+FJcxMKHC/NBKPhzpLUCTgV4lyvFHLpcRjF26D/Xmo1ERmRX2\nf3HW\r\n=BDY/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjQBVv+K8bchXtvH3rCOo+s2Os5v42/6xT3fZ7sKr6kAIhAPNJcM7utYaOfR8hXsJZJmuvlBaWXhmNvZTFChgF6fHr"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.1_1605824635384_0.7304825807447382"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.3":{"name":"react-three-fiber","private":false,"version":"5.3.3","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Alexey Lyakhov","email":"justfly1984@gmail.com","url":"https://github.com/JustFly1984"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"7.12.5","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"0.2.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.3","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-qFsgiyaP3xvA/DsFAcppIQ15fqnDgE3hR/LNLwI8aakFLyyIYS3d+6OLYOBw6hlYG94CVT5KJ/xwXx+w8/UACA==","shasum":"13e73ee57f21d1fb313e426df0bcaf750192edd3","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.3.tgz","fileCount":38,"unpackedSize":698035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfu3sqCRA9TVsSAnZWagAAnhUQAIBRHy4MDXbJATrLsMuO\nkRQ7loVmRt5kgVxLqPzYSRuYbEg8oIP5r3Lkvoe6j8ZKFvvDzp5j/M8vEUkG\nnqML595tGHkbV0cLHQoRHq/5doA6ym8+fVOqjVrLh1uOrdeRCSsIPDqoFMJa\nda4NfHqzmU1bydwDaZjJKS8Ly2op6eS1vbyl9ZB53oAvbaFC+flH6rCVhIvB\neOUtEICZLKNkYmYZ7g/wnRQ0gkjxGTjDkvcswYRhhSeaNXBiqT06lGvXdLY8\nxZ1T+PZlhrjNdY4zGoR0k7i0ThU50WCJeIVBC3gH19a1r15v5ssKvQeq/n/4\nDRcFQ+JtvAjylN1L6QEvpmMnpW8a30bYUdfFsmDPYNBBBGsYVCEBo15RhN2Z\ngr8RlGdL8pris9fnT/eQdh5WchYAoMnKCMzxDihlWsrKPT4n9pH/6bDBsW5B\njlE9VEJ1CWJRRnoILk8vRuvPG8k8wOBWzJS0gkMf2xetLjy+KfaptY7sh5d3\nq+zKDr2qoPUQKfOAGZpQWdcRXFQrTa9vMQDy91M/9LNe7pB+IpBcE2YNt8k0\nUwxSkWMX9z06nLFX0vVKolrutjpGtotvTQ3GmJZ+d/p7tYFqFtKwbg/nxtLG\nV4uU86PseCWOEyaSslFaKkv53jev1CJFQieQGcPOvIW/xjjVeFwkOxYF+Afs\n0LgX\r\n=1mFk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIERzhwwSqzSYhPMEPxjj1sZYgccbZqbpENqywKcgWfn6AiEAuYq0ZQ6DCLKrHKzGBvqrYdruKQ+x16Nwe6mFXYWrZho="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.3_1606122281318_0.7064216945984729"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.4":{"name":"react-three-fiber","private":false,"version":"5.3.4","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"contributors":[{"name":"Alexey Lyakhov","email":"justfly1984@gmail.com","url":"https://github.com/JustFly1984"}],"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"7.12.5","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"0.2.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.4","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-Dml0+FZrNJ0k9YvADBdW9aOYEoYyd2pSS0Qsn4GN4ro1efUFzlNUNaCMGRXBaw6DV5FUNZlryZy+GYKZZ037DA==","shasum":"79819877f9f61ae671840c01606451f73747e648","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.4.tgz","fileCount":38,"unpackedSize":696215,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfxNuKCRA9TVsSAnZWagAAudkP/0jlzfYhff7oSoXwbyrs\nUPgsvPtqC6vbfYlfAGTaC9oRo4l9yC37yvDT5tkTBf27E/O8O/7xPkqkwlAt\ntmWhJEunu+lHaTfD7bDSuJCYukllegYjQ1+olQWNPhlPUojU95m52WyPU4cl\nMtIyDLGG+tW9kO9P+3HX1ig4AeVp6GA1W4JpAzLLrrYAMeCFH5sI2je9kRXH\nZZZKiTkGtgWAoDKJbiXWFGSqnd4fmc9FDh4mPD1QmfVqs1X/1uKxPtP+h1xN\nRpyJrUpqWDNc1RjeXavS2ZWfpIbD1OVqtzUMm/bD2Ar4FVgS3pm7TiP8AUDz\n3mNP6bqV18Ky2Fr78yULl5vKuLVaTuO1m/cGGdlAsU7vlYeZqvEvG2qDZk2j\nXAqwsLyAlN9BniDhHAMmOXqE0TEBZ231gDrvA0vMfyUeFAuShTvsriHFgfG3\nEs00jB55kx6aR0e3wwb2UOPOqZk/GBgsyrpS3YYJey7DHv+Oa573hyoiN0rA\nIroB/YPoGDreXmInrKoh0naftuqfJ/btQpHm+d6R3QREt02xQU3BWxPTtyP/\nPva4LToRUlvAjFtq2FDhN2B3gF0ni/bh7DzlBL8LpFckswDsxSTmJ7XIz4Iz\nH0ZrPtcuoZ0e8uHRa2WnFq9R1DhFg6Jkz2jvYeWAfnnzjx6C9St0SWdGZVIc\nE3KS\r\n=YlzH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIANLCp5Mj5GjTSAwYCikAAJoXWFoEtHGvodhxWlq2ODkAiEAl/CnbkV6v0kP4w4RYUrKa3R4nSg9+InBqOttxdhnthc="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.4_1606736778249_0.19708128815982762"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.5":{"name":"react-three-fiber","private":false,"version":"5.3.5","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.5","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-fT4ewGTS+41jZgy0ekXaekF6AW5GYHxgr57Y6aPWRCT+qSmWDHep4XFF+bqku/AxOlN/6sP0QAb3JlbmsRyPbw==","shasum":"567f00c9b9082b71074754b03a0ca9a0b6ef33eb","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.5.tgz","fileCount":38,"unpackedSize":697704,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyOtrCRA9TVsSAnZWagAARskP/37PmpATAs8C8HywUI1y\nQTcNQqiLGuFQ7Ev6sdNxMlN99m7Wws9TznGiUELiYSdlj9qlPX1GhAOFPl4y\nWEMetnvPHbcVtQRXM1ovtfg8r18O4U4vy/NoqrG3dMNSQwkMA1ZQ5YiUqmxa\n+DHQJXfPcF0tRnXNA28fIGwPkUs48901EFRHMfUYa7hroIvSVemlpPT8mqVT\nQOD5HJqBllxW3HJsxWtJK3V3DOOQq6fsnkxa7eNS8YiDeVo1tOW3Jri+jmue\n1AgiIg2ykXSWjNu3kS5g7aXShdqviV9+Xf5w0OjXLR85NCJ/7Gcked94ZVoT\n0EQedM6zxXkvT9uUSGV97/Zb0Or9Id3WdstFCC4Dial2ttFLXGKQYk4YhfmI\noukdUEbJ3hrAAnHGGwdTBBMsnQcxtuZKvy+GS7EZHxxN02QNzdO0/LMl/rmB\nyvD0/yKhcB2hkF8bI02LXc8oKfzODaUTGvEjFpY14Gm9oPgZv/g+fHUY0ye8\ntZEDcb+OFshpNlSXRUMk0igxLKfRFHMh+xotn71Vfot9y1SJug/iGuanHrai\nBAOUoyv12Ol1xkl2HRvx/DAajuhvRSYilOYXaQOj5lhbeFQ8UgF/pat8DwDV\nQjh5MfyYYgLL9/1znUcgRbuXxf7FXvGiWYuEpqxOl4i4Z2CYsUfAYEzGt/v/\nZWAk\r\n=oXNh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCapCC+kh59qqrXxSjUICdlapVDzWB+ieJO5QN0/8iTDgIhAK7GckHznH6ZNFyYJ+p5zqBsLEyHuwXj/eNQzHBl+3gA"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.5_1607002987023_0.8387423525442237"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.6":{"name":"react-three-fiber","private":false,"version":"5.3.6","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.6","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-xZrKo8vCTct+ciR72FlLGs3BMeID5rb5XCl8tz05ZGLnSQLK4O60rLJMh1YioarsCWf0nxy+ZsIQ3jKw5WQ/Og==","shasum":"917ecd4aa056e3bbf73f1fa97c68a57f9eb5dce9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.6.tgz","fileCount":38,"unpackedSize":698285,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyRa4CRA9TVsSAnZWagAAWOAQAIdLdeKjgtY5w+IL89R5\nqiUpj9anMH5TiiUX9I3HEkcQihlssrxhQuqTNfhlloIH3Qtz2FCjBdSTf2Ip\nkX0nDXpapg022o0jEquoe+xf72Yj/fopuVL3VgyoNU13CwDw/xrGSujJKpb1\nGRe//mP7yB8sG4pcWOLjKh8/vx6TfeIeV+Jk1RTyr2AF9LDbZPDjyLqzEvIL\naO/cWTuZjV98Wc5qAPqV9ZpCqppueCiNJ68Ux5RC3SLC3gK0JZme1YBjrZg/\nW9KVqByyMFklDADlEPrYUGKxvNoXqcXgoaSIl31z88bX6YrRIWP/oblUkMzv\n/NOWHAaPk+aLuIxi7ZpIJAJo8Eq3cZ8yXbQzZpkt1jpRSuOubEbeG1GD1Ia7\nAnzSc8QMGDavO2chnBc8Sae6Q58DBRP9dGs07SgjZhIErW85vVHncKYFaxC8\nKdkqxU12CRLfWG87aVAliZxovaoXXv23laJTeAvDq9CDx+cb35Oh1jBGs5hz\neC+xZGz4RrZWPES9MZ2jMRDINX/Dob+5BdxXpGt3yLz+G2XetimxUKr3N+be\n5QNbr/pABXZWmsiKrdg6YfJjcSerYCp8VEh+7T1JO+JO3DBaPft3zmOmh4mm\nZNA/vaGeHpbX6Ic9je8L3i62emmaQOhHm0TzadJm9iOw+6nJxkflcgYUeUTK\nPvOM\r\n=CQiB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcYh5B1cAka/fLFO2jTtET9N3YoNGZgs43PV6EgnMxqgIhANkeiz36LJfKYKTwjUYwUCoMBUmbt0b1fuOfb2QWwyD5"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.6_1607014072200_0.854822194083444"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.7":{"name":"react-three-fiber","private":false,"version":"5.3.7","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.7","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-qeVI2J6SB7zLVpe8sQTRY3gxPq1e4XXBZHWvBbT66lfH5d4Aw6XkJJNJpBi4ZSS9dnOohnP5BE1sDGaj2HAy8w==","shasum":"edb5c176bd88c99b57ac410211137addbbae2f95","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.7.tgz","fileCount":38,"unpackedSize":697035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfyh3NCRA9TVsSAnZWagAAfMgP/2ZunZ66lKTxPHv4f+b+\nXPmcCLGG5/maxhxd30S/FbPvRend090aUKr1TUgzmpk/jfqyweHmB0mqMGle\nDCN19q580WRhegh7C68S5ge4lHIo7UhCY7FFA5X/Wq9+8vfHkI3fNB9dvQPQ\nmAU1Jmrhk9+pbGVsZz+sTrrJPrq0LxZU+3953uTLUbd3ylDMirS7g3oDCIj0\nmu086lHztMouReY+62JOTd72hUpGFX0+Eb7z5oyr3Xl/chLysM/DoEL7vVxv\nQTl4HaIgWPP8TPbq5Q+MQ/x2GTKalTHnwGILSFxvI1wREkfEsnn+WSXrXFYA\ndi+3QkO6Ih6t5oBWcGJIBH6Ngl/9jtQgjzglY3f+t0Ecx7ZbGFFvOk7+bMJX\nDGrDU1M8UW7KmBrIRiS6lECkH4BFYZf4UmQR9vna0LE1sg8FHl4aK67bpE3h\nepj5HrVLES0fV+oyhJ7kMMgFyir5NQurKpKZgoC1X7uYlEXVErahb0D4WODA\n52IBaESpqxhKEMa5kig0Zq9TSdD3ZM3hVMNK/frIKbMBvGTk2G18PRgpwoe8\nsCG5tT/J2TTv2/BVmgE21cDih91I5LiREwqB+59t9hXBoxOKsrhCQbqGqlpV\nSd6Q1rYRGcyDaBQVXTHs3BxNAQuH+LXXnuzT7RtULW+QPcCd7RYYnnkp59jX\nnSE/\r\n=6UUP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBx+8kts8k3Twh8iEwN9pReRheygk3l1+6jjBjeTXCH7AiBPF5LBQSoPeKsWbckkZrJsJrviPe9vBvefUh3pLJay/A=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.7_1607081420330_0.39961256710823334"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.8":{"name":"react-three-fiber","private":false,"version":"5.3.8","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.8","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-6Z5nD8swJ5v/MTftdyzcANroWdqqpJBcCP7WZekQw8VszmQNzHzleJM4rhvASwQPyVyojcIUk4CXRyu/FfzH+Q==","shasum":"27de08b0db485ee08c624004788efb1b1834b503","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.8.tgz","fileCount":38,"unpackedSize":697759,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1UlwCRA9TVsSAnZWagAA8XUP/0wdwQttPy1vKMbnkyoa\nUagY4x+e8l9Fr6BtVXN9iJ1kifc7MyXokMoNKFSAG2LjeuQ+Xxo1CE3PjoZI\nxqvuWW8mFzqCVt5eVyJKyk/thP2PjlTqNTJhMZz6dwh3zmgKxafW4xw+DGYy\nDCTA6Fry0J2WlZNAtCHUA+A2uTSsPAdUjYXOmrV1tjoVtC9JpeeV+R7UE27Y\ngeL4Vp7KiMezuXj7Pi+Nj/MM3jHZYSpn0PRFlkyb4xfUokAGhQ9XeZ0usxoV\no4akvF5cngK10bZBKF85k1p+BiSautVd/Gc2Wr/9zrfqlh40Tfury9GRcBjb\nl8aJc3uX2byvrF4FI0xw31NG9aJ4ARkLHHPtvOhTPScYgBKOydVaWFgoU246\ng/oqa8SjTHExrxXwXnOiu451VfSurJ3F+neGniW18E8wj+Xdtcgs4W4jsKrP\nNy8JkIlZuv1GaAV9q1IzC3hNQdVtI8zF6XwWd8rX0Wk+NCtvZxzBousl1R76\n0FcygmEwHSPNwVD1YT36j8xVaolCzjj6j2MbGB/a4xnhlVpbPTiHcTMqWnB6\njo5SrkwhywC18Aj7cj8M21M09wjCWX9U80I7OWcbFsEEF+dK1IQE0LnBoWby\nO+RucYW6sDPmGP1kR2WvewZ0GjmcQBeTq2q2mnJrA9Ir0IitphH4jn9A5AZP\nVx+T\r\n=lo8i\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTZGqO52M1vdKApyWrcCh4KlK90hVkso5QUHEgRPWvCwIgXw3yPySOY1MDwG43+YkO0fjYsfC51bMddCnxlpiornw="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.8_1607813488062_0.7225034852313665"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.9":{"name":"react-three-fiber","private":false,"version":"5.3.9","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.9","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-+5gULjPO4WefWetdhuthaflNwnf1pDaAaSlBDgIQU6plQ/suCx4lPCGFK9UCTS7tLyhgA3IkmdWXAzRIkkip+Q==","shasum":"adbe82b3c5f91e7a16fe19c6e0eb1c75b8ac4d78","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.9.tgz","fileCount":38,"unpackedSize":697859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1VLgCRA9TVsSAnZWagAAaRwP/Avmhs0/xgxMy+2WVOI9\nm15atACXWUubkYku4xwsFxEqzallw1+GSI8PXpw5K/Jku8cQLkeM4wIXBpuB\nHGPP4eC1xuOpr7nS3EFJzumguy4PHGRO6u8tJ9/UrXUtEqTmLiyhpoi23rSk\n3kBEb8T/qEVv0exI9p/z6R7ojmGLL/zojC1NR913vMFmnMhCGYu1l3wenF1y\nvrrqZaf+xRcVKe/lmycliRFPWI2qezQJ4vqHiDLxmjAEEZCYr6PlYJAH3zRy\nXKJlg1Tx7tMc554HGKMuxi1qotPd+5TNK8Rj0rlOn0Pz5jzXFGGSVfGwxwuf\nLwQ9UpRgHpkNCg2AoNXF7HubOXW8fzHc6WLRqWicvCj9ytBQK5dvft2+4Ygv\nTGiEof/WKTjPxDARZFaY9VJdjMqciu8UBx6Rx/anhvUmcZ97tdArCzgiwKBW\nam8yfVU/Y4a5T/+UY9To41QlvM7m1ebLz5bVygw2Gje9YdkSoitoFsAlVvhN\nuK5XObpFETv6u3FNuWOUbHBcPHE8xCYUKwyZwLCAHF6rfn9D4r8hAF1z+iWP\n/85OZ73ypFugS3pINoO5p0ndA3QQcz58ub2dznP5FYnBvXklaaCH1i3QNjMC\nQTRU7iOK/ebYb0jrZlKKyxKO1dBa4ZW9AKr6TSOp53XVZyilBrh5J3HdTyf8\nzTlr\r\n=EHF2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDv8DjnAsLKdV2Hp9EEqa1CRlxOMl4dx9Zx/m0tNtrAEQIgYtIcKmvz8UMNH0g/fiiDWa1Pqat/yrLIR8EQuWA8k3s="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.9_1607815903979_0.7807382436663814"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.10":{"name":"react-three-fiber","private":false,"version":"5.3.10","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.10","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-qC9h5XfnEK5QX3AX7VAt8QjlA1RmvI8ZkY/dwVcTDHh211ied5hW0iq2Fo1GjU9pwo4SWZ3P8RINew6as1BMCg==","shasum":"3c4786280ab69111ef5e0b7b49bdf154d6936e22","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.10.tgz","fileCount":38,"unpackedSize":699410,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1eucCRA9TVsSAnZWagAACSkP/1eENjG3UT4EK1Kk9HJz\nQZ20NxPkOOwZqrJmAh8mZGh6iYiX7T0vdKTkwpDMsNpb6rjCIqSBGcS49WWH\nAZ+YICeZFe1W118ufJN+NnDLPH+IYLTewSnRQuy3k13XLafV3l4qr9Et7v+N\nmFmGCawrVdYRqyXE61CD3fQbw+gMF3VkwZHv9uhIJ/PDK4G0p737Oq6/CpF4\nrhfsxKM/CPJUbmuuaAVR3NF63rO44igKAjacjdP+V9uoO92obMxG2hBqxax1\nI+QKDwNZsS4NsMdkacqluUN34eu1YC84JHP7P73+YnIdsNMMUdg9PUcTjb0e\nTB+PUo6vmz3KVtO213wckIoFAvtucgg34TjGhMGrlHLY4iQ3IzY3u/JL9rm1\njxxFLE8kTGAiAT96rhM9zPcUzK3DxN5pJHQnoDRlK/bnxy6JotvoMcAU69oK\n6T3PwrcJv2uBLTQP1EQxRX5NHuIjfIC5qnwFa/vyyrgv2qXgtEJ2ml5aks26\n+vsNoOE2Ynu80zal7nOllBgF7mPHjApG6x3PLSzjHQKG0p2ax9CVlXVNqRgw\nq3eH+XPu7hM91t100jiWiZq4idKSQfU2BkuIX2m5b5AE++jfXuqD9wj2xrb6\nr7Y4W4uxJYCuc5OlHGPfEms55AQxnlOy8MV7nvq1ZYgnlX4ejVNav63BfjOQ\n2nEz\r\n=1+p3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDCrX4/CG3XD0wGuxRBlauHb7altH3R6Spe6IDmaU3fnQIhAMHZzLknpC+P7ECqDngDBdvUNiKIaY9xI+TeNXhthMfj"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.10_1607855003994_0.13717070413215127"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.11":{"name":"react-three-fiber","private":false,"version":"5.3.11","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.11","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-SL20fGH00QmmXtIo299W3Ak6W9nqF4dpVUdHB2BDhMgDTjmWSXr0pMuA0sP/DTUIObIAz4ldQ046lqFwyf/XfA==","shasum":"f94ed045469b6983c0573164f208f496f63b8344","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.11.tgz","fileCount":38,"unpackedSize":699702,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf8wphCRA9TVsSAnZWagAA2jQQAJ/VFLuYJ98kYoUonlZY\nriDj9gur4ztrJLwScB+UvEnUOqbF4e2y/KlS0Fx4NDAiuLy/hrr/+AVOb0RM\nJsHyGSG1nzCWX4un0ZxXBJluYAXAbvGfVYdxkiw/xm1qdm3DUfFwl3N9w3Yv\nmWfjV00P6JfCabkHyAzwaJaEJzme7DcsB78PGckXlQ/wDJXX52l7dIVKO7Hu\nrrvQnJ/QVKTKvJlH1e4MJ/ob3mr1AKVHK74TkRKqHa1GGN7cv2Ml9AmBoCbg\nMWkIGXW8vchmbkD82E2zaSLE18VH0Ezh5i2Nhnwp0HAv6fwSSxJdoO1WLpS6\nCpYGGgLlC1ZanTMBk8f6molJTvvT8D4kbZ9TNvRA7W7aydHiqJaE4bHkOqIl\nJ1O36FoZ8w3YlauyWWh8gX9/PCnPOQQia9FVsaw5zosluGFKqP4Vpohj+RGr\nu934stNitoEltfySHCIP2iUo47HQmBhGzG7/4O5XNjJ2T3GUPdEVCEpYnBHC\nkVcZ61RKz98huGOj1P4qeUrnMCCxxXtN+KxHzVsJjazKhhsOs+zgr7EIShq2\nmoEHETm8S7/QBMNba2NNYRoOpc5UiZizT68k8+xd7npTF4dta0L2mjp01Tf0\nPT22CeNMYWbp8OrYwtNiVrOItWPGZxCQ5erLJvty1F/IqOX6LoQYBrlNPTOB\nWjn/\r\n=3uct\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFsbKWvjHmabGF7p/LOiU+G/LzdRBhV2VD8iEol3S4ceAiEAlZd2jEoRIKISjUhzPrVMTz+GeB5ox99PgwzLqw5VliE="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.11_1609763424467_0.805738822534348"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.12":{"name":"react-three-fiber","private":false,"version":"5.3.12","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.1.5","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.12","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-/aTUCP1zy5tJNTUHRfQs0WjQN1HHvoAPSu9z469zuU/1gQ04uwWY3lOx3OcbRWe3a/1Vy0xVzg8gGWp/GmdbDA==","shasum":"63372fb3251fbf09a4dc6fe5804156495decf5bf","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.12.tgz","fileCount":38,"unpackedSize":699992,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf+4AICRA9TVsSAnZWagAAyK0P/RWjpABq8rQko+d6jVKp\neegrieRG6s4WscN+X284EUHWYuV5dcnUw531n5Npt/awdOxNk2sXZZsEElwx\nGIVgyG7HW9mNYAvz3hiqvqgGd2PG26XuPPzfHUtsnEgp4n2ayrlgbZ31XjfE\nam6obMfh2rFJCdJ21OqZgFppj0pVdYpGXTk74rTR0DbmGOhtEfvEVp7xBx8B\nRFxq9zG8SLSnW/rm0Vr7jIj9WK7gS79SO7pbTn8nCqJwNCOv+wwfNcicOvPI\nM7HZM6/Rsl5agnmCcXretrl1bCFbZpIQrVPDnc0gDdnnuFw1ozDS0CzKz3CY\nuVojr4wOl1iN5ScZ+YDm0lRarr71ecdw3eCK5bvN0FgG1vvP40xWnCYtJCbt\ntJCHe30sgL5BL81RQEqqCCcxggOXhwZRXoLIw9a1ssDr8QoRIJjWapbLYbdI\nkEQFlvaSbmiAHknmzmn3wj8H1/T+f+4rFEJd2A125ME9e++Ik1RXdq1irMP9\nyk7su1sGziU9OrLtPUWtrpVj4Dw5lq6HMytcXWvrT7/36zSr0bNlhfkSosxo\nmsi7CDKsDTehnsNDe7/hWhHm8UTP2Q2qKP+mOhrm42FiMoX6/o5tXzzxQzVS\nLyKIMTGjUez2UvSvRedO41f+Uy7qIEMt8mzGDzrXJQSYiRUl9PGMnZzmuXFw\nkbGj\r\n=QeeA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTGiNMAzmNPb14ARYaJr3rqeKzywZ3EBzGBCCDVVdB+QIhAJHZB8ZsAaZiNzR8y6aae9f/9scDhuLXqnbIZL5Pdyv/"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.12_1610317831551_0.6819917530383257"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.13":{"name":"react-three-fiber","private":false,"version":"5.3.13","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^0.2.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.13","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-oc12HxYc5FkU0INbD4NRqEUo7g0c/ETyCfF6sxUrnkHYVpx5DGv4VZqmudOtsOFD+XZ0nMtW94ffzwgcSqqrrQ==","shasum":"c28d8672693bd622de41146efceff3d584a5d6a2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.13.tgz","fileCount":38,"unpackedSize":700112,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgABURCRA9TVsSAnZWagAA5BkQAJC0PkZeWS3eD86NisLN\n+zyD6TGXsHKKKZYZVp61br1BmqytBZ8P8c3BPSEEIOhJKnYwUr3X3limMxbD\nj9V2kTaFH3zD0unH6Fxds+4nYQxEFQ2HlWipd3kBJzvky6mT1NJJXn4NgWHE\nVCIDOwafwRtxefe2ZAFoKbQ0xqdB2j60Ch0r5IuAFO/enFqFdzYuOfvBf3O/\ni+5cFgUArP4golJUcuASaBTA8WEM58dp1OF96vtxxdTNJCB4fMPPR2xjTX6U\nSbbhWN9j8x6PpH0oTNndhbKlc7sEPqUEFYIqPwSPNNDx+7Sfk4S3b7RwrkR9\nTcGGWwiecPHty3eieIRQj1UlPuTYd2PdI1/3L6mdRwYa7IEx4UMcmg/bx4zo\nMG5eCu29iCWkOxgnYWw43tPEhX9wMVJ5PgTQLcgWjyVMIef1wffgRmpe57dK\n9AqlE5BPENRWVCvoOPqXd5n7tLqGB8AhCtNwUOakQlQawU6kgJsV/0zpoRuH\nngc6pWGEnFM0tynHd09q79+XIZlpUoeTgfCJKo5QLRQjE+lzsxkUCNsqnAW1\nO4xU3gF5/a4bXjQFPdNmrVPzDrr/8fjD9qpg1Zf/pdw05xXLogEa5l5c3jSB\nKXphBp3lirMudzo9R5IFtWPZ66lk4UJhBu6d8vToLCsb36Brj2ecdDEjrdQV\nNdLH\r\n=TrW4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDoB0BuRx2p9eGVzhHdqbH5GbgxE7NEXb7iBCW7+WlMyAiBTw33w+xvn3+8RAcHYmCdJ6LDGQ1hCyGn1ICSVEdZROQ=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.13_1610618128689_0.5541282488991499"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.14":{"name":"react-three-fiber","private":false,"version":"5.3.14","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.14","_nodeVersion":"14.7.0","_npmVersion":"6.14.7","dist":{"integrity":"sha512-UKixyQZ0w17b8zoJttVcTLe62HBmXQUPtrzR4AH+3Kn9oKqOTwx2Ps88lldgHz8+gEvYZFG2tS/nGDSTBJGufw==","shasum":"6aa2e424bad5864f8963887052e54aba33f32f45","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.14.tgz","fileCount":38,"unpackedSize":700092,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgAvJJCRA9TVsSAnZWagAA58QP/1MFalOLebRx7K9S4nl+\nWVj/ii4mD39ec0gkJrfxIdZdYTkmasSQmnZmMCd+R5Qb8h0Cn2eHTro04KiC\nwim/Bwo3H7onvma7MdMdus8+WoJprUAtNVWUZHt8nhsaFUq1IU+Vrw8IK2Wk\nI6O7c4oH3p7khBgxFdXpoLLdlgj9RRA/oSDPRpp1VjasA6vXRyLpfWMHE33m\nywyf0aIKmkPM5CP/910NgBOnnUZHzDXJ3gq0v9zkfmW+4LsGEJPjsLxtZxmY\ng6oAUFd1Wh/XpTaLLrZ1uNUO0G3UZ4RqjCA1LoxR368wvJhK1nbGpMEW8WMk\nQLKVMDd76SSru9h1R6Vv7lS/nqDttELpIdhEl8OnZ71+lhwrx7rgN+cq1rqp\nrX5JmVeJ5vGGjn1BUOqpCEnpaHJy2Af6A9VnJ4CL6XKQdO2CiuHBQb8SpuB7\n8QC6XNIY/zLXbTVPNvEB7E2oPa+icydq7KAwgzdfd7ypR5BwUt6/mDEsZuY2\nhwmK+uxYmZDGHVnza6nZd2/rvuZCWqghwTh7/lReGSBTs0rBnmDpbOgFMELU\nTVPS6eFnKUWlzjkKd+LFDpQktEog6nx7aDV1TY4JWo5efmVDjYPg4QPqKXlK\nfPkgfa3U0RcGFptnrErTZlqWuwxloKMQ41StQoxCYpmecGB5FaaQuEaMUDrK\n4bdo\r\n=mwNe\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBWmH5c5QtB4caVuly6mR2+vEymR871xmzbvqU8smuCiAiEAzb2MxFQTE8LnWVNWTdGpFEpi9pvLzKplN0wiU9oTPaY="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.14_1610805833301_0.5502747132323718"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.15":{"name":"react-three-fiber","private":false,"version":"5.3.15","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.0","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.15","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-sl6IjmrXmMeN6ogu0Zo8KvxeOdSD+FpZMZ7I1RwdoE3nTDX4auSJfgrUzRQVUYIWzKzMqidS2LpE44KORurcWg==","shasum":"d34c7246619bbd9a9f1326dc4f14f86460357a7e","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.15.tgz","fileCount":38,"unpackedSize":701674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgDBk3CRA9TVsSAnZWagAAKlAP/1IYHROUkf3asdOXfPvx\ngNce6ElEq9tjJDqTTKGwX2raczG/UtkX/UC3TdcXatqmeRlovA9D7cS8X2xL\nSx5+RUitccHFxEH1/E0BkwHLeBj6E4PD8wVM+wW+gAZKrqIC/jtdb7VbHgNf\nP0fy+6/4bFPSXI8EE/NfYSx+kat+csDHoFBSqC9wpnM17THzWYk7plkW/h0m\n17J7yRNhrmjD7vdVd6iY669mXD2KXkbQpqcXlZ/IxvtUaIe4nuJSS174B1fa\n9CPr74uAhasDsvicYdAZMYjS7lJSFP6BaVT/H+n8t4GfCh/gT7pb82uTe5eK\nFp3gBUsEFNKp73ZrIIptaTfi9DlOHuhr0zoFIeB+mF8RTzvf/EC8RDC2hUNY\nvIllM9YZg8HFM7sYkMaxkkFLZOkDIuvMyErlIQAQ6ZebqjqjrRry33DAVKO7\nEWL8iKGUzIhPl+5T2si2krR8ZutIyg6UTQMHJXsxW4xb6ubc3KFZwEJE3b0l\n5xLRDfQgSKvQSwZAM00Bci2da3vNa5qiU9XSaJyYM5iERfN6DzpfSZ+6TxIs\nz0B1z+VK4p8MOCFZPId4ByzV6s9ekktcIwEmfUkyVQ+vVYPriCcc8ijWupTR\nhflwFtDdwAgrmGGeekQuCDt/W1Q7Ey1uGg/PtXvOpGXy60Q4t96s5zGuGTSZ\n6HlR\r\n=n00g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBvOKyxgJHOEnT0NF4brrWih+x5IPRmbqGlKDzsd0Yd8AiEAsb9CySaFieDmB83BZW+kIZ29Ur4r5I87SYG78NSdYCM="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.15_1611405622816_0.12677386092288545"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.16":{"name":"react-three-fiber","private":false,"version":"5.3.16","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.1","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.16","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-ip4/w0dMkoxDF1Mg/TFnf5KdoRHhqNvleTm/YcmDhwphzFIhx7OlztcCiGdUpeeVsAZ0cACq/ZCZMwOpWVtpaQ==","shasum":"4fbb841694c354dcbf6b94086031a0d017bf6352","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.16.tgz","fileCount":38,"unpackedSize":701674,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgDDhqCRA9TVsSAnZWagAAyDYP/Ahn3c72ORqiNKuDYFHb\nECtbBjDtDd+6hdDoJw76AyNYlJmcO+TV5q/wA9nhxoIYhphF7tQeHzCF8TMC\nx0dPnixRoV1UVvmLNYmmpEPgYFCaoNzl6NLjpDxnL7jfqjtZFu+Z7Swm1rrh\nESZ8u8n8eeU+g+XnC4fwIcVdwRBMri4GPHs2x6NuwN5NxI9LErYAdm5jC7RU\nelRvM9YQtUaBr7AYmj0o8N4mYrsJh2bP35ZIKxRclrLmGDr7j6w50vUEP6p3\nB52M/HKR/PSitJxOoEC88mntDt+3R6X705A20NEEuBVMGTwcJcedAh23tW/R\ndwNfNwjGyzBM7TxWufUEnh/HBvhhknOtOVR/gB0iyy19ugjBAEn7FOR5mpWy\nRIn1uaAi8BFZ6pYFmYcaghvwMBQFXD8PlSwE0xpz4sOVqc+SMadumIAbWd5w\n7vgvbNIwdKkfvpHlDp7AuA0U+aVBwjvXvk2bIwOxWnMWXYJo/VirjRI2O/Gn\nbPLY8Xz03O8mloioRRBZNkCz0gvROu2qVfA8OP4p8WmFfodlpms/9duPRdFB\nT8m/EyfZ/foeYI5H3LP8pPmFZRFacUBepYztkHTnyq1U6Z4doENoe1dGlNSx\nYAkOTs4FKRzKUwNz7kNylJaE/zscA/j53loBaTq2Q94c+8LKXzOTwqLIzahj\nzRmM\r\n=76F2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBO5oD6zU114Eqc0temA/JwcQpyl82EpCxQ+qXqRVwQrAiEAkJRD0CkQxezj7S6bunJ25OfhszLDWmShTOv+M6NsgOk="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.16_1611413610083_0.9368354013808184"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.17":{"name":"react-three-fiber","private":false,"version":"5.3.17","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.17","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-OwGw4scfcJz0/vYjR42MwTIKarAQlnmDJICKPwcIOzh3Rl1I/1sx7ZSKAzeQGt6+CpigNlGFsgU0Gn5mPltLyw==","shasum":"7a3a61db27ebeb59d8dae70fd1505de2d7ff0097","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.17.tgz","fileCount":38,"unpackedSize":702804,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgDXZrCRA9TVsSAnZWagAAv/MP/RjuQi4oB0rb4lw1eHxn\nkgcFhYR+vnVct5EoP6n/Jztt1DTwViBOUPAUsKim8ba90uV0IIwOSeawqMin\nM8T8qYU1SlPbMMVX4loWp6EPoPB9XySrUKUh+5D6p75aQx10nigYfXm/Clwp\nKrikSA/LlI+rD1/lnPLnZYFs9sNhzxOTeJVVaWuzdgnz1luF2uIvOhIGo8Go\ntXt/ct8Rc56354jVoFSSgG80xh1UmFVHrzTmJ3OQyXAf+QS5Bt+vsN6W04FC\nrVVQTHJGnFw1LmGG8wtURehZ0Uzzi5XdyP+CPj+tvTShD8I9xhmw/1BkZCgX\npht53JU7Q3JNW6aQ+NBA0tZiLObVFOZosFWOkGpz/qz/2/BJz6qLEEmCK6bP\nOxUrNl0lyN0mJ9Ktobbn1Ev4acf7KKWV46NJoVxORY6CkuZ8X5k5X5XrR6YT\nZvv7AKXKNlqAACN4agLQD4tQZa/6cpoWv3HC0gsrrXv3+atN+PffIXFsT1dK\na4SsqNiYwwhCaNgVHRynht2Ojoyd9FqtWF1fCo2KTH3zATKsbP90+b1aAhMd\n5ZIbzGMplT9TM210G47HBiKIgurZRygQ5jFtPgP/9ArhAA/rImcKNAov/XuU\nCZOlH7NRhYhQiYZsOKvAY1YI3gKW3qzdTrHSPy22X2ib83lacUc29uhpbsvU\nC2Vw\r\n=X4cQ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF/pchItZELQkjZVGsnnGr6Bqiu4CAPPhS3Z8LlReo/yAiEAmmCA3YV4OX6lXNB1iG2m/VGgYaNUIvG9as3GDdu7pyM="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.17_1611495018422_0.33443299799623816"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.18":{"name":"react-three-fiber","private":false,"version":"5.3.18","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.18","_nodeVersion":"15.6.0","_npmVersion":"7.4.0","dist":{"integrity":"sha512-5OHh2/Dq/V+5CeFSthVFADoN9S0Y7P5TMRtVg57eJSsJsL5BEO/rLhuS0xb7lHJn674jCdLnAAn3nMcsNU0HXA==","shasum":"50a37d344b631bc932ec0b22ddc8e678e5c9590b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.18.tgz","fileCount":38,"unpackedSize":704374,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgEAyzCRA9TVsSAnZWagAA/44P/0Xnr4oC/Zi11pF/sW6G\nma1FU7ftf6mrIwi3iqm/xIDoelBG838yHc9VIZeDan1g3gSx96PrEPM6oiDu\n//PArTfDwsc1XRTAqQOUs3QjijFgaH4FdoSe/zvHIEfj4Ro3Mqf1kYi09EyE\nEN24PPnAXoaU7Wwe2YdTjR6TayhsGBKRBKkoEAK+vpYyXYF0/aE1tTze9qbE\n37AYHyDhjB1/gt0n0SSx3rgARInScPdWfoAkkJzaqjeHx9Ak+0ATyb7U6A/I\nSJRI/QTzVKIK5I48XL31l76D+6XZeQkqv7vJwTW0RGhU9QWl2ydA2OnwLoSb\nu6UBKOGyrDSk9hisecf04paG/6pJBi+4Zp0NouvXcXmmLbHEfShlheztQdB/\n2f/xJWd8P5LHLJ4J/KbXD0CogP1UVVLO5BcGQ5cjUkVSRGiFnkDn6JYmWN5I\ngVaNvUFIPbLbMKYDmlScGo4lKGT8jv0qm9vvVvGi47UBGWDLTWjfX9Sd/sTu\nLfXzoPRev7zekd9+enobLeDQwzx/1tbEoqQ4sYOkoW/RTWl+C6R4iGd7BKuk\n0WozYAE7TsXPG58mUID8QAK2FJpsjHO6lNDnh3uyrF+j9QB3jbVAdbambvts\n02hxrWGe4lOXQApt2Y/ei9I8OWFnEbZTY2Iv2RtBJzVExLJRHdrpYqdu2zf1\nYKrz\r\n=7qjj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAC1wZP41KB10zCHlnjonHYgRswWZBiqKv74Xkdwg5KAIgSnaBhB/Sqf5z/XDf7xvP0/60gapuL5V1KKN0N6as6R0="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.18_1611664563341_0.3717726659579863"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.19":{"name":"react-three-fiber","private":false,"version":"5.3.19","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.19","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-UJyTTIsZ0qdSopejslLVclR2jNtHJamnTmPxoJ9vDWIws+5/E2JYOHQv6W9HrnBIH19caEB5rdKvphur/VUpiQ==","shasum":"aa74078dfd9e2739241a1e2e2957d015059fa9da","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.19.tgz","fileCount":38,"unpackedSize":704191,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgNZeTCRA9TVsSAnZWagAAeKAP/1nYlV1KyiV9ArpUPe4O\nMSfKp9ePaZsChdEbdZ5FCKDO7kkVWDMQdexKYnQJsFrde4uJzfKTU+g5vhbf\nCn+tYNTbgxW2Sj6JZP2wIz0lYqDChFx6L8BOOjcKjIklXtoFf9K2B3bvorWj\nixDeSsffhgAeuhtUX7D2IPmSgSIMrf27MJRfW28IOoelq1h8v2a7zenAAJTO\nebBq73PeSVpUNq822qTaxc5oJPB987GARcJJb6bnF7Ou7wSGRWagZJcAngXz\ns8B21klT7lEbDCBiXAqcJhpRVE9ssGwzEbFRvMWxOoD0L4ZA+O45DQ/p19Qs\nth9PMShP6CpJZRNPhXnhe2jQvSQvQAkUIhAN9QOm+9v7HiF4B14CyaheNGl4\nDxyF9EEkGoo++dueLs8X+0Id1g5eCUfaD7ifdtZuPTOopvGNbkUlfWuF3zmm\nVeUpwU98d1gBIgYtF/GSPw0R+o7o5ZiWoVXg9mN76oWz37scEbOV+ti6N5iB\ntiXWPcygvLbfecQ7BJbABe9m0eRrjw57z/glW556hbj34CXCFp6iFzFh2/Dv\nmxijbzSdOPnLkoG9ItRYJ/iguzK8sxduTMycSGDIPgpqDCI9Sks6ZfGoclNp\n+vZCJ7nUKTcExJ7nIw/3aml0rOeYYgPhCUeHw548+kJXd2sxUwDlnocRoE5J\n/WvY\r\n=npH2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIA8gX2p2xVGSSO50b0CDUIrskhAMMyzkdct3VYJ93ASuAiEA/hwh2xUlPiIVHoYE6GFpziJZ8loVsqSQpAMSXuNhIoY="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.19_1614124946940_0.6315326637171355"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"6.0.0-alpha.0":{"name":"react-three-fiber","version":"6.0.0-alpha.0","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/index.cjs.js","module":"dist/index.js","react-native":"dist/native.js","types":"dist/web/index.d.ts","sideEffects":false,"husky":{"hooks":{"pre-commit":"lint-staged"}},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix"]},"scripts":{"postinstall":"cd ./example && yarn","prebuild":"rimraf dist && npm run typegen","build":"rollup -c && rimraf dist/__tests__","prepare":"husky install","eslint":"eslint --fix src/**/*.{ts,tsx}","dev":"yarn --cwd ./examples start","test":"echo null","typecheck":"tsc --noEmit --emitDeclarationOnly false --strict --jsx react","typegen":"tsc && mv dist/src/* dist && rm -rf dist/src || true"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"devDependencies":{"@ampproject/rollup-plugin-closure-compiler":"^0.26.0","@babel/core":"7.13.8","@babel/helper-call-delegate":"^7.12.13","@babel/plugin-transform-modules-commonjs":"7.13.8","@babel/plugin-transform-parameters":"7.13.0","@babel/plugin-transform-runtime":"7.13.9","@babel/plugin-transform-template-literals":"7.13.0","@babel/preset-env":"7.13.9","@babel/preset-react":"7.12.13","@babel/preset-typescript":"^7.13.0","@rollup/plugin-commonjs":"^17.1.0","@rollup/plugin-inject":"^4.0.2","@rollup/plugin-strip":"^2.0.0","@types/jest":"^26.0.20","@types/lodash-es":"^4.17.4","@types/react":"^17.0.2","@types/react-dom":"^17.0.1","@types/react-native":"^0.63.50","@types/react-reconciler":"^0.26.0","@types/react-test-renderer":"^17.0.1","@types/scheduler":"^0.16.1","@types/three":"^0.126.0","@typescript-eslint/eslint-plugin":"^4.16.1","@typescript-eslint/parser":"^4.16.1","babel-eslint":"^10.1.0","babel-plugin-transform-react-remove-prop-types":"^0.4.24","copyfiles":"^2.4.1","cypress":"^6.6.0","eslint":"^7.21.0","eslint-config-prettier":"^8.1.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.22.1","eslint-plugin-jest":"^24.1.5","eslint-plugin-prettier":"^3.3.1","eslint-plugin-react":"^7.22.0","eslint-plugin-react-hooks":"^4.2.0","expo-gl":"^10.1.0","expo-three":"^5.6.2","husky":"^5.1.3","jest":"^26.6.3","jest-cli":"^26.6.3","jest-image-snapshot":"^4.4.0","jest-puppeteer":"^4.4.0","json":"^10.0.0","lint-staged":"^10.5.4","prettier":"^2.2.1","puppeteer":"^8.0.0","react":"^16.11.0","react-dom":"^16.11.0","react-native":"^0.63.4","react-test-renderer":"^17.0.1","rimraf":"^3.0.2","rollup":"^2.40.0","rollup-plugin-babel":"^4.4.0","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.12.0","rollup-plugin-terser":"^7.0.2","three":"^0.122.0","ts-jest":"^26.5.3","typescript":"^4.2.2","wait-on":"^5.2.1"},"readme":"<h1>react-three-fiber</h1>\n\n[![Version](https://img.shields.io/npm/v/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Downloads](https://img.shields.io/npm/dt/react-three-fiber.svg?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Twitter](https://img.shields.io/twitter/follow/pmndrs?label=%40pmndrs&style=flat&colorA=000000&colorB=000000&logo=twitter&logoColor=000000)](https://twitter.com/pmndrs)\n[![Discord](https://img.shields.io/discord/740090768164651008?style=flat&colorA=000000&colorB=000000&label=discord&logo=discord&logoColor=000000)](https://discord.gg/ZZjjNvJ)\n[![Open Collective](https://img.shields.io/opencollective/all/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://opencollective.com/react-three-fiber)\n[![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682)\n[![BTC](https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/btc/address/36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH)\n\nreact-three-fiber is a React <a href=\"https://reactjs.org/docs/codebase-overview.html#renderers\">renderer</a> for threejs on the web and react-native.\n\n```bash\nnpm install three react-three-fiber\n```\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just renders JSX to threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw threejs?\n\nNo. Rendering performance is up to threejs and the GPU. Components participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4?file=/src/App.js\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n<details>\n  <summary>Show TypeScript example</summary>\n\n```tsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, MeshProps, useFrame } from 'react-three-fiber'\nimport type { Mesh } from 'three'\n\nconst Box: React.FC<MeshProps> = (props) => {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef<Mesh>()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    if (mesh.current) mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n</details>\n\n---\n\n# API\n\n- [api.md](/markdown/api.md)\n- [pitfalls.md](/markdown/pitfalls.md)\n- [recipes.md](/markdown/recipes.md)\n\n# Fundamentals\n\nYou need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official [React docs](https://reactjs.org/docs/getting-started.html), especially [the section about hooks](https://reactjs.org/docs/hooks-reference.html). As for Threejs, make sure you at least glance over the following links:\n\n1. Make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). Keep that site open.\n2. When you know what a scene is, a camera, mesh, geometry, material, fork the [demo above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like).\n3. [Look up](https://threejs.org/docs/index.html#api/en/objects/Mesh) the JSX elements that you see (mesh, ambientLight, etc), _all_ threejs exports are native to three-fiber.\n4. Try changing some values, scroll though our [Api](/markdown/api.md) to see what the various settings and hooks do.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# Ecosystem\n\n- [`@react-three/gltfjsx`](https://github.com/react-spring/gltfjsx) &ndash; turns GLTFs into JSX components\n- [`@react-three/drei`](https://github.com/react-spring/drei) &ndash; useful helpers for react-three-fiber\n- [`@react-three/postprocessing`](https://github.com/react-spring/react-postprocessing) &ndash; post-processing effects\n- [`@react-three/flex`](https://github.com/react-spring/react-three-flex) &ndash; flexbox for react-three-fiber\n- [`@react-three/xr`](https://github.com/react-spring/react-xr) &ndash; VR/AR controllers and events\n- [`@react-three/cannon`](https://github.com/react-spring/use-cannon) &ndash; physics based hooks\n- [`zustand`](https://github.com/react-spring/zustand) &ndash; state management\n- [`react-spring`](https://github.com/react-spring/react-spring) &ndash; a spring-physics-based animation library\n- [`react-use-gesture`](https://github.com/react-spring/react-use-gesture) &ndash; mouse/touch gestures\n- [`react-three-gui`](https://github.com/ueno-llc/react-three-gui) &ndash; GUI/debug tools\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n","readmeFilename":"readme.md","gitHead":"126b0b90ff7042a812d8d6a2eb37c282b70383c0","_id":"react-three-fiber@6.0.0-alpha.0","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-4rXcNRxZtNALR0xwAKf9rODJXnIl9eGWYS2gmTetoADw6jgIGsrZv+XupUu0QHPwnb50zeYgLCf6XQA9pGPQWQ==","shasum":"fb70fb9d2f9a265f4b1110b471d1238e24a3e9e9","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.0.tgz","fileCount":3379,"unpackedSize":107480957,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQ2dgCRA9TVsSAnZWagAAv6MP/1V8WEhT5vxjKap6a5uX\nIRpQEwn8tkEdiCfEYp8eOMfEXGYHa+KJrYbqKYJphXQzjdFTF4Vqmcy4/0bo\nEA3t1IyMGe5pAc72B6HL9TXyXSvYaecYb9wgY2VyyCRHUgyYCIrmqPR6yCkR\n8MBoLlZ+Mh6sWsk+ML9Vh6pBj+kKt0Aq1m2XictuurMsYFXKdmQWcgVrfUnW\nZurs/Vcy3UPkuYJr73XSQ7wNx5HayZ8UPLWB45sIR5s0Q6uUj/R17fcPAGQY\nmjgVOb5djuWSnadIlWo/42ELl58+HOnLll8dkvZ4t/uwKd9TmMNDJdJ/ogwt\nyahYqPf9r7h8hEMrB7iehvMJOyLIWOTERWaZC8PzAXj2CSStzM9wwRiV/b/R\nNbpA9t7xJTIcU1Mwd9CJ8eav2uR68Z2pT+49hUnKRcN75YTvfITcoRxzgztM\nd4x6RqAuUqaDxngvXkgJhD5i3pnL9Ln3W1WbRdc6xjKm4m6fFOUrpZ450YRj\nknHSNmja6YjMwPr1SPWdFLwM2r/JIMDgl/PCDMEi3QqUy6Nd5GQFqVUuAz31\nJMbHasiJGNKZQBuHwl3Md9ktBP1f8aKr1OQdsTkqE1Iz0JCtzlYstO2mlvpd\nRxhgIuXPC8xEtARIHA5Vikrq1wZjn76blAriSbkaE/Ui++Y6TfawL7hUWoD2\n/GRU\r\n=b22z\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIATWHiiyyT9G/+2ZDUGjEovHv/aRmpdTEXXVNGU+9fNFAiEA+pW06g5a1jrqvdQCCSRv7oZ6WEW4/9mjZ8J0Ehe+t1U="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.0_1615030111199_0.9461858244522099"},"_hasShrinkwrap":false},"6.0.0-alpha.1":{"name":"react-three-fiber","version":"6.0.0-alpha.1","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/index.cjs.js","module":"dist/index.js","react-native":"dist/native.js","types":"dist/web/index.d.ts","sideEffects":false,"husky":{"hooks":{"pre-commit":"lint-staged"}},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix"]},"scripts":{"postinstall":"cd ./example && yarn","prebuild":"rimraf dist && npm run typegen","build":"rollup -c && rimraf dist/__tests__","prepare":"husky install","eslint":"eslint --fix src/**/*.{ts,tsx}","dev":"yarn --cwd ./examples start","test":"echo null","typecheck":"tsc --noEmit --emitDeclarationOnly false --strict --jsx react","typegen":"tsc && mv dist/src/* dist && rm -rf dist/src || true"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"devDependencies":{"@ampproject/rollup-plugin-closure-compiler":"^0.26.0","@babel/core":"7.13.8","@babel/helper-call-delegate":"^7.12.13","@babel/plugin-transform-modules-commonjs":"7.13.8","@babel/plugin-transform-parameters":"7.13.0","@babel/plugin-transform-runtime":"7.13.9","@babel/plugin-transform-template-literals":"7.13.0","@babel/preset-env":"7.13.9","@babel/preset-react":"7.12.13","@babel/preset-typescript":"^7.13.0","@rollup/plugin-commonjs":"^17.1.0","@rollup/plugin-inject":"^4.0.2","@rollup/plugin-strip":"^2.0.0","@types/jest":"^26.0.20","@types/lodash-es":"^4.17.4","@types/react":"^17.0.2","@types/react-dom":"^17.0.1","@types/react-native":"^0.63.50","@types/react-reconciler":"^0.26.0","@types/react-test-renderer":"^17.0.1","@types/scheduler":"^0.16.1","@types/three":"^0.126.0","@typescript-eslint/eslint-plugin":"^4.16.1","@typescript-eslint/parser":"^4.16.1","babel-eslint":"^10.1.0","babel-plugin-transform-react-remove-prop-types":"^0.4.24","copyfiles":"^2.4.1","cypress":"^6.6.0","eslint":"^7.21.0","eslint-config-prettier":"^8.1.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.22.1","eslint-plugin-jest":"^24.1.5","eslint-plugin-prettier":"^3.3.1","eslint-plugin-react":"^7.22.0","eslint-plugin-react-hooks":"^4.2.0","expo-gl":"^10.1.0","expo-three":"^5.6.2","husky":"^5.1.3","jest":"^26.6.3","jest-cli":"^26.6.3","jest-image-snapshot":"^4.4.0","jest-puppeteer":"^4.4.0","json":"^10.0.0","lint-staged":"^10.5.4","prettier":"^2.2.1","puppeteer":"^8.0.0","react":"^16.11.0","react-dom":"^16.11.0","react-native":"^0.63.4","react-test-renderer":"^17.0.1","rimraf":"^3.0.2","rollup":"^2.40.0","rollup-plugin-babel":"^4.4.0","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.12.0","rollup-plugin-terser":"^7.0.2","three":"^0.122.0","ts-jest":"^26.5.3","typescript":"^4.2.2","wait-on":"^5.2.1"},"readme":"<h1>react-three-fiber</h1>\n\n[![Version](https://img.shields.io/npm/v/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Downloads](https://img.shields.io/npm/dt/react-three-fiber.svg?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Twitter](https://img.shields.io/twitter/follow/pmndrs?label=%40pmndrs&style=flat&colorA=000000&colorB=000000&logo=twitter&logoColor=000000)](https://twitter.com/pmndrs)\n[![Discord](https://img.shields.io/discord/740090768164651008?style=flat&colorA=000000&colorB=000000&label=discord&logo=discord&logoColor=000000)](https://discord.gg/ZZjjNvJ)\n[![Open Collective](https://img.shields.io/opencollective/all/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://opencollective.com/react-three-fiber)\n[![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682)\n[![BTC](https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/btc/address/36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH)\n\nreact-three-fiber is a React <a href=\"https://reactjs.org/docs/codebase-overview.html#renderers\">renderer</a> for threejs on the web and react-native.\n\n```bash\nnpm install three react-three-fiber\n```\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just renders JSX to threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw threejs?\n\nNo. Rendering performance is up to threejs and the GPU. Components participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4?file=/src/App.js\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n<details>\n  <summary>Show TypeScript example</summary>\n\n```tsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, MeshProps, useFrame } from 'react-three-fiber'\nimport type { Mesh } from 'three'\n\nconst Box: React.FC<MeshProps> = (props) => {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef<Mesh>()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    if (mesh.current) mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n</details>\n\n---\n\n# API\n\n- [api.md](/markdown/api.md)\n- [pitfalls.md](/markdown/pitfalls.md)\n- [recipes.md](/markdown/recipes.md)\n\n# Fundamentals\n\nYou need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official [React docs](https://reactjs.org/docs/getting-started.html), especially [the section about hooks](https://reactjs.org/docs/hooks-reference.html). As for Threejs, make sure you at least glance over the following links:\n\n1. Make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). Keep that site open.\n2. When you know what a scene is, a camera, mesh, geometry, material, fork the [demo above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like).\n3. [Look up](https://threejs.org/docs/index.html#api/en/objects/Mesh) the JSX elements that you see (mesh, ambientLight, etc), _all_ threejs exports are native to three-fiber.\n4. Try changing some values, scroll though our [Api](/markdown/api.md) to see what the various settings and hooks do.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# Ecosystem\n\n- [`@react-three/gltfjsx`](https://github.com/react-spring/gltfjsx) &ndash; turns GLTFs into JSX components\n- [`@react-three/drei`](https://github.com/react-spring/drei) &ndash; useful helpers for react-three-fiber\n- [`@react-three/postprocessing`](https://github.com/react-spring/react-postprocessing) &ndash; post-processing effects\n- [`@react-three/flex`](https://github.com/react-spring/react-three-flex) &ndash; flexbox for react-three-fiber\n- [`@react-three/xr`](https://github.com/react-spring/react-xr) &ndash; VR/AR controllers and events\n- [`@react-three/cannon`](https://github.com/react-spring/use-cannon) &ndash; physics based hooks\n- [`zustand`](https://github.com/react-spring/zustand) &ndash; state management\n- [`react-spring`](https://github.com/react-spring/react-spring) &ndash; a spring-physics-based animation library\n- [`react-use-gesture`](https://github.com/react-spring/react-use-gesture) &ndash; mouse/touch gestures\n- [`react-three-gui`](https://github.com/ueno-llc/react-three-gui) &ndash; GUI/debug tools\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n","readmeFilename":"readme.md","gitHead":"126b0b90ff7042a812d8d6a2eb37c282b70383c0","_id":"react-three-fiber@6.0.0-alpha.1","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-xVonfhYGHWd5Mp6k39uqISwwTN6CqJ3mOSlwTclQPoLmPhAl+uHDDzT8+TtfrJ1qkJXkdf7RlfM3tTaFROSgzg==","shasum":"82d7d7adf1db6dbdb3e4895ab75cc776ac050130","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.1.tgz","fileCount":3379,"unpackedSize":107541447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQ2olCRA9TVsSAnZWagAAEqYP/1OyelgM+T01lP4hbNol\n1zpl1mDKZRaGFAk9OoxoZIsPpMuYkYT058Rp4IO9UCCMh+0D01uTTMt7TlXt\nmHvuuFeohvfPTuotRBN6LpCa7GIXlHayVd9WUvZQr2woARVNU366VgDnleBR\nwqrbzPJR4D4PmauUFcUQB8/i2z/S+usKLr55tY2OuVYQpCardSIGFh1COjgT\nty3mi3pi4e/S1+b1APrOhuD3vWegGytS9tmcNo9jp2RSZInPpvqc0SEYGVBQ\nseNm77rCso2jJeP08k3YjFkP2JIeleyU7acnpF6srhIk+sASrxHWQmX/tFMJ\nO5ExhuXaL2Igds3un8VXDwVQHFMVD02nLH6Ffkp5QZugYfwHM7KL6wrxFCxe\nYdb/X6oMlZAWp6rBjh/LGeAuCffzP6+bkT/6KDLkTl5AF5/ES36IWhdqQpYY\ntzDLfZntJ2wu8XEqt82nHYIM3ltT+TuaQJmnC1a4Ovwugn2sy87kztplSi7g\nk6C4XwV+WRkAt2dcZ7FHZmgTuaBjX6vJ3UrIlF6YsizprAjMQhnjykwyTlNs\nEZQTJtF/xe0nJPWOh9qYeaDjt5UFiAKE4M8gFWz8k9D9ad/DwsK+DgniMQSt\nHIJLpStKu95ur9+40esnYJ96fmQWLEKkwWgMZt40FRFJRN7v52TQs7GNIXI9\nu4X6\r\n=YQ1+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD9YBMH2kvuEx/mPYEdJp5dKgJVWj/BIb+F9ugE4tWs8gIhAKFbM3bUnH0umJ9J+JKvV7xsnb4Wz3cYqEDrxLY5xcRn"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.1_1615030820504_0.8419510455971755"},"_hasShrinkwrap":false},"6.0.0-alpha.2":{"name":"react-three-fiber","version":"6.0.0-alpha.2","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/index.cjs.js","module":"dist/index.js","react-native":"dist/native.js","types":"dist/web/index.d.ts","sideEffects":false,"husky":{"hooks":{"pre-commit":"lint-staged"}},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix"]},"scripts":{"postinstall":"cd ./example && yarn","prebuild":"rimraf dist && npm run typegen","build":"rollup -c && rimraf dist/__tests__","prepare":"husky install","eslint":"eslint --fix src/**/*.{ts,tsx}","dev":"yarn --cwd ./examples start","test":"echo null","typecheck":"tsc --noEmit --emitDeclarationOnly false --strict --jsx react","typegen":"tsc && mv dist/src/* dist && rm -rf dist/src || true"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"devDependencies":{"@ampproject/rollup-plugin-closure-compiler":"^0.26.0","@babel/core":"7.13.8","@babel/helper-call-delegate":"^7.12.13","@babel/plugin-transform-modules-commonjs":"7.13.8","@babel/plugin-transform-parameters":"7.13.0","@babel/plugin-transform-runtime":"7.13.9","@babel/plugin-transform-template-literals":"7.13.0","@babel/preset-env":"7.13.9","@babel/preset-react":"7.12.13","@babel/preset-typescript":"^7.13.0","@rollup/plugin-commonjs":"^17.1.0","@rollup/plugin-inject":"^4.0.2","@rollup/plugin-strip":"^2.0.0","@types/jest":"^26.0.20","@types/lodash-es":"^4.17.4","@types/react":"^17.0.2","@types/react-dom":"^17.0.1","@types/react-native":"^0.63.50","@types/react-reconciler":"^0.26.0","@types/react-test-renderer":"^17.0.1","@types/scheduler":"^0.16.1","@types/three":"^0.126.0","@typescript-eslint/eslint-plugin":"^4.16.1","@typescript-eslint/parser":"^4.16.1","babel-eslint":"^10.1.0","babel-plugin-transform-react-remove-prop-types":"^0.4.24","copyfiles":"^2.4.1","cypress":"^6.6.0","eslint":"^7.21.0","eslint-config-prettier":"^8.1.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.22.1","eslint-plugin-jest":"^24.1.5","eslint-plugin-prettier":"^3.3.1","eslint-plugin-react":"^7.22.0","eslint-plugin-react-hooks":"^4.2.0","expo-gl":"^10.1.0","expo-three":"^5.6.2","husky":"^5.1.3","jest":"^26.6.3","jest-cli":"^26.6.3","jest-image-snapshot":"^4.4.0","jest-puppeteer":"^4.4.0","json":"^10.0.0","lint-staged":"^10.5.4","prettier":"^2.2.1","puppeteer":"^8.0.0","react":"^16.11.0","react-dom":"^16.11.0","react-native":"^0.63.4","react-test-renderer":"^17.0.1","rimraf":"^3.0.2","rollup":"^2.40.0","rollup-plugin-babel":"^4.4.0","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.12.0","rollup-plugin-terser":"^7.0.2","three":"^0.122.0","ts-jest":"^26.5.3","typescript":"^4.2.2","wait-on":"^5.2.1"},"readme":"<h1>react-three-fiber</h1>\n\n[![Version](https://img.shields.io/npm/v/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Downloads](https://img.shields.io/npm/dt/react-three-fiber.svg?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Twitter](https://img.shields.io/twitter/follow/pmndrs?label=%40pmndrs&style=flat&colorA=000000&colorB=000000&logo=twitter&logoColor=000000)](https://twitter.com/pmndrs)\n[![Discord](https://img.shields.io/discord/740090768164651008?style=flat&colorA=000000&colorB=000000&label=discord&logo=discord&logoColor=000000)](https://discord.gg/ZZjjNvJ)\n[![Open Collective](https://img.shields.io/opencollective/all/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://opencollective.com/react-three-fiber)\n[![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682)\n[![BTC](https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/btc/address/36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH)\n\nreact-three-fiber is a React <a href=\"https://reactjs.org/docs/codebase-overview.html#renderers\">renderer</a> for threejs on the web and react-native.\n\n```bash\nnpm install three react-three-fiber\n```\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just renders JSX to threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw threejs?\n\nNo. Rendering performance is up to threejs and the GPU. Components participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4?file=/src/App.js\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n<details>\n  <summary>Show TypeScript example</summary>\n\n```tsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, MeshProps, useFrame } from 'react-three-fiber'\nimport type { Mesh } from 'three'\n\nconst Box: React.FC<MeshProps> = (props) => {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef<Mesh>()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    if (mesh.current) mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n</details>\n\n---\n\n# API\n\n- [api.md](/markdown/api.md)\n- [pitfalls.md](/markdown/pitfalls.md)\n- [recipes.md](/markdown/recipes.md)\n\n# Fundamentals\n\nYou need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official [React docs](https://reactjs.org/docs/getting-started.html), especially [the section about hooks](https://reactjs.org/docs/hooks-reference.html). As for Threejs, make sure you at least glance over the following links:\n\n1. Make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). Keep that site open.\n2. When you know what a scene is, a camera, mesh, geometry, material, fork the [demo above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like).\n3. [Look up](https://threejs.org/docs/index.html#api/en/objects/Mesh) the JSX elements that you see (mesh, ambientLight, etc), _all_ threejs exports are native to three-fiber.\n4. Try changing some values, scroll though our [Api](/markdown/api.md) to see what the various settings and hooks do.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# Ecosystem\n\n- [`@react-three/gltfjsx`](https://github.com/react-spring/gltfjsx) &ndash; turns GLTFs into JSX components\n- [`@react-three/drei`](https://github.com/react-spring/drei) &ndash; useful helpers for react-three-fiber\n- [`@react-three/postprocessing`](https://github.com/react-spring/react-postprocessing) &ndash; post-processing effects\n- [`@react-three/flex`](https://github.com/react-spring/react-three-flex) &ndash; flexbox for react-three-fiber\n- [`@react-three/xr`](https://github.com/react-spring/react-xr) &ndash; VR/AR controllers and events\n- [`@react-three/cannon`](https://github.com/react-spring/use-cannon) &ndash; physics based hooks\n- [`zustand`](https://github.com/react-spring/zustand) &ndash; state management\n- [`react-spring`](https://github.com/react-spring/react-spring) &ndash; a spring-physics-based animation library\n- [`react-use-gesture`](https://github.com/react-spring/react-use-gesture) &ndash; mouse/touch gestures\n- [`react-three-gui`](https://github.com/ueno-llc/react-three-gui) &ndash; GUI/debug tools\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n","readmeFilename":"readme.md","gitHead":"126b0b90ff7042a812d8d6a2eb37c282b70383c0","_id":"react-three-fiber@6.0.0-alpha.2","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-MSLv+OXLCvQ/gLu9/NeEs80rgEgimJ0QHngLCXXWBUz0jwcUZsXzabMdfPw9PDfCBOlTZXVptDrBkNoeT9Hbpw==","shasum":"0e732c72692879df33bc2a78f79db05f80c83bfd","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.2.tgz","fileCount":24,"unpackedSize":155975,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQ25ZCRA9TVsSAnZWagAAzzoQAKHk7I77mqCnyhXjSzNE\n34+Iq3mLU29UE6NlVhKhrwgzhtzTIMaaCxzDArq+khrLGYYR5QmACqAhAxbS\n//Py0FZtMPC0klfZwaw3WYqpF9wGbTAs9Xu4ZS8Hq0mZnKL8FBxdJwWaNU+s\nJoh0O0aBDuI8cqCq3UUQhNdLzxXhF6WWXJrlGsDPxHKur+AQglRuBXtH/Coe\n4Ghq6wCj1WBQjbbZ5WNJuFSMGCWpuGDBim4PDRx1AA4ZntBIVy1OJnvkog1N\nNi+eZS8MBq8f4pa8zN8ssClVsPVBR9ZW1uhgVPvTthtT04uXKZuthevi1qCE\nKr3/5CayKW/CuxHJ1nRSSAkD1o3oDHaOumZq7EYECNh1jun1ByZfkItinXyO\n1j4ATt7vilo84IF2ekcEuySY16TrxRtW1vZp6GTSw46ol4W/KC6VXXo11/6D\nNYWp1q1twUzxxXbOwZC5ndhTDvzkkTQA/59OudGoSJ/YTY1ebH57IWkg99wo\nHbE3xC96nF/Nnvz0a+j6IgiEG0T8BrWxn0DIO3e0hwR2FlVpfeLXowY+vyg5\nvaZlKQOSYDFOp0kyqeIGRswuc1X6vzhIF0gRxbbnnpOJacbH+JbskIoR14mw\n9DMsz8qiekyucbwFKx8AZ7Dq2pSWQjh+RbLyu8P2PBTwAidLZ/rkzpdv4Jxb\ntPzT\r\n=mpd6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFoWux82/VkVEAwks+Iat4zF7o3JSjmf4RJfzM9anFs5AiEAqp2L4URcIPwlReU2PNjW10KNv0u9/GBO1/otwEe6T5I="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.2_1615031897311_0.5937552352032056"},"_hasShrinkwrap":false},"6.0.0-alpha.3":{"name":"react-three-fiber","version":"6.0.0-alpha.3","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/index.cjs.js","module":"dist/index.js","react-native":"dist/native.js","types":"dist/web/index.d.ts","sideEffects":false,"husky":{"hooks":{"pre-commit":"lint-staged"}},"lint-staged":{"*.{js,jsx,ts,tsx}":["eslint --fix"]},"scripts":{"prebuild":"rimraf dist && npm run typegen","build":"rollup -c && rimraf dist/__tests__","prepare":"husky install","eslint":"eslint --fix src/**/*.{ts,tsx}","dev":"yarn --cwd ./examples start","test":"echo null","typecheck":"tsc --noEmit --emitDeclarationOnly false --strict --jsx react","typegen":"tsc && mv dist/src/* dist && rm -rf dist/src || true"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"devDependencies":{"@ampproject/rollup-plugin-closure-compiler":"^0.26.0","@babel/core":"7.13.8","@babel/helper-call-delegate":"^7.12.13","@babel/plugin-transform-modules-commonjs":"7.13.8","@babel/plugin-transform-parameters":"7.13.0","@babel/plugin-transform-runtime":"7.13.9","@babel/plugin-transform-template-literals":"7.13.0","@babel/preset-env":"7.13.9","@babel/preset-react":"7.12.13","@babel/preset-typescript":"^7.13.0","@rollup/plugin-commonjs":"^17.1.0","@rollup/plugin-inject":"^4.0.2","@rollup/plugin-strip":"^2.0.0","@types/jest":"^26.0.20","@types/lodash-es":"^4.17.4","@types/react":"^17.0.2","@types/react-dom":"^17.0.1","@types/react-native":"^0.63.50","@types/react-reconciler":"^0.26.0","@types/react-test-renderer":"^17.0.1","@types/scheduler":"^0.16.1","@types/three":"^0.126.0","@typescript-eslint/eslint-plugin":"^4.16.1","@typescript-eslint/parser":"^4.16.1","babel-eslint":"^10.1.0","babel-plugin-transform-react-remove-prop-types":"^0.4.24","copyfiles":"^2.4.1","cypress":"^6.6.0","eslint":"^7.21.0","eslint-config-prettier":"^8.1.0","eslint-import-resolver-alias":"^1.1.2","eslint-plugin-import":"^2.22.1","eslint-plugin-jest":"^24.1.5","eslint-plugin-prettier":"^3.3.1","eslint-plugin-react":"^7.22.0","eslint-plugin-react-hooks":"^4.2.0","expo-gl":"^10.1.0","expo-three":"^5.6.2","husky":"^5.1.3","jest":"^26.6.3","jest-cli":"^26.6.3","jest-image-snapshot":"^4.4.0","jest-puppeteer":"^4.4.0","json":"^10.0.0","lint-staged":"^10.5.4","prettier":"^2.2.1","puppeteer":"^8.0.0","react":"^16.11.0","react-dom":"^16.11.0","react-native":"^0.63.4","react-test-renderer":"^17.0.1","rimraf":"^3.0.2","rollup":"^2.40.0","rollup-plugin-babel":"^4.4.0","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-json":"^4.0.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-size-snapshot":"^0.12.0","rollup-plugin-terser":"^7.0.2","three":"^0.122.0","ts-jest":"^26.5.3","typescript":"^4.2.2","wait-on":"^5.2.1"},"readme":"<h1>react-three-fiber</h1>\n\n[![Version](https://img.shields.io/npm/v/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Downloads](https://img.shields.io/npm/dt/react-three-fiber.svg?style=flat&colorA=000000&colorB=000000)](https://npmjs.com/package/react-three-fiber)\n[![Twitter](https://img.shields.io/twitter/follow/pmndrs?label=%40pmndrs&style=flat&colorA=000000&colorB=000000&logo=twitter&logoColor=000000)](https://twitter.com/pmndrs)\n[![Discord](https://img.shields.io/discord/740090768164651008?style=flat&colorA=000000&colorB=000000&label=discord&logo=discord&logoColor=000000)](https://discord.gg/ZZjjNvJ)\n[![Open Collective](https://img.shields.io/opencollective/all/react-three-fiber?style=flat&colorA=000000&colorB=000000)](https://opencollective.com/react-three-fiber)\n[![ETH](https://img.shields.io/badge/ETH-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/eth/address/0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682)\n[![BTC](https://img.shields.io/badge/BTC-f5f5f5?style=flat&colorA=000000&colorB=000000)](https://blockchain.com/btc/address/36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH)\n\nreact-three-fiber is a React <a href=\"https://reactjs.org/docs/codebase-overview.html#renderers\">renderer</a> for threejs on the web and react-native.\n\n```bash\nnpm install three react-three-fiber\n```\n\n<p align=\"center\">\n  <a href=\"https://codesandbox.io/embed/r3f-game-i2160\"><img width=\"274\" src=\"https://i.imgur.com/VydCh6W.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gamma-correction-kmb9i\"><img width=\"274\" src=\"https://i.imgur.com/e6NhRz6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-montage-jz9l97qn89\"><img width=\"274\" src=\"https://i.imgur.com/nxRStP8.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-sparks-sbf2i\"><img width=\"274\" src=\"https://i.imgur.com/Fk44Tu6.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-instanced-colors-8fo01\"><img width=\"274\" src=\"https://i.imgur.com/daJIDVE.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-moksha-f1ixt\"><img width=\"274\" src=\"https://i.imgur.com/ltznOJ1.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-bones-3i7iu\"><img width=\"274\" src=\"https://i.imgur.com/OZdSyQy.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-floating-diamonds-prb9t\"><img width=\"274\" src=\"https://i.imgur.com/WWDbcWG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-volumetric-light-w633u\"><img width=\"274\" src=\"https://i.imgur.com/7E3XKSG.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-ii-pjcc1\"><img width=\"274\" src=\"https://i.imgur.com/QG14IAC.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-gltf-fonts-c671i\"><img width=\"274\" src=\"https://i.imgur.com/SHPhIls.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-cannon-physics-nr84m\"><img width=\"274\" src=\"https://i.imgur.com/M9rupWP.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/wonderful-chandrasekhar-8l9rrj36j0\"><img width=\"274\" src=\"https://i.imgur.com/HSTGdcO.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-train-l900i\"><img width=\"274\" src=\"https://i.imgur.com/B3AzZVH.gif\" /></a>\n  <a href=\"https://codesandbox.io/embed/r3f-particles-i-q4d2v\"><img width=\"274\" src=\"https://i.imgur.com/XscsWgu.gif\" /></a>\n</p>\n<p align=\"middle\">\n  <i>These demos are real, you can click them! They contain the full code, too.</i>\n</p>\n\n#### Why?\n\nBuilding dynamic scene graphs declaratively with re-usable components makes dealing with threejs easier and brings order and sanity to your codebase. These components react to state changes, are interactive out of the box and can tap into React's infinite ecosystem.\n\n#### Does it have limitations?\n\nNone. Everything that works in threejs will work here. In contrast to \"bindings\" where a library ships/maintains dozens of wrapper components, it just renders JSX to threejs dynamically: `<mesh />` simply is another expression for `new THREE.Mesh()`. It does not know or target a specific threejs version nor does it need updates for modified, added or removed upstream features.\n\n#### Is it slower than raw threejs?\n\nNo. Rendering performance is up to threejs and the GPU. Components participate in the renderloop outside of React, without any additional overhead. React is otherwise very efficient in building and managing component-trees, it could potentially outperform manual/imperative apps at scale.\n\n#### What does it look like?\n\n<table>\n  <tr>\n    <td>Let's make a re-usable component that has its own state, reacts to user-input and participates in the render-loop. (<a href=\"https://codesandbox.io/s/rrppl0y8l4?file=/src/App.js\">live demo</a>).</td>\n    <td>\n      <a href=\"https://codesandbox.io/s/rrppl0y8l4\">\n        <img src=\"https://i.imgur.com/sS4ArrZ.gif\" /></td>\n      </a>\n  </tr>\n</table>\n\n```jsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, useFrame } from 'react-three-fiber'\n\nfunction Box(props) {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n<details>\n  <summary>Show TypeScript example</summary>\n\n```tsx\nimport ReactDOM from 'react-dom'\nimport React, { useRef, useState } from 'react'\nimport { Canvas, MeshProps, useFrame } from 'react-three-fiber'\nimport type { Mesh } from 'three'\n\nconst Box: React.FC<MeshProps> = (props) => {\n  // This reference will give us direct access to the mesh\n  const mesh = useRef<Mesh>()\n\n  // Set up state for the hovered and active state\n  const [hovered, setHover] = useState(false)\n  const [active, setActive] = useState(false)\n\n  // Rotate mesh every frame, this is outside of React without overhead\n  useFrame(() => {\n    if (mesh.current) mesh.current.rotation.x = mesh.current.rotation.y += 0.01\n  })\n\n  return (\n    <mesh\n      {...props}\n      ref={mesh}\n      scale={active ? [1.5, 1.5, 1.5] : [1, 1, 1]}\n      onClick={(event) => setActive(!active)}\n      onPointerOver={(event) => setHover(true)}\n      onPointerOut={(event) => setHover(false)}>\n      <boxBufferGeometry args={[1, 1, 1]} />\n      <meshStandardMaterial color={hovered ? 'hotpink' : 'orange'} />\n    </mesh>\n  )\n}\n\nReactDOM.render(\n  <Canvas>\n    <ambientLight />\n    <pointLight position={[10, 10, 10]} />\n    <Box position={[-1.2, 0, 0]} />\n    <Box position={[1.2, 0, 0]} />\n  </Canvas>,\n  document.getElementById('root')\n)\n```\n\n</details>\n\n---\n\n# API\n\n- [api.md](/markdown/api.md)\n- [pitfalls.md](/markdown/pitfalls.md)\n- [recipes.md](/markdown/recipes.md)\n\n# Fundamentals\n\nYou need to be versed in both React and Threejs before rushing into this. If you are unsure about React consult the official [React docs](https://reactjs.org/docs/getting-started.html), especially [the section about hooks](https://reactjs.org/docs/hooks-reference.html). As for Threejs, make sure you at least glance over the following links:\n\n1. Make sure you have a [basic grasp of Threejs](https://threejs.org/docs/index.html#manual/en/introduction/Creating-a-scene). Keep that site open.\n2. When you know what a scene is, a camera, mesh, geometry, material, fork the [demo above](https://github.com/react-spring/react-three-fiber#what-does-it-look-like).\n3. [Look up](https://threejs.org/docs/index.html#api/en/objects/Mesh) the JSX elements that you see (mesh, ambientLight, etc), _all_ threejs exports are native to three-fiber.\n4. Try changing some values, scroll though our [Api](/markdown/api.md) to see what the various settings and hooks do.\n\nSome reading material:\n\n- [Threejs-docs](https://threejs.org/docs)\n- [Threejs-examples](https://threejs.org/examples)\n- [Threejs-fundamentals](https://threejsfundamentals.org)\n- [Discover Threejs](https://discoverthreejs.com)\n- [Do's and don'ts](https://discoverthreejs.com/tips-and-tricks) for performance and best practices\n- [react-three-fiber alligator.io tutorial](https://alligator.io/react/react-with-threejs) by [@dghez\\_](https://twitter.com/dghez_)\n\n# Ecosystem\n\n- [`@react-three/gltfjsx`](https://github.com/react-spring/gltfjsx) &ndash; turns GLTFs into JSX components\n- [`@react-three/drei`](https://github.com/react-spring/drei) &ndash; useful helpers for react-three-fiber\n- [`@react-three/postprocessing`](https://github.com/react-spring/react-postprocessing) &ndash; post-processing effects\n- [`@react-three/flex`](https://github.com/react-spring/react-three-flex) &ndash; flexbox for react-three-fiber\n- [`@react-three/xr`](https://github.com/react-spring/react-xr) &ndash; VR/AR controllers and events\n- [`@react-three/cannon`](https://github.com/react-spring/use-cannon) &ndash; physics based hooks\n- [`zustand`](https://github.com/react-spring/zustand) &ndash; state management\n- [`react-spring`](https://github.com/react-spring/react-spring) &ndash; a spring-physics-based animation library\n- [`react-use-gesture`](https://github.com/react-spring/react-use-gesture) &ndash; mouse/touch gestures\n- [`react-three-gui`](https://github.com/ueno-llc/react-three-gui) &ndash; GUI/debug tools\n\n# How to contribute\n\nIf you like this project, please consider helping out. All contributions are welcome as well as donations to [Opencollective](https://opencollective.com/react-three-fiber), or in crypto `BTC: 36fuguTPxGCNnYZSRdgdh6Ea94brCAjMbH`, `ETH: 0x6E3f79Ea1d0dcedeb33D3fC6c34d2B1f156F2682`.\n","readmeFilename":"readme.md","gitHead":"126b0b90ff7042a812d8d6a2eb37c282b70383c0","_id":"react-three-fiber@6.0.0-alpha.3","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-rFpGfJ88gkNsQGuYULZRjWuczsD8kiZylBNMR6U9cVOkJ2eKoXY/LBN8ofcXxy6N0pM0Ek6pta1+rh79NqIMIg==","shasum":"1122717c35f06938af677f4afaf26aea66f0aa82","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.3.tgz","fileCount":24,"unpackedSize":155936,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgQ28aCRA9TVsSAnZWagAAvCkP+wf+eXbztBYICvBiTDXH\nSr9k2e6bjpbUd4N31jQyioHIEZkzvXX0yWj9YXaLPNXmfA5PM2dAl2IHRVjI\nQoOp2pqG860kJ2p24HSPNI630hieksiIAaIkXagvUc/3csAfucd76YNGzvDu\n98dD1XEK5l/9KQw0MhVJvj93xjGVdqeP0cVLRrRoR2/8anlZXsvE+bvTh7D1\nelDQJmez5i1L2BmuPl8+s1/Jfsybt0cGdkIZJUYJCZWpqBXhnm61KIaenE7V\n6gvdUZDLCbvytl/yPodKjsZZAyxof8qr8t1eoqghrAu5tdFeqaDf9E0XpSiD\nNY6H1U3GFh370dMbTeBY4RmcBE3ixonhcgPvgUCgpZLqU/W0ZdCbmpDA3uky\nB8oeiNgetmx6GZbuAFkMY3+6xLRN/mnvu66uRfi0rcaheWIDPn453xJ2ghFY\n7INC50J1tvFl3dIozkBeG5J7DbUqevHzs7Z6rIaLXXjNdrleCdN8RDN9eXUJ\nK3RL1swFUwrRAsL/H5Cfd+YCm5OARyDsRLd8vS/NiHbX3jKNZo+OTyRjVRhc\nahhpiyTCZNbNSgiqptr/ya5dZXW6xzEtvPwNE9NQZuS5c8rqevPB8JTFJe+Y\npEnaLxvF+uXHezV1s2cWcyTTkY0SdZ/SHGFG5qIdXEWOTKP5m1e4czwXMvOS\nWg8W\r\n=9+xN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCooRiClKfPPB/gYQjlifDMwrIOWAhEins2b8XEy3ZogAIhAPu3JNAC/TqYm25eR23IUjNmBqlSWIO2B08TYpqpBTLN"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.3_1615032090134_0.11247916766411103"},"_hasShrinkwrap":false},"6.0.0-alpha.4":{"name":"react-three-fiber","version":"6.0.0-alpha.4","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.4","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-v4EpGn0/SiSugjKde+wFQi02RU0Vx+ug0Df8Mf7ORkjPhWfCFnuV7ufZswvxyn4WUKgO6I57vP5faK8b5WfhoQ==","shasum":"0597d3d4892e1da9bac647aa5e25ce08c47c239f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.4.tgz","fileCount":29,"unpackedSize":265269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgRyhPCRA9TVsSAnZWagAA+jMP+wRlYlgNMfC4BhXFDnaY\nYboQ2bpS6bM6+Vire6D8zYAi/tIQ3uO5aSVHNcWjxetllrqpdjrfdUfAe7gm\n/lEzI+Q5RRNt99cKARS4nxJ0M3vj+76V1rmAAye/gccHESnetWb135tXmEe3\nsrRmr7Hu6YlonuQLJCCsM17jencE6fvvPbQQcmbvVnhyqSojeMcaln5WCuol\nOGi9UJKbYYdZbzgrOju4fFnBVfX+CnR7qOjudLOWCu6ZksZ+vxTqgmRY3z66\nxn0AUovO6wscJk4MicmYL7oepeyRmDZZSNJs3EryZbys48nX3MUd7vrnzuF5\nxOM8dKfD3lfTukWnw2I9ZugL/CXhZu34fUK8Zwx8Sd1aYOamfSOrEicrvQgV\nnDyDyNdggrTRrbn8VXefdo/VSOc89Fz8BBNPlMgaMHQ6Me7SuLYZOwJIk7Ve\nGa5b5AqXpzQeb/YZz4UzCySEjRJtup3zMlxlNDbZzOb7L9It8jjx0SiK7QiR\nylR6rBXzslHZOmcr+5Uf1Ql6rCj4uwVwie4FVAjDnoMgx270h0beyAOI8Nq7\nr8gkY6YVlSHXHz8yIdA5bdAk1fO5E90zjh11bX0SNnGxJZcKIwbbIz79xuu5\nH8nZ2Od+y5orycsHXiFzdM1KbApfBLzbx64R5AiYPDkxvdlM3fyDE98H+540\nkg7e\r\n=JOVO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCJDu+cNJhCIf0yeGOEZmyQl27CkR3ggJTQH8gBSUsxhQIhAI9rDdIqaGnXcIK2DTK5Q45TKi0ziysMBfCgQ7KTfcjM"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.4_1615276110575_0.46965840817502524"},"_hasShrinkwrap":false},"6.0.0-alpha.5":{"name":"react-three-fiber","version":"6.0.0-alpha.5","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.5","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-ILt4EOFMvQqUOFQg/WHvC5EE9ymapauF+WCFnDDHTjRvIwfFTiX69iAD5WqCBwfdc3SyXHXzuPPtnyUd6H0ZjA==","shasum":"5fb5ab4b00546f5a026d3b9ba33e57f3160de717","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.5.tgz","fileCount":29,"unpackedSize":269269,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgR0aoCRA9TVsSAnZWagAAwYcQAJH269g5KrB2hrat30mV\nDv1fgVatryz1L8i8oURbXVQBOJkfmbp0JLfDMBBXDr/ZbyDDaoPoshXzeqAf\nWkBx0WealW47quvRviu8xTfTirFTfUxsaycVA4dYd3+A+sbi/KAaqgaDqugn\nCcmxZODtC7OMlkDxuVj6XYzvviYbhP3s1FkmIqhB0SOAOKqgB5NArk1ERCEK\nMbrrEv5SayjkOMuyiXxo29CpH/qTwXPhKHDYD0+PeEtvhvuaTK0Aaho1u7EG\nTUkcZBZrs8LrtVFMin9rfpSVPyYXGwcN+zlK9ymUCRBNWnUJu1Lm+65EkOCr\nbir2pmUqlMqfm2o+1vsKdwc9TwjSVUgAzRP+iMp6Bjga+3kjbXjUwBYLBCDE\nlsN66R89kq09jrbBWiNh9J5+Oi8DRO6gQN3+Iz6OiU+LRtqXXYIospyPcM31\nkY6axz7iqAbg29W4TMVE3KK7Xoi28oAaaEQmnMBry8Wpkt7eMKFUs1OwFv5t\nIJcC3wAzAg3HV26mFWCijUzF/Ets9t2dMXfVq+T/ontphAMWPNAVC3Mz5sc8\nWZKIE41dhtLR3ZC5y7CS6lcN8M1BkeJijPr298k40swYyfNqMjp1G3jZpvxu\np+W3I6VnxuhHyCzqgfwtYBm2MGjZxAnT4ea2DlCqE5W8djmshzebB+0PG8T3\nyuJb\r\n=zbrz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGDDEQIkdVHNLCxj1aFwjEXLuNxV6BLXFj+W1hQaa3f2AiEAgAGwGu1U+hrqK6keYPknws+Uq7K/QESjkTZzuzOF/BM="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.5_1615283880258_0.2912851121754423"},"_hasShrinkwrap":false},"6.0.0-alpha.6":{"name":"react-three-fiber","version":"6.0.0-alpha.6","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.6","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-Yh97OTW8ofYLEFFt/XDfOAESd9H3/Uk6F90K8hiqLSn66uq2IEydb7vFRBINc3dObw1ooRoNpYPuA5/nu3Secg==","shasum":"2633461a1386586a932007fa9560d579a65419e2","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.6.tgz","fileCount":19,"unpackedSize":190447,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgR09kCRA9TVsSAnZWagAA/zMQAI4kEYApD3BLJoYU0QpW\nWZvsRpEJAureV/mWI6IYTobtzS7SaFAzRq11JR9x3ECN5ncums7Uju1f+BnD\n/8nlUmHvaeMRykb6OzBhP8KkUqQVtAV6nRF9Pg4KDtyTPBQhD7Q29I9eWK05\nbtx2N0q5jO3ICkcUERbAQMmNU2wfY19e/xctM4OxLsRu0kGr8HzbL8i5g06o\nAF6pQ0jsarDmyHx0MhmR2sTbvdMxx73Fn9pu86FBfWtDsgWs4GPEoqElOSkw\nfYICJGlPe/sKnh/GXnbFjq+Gv5czoLwTs4U2flpIi0VxcRlhd2mK0C6zqbC/\npwnXAuSoT8meyPh3DEIT4fwgOL/p9UUr2N8vMbVDjjdBrw9Cv3aLx+bfm12m\nqSBHaTy+LDCx90PqvfYFM6BXBccAqILnZDt6E1ZCqmlVWc1w2cUPnmI3JNVV\n4Mg61IJRo6u8cYbU3Em8YWsgxYPL8mJNw6JNB7HOu5kzldEndT+DZRJYqc1u\nxjJLlJ5x198ivVlSz/AC9poq7NbVAQnFaaj7HIJuZM9cd4uMEhSA9SBOKUus\nVaeZzKwiDREQB3pzEp2vfg6s4s6znDl4Elg0uJkCy3c5CwQFP4pQ7J5z5hHM\nrpUkbsotrxMIBOjS6N2ut4vvQHWLB0ZEjg32jidqGpbtt0/t1scGtQ37OIYt\nbgU5\r\n=5ybp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEr9Y4jaD4Qyxk0f7PORxtbadnSRElqqNQjBYVgXllrfAiEA8DVNBKWhnouNqD2Dfr2B+8NxIuN6M9W09RJMRqBvr9Y="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.6_1615286115657_0.6476009703327807"},"_hasShrinkwrap":false},"6.0.0-alpha.7":{"name":"react-three-fiber","version":"6.0.0-alpha.7","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.7","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-zERGGtiJWY2vzp3JFRO+/J0wTkfmJ4bYSe5PGdp1rBJSFPxDrJK2US0+U8Ya8za9A4lu4pRxBWuiSSKalt2auw==","shasum":"38b7f41b99ae73e63d31ca552027536cdb663c66","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.7.tgz","fileCount":16,"unpackedSize":184305,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgR24CCRA9TVsSAnZWagAA/+wP/Rf51iuSUMviyb+TTy3M\nesOsw96X7ID2IYigNKnkp+NoYeROXKFoW/Xi3/WajYsx7J37R1TQeOhMf2Q6\nTTVW6so3XSlMYwhzZ3uJLM6f28vNu3aoGDYL7VyAhb1l7O5xZBaY+tY4yxRr\nwEuEcSM/CBVxSwOOVC+PSmQv8FvOLZ0gau8sdDF3cJLTvHQFGrCbVgNi1ZLo\noml81EtFuLsYg6MBBnntL7N2a2q4V7jofjyQ7LclFTGDX+3EIUp3opCRmc36\nku7j+BEQYkRTag47psg7RoAGmusEF+PwKgj7mg2/JDO7ncboir2UPBMROC9r\nLXeyUfVr345mNV3gXtu+bRjkhWbz3qhWl8uBRjyAMyEkXhgvj5y9fSqr6E4L\ncCABhsqt7p6GJ4v8TXFLcL6Qd/1Rs4qhYM+hVxw86VVLsFZiLXPmuOHARE4o\nu/EKjYOsew0vvu6VTBwxSuAoczOhKmLs9uC7U04Up47CWbum4EBcGbFrHiF1\nqzujqiScOdNGyyRLIdlFwK6GjB/FggcKJNt0I601P1o04rd9Bt6IpTCsM/Sj\nJhjDdBBDrFOsiA+H0cno0ddwkii3ZBVfvRla0YxFps5oTCPI7F0HSUCbHci7\nFeNwfSXQeTALvNUq4nJaz40sOPq9tzt2drSrkqYhafyVkUT0phuLAF5F9lIn\nonTj\r\n=lO8d\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCMNS1X2nDiIJl4kpqCBguH3kcoa0X8jWG5dsc/u/57IgIhAPOhq0c7NM5Sx0s5ctPfgsN3Urdla1LcszufuejSQ85D"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.7_1615293954111_0.7927594770817299"},"_hasShrinkwrap":false},"6.0.0-alpha.8":{"name":"react-three-fiber","version":"6.0.0-alpha.8","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.8","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-2r95tDi0tTsvDhYXnIsde9qPr41jYDXDvPvrCkGdvK7gBIj+h2sEc+U+VO8htKrhdKGbp/h7VlXzBlAjKosZSA==","shasum":"9a6d834536a6a93550f68a40d4297ef2e89c37b1","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.8.tgz","fileCount":16,"unpackedSize":185667,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSKj7CRA9TVsSAnZWagAA55cQAKMrfQNGB0oOaM3r+71l\nItbhQAywiHCDEAcwxd/FzcH8uFlbwyWQEZcUVFcnMvV7zMA1FJLXP7STppeN\nJsY9BtqDQqtbIu6V+gUmeaVroevPUwxEYMBkAdnu44Q/7htck+3C4RCWTHEr\nB9OTxTYIh7Hwf3M1JsxV70dLHCG+RuiIkANNana2z30c7RKq/q7+fP3SAY7o\nmHBwX2RrUvnfaD0//p5EYIGsSm55EdpqYNWCdetg6DqbhJNZL7YHRbgEQI+z\nD8avUFkjxb/brilpNqnvfFehyoeQnYRgPLbI0FVG8x/Fc/t9RVjkRjJyYs74\nBumI/bJwn8FISHfaYp1cOzyeddrcY0vd7+FDBY7bnej9Xhh4LI3C+CkCe8Ub\nZ6Ym090YSwSFqIyHjcA4rbp9BMH6Fcz8Cv3okIgSEGboXMyyqqywIQxxqDuo\nuc5lU5nbj4xf2EfHpeoYQE2bD3+PJtWsfd1GPfdLbdiKIZyiYDedaau7YQ9D\nIYfNi1VP8lnGKZdJNMwGpMYVmYaiStcl67zBlZ1XerUbOYDkx8gJrTYvThWI\nhOwv7V5YWm/B88Iow0QeelB6BMQhQVq9IDOdRPO/VgDB4hyzAIqB4Ezvb7lt\nLOKRC9I+a/d97mslYrNUc7OnZj5PomLtFgIjWM2836aj3sHejDg6JaYa1T/U\nHf7+\r\n=4hwa\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC7Qy0S1B7I1jdGkVimQPhaXVnpuftEUAtPLa+N1UAhBAiEAnrhIZXRQ2nnbyJGSe2kxPmK+jqOcfe4HFRlq1mL8z+8="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.8_1615374586521_0.6949329498864008"},"_hasShrinkwrap":false},"6.0.0-alpha.9":{"name":"react-three-fiber","version":"6.0.0-alpha.9","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.9","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-x0CGcp3uBBmgnKxWrDwm/0XgpzqYFax8tExHfwvMFRbzspt0MU/Cr0id6EvnFWUOn2P3xfTKzdGvRHrYT1F53w==","shasum":"4951efc939530c154c3b03c7244eb7c72a88ba7f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.9.tgz","fileCount":16,"unpackedSize":188120,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgSeWlCRA9TVsSAnZWagAATM4P/A29p0+e+i0TwQjAFFzx\n0GGpGomHhnhZe/p7uksUP8i555d/wQXnGS0MUBa2FJvpnkneG9OR027SBC8P\nKWSzh/NhkCLzM5AtKsEXsAKdHGkmI/QQxIl1+A63Nr/jcCf64RXGHQExquc7\nx+QTs0q3cHeWMMr9lyCpicOMq5p6yxoGap7KCOCzoLQBb2x77sSgmjtC3Yd7\ni4HfgvRfdha3fZ/lNVmKuXbJK/Z8gWjPwNeROF1IltipUu3zf8KpaHWa2l7G\nIIzJCW2L//vDkYozNdsZFOGygCroC8Amb3F5v4PCBFpRaN4WA2hMOeZ9e0pE\neGydT3e0n33ueq9cRnHJbAFh/swKpU7DSYB4AFy1feHPQiNC81OHCC3mXJa2\nSC1cyN9vHvdElvHn6Zl8BmaFm5oTzzkGouR6cmq5yWqc8fGpEaX4seotAqKs\nW8YyNGHBPKOSbqN7x3AssdFy/JKcAWeb3yjxyJM7a607YJr8EMPd+1rIoVd7\nexUxWk9y66iDOG6HNxhLuMSoRdZAXVpg6PTEtLoU+KwDniT7FtdYtvjuI649\nM/L2zs7Y8dI5Fv7b9B1RvQHrgfYnKvgGBQusQJpUbD13CQySR+hdbB1YEekH\nHdyqJ5SAiVVyYYWApT5sCGVGoqAIRi9YY86dJQrwYH5IuJkDc3wHcpE6vhcu\no556\r\n=0Lor\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF7xVUBXUIgtk7DttWdv3wUC0I1UwNSJgS2uQTnqmh9WAiEAlhirZOw+gV6ZquX0zyLkRvqlUDizEW1NTLJ2RtDeqjQ="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.9_1615455653211_0.8687466759347928"},"_hasShrinkwrap":false},"6.0.0-alpha.10":{"name":"react-three-fiber","version":"6.0.0-alpha.10","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.10","_nodeVersion":"15.8.0","_npmVersion":"7.5.0","dist":{"integrity":"sha512-2RTsPscG95wfXMygdHKnQeA3ZAX34nUbxjhh56rAEt8rZCFN7sonZ8lz3hVCw8wYCRv9K31C1xXgo7UAw+8+sw==","shasum":"dc22794b145fb29a245a083ae75c8ba3c721fcac","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.10.tgz","fileCount":18,"unpackedSize":194180,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgUjFpCRA9TVsSAnZWagAAOA4P/j83FYThlnkZrA6ovzrO\nmxCU3yus81TlkiRga90Xdgw5nHPYRMkIdvCDCjki2OkrSxMZtGOOkehSPcqY\n5HyjJ4TTIvKxjmHodac0PbYFZaRSk82/4vRuIhUq6YNka1iepA/fB28QOcUb\nPfLLSX9iP98QKdPfkOwX6GsK2pa1g1Ai9ckvPUnPJ34JkheoBGMiic4ViNK9\nx0/kFHUO37DARywySCDLmpztnrLgByWHhavgk0TUcGsJHWqJedAH41BUi7XQ\ng5Oy2fgCMxMKulIPqLGODelmpa9SvXDsQoMT3ER2lQGB7cTKk+3xwhaEm7AR\n3+PYlPxVB+lV1B9vJUWmLQ0j+Xqe8cdvHluoqLTP9Lrti9F75BUuo2JbEknB\nHAg90NaPBlccxOR1I4RFsXcQCVlCuateCuS3bB5n0M82+uPN2VI+EaHblz7X\nv6LZywWNpHlI+Nvl/hDmK94WOYfRemgRYoXexfKKLVgYWh2NOmaKHD63eJ3y\nSblfqhyGyfQI56JD96C4TU79FONtLAkamn5kXSyvrxUysCz6p/k3reWWnu6q\n6hpOOMLhq/qAN80J3JhWSfFes5xEltyYx6fAsBmw+ht4ftCBOJhEeNmeQxcO\ncc5x4j+hNTzItEKH8N76JMcjCAu2DguWPuJn0eSS9HGTcljFJRoYEldzTUp6\nwC+b\r\n=4oM7\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIANOLAwHzvGDY2isQ/k/kgpN3x3PfiiFHVLepxjQPs/9AiEA4udvChEdZQ8//H1ch7RBsaqHO7xov41lt8oXLUxGSUY="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.10_1615999336528_0.7415622196528855"},"_hasShrinkwrap":false},"6.0.0-alpha.11":{"name":"react-three-fiber","version":"6.0.0-alpha.11","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@babel/runtime":"^7.13.9","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","use-asset":"^1.0.2","utility-types":"^3.10.0","zustand":"^3.3.3"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"readme":"ERROR: No README data found!","_id":"react-three-fiber@6.0.0-alpha.11","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-XIC1HWEDfECOnSJcEyDyK2boC0T+llnOAtJ6NQFvZkO2MphaO8Sfk0C8S+j7V8twscbBaTmsPabgix6940XgcA==","shasum":"fa814fd51954a4211eb6c69ef543c03bd952a389","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.0-alpha.11.tgz","fileCount":18,"unpackedSize":197678,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgVhcVCRA9TVsSAnZWagAAqKoP/i2KBWR+OnsYN2pnZLVx\nTMem+oA+EWDQWp8lmWxUf/bAE/T+nijNn43Uy+v1LuXd29v1J6bvb0ACG7ZA\nJWcWM/WKtaZZdzzpUE8DK9PawXY05Hs/4s7+h3I+9CybznkDZdCU3bVMpifE\n7cA+LmoXkfZm+se4iUg7nBFX7o02S1FG7FU7YagxnEnM3H/NP++LwG+XAUZx\n31ub7bMQ3beR6LqQIsucR0ARi38VHCakjyUVAmjCCm/5NFU0s7LxhwuxJ6Bq\nY0skw59YFYDZ8a8PyVlCYjpocaEzI4PcmdvwF1Hae+u0eAUPt5HMMy/ePKeR\nHZm+jOz0tVKVhRaaWIMnjyY+vER8pYc74Lh7Q9fXtz4/RuFN9TYuJwwN/zgc\njN7wulZYdm/gode5rn3uqmFbmY4py9tpMtJnXmgaElIgdpjo8NSZsB7WFY9l\nt1lYN9PiDsG8Czg2PPAR/p/SryTJWvL5j1Vm+W00ZeE0MCqVklmTqyURUlTc\nvL20k4WnGjKOrgqwiSxDxnO7v5awOBTdkEFvFf5vgr9grh8qphvak89wNyXG\nW1HDvTDtJiSrrvC564niwg+OmzpChvW2PKxy5M7Fh3MI/6Qn/YOhl8tsfJp0\nk10yx/S6Bu0H6IlZ4pP7p3qFM+k+D9qDN4qTEpfFVjiywMb0CP07cNlA9W+5\nND8v\r\n=km/a\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGY4/vfaAvwZ1xuhk6DiJWkfSLvI9tpeb7kgXMckIePWAiA/vXYO/fm9Q6EyGv9DnkrMJwIHj4R1ednJwLDBRTbO+A=="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.0-alpha.11_1616254740552_0.5397158087071208"},"_hasShrinkwrap":false},"0.0.0-deprecated":{"name":"react-three-fiber","version":"0.0.0-deprecated","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"homepage":"https://github.com/pmndrs/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"index.js","module":"index.js","react-native":"native.js","scripts":{"test":"echo 1"},"readme":"npm install react-three-fiber is deprecated, use @react-three/fiber instead!","readmeFilename":"readme.md","gitHead":"3f70fb8cceed2a8dc4939b3633a25eb79c05b347","_id":"react-three-fiber@0.0.0-deprecated","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-EblIqTAsIpkYeM8bZtC4lcpTE0A2zCEGipFB52RgcQq/q+0oryrk7Sxt+sqhIjUu6xMNEVywV8dr74lz5yWO6A==","shasum":"c737242487d824cf9520307308b7e4c4071a278f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-0.0.0-deprecated.tgz","fileCount":4,"unpackedSize":2001,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWF49CRA9TVsSAnZWagAA/KcP/RiN6yPeBaE2gz+DDhp6\n69rfO+wjuWd0w+HEholqgOLlD5xoZnOVKW1SxOKbnkgGXkh5raKmq/yyxXea\nEqh55wN5jVb6CaYRKdrVtqLsETQNWwhnN27X8OxE4XS4uKO3qn/RQlm2pvFo\nMAEbkT9W2SH5ZmEIin1XgAf81EPTUSkphCmSbycc/W3VucOMczOKItA6aKaf\nZxYeqz+Hv8b+VO0ztqbMse5EiFbNtwRdmNmeanzphpXAFzSpw7CETt+k/h1w\nZr5meryvYjfCzbieTqA7f4K+cefJeEqxq6iMLhJsI3sP26NIkh8wkelJ8sTY\nNa5gYflb0pj99LkmfiqLyqMj9KxiNW9zlIsxCnsU+VLj38ppu0FR5b2LPpb7\nUfhjSOGFeLfBo+uVHnIC1JlQypHGKdsoS4qQDca6Mcv5KoyjIAE3qEmENlhR\nx/fzoSzZ6nAJpA2B/c6g2cBoxncaG/kGCuzmT/gaEkb7XeGceRbWAfXrDUj4\nW+AgHLLE9OhUa1bqIIH3hYNR9QDI3DJPzXpO/BRpXIo76T+T6W/EfPR9VTe/\nAlDhhDGaRxdu29i2FxLMHwWzm+AIuJxCZH6NvFgiUp2njG1rRufpQfQaQNqS\nRk/kUQiN6a+ICrE4d2eQrQgViRvtlsw3zjQMbu6KqGLy2GwC5VLh8iaQ3DLy\nih1/\r\n=XKJ/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDOzr36pK/t74uXiE7Cg1mcxlj40WgHE0FKPR0hrZLpTgIgEs3YK1Oohe4wxoxhkKypmvTx7ZBjnbgmSyOiWoeHKmU="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_0.0.0-deprecated_1616404029176_0.3621680871651227"},"_hasShrinkwrap":false},"5.3.20":{"name":"react-three-fiber","private":false,"version":"5.3.20","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.3","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.121"},"_id":"react-three-fiber@5.3.20","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-del+RSFQn/dt2PQkxxUtlNq7CoTkUkGk1RtkICFSZaCpE3t5MC+egJURXqC4Mjc5bsZN+HvzegzXGQZO3mTSUQ==","shasum":"2738fbf410de611f6d1ffb11710374ce2c7ae85f","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.20.tgz","fileCount":39,"unpackedSize":634687,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWnn3CRA9TVsSAnZWagAAB5oP/38Evv0wr8d4Ca15nqTa\nOizJ8QatTYBLDQcUSZMXDO6eDHIO4bq9cpVq0mjYZVOR26vLIZKlIQHO272P\nshhuzlXllPnqqFL+ghQRJSOgXRuZwY++iY1asJajHZmper0BytLYbUv1dMBw\nBEGF20G8XhjyibVq9/gEJrjYoS08/pvAKCoJlRLYjm+zm1RAl64e9ib7KNeN\nrs1OeXyJxy9aUBf/V0Z0PDOoG65pgIjsbGUw4bYLUfr3Ire4DWEw7OHXnZd0\nCq2FEDaUMcFiOnb01OGZ54QE+gL56j7ME7W79mpIWIS5gdSCpG9wdNHGyxcu\n2Oa6AN6zjAQHopPgVaLe+ztj/QTMt1FELsfZxPjBl4nWPCg9O8ZwRCya48Mf\n8SQ376gOxNWn4HLc1RJdQTqJZs1aa5QvyjfW1NWypQAM8v0ezGz74J6YmVoL\njfBayPxzLvYed++88yp2ubstEPMrdzNQv8KgNoub4pR5IQCOc2VHh3ab9HDn\nehZGxV4oP05y7gNJmYVsRlWxZ+RzgfLDMbPonlFUKhxOcI4/5wMSZv0ZLIEP\nDQ6mpddsjTWQPNOJac2gpmkVfIQ3Jb6kRUv3AW9KUVWn7BeJmFiDfIoadows\nbDwcr5zXXcBWbHjlS+p/Ut07FrN8+LrlLUQ1B9MCcvIOZ4jQfftTbj21c6M1\nWlD8\r\n=xdax\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkmHbrOd0ff6HVw4RALvvsavy12ad37GmuN0RETJ6xeQIhAPPTs8mirm6tQbDHMaZnBDTqWaaKNsWU7Jw/te9qjecp"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.20_1616542199410_0.08386378875168998"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.21":{"name":"react-three-fiber","private":false,"version":"5.3.21","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.3","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"_id":"react-three-fiber@5.3.21","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-/FzxGYHA972fF+/nGD+1kiXMopSOqslLUtjwI80WmTBuDytUjkP58b4Net1l2vL7+Sg4+caycU5pAdaCexysoA==","shasum":"8ff5f48f72b0aa7da617094ce8fe50d392cdaa60","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.21.tgz","fileCount":38,"unpackedSize":717914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWw4zCRA9TVsSAnZWagAAGlAP/jZrJ1QrVgEFiLxkMa2e\nTxFGYf8VEBqN9KcQHNO0Ma2RZMgtWo0Zx7M1WknTUYe/xwdy4E9eSdtWqEET\nRl7jADKB+bEiaNJylfuY4Lo+NZXW8HdDSvuUbuWpFuTkZgwPOhDajcoh/Ohz\nawOJkYJXZrZbC+coCfhQ/c8UjyU++7dvHIUoYfd647j69OZ39ADEWYMwHUVV\nOhnjlU1duweSMWCt2hwUiy/lOSS1mqqDwCF9i3RZHibc0ikzYV0DTpeyampY\nby95Dud2KNJzniAxXWABNMxoKlvmGq0nzm+B320wPgO1BKSaeEzkNs9JWFGh\nd3l1cTn9BcfvM99HpTyP3hbe9hvKlkEfrKiNTCAcU9rjqglfcFVch3p/nmCv\nBAjqZOtr1Zu/x4Fz+bxa6idlgdk9H2i+uA/Q14iWelVWvZcvkjzc+qdIOSVF\ny+CMKNy8JczuVwaPETC8PFme1vx+/rQ/714CJVhU6Lh8gWYuRxv4TzYx25cn\nVe3VYgpv4Rqm9SvG4c5I+rYknMO0zdrj4GsQrohq13/e2LgsWIqph0yb9ney\nVnlMsP/na4qwvj8Aonae2W9R//9Vnx+oaxmZAc7o/08KWOCQEN/Tr8qbBeii\nwJTu/aoWNEQyvFKa2ROiXTgTt6wfpACw8JiAccyO6FxWvml4v4mekzLUgs9n\n+zH7\r\n=DFp1\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAu1Kr3CJWrW7rn1fAkXfszsOrlN0XSvgXZgW3DUD2OYAiEAqnWz03iVp8G4qjQUVX7UaEEDYuJ3GYC01ljVSd4V49k="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.21_1616580146381_0.8039055975505707"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"5.3.22":{"name":"react-three-fiber","private":false,"version":"5.3.22","description":"A React renderer for Three.js (web and react-native)","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel"},"license":"MIT","bugs":{"url":"https://github.com/drcmda/react-three-fiber/issues"},"homepage":"https://github.com/drcmda/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/drcmda/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"web.cjs.js","module":"web.js","react-native":"native.js","types":"targets/web.d.ts","sideEffects":false,"dependencies":{"@babel/runtime":"^7.12.1","react-merge-refs":"^1.1.0","react-reconciler":"0.26.1","react-use-measure":"^2.0.3","resize-observer-polyfill":"^1.5.1","scheduler":"0.20.1","tiny-emitter":"^2.1.0","use-asset":"^1.0.4","utility-types":"^3.10.0"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"_id":"react-three-fiber@5.3.22","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-TAOsFg7oerXDkUK/NUwlaMd+drteokXdDMACDmeBKzx64Z0IruJl/ORW7x3giWzqG3fs6BBv+rpcreFW9Ofuyg==","shasum":"6e5eedfa784827b70b07d4a087c214c89ec7a757","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-5.3.22.tgz","fileCount":38,"unpackedSize":717914,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgXb1KCRA9TVsSAnZWagAA/UcP/3zE449/37+cxvE0UL8c\nTIk6tNITmfuv32bhVTc02xbY+NiDmct5oS65rKqyJ7esP9b4ZrfEqdSzyY7S\nghYQ0xFP0Rre3YaO1LSBBM4TH8uarKMJ+qC0EGcdnHEO/z5ehJCrInURPdar\nJBETj5K6wWUUA6oZTfuHiF4zLVomhpKdflrtTWmbWx8n+ooxNCLoy5tfPOMF\n5Ld1hAkbpfKBylZ6B6nptAgCkWBJrOQTSPJeF0Hih3HF2pVcYjaGwvHrPT0N\neipWTNRWeUKL+ekbVsVtUEYGhpiCsb9G87pzLJtIEOmKLK5MIB+j69IWVFGB\nBgndtJiPlQRprIKZksPMOXTtr9hxCrdhz2IKxXiRbnLDUuk9cikbBQao2dIM\n3JAUAuYGWGodl4qrH8PhIkkbw3z08nDYEcoGxFuNypfmZqDPfhUW/M97qLTa\ndKRGCN5P7jB8OShRumejb6wdQeXySuL7BgGuTiUmPCHONcMR06xxk1ObC6iE\nITpxtxilFVKSGdlmjAUOLK68QIhenCEhREcMxolsjXgE+HSaXP7nT+k60djE\n8/U5XKPeBvokKJCNTYOUlIG7/ol9SMggwBx4ocxu3i0eSjiUHsTR9n2vvg6o\nu3/9099zmE35AYHURvPigdF12TVeN8ROKyh409VDenf2zTxTV4jQC/IuYytR\nkGo2\r\n=+v6s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBBO0ZLwZud5uEpL5WcNCiv+T9aznLMypbcILYx26iqVAiEAzgCLfTcpk8MB3S8J74Hoqfj9ifDxMuVBlR6tSmKmOtI="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_5.3.22_1616756041936_0.2107188683505099"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"6.0.10":{"name":"react-three-fiber","version":"6.0.10","description":"A React renderer for Threejs","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel","url":"https://github.com/drcmda"},"license":"MIT","maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"homepage":"https://github.com/pmndrs/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@react-three/fiber":"latest"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"_id":"react-three-fiber@6.0.10","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-55ahZSc7VSLv0QJXSK7Ep4dXMGu8MWU9+HN9MewugidRiLIUYVdyTRZSl1mPB3/lDfP1Op6RBEm4kyu115Exsg==","shasum":"88ec4c560c1b4ca9ae36137eaecfd9323ac1bfcb","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.10.tgz","fileCount":8,"unpackedSize":2372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgcq+oCRA9TVsSAnZWagAAmQsP/1a8quPDwOIty8J2Jvvw\n8j3+f3ZBfqywc4D/tqFoWypOaiWCzdhXj/Vjyg266EeDrHvh9Q0deqtU3fYZ\n7bcwUcCdAIw0yQY2K8qrTkh7m5C+rbNJwQkQGiyqVXncvCyvR8NmKvzlXl0P\n5LvmwEgHMv61YQnCmWME+tCR048NGrFhg30w8Iv0xPzaUcDSAY1abcU4qqy0\nCQUxqiRdW54pbKadnpF8QeN4axNT/HbRnYtOVGI7jyTVA63hUW0Z+w7OBAvL\nXyRyu+sMcscK0ZMDaTDffZija5ixfdwup0r8EJu/UUrfi3GbeTIh5zeXW8Xd\ncY1aZXLNl/bd9MJh43z70uxJQSYVNIXZCiC+tbQZJte2H++ozfrVEzK2KZ0P\ne0Tmbnq6t0GL3/p5g3URfvZjhht+qKaCCmBPualkkelv3mZrIso2oAF6/CRr\nFRKYar6MKZXB3eA1WcQuSbn0IFa/SSKyeX1XBAegO4JOhDdNyneiFNpJVTkF\n/SKyKPOCfaSyogwKLT9CRqtIo5KzSJZ613G80XfIBH4fDGe0Hf6o8HJQ29fM\nHnTtCEMLhL5S35De4XAkCVJtuwTFh/WYjUcIjrRgVXMSwbynUj0jw9RHa7FI\nqf7OtczdZaWRX9OauKYDNpkRO/GOLF+Mv1chrm0ZdgSSd3oEkcLLpwURpmmq\n+a1Y\r\n=IwGV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUI7PC8x8SA9EJsjs+DkQwtkk0Xv08yIhC72dAtm3IpAiEA6Oeuwhfywm3OoRA8LOnCwHMhpQQT3ZAANZZAb1d12o4="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.10_1618128807556_0.9641942935839891"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"6.0.11":{"name":"react-three-fiber","version":"6.0.11","description":"A React renderer for Threejs","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel","url":"https://github.com/drcmda"},"license":"MIT","maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"homepage":"https://github.com/pmndrs/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@react-three/fiber":"latest"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"_id":"react-three-fiber@6.0.11","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-3pB1d7kHXDk8o6Mp+KVe+RmA5X8E5pJcYroR3yZ++/LyooHn14BGgr/14XWVRQDV4EDgcGJ5oIKiT0416qw4lg==","shasum":"7b3959b80d54242928fad45646b5f60558c5f94b","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.11.tgz","fileCount":8,"unpackedSize":2372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgcrB3CRA9TVsSAnZWagAAQ44P/jBQSncu6WsOSAx5+paJ\ngp7GC9soo199QbVrW5ikKboAUNOy1W/N/Htw2B80262cKamf2n2DB/SmovOE\n9ylKUvqHSyob0vxw6k4HiPKgXKZwyJUa1cAFgt+7M3VmT3v6DCIWuIQTl1JR\n/tl/htbhlJVT8HcSwSgHzW7mrL8tGARGd1jf2Olh13wP5jOstjB72OekRYbq\nUODlundikR5Fn12lI1+IZqcwqfMZSg4kmNxpSk7Ll2PqipO9KokqzaaJxpEI\nnFohl5WuoFEBb4VdGozXlVc155ynmlf0MXmnRLXu7BBR83DEFwVDncuvGKUC\nxcd6fw1XDFDHEaqcsZDhmu2om+Ia81Fl7h9bNRMcPty7n2OdKAmeNkCXb/uf\nLnobjmagieGP07kT1Ou0uj/yU7mF3PSGtDBw33FLg5Mw3/cRh/iFyIOoMfcK\n/pD0mq+b3ykcFCT2XQVYxTmry6lLmi22O+8iJBeVJhIQiN3JglnQbD+1hrE9\nzyyhsrHKSx+0ZB+L8r/4hs8eegLzPF9ac2Iyu6HLPmQJq2OW4lPCcFBYSqs+\nINo9bmSxf4cm/OOo5zjPMOlI630E9PSWd4TGYgw5n3pAv4fVl5xaX9ZbBvos\n1DLqY+nctL5Xd7wRvDwudtZGlLnDTsv69rfKwpdkumn2L9Ye/uqBEV+TWcuN\nszxf\r\n=PJ2v\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAEtYFTz33C3oMA1TmbcnrPo2Zpmt4HR0qKhBZFrWdBMAiEA7VY9gWAjazNMtGLICy/YhaRdJkxy0WvNa7N97p0uli0="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.11_1618129015283_0.5410261293544008"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"6.0.12":{"name":"react-three-fiber","version":"6.0.12","description":"A React renderer for Threejs","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel","url":"https://github.com/drcmda"},"license":"MIT","maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"homepage":"https://github.com/pmndrs/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@react-three/fiber":"latest"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"_id":"react-three-fiber@6.0.12","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-JAv65HNcL/3/M3PPj43t4xDqbR/8O3tc3xhpO4iRmGGHwLDrF9kdFNgbfWrkl9V2ezsENGhX93wmPGOTRD2pfw==","shasum":"e004de5a50699b5b85f2bf9ea9963a8a7af68237","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.12.tgz","fileCount":8,"unpackedSize":2372,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgcrCcCRA9TVsSAnZWagAAHCEQAIPYiOOQVzXh3EVfIyrS\nB2E6ZFpR7YR0zXkBSX0/u4DCAQSOk8CyX9AQoy6JSJaJfUU6Gl98JjODhAZJ\nPd0OipLNPt6bN+yJG1bWfZ91KUMVQQCyVZtt3h8Ka6Wn9LwL2h8R9fwOE4QE\nzDFSmIBHdeYckPBsSSSPPl/6AuyKtZWQqMkEt3F9uQpLq6pJu8TTDBiECHQN\nlfhkikPMV17k83AkqIx7dME6FVmaSgmCHYRFBJpuoXHMvs2f44tGTASQe+FS\nXaq0r2t+QUNshX0FOLqW/L/ANfQwbF1RRXfbpCr6tfG6hRVFmKlihn0ZWyFM\nMtxABCjV/mA5xLyfnPLK6u9Dw0c+yl2kfVyBtq1vlPu2bwsJTPKzwh9cbcbk\nxvlbQn1UvTycoi0fFnIpDPeQLdSLe6UD5SPPqfwC/f9EtiNhtIEbEMMwYacU\ndZ1vnICTzn09GX7hCxEkd0dHyFfwWZL6DLXkQ7jN8YIgr8OfOeJu9tFqzEgp\nsv4G86bj1S7FfEUCKc9B8215udvo1Zw+8eCge4niTo7KJTKUOmZPHqi0Dt4H\nCDKQfQIImav2Tjv0BvYhOeBXHcFsKnacTrMRXpXrxQfCLbACwrEghCFWPsYP\npGkLH1KVXRXHxtUTrwACu8aep66Db2RIBb9sh/uCYc/J5tI2T9D50ntbNUFy\nGrPz\r\n=Nk0l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCAMRdLt/WOa5c54XaUJBXeJm7faR+ljNZxPWBvFerJvgIhAPx5XksbvdV5fHFuH3mqmHyB13PynTCiAcfng07KZ5yZ"}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.12_1618129051841_0.6615901051170983"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"},"6.0.13":{"name":"react-three-fiber","version":"6.0.13","description":"A React renderer for Threejs","keywords":["react","renderer","fiber","three","threejs"],"author":{"name":"Paul Henschel","url":"https://github.com/drcmda"},"license":"MIT","maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"homepage":"https://github.com/pmndrs/react-three-fiber#readme","repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"collective":{"type":"opencollective","url":"https://opencollective.com/react-three-fiber"},"main":"dist/react-three-fiber.cjs.js","module":"dist/react-three-fiber.esm.js","types":"dist/react-three-fiber.cjs.d.ts","react-native":"dist/native.js","sideEffects":false,"preconstruct":{"entrypoints":["index.tsx"]},"scripts":{"prebuild":"cp ../../readme.md readme.md"},"dependencies":{"@react-three/fiber":"latest"},"peerDependencies":{"react":">=17.0","react-dom":">=17.0","three":">=0.126"},"peerDependenciesMeta":{"react-dom":{"optional":true}},"_id":"react-three-fiber@6.0.13","_nodeVersion":"12.18.2","_npmVersion":"6.14.5","dist":{"integrity":"sha512-uShQnkMVLvnzwf3YzY9mnzCnpmLpvTQkc0ycrtwk8fyjXmZt2695tLn3tufPF6uxq06UKJRKJcjCVCMXyUcEPQ==","shasum":"6dbbc5d8d5fe94c49986e9c71024af7eaf68a441","tarball":"https://registry.npmjs.org/react-three-fiber/-/react-three-fiber-6.0.13.tgz","fileCount":8,"unpackedSize":2818,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgcrDICRA9TVsSAnZWagAAdIwP/jIm1XI4msUdNuFxAmFx\nqvYa9ezOv3XM3sIfa8GVMUCksEZ3mz7Du4702OSyO1jzIqJMqFp7FfNSE/QA\nR8hkixxLPtVxeaDU19EafYw5qF1Zet5K2VcA1ZcarzK+P97CMMuMaLviOdQT\n2UMRsZzNYK429ruZEOeClq4u/ZXfkRk5Neq13+8O03AZFSNnzhGPV1E09oRH\nOI8xqQaea6GLo6xxkOqa7f4tvIHamJ0r6zOcysktk04vNpLXfRalVAIPQkXy\no75Eq0RjSs9S5TDH5sZHc2pUWEy5vp6uSnL/pKi7m3InTsgP7kAk9bpK94XM\njaLmjSmxfxYNGsJ/BVtyynUYgzvRLiXoA+044ok+CMrt0m2VJSsbvWQPlnqN\nhSmIJ+rOxKRqGcIWPFp7uJcm9QIMRUea02CdVS2XZxcPpGW2TMLZd1a21Bz7\nce8/HRNlrutnqaPyj/u9TcpEFxSdOUIR/nVST766ie593tcWilS6JiugBv13\nMMKQXakHHVnLeWylMpQaPe6UxIW3QUaVgBcHSLSi/j22uUb9zo4cpO4iPNTe\nnO++qHW96QiECfkNH9k09Uhql0LBWL9eAPbQoMcPOWnCRALRhcSFhZiNUEuI\nOERFTk4/+yn8pOuteFjXqjezkx2Ui4mCNCPKbAvB+BohX/ckXKBJ0V6fTSxi\n8uQ0\r\n=fF2P\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgd0AUYRm+88iMHFCuDqLM167ZM3g6vAsDcEs13UxJRQIgYJa3mVM2uBeiMguGDG6CTrg0ug0C85dcNLP1k+l1Bc8="}]},"_npmUser":{"name":"drcmda","email":"drcmda@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/react-three-fiber_6.0.13_1618129095995_0.8123232938466198"},"_hasShrinkwrap":false,"deprecated":"react-three-fiber has been deprecated, please use @react-three/fiber from now on"}},"maintainers":[{"name":"drcmda","email":"drcmda@gmail.com"}],"description":"A React renderer for Threejs","homepage":"https://github.com/pmndrs/react-three-fiber#readme","keywords":["react","renderer","fiber","three","threejs"],"repository":{"type":"git","url":"git+https://github.com/pmndrs/react-three-fiber.git"},"author":{"name":"Paul Henschel","url":"https://github.com/drcmda"},"bugs":{"url":"https://github.com/pmndrs/react-three-fiber/issues"},"license":"MIT","readme":"This package has been deprecated, please use [@react-three/fiber](http://npmjs.com/@react-three/fiber) from now on.","readmeFilename":"readme.md"}