1191 lines
36 KiB
JavaScript
1191 lines
36 KiB
JavaScript
import GLenum from './GLenum';
|
|
import ActiveInfo from './ActiveInfo';
|
|
import Buffer from './Buffer';
|
|
import Framebuffer from './Framebuffer';
|
|
import Renderbuffer from './Renderbuffer';
|
|
import Texture from './Texture';
|
|
import Program from './Program';
|
|
import Shader from './Shader';
|
|
import ShaderPrecisionFormat from './ShaderPrecisionFormat';
|
|
import UniformLocation from './UniformLocation';
|
|
import GLmethod from './GLmethod';
|
|
|
|
const processArray = (array, checkArrayType = false) => {
|
|
|
|
function joinArray(arr, sep) {
|
|
let res = '';
|
|
for (let i = 0; i < arr.length; i++) {
|
|
if (i !== 0) {
|
|
res += sep;
|
|
}
|
|
res += arr[i];
|
|
}
|
|
return res;
|
|
}
|
|
|
|
let type = 'Float32Array';
|
|
if (checkArrayType) {
|
|
if (array instanceof Uint8Array) {
|
|
type = 'Uint8Array'
|
|
} else if (array instanceof Uint16Array) {
|
|
type = 'Uint16Array';
|
|
} else if (array instanceof Uint32Array) {
|
|
type = 'Uint32Array';
|
|
} else if (array instanceof Float32Array) {
|
|
type = 'Float32Array';
|
|
} else {
|
|
throw new Error('Check array type failed. Array type is ' + typeof array);
|
|
}
|
|
}
|
|
|
|
const ArrayTypes = {
|
|
Uint8Array: 1,
|
|
Uint16Array: 2,
|
|
Uint32Array: 4,
|
|
Float32Array: 14
|
|
};
|
|
return ArrayTypes[type] + ',' + btoa(joinArray(array, ','))
|
|
}
|
|
|
|
export default class WebGLRenderingContext {
|
|
|
|
// static GBridge = null;
|
|
|
|
className = 'WebGLRenderingContext';
|
|
|
|
constructor(canvas, type, attrs) {
|
|
this._canvas = canvas;
|
|
this._type = type;
|
|
this._version = 'WebGL 1.0';
|
|
this._attrs = attrs;
|
|
this._map = new Map();
|
|
|
|
Object.keys(GLenum)
|
|
.forEach(name => Object.defineProperty(this, name, {
|
|
value: GLenum[name]
|
|
}));
|
|
}
|
|
|
|
get canvas() {
|
|
return this._canvas;
|
|
}
|
|
|
|
activeTexture = function (textureUnit) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.activeTexture + ',' + textureUnit,
|
|
true
|
|
);
|
|
}
|
|
|
|
attachShader = function (progarm, shader) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.attachShader + ',' + progarm.id + ',' + shader.id,
|
|
true
|
|
);
|
|
}
|
|
|
|
bindAttribLocation = function (program, index, name) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bindAttribLocation + ',' + program.id + ',' + index + ',' + name,
|
|
true
|
|
)
|
|
}
|
|
|
|
bindBuffer = function (target, buffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bindBuffer + ',' + target + ',' + (buffer ? buffer.id : 0),
|
|
true
|
|
);
|
|
}
|
|
|
|
bindFramebuffer = function (target, framebuffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bindFramebuffer + ',' + target + ',' + (framebuffer ? framebuffer.id : 0),
|
|
true
|
|
)
|
|
}
|
|
|
|
bindRenderbuffer = function (target, renderBuffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bindRenderbuffer + ',' + target + ',' + (renderBuffer ? renderBuffer.id : 0),
|
|
true
|
|
)
|
|
}
|
|
|
|
bindTexture = function (target, texture) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bindTexture + ',' + target + ',' + (texture ? texture.id : 0),
|
|
true
|
|
)
|
|
}
|
|
|
|
blendColor = function (r, g, b, a) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.blendColor + ',' + target + ',' + r + ',' + g + ',' + b + ',' + a,
|
|
true
|
|
)
|
|
}
|
|
|
|
blendEquation = function (mode) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.blendEquation + ',' + mode,
|
|
true
|
|
)
|
|
}
|
|
|
|
blendEquationSeparate = function (modeRGB, modeAlpha) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.blendEquationSeparate + ',' + modeRGB + ',' + modeAlpha,
|
|
true
|
|
)
|
|
}
|
|
|
|
|
|
blendFunc = function (sfactor, dfactor) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.blendFunc + ',' + sfactor + ',' + dfactor,
|
|
true
|
|
);
|
|
}
|
|
|
|
blendFuncSeparate = function (srcRGB, dstRGB, srcAlpha, dstAlpha) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.blendFuncSeparate + ',' + srcRGB + ',' + dstRGB + ',' + srcAlpha + ',' + dstAlpha,
|
|
true
|
|
);
|
|
}
|
|
|
|
bufferData = function (target, data, usage) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bufferData + ',' + target + ',' + processArray(data, true) + ',' + usage,
|
|
true
|
|
)
|
|
}
|
|
|
|
bufferSubData = function (target, offset, data) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.bufferSubData + ',' + target + ',' + offset + ',' + processArray(data, true),
|
|
true
|
|
)
|
|
}
|
|
|
|
checkFramebufferStatus = function (target) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.checkFramebufferStatus + ',' + target
|
|
);
|
|
return Number(result);
|
|
}
|
|
|
|
clear = function (mask) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.clear + ',' + mask
|
|
);
|
|
this._canvas._needRender = true;
|
|
}
|
|
|
|
clearColor = function (r, g, b, a) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.clearColor + ',' + r + ',' + g + ',' + b,
|
|
true
|
|
)
|
|
}
|
|
|
|
clearDepth = function (depth) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.clearDepth + ',' + depth,
|
|
true
|
|
)
|
|
}
|
|
|
|
clearStencil = function (s) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.clearStencil + ',' + s
|
|
);
|
|
}
|
|
|
|
colorMask = function (r, g, b, a) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.colorMask + ',' + r + ',' + g + ',' + b + ',' + a
|
|
)
|
|
}
|
|
|
|
compileShader = function (shader) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.compileShader + ',' + shader.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
compressedTexImage2D = function (target, level, internalformat, width, height, border, pixels) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.compressedTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' +
|
|
width + ',' + height + ',' + border + ',' + processArray(pixels),
|
|
true
|
|
)
|
|
}
|
|
|
|
compressedTexSubImage2D = function (target, level, xoffset, yoffset, width, height, format, pixels) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.compressedTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' +
|
|
width + ',' + height + ',' + format + ',' + processArray(pixels),
|
|
true
|
|
)
|
|
}
|
|
|
|
|
|
copyTexImage2D = function (target, level, internalformat, x, y, width, height, border) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.copyTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + x + ',' + y + ',' +
|
|
width + ',' + height + ',' + border,
|
|
true
|
|
);
|
|
}
|
|
|
|
copyTexSubImage2D = function (target, level, xoffset, yoffset, x, y, width, height) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.copyTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + x + ',' + y + ',' +
|
|
width + ',' + height
|
|
);
|
|
}
|
|
|
|
createBuffer = function () {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createBuffer + ''
|
|
);
|
|
const buffer = new Buffer(result);
|
|
this._map.set(buffer.uuid(), buffer);
|
|
return buffer;
|
|
}
|
|
|
|
createFramebuffer = function () {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createFramebuffer + ''
|
|
);
|
|
const framebuffer = new Framebuffer(result);
|
|
this._map.set(framebuffer.uuid(), framebuffer);
|
|
return framebuffer;
|
|
}
|
|
|
|
|
|
createProgram = function () {
|
|
const id = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createProgram + ''
|
|
);
|
|
const program = new Program(id);
|
|
this._map.set(program.uuid(), program);
|
|
return program;
|
|
}
|
|
|
|
createRenderbuffer = function () {
|
|
const id = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createRenderbuffer + ''
|
|
)
|
|
const renderBuffer = new Renderbuffer(id);
|
|
this._map.set(renderBuffer.uuid(), renderBuffer);
|
|
return renderBuffer;
|
|
}
|
|
|
|
createShader = function (type) {
|
|
const id = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createShader + ',' + type
|
|
)
|
|
const shader = new Shader(id, type);
|
|
this._map.set(shader.uuid(), shader);
|
|
return shader;
|
|
}
|
|
|
|
createTexture = function () {
|
|
const id = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.createTexture + ''
|
|
);
|
|
const texture = new Texture(id);
|
|
this._map.set(texture.uuid(), texture);
|
|
return texture;
|
|
}
|
|
|
|
cullFace = function (mode) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.cullFace + ',' + mode,
|
|
true
|
|
)
|
|
}
|
|
|
|
|
|
deleteBuffer = function (buffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteBuffer + ',' + buffer.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
deleteFramebuffer = function (framebuffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteFramebuffer + ',' + framebuffer.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
deleteProgram = function (program) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteProgram + ',' + program.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
deleteRenderbuffer = function (renderbuffer) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteRenderbuffer + ',' + renderbuffer.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
deleteShader = function (shader) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteShader + ',' + shader.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
deleteTexture = function (texture) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.deleteTexture + ',' + texture.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
depthFunc = function (func) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.depthFunc + ',' + func
|
|
)
|
|
}
|
|
|
|
depthMask = function (flag) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.depthMask + ',' + Number(flag),
|
|
true
|
|
)
|
|
}
|
|
|
|
depthRange = function (zNear, zFar) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.depthRange + ',' + zNear + ',' + zFar,
|
|
true
|
|
)
|
|
}
|
|
|
|
detachShader = function (program, shader) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.detachShader + ',' + program.id + ',' + shader.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
disable = function (cap) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.disable + ',' + cap,
|
|
true
|
|
)
|
|
}
|
|
|
|
disableVertexAttribArray = function (index) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.disableVertexAttribArray + ',' + index,
|
|
true
|
|
);
|
|
}
|
|
|
|
drawArrays = function (mode, first, count) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.drawArrays + ',' + mode + ',' + first + ',' + count
|
|
)
|
|
this._canvas._needRender = true;
|
|
}
|
|
|
|
drawElements = function (mode, count, type, offset) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.drawElements + ',' + mode + ',' + count + ',' + type + ',' + offset + ';'
|
|
);
|
|
this._canvas._needRender = true;
|
|
}
|
|
|
|
enable = function (cap) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.enable + ',' + cap,
|
|
true
|
|
);
|
|
}
|
|
|
|
enableVertexAttribArray = function (index) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.enableVertexAttribArray + ',' + index,
|
|
true
|
|
)
|
|
}
|
|
|
|
|
|
flush = function () {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.flush + ''
|
|
)
|
|
}
|
|
|
|
framebufferRenderbuffer = function (target, attachment, textarget, texture, level) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.framebufferRenderbuffer + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,
|
|
true
|
|
)
|
|
}
|
|
|
|
framebufferTexture2D = function (target, attachment, textarget, texture, level) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.framebufferTexture2D + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level,
|
|
true
|
|
)
|
|
}
|
|
|
|
frontFace = function (mode) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.frontFace + ',' + mode,
|
|
true
|
|
)
|
|
}
|
|
|
|
generateMipmap = function (target) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.generateMipmap + ',' + target,
|
|
true
|
|
)
|
|
}
|
|
|
|
getActiveAttrib = function (progarm, index) {
|
|
const resultString = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getActiveAttrib + ',' + progarm.id + ',' + index
|
|
)
|
|
const [type, size, name] = resultString.split(',');
|
|
return new ActiveInfo({
|
|
type: Number(type),
|
|
size: Number(size),
|
|
name
|
|
});
|
|
}
|
|
|
|
getActiveUniform = function (progarm, index) {
|
|
const resultString = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getActiveUniform + ',' + progarm.id + ',' + index
|
|
);
|
|
const [type, size, name] = resultString.split(',');
|
|
return new ActiveInfo({
|
|
type: Number(type),
|
|
size: Number(size),
|
|
name
|
|
})
|
|
}
|
|
|
|
getAttachedShaders = function (progarm) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getAttachedShaders + ',' + progarm.id
|
|
);
|
|
const [type, ...ids] = result;
|
|
return ids.map(id => this._map.get(Shader.uuid(id)));
|
|
}
|
|
|
|
getAttribLocation = function (progarm, name) {
|
|
return WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getAttribLocation + ',' + progarm.id + ',' + name
|
|
)
|
|
}
|
|
|
|
getBufferParameter = function (target, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getBufferParameter + ',' + target + ',' + pname
|
|
);
|
|
const [type, res] = getBufferParameter;
|
|
return res;
|
|
}
|
|
|
|
getError = function () {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getError + ''
|
|
)
|
|
return result;
|
|
}
|
|
|
|
getExtension = function (name) {
|
|
return null;
|
|
}
|
|
|
|
getFramebufferAttachmentParameter = function (target, attachment, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getFramebufferAttachmentParameter + ',' + target + ',' + attachment + ',' + pname
|
|
)
|
|
switch (pname) {
|
|
case GLenum.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
|
|
return this._map.get(Renderbuffer.uuid(result)) || this._map.get(Texture.uuid(result)) || null;
|
|
default:
|
|
return result;
|
|
}
|
|
}
|
|
|
|
getParameter = function (pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getParameter + ',' + pname
|
|
)
|
|
switch (pname) {
|
|
case GLenum.VERSION:
|
|
return this._version;
|
|
case GLenum.ARRAY_BUFFER_BINDING: // buffer
|
|
case GLenum.ELEMENT_ARRAY_BUFFER_BINDING: // buffer
|
|
return this._map.get(Buffer.uuid(result)) || null;
|
|
case GLenum.CURRENT_PROGRAM: // program
|
|
return this._map.get(Program.uuid(result)) || null;
|
|
case GLenum.FRAMEBUFFER_BINDING: // framebuffer
|
|
return this._map.get(Framebuffer.uuid(result)) || null;
|
|
case GLenum.RENDERBUFFER_BINDING: // renderbuffer
|
|
return this._map.get(Renderbuffer.uuid(result)) || null;
|
|
case GLenum.TEXTURE_BINDING_2D: // texture
|
|
case GLenum.TEXTURE_BINDING_CUBE_MAP: // texture
|
|
return this._map.get(Texture.uuid(result)) || null;
|
|
case GLenum.ALIASED_LINE_WIDTH_RANGE: // Float32Array
|
|
case GLenum.ALIASED_POINT_SIZE_RANGE: // Float32Array
|
|
case GLenum.BLEND_COLOR: // Float32Array
|
|
case GLenum.COLOR_CLEAR_VALUE: // Float32Array
|
|
case GLenum.DEPTH_RANGE: // Float32Array
|
|
case GLenum.MAX_VIEWPORT_DIMS: // Int32Array
|
|
case GLenum.SCISSOR_BOX: // Int32Array
|
|
case GLenum.VIEWPORT: // Int32Array
|
|
case GLenum.COMPRESSED_TEXTURE_FORMATS: // Uint32Array
|
|
default:
|
|
const [type, ...res] = result.split(',');
|
|
if (res.length === 1) {
|
|
return Number(res[0]);
|
|
} else {
|
|
return res.map(Number);
|
|
}
|
|
}
|
|
}
|
|
|
|
getProgramInfoLog = function (progarm) {
|
|
return WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getProgramInfoLog + ',' + progarm.id
|
|
)
|
|
}
|
|
|
|
getProgramParameter = function (program, pname) {
|
|
const res = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getProgramParameter + ',' + program.id + ',' + pname
|
|
);
|
|
|
|
const [type, result] = res.split(',').map(i => parseInt(i));
|
|
|
|
if (type === 1) {
|
|
return Boolean(result);
|
|
} else if (type === 2) {
|
|
return result;
|
|
} else {
|
|
throw new Error('Unrecongized program paramater ' + res + ', type: ' + typeof res);
|
|
}
|
|
}
|
|
|
|
|
|
getRenderbufferParameter = function (target, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getRenderbufferParameter + ',' + target + ',' + pname
|
|
)
|
|
return result;
|
|
}
|
|
|
|
|
|
getShaderInfoLog = function (shader) {
|
|
return WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getShaderInfoLog + ',' + shader.id
|
|
);
|
|
}
|
|
|
|
getShaderParameter = function (shader, pname) {
|
|
return WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getShaderParameter + ',' + shader.id + ',' + pname
|
|
)
|
|
}
|
|
|
|
getShaderPrecisionFormat = function (shaderType, precisionType) {
|
|
const [rangeMin, rangeMax, precision] = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getShaderPrecisionFormat + ',' + shaderType + ',' + precisionType
|
|
);
|
|
const shaderPrecisionFormat = new ShaderPrecisionFormat({
|
|
rangeMin: Number(rangeMin),
|
|
rangeMax: Number(rangeMax),
|
|
precision: Number(precision)
|
|
});
|
|
return shaderPrecisionFormat;
|
|
}
|
|
|
|
getShaderSource = function (shader) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getShaderSource + ',' + shader.id
|
|
);
|
|
return result;
|
|
}
|
|
|
|
getSupportedExtensions = function () {
|
|
return Object.keys({});
|
|
}
|
|
|
|
getTexParameter = function (target, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getTexParameter + ',' + target + ',' + pname
|
|
)
|
|
return result;
|
|
}
|
|
|
|
getUniformLocation = function (program, name) {
|
|
const id = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getUniformLocation + ',' + program.id + ',' + name
|
|
);
|
|
if (id === -1) {
|
|
return null;
|
|
} else {
|
|
return new UniformLocation(Number(id));
|
|
}
|
|
}
|
|
|
|
getVertexAttrib = function (index, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getVertexAttrib + ',' + index + ',' + pname
|
|
);
|
|
switch (pname) {
|
|
case GLenum.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
|
|
return this._map.get(Buffer.uuid(result)) || null;
|
|
case GLenum.CURRENT_VERTEX_ATTRIB: // Float32Array
|
|
default:
|
|
return result;
|
|
}
|
|
}
|
|
|
|
getVertexAttribOffset = function (index, pname) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.getVertexAttribOffset + ',' + index + ',' + pname
|
|
)
|
|
return Number(result);
|
|
}
|
|
|
|
isBuffer = function (buffer) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isBuffer + ',' + buffer.id
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isContextLost = function () {
|
|
return false;
|
|
}
|
|
|
|
isEnabled = function (cap) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isEnabled + ',' + cap
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isFramebuffer = function (framebuffer) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isFramebuffer + ',' + framebuffer.id
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isProgram = function (program) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isProgram + ',' + program.id
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isRenderbuffer = function (renderBuffer) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isRenderbuffer + ',' + renderbuffer.id
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isShader = function (shader) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isShader + ',' + shader.id
|
|
)
|
|
return Boolean(result);
|
|
}
|
|
|
|
isTexture = function (texture) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.isTexture + ',' + texture.id
|
|
);
|
|
return Boolean(result);
|
|
}
|
|
|
|
lineWidth = function (width) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.lineWidth + ',' + width,
|
|
true
|
|
)
|
|
}
|
|
|
|
linkProgram = function (program) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.linkProgram + ',' + program.id,
|
|
true
|
|
);
|
|
}
|
|
|
|
|
|
pixelStorei = function (pname, param) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.pixelStorei + ',' + pname + ',' + Number(param)
|
|
)
|
|
}
|
|
|
|
polygonOffset = function (factor, units) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.polygonOffset + ',' + factor + ',' + units
|
|
)
|
|
}
|
|
|
|
readPixels = function (x, y, width, height, format, type, pixels) {
|
|
const result = WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.readPixels + ',' + x + ',' + y + ',' + width + ',' + height + ',' + format + ',' + type
|
|
)
|
|
return result;
|
|
}
|
|
|
|
renderbufferStorage = function (target, internalFormat, width, height) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.renderbufferStorage + ',' + target + ',' + internalFormat + ',' + width + ',' + height,
|
|
true
|
|
)
|
|
}
|
|
|
|
sampleCoverage = function (value, invert) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.sampleCoverage + ',' + value + ',' + Number(invert),
|
|
true
|
|
)
|
|
}
|
|
|
|
scissor = function (x, y, width, height) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.scissor + ',' + x + ',' + y + ',' + width + ',' + height,
|
|
true
|
|
)
|
|
}
|
|
|
|
shaderSource = function (shader, source) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.shaderSource + ',' + shader.id + ',' + source
|
|
)
|
|
}
|
|
|
|
stencilFunc = function (func, ref, mask) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilFunc + ',' + func + ',' + ref + ',' + mask,
|
|
true
|
|
)
|
|
}
|
|
|
|
stencilFuncSeparate = function (face, func, ref, mask) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilFuncSeparate + ',' + face + ',' + func + ',' + ref + ',' + mask,
|
|
true
|
|
)
|
|
}
|
|
|
|
stencilMask = function (mask) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilMask + ',' + mask,
|
|
true
|
|
)
|
|
}
|
|
|
|
stencilMaskSeparate = function (face, mask) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilMaskSeparate + ',' + face + ',' + mask,
|
|
true
|
|
)
|
|
}
|
|
|
|
stencilOp = function (fail, zfail, zpass) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilOp + ',' + fail + ',' + zfail + ',' + zpass
|
|
)
|
|
}
|
|
|
|
stencilOpSeparate = function (face, fail, zfail, zpass) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.stencilOp + ',' + face + ',' + fail + ',' + zfail + ',' + zpass,
|
|
true
|
|
)
|
|
}
|
|
|
|
texImage2D = function (...args) {
|
|
WebGLRenderingContext.GBridge.texImage2D(this._canvas.id, ...args);
|
|
}
|
|
|
|
|
|
texParameterf = function (target, pname, param) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.texParameterf + ',' + target + ',' + pname + ',' + param,
|
|
true
|
|
)
|
|
}
|
|
|
|
texParameteri = function (target, pname, param) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.texParameteri + ',' + target + ',' + pname + ',' + param
|
|
)
|
|
}
|
|
|
|
texSubImage2D = function (...args) {
|
|
WebGLRenderingContext.GBridge.texSubImage2D(this._canvas.id, ...args);
|
|
}
|
|
|
|
uniform1f = function (location, v0) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform1f + ',' + location.id + ',' + v0
|
|
)
|
|
}
|
|
|
|
uniform1fv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform1fv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform1i = function (location, v0) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform1i + ',' + location.id + ',' + v0,
|
|
// true
|
|
)
|
|
}
|
|
|
|
uniform1iv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform1iv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform2f = function (location, v0, v1) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform2f + ',' + location.id + ',' + v0 + ',' + v1,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform2fv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform2fv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform2i = function (location, v0, v1) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform2i + ',' + location.id + ',' + v0 + ',' + v1,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform2iv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform2iv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform3f = function (location, v0, v1, v2) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform3f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform3fv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform3fv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform3i = function (location, v0, v1, v2) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform3i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform3iv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform3iv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform4f = function (location, v0, v1, v2, v3) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform4f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform4fv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform4fv + ',' + location.id + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform4i = function (location, v0, v1, v2, v3) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform4i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
|
|
true
|
|
)
|
|
}
|
|
|
|
uniform4iv = function (location, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniform4iv + ',' + location.id + ',' + processArray(value, true),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniformMatrix2fv = function (location, transpose, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniformMatrix2fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniformMatrix3fv = function (location, transpose, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniformMatrix3fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
uniformMatrix4fv = function (location, transpose, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.uniformMatrix4fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value),
|
|
true
|
|
);
|
|
}
|
|
|
|
useProgram = function (progarm) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.useProgram + ',' + progarm.id + '',
|
|
true
|
|
)
|
|
}
|
|
|
|
|
|
validateProgram = function (program) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.validateProgram + ',' + program.id,
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib1f = function (index, v0) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib1f + ',' + index + ',' + v0,
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib2f = function (index, v0, v1) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib2f + ',' + index + ',' + v0 + ',' + v1,
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib3f = function (index, v0, v1, v2) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib3f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2,
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib4f = function (index, v0, v1, v2, v3) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib4f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3,
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib1fv = function (index, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib1fv + ',' + index + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib2fv = function (index, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib2fv + ',' + index + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib3fv = function (index, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib3fv + ',' + index + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttrib4fv = function (index, value) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttrib4fv + ',' + index + ',' + processArray(value),
|
|
true
|
|
)
|
|
}
|
|
|
|
vertexAttribPointer = function (index, size, type, normalized, stride, offset) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.vertexAttribPointer + ',' + index + ',' + size + ',' + type + ',' + Number(normalized) + ',' + stride + ',' + offset,
|
|
true
|
|
)
|
|
}
|
|
|
|
viewport = function (x, y, width, height) {
|
|
WebGLRenderingContext.GBridge.callNative(
|
|
this._canvas.id,
|
|
GLmethod.viewport + ',' + x + ',' + y + ',' + width + ',' + height,
|
|
true
|
|
)
|
|
}
|
|
} |