Skip to content

Commit 56293b7

Browse files
committed
Merge branch 'hotfix-5.2.1'
2 parents 1ddb476 + dae294e commit 56293b7

28 files changed

+311
-200
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "xml3d.js",
33
"description": "XML3D implementation based on JS and WebGL",
44
"homepage": "http://ww.xml3d.org",
5-
"version": "5.2.0",
5+
"version": "5.2.1",
66
"repository": {
77
"type": "git",
88
"url": "https://github.com/xml3d/xml3d.js"

src/interface/configuration.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ classInfo['xml3d'] = {
9898
getWorldBoundingBox : {m: methods.getWorldBoundingBox},
9999
getLocalBoundingBox : {m: methods.getLocalBoundingBox},
100100
getRenderInterface : {m: methods.xml3dGetRenderInterface},
101-
view : {a: handlers.StringAttributeHandler, params: {defaultValue: "view"}}
101+
view : {a: handlers.StringAttributeHandler}
102102
};
103103

104104
classInfo['compute'] = {

src/interface/elements.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,10 @@ function handleNodeRemoved(node, mutation) {
102102
function removeRecursive(element, evt) {
103103
if(element._configured) {
104104
Resource.notifyNodeIdChange(element, element.id, null);
105-
element._configured.notify(evt);
105+
//Deleting _configured early ensures the adapters are not re-used accidentally during any getAdapter calls from here on
106+
var conf = element._configured;
106107
delete element._configured;
108+
conf.notify(evt);
107109
}
108110
var child = element.firstElementChild;
109111
while(child) {

src/renderer/renderer/adapter/view.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,20 @@ XML3D.createClass(ViewRenderAdapter, SceneElementAdapter, {
5656
return m;
5757
},
5858

59+
getRootAdapter: function() {
60+
var parent = this.getParentRenderAdapter();
61+
var nextParent;
62+
while ((nextParent = parent.getParentRenderAdapter()) !== null) {
63+
parent = nextParent;
64+
}
65+
return parent;
66+
},
67+
68+
dispose: function() {
69+
this.getRootAdapter().activeViewChanged();
70+
SceneElementAdapter.prototype.dispose.call(this);
71+
},
72+
5973
attributeChangedCallback: function (name, oldValue, newValue) {
6074
SceneElementAdapter.prototype.attributeChangedCallback.call(this, name, oldValue, newValue);
6175
switch (name) {

src/renderer/renderer/adapter/xml3d.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,17 +178,31 @@ XML3DRenderAdapter.prototype.getElementByRay = (function () {
178178
* @param {!Object} xml3d
179179
* @return {Object} the active view element
180180
*/
181+
var c_viewCounter = 0;
181182
function getOrCreateActiveView(xml3d) {
182183
// try to resolve reference
183-
var view = xml3d.querySelector(xml3d.view) || xml3d.querySelector("view");
184-
if (!view) {
185-
// didn't find any: create new one
186-
XML3D.debug.logWarning("xml3d element has no view defined: creating one.");
187-
188-
view = xml3d.ownerDocument.createElement("view");
189-
xml3d.appendChild(view);
190-
xml3d.removeAttribute("view");
184+
var viewId = xml3d.view;
185+
if (viewId) {
186+
return xml3d.querySelector(viewId);
191187
}
188+
189+
var view = xml3d.querySelector("view");
190+
if (view) {
191+
if (!view.hasAttribute("id")) {
192+
view.setAttribute("id", "Generated_View_"+c_viewCounter++);
193+
}
194+
xml3d.setAttribute("view", "#"+view.getAttribute("id"));
195+
return view;
196+
}
197+
198+
// didn't find any: create new one
199+
XML3D.debug.logWarning("xml3d element has no view defined: creating one.");
200+
201+
view = xml3d.ownerDocument.createElement("view");
202+
view.setAttribute("id", "Generated_View_"+c_viewCounter++);
203+
xml3d.appendChild(view);
204+
xml3d.setAttribute("view", "#"+view.getAttribute("id"));
205+
192206
return view;
193207
};
194208

src/renderer/renderer/scene/renderobject.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,16 +309,16 @@ XML3D.createClass(RenderObject, RenderNode, {
309309
this.setBoundingBoxDirty();
310310
},
311311

312-
getProgram: function () {
313-
return this.drawable.getProgram();
312+
getShaderClosure: function () {
313+
return this.drawable.getShaderClosure();
314314
},
315315

316316
hasTransparency: function () {
317317
if (this.override && this.override.opacity !== undefined) {
318318
return this.override.opacity[0] < 1;
319319
}
320-
var program = this.getProgram();
321-
return program ? program.hasTransparency() : false;
320+
var shader = this.getShaderClosure();
321+
return shader ? shader.hasTransparency() : false;
322322
},
323323

324324
updateForRendering: function () {

src/renderer/renderer/tools/objectsorter.js

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
var vec3 = require("gl-matrix").vec3;
22

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+
311
/**
412
*
513
* @constructor
@@ -51,37 +59,42 @@ XML3D.extend(ObjectSorter.prototype, {
5159

5260
// Sort opaque z-buckets by shader
5361
var opaque = {};
62+
var ozl;
5463
for (i=0; i<zLayers.length; i++) {
5564
zLayer = zLayers[i];
5665
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;
6070
opaque[zLayer][program.id] = opaque[zLayer][program.id] || [];
6171
opaque[zLayer][program.id].push(obj);
6272
}
6373
}
6474

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+
});
7897
}
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-
});
8598
}
8699
}
87100

src/renderer/webgl/base/mesh.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,12 @@ XML3D.extend(GLMesh.prototype, {
8383
* @returns {number}
8484
*/
8585
getElementCount: function () {
86-
try {
87-
return this.buffers.index.length;
88-
} catch (e) {
89-
//XML3D.debug.logError("Could not calculate element count.", e);
90-
return 0;
91-
}
86+
return this.buffers.index.length;
9287
}, /**
9388
* @returns {number}
9489
*/
9590
getVertexCount: function () {
96-
try {
97-
return (this.vertexCount != null ? this.vertexCount : this.minAttributeCount );
98-
} catch (e) {
99-
//XML3D.debug.logError("Could not calculate vertex count.", e);
100-
return 0;
101-
}
91+
return (this.vertexCount != null ? this.vertexCount : this.minAttributeCount );
10292
},
10393

10494
/**

0 commit comments

Comments
 (0)