@niivue/niivue 0.47.0 → 0.48.1

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/build/index.d.ts CHANGED
@@ -404,7 +404,8 @@ declare class NVImage {
404
404
  readMIF(buffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
405
405
  readNRRD(dataBuffer: ArrayBuffer, pairedImgData: ArrayBuffer | null): ArrayBuffer;
406
406
  calculateRAS(): void;
407
- img2RAS(): TypedVoxelArray;
407
+ hdr2RAS(nVolumes?: number): nifti.NIFTI1 | nifti.NIFTI2;
408
+ img2RAS(nVolume?: number): TypedVoxelArray;
408
409
  vox2mm(XYZ: number[], mtx: mat4): vec3;
409
410
  mm2vox(mm: number[], frac?: boolean): Float32Array | vec3;
410
411
  arrayEquals(a: unknown[], b: unknown[]): boolean;
package/build/index.js CHANGED
@@ -10,7 +10,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
10
10
  import { mat4 as mat46, vec2, vec3 as vec311, vec4 as vec48 } from "gl-matrix";
11
11
 
12
12
  // package.json
13
- var version = "0.47.0";
13
+ var version = "0.48.1";
14
14
 
15
15
  // src/logger.ts
16
16
  var _Log = class _Log {
@@ -83,6 +83,13 @@ var compileShader = function(gl, vert, frag) {
83
83
  gl.attachShader(program, fs);
84
84
  gl.linkProgram(program);
85
85
  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
86
+ console.log(gl.getProgramInfoLog(program));
87
+ if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS)) {
88
+ console.log("Vertex shader compilation error:", gl.getShaderInfoLog(vs));
89
+ }
90
+ if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS)) {
91
+ console.log("Fragment shader compilation error:", gl.getShaderInfoLog(fs));
92
+ }
86
93
  log.error(gl.getProgramInfoLog(program));
87
94
  throw new Error("Shader failed to link, see console for log");
88
95
  }
@@ -1308,9 +1315,11 @@ uniform mat4 mvpMtx;
1308
1315
  uniform mat4 normMtx;
1309
1316
  out vec4 vClr;
1310
1317
  out vec3 vN;
1318
+ out vec4 vP;
1311
1319
  out vec4 vPc;
1312
1320
  void main(void) {
1313
1321
  vec3 lightPosition = vec3(0.0, 0.0, -10.0);
1322
+ vP = vec4(pos, 1.0);
1314
1323
  vPc = mvpMtx * vec4(pos, 1.0);
1315
1324
  gl_Position = vPc;
1316
1325
  vN = normalize((normMtx * vec4(norm.xyz,1.0)).xyz);
@@ -15456,7 +15465,7 @@ var NVMesh2 = class _NVMesh {
15456
15465
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
15457
15466
  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, Uint32Array.from(idxs), gl.STATIC_DRAW);
15458
15467
  gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
15459
- gl.bufferData(gl.ARRAY_BUFFER, Float32Array.from(f32), gl.STATIC_DRAW);
15468
+ gl.bufferData(gl.ARRAY_BUFFER, u8, gl.STATIC_DRAW);
15460
15469
  this.indexCount = nidx;
15461
15470
  }
15462
15471
  // linesToCylinders
@@ -16162,7 +16171,7 @@ var NVMesh2 = class _NVMesh {
16162
16171
  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
16163
16172
  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, Uint32Array.from(this.tris), gl.STATIC_DRAW);
16164
16173
  gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
16165
- gl.bufferData(gl.ARRAY_BUFFER, Float32Array.from(posNormClr), gl.STATIC_DRAW);
16174
+ gl.bufferData(gl.ARRAY_BUFFER, u8, gl.STATIC_DRAW);
16166
16175
  this.indexCount = this.tris.length;
16167
16176
  this.vertexCount = this.pts.length;
16168
16177
  }
@@ -20867,9 +20876,48 @@ var NVImage = class _NVImage {
20867
20876
  this.img2RASstart = outStart;
20868
20877
  this.calculateOblique();
20869
20878
  }
