@@ -13,6 +13,7 @@ import vtkSphereMapperVS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkSphereMap
13
13
import vtkPolyDataFS from 'vtk.js/Sources/Rendering/OpenGL/glsl/vtkPolyDataFS.glsl' ;
14
14
15
15
import { registerOverride } from 'vtk.js/Sources/Rendering/OpenGL/ViewNodeFactory' ;
16
+ import { computeCoordShiftAndScale } from 'vtk.js/Sources/Rendering/OpenGL/CellArrayBufferObject/helpers' ;
16
17
17
18
const { vtkErrorMacro } = macro ;
18
19
@@ -202,14 +203,32 @@ function vtkOpenGLSphereMapper(publicAPI, model) {
202
203
program . setUniformMatrix ( 'VCPCMatrix' , keyMats . vcpc ) ;
203
204
}
204
205
206
+ // mat4.create() defaults to Float32Array b/c of gl-matrix's settings.
207
+ // We need Float64Array to avoid loss of precision with large coordinates.
208
+ const tmp4 = new Float64Array ( 16 ) ;
209
+
205
210
if ( program . isUniformUsed ( 'MCVCMatrix' ) ) {
206
211
if ( ! actor . getIsIdentity ( ) ) {
207
212
const actMats = model . openGLActor . getKeyMatrices ( ) ;
208
- const tmp4 = new Float64Array ( 16 ) ;
209
213
mat4 . multiply ( tmp4 , keyMats . wcvc , actMats . mcwc ) ;
214
+ if ( cellBO . getCABO ( ) . getCoordShiftAndScaleEnabled ( ) ) {
215
+ mat4 . multiply (
216
+ tmp4 ,
217
+ tmp4 ,
218
+ cellBO . getCABO ( ) . getInverseShiftAndScaleMatrix ( )
219
+ ) ;
220
+ }
210
221
program . setUniformMatrix ( 'MCVCMatrix' , tmp4 ) ;
211
222
} else {
212
- program . setUniformMatrix ( 'MCVCMatrix' , keyMats . wcvc ) ;
223
+ mat4 . copy ( tmp4 , keyMats . wcvc ) ;
224
+ if ( cellBO . getCABO ( ) . getCoordShiftAndScaleEnabled ( ) ) {
225
+ mat4 . multiply (
226
+ tmp4 ,
227
+ tmp4 ,
228
+ cellBO . getCABO ( ) . getInverseShiftAndScaleMatrix ( )
229
+ ) ;
230
+ }
231
+ program . setUniformMatrix ( 'MCVCMatrix' , tmp4 ) ;
213
232
}
214
233
}
215
234
@@ -275,6 +294,12 @@ function vtkOpenGLSphereMapper(publicAPI, model) {
275
294
let pointIdx = 0 ;
276
295
let colorIdx = 0 ;
277
296
297
+ const { useShiftAndScale, coordShift, coordScale } =
298
+ computeCoordShiftAndScale ( points ) ;
299
+ if ( useShiftAndScale ) {
300
+ vbo . setCoordShiftAndScale ( coordShift , coordScale ) ;
301
+ }
302
+
278
303
//
279
304
// Generate points and point data for sides
280
305
//
@@ -287,9 +312,13 @@ function vtkOpenGLSphereMapper(publicAPI, model) {
287
312
}
288
313
289
314
pointIdx = i * 3 ;
290
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
291
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
292
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
315
+ const ptX = ( pointArray [ pointIdx ++ ] - coordShift [ 0 ] ) * coordScale [ 0 ] ;
316
+ const ptY = ( pointArray [ pointIdx ++ ] - coordShift [ 1 ] ) * coordScale [ 1 ] ;
317
+ const ptZ = ( pointArray [ pointIdx ++ ] - coordShift [ 2 ] ) * coordScale [ 2 ] ;
318
+
319
+ packedVBO [ vboIdx ++ ] = ptX ;
320
+ packedVBO [ vboIdx ++ ] = ptY ;
321
+ packedVBO [ vboIdx ++ ] = ptZ ;
293
322
packedVBO [ vboIdx ++ ] = - 2.0 * radius * cos30 ;
294
323
packedVBO [ vboIdx ++ ] = - radius ;
295
324
if ( colorData ) {
@@ -300,10 +329,9 @@ function vtkOpenGLSphereMapper(publicAPI, model) {
300
329
packedUCVBO [ ucIdx ++ ] = colorData [ colorIdx + 3 ] ;
301
330
}
302
331
303
- pointIdx = i * 3 ;
304
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
305
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
306
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
332
+ packedVBO [ vboIdx ++ ] = ptX ;
333
+ packedVBO [ vboIdx ++ ] = ptY ;
334
+ packedVBO [ vboIdx ++ ] = ptZ ;
307
335
packedVBO [ vboIdx ++ ] = 2.0 * radius * cos30 ;
308
336
packedVBO [ vboIdx ++ ] = - radius ;
309
337
if ( colorData ) {
@@ -313,10 +341,9 @@ function vtkOpenGLSphereMapper(publicAPI, model) {
313
341
packedUCVBO [ ucIdx ++ ] = colorData [ colorIdx + 3 ] ;
314
342
}
315
343
316
- pointIdx = i * 3 ;
317
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
318
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
319
- packedVBO [ vboIdx ++ ] = pointArray [ pointIdx ++ ] ;
344
+ packedVBO [ vboIdx ++ ] = ptX ;
345
+ packedVBO [ vboIdx ++ ] = ptY ;
346
+ packedVBO [ vboIdx ++ ] = ptZ ;
320
347
packedVBO [ vboIdx ++ ] = 0.0 ;
321
348
packedVBO [ vboIdx ++ ] = 2.0 * radius ;
322
349
if ( colorData ) {
0 commit comments