|
1 | 1 | var vec3 = require("gl-matrix").vec3;
|
2 | 2 |
|
| 3 | +var SORT_BY_DEPTH = "renderer-sort-opaque-objects"; |
| 4 | + |
| 5 | +var c_depthSortEnabled = true; |
| 6 | +XML3D.options.register(SORT_BY_DEPTH, false); |
| 7 | +XML3D.options.addObserver(SORT_BY_DEPTH, function() { |
| 8 | + c_depthSortEnabled = XML3D.options.getValue(SORT_BY_DEPTH); |
| 9 | +}); |
| 10 | + |
3 | 11 | /**
|
4 | 12 | *
|
5 | 13 | * @constructor
|
@@ -51,37 +59,42 @@ XML3D.extend(ObjectSorter.prototype, {
|
51 | 59 |
|
52 | 60 | // Sort opaque z-buckets by shader
|
53 | 61 | var opaque = {};
|
| 62 | + var ozl; |
54 | 63 | for (i=0; i<zLayers.length; i++) {
|
55 | 64 | zLayer = zLayers[i];
|
56 | 65 | opaque[zLayer] = {};
|
57 |
| - for (n in presortOpaque[zLayer]) { |
58 |
| - obj = presortOpaque[zLayer][n]; |
59 |
| - var program = obj.getProgram(); |
| 66 | + ozl = presortOpaque[zLayer]; |
| 67 | + for (var n in ozl) { |
| 68 | + obj = ozl[n]; |
| 69 | + var program = obj.getShaderClosure().program; |
60 | 70 | opaque[zLayer][program.id] = opaque[zLayer][program.id] || [];
|
61 | 71 | opaque[zLayer][program.id].push(obj);
|
62 | 72 | }
|
63 | 73 | }
|
64 | 74 |
|
65 |
| - // Sort opaque shader buckets by depth for early z fails |
66 |
| - for (zLayer in zLayers) { |
67 |
| - for (var progId in opaque[zLayer]) { |
68 |
| - var withinShader = opaque[zLayer][progId]; |
69 |
| - var sortedArray = new Array(withinShader.length); |
70 |
| - for (i = 0; i < withinShader.length; i++) { |
71 |
| - obj = withinShader[i]; |
72 |
| - obj.getWorldSpaceBoundingBox(c_bbox); |
73 |
| - c_bbox.center(c_center); |
74 |
| - viewMatrix && vec3.transformMat4(c_center, c_center, viewMatrix); |
75 |
| - sortedArray[i] = { |
76 |
| - obj: obj, depth: c_center.z |
77 |
| - }; |
| 75 | + |
| 76 | + if (c_depthSortEnabled) { |
| 77 | + // Sort opaque shader buckets by depth for early z fails |
| 78 | + for (zLayer in zLayers) { |
| 79 | + for (var progId in opaque[zLayer]) { |
| 80 | + var withinShader = opaque[zLayer][progId]; |
| 81 | + var sortedArray = new Array(withinShader.length); |
| 82 | + for (i = 0; i < withinShader.length; i++) { |
| 83 | + obj = withinShader[i]; |
| 84 | + obj.getWorldSpaceBoundingBox(c_bbox); |
| 85 | + c_bbox.center(c_center); |
| 86 | + viewMatrix && vec3.transformMat4(c_center, c_center, viewMatrix); |
| 87 | + sortedArray[i] = { |
| 88 | + obj: obj, depth: c_center.z |
| 89 | + }; |
| 90 | + } |
| 91 | + sortedArray.sort(function (a, b) { |
| 92 | + return b.depth - a.depth; |
| 93 | + }); |
| 94 | + opaque[zLayer][progId] = sortedArray.map(function (e) { |
| 95 | + return e.obj; |
| 96 | + }); |
78 | 97 | }
|
79 |
| - sortedArray.sort(function (a, b) { |
80 |
| - return b.depth - a.depth; |
81 |
| - }); |
82 |
| - opaque[zLayer][progId] = sortedArray.map(function (e) { |
83 |
| - return e.obj; |
84 |
| - }); |
85 | 98 | }
|
86 | 99 | }
|
87 | 100 |
|
|
0 commit comments