babylon.octree.js 1.8 KB

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