cocos-enhance-kit/jsb-adapter/builtin/jsb_opengl.js

168 lines
7.0 KiB
JavaScript
Raw Normal View History

2022-06-24 16:23:03 +00:00
require('./jsb_opengl_constants');
var gl = __gl;
gl.drawingBufferWidth = window.innerWidth;
gl.drawingBufferHeight = window.innerHeight;
//
// Extensions
//
const WebGLCompressedTextureS3TC = {
COMPRESSED_RGB_S3TC_DXT1_EXT: 0x83F0, // A DXT1-compressed image in an RGB image format.
COMPRESSED_RGBA_S3TC_DXT1_EXT: 0x83F1,// A DXT1-compressed image in an RGB image format with a simple on/off alpha value.
COMPRESSED_RGBA_S3TC_DXT3_EXT: 0x83F2,// A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.
COMPRESSED_RGBA_S3TC_DXT5_EXT: 0x83F3 // A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3 compression in how the alpha compression is done.
};
const WebGLCompressedTextureETC1 = {
COMPRESSED_RGB_ETC1_WEBGL: 0x8D64 // Compresses 24-bit RGB data with no alpha channel.
};
const WebGLCompressedTexturePVRTC = {
COMPRESSED_RGB_PVRTC_4BPPV1_IMG: 0x8C00, // RGB compression in 4-bit mode. One block for each 4×4 pixels.
COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: 0x8C02,// RGBA compression in 4-bit mode. One block for each 4×4 pixels.
COMPRESSED_RGB_PVRTC_2BPPV1_IMG: 0x8C01, // RGB compression in 2-bit mode. One block for each 8×4 pixels.
COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: 0x8C03 // RGBA compression in 2-bit mode. One block for each 8×4 pixe
};
var extensionPrefixArr = ['MOZ_', 'WEBKIT_'];
var extensionMap = {
WEBGL_compressed_texture_s3tc: WebGLCompressedTextureS3TC,
WEBGL_compressed_texture_pvrtc: WebGLCompressedTexturePVRTC,
WEBGL_compressed_texture_etc1: WebGLCompressedTextureETC1
};
// From the WebGL spec:
// Returns an object if, and only if, name is an ASCII case-insensitive match [HTML] for one of the names returned from getSupportedExtensions;
// otherwise, returns null. The object returned from getExtension contains any constants or functions provided by the extension.
// A returned object may have no constants or functions if the extension does not define any, but a unique object must still be returned.
// That object is used to indicate that the extension has been enabled.
// XXX: The returned object must return the functions and constants.
var supportedExtensions = gl.getSupportedExtensions();
gl.getExtension = function(extension) {
var prefix;
for (var i = 0, len = extensionPrefixArr.length; i < len; ++i) {
prefix = extensionPrefixArr[i];
if (extension.startsWith(prefix)) {
extension = extension.substring(prefix.length);
break;
}
}
if (supportedExtensions.indexOf(extension) > -1) {
if (extension in extensionMap) {
return extensionMap[extension];
}
return {}; //REFINE: Return an empty object to indicate this platform supports the extension. But we should not return an empty object actually.
}
return null;
};
const HTMLCanvasElement = require('./jsb-adapter/HTMLCanvasElement');
const HTMLImageElement = require('./jsb-adapter/HTMLImageElement');
const ImageData = require('./jsb-adapter/ImageData');
const _glTexImage2D = gl.texImage2D;
/*
// WebGL1:
void gl.texImage2D(target, level, internalformat, width, height, border, format, type, ArrayBufferView? pixels);
void gl.texImage2D(target, level, internalformat, format, type, ImageData? pixels);
void gl.texImage2D(target, level, internalformat, format, type, HTMLImageElement? pixels);
void gl.texImage2D(target, level, internalformat, format, type, HTMLCanvasElement? pixels);
void gl.texImage2D(target, level, internalformat, format, type, HTMLVideoElement? pixels);
void gl.texImage2D(target, level, internalformat, format, type, ImageBitmap? pixels);
*/
gl.texImage2D = function(target, level, internalformat, width, height, border, format, type, pixels) {
let argCount = arguments.length;
if (argCount == 6) {
var image = border;
type = height;
format = width;
if (image instanceof HTMLImageElement) {
_glTexImage2D(target, level, image._glInternalFormat, image.width, image.height, 0, image._glFormat, image._glType, image._data, image._alignment);
}
else if (image instanceof HTMLCanvasElement) {
var data = image.data;
_glTexImage2D(target, level, internalformat, image.width, image.height, 0, format, type, data, image._alignment);
}
else if (image instanceof ImageData) {
_glTexImage2D(target, level, internalformat, image.width, image.height, 0, format, type, image._data, 0);
}
else {
console.error("Invalid pixel argument passed to gl.texImage2D!");
}
}
else if (argCount == 9) {
_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels, 0);
}
else {
console.error("gl.texImage2D: invalid argument count!");
}
}
const _glTexSubImage2D = gl.texSubImage2D;
/*
// WebGL 1:
void gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, ArrayBufferView? pixels);
void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, ImageData? pixels);
void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, HTMLImageElement? pixels);
void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, HTMLCanvasElement? pixels);
void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, HTMLVideoElement? pixels);
void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, ImageBitmap? pixels);
*/
gl.texSubImage2D = function(target, level, xoffset, yoffset, width, height, format, type, pixels) {
let argCount = arguments.length;
if (argCount == 7) {
var image = format;
type = height;
format = width;
if (image instanceof HTMLImageElement) {
_glTexSubImage2D(target, level, xoffset, yoffset, image.width, image.height, image._glFormat, image._glType, image._data, image._alignment);
}
else if (image instanceof HTMLCanvasElement) {
var data = image.data;
_glTexSubImage2D(target, level, xoffset, yoffset, image.width, image.height, format, type, data, image._alignment);
}
else if (image instanceof ImageData) {
_glTexSubImage2D(target, level, xoffset, yoffset, image.width, image.height, format, type, image._data, 0);
}
else {
console.error("Invalid pixel argument passed to gl.texImage2D!");
}
}
else if (argCount == 9) {
_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels, 0);
}
else {
console.error((new Error("gl.texImage2D: invalid argument count!").stack));
}
}
//REFINE:cjh get the real value
gl.getContextAttributes = function() {
return {
alpha: true,
antialias: false,
depth: true,
failIfMajorPerformanceCaveat: false,
premultipliedAlpha: true,
preserveDrawingBuffer: false,
stencil: true
}
}
gl.isContextLost = function() {
return false;
}