191 lines
4.2 KiB
JavaScript
191 lines
4.2 KiB
JavaScript
|
|
/*
|
||
|
|
* Copyright 2013-2019, kaj dijkstra,
|
||
|
|
* Author, Kaj Dijkstra.
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
|
||
|
|
import texture from './texture.js';
|
||
|
|
import {math} from './math.js';
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Sampler2D
|
||
|
|
**/
|
||
|
|
class sampler2D{
|
||
|
|
|
||
|
|
constructor( ){
|
||
|
|
|
||
|
|
this.texture;
|
||
|
|
|
||
|
|
this.id = ++kepler.samplerId;
|
||
|
|
|
||
|
|
this.alpha = 1.0;
|
||
|
|
|
||
|
|
this.binded = false;
|
||
|
|
this.anisotropic = false;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setViewport( viewport ){
|
||
|
|
|
||
|
|
this.viewport = viewport;
|
||
|
|
this.gl = viewport.gl;
|
||
|
|
|
||
|
|
this.FLIP_Y = true;
|
||
|
|
this.filter = this.gl.NEAREST;
|
||
|
|
this.filter = this.gl.LINEAR;
|
||
|
|
|
||
|
|
this.MIN_FILTER = this.gl.LINEAR;
|
||
|
|
this.MAG_FILTER = this.gl.LINEAR;
|
||
|
|
|
||
|
|
this.WRAP_S = this.gl.REPEAT;
|
||
|
|
this.WRAP_T = this.gl.REPEAT;
|
||
|
|
|
||
|
|
this.datatype = this.gl.RGBA;
|
||
|
|
this.format = this.gl.RGBA;
|
||
|
|
this.internalFormat = this.gl.RGBA;
|
||
|
|
|
||
|
|
this.target = this.gl.TEXTURE_2D;
|
||
|
|
|
||
|
|
this.type = this.gl.FLOAT;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
setTarget( viewport ) {
|
||
|
|
|
||
|
|
|
||
|
|
var textureObject = new texture();
|
||
|
|
|
||
|
|
textureObject.setViewport( viewport );
|
||
|
|
|
||
|
|
this.addTexture( textureObject );
|
||
|
|
}
|
||
|
|
|
||
|
|
getTexture( face ) {
|
||
|
|
|
||
|
|
return this.texture;
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
getTextures( ) {
|
||
|
|
return [this.texture];
|
||
|
|
}
|
||
|
|
|
||
|
|
addTexture( textureObject ) {
|
||
|
|
|
||
|
|
this.texture = textureObject;
|
||
|
|
}
|
||
|
|
|
||
|
|
setType(type) {
|
||
|
|
|
||
|
|
//this.texture.type = "type";
|
||
|
|
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* bind sampler to shader
|
||
|
|
* @param {(shader)} shader
|
||
|
|
**/
|
||
|
|
bind(shader) {
|
||
|
|
var txt = this.texture;
|
||
|
|
var data = this.texture.data;
|
||
|
|
var type = txt.dataType;
|
||
|
|
var gl = this.gl;
|
||
|
|
//this.type = type;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
if (type == "framebuffer" ) {
|
||
|
|
|
||
|
|
this.texture.glTexture = this.texture.data;
|
||
|
|
type = txt.type;
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
var mips = [];
|
||
|
|
var width = txt.width;
|
||
|
|
var height = txt.height;
|
||
|
|
|
||
|
|
//if(!this.binded)
|
||
|
|
this.id = 1 + shader.samplerId++;
|
||
|
|
|
||
|
|
|
||
|
|
gl.activeTexture(gl.TEXTURE0 + this.id);
|
||
|
|
|
||
|
|
gl.enable ( this.gl.BLEND ) ;
|
||
|
|
gl.bindTexture(gl.TEXTURE_2D, txt.glTexture );
|
||
|
|
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, this.FLIP_Y);
|
||
|
|
|
||
|
|
//serialize txt data type
|
||
|
|
switch( type ) {
|
||
|
|
case "float":
|
||
|
|
this.type = this.gl.FLOAT;
|
||
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, kepler.extensions.EXT_sRGB , width, height, 0, this.internalFormat, this.type, data);
|
||
|
|
break;
|
||
|
|
case "int":
|
||
|
|
this.type = this.gl.UNSIGNED_BYTE;
|
||
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.internalFormat, this.type, data);
|
||
|
|
break;
|
||
|
|
case "depth":
|
||
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, this.gl.DEPTH_COMPONENT, width, height, 0, this.gl.DEPTH_COMPONENT, this.gl.UNSIGNED_SHORT, null);
|
||
|
|
break;
|
||
|
|
case "image":
|
||
|
|
this.type = this.gl.UNSIGNED_BYTE;
|
||
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, this.format, this.internalFormat,this.type, data);
|
||
|
|
break;
|
||
|
|
case "canvas":
|
||
|
|
gl.texImage2D(gl.TEXTURE_2D, 0, this.format, width, height, 0, this.internalFormat, this.UNSIGNED_BYTE, data);
|
||
|
|
break;
|
||
|
|
case "COMPRESSED_RGBA":
|
||
|
|
|
||
|
|
//var textureCompression = kepler.extensions.textureCompression;
|
||
|
|
var mipmaps = txt.mipmaps;
|
||
|
|
|
||
|
|
var width = mipmaps[0].width;
|
||
|
|
var height = mipmaps[0].height;
|
||
|
|
|
||
|
|
for(var i = 0; i < mipmaps.length; i++) {
|
||
|
|
var mipmap = mipmaps[i];
|
||
|
|
|
||
|
|
gl.compressedTexImage2D(gl.TEXTURE_2D, i, mipmap.internalFormat, mipmap.width, mipmap.height, 0, mipmap.byteArray);
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if(this.anisotropic) {
|
||
|
|
|
||
|
|
//var extension = kepler.extensions.anisotropic;
|
||
|
|
//gl.texParameteri( this.gl.TEXTURE_2D, extension.TEXTURE_MAX_ANISOTROPY_EXT, this.anisotropic );
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
if (math.isPowerOfTwo(width) && math.isPowerOfTwo(height) ) {
|
||
|
|
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_LINEAR);// mipmaps > 1 ? this.gl.LINEAR_MIPMAP_LINEAR : this.gl.LINEAR
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.WRAP_S);
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.WRAP_T);
|
||
|
|
|
||
|
|
if(this.type != this.gl.FLOAT)
|
||
|
|
gl.generateMipmap(gl.TEXTURE_2D);
|
||
|
|
|
||
|
|
} else {
|
||
|
|
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR);
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_S, this.gl.CLAMP_TO_EDGE);
|
||
|
|
gl.texParameteri(gl.TEXTURE_2D, this.gl.TEXTURE_WRAP_T, this.gl.CLAMP_TO_EDGE);
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
||
|
|
this.binded = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
export {sampler2D as default};
|