diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/textures/ArrayTexture.js b/src/core/textures/ArrayTexture.js new file mode 100644 index 0000000..e609fe3 --- /dev/null +++ b/src/core/textures/ArrayTexture.js @@ -0,0 +1,75 @@ +import Texture from './BaseTexture'; +import ImageResource from './resources/ImageResource'; +import {TARGETS} from './../const'; + +export default class ArrayTexture extends Texture +{ + constructor(width, height, size, format) + { + super(null, 0, 1, width, height, format); + + this.target = TARGETS.TEXTURE_2D_ARRAY; + this.size = size; + this._new = true; + this.array = []; + } + + setResource(resource, index) + { + var layer = this.array[index]; + if(!layer) + { + layer = this.array[index] = {index:index, texture:this, resource:null, texturePart:true, dirtyId:0}; + } + + layer.resource = resource; + + resource.load.then((resource) => { + + if(layer.resource === resource) + { + this.validate(); + this.dirtyId++; + } + + }) + } + + validate() + { + let valid = true; + + if(this.width === -1 || this.height === -1) + { + valid = false; + } + + if(this.array) + { + for (var i = 0; i < this.array.length; i++) { + + const layer = this.array[i]; + + if(layer.resource && !layer.resource.loaded) + { + valid = false; + break; + } + } + } + + this.valid = valid; + } + + static from(width, height, ...urls) + { + var arrayTexture = new ArrayTexture(width, height); + + for (var i = 0; i < 6; i++) + { + arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); + } + + return arrayTexture; + } +} \ No newline at end of file diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/textures/ArrayTexture.js b/src/core/textures/ArrayTexture.js new file mode 100644 index 0000000..e609fe3 --- /dev/null +++ b/src/core/textures/ArrayTexture.js @@ -0,0 +1,75 @@ +import Texture from './BaseTexture'; +import ImageResource from './resources/ImageResource'; +import {TARGETS} from './../const'; + +export default class ArrayTexture extends Texture +{ + constructor(width, height, size, format) + { + super(null, 0, 1, width, height, format); + + this.target = TARGETS.TEXTURE_2D_ARRAY; + this.size = size; + this._new = true; + this.array = []; + } + + setResource(resource, index) + { + var layer = this.array[index]; + if(!layer) + { + layer = this.array[index] = {index:index, texture:this, resource:null, texturePart:true, dirtyId:0}; + } + + layer.resource = resource; + + resource.load.then((resource) => { + + if(layer.resource === resource) + { + this.validate(); + this.dirtyId++; + } + + }) + } + + validate() + { + let valid = true; + + if(this.width === -1 || this.height === -1) + { + valid = false; + } + + if(this.array) + { + for (var i = 0; i < this.array.length; i++) { + + const layer = this.array[i]; + + if(layer.resource && !layer.resource.loaded) + { + valid = false; + break; + } + } + } + + this.valid = valid; + } + + static from(width, height, ...urls) + { + var arrayTexture = new ArrayTexture(width, height); + + for (var i = 0; i < 6; i++) + { + arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); + } + + return arrayTexture; + } +} \ No newline at end of file diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 90e457c..57c4cc5 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -166,6 +166,17 @@ */ } + updateResolution() + { + const resource = this.resource; + + if(resource && resource.width !== -1 && resource.hight !== -1) + { + this.width = resource.width / this.resolution; + this.height = resource.height / this.resolution; + } + } + setResource(resource) { // TODO currently a resource can only be set once.. @@ -198,17 +209,10 @@ resourceLoaded(resource) { - // console.log(this) - // console.log("****** LOADED...") - if(resource === resource) + if(this.resource === resource) { - if(resource.width !== -1 && resource.hight !== -1) - { - this.width = resource.width / this.resolution; - this.height = resource.height / this.resolution; - } + this.updateResolution(); - // console.log(this.width, this.height) this.validate(); if(this.valid) diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/textures/ArrayTexture.js b/src/core/textures/ArrayTexture.js new file mode 100644 index 0000000..e609fe3 --- /dev/null +++ b/src/core/textures/ArrayTexture.js @@ -0,0 +1,75 @@ +import Texture from './BaseTexture'; +import ImageResource from './resources/ImageResource'; +import {TARGETS} from './../const'; + +export default class ArrayTexture extends Texture +{ + constructor(width, height, size, format) + { + super(null, 0, 1, width, height, format); + + this.target = TARGETS.TEXTURE_2D_ARRAY; + this.size = size; + this._new = true; + this.array = []; + } + + setResource(resource, index) + { + var layer = this.array[index]; + if(!layer) + { + layer = this.array[index] = {index:index, texture:this, resource:null, texturePart:true, dirtyId:0}; + } + + layer.resource = resource; + + resource.load.then((resource) => { + + if(layer.resource === resource) + { + this.validate(); + this.dirtyId++; + } + + }) + } + + validate() + { + let valid = true; + + if(this.width === -1 || this.height === -1) + { + valid = false; + } + + if(this.array) + { + for (var i = 0; i < this.array.length; i++) { + + const layer = this.array[i]; + + if(layer.resource && !layer.resource.loaded) + { + valid = false; + break; + } + } + } + + this.valid = valid; + } + + static from(width, height, ...urls) + { + var arrayTexture = new ArrayTexture(width, height); + + for (var i = 0; i < 6; i++) + { + arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); + } + + return arrayTexture; + } +} \ No newline at end of file diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 90e457c..57c4cc5 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -166,6 +166,17 @@ */ } + updateResolution() + { + const resource = this.resource; + + if(resource && resource.width !== -1 && resource.hight !== -1) + { + this.width = resource.width / this.resolution; + this.height = resource.height / this.resolution; + } + } + setResource(resource) { // TODO currently a resource can only be set once.. @@ -198,17 +209,10 @@ resourceLoaded(resource) { - // console.log(this) - // console.log("****** LOADED...") - if(resource === resource) + if(this.resource === resource) { - if(resource.width !== -1 && resource.hight !== -1) - { - this.width = resource.width / this.resolution; - this.height = resource.height / this.resolution; - } + this.updateResolution(); - // console.log(this.width, this.height) this.validate(); if(this.valid) diff --git a/src/core/textures/Spritesheet.js b/src/core/textures/Spritesheet.js index 85abccf..dc35fd9 100644 --- a/src/core/textures/Spritesheet.js +++ b/src/core/textures/Spritesheet.js @@ -112,7 +112,8 @@ if (resolution !== 1) { this.baseTexture.resolution = resolution; - this.baseTexture.update(); + this.baseTexture.updateResolution(); + //this.baseTexture.update(); } return resolution; diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/textures/ArrayTexture.js b/src/core/textures/ArrayTexture.js new file mode 100644 index 0000000..e609fe3 --- /dev/null +++ b/src/core/textures/ArrayTexture.js @@ -0,0 +1,75 @@ +import Texture from './BaseTexture'; +import ImageResource from './resources/ImageResource'; +import {TARGETS} from './../const'; + +export default class ArrayTexture extends Texture +{ + constructor(width, height, size, format) + { + super(null, 0, 1, width, height, format); + + this.target = TARGETS.TEXTURE_2D_ARRAY; + this.size = size; + this._new = true; + this.array = []; + } + + setResource(resource, index) + { + var layer = this.array[index]; + if(!layer) + { + layer = this.array[index] = {index:index, texture:this, resource:null, texturePart:true, dirtyId:0}; + } + + layer.resource = resource; + + resource.load.then((resource) => { + + if(layer.resource === resource) + { + this.validate(); + this.dirtyId++; + } + + }) + } + + validate() + { + let valid = true; + + if(this.width === -1 || this.height === -1) + { + valid = false; + } + + if(this.array) + { + for (var i = 0; i < this.array.length; i++) { + + const layer = this.array[i]; + + if(layer.resource && !layer.resource.loaded) + { + valid = false; + break; + } + } + } + + this.valid = valid; + } + + static from(width, height, ...urls) + { + var arrayTexture = new ArrayTexture(width, height); + + for (var i = 0; i < 6; i++) + { + arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); + } + + return arrayTexture; + } +} \ No newline at end of file diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 90e457c..57c4cc5 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -166,6 +166,17 @@ */ } + updateResolution() + { + const resource = this.resource; + + if(resource && resource.width !== -1 && resource.hight !== -1) + { + this.width = resource.width / this.resolution; + this.height = resource.height / this.resolution; + } + } + setResource(resource) { // TODO currently a resource can only be set once.. @@ -198,17 +209,10 @@ resourceLoaded(resource) { - // console.log(this) - // console.log("****** LOADED...") - if(resource === resource) + if(this.resource === resource) { - if(resource.width !== -1 && resource.hight !== -1) - { - this.width = resource.width / this.resolution; - this.height = resource.height / this.resolution; - } + this.updateResolution(); - // console.log(this.width, this.height) this.validate(); if(this.valid) diff --git a/src/core/textures/Spritesheet.js b/src/core/textures/Spritesheet.js index 85abccf..dc35fd9 100644 --- a/src/core/textures/Spritesheet.js +++ b/src/core/textures/Spritesheet.js @@ -112,7 +112,8 @@ if (resolution !== 1) { this.baseTexture.resolution = resolution; - this.baseTexture.update(); + this.baseTexture.updateResolution(); + //this.baseTexture.update(); } return resolution; diff --git a/src/core/textures/Texture.js b/src/core/textures/Texture.js index e24ab9a..609d87c 100644 --- a/src/core/textures/Texture.js +++ b/src/core/textures/Texture.js @@ -390,8 +390,8 @@ { texture = new Texture(new BaseTexture(source)); texture.baseTexture.cacheId = cacheId; - TextureCache[cacheId] = texture; - BaseTextureCache[cacheId] = texture.baseTexture; + BaseTexture.addToCache(texture.baseTexture, cacheId); + Texture.addToCache(texture, cacheId); } else { diff --git a/src/core/const.js b/src/core/const.js index 2c68dee..f10cc4b 100644 --- a/src/core/const.js +++ b/src/core/const.js @@ -147,6 +147,7 @@ export const TARGETS = { TEXTURE_2D:3553, TEXTURE_CUBE_MAP:34067, + TEXTURE_2D_ARRAY:35866, TEXTURE_CUBE_MAP_POSITIVE_X:34069, TEXTURE_CUBE_MAP_NEGATIVE_X:34070, TEXTURE_CUBE_MAP_POSITIVE_Y:34071, diff --git a/src/core/index.js b/src/core/index.js index eb91185..1dd4c96 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -35,6 +35,7 @@ export { default as FrameBuffer } from './textures/FrameBuffer'; export { default as CubeTexture } from './textures/CubeTexture'; export { default as BaseTexture } from './textures/BaseTexture'; +export { default as ArrayTexture } from './textures/ArrayTexture'; export { default as Texture } from './textures/Texture'; export { default as RenderTexture } from './textures/RenderTexture'; export { default as BaseRenderTexture } from './textures/BaseRenderTexture'; diff --git a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js index 1c57353..9f82434 100644 --- a/src/core/renderers/webgl/systems/shader/shader/defaultValue.js +++ b/src/core/renderers/webgl/systems/shader/shader/defaultValue.js @@ -4,36 +4,37 @@ * @param type {String} Type of value * @param size {Number} */ -var defaultValue = function(type, size) +var defaultValue = function(type, size) { switch (type) { case 'float': return 0; - case 'vec2': + case 'vec2': return new Float32Array(2 * size); case 'vec3': return new Float32Array(3 * size); - case 'vec4': + case 'vec4': return new Float32Array(4 * size); - + case 'int': case 'sampler2D': + case 'sampler2DArray': return 0; - case 'ivec2': + case 'ivec2': return new Int32Array(2 * size); case 'ivec3': return new Int32Array(3 * size); - case 'ivec4': + case 'ivec4': return new Int32Array(4 * size); - case 'bool': + case 'bool': return false; case 'bvec2': @@ -50,7 +51,7 @@ return new Float32Array([1, 0, 0, 1]); - case 'mat3': + case 'mat3': return new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]); @@ -67,7 +68,7 @@ { var array = new Array(size); - for (var i = 0; i < array.length; i++) + for (var i = 0; i < array.length; i++) { array[i] = false; } diff --git a/src/core/renderers/webgl/systems/shader/shader/mapType.js b/src/core/renderers/webgl/systems/shader/shader/mapType.js index 917538a..aa837e2 100644 --- a/src/core/renderers/webgl/systems/shader/shader/mapType.js +++ b/src/core/renderers/webgl/systems/shader/shader/mapType.js @@ -15,6 +15,7 @@ } } + // console.log(gl) return GL_TABLE[type]; }; @@ -41,7 +42,8 @@ 'FLOAT_MAT4': 'mat4', 'SAMPLER_2D': 'sampler2D', - 'SAMPLER_CUBE': 'samplerCube' + 'SAMPLER_CUBE': 'samplerCube', + 'SAMPLER_2D_ARRAY': 'sampler2DArray' }; module.exports = mapSize; diff --git a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js index 383459a..a765378 100644 --- a/src/core/renderers/webgl/systems/shader/shader/setPrecision.js +++ b/src/core/renderers/webgl/systems/shader/shader/setPrecision.js @@ -7,7 +7,7 @@ */ var setPrecision = function(src, precision) { - if(src.substring(0, 9) !== 'precision') + if(src.substring(0, 9) !== 'precision' && src.substring(0, 1) !== '#') { return 'precision ' + precision + ' float;\n' + src; } diff --git a/src/core/renderers/webgl/systems/textures/TextureSystem.js b/src/core/renderers/webgl/systems/textures/TextureSystem.js index 8416cec..342b5fb 100644 --- a/src/core/renderers/webgl/systems/textures/TextureSystem.js +++ b/src/core/renderers/webgl/systems/textures/TextureSystem.js @@ -96,7 +96,6 @@ { const glTexture = texture._glTextures[this.CONTEXT_UID] || this.initTexture(texture); - gl.bindTexture(texture.target, glTexture.texture); if(glTexture.dirtyId !== texture.dirtyId) @@ -207,6 +206,55 @@ } } } + if(texture.target === gl.TEXTURE_2D_ARRAY) + { + console.log("REMEMBER THIS IS TOO MANY!") + gl.texImage3D(gl.TEXTURE_2D_ARRAY, + 0, + texture.format, + texture.width, + texture.height, + 6, + 0, + texture.format, + texture.type, + null); + + for (var i = 0; i < texture.array.length; i++) + { + // TODO - we should only upload what changed.. + // but im sure this is not going to be a problem just yet! + var texturePart = texture.array[i]; + + if(texturePart.resource) + { + // void gl.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, ImageBitmap? pixels); + console.log(texturePart.resource.source) + + if(texturePart.resource.loaded) + { + console.log("UPOAD..") + gl.texSubImage3D(gl.TEXTURE_2D_ARRAY, + 0, + 0,//xoffset + 0,//yoffset + i,//zoffset + texturePart.resource.width, + texturePart.resource.height, + 1, + texture.format, + texture.type, + texturePart.resource.source); + } + + } + else + { + + + } + } + } else { if(texture.resource) diff --git a/src/core/shader/Program.js b/src/core/shader/Program.js index 6fb038e..ac37001 100644 --- a/src/core/shader/Program.js +++ b/src/core/shader/Program.js @@ -71,7 +71,6 @@ this.attributeData = this.getAttributeData(program, gl); this.uniformData = this.getUniformData(program, gl); - //gl.deleteProgram(program); } } diff --git a/src/core/shader/generateUniformsSync2.js b/src/core/shader/generateUniformsSync2.js index 4fd60fe..8a0fd6b 100644 --- a/src/core/shader/generateUniformsSync2.js +++ b/src/core/shader/generateUniformsSync2.js @@ -38,6 +38,7 @@ sampler2D: 'gl.uniform1i(location, value)', samplerCube: 'gl.uniform1i(location, value)', + sampler2DArray: 'gl.uniform1i(location, value)', }; const GLSL_TO_ARRAY_SETTERS = { @@ -60,6 +61,7 @@ sampler2D: 'gl.uniform1iv(location, value)', samplerCube: 'gl.uniform1iv(location, value)', + sampler2DArray: 'gl.uniform1iv(location, value)', }; export default function generateUniformsSync2(group, uniformData) @@ -96,7 +98,7 @@ gl.uniform1f(uniformData.${i}.location, uniformValues.${i}) }\n`; } - else if ( (data.type === 'sampler2D' || data.type === 'samplerCube') && data.size === 1) + else if ( (data.type === 'sampler2D' || data.type === 'samplerCube' || data.type === 'sampler2DArray') && data.size === 1) { func += `\nif (uniformValues.${i}.baseTexture) { @@ -181,8 +183,8 @@ } } - //console.log(' --------------- ') - //console.log(func); + console.log(' --------------- ') + console.log(func); return new Function('uniformData', 'uniformValues', 'renderer', func); // eslint-disable-line no-new-func } diff --git a/src/core/textures/ArrayTexture.js b/src/core/textures/ArrayTexture.js new file mode 100644 index 0000000..e609fe3 --- /dev/null +++ b/src/core/textures/ArrayTexture.js @@ -0,0 +1,75 @@ +import Texture from './BaseTexture'; +import ImageResource from './resources/ImageResource'; +import {TARGETS} from './../const'; + +export default class ArrayTexture extends Texture +{ + constructor(width, height, size, format) + { + super(null, 0, 1, width, height, format); + + this.target = TARGETS.TEXTURE_2D_ARRAY; + this.size = size; + this._new = true; + this.array = []; + } + + setResource(resource, index) + { + var layer = this.array[index]; + if(!layer) + { + layer = this.array[index] = {index:index, texture:this, resource:null, texturePart:true, dirtyId:0}; + } + + layer.resource = resource; + + resource.load.then((resource) => { + + if(layer.resource === resource) + { + this.validate(); + this.dirtyId++; + } + + }) + } + + validate() + { + let valid = true; + + if(this.width === -1 || this.height === -1) + { + valid = false; + } + + if(this.array) + { + for (var i = 0; i < this.array.length; i++) { + + const layer = this.array[i]; + + if(layer.resource && !layer.resource.loaded) + { + valid = false; + break; + } + } + } + + this.valid = valid; + } + + static from(width, height, ...urls) + { + var arrayTexture = new ArrayTexture(width, height); + + for (var i = 0; i < 6; i++) + { + arrayTexture.setResource(ImageResource.from(urls[i % urls.length]), i); + } + + return arrayTexture; + } +} \ No newline at end of file diff --git a/src/core/textures/BaseTexture.js b/src/core/textures/BaseTexture.js index 90e457c..57c4cc5 100644 --- a/src/core/textures/BaseTexture.js +++ b/src/core/textures/BaseTexture.js @@ -166,6 +166,17 @@ */ } + updateResolution() + { + const resource = this.resource; + + if(resource && resource.width !== -1 && resource.hight !== -1) + { + this.width = resource.width / this.resolution; + this.height = resource.height / this.resolution; + } + } + setResource(resource) { // TODO currently a resource can only be set once.. @@ -198,17 +209,10 @@ resourceLoaded(resource) { - // console.log(this) - // console.log("****** LOADED...") - if(resource === resource) + if(this.resource === resource) { - if(resource.width !== -1 && resource.hight !== -1) - { - this.width = resource.width / this.resolution; - this.height = resource.height / this.resolution; - } + this.updateResolution(); - // console.log(this.width, this.height) this.validate(); if(this.valid) diff --git a/src/core/textures/Spritesheet.js b/src/core/textures/Spritesheet.js index 85abccf..dc35fd9 100644 --- a/src/core/textures/Spritesheet.js +++ b/src/core/textures/Spritesheet.js @@ -112,7 +112,8 @@ if (resolution !== 1) { this.baseTexture.resolution = resolution; - this.baseTexture.update(); + this.baseTexture.updateResolution(); + //this.baseTexture.update(); } return resolution; diff --git a/src/core/textures/Texture.js b/src/core/textures/Texture.js index e24ab9a..609d87c 100644 --- a/src/core/textures/Texture.js +++ b/src/core/textures/Texture.js @@ -390,8 +390,8 @@ { texture = new Texture(new BaseTexture(source)); texture.baseTexture.cacheId = cacheId; - TextureCache[cacheId] = texture; - BaseTextureCache[cacheId] = texture.baseTexture; + BaseTexture.addToCache(texture.baseTexture, cacheId); + Texture.addToCache(texture, cacheId); } else { diff --git a/src/core/textures/resources/ImageResource.js b/src/core/textures/resources/ImageResource.js index cf267ed..8ef933a 100644 --- a/src/core/textures/resources/ImageResource.js +++ b/src/core/textures/resources/ImageResource.js @@ -17,11 +17,28 @@ source.onerror = null; this.width = source.width; this.height = source.height; - resolve(this); + + if(window.createImageBitmap) + { + createImageBitmap(source).then((imageBitmap)=>{ + + this.source = imageBitmap; + + resolve(this); + + }) + } + else + { + resolve(this); + } + + } + if(source.complete && source.src) { this.loaded = true; @@ -29,8 +46,21 @@ source.onerror = null; this.width = source.width; this.height = source.height; - // console.log("image") - resolve(this); + + if(window.createImageBitmap) + { + createImageBitmap(source).then((imageBitmap)=>{ + + this.source = imageBitmap; + + resolve(this); + + }) + } + else + { + resolve(this); + } } // source.onerror = () => {