From 31abd49e7483234d0fa5e271d14f3f17e653f354 Mon Sep 17 00:00:00 2001 From: Patrick Schroen Date: Wed, 16 Oct 2024 05:01:02 -0400 Subject: [PATCH] chore: texture3d types (#237) * fix: export texture3d * feat: add texture3d types * chore: prettier --- src/core/Texture.js | 2 +- src/extras/Texture3D.js | 36 +++++++++++++++++------------------- src/index.js | 1 + types/core/Texture.d.ts | 5 ++++- types/extras/Texture3D.d.ts | 17 +++++++++++++++++ types/index.d.ts | 1 + 6 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 types/extras/Texture3D.d.ts diff --git a/src/core/Texture.js b/src/core/Texture.js index 12e55d1c..ef8311f9 100644 --- a/src/core/Texture.js +++ b/src/core/Texture.js @@ -206,4 +206,4 @@ export class Texture { } this.store.image = this.image; } -} \ No newline at end of file +} diff --git a/src/extras/Texture3D.js b/src/extras/Texture3D.js index 1f2bf624..0b3b6b61 100644 --- a/src/extras/Texture3D.js +++ b/src/extras/Texture3D.js @@ -1,8 +1,7 @@ -import { Texture } from "../core/Texture.js"; +import { Texture } from '../core/Texture.js'; export class Texture3D extends Texture { constructor(gl, args) { - super(gl, { ...args, target: gl.TEXTURE_3D, @@ -11,11 +10,10 @@ export class Texture3D extends Texture { }); const image = new Image(); - image.crossOrigin = "*"; + image.crossOrigin = '*'; image.src = args.src; image.onload = () => { - let canvas = document.createElement('canvas'); canvas.width = image.width; canvas.height = image.height; @@ -31,14 +29,18 @@ export class Texture3D extends Texture { let elementCount; switch (this.format) { - case gl.RED: elementCount = 1 - break - case gl.RG: elementCount = 2 - break - case gl.RGB: elementCount = 3 - break - default: elementCount = 4 - break + case gl.RED: + elementCount = 1; + break; + case gl.RG: + elementCount = 2; + break; + case gl.RGB: + elementCount = 3; + break; + default: + elementCount = 4; + break; } const dataCount = this.width * this.height * this.length * elementCount; @@ -49,10 +51,9 @@ export class Texture3D extends Texture { for (let z = 0; z < this.length; z++) { for (let y = 0; y < this.height; y++) { for (let x = 0; x < this.width; x++) { - let zOffsetX = (z % args.tileCountX) * this.width; let zOffsetY = Math.floor(z / args.tileCountX) * (this.width * this.height * args.tileCountX); - let index = (x + zOffsetX) + ((y * image.width) + zOffsetY); + let index = x + zOffsetX + (y * image.width + zOffsetY); const r = imageData[index * 4]; const g = imageData[index * 4 + 1]; @@ -67,16 +68,13 @@ export class Texture3D extends Texture { } else { data[dataIterator++] = texel[i] / 255; } - } - } } } this.image = data; this.needsUpdate = true; - - } + }; } -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 811111b3..1eb9082f 100644 --- a/src/index.js +++ b/src/index.js @@ -51,3 +51,4 @@ export { GridHelper } from './extras/helpers/GridHelper.js'; export { VertexNormalsHelper } from './extras/helpers/VertexNormalsHelper.js'; export { FaceNormalsHelper } from './extras/helpers/FaceNormalsHelper.js'; export { InstancedMesh } from './extras/InstancedMesh.js'; +export { Texture3D } from './extras/Texture3D.js'; diff --git a/types/core/Texture.d.ts b/types/core/Texture.d.ts index 4ee15de5..ea83d106 100644 --- a/types/core/Texture.d.ts +++ b/types/core/Texture.d.ts @@ -24,6 +24,7 @@ export interface TextureOptions { internalFormat: number; wrapS: number; wrapT: number; + wrapR: number; generateMipmaps: boolean; minFilter: number; magFilter: number; @@ -54,6 +55,7 @@ export class Texture { magFilter: number; wrapS: number; wrapT: number; + wrapR: number; generateMipmaps: boolean; premultiplyAlpha: boolean; unpackAlignment: number; @@ -62,6 +64,7 @@ export class Texture { level: number; width: number; height: number; + length: number; texture: WebGLTexture; store: { @@ -79,9 +82,9 @@ export class Texture { }; needsUpdate: boolean; - onUpdate?: () => void; // Set from texture loader + onUpdate?: () => void | null; ext?: string; name?: string; loaded?: Promise; diff --git a/types/extras/Texture3D.d.ts b/types/extras/Texture3D.d.ts new file mode 100644 index 00000000..5bfc1d40 --- /dev/null +++ b/types/extras/Texture3D.d.ts @@ -0,0 +1,17 @@ +import { Texture } from '../core/Texture.js'; + +import type { OGLRenderingContext } from '../core/Renderer.js'; +import type { TextureOptions } from '../core/Texture.js'; + +export interface Texture3DOptions extends TextureOptions { + src: string; + tileCountX: number; +} + +/** + * A class for rearranging a flat 3D texture from software like Houdini. + * @see {@link https://github.com/oframe/ogl/blob/master/src/extras/Texture3D.js | Source} + */ +export class Texture3D extends Texture { + constructor(gl: OGLRenderingContext, options?: Partial); +} diff --git a/types/index.d.ts b/types/index.d.ts index 604afe88..d21fce0b 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -58,3 +58,4 @@ export * from './extras/helpers/GridHelper'; export * from './extras/helpers/VertexNormalsHelper'; export * from './extras/helpers/FaceNormalsHelper'; export * from './extras/InstancedMesh'; +export * from './extras/Texture3D.js';