babylon.octree.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. "use strict";
  2. var BABYLON = BABYLON || {};
  3. (function() {
  4. BABYLON.Octree = function(maxBlockCapacity) {
  5. this.blocks = [];
  6. this._maxBlockCapacity = maxBlockCapacity || 64;
  7. this._selection = new BABYLON.Tools.SmartArray(256);
  8. };
  9. // Methods
  10. BABYLON.Octree.prototype.update = function(worldMin, worldMax, meshes) {
  11. BABYLON.Octree._CreateBlocks(worldMin, worldMax, meshes, this._maxBlockCapacity, this);
  12. };
  13. BABYLON.Octree.prototype.addMesh = function (mesh) {
  14. for (var index = 0; index < this.blocks.length; index++) {
  15. var block = this.blocks[index];
  16. block.addMesh(mesh);
  17. }
  18. };
  19. BABYLON.Octree.prototype.select = function(frustumPlanes) {
  20. this._selection.reset();
  21. for (var index = 0; index < this.blocks.length; index++) {
  22. var block = this.blocks[index];
  23. block.select(frustumPlanes, this._selection);
  24. }
  25. return this._selection;
  26. };
  27. // Statics
  28. BABYLON.Octree._CreateBlocks = function (worldMin, worldMax, meshes, maxBlockCapacity, target) {
  29. target.blocks = [];
  30. var blockSize = new BABYLON.Vector3((worldMax.x - worldMin.x) / 2, (worldMax.y - worldMin.y) / 2, (worldMax.z - worldMin.z) / 2);
  31. // Segmenting space
  32. for (var x = 0; x < 2; x++) {
  33. for (var y = 0; y < 2; y++) {
  34. for (var z = 0; z < 2; z++) {
  35. var localMin = worldMin.add(blockSize.multiplyByFloats(x, y, z));
  36. var localMax = worldMin.add(blockSize.multiplyByFloats(x + 1, y + 1, z + 1));
  37. var block = new BABYLON.OctreeBlock(localMin, localMax, maxBlockCapacity);
  38. block.addEntries(meshes);
  39. target.blocks.push(block);
  40. }
  41. }
  42. }
  43. };
  44. })();