Skip to content

Commit 65120e5

Browse files
committed
Upgrade shader helper library and fix some bugs.
1 parent 54747af commit 65120e5

File tree

1 file changed

+44
-16
lines changed

1 file changed

+44
-16
lines changed

src/shader.js

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
| shader.js
33
|----------------
4-
| shader.js is copyright Patrick Rhodes Martin 2013,2017, used with permission.
4+
| shader.js is copyright Patrick Rhodes Martin 2013,2017,2024 used with permission.
55
|
66
|-
77
*/
@@ -12,6 +12,7 @@
1212
*/
1313
const shaderlog = {};
1414
let statetracker = {};
15+
let shadercounter = Number.MIN_SAFE_INTEGER;
1516

1617
function isArrayish(a) {
1718
return (
@@ -28,6 +29,11 @@ function isArrayish(a) {
2829
}
2930

3031
const ShaderPrototype = Object.create(Object, {
32+
_shaderId: {
33+
value: NaN,
34+
writable: true
35+
},
36+
3137
_shader: {
3238
value: null,
3339
writable: true
@@ -54,16 +60,16 @@ const ShaderPrototype = Object.create(Object, {
5460
},
5561

5662
_isUnchanged: {
57-
value: function _isUnchanged (property, uniformid, context) {
63+
value: function _isUnchanged (property, uniformid) {
5864
let val = property.val;
59-
let cval = statetracker[context][uniformid];
65+
let cval = statetracker[this._shaderId][uniformid];
6066
let i;
6167
let unchanged = true;
6268
if (isArrayish(val) && isArrayish(cval)) {
6369
if (val.length !== cval.length) return false;
6470
else
6571
for (i = 0; i < val.length; i++)
66-
if (!(unchanged = unchanged && val[i] === cval[i]))
72+
if (!(unchanged = (unchanged && val[i] === cval[i])))
6773
break;
6874

6975
return unchanged;
@@ -242,6 +248,7 @@ const ShaderPrototype = Object.create(Object, {
242248
"bindShader": {
243249
value: function bindShader (gl) {
244250
gl.useProgram(this._shader);
251+
statetracker[this._shaderId] = statetracker[this._shaderId] ?? {};
245252
let props = Object.keys(this._keys);
246253
let key = null;
247254
let uniform = null;
@@ -254,7 +261,7 @@ const ShaderPrototype = Object.create(Object, {
254261
key
255262
);
256263
uniform = this._uniformLocations[key];
257-
if (this._isUnchanged(this._keys[key], uniform, gl)) continue;
264+
if (this._isUnchanged(this._keys[key], i)) continue;
258265
if ((uniform || null) !== null) {
259266
type = this._keys[key].datatype;
260267
switch (type) {
@@ -358,7 +365,14 @@ const ShaderPrototype = Object.create(Object, {
358365
);
359366
break;
360367
}
361-
statetracker[uniform] = this._keys[key].val;
368+
if(isArrayish(this._keys[key].val)){
369+
if(!statetracker[this._shaderId][uniform])
370+
statetracker[this._shaderId][uniform] = Array.from(this._keys[key].val);
371+
else{
372+
for (let i = 0; i < this._keys[key].val.length; i++)
373+
statetracker[this._shaderId][uniform][i] = this._keys[key].val[i];
374+
}
375+
}else statetracker[this._shaderId][uniform] = this._keys[key].val;
362376
}
363377
}
364378
},
@@ -387,7 +401,6 @@ const ShaderPrototype = Object.create(Object, {
387401

388402
"compile": {
389403
value: function compile (gl, defines, err, version) {
390-
statetracker[gl] = statetracker[gl] ?? {};
391404
this._uniformLocations = {};
392405
if (typeof err === "undefined" || err === null) {
393406
err = defines;
@@ -442,29 +455,42 @@ const ShaderPrototype = Object.create(Object, {
442455

443456
_compile: {
444457
value: function _compile (gl, source, defines, type, version) {
445-
let shaderHeader = "";
458+
let shaderHeader = "#ifndef WEB_GL\n";
459+
shaderHeader += "#define WEB_GL\n";
460+
shaderHeader += "#endif\n";
446461
if (version && version !== "100") {
447462
shaderHeader += "#version " + version + " es\n";
448463
}
449-
shaderHeader += "#ifndef WEB_GL\n";
450-
shaderHeader += "#define WEB_GL\n";
451-
shaderHeader += "#endif\n";
452464
shaderHeader += "#ifdef GL_ES\n";
453-
shaderHeader += "precision highp float;\n";
454-
shaderHeader += "precision highp int;\n";
465+
if(type === gl.VERTEX_SHADER){
466+
shaderHeader += "precision highp float;\n";
467+
shaderHeader += "precision highp int;\n";
468+
shaderHeader += "#if !defined(GL_FRAGMENT_PRECISION_HIGH) || !GL_FRAGMENT_PRECISION_HIGH\n";
469+
shaderHeader += "#define MEDIUM_FRAGMENT_PRECISION\n";
470+
}else if(type === gl.FRAGMENT_SHADER){
471+
shaderHeader += "#if defined(GL_FRAGMENT_PRECISION_HIGH) && GL_FRAGMENT_PRECISION_HIGH\n";
472+
shaderHeader += "precision highp float;\n";
473+
shaderHeader += "precision highp int;\n";
474+
shaderHeader += "#else\n";
475+
shaderHeader += "#define MEDIUM_FRAGMENT_PRECISION\n";
476+
shaderHeader += "precision mediump float;\n";
477+
shaderHeader += "precision mediump int;\n";
478+
}
479+
shaderHeader += "#endif\n";
455480
shaderHeader += "#endif\n";
456481
if (defines !== null) {
457482
let define_names = Object.keys(defines);
458483
for (let i = 0; i < define_names.length; i++) {
459-
if (defines[define_names[i]] === true)
484+
if (defines[define_names[i]] === true){
460485
shaderHeader += "#define " + define_names[i] + "\n";
461-
else if (defines[define_names[i]] !== null)
486+
}else if (defines[define_names[i]] !== null){
462487
shaderHeader +=
463488
"#define " +
464489
define_names[i] +
465490
" " +
466491
defines[define_names[i]].toString() +
467492
"\n";
493+
}
468494
}
469495
}
470496

@@ -492,7 +518,9 @@ const ShaderPrototype = Object.create(Object, {
492518
});
493519

494520
sabre["Shader"] = function Shader () {
495-
return Object.create(ShaderPrototype);
521+
let shader = Object.create(ShaderPrototype);
522+
shader._shaderId = shadercounter++;
523+
return shader;
496524
};
497525
sabre["Shader"]["resetStateEngine"] = function resetStateEngine () {
498526
statetracker = {};

0 commit comments

Comments
 (0)