Skip to content

Instantly share code, notes, and snippets.

@robertleeplummerjr
Last active January 9, 2021 03:15
Show Gist options
  • Save robertleeplummerjr/cce00202e08954cf8df512eed838de66 to your computer and use it in GitHub Desktop.
Save robertleeplummerjr/cce00202e08954cf8df512eed838de66 to your computer and use it in GitHub Desktop.
// at end of list of items that call "JS_GL_METHOD"
JS_GL_METHOD("drawBuffers", DrawBuffers);
JS_GL_METHOD("extWEBGL_draw_buffers", EXTWEBGL_draw_buffers);
// add to bottom of list of items that use "eglGetProcAddress"
glDrawBuffers=reinterpret_cast<PFNGLDRAWBUFFERSEXTPROC>(eglGetProcAddress("glDrawBuffersEXT"));
// at end
PFNGLDRAWBUFFERSEXTPROC glDrawBuffers;
// at bottom add:
GL_METHOD(DrawBuffers) {
GL_BOILERPLATE;
v8::Local<v8::Array> buffersArray = v8::Local<v8::Array>::Cast(info[0]);
GLuint numBuffers = buffersArray->Length();
GLenum buffers[numBuffers];
for (size_t i = 0; i < numBuffers; i++) {
int bufferAttachment = buffersArray->Get(i)->Uint32Value();
if (bufferAttachment < GL_COLOR_ATTACHMENT0_EXT || bufferAttachment > GL_COLOR_ATTACHMENT15_EXT) {
Nan::ThrowError("Invalid color attachments");
}
buffers[i] = bufferAttachment;
}
(inst->glDrawBuffers)(numBuffers, buffers);
}
GL_METHOD(EXTWEBGL_draw_buffers) {
GL_BOILERPLATE;
v8::Local<v8::Object> result = Nan::New<v8::Object>();
// Nan::SetMethod(result, "drawBuffersWEBGL", DrawBuffers);
result->Set(Nan::New("COLOR_ATTACHMENT0_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT0_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT1_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT1_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT2_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT2_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT3_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT3_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT4_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT4_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT5_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT5_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT6_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT6_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT7_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT7_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT8_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT8_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT9_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT9_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT10_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT10_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT11_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT11_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT12_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT12_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT13_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT13_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT14_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT14_EXT));
result->Set(Nan::New("COLOR_ATTACHMENT15_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_COLOR_ATTACHMENT15_EXT));
result->Set(Nan::New("DRAW_BUFFER0_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER0_EXT));
result->Set(Nan::New("DRAW_BUFFER1_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER1_EXT));
result->Set(Nan::New("DRAW_BUFFER2_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER2_EXT));
result->Set(Nan::New("DRAW_BUFFER3_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER3_EXT));
result->Set(Nan::New("DRAW_BUFFER4_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER4_EXT));
result->Set(Nan::New("DRAW_BUFFER5_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER5_EXT));
result->Set(Nan::New("DRAW_BUFFER6_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER6_EXT));
result->Set(Nan::New("DRAW_BUFFER7_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER7_EXT));
result->Set(Nan::New("DRAW_BUFFER8_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER8_EXT));
result->Set(Nan::New("DRAW_BUFFER9_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER9_EXT));
result->Set(Nan::New("DRAW_BUFFER10_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER10_EXT));
result->Set(Nan::New("DRAW_BUFFER11_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER11_EXT));
result->Set(Nan::New("DRAW_BUFFER12_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER12_EXT));
result->Set(Nan::New("DRAW_BUFFER13_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER13_EXT));
result->Set(Nan::New("DRAW_BUFFER14_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER14_EXT));
result->Set(Nan::New("DRAW_BUFFER15_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_DRAW_BUFFER15_EXT));
result->Set(Nan::New("MAX_COLOR_ATTACHMENTS_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_MAX_COLOR_ATTACHMENTS_EXT));
result->Set(Nan::New("MAX_DRAW_BUFFERS_WEBGL").ToLocalChecked(), Nan::New<v8::Number>(GL_MAX_DRAW_BUFFERS_EXT));
info.GetReturnValue().Set(result);
}
// included for context, but already in webgl.js
var gl = nativeGL.WebGLRenderingContext.prototype
// extend getExtension with the following
gl.getExtension = function getExtension (name) {
var str = name.toLowerCase()
if (str in this._extensions) {
return this._extensions[str]
}
var ext = null
switch (str) {
case 'webgl_draw_buffers':
ext = this.extWEBGL_draw_buffers();
ext.drawBuffersWEBGL = this.drawBuffers.bind(this)
break
}
if (ext) {
this._extensions[str] = ext
}
return ext
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment