summaryrefslogtreecommitdiffstats
path: root/o3d/samples/o3d-webgl/transform.js
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/samples/o3d-webgl/transform.js')
-rw-r--r--o3d/samples/o3d-webgl/transform.js76
1 files changed, 72 insertions, 4 deletions
diff --git a/o3d/samples/o3d-webgl/transform.js b/o3d/samples/o3d-webgl/transform.js
index 1873c5d..929abfd 100644
--- a/o3d/samples/o3d-webgl/transform.js
+++ b/o3d/samples/o3d-webgl/transform.js
@@ -225,7 +225,15 @@ o3d.Transform.prototype.getTransformsByNameInTree =
*/
o3d.Transform.prototype.getUpdatedWorldMatrix =
function() {
- o3d.notImplemented();
+ var parentWorldMatrix;
+ if (!this.parent) {
+ parentWorldMatrix =
+ [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
+ } else {
+ parentWorldMatrix = this.parent.getUpdatedWorldMatrix();
+ }
+ o3d.Transform.compose(parentWorldMatrix, this.localMatrix, this.worldMatrix);
+ return this.worldMatrix;
};
@@ -591,6 +599,37 @@ o3d.Transform.prototype.rotateX =
};
+
+/**
+ * Takes a 4-by-4 matrix and a vector with 3 entries,
+ * interprets the vector as a point, transforms that point by the matrix, and
+ * returns the result as a vector with 3 entries.
+ * @param {!o3djs.math.Matrix4} m The matrix.
+ * @param {!o3djs.math.Vector3} v The point.
+ * @return {!o3djs.math.Vector3} The transformed point.
+ */
+o3d.Transform.transformPoint = function(m, v) {
+ var v0 = v[0];
+ var v1 = v[1];
+ var v2 = v[2];
+
+ if (!m) {
+ debugger;
+ }
+
+ var m0 = m[0];
+ var m1 = m[1];
+ var m2 = m[2];
+ var m3 = m[3];
+
+ var d = v0 * m0[3] + v1 * m1[3] + v2 * m2[3] + m3[3];
+ return [(v0 * m0[0] + v1 * m1[0] + v2 * m2[0] + m3[0]) / d,
+ (v0 * m0[1] + v1 * m1[1] + v2 * m2[1] + m3[1]) / d,
+ (v0 * m0[2] + v1 * m1[2] + v2 * m2[2] + m3[2]) / d];
+};
+
+
+
/**
* Pre-composes the local matrix of this Transform with a rotation about the
* y-axis. For example, if the local matrix is a translation, the new local
@@ -926,7 +965,9 @@ o3d.Transform.flattenMatrix4 = function(m) {
*/
o3d.Transform.prototype.traverse =
function(drawListInfos, opt_parentWorldMatrix) {
- if (!this.visible) {
+
+ this.gl.client.render_stats_['transformsProcessed']++;
+ if (drawListInfos.length == 0 || !this.visible) {
return;
}
opt_parentWorldMatrix =
@@ -936,15 +977,42 @@ o3d.Transform.prototype.traverse =
o3d.Transform.compose(
opt_parentWorldMatrix, this.localMatrix, this.worldMatrix);
+ var remainingDrawListInfos = [];
+
+ if (this.cull) {
+ if (this.boundingBox) {
+ for (var i = 0; i < drawListInfos.length; ++i) {
+ var drawListInfo = drawListInfos[i];
+
+ var worldViewProjection = [[], [], [], []];
+ o3d.Transform.compose(drawListInfo.context.view,
+ this.worldMatrix, worldViewProjection);
+ o3d.Transform.compose(drawListInfo.context.projection,
+ worldViewProjection, worldViewProjection);
+
+ if (this.boundingBox.inFrustum(worldViewProjection)) {
+ remainingDrawListInfos.push(drawListInfo);
+ }
+ }
+ }
+ } else {
+ remainingDrawListInfos = drawListInfos;
+ }
+
+ if (remainingDrawListInfos.length == 0) {
+ this.gl.client.render_stats_['transformsCulled']++;
+ return;
+ }
+
var children = this.children;
var shapes = this.shapes;
for (var i = 0; i < shapes.length; ++i) {
- shapes[i].writeToDrawLists(drawListInfos, this.worldMatrix, this);
+ shapes[i].writeToDrawLists(remainingDrawListInfos, this.worldMatrix, this);
}
for (var i = 0; i < children.length; ++i) {
- children[i].traverse(drawListInfos, this.worldMatrix);
+ children[i].traverse(remainingDrawListInfos, this.worldMatrix);
}
};