@realsee/five 5.0.0-alpha.16 → 5.0.0-alpha.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +21 -11
  2. package/docs/.nojekyll +1 -0
  3. package/docs/assets/highlight.css +134 -0
  4. package/docs/assets/icons.css +1043 -0
  5. package/docs/assets/{images/icons.png → icons.png} +0 -0
  6. package/docs/assets/{images/icons@2x.png → icons@2x.png} +0 -0
  7. package/docs/assets/main.js +52 -0
  8. package/docs/assets/search.js +1 -0
  9. package/docs/assets/style.css +1414 -0
  10. package/docs/assets/{images/widgets.png → widgets.png} +0 -0
  11. package/docs/assets/{images/widgets@2x.png → widgets@2x.png} +0 -0
  12. package/docs/classes/five.AnimationFrameLoop.html +15 -0
  13. package/docs/classes/five.BVH.html +10 -0
  14. package/docs/classes/five.BVHIntersect.html +1 -0
  15. package/docs/classes/five.BVHNode.html +7 -0
  16. package/docs/classes/five.BVHVector3.html +1 -0
  17. package/docs/classes/five.Camera.html +11 -0
  18. package/docs/classes/five.Clipper.html +1 -0
  19. package/docs/classes/five.Five.html +338 -0
  20. package/docs/classes/five.InternalWebGLRenderer.html +1 -0
  21. package/docs/classes/five.IntersectMesh.html +1 -0
  22. package/docs/classes/five.LegacyPanoCircleMesh.html +5 -0
  23. package/docs/classes/five.Model.html +87 -0
  24. package/docs/classes/five.NetworkSubscribe.html +50 -0
  25. package/docs/classes/five.PBMContainer.html +17 -0
  26. package/docs/classes/five.PBMGroup.html +19 -0
  27. package/docs/classes/five.PBMMaterial.html +27 -0
  28. package/docs/classes/five.PBMMesh.html +7 -0
  29. package/docs/classes/five.PanoCircleMesh.html +7 -0
  30. package/docs/classes/five.PanoCircleMeshDark.html +8 -0
  31. package/docs/classes/five.PanoCircleMeshSolid.html +7 -0
  32. package/docs/classes/five.Scene.html +3 -0
  33. package/docs/classes/five.Subscribe.html +56 -0
  34. package/docs/classes/five.TextureLoader.html +1 -0
  35. package/docs/classes/five.Tile3D.html +34 -0
  36. package/docs/classes/five.Tile3DModel.html +15 -0
  37. package/docs/classes/five.TileBoundingSphere.html +1 -0
  38. package/docs/classes/five.TileCacheNode.html +1 -0
  39. package/docs/classes/five.TileCubeTextureTarget.html +1 -0
  40. package/docs/classes/five.TileCullingVolume.html +1 -0
  41. package/docs/classes/five.TileOrientedBoundingBox.html +1 -0
  42. package/docs/classes/five.TilePlane.html +1 -0
  43. package/docs/classes/five.TileRequestScheduler.html +16 -0
  44. package/docs/classes/five.Tileset3D.html +11 -0
  45. package/docs/classes/five.Tileset3DTraverser.html +1 -0
  46. package/docs/classes/five.TilesetCache.html +1 -0
  47. package/docs/classes/five.Work.html +30 -0
  48. package/docs/classes/five.XRButton.html +1 -0
  49. package/docs/classes/gltf_loader.DDSLoader.html +1 -0
  50. package/docs/classes/gltf_loader.DRACOLoader.html +1 -0
  51. package/docs/classes/gltf_loader.GLTFLoader.html +17 -0
  52. package/docs/classes/gltf_loader.GLTFObject.html +7 -0
  53. package/docs/classes/gltf_loader.GLTFParser.html +1 -0
  54. package/docs/classes/gltf_loader.THREEGLTFLoader.html +1 -0
  55. package/docs/classes/line.Line.html +1 -0
  56. package/docs/classes/line.LineGeometry.html +1 -0
  57. package/docs/classes/line.LineMaterial.html +1 -0
  58. package/docs/classes/line.LineSegmentsGeometry.html +1 -0
  59. package/docs/classes/line.THREE_Line2.html +1 -0
  60. package/docs/classes/line.THREE_LineSegments2.html +1 -0
  61. package/docs/classes/react.Store.html +29 -0
  62. package/docs/classes/server.BVH.html +10 -0
  63. package/docs/classes/server.BVHIntersect.html +1 -0
  64. package/docs/classes/server.BVHNode.html +7 -0
  65. package/docs/classes/server.BVHVector3.html +1 -0
  66. package/docs/classes/server.Model.html +63 -0
  67. package/docs/classes/server.PBMGroup.html +9 -0
  68. package/docs/classes/server.PBMMesh.html +7 -0
  69. package/docs/classes/sticker.Sticker.html +32 -0
  70. package/docs/classes/vfx.Airflow.html +1 -0
  71. package/docs/classes/vfx.Flame.html +1 -0
  72. package/docs/classes/vfx.Particle.html +89 -0
  73. package/docs/classes/vfx.SpotLight.html +1 -0
  74. package/docs/index.html +166 -434
  75. package/docs/interfaces/five.AddableObject.html +1 -0
  76. package/docs/interfaces/five.AnimationFrame.html +1 -0
  77. package/docs/interfaces/five.CameraPose.html +1 -0
  78. package/docs/interfaces/five.ClipperParameter.html +1 -0
  79. package/docs/interfaces/five.DepthPanoramaControllerCustomInitArgs.html +28 -0
  80. package/docs/interfaces/five.EventCallback.html +400 -0
  81. package/docs/interfaces/five.FiveInitArgs.html +109 -0
  82. package/docs/interfaces/five.FloorplanControllerCustomInitArgs.html +17 -0
  83. package/docs/interfaces/five.ImageOptions.html +18 -0
  84. package/docs/interfaces/five.ImageURLMappings.html +1 -0
  85. package/docs/interfaces/five.ImageURLOptions.html +17 -0
  86. package/docs/interfaces/five.IntersectMeshInterface.html +3 -0
  87. package/docs/interfaces/five.Intersection.html +7 -0
  88. package/docs/interfaces/five.MapviewControllerCustomInitArgs.html +15 -0
  89. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +20 -0
  90. package/docs/interfaces/five.ModelEventCallback.html +22 -0
  91. package/docs/interfaces/five.MotionKeyframe.html +1 -0
  92. package/docs/interfaces/five.MovePanoOptions.html +42 -0
  93. package/docs/interfaces/five.NetworkOptions.html +9 -0
  94. package/docs/interfaces/five.PBMPanoPicture.html +7 -0
  95. package/docs/interfaces/five.PBMParameters.html +27 -0
  96. package/docs/interfaces/five.PanoCircleMeshInterface.html +19 -0
  97. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +35 -0
  98. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +20 -0
  99. package/docs/interfaces/five.Pose.html +37 -0
  100. package/docs/interfaces/five.Scissor.html +14 -0
  101. package/docs/interfaces/five.State.html +21 -0
  102. package/docs/interfaces/five.SubscribeMixinType.emit.html +1 -0
  103. package/docs/interfaces/five.SubscribeMixinType.hasListener.html +1 -0
  104. package/docs/interfaces/five.SubscribeMixinType.off.html +1 -0
  105. package/docs/interfaces/five.SubscribeMixinType.on.html +1 -0
  106. package/docs/interfaces/five.SubscribeMixinType.once.html +1 -0
  107. package/docs/interfaces/five.TextureOptions.html +20 -0
  108. package/docs/interfaces/five.Tile3DModelLoaderOptions.html +3 -0
  109. package/docs/interfaces/five.TileBoundingVolume.html +19 -0
  110. package/docs/interfaces/five.TileContent.html +1 -0
  111. package/docs/interfaces/five.TileCubeNode.html +1 -0
  112. package/docs/interfaces/five.TileCubeTree.html +1 -0
  113. package/docs/interfaces/five.Tileset3dOptions.html +1 -0
  114. package/docs/interfaces/five.TilesetJSON.html +1 -0
  115. package/docs/interfaces/five.TilesetJSONNode.html +1 -0
  116. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +9 -0
  117. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +31 -0
  118. package/docs/interfaces/five.WebXRSelectParams.html +1 -0
  119. package/docs/interfaces/five.WorkCubeImage.html +13 -0
  120. package/docs/interfaces/five.WorkImage.html +21 -0
  121. package/docs/interfaces/five.WorkInitial.html +13 -0
  122. package/docs/interfaces/five.WorkModel.html +11 -0
  123. package/docs/interfaces/five.WorkModelTiles.html +3 -0
  124. package/docs/interfaces/five.WorkObserver.html +25 -0
  125. package/docs/interfaces/five.WorkTile.html +1 -0
  126. package/docs/interfaces/five.WorkVideo.html +9 -0
  127. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +31 -0
  128. package/docs/interfaces/gltf_loader.DDS.html +1 -0
  129. package/docs/interfaces/gltf_loader.GLTF.html +7 -0
  130. package/docs/interfaces/gltf_loader.GLTFReference.html +1 -0
  131. package/docs/interfaces/gltf_loader.THREEGLTF.html +1 -0
  132. package/docs/interfaces/react.FiveActionReactCallbacks.html +62 -0
  133. package/docs/interfaces/react.FiveInjectionTypes.html +191 -0
  134. package/docs/interfaces/react.PropTypeOfFiveFeatures.html +1 -0
  135. package/docs/interfaces/server.Intersection.html +7 -0
  136. package/docs/interfaces/server.ModelEventCallback.html +18 -0
  137. package/docs/interfaces/sticker.IntersectionLike.html +8 -0
  138. package/docs/interfaces/vfx.ParticleArgs.html +75 -0
  139. package/docs/interfaces/vfx.ParticleTweenKeyframe.html +1 -0
  140. package/docs/interfaces/vue.FiveActionVueCallbacks.html +62 -0
  141. package/docs/modules/five.SubscribeMixinType.html +1 -0
  142. package/docs/modules/five.html +479 -3002
  143. package/docs/modules/gltf_loader.html +1 -155
  144. package/docs/modules/line.html +1 -202
  145. package/docs/modules/react.html +133 -1507
  146. package/docs/modules/server.html +18 -526
  147. package/docs/modules/sticker.html +1 -151
  148. package/docs/modules/vfx.html +1 -0
  149. package/docs/modules/vue.html +112 -0
  150. package/docs/modules.html +1 -136
  151. package/exporters/staticify.js +210 -0
  152. package/five/index.d.ts +1445 -264
  153. package/five/index.js +372 -1
  154. package/gltf-loader/index.d.ts +90 -5
  155. package/gltf-loader/index.js +260 -1
  156. package/line/index.d.ts +15 -2
  157. package/line/index.js +260 -1
  158. package/package.json +13 -13
  159. package/react/index.d.ts +75 -22
  160. package/react/index.js +260 -1
  161. package/resource/{basis_transcoder.js → basis/basis_transcoder.js} +0 -0
  162. package/resource/{basis_transcoder.wasm → basis/basis_transcoder.wasm} +0 -0
  163. package/resource/{draco_decoder.js → gltf/draco_decoder.js} +0 -0
  164. package/resource/{draco_decoder.wasm → gltf/draco_decoder.wasm} +0 -0
  165. package/resource/{draco_wasm_wrapper.js → gltf/draco_wasm_wrapper.js} +0 -0
  166. package/scripts/five-staticify.js +26 -0
  167. package/server/index.d.ts +197 -26
  168. package/server/index.js +367 -1
  169. package/sticker/index.d.ts +2 -1
  170. package/sticker/index.js +260 -1
  171. package/templates/quick-start/README.md +1 -1
  172. package/templates/quick-start/package.json +1 -1
  173. package/umd/five-gltf-loader.js +1 -0
  174. package/umd/five-gltf-loader.js.LICENSE.txt +14 -0
  175. package/umd/five-line.js +1 -0
  176. package/umd/five-line.js.LICENSE.txt +14 -0
  177. package/umd/five-react.js +1 -0
  178. package/umd/five-react.js.LICENSE.txt +14 -0
  179. package/umd/five-sticker.js +1 -0
  180. package/umd/five-sticker.js.LICENSE.txt +14 -0
  181. package/umd/five-vfx.js +1 -0
  182. package/umd/five-vue.js +1 -0
  183. package/umd/five.js +2 -0
  184. package/umd/five.js.LICENSE.txt +107 -0
  185. package/vfx/index.d.ts +264 -0
  186. package/vfx/index.js +260 -0
  187. package/vue/index.d.ts +440 -0
  188. package/vue/index.js +260 -0
  189. package/bundles/five.js +0 -2
  190. package/bundles/five.js.LICENSE.txt +0 -160
  191. package/docs/assets/css/main.css +0 -2660
  192. package/docs/assets/js/main.js +0 -248
  193. package/docs/assets/js/search.js +0 -1
  194. package/docs/classes/five.camera.html +0 -323
  195. package/docs/classes/five.five-1.html +0 -2670
  196. package/docs/classes/five.hashcubetexture.html +0 -252
  197. package/docs/classes/five.internalwebglrenderer.html +0 -212
  198. package/docs/classes/five.model.html +0 -982
  199. package/docs/classes/five.pbmgroup.html +0 -427
  200. package/docs/classes/five.pbmmaterial.html +0 -533
  201. package/docs/classes/five.pbmmesh.html +0 -254
  202. package/docs/classes/five.scene.html +0 -263
  203. package/docs/classes/five.subscribe.html +0 -569
  204. package/docs/classes/gltf_loader.gltfloader.html +0 -412
  205. package/docs/classes/gltf_loader.gltfobject.html +0 -287
  206. package/docs/classes/line.line-1.html +0 -381
  207. package/docs/classes/line.linegeometry.html +0 -524
  208. package/docs/classes/line.linematerial.html +0 -300
  209. package/docs/classes/line.linesegmentsgeometry.html +0 -471
  210. package/docs/classes/react.store.html +0 -605
  211. package/docs/classes/server.model.html +0 -823
  212. package/docs/classes/server.pbmgroup.html +0 -366
  213. package/docs/classes/server.pbmmesh.html +0 -335
  214. package/docs/classes/sticker.sticker-1.html +0 -465
  215. package/docs/interfaces/five.addableobject.html +0 -234
  216. package/docs/interfaces/five.depthpanoramacontrollercustominitargs.html +0 -420
  217. package/docs/interfaces/five.eventcallback.html +0 -2548
  218. package/docs/interfaces/five.fiveinitargs.html +0 -707
  219. package/docs/interfaces/five.floorplancontrollercustominitargs.html +0 -295
  220. package/docs/interfaces/five.imageoptions.html +0 -332
  221. package/docs/interfaces/five.intersection.html +0 -227
  222. package/docs/interfaces/five.intersectmeshinterface.html +0 -188
  223. package/docs/interfaces/five.modelcontrollercustominitargs.html +0 -366
  224. package/docs/interfaces/five.modeleventcallback.html +0 -367
  225. package/docs/interfaces/five.movepanooptions.html +0 -469
  226. package/docs/interfaces/five.panocirclemeshinterface.html +0 -361
  227. package/docs/interfaces/five.panoramacontrollercustominitargs.html +0 -464
  228. package/docs/interfaces/five.panoramalikecontrollercustominitargs.html +0 -364
  229. package/docs/interfaces/five.pbmparameters.html +0 -474
  230. package/docs/interfaces/five.pose.html +0 -270
  231. package/docs/interfaces/five.scissor.html +0 -252
  232. package/docs/interfaces/five.state.html +0 -300
  233. package/docs/interfaces/five.subscribemixintype.emit.html +0 -180
  234. package/docs/interfaces/five.subscribemixintype.haslistener.html +0 -171
  235. package/docs/interfaces/five.subscribemixintype.off.html +0 -198
  236. package/docs/interfaces/five.subscribemixintype.on.html +0 -213
  237. package/docs/interfaces/five.subscribemixintype.once.html +0 -210
  238. package/docs/interfaces/five.topviewcontrollercustominitargs.html +0 -226
  239. package/docs/interfaces/five.vrpanoramacontrollercustominitargs.html +0 -452
  240. package/docs/interfaces/gltf_loader.gltf.html +0 -304
  241. package/docs/interfaces/react.fiveactionreactcallbacks.html +0 -580
  242. package/docs/interfaces/react.fiveinjectiontypes.html +0 -1625
  243. package/docs/interfaces/react.injectfivetoprops.html +0 -280
  244. package/docs/interfaces/server.intersection.html +0 -308
  245. package/docs/interfaces/server.modeleventcallback.html +0 -409
  246. package/docs/interfaces/sticker.intersectionlike.html +0 -223
  247. package/docs/modules/five.subscribemixintype.html +0 -143
  248. package/five.js.LICENSE.txt +0 -160
  249. package/scripts/export-five-resource/chfs.exe +0 -0
  250. package/scripts/export-five-resource/fileify.js +0 -192
  251. package/scripts/export-five-resource/format-work.js +0 -71
  252. package/scripts/export-five-resource/staticify.js +0 -327
  253. package/scripts/transcode-model/BufferGeometryUtils.js +0 -832
  254. package/scripts/transcode-model/LoaderSupport.js +0 -1545
  255. package/scripts/transcode-model/MTLLoader.js +0 -602
  256. package/scripts/transcode-model/OBJLoader2.js +0 -1470
  257. package/scripts/transcode-model/obj2pbm.js +0 -65
