mirror of
https://github.com/smallmain/cocos-enhance-kit.git
synced 2024-12-26 11:48:29 +00:00
168 lines
7.0 KiB
JavaScript
168 lines
7.0 KiB
JavaScript
|
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;
|
|||
|
}
|