@woosh/meep-engine 2.72.0 → 2.73.0
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.
- package/build/meep.cjs +34 -185
- package/build/meep.min.js +1 -1
- package/build/meep.module.js +34 -185
- package/package.json +3 -2
- package/src/engine/graphics/ecs/camera/FrustumProjector.js +31 -182
- package/src/engine/graphics/texture/virtual/v2/NOTES.md +11 -1
- package/src/engine/graphics/texture/virtual/v2/ShaderUsage.js +7 -5
- package/src/engine/graphics/texture/virtual/v2/SparseTexture.js +182 -0
- package/src/engine/graphics/texture/virtual/v2/TextureTile.js +31 -0
- package/src/engine/graphics/texture/virtual/v2/TileLoader.js +215 -0
- package/src/engine/graphics/texture/virtual/v2/UsageDebugView.js +24 -11
- package/src/engine/graphics/texture/virtual/v2/UsageMetadata.js +77 -145
- package/src/engine/graphics/texture/virtual/v2/UsagePyramidDebugView.js +27 -14
- package/src/engine/graphics/texture/virtual/v2/VirtualTextureManager.js +13 -4
- package/src/engine/graphics/texture/virtual/v2/compose_finger_print.js +13 -0
- package/src/engine/graphics/texture/virtual/v2/finger_print_to_tile_index.js +37 -0
- package/src/engine/graphics/texture/virtual/v2/prototype.js +29 -11
- package/src/engine/graphics/texture/virtual/v2/tile_index_to_finger_print.js +31 -0
- package/src/engine/graphics/clouds/MaterialTransformer.js +0 -0
- package/src/engine/graphics/clouds/TerrainCloudsPlugin.js +0 -0
- package/src/engine/graphics/clouds/cs_build_fragment_shader.js +0 -0
- package/src/engine/graphics/clouds/cs_build_vertex_shader.js +0 -0
- package/src/engine/graphics/ecs/camera/TiltCameraController.js +0 -69
- package/src/engine/graphics/ecs/camera/is_valid_distance_value.js +0 -11
package/build/meep.module.js
CHANGED
|
@@ -111512,7 +111512,7 @@ function aabb3_matrix4_project_by_corners(
|
|
|
111512
111512
|
result[5] = z1;
|
|
111513
111513
|
}
|
|
111514
111514
|
|
|
111515
|
-
const corners = [];
|
|
111515
|
+
const corners$1 = [];
|
|
111516
111516
|
|
|
111517
111517
|
class Decal extends AbstractLight {
|
|
111518
111518
|
constructor() {
|
|
@@ -111598,9 +111598,9 @@ class Decal extends AbstractLight {
|
|
|
111598
111598
|
}
|
|
111599
111599
|
|
|
111600
111600
|
getAABB(result) {
|
|
111601
|
-
aabb3_build_corners(corners, 0, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5);
|
|
111601
|
+
aabb3_build_corners(corners$1, 0, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5);
|
|
111602
111602
|
|
|
111603
|
-
aabb3_matrix4_project_by_corners(result, corners, this.transform);
|
|
111603
|
+
aabb3_matrix4_project_by_corners(result, corners$1, this.transform);
|
|
111604
111604
|
}
|
|
111605
111605
|
|
|
111606
111606
|
toArray(destination, address) {
|
|
@@ -113432,190 +113432,41 @@ class ForwardPlusRenderingPlugin extends EnginePlugin {
|
|
|
113432
113432
|
*/
|
|
113433
113433
|
|
|
113434
113434
|
|
|
113435
|
-
const
|
|
113436
|
-
|
|
113437
|
-
|
|
113438
|
-
new Vector3(-1, -1, 0),
|
|
113435
|
+
const corners = [
|
|
113436
|
+
new Vector3(-1, -1, 0),
|
|
113437
|
+
new Vector3(-1, -1, 0),
|
|
113439
113438
|
|
|
113440
|
-
|
|
113441
|
-
|
|
113439
|
+
new Vector3(-1, 1, 0),
|
|
113440
|
+
new Vector3(-1, 1, 0),
|
|
113442
113441
|
|
|
113443
|
-
|
|
113444
|
-
|
|
113442
|
+
new Vector3(1, -1, 0),
|
|
113443
|
+
new Vector3(1, -1, 0),
|
|
113445
113444
|
|
|
113446
|
-
|
|
113447
|
-
|
|
113448
|
-
|
|
113449
|
-
|
|
113450
|
-
|
|
113451
|
-
/**
|
|
113452
|
-
*
|
|
113453
|
-
* @param {Number} nearZ
|
|
113454
|
-
* @param {Number} farZ
|
|
113455
|
-
* @param {THREE.Camera} camera
|
|
113456
|
-
* @param {THREE.Matrix4} matrixWorldInverse
|
|
113457
|
-
* @param {function} callback
|
|
113458
|
-
*/
|
|
113459
|
-
function projectInWorldSpace(nearZ, farZ, camera, callback) {
|
|
113460
|
-
corners[0].set(-1, -1, nearZ);
|
|
113461
|
-
corners[1].set(-1, -1, farZ);
|
|
113462
|
-
|
|
113463
|
-
corners[2].set(-1, 1, nearZ);
|
|
113464
|
-
corners[3].set(-1, 1, farZ);
|
|
113465
|
-
|
|
113466
|
-
corners[4].set(1, -1, nearZ);
|
|
113467
|
-
corners[5].set(1, -1, farZ);
|
|
113468
|
-
|
|
113469
|
-
corners[6].set(1, 1, nearZ);
|
|
113470
|
-
corners[7].set(1, 1, farZ);
|
|
113471
|
-
|
|
113472
|
-
//compute corners of view frustum in light space
|
|
113473
|
-
let x0 = Number.POSITIVE_INFINITY;
|
|
113474
|
-
let y0 = Number.POSITIVE_INFINITY;
|
|
113475
|
-
let z0 = Number.POSITIVE_INFINITY;
|
|
113476
|
-
|
|
113477
|
-
let x1 = Number.NEGATIVE_INFINITY;
|
|
113478
|
-
let y1 = Number.NEGATIVE_INFINITY;
|
|
113479
|
-
let z1 = Number.NEGATIVE_INFINITY;
|
|
113480
|
-
|
|
113481
|
-
|
|
113482
|
-
for (let i = 0; i < 8; i++) {
|
|
113483
|
-
const corner = corners[i];
|
|
113484
|
-
corner.unproject(camera);
|
|
113485
|
-
|
|
113486
|
-
if (corner.x < x0) {
|
|
113487
|
-
x0 = corner.x;
|
|
113488
|
-
}
|
|
113489
|
-
if (corner.x > x1) {
|
|
113490
|
-
x1 = corner.x;
|
|
113491
|
-
}
|
|
113492
|
-
|
|
113493
|
-
if (corner.y < y0) {
|
|
113494
|
-
y0 = corner.y;
|
|
113495
|
-
}
|
|
113496
|
-
if (corner.y > y1) {
|
|
113497
|
-
y1 = corner.y;
|
|
113498
|
-
}
|
|
113499
|
-
|
|
113500
|
-
if (corner.z < z0) {
|
|
113501
|
-
z0 = corner.z;
|
|
113502
|
-
}
|
|
113503
|
-
if (corner.z > z1) {
|
|
113504
|
-
z1 = corner.z;
|
|
113505
|
-
}
|
|
113506
|
-
}
|
|
113507
|
-
|
|
113508
|
-
callback(x0, y0, z0, x1, y1, z1);
|
|
113509
|
-
}
|
|
113510
|
-
|
|
113511
|
-
return projectInWorldSpace;
|
|
113512
|
-
})();
|
|
113513
|
-
|
|
113514
|
-
const project = (function () {
|
|
113515
|
-
const corners = [
|
|
113516
|
-
new Vector3(-1, -1, 0),
|
|
113517
|
-
new Vector3(-1, -1, 0),
|
|
113518
|
-
|
|
113519
|
-
new Vector3(-1, 1, 0),
|
|
113520
|
-
new Vector3(-1, 1, 0),
|
|
113521
|
-
|
|
113522
|
-
new Vector3(1, -1, 0),
|
|
113523
|
-
new Vector3(1, -1, 0),
|
|
113524
|
-
|
|
113525
|
-
new Vector3(1, 1, 0),
|
|
113526
|
-
new Vector3(1, 1, 0)
|
|
113527
|
-
];
|
|
113528
|
-
|
|
113529
|
-
|
|
113530
|
-
/**
|
|
113531
|
-
*
|
|
113532
|
-
* @param {Number} nearZ
|
|
113533
|
-
* @param {Number} farZ
|
|
113534
|
-
* @param {THREE.Camera} camera
|
|
113535
|
-
* @param {THREE.Matrix4} matrixWorldInverse
|
|
113536
|
-
* @param {AABB3} result
|
|
113537
|
-
*/
|
|
113538
|
-
function project(nearZ, farZ, camera, matrixWorldInverse, result) {
|
|
113539
|
-
corners[0].set(-1, -1, nearZ);
|
|
113540
|
-
corners[1].set(-1, -1, farZ);
|
|
113541
|
-
|
|
113542
|
-
corners[2].set(-1, 1, nearZ);
|
|
113543
|
-
corners[3].set(-1, 1, farZ);
|
|
113544
|
-
|
|
113545
|
-
corners[4].set(1, -1, nearZ);
|
|
113546
|
-
corners[5].set(1, -1, farZ);
|
|
113547
|
-
|
|
113548
|
-
corners[6].set(1, 1, nearZ);
|
|
113549
|
-
corners[7].set(1, 1, farZ);
|
|
113550
|
-
|
|
113551
|
-
//compute corners of view frustum in light space
|
|
113552
|
-
let x0 = Number.POSITIVE_INFINITY;
|
|
113553
|
-
let y0 = Number.POSITIVE_INFINITY;
|
|
113554
|
-
let z0 = Number.POSITIVE_INFINITY;
|
|
113555
|
-
|
|
113556
|
-
let x1 = Number.NEGATIVE_INFINITY;
|
|
113557
|
-
let y1 = Number.NEGATIVE_INFINITY;
|
|
113558
|
-
let z1 = Number.NEGATIVE_INFINITY;
|
|
113559
|
-
|
|
113560
|
-
|
|
113561
|
-
for (let i = 0; i < 8; i++) {
|
|
113562
|
-
const corner = corners[i];
|
|
113563
|
-
corner.unproject(camera);
|
|
113564
|
-
corner.applyMatrix4(matrixWorldInverse);
|
|
113565
|
-
|
|
113566
|
-
if (corner.x < x0) {
|
|
113567
|
-
x0 = corner.x;
|
|
113568
|
-
}
|
|
113569
|
-
if (corner.x > x1) {
|
|
113570
|
-
x1 = corner.x;
|
|
113571
|
-
}
|
|
113572
|
-
|
|
113573
|
-
if (corner.y < y0) {
|
|
113574
|
-
y0 = corner.y;
|
|
113575
|
-
}
|
|
113576
|
-
if (corner.y > y1) {
|
|
113577
|
-
y1 = corner.y;
|
|
113578
|
-
}
|
|
113579
|
-
|
|
113580
|
-
if (corner.z < z0) {
|
|
113581
|
-
z0 = corner.z;
|
|
113582
|
-
}
|
|
113583
|
-
if (corner.z > z1) {
|
|
113584
|
-
z1 = corner.z;
|
|
113585
|
-
}
|
|
113586
|
-
}
|
|
113587
|
-
|
|
113588
|
-
result.setBounds(x0, y0, z0, x1, y1, z1);
|
|
113589
|
-
}
|
|
113445
|
+
new Vector3(1, 1, 0),
|
|
113446
|
+
new Vector3(1, 1, 0)
|
|
113447
|
+
];
|
|
113590
113448
|
|
|
113591
|
-
return project;
|
|
113592
|
-
})();
|
|
113593
113449
|
|
|
113594
113450
|
/**
|
|
113595
113451
|
*
|
|
113596
|
-
* @param
|
|
113597
|
-
* @param
|
|
113598
|
-
* @param
|
|
113599
|
-
* @param
|
|
113600
|
-
* @param
|
|
113601
|
-
* @param _z1
|
|
113602
|
-
* @param {Camera} camera
|
|
113603
|
-
* @param callback
|
|
113452
|
+
* @param {Number} nearZ
|
|
113453
|
+
* @param {Number} farZ
|
|
113454
|
+
* @param {THREE.Camera} camera
|
|
113455
|
+
* @param {THREE.Matrix4} matrixWorldInverse
|
|
113456
|
+
* @param {AABB3} result
|
|
113604
113457
|
*/
|
|
113605
|
-
function
|
|
113606
|
-
|
|
113607
|
-
|
|
113608
|
-
new Vector3(_x0, _y0, _z1),
|
|
113458
|
+
function project(nearZ, farZ, camera, matrixWorldInverse, result) {
|
|
113459
|
+
corners[0].set(-1, -1, nearZ);
|
|
113460
|
+
corners[1].set(-1, -1, farZ);
|
|
113609
113461
|
|
|
113610
|
-
|
|
113611
|
-
|
|
113462
|
+
corners[2].set(-1, 1, nearZ);
|
|
113463
|
+
corners[3].set(-1, 1, farZ);
|
|
113612
113464
|
|
|
113613
|
-
|
|
113614
|
-
|
|
113465
|
+
corners[4].set(1, -1, nearZ);
|
|
113466
|
+
corners[5].set(1, -1, farZ);
|
|
113615
113467
|
|
|
113616
|
-
|
|
113617
|
-
|
|
113618
|
-
];
|
|
113468
|
+
corners[6].set(1, 1, nearZ);
|
|
113469
|
+
corners[7].set(1, 1, farZ);
|
|
113619
113470
|
|
|
113620
113471
|
//compute corners of view frustum in light space
|
|
113621
113472
|
let x0 = Number.POSITIVE_INFINITY;
|
|
@@ -113627,8 +113478,10 @@ function unproject(_x0, _y0, _z0, _x1, _y1, _z1, camera, callback) {
|
|
|
113627
113478
|
let z1 = Number.NEGATIVE_INFINITY;
|
|
113628
113479
|
|
|
113629
113480
|
|
|
113630
|
-
|
|
113631
|
-
corner
|
|
113481
|
+
for (let i = 0; i < 8; i++) {
|
|
113482
|
+
const corner = corners[i];
|
|
113483
|
+
corner.unproject(camera);
|
|
113484
|
+
corner.applyMatrix4(matrixWorldInverse);
|
|
113632
113485
|
|
|
113633
113486
|
if (corner.x < x0) {
|
|
113634
113487
|
x0 = corner.x;
|
|
@@ -113650,21 +113503,17 @@ function unproject(_x0, _y0, _z0, _x1, _y1, _z1, camera, callback) {
|
|
|
113650
113503
|
if (corner.z > z1) {
|
|
113651
113504
|
z1 = corner.z;
|
|
113652
113505
|
}
|
|
113653
|
-
}
|
|
113506
|
+
}
|
|
113654
113507
|
|
|
113655
|
-
|
|
113508
|
+
result.setBounds(x0, y0, z0, x1, y1, z1);
|
|
113656
113509
|
}
|
|
113657
113510
|
|
|
113511
|
+
|
|
113658
113512
|
var FrustumProjector = {
|
|
113659
113513
|
/**
|
|
113660
113514
|
* @deprecated use non-threejs specific code
|
|
113661
113515
|
*/
|
|
113662
113516
|
project,
|
|
113663
|
-
unproject,
|
|
113664
|
-
/**
|
|
113665
|
-
* @deprecated use non-threejs specific code
|
|
113666
|
-
*/
|
|
113667
|
-
projectInWorldSpace
|
|
113668
113517
|
};
|
|
113669
113518
|
|
|
113670
113519
|
class SystemEntityContext {
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"description": "Fully featured ECS game engine written in JavaScript",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"author": "Alexander Goldring",
|
|
8
|
-
"version": "2.
|
|
8
|
+
"version": "2.73.0",
|
|
9
9
|
"main": "build/meep.module.js",
|
|
10
10
|
"module": "build/meep.module.js",
|
|
11
11
|
"exports": {
|
|
@@ -39,7 +39,8 @@
|
|
|
39
39
|
"gl-matrix": "3.4.3",
|
|
40
40
|
"opentype.js": "1.3.3",
|
|
41
41
|
"robust-predicates": "3.0.1",
|
|
42
|
-
"simplex-noise": "2.4.0"
|
|
42
|
+
"simplex-noise": "2.4.0",
|
|
43
|
+
"pako": "2.0.3"
|
|
43
44
|
},
|
|
44
45
|
"peerDependencies": {
|
|
45
46
|
"three": ">=0.135.0 & <0.137.0"
|
|
@@ -6,190 +6,41 @@
|
|
|
6
6
|
import { Vector3 as ThreeVector3 } from 'three';
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
new ThreeVector3(-1, -1, 0),
|
|
9
|
+
const corners = [
|
|
10
|
+
new ThreeVector3(-1, -1, 0),
|
|
11
|
+
new ThreeVector3(-1, -1, 0),
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
new ThreeVector3(-1, 1, 0),
|
|
14
|
+
new ThreeVector3(-1, 1, 0),
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
new ThreeVector3(1, -1, 0),
|
|
17
|
+
new ThreeVector3(1, -1, 0),
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
new ThreeVector3(1, 1, 0),
|
|
20
|
+
new ThreeVector3(1, 1, 0)
|
|
21
|
+
];
|
|
23
22
|
|
|
24
23
|
|
|
25
|
-
/**
|
|
26
|
-
*
|
|
27
|
-
* @param {Number} nearZ
|
|
28
|
-
* @param {Number} farZ
|
|
29
|
-
* @param {THREE.Camera} camera
|
|
30
|
-
* @param {THREE.Matrix4} matrixWorldInverse
|
|
31
|
-
* @param {function} callback
|
|
32
|
-
*/
|
|
33
|
-
function projectInWorldSpace(nearZ, farZ, camera, callback) {
|
|
34
|
-
corners[0].set(-1, -1, nearZ);
|
|
35
|
-
corners[1].set(-1, -1, farZ);
|
|
36
|
-
|
|
37
|
-
corners[2].set(-1, 1, nearZ);
|
|
38
|
-
corners[3].set(-1, 1, farZ);
|
|
39
|
-
|
|
40
|
-
corners[4].set(1, -1, nearZ);
|
|
41
|
-
corners[5].set(1, -1, farZ);
|
|
42
|
-
|
|
43
|
-
corners[6].set(1, 1, nearZ);
|
|
44
|
-
corners[7].set(1, 1, farZ);
|
|
45
|
-
|
|
46
|
-
//compute corners of view frustum in light space
|
|
47
|
-
let x0 = Number.POSITIVE_INFINITY;
|
|
48
|
-
let y0 = Number.POSITIVE_INFINITY;
|
|
49
|
-
let z0 = Number.POSITIVE_INFINITY;
|
|
50
|
-
|
|
51
|
-
let x1 = Number.NEGATIVE_INFINITY;
|
|
52
|
-
let y1 = Number.NEGATIVE_INFINITY;
|
|
53
|
-
let z1 = Number.NEGATIVE_INFINITY;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
for (let i = 0; i < 8; i++) {
|
|
57
|
-
const corner = corners[i];
|
|
58
|
-
corner.unproject(camera);
|
|
59
|
-
|
|
60
|
-
if (corner.x < x0) {
|
|
61
|
-
x0 = corner.x;
|
|
62
|
-
}
|
|
63
|
-
if (corner.x > x1) {
|
|
64
|
-
x1 = corner.x;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (corner.y < y0) {
|
|
68
|
-
y0 = corner.y;
|
|
69
|
-
}
|
|
70
|
-
if (corner.y > y1) {
|
|
71
|
-
y1 = corner.y;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (corner.z < z0) {
|
|
75
|
-
z0 = corner.z;
|
|
76
|
-
}
|
|
77
|
-
if (corner.z > z1) {
|
|
78
|
-
z1 = corner.z;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
callback(x0, y0, z0, x1, y1, z1);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return projectInWorldSpace;
|
|
86
|
-
})();
|
|
87
|
-
|
|
88
|
-
const project = (function () {
|
|
89
|
-
const corners = [
|
|
90
|
-
new ThreeVector3(-1, -1, 0),
|
|
91
|
-
new ThreeVector3(-1, -1, 0),
|
|
92
|
-
|
|
93
|
-
new ThreeVector3(-1, 1, 0),
|
|
94
|
-
new ThreeVector3(-1, 1, 0),
|
|
95
|
-
|
|
96
|
-
new ThreeVector3(1, -1, 0),
|
|
97
|
-
new ThreeVector3(1, -1, 0),
|
|
98
|
-
|
|
99
|
-
new ThreeVector3(1, 1, 0),
|
|
100
|
-
new ThreeVector3(1, 1, 0)
|
|
101
|
-
];
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
*
|
|
106
|
-
* @param {Number} nearZ
|
|
107
|
-
* @param {Number} farZ
|
|
108
|
-
* @param {THREE.Camera} camera
|
|
109
|
-
* @param {THREE.Matrix4} matrixWorldInverse
|
|
110
|
-
* @param {AABB3} result
|
|
111
|
-
*/
|
|
112
|
-
function project(nearZ, farZ, camera, matrixWorldInverse, result) {
|
|
113
|
-
corners[0].set(-1, -1, nearZ);
|
|
114
|
-
corners[1].set(-1, -1, farZ);
|
|
115
|
-
|
|
116
|
-
corners[2].set(-1, 1, nearZ);
|
|
117
|
-
corners[3].set(-1, 1, farZ);
|
|
118
|
-
|
|
119
|
-
corners[4].set(1, -1, nearZ);
|
|
120
|
-
corners[5].set(1, -1, farZ);
|
|
121
|
-
|
|
122
|
-
corners[6].set(1, 1, nearZ);
|
|
123
|
-
corners[7].set(1, 1, farZ);
|
|
124
|
-
|
|
125
|
-
//compute corners of view frustum in light space
|
|
126
|
-
let x0 = Number.POSITIVE_INFINITY;
|
|
127
|
-
let y0 = Number.POSITIVE_INFINITY;
|
|
128
|
-
let z0 = Number.POSITIVE_INFINITY;
|
|
129
|
-
|
|
130
|
-
let x1 = Number.NEGATIVE_INFINITY;
|
|
131
|
-
let y1 = Number.NEGATIVE_INFINITY;
|
|
132
|
-
let z1 = Number.NEGATIVE_INFINITY;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
for (let i = 0; i < 8; i++) {
|
|
136
|
-
const corner = corners[i];
|
|
137
|
-
corner.unproject(camera);
|
|
138
|
-
corner.applyMatrix4(matrixWorldInverse);
|
|
139
|
-
|
|
140
|
-
if (corner.x < x0) {
|
|
141
|
-
x0 = corner.x;
|
|
142
|
-
}
|
|
143
|
-
if (corner.x > x1) {
|
|
144
|
-
x1 = corner.x;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
if (corner.y < y0) {
|
|
148
|
-
y0 = corner.y;
|
|
149
|
-
}
|
|
150
|
-
if (corner.y > y1) {
|
|
151
|
-
y1 = corner.y;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (corner.z < z0) {
|
|
155
|
-
z0 = corner.z;
|
|
156
|
-
}
|
|
157
|
-
if (corner.z > z1) {
|
|
158
|
-
z1 = corner.z;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
result.setBounds(x0, y0, z0, x1, y1, z1);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return project;
|
|
166
|
-
})();
|
|
167
|
-
|
|
168
24
|
/**
|
|
169
25
|
*
|
|
170
|
-
* @param
|
|
171
|
-
* @param
|
|
172
|
-
* @param
|
|
173
|
-
* @param
|
|
174
|
-
* @param
|
|
175
|
-
* @param _z1
|
|
176
|
-
* @param {Camera} camera
|
|
177
|
-
* @param callback
|
|
26
|
+
* @param {Number} nearZ
|
|
27
|
+
* @param {Number} farZ
|
|
28
|
+
* @param {THREE.Camera} camera
|
|
29
|
+
* @param {THREE.Matrix4} matrixWorldInverse
|
|
30
|
+
* @param {AABB3} result
|
|
178
31
|
*/
|
|
179
|
-
function
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
new ThreeVector3(_x0, _y0, _z1),
|
|
32
|
+
function project(nearZ, farZ, camera, matrixWorldInverse, result) {
|
|
33
|
+
corners[0].set(-1, -1, nearZ);
|
|
34
|
+
corners[1].set(-1, -1, farZ);
|
|
183
35
|
|
|
184
|
-
|
|
185
|
-
|
|
36
|
+
corners[2].set(-1, 1, nearZ);
|
|
37
|
+
corners[3].set(-1, 1, farZ);
|
|
186
38
|
|
|
187
|
-
|
|
188
|
-
|
|
39
|
+
corners[4].set(1, -1, nearZ);
|
|
40
|
+
corners[5].set(1, -1, farZ);
|
|
189
41
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
];
|
|
42
|
+
corners[6].set(1, 1, nearZ);
|
|
43
|
+
corners[7].set(1, 1, farZ);
|
|
193
44
|
|
|
194
45
|
//compute corners of view frustum in light space
|
|
195
46
|
let x0 = Number.POSITIVE_INFINITY;
|
|
@@ -201,8 +52,10 @@ function unproject(_x0, _y0, _z0, _x1, _y1, _z1, camera, callback) {
|
|
|
201
52
|
let z1 = Number.NEGATIVE_INFINITY;
|
|
202
53
|
|
|
203
54
|
|
|
204
|
-
|
|
205
|
-
corner
|
|
55
|
+
for (let i = 0; i < 8; i++) {
|
|
56
|
+
const corner = corners[i];
|
|
57
|
+
corner.unproject(camera);
|
|
58
|
+
corner.applyMatrix4(matrixWorldInverse);
|
|
206
59
|
|
|
207
60
|
if (corner.x < x0) {
|
|
208
61
|
x0 = corner.x;
|
|
@@ -224,19 +77,15 @@ function unproject(_x0, _y0, _z0, _x1, _y1, _z1, camera, callback) {
|
|
|
224
77
|
if (corner.z > z1) {
|
|
225
78
|
z1 = corner.z;
|
|
226
79
|
}
|
|
227
|
-
}
|
|
80
|
+
}
|
|
228
81
|
|
|
229
|
-
|
|
82
|
+
result.setBounds(x0, y0, z0, x1, y1, z1);
|
|
230
83
|
}
|
|
231
84
|
|
|
85
|
+
|
|
232
86
|
export default {
|
|
233
87
|
/**
|
|
234
88
|
* @deprecated use non-threejs specific code
|
|
235
89
|
*/
|
|
236
90
|
project,
|
|
237
|
-
unproject,
|
|
238
|
-
/**
|
|
239
|
-
* @deprecated use non-threejs specific code
|
|
240
|
-
*/
|
|
241
|
-
projectInWorldSpace
|
|
242
91
|
};
|
|
@@ -14,4 +14,14 @@ The original texture is mip-mapped, down to the size of a single tile, for the s
|
|
|
14
14
|
|
|
15
15
|
This is achieved by pre-rendering the scene with a special shader that records UV and mip-level information, which we call `Usage`, this is then analysed to build a list of used tiles (mip level, x, y) and by counting occurrence of this tile in the `Usage` texture we get a much more useful data structure.
|
|
16
16
|
|
|
17
|
-
Based on the `Usage` data, we populate our `Physical` texture of pages, and based on what's currently in the `Physical` texture - we populate the `Reference` texture that stores information about the entire mip pyramid, and for each tile contains a pointer to the `Physical` texture, where representative tile can be found.
|
|
17
|
+
Based on the `Usage` data, we populate our `Physical` texture of pages, and based on what's currently in the `Physical` texture - we populate the `Reference` texture that stores information about the entire mip pyramid, and for each tile contains a pointer to the `Physical` texture, where representative tile can be found.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
## Considerations
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### Filtering
|
|
24
|
+
|
|
25
|
+
Most papers suggest introducing a border into each tile of ~4 pixels.
|
|
26
|
+
4 pixel border on a 128x128 pixel tile is going to take up 12.1% of space, which is quite a lot.
|
|
27
|
+
We can do filtering in software, that is - sample individual pixels and perform interpolation inside the shader.
|
|
@@ -34,13 +34,15 @@ function fragment() {
|
|
|
34
34
|
|
|
35
35
|
float MTCalculateMipLevel( const in vec2 uv, const in float bias ) {
|
|
36
36
|
|
|
37
|
-
float scale_x = float(u_mt_tex.x)
|
|
38
|
-
float scale_y = float(u_mt_tex.y)
|
|
37
|
+
float scale_x = float(u_mt_tex.x) ;
|
|
38
|
+
float scale_y = float(u_mt_tex.y) ;
|
|
39
39
|
|
|
40
|
-
vec2 dx = dFdx( uv * scale_x);
|
|
41
|
-
vec2 dy = dFdy( uv * scale_y);
|
|
40
|
+
vec2 dx = dFdx( uv * scale_x)/ u_mt_viewport_size.x;
|
|
41
|
+
vec2 dy = dFdy( uv * scale_y)/ u_mt_viewport_size.y;
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
float d = max( dot( dx, dx ), dot( dy, dy ) );
|
|
44
|
+
|
|
45
|
+
return log2( d ) * 0.5 + bias;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
uvec4 MTCalculateTileKeyRGBA( const in vec2 uv ) {
|