fix: restore gl_immediate_shim.js
Restores the immediate-mode GL shim that the WASM runtime loads; it had been dropped from the tree while the CI work was in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
d7159b42c0
commit
e6ff74a11e
1 changed files with 178 additions and 0 deletions
178
wasm/shims/gl_immediate_shim.js
Normal file
178
wasm/shims/gl_immediate_shim.js
Normal file
|
|
@ -0,0 +1,178 @@
|
|||
/**
|
||||
* gl_immediate_shim.js
|
||||
*
|
||||
* Custom OpenGL immediate mode shims for KiCad WASM port.
|
||||
* Fixes Emscripten LEGACY_GL_EMULATION issues:
|
||||
* 1. Color-per-vertex requirement - injects color before each vertex automatically
|
||||
* 2. Missing double-precision functions (glVertex2d, glVertex3d, glColor3d, glColor4d)
|
||||
*
|
||||
* Usage: emcc ... --js-library=lib/gl_immediate_shim.js
|
||||
*/
|
||||
|
||||
addToLibrary({
|
||||
// ==================================================================
|
||||
// GLImmediateShim - State tracking and function wrapping
|
||||
// ==================================================================
|
||||
|
||||
$GLImmediateShim__deps: ['$GLImmediate', 'glBegin', 'glEnd', 'glVertex2f', 'glVertex3f', 'glColor3f', 'glColor4f'],
|
||||
$GLImmediateShim__postset: 'GLImmediateShim.init();',
|
||||
$GLImmediateShim: {
|
||||
// Current color state (persistent across vertices)
|
||||
currentColor: null,
|
||||
|
||||
// Track if we're inside glBegin/glEnd block
|
||||
inBeginEnd: false,
|
||||
|
||||
// Track if color was called since the last vertex
|
||||
// This prevents double-injection when code already calls color per vertex
|
||||
colorCalledSinceLastVertex: false,
|
||||
|
||||
// Original functions we're wrapping
|
||||
origFns: {},
|
||||
|
||||
// Initialization flag
|
||||
initialized: false,
|
||||
|
||||
init: function() {
|
||||
if (GLImmediateShim.initialized) return;
|
||||
if (typeof GLImmediate === 'undefined') {
|
||||
// GLImmediate not ready yet, will be called again
|
||||
console.log('[GLImmediateShim] Waiting for GLImmediate...');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('[GLImmediateShim] Initializing OpenGL immediate mode shims');
|
||||
|
||||
// Initialize current color to white (OpenGL default)
|
||||
GLImmediateShim.currentColor = new Float32Array([1.0, 1.0, 1.0, 1.0]);
|
||||
|
||||
// Store original functions
|
||||
GLImmediateShim.origFns = {
|
||||
glBegin: _glBegin,
|
||||
glEnd: _glEnd,
|
||||
glVertex2f: _glVertex2f,
|
||||
glVertex3f: _glVertex3f,
|
||||
glColor3f: _glColor3f,
|
||||
glColor4f: _glColor4f,
|
||||
};
|
||||
|
||||
// Install shims
|
||||
_glBegin = GLImmediateShim.shimBegin;
|
||||
_glEnd = GLImmediateShim.shimEnd;
|
||||
_glVertex2f = GLImmediateShim.shimVertex2f;
|
||||
_glVertex3f = GLImmediateShim.shimVertex3f;
|
||||
_glColor3f = GLImmediateShim.shimColor3f;
|
||||
_glColor4f = GLImmediateShim.shimColor4f;
|
||||
|
||||
GLImmediateShim.initialized = true;
|
||||
console.log('[GLImmediateShim] Initialized successfully');
|
||||
},
|
||||
|
||||
// ==================================================================
|
||||
// Shim implementations
|
||||
// ==================================================================
|
||||
|
||||
shimBegin: function(mode) {
|
||||
GLImmediateShim.inBeginEnd = true;
|
||||
GLImmediateShim.colorCalledSinceLastVertex = false;
|
||||
GLImmediateShim.origFns.glBegin(mode);
|
||||
},
|
||||
|
||||
shimEnd: function() {
|
||||
GLImmediateShim.inBeginEnd = false;
|
||||
GLImmediateShim.origFns.glEnd();
|
||||
},
|
||||
|
||||
shimColor3f: function(r, g, b) {
|
||||
var c = GLImmediateShim.currentColor;
|
||||
c[0] = r;
|
||||
c[1] = g;
|
||||
c[2] = b;
|
||||
c[3] = 1.0;
|
||||
|
||||
if (GLImmediateShim.inBeginEnd) {
|
||||
// Mark that color was explicitly called for this vertex
|
||||
GLImmediateShim.colorCalledSinceLastVertex = true;
|
||||
}
|
||||
|
||||
GLImmediateShim.origFns.glColor3f(r, g, b);
|
||||
},
|
||||
|
||||
shimColor4f: function(r, g, b, a) {
|
||||
var c = GLImmediateShim.currentColor;
|
||||
c[0] = r;
|
||||
c[1] = g;
|
||||
c[2] = b;
|
||||
c[3] = a;
|
||||
|
||||
if (GLImmediateShim.inBeginEnd) {
|
||||
// Mark that color was explicitly called for this vertex
|
||||
GLImmediateShim.colorCalledSinceLastVertex = true;
|
||||
}
|
||||
|
||||
GLImmediateShim.origFns.glColor4f(r, g, b, a);
|
||||
},
|
||||
|
||||
// Inject current color before each vertex (only if not already called)
|
||||
injectColor: function() {
|
||||
if (!GLImmediateShim.inBeginEnd) return;
|
||||
|
||||
// Only inject color if it wasn't already called for this vertex
|
||||
if (!GLImmediateShim.colorCalledSinceLastVertex) {
|
||||
var c = GLImmediateShim.currentColor;
|
||||
GLImmediateShim.origFns.glColor4f(c[0], c[1], c[2], c[3]);
|
||||
}
|
||||
|
||||
// Reset the flag for the next vertex
|
||||
GLImmediateShim.colorCalledSinceLastVertex = false;
|
||||
},
|
||||
|
||||
shimVertex2f: function(x, y) {
|
||||
GLImmediateShim.injectColor();
|
||||
GLImmediateShim.origFns.glVertex2f(x, y);
|
||||
},
|
||||
|
||||
shimVertex3f: function(x, y, z) {
|
||||
GLImmediateShim.injectColor();
|
||||
GLImmediateShim.origFns.glVertex3f(x, y, z);
|
||||
},
|
||||
},
|
||||
|
||||
// ==================================================================
|
||||
// Double-precision vertex functions (missing in Emscripten)
|
||||
// ==================================================================
|
||||
|
||||
glVertex2d__deps: ['glVertex2f'],
|
||||
glVertex2d: function(x, y) {
|
||||
_glVertex2f(x, y);
|
||||
},
|
||||
|
||||
glVertex3d__deps: ['glVertex3f'],
|
||||
glVertex3d: function(x, y, z) {
|
||||
_glVertex3f(x, y, z);
|
||||
},
|
||||
|
||||
glVertex4d__deps: ['glVertex4f'],
|
||||
glVertex4d: function(x, y, z, w) {
|
||||
_glVertex4f(x, y, z, w);
|
||||
},
|
||||
|
||||
// ==================================================================
|
||||
// Double-precision color functions
|
||||
// ==================================================================
|
||||
|
||||
glColor3d__deps: ['glColor3f'],
|
||||
glColor3d: function(r, g, b) {
|
||||
_glColor3f(r, g, b);
|
||||
},
|
||||
|
||||
glColor4d__deps: ['glColor4f'],
|
||||
glColor4d: function(r, g, b, a) {
|
||||
_glColor4f(r, g, b, a);
|
||||
},
|
||||
});
|
||||
|
||||
// Ensure GLImmediateShim is included in the build
|
||||
if (typeof extraLibraryFuncs !== 'undefined') {
|
||||
extraLibraryFuncs.push('$GLImmediateShim');
|
||||
}
|
||||
Loading…
Reference in a new issue