@@ -0,0 +1,210 @@
1
+ const fs = require("fs");
2
+ const path = require("path");
3
+ const archiver = require("archiver");
4
+ const ejs = require("ejs");
5
+ const { parseWork } = require("@realsee/five/server");
6
+
7
+ function matchJsonpFunctionName(url) {
8
+ const regExps = [
9
+ /\.([0-9a-z]+)\.jsonp([\?\#].*)?$/i,
10
+ /jsonp_([0-9a-z]+)([\?\#].*)?$/i
11
+ ];
12
+ for (const regExp of regExps) {
13
+ const matched = url.match(regExp);
14
+ if (matched) {
15
+ return "jsonp_" + matched[1];
16
+ }
17
+ }
18
+ return null;
19
+ };
20
+
21
+ const CDN_PUBLIC_BASE = "//vrlab-public.ljcdn.com";
22
+ const CDN_IMAGE_BASE = "//vrlab-image4.ljcdn.com";
23
+ const CDN_TEST_PUBLIC_BASE = "//test-vr-public.realsee-cdn.com";
24
+ const CDN_TEST_IMAGE_BASE = "//test-vr-image.realsee-cdn.com";
25
+ function imageURL(url, size) {
26
+ if (url.indexOf(CDN_PUBLIC_BASE) >= 0) {
27
+ if (/\.(jpg|png)$/.test(url)) {
28
+ // 默认使用数据万象
29
+ // https://cloud.tencent.com/document/product/460/36544
30
+ if (size) {
31
+ let suffix = "?imageMogr2";
32
+ if (size) suffix += "/thumbnail/" + size + "x";
33
+ url = url.replace(CDN_PUBLIC_BASE, CDN_IMAGE_BASE) + suffix;
34
+ }
35
+ }
36
+ }
37
+ if (url.indexOf(CDN_TEST_PUBLIC_BASE) >= 0) {
38
+ if (/\.(jpg|png)$/.test(url)) {
39
+ // 默认使用数据万象
40
+ // https://cloud.tencent.com/document/product/460/36544
41
+ if (size) {
42
+ let suffix = "?imageMogr2";
43
+ if (size) suffix += "/thumbnail/" + size + "x";
44
+ url = url.replace(CDN_TEST_PUBLIC_BASE, CDN_TEST_IMAGE_BASE) + suffix;
45
+ }
46
+ }
47
+ }
48
+ return url;
49
+ }
50
+
51
+ async function download(url, jsonpHandleKey) {
52
+ const request = /^https\:/.test(url) ? require("https") : require("http");
53
+ return new Promise((resolve, reject) => {
54
+ const req = request.get(url, res => {
55
+ const mime = res.headers['content-type'];
56
+ const buffers = [];
57
+
58
+ res.on('data', chunk => buffers.push(chunk));
59
+ res.on('end', () => {
60
+ const contents = Buffer.concat(buffers);
61
+ if (jsonpHandleKey) {
62
+ const dataURL = `data:${mime};base64,${contents.toString('base64')}`;
63
+ const jsopContents = `window[${JSON.stringify(jsonpHandleKey)}] && window[${JSON.stringify(jsonpHandleKey)}](${JSON.stringify(dataURL)})`;
64
+ resolve(Buffer.from(jsopContents));
65
+ } else {
66
+ resolve(Buffer.from(contents));
67
+ }
68
+ })
69
+ res.on("error", () => reject(new Error(`fetch ${url} got error`)));
70
+ });
71
+ req.on("error", () => reject(new Error(`fetch ${url} got error`)));
72
+ })
73
+ }
74
+
75
+ const template = `
76
+ <!DOCTYPE html>
77
+ <html lang="en">
78
+ <head>
79
+ <meta charset="UTF-8">
80
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
81
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
82
+ <title>REALSEE PREVIEW</title>
83
+ <style>
84
+ * { margin: 0; padding: 0; }
85
+ html, body { height: 100%; width: 100%; overflow: hidden; }
86
+ #app { position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow: hidden; }
87
+ .buttons { position: fixed; top: 10px; left: 10px; pointer-events: none; }
88
+ .buttons h3 { margin-top: 10px; text-shadow: 0 0 2px rgba(255, 255, 255, 0.5); }
89
+ .buttons button { pointer-events: auto; display: block; font-size: 14px; color: #FFF; background: #5a6268; padding: 3px 10px; border: 1px solid #333; margin-right: 2px; border-radius: 2px; cursor: pointer; margin-top: 10px; }
90
+ .buttons button:active { background: #333; }
91
+ </style>
92
+ <script src="./three.min.js"></script>
93
+ <script src="./five.js"></script>
94
+ <script>const workJSON = <%- JSON.stringify(work_json) %></script>
95
+ </head>
96
+ <body>
97
+ <!-- 试图渲染容器 -->
98
+ <div id="app"></div>
99
+ <script>
100
+ const five = new FiveSDK.Five();
101
+ five.appendTo(document.getElementById("app"));
102
+ const work = FiveSDK.parseWork(workJSON, { baseURL: "./", shortPath: <%- JSON.stringify(short_path) %>, jsonp: <%- JSON.stringify(jsonp) %> });
103
+ five.load(work);
104
+
105
+ const modeButtons = [
106
+ { mode: "Panorama", label: "全景模式" },
107
+ { mode: "Floorplan", label: "模型纵览模式" },
108
+ { mode: "Topview", label: "模型俯视模式" },
109
+ { mode: "Model", label: "模型漫游模式" },
110
+ ];
111
+
112
+ const buttons = document.createElement("div");
113
+ buttons.className = "buttons";
114
+ document.body.appendChild(buttons);
115
+ buttons.appendChild(document.createElement("h3")).innerHTML = "模式控制";
116
+
117
+ // 模态按钮
118
+ for (let i = 0; i < modeButtons.length; i++) {
119
+ const button = document.createElement("button");
120
+ button.innerHTML = modeButtons[i].label;
121
+ button.addEventListener('click', () => {
122
+ // 通过 changeMode 方法可以切换模态
123
+ five.changeMode(FiveSDK.Five.Mode[modeButtons[i].mode]);
124
+ });
125
+ buttons.appendChild(button);
126
+ }
127
+ window.addEventListener("resize", () => five.refresh(), false);
128
+ </script>
129
+ </body>
130
+ </html>
131
+ `;
132
+
133
+ function getThreeJsBuffer() {
134
+ let tempPath = path.resolve(__dirname);
135
+ while (!(tempPath === '/' || tempPath === ".")) {
136
+ const threeFilePath = path.join(tempPath, "node_modules/three/build/three.min.js");
137
+ if (fs.existsSync(threeFilePath)) {
138
+ return fs.readFileSync(threeFilePath);
139
+ }
140
+ tempPath = path.dirname(tempPath);
141
+ }
142
+ throw new Error("three.js is not found");
143
+ }
144
+
145
+ function getFiveJsBuffer() {
146
+ return fs.readFileSync(path.join(__dirname, "../umd/five.js"));
147
+ }
148
+
149
+ async function staticify(work, output, shortPath = false, jsonp = false, preview = true) {
150
+ const zipFilename = /\.zip$/.test(output) ? output : output + ".zip";
151
+ const outputStream = fs.createWriteStream(zipFilename);
152
+ const archive = archiver("zip", { zlib: { level: 9 } });
153
+ archive.on("error", (err) => { throw err; });
154
+ outputStream.on("close", function() {
155
+ console.log(`zip ${archive.pointer()} total bytes`);
156
+ console.log(`dist ${zipFilename}`);
157
+ });
158
+ archive.pipe(outputStream);
159
+
160
+ const resources = [];
161
+ const workJSONObject = JSON.parse(fs.readFileSync(work, "utf8"));
162
+ parseWork(workJSONObject, { shortPath, jsonp }, (origin, _, relative, type) => {
163
+ resources.push({ origin, relative, type });
164
+ });
165
+
166
+ const textureCount = resources.filter(({ type }) => type === "texture").length;
167
+ let textureSize;
168
+ if (textureCount > 50) {
169
+ textureSize = 64;
170
+ } else if (textureCount > 40) {
171
+ textureSize = 128;
172
+ } else if (textureCount > 30) {
173
+ textureSize = 256;
174
+ } else if (textureCount > 15) {
175
+ textureSize = 512;
176
+ } else if (textureCount > 10) {
177
+ textureSize = 1024;
178
+ }
179
+ if (textureSize) {
180
+ for (const resource of resources) {
181
+ if (resource.type === "texture") {
182
+ resource.origin = imageURL(resource.origin, textureSize);
183
+ }
184
+ }
185
+ }
186
+ for (const { origin, relative } of resources) {
187
+ const buffer = await download(origin, matchJsonpFunctionName(relative));
188
+ console.log(`${origin} -> ${relative}`);
189
+ archive.append(buffer, { name: relative });
190
+ }
191
+ archive.append(fs.readFileSync(work), { name: "work.json" });
192
+
193
+ if (preview) {
194
+ archive.append(getFiveJsBuffer(), { name: "five.js" });
195
+ archive.append(getThreeJsBuffer(), { name: "three.min.js" });
196
+
197
+ const data = {
198
+ work_json: workJSONObject,
199
+ short_path: Boolean(shortPath),
200
+ jsonp: Boolean(jsonp),
201
+ };
202
+
203
+ const html = typeof preview === 'string' ? ejs.render(fs.readFileSync(preview, "utf8"), data) : ejs.render(template, data);
204
+ archive.append(html, { name: "index.html" });
205
+ }
206
+
207
+ archive.finalize();
208
+ }
209
+
210
+ module.exports = staticify;