Potree.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. export * from "./Actions.js";
  2. export * from "./AnimationPath.js";
  3. export * from "./Annotation.js";
  4. export * from "./defines.js";
  5. export * from "./Enum.js";
  6. export * from "./EventDispatcher.js";
  7. export * from "./Features.js";
  8. export * from "./KeyCodes.js";
  9. export * from "./LRU.js";
  10. export * from "./PointCloudEptGeometry.js";
  11. export * from "./PointCloudOctree.js";
  12. export * from "./PointCloudOctreeGeometry.js";
  13. export * from "./PointCloudTree.js";
  14. export * from "./Points.js";
  15. export * from "./Potree_update_visibility.js";
  16. export * from "./PotreeRenderer.js";
  17. export * from "./ProfileRequest.js";
  18. export * from "./TextSprite.js";
  19. export * from "./utils.js";
  20. export * from "./Version.js";
  21. export * from "./WorkerPool.js";
  22. export * from "./XHRFactory.js";
  23. export * from "./viewer/SaveProject.js";
  24. export * from "./viewer/LoadProject.js";
  25. export * from "./materials/ClassificationScheme.js";
  26. export * from "./materials/EyeDomeLightingMaterial.js";
  27. export * from "./materials/Gradients.js";
  28. export * from "./materials/NormalizationEDLMaterial.js";
  29. export * from "./materials/NormalizationMaterial.js";
  30. export * from "./materials/PointCloudMaterial.js";
  31. export * from "./loader/POCLoader.js";
  32. export * from "./modules/loader/2.0/OctreeLoader.js";
  33. export * from "./loader/EptLoader.js";
  34. export * from "./loader/ept/BinaryLoader.js";
  35. export * from "./loader/ept/LaszipLoader.js";
  36. export * from "./loader/ept/ZstandardLoader.js";
  37. export * from "./loader/PointAttributes.js";
  38. export * from "./loader/ShapefileLoader.js";
  39. export * from "./loader/GeoPackageLoader.js";
  40. export * from "./utils/Box3Helper.js";
  41. export * from "./utils/ClippingTool.js";
  42. export * from "./utils/ClipVolume.js";
  43. export * from "./utils/GeoTIFF.js";
  44. export * from "./utils/Measure.js";
  45. export * from "./utils/MeasuringTool.js";
  46. export * from "./utils/Message.js";
  47. export * from "./utils/PointCloudSM.js";
  48. export * from "./utils/PolygonClipVolume.js";
  49. export * from "./utils/Profile.js";
  50. export * from "./utils/ProfileTool.js";
  51. export * from "./utils/ScreenBoxSelectTool.js";
  52. export * from "./utils/SpotLightHelper.js";
  53. export * from "./utils/TransformationTool.js";
  54. export * from "./utils/Volume.js";
  55. export * from "./utils/VolumeTool.js";
  56. export * from "./utils/Compass.js";
  57. export * from "./viewer/viewer.js";
  58. export * from "./viewer/Scene.js";
  59. export * from "./viewer/HierarchicalSlider.js";
  60. export * from "./modules/OrientedImages/OrientedImages.js";
  61. export * from "./modules/Images360/Images360.js";
  62. export * from "./modules/CameraAnimation/CameraAnimation.js";
  63. export * from "./modules/loader/2.0/OctreeLoader.js";
  64. export {OrbitControls} from "./navigation/OrbitControls.js";
  65. export {FirstPersonControls} from "./navigation/FirstPersonControls.js";
  66. export {EarthControls} from "./navigation/EarthControls.js";
  67. export {DeviceOrientationControls} from "./navigation/DeviceOrientationControls.js";
  68. export {VRControls} from "./navigation/VRControls.js";
  69. //add:
  70. export {Alignment} from "./modules/datasetAlignment/Alignment.js";
  71. export {config, settings} from "./settings.js";
  72. export {start} from "./start.js";
  73. import "./extensions/OrthographicCamera.js";
  74. import "./extensions/PerspectiveCamera.js";
  75. import "./extensions/Ray.js";
  76. import {LRU} from "./LRU.js";
  77. import {OctreeLoader} from "./modules/loader/2.0/OctreeLoader.js";
  78. import {POCLoader} from "./loader/POCLoader.js";
  79. import {EptLoader} from "./loader/EptLoader.js";
  80. import {PointCloudOctree} from "./PointCloudOctree.js";
  81. import {WorkerPool} from "./WorkerPool.js";
  82. export const workerPool = new WorkerPool();
  83. export const version = {
  84. major: 1,
  85. minor: 8,
  86. suffix: '.0'
  87. };
  88. export let lru = new LRU();
  89. console.log('Potree ' + version.major + '.' + version.minor + version.suffix);
  90. export let pointBudget = 1 * 1000 * 1000;
  91. export let framenumber = 0;
  92. export let numNodesLoading = 0;
  93. export let maxNodesLoading = 4;
  94. export const debug = {};
  95. let scriptPath = "";
  96. if (document.currentScript && document.currentScript.src) {
  97. scriptPath = new URL(document.currentScript.src + '/..').href;
  98. if (scriptPath.slice(-1) === '/') {
  99. scriptPath = scriptPath.slice(0, -1);
  100. }
  101. } else if(import.meta){
  102. scriptPath = new URL(import.meta.url + "/..").href;
  103. if (scriptPath.slice(-1) === '/') {
  104. scriptPath = scriptPath.slice(0, -1);
  105. }
  106. }else {
  107. console.error('Potree was unable to find its script path using document.currentScript. Is Potree included with a script tag? Does your browser support this function?');
  108. }
  109. let resourcePath = scriptPath + '/resources';
  110. // scriptPath: build/potree
  111. // resourcePath:build/potree/resources
  112. export {scriptPath, resourcePath};
  113. //add:
  114. export async function loadDatasets(path, callback){
  115. let response = await fetch(path);
  116. let text = await response.text();
  117. var data = JSON.parse(text)
  118. callback(data)
  119. }
  120. export function loadPointCloud(path, name, callback){
  121. let loaded = function(e){
  122. e.pointcloud.name = name;
  123. callback(e);
  124. };
  125. let promise = new Promise( resolve => {
  126. // load pointcloud
  127. if (!path){
  128. // TODO: callback? comment? Hello? Bueller? Anyone?
  129. } else if (path.indexOf('ept.json') > 0) {
  130. EptLoader.load(path, function(geometry) {
  131. if (!geometry) {
  132. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  133. }
  134. else {
  135. let pointcloud = new PointCloudOctree(geometry);
  136. //loaded(pointcloud);
  137. resolve({type: 'pointcloud_loaded', pointcloud: pointcloud});
  138. }
  139. });
  140. } else if (path.indexOf('cloud.js') > 0) {
  141. POCLoader.load(path, function (geometry) {
  142. if (!geometry) {
  143. //callback({type: 'loading_failed'});
  144. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  145. } else {
  146. let pointcloud = new PointCloudOctree(geometry);
  147. // loaded(pointcloud);
  148. resolve({type: 'pointcloud_loaded', pointcloud: pointcloud});
  149. }
  150. });
  151. } else if (path.indexOf('metadata.json') > 0) {
  152. Potree.OctreeLoader.load(path).then(e => {
  153. let geometry = e.geometry;
  154. if(!geometry){
  155. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  156. }else{
  157. let pointcloud = new PointCloudOctree(geometry);
  158. let aPosition = pointcloud.getAttribute("position");
  159. let material = pointcloud.material;
  160. material.elevationRange = [
  161. aPosition.range[0][2],
  162. aPosition.range[1][2],
  163. ];
  164. // loaded(pointcloud);
  165. resolve({type: 'pointcloud_loaded', pointcloud: pointcloud});
  166. }
  167. });
  168. OctreeLoader.load(path, function (geometry) {
  169. if (!geometry) {
  170. //callback({type: 'loading_failed'});
  171. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  172. } else {
  173. let pointcloud = new PointCloudOctree(geometry);
  174. // loaded(pointcloud);
  175. resolve({type: 'pointcloud_loaded', pointcloud: pointcloud});
  176. }
  177. });
  178. } else if (path.indexOf('.vpc') > 0) {
  179. PointCloudArena4DGeometry.load(path, function (geometry) {
  180. if (!geometry) {
  181. //callback({type: 'loading_failed'});
  182. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  183. } else {
  184. let pointcloud = new PointCloudArena4D(geometry);
  185. // loaded(pointcloud);
  186. resolve({type: 'pointcloud_loaded', pointcloud: pointcloud});
  187. }
  188. });
  189. } else {
  190. //callback({'type': 'loading_failed'});
  191. console.error(new Error(`failed to load point cloud from URL: ${path}`));
  192. }
  193. });
  194. if(callback){
  195. promise.then(pointcloud => {
  196. loaded(pointcloud);
  197. });
  198. }else{
  199. return promise;
  200. }
  201. };
  202. // add selectgroup
  203. (function($){
  204. $.fn.extend({
  205. selectgroup: function(args = {}){
  206. let elGroup = $(this);
  207. let rootID = elGroup.prop("id");
  208. let groupID = `${rootID}`;
  209. let groupTitle = (args.title !== undefined) ? args.title : "";
  210. let elButtons = [];
  211. elGroup.find("option").each((index, value) => {
  212. let buttonID = $(value).prop("id");
  213. let label = $(value).html();
  214. let optionValue = $(value).prop("value");
  215. let elButton = $(`
  216. <span style="flex-grow: 1; display: inherit">
  217. <label for="${buttonID}" class="ui-button" style="width: 100%; padding: .4em .1em">${label}</label>
  218. <input type="radio" name="${groupID}" id="${buttonID}" value="${optionValue}" style="display: none"/>
  219. </span>
  220. `);
  221. let elLabel = elButton.find("label");
  222. let elInput = elButton.find("input");
  223. elInput.change( () => {
  224. elGroup.find("label").removeClass("ui-state-active");
  225. elGroup.find("label").addClass("ui-state-default");
  226. if(elInput.is(":checked")){
  227. elLabel.addClass("ui-state-active");
  228. }else{
  229. //elLabel.addClass("ui-state-default");
  230. }
  231. });
  232. elButtons.push(elButton);
  233. });
  234. let elFieldset = $(`
  235. <fieldset style="border: none; margin: 0px; padding: 0px">
  236. <legend>${groupTitle}</legend>
  237. <span style="display: flex">
  238. </span>
  239. </fieldset>
  240. `);
  241. let elButtonContainer = elFieldset.find("span");
  242. for(let elButton of elButtons){
  243. elButtonContainer.append(elButton);
  244. }
  245. elButtonContainer.find("label").each( (index, value) => {
  246. $(value).css("margin", "0px");
  247. $(value).css("border-radius", "0px");
  248. $(value).css("border", "1px solid black");
  249. $(value).css("border-left", "none");
  250. });
  251. elButtonContainer.find("label:first").each( (index, value) => {
  252. $(value).css("border-radius", "4px 0px 0px 4px");
  253. });
  254. elButtonContainer.find("label:last").each( (index, value) => {
  255. $(value).css("border-radius", "0px 4px 4px 0px");
  256. $(value).css("border-left", "none");
  257. });
  258. elGroup.empty();
  259. elGroup.append(elFieldset);
  260. }
  261. });
  262. })(jQuery);