@@ -2,8 +2,6 @@ import { Debug } from '../core/debug.js';
22import { hash32Fnv1a } from '../core/hash.js' ;
33import {
44 LIGHTTYPE_DIRECTIONAL ,
5- LAYER_FX ,
6- SORTKEY_FORWARD ,
75 SORTMODE_BACK2FRONT , SORTMODE_CUSTOM , SORTMODE_FRONT2BACK , SORTMODE_MATERIALMESH , SORTMODE_NONE
86} from './constants.js' ;
97import { Material } from './materials/material.js' ;
@@ -28,20 +26,20 @@ function sortManual(drawCallA, drawCallB) {
2826}
2927
3028function sortMaterialMesh ( drawCallA , drawCallB ) {
31- const keyA = drawCallA . _key [ SORTKEY_FORWARD ] ;
32- const keyB = drawCallB . _key [ SORTKEY_FORWARD ] ;
33- if ( keyA === keyB && drawCallA . mesh && drawCallB . mesh ) {
29+ const keyA = drawCallA . _sortKeyForward ;
30+ const keyB = drawCallB . _sortKeyForward ;
31+ if ( keyA === keyB ) {
3432 return drawCallB . mesh . id - drawCallA . mesh . id ;
3533 }
3634 return keyB - keyA ;
3735}
3836
3937function sortBackToFront ( drawCallA , drawCallB ) {
40- return drawCallB . zdist - drawCallA . zdist ;
38+ return drawCallB . _sortKeyDynamic - drawCallA . _sortKeyDynamic ;
4139}
4240
4341function sortFrontToBack ( drawCallA , drawCallB ) {
44- return drawCallA . zdist - drawCallB . zdist ;
42+ return drawCallA . _sortKeyDynamic - drawCallB . _sortKeyDynamic ;
4543}
4644
4745const sortCallbacks = [ null , sortManual , sortMaterialMesh , sortBackToFront , sortFrontToBack ] ;
@@ -797,24 +795,32 @@ class Layer {
797795
798796 /**
799797 * @param {MeshInstance[] } drawCalls - Array of mesh instances.
800- * @param {number } drawCallsCount - Number of mesh instances.
801798 * @param {Vec3 } camPos - Camera position.
802799 * @param {Vec3 } camFwd - Camera forward vector.
803800 * @private
804801 */
805- _calculateSortDistances ( drawCalls , drawCallsCount , camPos , camFwd ) {
806- for ( let i = 0 ; i < drawCallsCount ; i ++ ) {
802+ _calculateSortDistances ( drawCalls , camPos , camFwd ) {
803+ const count = drawCalls . length ;
804+ const { x : px , y : py , z : pz } = camPos ;
805+ const { x : fx , y : fy , z : fz } = camFwd ;
806+
807+ for ( let i = 0 ; i < count ; i ++ ) {
807808 const drawCall = drawCalls [ i ] ;
808- if ( drawCall . layer <= LAYER_FX ) continue ; // Only alpha sort mesh instances in the main world (backwards comp)
809+
810+ // compute distance from camera to mesh along the forward vector
811+ let zDist ;
809812 if ( drawCall . calculateSortDistance ) {
810- drawCall . zdist = drawCall . calculateSortDistance ( drawCall , camPos , camFwd ) ;
811- continue ;
813+ zDist = drawCall . calculateSortDistance ( drawCall , camPos , camFwd ) ;
814+ } else {
815+ const meshPos = drawCall . aabb . center ;
816+ zDist = ( meshPos . x - px ) * fx + ( meshPos . y - py ) * fy + ( meshPos . z - pz ) * fz ;
812817 }
813- const meshPos = drawCall . aabb . center ;
814- const tempx = meshPos . x - camPos . x ;
815- const tempy = meshPos . y - camPos . y ;
816- const tempz = meshPos . z - camPos . z ;
817- drawCall . zdist = tempx * camFwd . x + tempy * camFwd . y + tempz * camFwd . z ;
818+
819+ // scale the bucket to give it a significantly higher magnitude than distance (1 billion)
820+ const bucket = drawCall . _drawBucket * 1e9 ;
821+
822+ // create sorting key based on the drawBucket and distance
823+ drawCall . _sortKeyDynamic = bucket + zDist ;
818824 }
819825 }
820826
@@ -840,6 +846,7 @@ class Layer {
840846 * @ignore
841847 */
842848 sortVisible ( camera , transparent ) {
849+
843850 const sortMode = transparent ? this . transparentSortMode : this . opaqueSortMode ;
844851 if ( sortMode === SORTMODE_NONE ) {
845852 return ;
@@ -863,7 +870,7 @@ class Layer {
863870 if ( sortMode === SORTMODE_BACK2FRONT || sortMode === SORTMODE_FRONT2BACK ) {
864871 const sortPos = cameraNode . getPosition ( ) ;
865872 const sortDir = cameraNode . forward ;
866- this . _calculateSortDistances ( instances , instances . length , sortPos , sortDir ) ;
873+ this . _calculateSortDistances ( instances , sortPos , sortDir ) ;
867874 }
868875
869876 instances . sort ( sortCallbacks [ sortMode ] ) ;
0 commit comments