diff options
author | petersont@google.com <petersont@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-17 21:36:08 +0000 |
---|---|---|
committer | petersont@google.com <petersont@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-17 21:36:08 +0000 |
commit | 422e69530732e4f54acb649ea8130ed22e3ccb53 (patch) | |
tree | cd556e693f9448a83d63a764e13561c67c883d6e /o3d/samples/o3d-webgl | |
parent | a81e44e1ccd4c19de283dcd1e90da04bf8ae0208 (diff) | |
download | chromium_src-422e69530732e4f54acb649ea8130ed22e3ccb53.zip chromium_src-422e69530732e4f54acb649ea8130ed22e3ccb53.tar.gz chromium_src-422e69530732e4f54acb649ea8130ed22e3ccb53.tar.bz2 |
Sorts drawlists by priority or by depth as indicated by the flag in the DrawPass.
Review URL: http://codereview.chromium.org/2075003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47459 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d/samples/o3d-webgl')
-rw-r--r-- | o3d/samples/o3d-webgl/draw_list.js | 47 | ||||
-rw-r--r-- | o3d/samples/o3d-webgl/draw_pass.js | 3 | ||||
-rw-r--r-- | o3d/samples/o3d-webgl/transform.js | 26 |
3 files changed, 69 insertions, 7 deletions
diff --git a/o3d/samples/o3d-webgl/draw_list.js b/o3d/samples/o3d-webgl/draw_list.js index 875f237..6132a8b 100644 --- a/o3d/samples/o3d-webgl/draw_list.js +++ b/o3d/samples/o3d-webgl/draw_list.js @@ -69,10 +69,55 @@ o3d.DrawList.BY_PRIORITY = 2; /** + * Compare function for by-priority sort. + */ +o3d.DrawList.comparePriority_ = function(drawElementInfoA, drawElementInfoB) { + return drawElementInfoA.drawElement.owner.priority - + drawElementInfoB.drawElement.owner.priority; +}; + + +/** + * Compare function for by-z-coordinate sort. + * @param {!o3d.DrawElement} drawElementInfoA + * @param {!o3d.DrawElement} drawElementInfoB + */ +o3d.DrawList.compareZ_ = function(drawElementInfoA, drawElementInfoB) { + return o3d.Transform.transformPointZOnly( + drawElementInfoA.worldViewProjection, + drawElementInfoA.drawElement.owner.zSortPoint) - + o3d.Transform.transformPointZOnly( + drawElementInfoB.worldViewProjection, + drawElementInfoB.drawElement.owner.zSortPoint); +}; + + +/** + * Sorts this list according to the given sort method. + * @param {o3d.DrawList.SortMethod} sort_method Which method to use. + * @private + */ +o3d.DrawList.prototype.sort_ = function(sort_method) { + switch (sort_method) { + case o3d.DrawList.BY_PRIORITY: + this.list_.sort(o3d.DrawList.comparePriority_); + break; + + case o3d.DrawList.BY_Z_ORDER: + this.list_.sort(o3d.DrawList.compareZ_); + break; + + case o3d.DrawList.BY_PERFORMANCE: + default: + break; + } +}; + + +/** * Renders the draw list. */ o3d.DrawList.prototype.render = function() { - // TODO(petersont): Add sort. for (var i = 0; i < this.list_.length; ++i) { var drawElementInfo = this.list_[i]; var world = drawElementInfo.world; diff --git a/o3d/samples/o3d-webgl/draw_pass.js b/o3d/samples/o3d-webgl/draw_pass.js index 600f641..c02601b 100644 --- a/o3d/samples/o3d-webgl/draw_pass.js +++ b/o3d/samples/o3d-webgl/draw_pass.js @@ -32,7 +32,7 @@ /** * A DrawPass renders a DrawList. - * + * * @param {o3d.DrawList} drawList The DrawList used by this DrawPass. * @param {o3d.DrawPass.SortMethod} sortMethod ParamInteger The method * of sorting this DrawPass. @@ -69,6 +69,7 @@ o3d.ParamObject.setUpO3DParam_(o3d.DrawPass, 'sortMethod', 'ParamInteger'); */ o3d.DrawPass.prototype.before = function() { if (this.drawList) { + this.drawList.sort_(this.sortMethod); this.drawList.render(); } }; diff --git a/o3d/samples/o3d-webgl/transform.js b/o3d/samples/o3d-webgl/transform.js index 929abfd..6499da2 100644 --- a/o3d/samples/o3d-webgl/transform.js +++ b/o3d/samples/o3d-webgl/transform.js @@ -612,11 +612,6 @@ 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]; @@ -629,6 +624,27 @@ o3d.Transform.transformPoint = function(m, v) { }; +/** + * Takes a 4-by-4 matrix and a vector with 3 entries, + * interprets the vector as a point, transforms that point by the matrix, + * returning the z-component of the result only. + * @param {!o3djs.math.Matrix4} m The matrix. + * @param {!o3djs.math.Vector3} v The point. + * @return {number} The z coordinate of the transformed point. + */ +o3d.Transform.transformPointZOnly = function(m, v) { + var v0 = v[0]; + var v1 = v[1]; + var v2 = v[2]; + var m0 = m[0]; + var m1 = m[1]; + var m2 = m[2]; + var m3 = m[3]; + + var d = (v0 * m0[2] + v1 * m1[2] + v2 * m2[2] + m3[2]) / + (v0 * m0[3] + v1 * m1[3] + v2 * m2[3] + m3[3]); +}; + /** * Pre-composes the local matrix of this Transform with a rotation about the |