20879
+ // Reorient raw header data to RAS
20880
+ // assume single volume, use nVolumes to specify, set nVolumes = 0 for same as input
20881
+ hdr2RAS(nVolumes = 1) {
20882
+ if (!this.permRAS) {
20883
+ throw new Error("permRAS undefined");
20884
+ }
20885
+ if (!this.hdr) {
20886
+ throw new Error("hdr undefined");
20887
+ }
20888
+ const hdrBytes = hdrToArrayBuffer({ ...this.hdr, vox_offset: 352 }, false);
20889
+ const hdr = nifti.readHeader(hdrBytes.buffer, true);
20890
+ if (nVolumes === 1) {
20891
+ hdr.dims[0] = 3;
20892
+ hdr.dims[4] = 1;
20893
+ } else if (nVolumes > 1) {
20894
+ hdr.dims[0] = 4;
20895
+ hdr.dims[4] = nVolumes;
20896
+ }
20897
+ const perm = this.permRAS.slice();
20898
+ if (perm[0] === 1 && perm[1] === 2 && perm[2] === 3) {
20899
+ return hdr;
20900
+ }
20901
+ hdr.qform_code = 0;
20902
+ for (let i = 1; i < 4; i++) {
20903
+ hdr.dims[i] = this.dimsRAS[i];
20904
+ }
20905
+ for (let i = 0; i < this.pixDimsRAS.length; i++) {
20906
+ hdr.pixDims[i] = this.pixDimsRAS[i];
20907
+ }
20908
+ let k = 0;
20909
+ for (let i = 0; i < 4; i++) {
20910
+ for (let j = 0; j < 4; j++) {
20911
+ hdr.affine[i][j] = this.matRAS[k];
20912
+ k++;
20913
+ }
20914
+ }
20915
+ return hdr;
20916
+ }
20870
20917
  // Reorient raw image data to RAS
20871
20918
  // note that GPU-based orient shader is much faster
20872
- img2RAS() {
20919
+ // returns single 3D volume even for 4D input. Use nVolume to select volume (0 indexed)
20920
+ img2RAS(nVolume = 0) {
20873
20921
  if (!this.permRAS) {
20874
20922
  throw new Error("permRAS undefined");
20875
20923
  }
@@ -20884,7 +20932,13 @@ var NVImage = class _NVImage {
20884
20932
  return this.img;
20885
20933
  }
20886
20934
  const hdr = this.hdr;
20887
- const imgRAS = this.img.slice(0, hdr.dims[1] * hdr.dims[1] * hdr.dims[2] * hdr.dims[3]);
20935
+ const nVox = hdr.dims[1] * hdr.dims[2] * hdr.dims[3];
20936
+ let volSkip = nVolume * nVox;
20937
+ if (volSkip + nVox > this.img.length || volSkip < 0) {
20938
+ volSkip = 0;
20939
+ log.warn(`img2RAS nVolume (${nVolume}) out of bounds (${nVolume}+1)\xD7${nVox} > ${this.img.length}`);
20940
+ }
20941
+ const imgRAS = this.img.slice(0, nVox);
20888
20942
  const aperm = [Math.abs(perm[0]), Math.abs(perm[1]), Math.abs(perm[2])];
20889
20943
  const outdim = [hdr.dims[aperm[0]], hdr.dims[aperm[1]], hdr.dims[aperm[2]]];
20890
20944
  const inStep = [1, hdr.dims[1], hdr.dims[1] * hdr.dims[2]];
@@ -20903,7 +20957,7 @@ var NVImage = class _NVImage {
20903
20957
  const yi = outStart[1] + y * outStep[1];
20904
20958
  for (let x = 0; x < outdim[0]; x++) {
20905
20959
  const xi = outStart[0] + x * outStep[0];
20906
- imgRAS[j] = this.img[xi + yi + zi];
20960
+ imgRAS[j] = this.img[xi + yi + zi + volSkip];
20907
20961
  j++;
20908
20962
  }
20909
20963
  }