diff --git a/.travis.yml b/.travis.yml index 57b7984..800593c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,8 @@ jobs: email: "donghao.ren+npm@gmail.com" api_key: secure: "VNkn7xYuSLkgJ0VmvzxFaI6Nx+uzheiMjW3V7nT/lMKOMNvLbCkWgAxZ+qZWgVKHhJZlEFGdhJUtbkr5ATQNZW5cZ+ehyx9eoJjEYicvt/r9nqRb7mGuAM+WHEe7oRIn7A+vgYnYr4hITz03+rSbkOQO4uGW5K1Yf3fhBrR5f1mVFiWL0/4Ad8C19C2Xa2q8U3qmppGGA1MIr+iMCOgryoGLriNFbSm7nqMU2HOdZRTRpcbAzSiQGOi5mTu9jieBBJxScDAuHkL2S4MZQZAEYL02C1YpmZ1ktsMZwWuU0/BXSXroSU9HTBuPvcrLpZB82dzcs2Hxd4JaDH6BnbZy0cjh0xAeDDWsdR3CuksOF8ag33mkRReJBNbxLhlouCLClFEf8EcHkbgDhasZYDUGOikzF49+xZIh0vo/wlzO1MH0oPXWiD5IetOSfFNiS7uAsQStkl3pANvAGGFtdEUFaGknqQKInlgqaTm559HYhQK9otisGh0Upn7o+DGtepnFpM5EmzstiuQG9J/WyaYZnr2Z4y9Zf8YW+7hNTeS9ELyY4EeTFhK/3rvc39/oGM7gMHffT12qFZORw+ynCoDJDvBckY5ysRRDd2pw/A3K54N2kHc4KN9sQKKqohrr/B23WGl4mT0RngxgopP1Ho2wg+gc1owU12ZB5PC/qB4KMzg=" + on: + tags: true - stage: deploy stardust-webgl if: branch =~ /^stardust-webgl-.*$/ before_deploy: cd packages/stardust-webgl @@ -49,6 +51,8 @@ jobs: email: "donghao.ren+npm@gmail.com" api_key: secure: "VNkn7xYuSLkgJ0VmvzxFaI6Nx+uzheiMjW3V7nT/lMKOMNvLbCkWgAxZ+qZWgVKHhJZlEFGdhJUtbkr5ATQNZW5cZ+ehyx9eoJjEYicvt/r9nqRb7mGuAM+WHEe7oRIn7A+vgYnYr4hITz03+rSbkOQO4uGW5K1Yf3fhBrR5f1mVFiWL0/4Ad8C19C2Xa2q8U3qmppGGA1MIr+iMCOgryoGLriNFbSm7nqMU2HOdZRTRpcbAzSiQGOi5mTu9jieBBJxScDAuHkL2S4MZQZAEYL02C1YpmZ1ktsMZwWuU0/BXSXroSU9HTBuPvcrLpZB82dzcs2Hxd4JaDH6BnbZy0cjh0xAeDDWsdR3CuksOF8ag33mkRReJBNbxLhlouCLClFEf8EcHkbgDhasZYDUGOikzF49+xZIh0vo/wlzO1MH0oPXWiD5IetOSfFNiS7uAsQStkl3pANvAGGFtdEUFaGknqQKInlgqaTm559HYhQK9otisGh0Upn7o+DGtepnFpM5EmzstiuQG9J/WyaYZnr2Z4y9Zf8YW+7hNTeS9ELyY4EeTFhK/3rvc39/oGM7gMHffT12qFZORw+ynCoDJDvBckY5ysRRDd2pw/A3K54N2kHc4KN9sQKKqohrr/B23WGl4mT0RngxgopP1Ho2wg+gc1owU12ZB5PC/qB4KMzg=" + on: + tags: true - stage: deploy stardust-isotype if: branch =~ /^stardust-isotype-.*$/ before_deploy: cd packages/stardust-isotype @@ -58,3 +62,5 @@ jobs: email: "donghao.ren+npm@gmail.com" api_key: secure: "VNkn7xYuSLkgJ0VmvzxFaI6Nx+uzheiMjW3V7nT/lMKOMNvLbCkWgAxZ+qZWgVKHhJZlEFGdhJUtbkr5ATQNZW5cZ+ehyx9eoJjEYicvt/r9nqRb7mGuAM+WHEe7oRIn7A+vgYnYr4hITz03+rSbkOQO4uGW5K1Yf3fhBrR5f1mVFiWL0/4Ad8C19C2Xa2q8U3qmppGGA1MIr+iMCOgryoGLriNFbSm7nqMU2HOdZRTRpcbAzSiQGOi5mTu9jieBBJxScDAuHkL2S4MZQZAEYL02C1YpmZ1ktsMZwWuU0/BXSXroSU9HTBuPvcrLpZB82dzcs2Hxd4JaDH6BnbZy0cjh0xAeDDWsdR3CuksOF8ag33mkRReJBNbxLhlouCLClFEf8EcHkbgDhasZYDUGOikzF49+xZIh0vo/wlzO1MH0oPXWiD5IetOSfFNiS7uAsQStkl3pANvAGGFtdEUFaGknqQKInlgqaTm559HYhQK9otisGh0Upn7o+DGtepnFpM5EmzstiuQG9J/WyaYZnr2Z4y9Zf8YW+7hNTeS9ELyY4EeTFhK/3rvc39/oGM7gMHffT12qFZORw+ynCoDJDvBckY5ysRRDd2pw/A3K54N2kHc4KN9sQKKqohrr/B23WGl4mT0RngxgopP1Ho2wg+gc1owU12ZB5PC/qB4KMzg=" + on: + tags: true diff --git a/packages/stardust-core/src/binding/array.ts b/packages/stardust-core/src/binding/array.ts index d781081..773c0bb 100644 --- a/packages/stardust-core/src/binding/array.ts +++ b/packages/stardust-core/src/binding/array.ts @@ -19,7 +19,7 @@ export interface TextureData { /** Texture data binding */ export abstract class TextureBinding { - public abstract getTextureData(): TextureData; + public abstract getTextureData(GL: WebGLRenderingContext): TextureData; } export type ArrayBindingFunction = ( @@ -34,35 +34,54 @@ export class ArrayBinding extends TextureBinding { private _dirty = false; private _textureData: TextureData = null; - public getTextureData(): TextureData { + public getTextureData(GL: WebGLRenderingContext): TextureData { if (this._dirty) { + const MAX_TEXTURE_SIZE = GL.getParameter(GL.MAX_TEXTURE_SIZE); const values = this._data.map(this._valueFunction).map(getBindingValue); + let width = values.length; + let height = 1; + let length = width * height; if (values.length == 0) { this._textureData = null; } else { + if (width > MAX_TEXTURE_SIZE) { + height = Math.ceil(width / MAX_TEXTURE_SIZE); + width = MAX_TEXTURE_SIZE; + length = height * width; + } let array: Float32Array; let numberComponents: number; if (typeof values[0] == "number") { numberComponents = 1; - array = new Float32Array(values.length * 4); - for (let i = 0; i < values.length; i++) { - array[i * 4] = values[i] as number; + array = new Float32Array(length * 4); + for (let i = 0; i < length; i++) { + if (i < values.length) { + array[i * 4] = values[i] as number; + } else { + array[i * 4] = 0; + } } } else { numberComponents = (values[0] as number[]).length; - array = new Float32Array(values.length * 4); + array = new Float32Array(length * 4); let offset = 0; - for (let i = 0; i < values.length; i++) { - const v = values[i] as number[]; - for (let j = 0; j < numberComponents; j++) { - array[offset++] = v[j]; - } - offset += 4 - numberComponents; + for (let i = 0; i < length; i++) { + if (i < values.length) { + const v = values[i] as number[]; + for (let j = 0; j < numberComponents; j++) { + array[offset++] = v[j]; + } + offset += 4 - numberComponents; + } else { + for (let j = 0; j < 4; j++) { + array[offset++] = 0; + } + } } } this._textureData = { - width: this._data.length, - height: 1, + width, + height, dimensions: 1, type: "f32", numberComponents, @@ -117,7 +136,7 @@ export class Image extends TextureBinding { }; } - public getTextureData() { + public getTextureData(GL: WebGLRenderingContext) { return this._data; } } diff --git a/packages/stardust-webgl/src/webgl/webgl.ts b/packages/stardust-webgl/src/webgl/webgl.ts index 036be24..28db76f 100644 --- a/packages/stardust-webgl/src/webgl/webgl.ts +++ b/packages/stardust-webgl/src/webgl/webgl.ts @@ -121,7 +121,7 @@ class WebGLPlatformMarkProgram { this.setUniform(name, types.int, unit); } const cache = this._textures.get(name); - const newData = texture.getTextureData(); + const newData = texture.getTextureData(GL); if (cache.data == newData) { return; } else {