1
1
2
2
import Node from '../core/Node.js' ;
3
- import { nodeObject } from '../tsl/TSLBase.js' ;
3
+ import { nodeObject , Fn , bool , float } from '../tsl/TSLBase.js' ;
4
4
import { positionView } from './Position.js' ;
5
- import { diffuseColor , property } from '../core/PropertyNode.js' ;
6
- import { Fn } from '../tsl/TSLBase.js' ;
5
+ import { diffuseColor } from '../core/PropertyNode.js' ;
7
6
import { Loop } from '../utils/LoopNode.js' ;
8
7
import { smoothstep } from '../math/MathNode.js' ;
9
8
import { uniformArray } from './UniformArrayNode.js' ;
@@ -29,69 +28,72 @@ class ClippingNode extends Node {
29
28
super . setup ( builder ) ;
30
29
31
30
const clippingContext = builder . clippingContext ;
32
- const { localClipIntersection , localClippingCount , globalClippingCount } = clippingContext ;
31
+ const { intersectionPlanes , unionPlanes } = clippingContext ;
33
32
34
- const numClippingPlanes = globalClippingCount + localClippingCount ;
35
- const numUnionClippingPlanes = localClipIntersection ? numClippingPlanes - localClippingCount : numClippingPlanes ;
36
33
37
34
if ( this . scope === ClippingNode . ALPHA_TO_COVERAGE ) {
38
35
39
- return this . setupAlphaToCoverage ( clippingContext . planes , numClippingPlanes , numUnionClippingPlanes ) ;
36
+ return this . setupAlphaToCoverage ( intersectionPlanes , unionPlanes ) ;
40
37
41
38
} else {
42
39
43
- return this . setupDefault ( clippingContext . planes , numClippingPlanes , numUnionClippingPlanes ) ;
40
+ return this . setupDefault ( intersectionPlanes , unionPlanes ) ;
44
41
45
42
}
46
43
47
44
}
48
45
49
- setupAlphaToCoverage ( planes , numClippingPlanes , numUnionClippingPlanes ) {
46
+ setupAlphaToCoverage ( intersectionPlanes , unionPlanes ) {
50
47
51
48
return Fn ( ( ) => {
52
49
53
- const clippingPlanes = uniformArray ( planes ) ;
50
+ const distanceToPlane = float ( ) . toVar ( 'distanceToPlane' ) ;
51
+ const distanceGradient = float ( ) . toVar ( 'distanceToGradient' ) ;
54
52
55
- const distanceToPlane = property ( 'float' , 'distanceToPlane' ) ;
56
- const distanceGradient = property ( 'float' , 'distanceToGradient' ) ;
53
+ const clipOpacity = float ( 1 ) . toVar ( 'clipOpacity' ) ;
57
54
58
- const clipOpacity = property ( 'float' , 'clipOpacity' ) ;
55
+ const numUnionPlanes = unionPlanes . length ;
59
56
60
- clipOpacity . assign ( 1 ) ;
57
+ if ( numUnionPlanes > 0 ) {
61
58
62
- let plane ;
59
+ const clippingPlanes = uniformArray ( unionPlanes ) ;
63
60
64
- Loop ( numUnionClippingPlanes , ( { i } ) => {
61
+ let plane ;
65
62
66
- plane = clippingPlanes . element ( i ) ;
63
+ Loop ( numUnionPlanes , ( { i } ) => {
67
64
68
- distanceToPlane . assign ( positionView . dot ( plane . xyz ) . negate ( ) . add ( plane . w ) ) ;
69
- distanceGradient . assign ( distanceToPlane . fwidth ( ) . div ( 2.0 ) ) ;
65
+ plane = clippingPlanes . element ( i ) ;
66
+
67
+ distanceToPlane . assign ( positionView . dot ( plane . xyz ) . negate ( ) . add ( plane . w ) ) ;
68
+ distanceGradient . assign ( distanceToPlane . fwidth ( ) . div ( 2.0 ) ) ;
70
69
71
- clipOpacity . mulAssign ( smoothstep ( distanceGradient . negate ( ) , distanceGradient , distanceToPlane ) ) ;
70
+ clipOpacity . mulAssign ( smoothstep ( distanceGradient . negate ( ) , distanceGradient , distanceToPlane ) ) ;
72
71
73
- clipOpacity . equal ( 0.0 ) . discard ( ) ;
72
+ } ) ;
73
+
74
+ }
74
75
75
- } ) ;
76
+ const numIntersectionPlanes = intersectionPlanes . length ;
76
77
77
- if ( numUnionClippingPlanes < numClippingPlanes ) {
78
+ if ( numIntersectionPlanes > 0 ) {
78
79
79
- const unionClipOpacity = property ( 'float' , 'unionclipOpacity' ) ;
80
+ const clippingPlanes = uniformArray ( intersectionPlanes ) ;
81
+ const intersectionClipOpacity = float ( 1 ) . toVar ( 'intersectionClipOpacity' ) ;
80
82
81
- unionClipOpacity . assign ( 1 ) ;
83
+ let plane ;
82
84
83
- Loop ( { start : numUnionClippingPlanes , end : numClippingPlanes } , ( { i } ) => {
85
+ Loop ( numIntersectionPlanes , ( { i } ) => {
84
86
85
87
plane = clippingPlanes . element ( i ) ;
86
88
87
89
distanceToPlane . assign ( positionView . dot ( plane . xyz ) . negate ( ) . add ( plane . w ) ) ;
88
90
distanceGradient . assign ( distanceToPlane . fwidth ( ) . div ( 2.0 ) ) ;
89
91
90
- unionClipOpacity . mulAssign ( smoothstep ( distanceGradient . negate ( ) , distanceGradient , distanceToPlane ) . oneMinus ( ) ) ;
92
+ intersectionClipOpacity . mulAssign ( smoothstep ( distanceGradient . negate ( ) , distanceGradient , distanceToPlane ) . oneMinus ( ) ) ;
91
93
92
94
} ) ;
93
95
94
- clipOpacity . mulAssign ( unionClipOpacity . oneMinus ( ) ) ;
96
+ clipOpacity . mulAssign ( intersectionClipOpacity . oneMinus ( ) ) ;
95
97
96
98
}
97
99
@@ -103,28 +105,37 @@ class ClippingNode extends Node {
103
105
104
106
}
105
107
106
- setupDefault ( planes , numClippingPlanes , numUnionClippingPlanes ) {
108
+ setupDefault ( intersectionPlanes , unionPlanes ) {
107
109
108
110
return Fn ( ( ) => {
109
111
110
- const clippingPlanes = uniformArray ( planes ) ;
112
+ const numUnionPlanes = unionPlanes . length ;
111
113
112
- let plane ;
114
+ if ( numUnionPlanes > 0 ) {
113
115
114
- Loop ( numUnionClippingPlanes , ( { i } ) => {
116
+ const clippingPlanes = uniformArray ( unionPlanes ) ;
115
117
116
- plane = clippingPlanes . element ( i ) ;
117
- positionView . dot ( plane . xyz ) . greaterThan ( plane . w ) . discard ( ) ;
118
+ let plane ;
119
+
120
+ Loop ( numUnionPlanes , ( { i } ) => {
121
+
122
+ plane = clippingPlanes . element ( i ) ;
123
+ positionView . dot ( plane . xyz ) . greaterThan ( plane . w ) . discard ( ) ;
124
+
125
+ } ) ;
126
+
127
+ }
118
128
119
- } ) ;
129
+ const numIntersectionPlanes = intersectionPlanes . length ;
120
130
121
- if ( numUnionClippingPlanes < numClippingPlanes ) {
131
+ if ( numIntersectionPlanes > 0 ) {
122
132
123
- const clipped = property ( 'bool' , 'clipped' ) ;
133
+ const clippingPlanes = uniformArray ( intersectionPlanes ) ;
134
+ const clipped = bool ( true ) . toVar ( 'clipped' ) ;
124
135
125
- clipped . assign ( true ) ;
136
+ let plane ;
126
137
127
- Loop ( { start : numUnionClippingPlanes , end : numClippingPlanes } , ( { i } ) => {
138
+ Loop ( numIntersectionPlanes , ( { i } ) => {
128
139
129
140
plane = clippingPlanes . element ( i ) ;
130
141
clipped . assign ( positionView . dot ( plane . xyz ) . greaterThan ( plane . w ) . and ( clipped ) ) ;
0 commit comments