First commit
This commit is contained in:
190
engine/sampler2D.js
Executable file
190
engine/sampler2D.js
Executable file
@@ -0,0 +1,190 @@
|
||||
/*
|
||||
* 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};
|
||||
Reference in New Issue
Block a user