@vitessce/spatial-accelerated 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.js +52925 -0
- package/dist-tsc/SpatialWrapper.d.ts +2 -0
- package/dist-tsc/SpatialWrapper.d.ts.map +1 -0
- package/dist-tsc/SpatialWrapper.js +45 -0
- package/dist-tsc/VolumeDataManager.d.ts +170 -0
- package/dist-tsc/VolumeDataManager.d.ts.map +1 -0
- package/dist-tsc/VolumeDataManager.js +1273 -0
- package/dist-tsc/VolumeDataManager.test.d.ts +2 -0
- package/dist-tsc/VolumeDataManager.test.d.ts.map +1 -0
- package/dist-tsc/VolumeDataManager.test.js +164 -0
- package/dist-tsc/VolumeRenderManager.d.ts +265 -0
- package/dist-tsc/VolumeRenderManager.d.ts.map +1 -0
- package/dist-tsc/VolumeRenderManager.js +396 -0
- package/dist-tsc/VolumeShader.d.ts +262 -0
- package/dist-tsc/VolumeShader.d.ts.map +1 -0
- package/dist-tsc/VolumeShader.js +73 -0
- package/dist-tsc/VolumeView.d.ts +2 -0
- package/dist-tsc/VolumeView.d.ts.map +1 -0
- package/dist-tsc/VolumeView.js +521 -0
- package/dist-tsc/index.d.ts +2 -0
- package/dist-tsc/index.d.ts.map +1 -0
- package/dist-tsc/index.js +1 -0
- package/dist-tsc/shaders/GaussianFragmentShader.d.ts +2 -0
- package/dist-tsc/shaders/GaussianFragmentShader.d.ts.map +1 -0
- package/dist-tsc/shaders/GaussianFragmentShader.js +242 -0
- package/dist-tsc/shaders/GaussianVertexShader.d.ts +2 -0
- package/dist-tsc/shaders/GaussianVertexShader.d.ts.map +1 -0
- package/dist-tsc/shaders/GaussianVertexShader.js +51 -0
- package/dist-tsc/shaders/VolumeFragmentShader.d.ts +2 -0
- package/dist-tsc/shaders/VolumeFragmentShader.d.ts.map +1 -0
- package/dist-tsc/shaders/VolumeFragmentShader.js +1817 -0
- package/dist-tsc/shaders/VolumeVertexShader.d.ts +2 -0
- package/dist-tsc/shaders/VolumeVertexShader.d.ts.map +1 -0
- package/dist-tsc/shaders/VolumeVertexShader.js +110 -0
- package/package.json +63 -0
- package/src/SpatialWrapper.js +60 -0
- package/src/VolumeDataManager.js +1515 -0
- package/src/VolumeDataManager.test.js +180 -0
- package/src/VolumeRenderManager.js +589 -0
- package/src/VolumeShader.js +74 -0
- package/src/VolumeView.js +651 -0
- package/src/index.js +1 -0
- package/src/shaders/GaussianFragmentShader.js +243 -0
- package/src/shaders/GaussianVertexShader.js +52 -0
- package/src/shaders/VolumeFragmentShader.js +1818 -0
- package/src/shaders/VolumeVertexShader.js +111 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Attribution: Originally written by @alexandrairger
|
|
2
|
+
// Moved from .glsl file to .js file in this commit: https://github.com/vitessce/vitessce/pull/2264/commits/7f17fc003674a4ed1a8de6140db802781871cf88
|
|
3
|
+
/*
|
|
4
|
+
|
|
5
|
+
============================================================================
|
|
6
|
+
VOLUME RENDERING PIPELINE OVERVIEW
|
|
7
|
+
============================================================================
|
|
8
|
+
|
|
9
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
10
|
+
│ Vertex Shader │───▶│ Fragment Shader │───▶│ Final Image │
|
|
11
|
+
│ (this shader) │ │ (ray marching) │ │ │
|
|
12
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
13
|
+
│ rayDirUnnorm │ sample volume
|
|
14
|
+
│ cameraCorrected │ blend voxels
|
|
15
|
+
│ worldSpaceCoords │ apply lighting
|
|
16
|
+
|
|
17
|
+
============================================================================
|
|
18
|
+
COORDINATE TRANSFORMATIONS
|
|
19
|
+
============================================================================
|
|
20
|
+
|
|
21
|
+
1. Volume Space Normalization:
|
|
22
|
+
Original: [-0.5, 0.5] Normalized: [0, 1]
|
|
23
|
+
┌─────────────┐ ┌─────────────┐
|
|
24
|
+
│ -0.5 │ │ 0 │
|
|
25
|
+
│ │ │ │
|
|
26
|
+
│ 0 │──────────▶│ 0.5 │
|
|
27
|
+
│ │ │ │
|
|
28
|
+
│ 0.5 │ │ 1 │
|
|
29
|
+
└─────────────┘ └─────────────┘
|
|
30
|
+
|
|
31
|
+
2. Camera Position Transformation:
|
|
32
|
+
World Space: Volume Space:
|
|
33
|
+
┌─────────────┐ ┌─────────────┐
|
|
34
|
+
│ Camera │ │ Camera │
|
|
35
|
+
│ Position │──▶│ Position │
|
|
36
|
+
└─────────────┘ └─────────────┘
|
|
37
|
+
(x,y,z) (x',y',z')
|
|
38
|
+
|
|
39
|
+
3. Ray Direction Calculation:
|
|
40
|
+
Camera (cameraCorrected)
|
|
41
|
+
│
|
|
42
|
+
│ rayDirUnnorm = position - cameraCorrected
|
|
43
|
+
▼
|
|
44
|
+
Vertex (position)
|
|
45
|
+
|
|
46
|
+
4. MVP Transformation Pipeline:
|
|
47
|
+
Model Space → View Space → Projection Space → Clip Space
|
|
48
|
+
(x,y,z) → (x',y',z') → (x",y",z") → (x"',y"',z"')
|
|
49
|
+
*/
|
|
50
|
+
|
|
51
|
+
// lang: glsl
|
|
52
|
+
export const volumeVertexShader = `//
|
|
53
|
+
// Output: Unnormalized ray direction from camera to each vertex
|
|
54
|
+
// Used by fragment shader for ray marching through the volume
|
|
55
|
+
out vec3 rayDirUnnorm;
|
|
56
|
+
|
|
57
|
+
// Output: Camera position transformed into volume's local coordinate system
|
|
58
|
+
// Used to calculate ray origins in the fragment shader
|
|
59
|
+
out vec3 cameraCorrected;
|
|
60
|
+
|
|
61
|
+
// Volume scale uniform (likely for anisotropic voxels)
|
|
62
|
+
uniform vec3 u_vol_scale;
|
|
63
|
+
|
|
64
|
+
// Volume size uniform
|
|
65
|
+
uniform vec3 u_size;
|
|
66
|
+
|
|
67
|
+
// Output: Vertex positions normalized to [0,1] range within volume bounds
|
|
68
|
+
// Standard coordinate system for volume sampling
|
|
69
|
+
varying vec3 worldSpaceCoords;
|
|
70
|
+
|
|
71
|
+
// Output: Texture coordinates for sampling volume data
|
|
72
|
+
varying vec2 vUv;
|
|
73
|
+
|
|
74
|
+
// Output: Final clip-space position (stored for fragment shader access)
|
|
75
|
+
varying vec4 glPosition;
|
|
76
|
+
|
|
77
|
+
// Volume bounding box size uniform
|
|
78
|
+
uniform highp vec3 boxSize;
|
|
79
|
+
|
|
80
|
+
void main()
|
|
81
|
+
{
|
|
82
|
+
// Transform vertex positions from [-0.5, 0.5] range to [0, 1] range
|
|
83
|
+
// This is the standard coordinate system for volume sampling
|
|
84
|
+
//
|
|
85
|
+
// Mathematical transformation:
|
|
86
|
+
// worldSpaceCoords = (position / boxSize) + 0.5
|
|
87
|
+
//
|
|
88
|
+
// Example:
|
|
89
|
+
// position = (-0.5, -0.5, -0.5) → worldSpaceCoords = (0, 0, 0)
|
|
90
|
+
// position = ( 0.0, 0.0, 0.0) → worldSpaceCoords = (0.5, 0.5, 0.5)
|
|
91
|
+
// position = ( 0.5, 0.5, 0.5) → worldSpaceCoords = (1, 1, 1)
|
|
92
|
+
worldSpaceCoords = position / boxSize + vec3(0.5, 0.5, 0.5); //move it from [-0.5;0.5] to [0,1]
|
|
93
|
+
|
|
94
|
+
// Transform camera position into volume's local coordinate system
|
|
95
|
+
// This gives us the ray origin in volume space
|
|
96
|
+
cameraCorrected = (inverse(modelMatrix) * vec4(cameraPosition, 1.)).xyz;
|
|
97
|
+
|
|
98
|
+
// Calculate unnormalized ray direction from camera to each vertex
|
|
99
|
+
// Used by fragment shader for ray marching through the volume
|
|
100
|
+
rayDirUnnorm = position - cameraCorrected;
|
|
101
|
+
|
|
102
|
+
// Apply standard MVP transformation to get clip-space coordinates
|
|
103
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
104
|
+
|
|
105
|
+
// Store clip-space position for fragment shader access
|
|
106
|
+
glPosition = gl_Position;
|
|
107
|
+
|
|
108
|
+
// Pass through texture coordinates for volume sampling
|
|
109
|
+
vUv = uv;
|
|
110
|
+
}
|
|
111
|
+
`;
|