Skip to content

Commit 4b5450d

Browse files
committed
Expose Basic ShaderLib, add Program, Attribute and Uniform handlers
1 parent 21cf8bc commit 4b5450d

5 files changed

Lines changed: 324 additions & 0 deletions

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var CONST = require('../const');
8+
var ShaderChunk = require('../shaders/ShaderChunk');
9+
var ShaderLib = require('../shaders/ShaderLib');
10+
var Class = require('../../utils/Class');
11+
12+
var WebGLPrograms = new Class({
13+
14+
initialize:
15+
16+
function WebGLPrograms ()
17+
{
18+
19+
},
20+
21+
});
22+
23+
module.exports = WebGLPrograms;

src/layer3d/shaders/ShaderLib.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var Basic = require('./libs/Basic');
8+
9+
var ShaderLib = {
10+
11+
Basic: Basic
12+
13+
};
14+
15+
module.exports = ShaderLib;
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var CONST = require('../const');
8+
var Class = require('../../utils/Class');
9+
10+
var WebGLAttribute = new Class({
11+
12+
initialize:
13+
14+
function WebGLAttribute (webglProgram, attributeData)
15+
{
16+
this.renderer = webglProgram.renderer;
17+
18+
this.name = attributeData.name;
19+
this.type = attributeData.type;
20+
this.size = attributeData.size;
21+
22+
var gl = this.renderer.gl;
23+
24+
this.location = gl.getAttribLocation(webglProgram.program, this.name);
25+
26+
this.count = 0;
27+
this.format = gl.FLOAT;
28+
29+
this.initCount();
30+
this.initFormat();
31+
},
32+
33+
initCount: function ()
34+
{
35+
var type = this.type;
36+
37+
switch (type)
38+
{
39+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT:
40+
case CONST.WEBGL_ATTRIBUTE_TYPE.BYTE:
41+
case CONST.WEBGL_ATTRIBUTE_TYPE.UNSIGNED_BYTE:
42+
case CONST.WEBGL_ATTRIBUTE_TYPE.UNSIGNED_SHORT:
43+
this.count = 1;
44+
break;
45+
46+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC2:
47+
this.count = 2;
48+
break;
49+
50+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC3:
51+
this.count = 3;
52+
break;
53+
54+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC4:
55+
this.count = 4;
56+
break;
57+
}
58+
},
59+
60+
initFormat: function ()
61+
{
62+
var type = this.type;
63+
var gl = this.renderer.gl;
64+
65+
switch (type)
66+
{
67+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT:
68+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC2:
69+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC3:
70+
case CONST.WEBGL_ATTRIBUTE_TYPE.FLOAT_VEC4:
71+
this.format = gl.FLOAT;
72+
break;
73+
74+
case CONST.WEBGL_ATTRIBUTE_TYPE.UNSIGNED_BYTE:
75+
this.format = gl.UNSIGNED_BYTE;
76+
break;
77+
78+
case CONST.WEBGL_ATTRIBUTE_TYPE.UNSIGNED_SHORT:
79+
this.format = gl.UNSIGNED_SHORT;
80+
break;
81+
82+
case CONST.WEBGL_ATTRIBUTE_TYPE.BYTE:
83+
this.format = gl.BYTE;
84+
break;
85+
}
86+
}
87+
88+
});
89+
90+
module.exports = WebGLAttribute;
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var Class = require('../../utils/Class');
8+
var WebGLAttribute = require('./WebGLAttribute');
9+
10+
var programCount = 0;
11+
12+
var WebGLProgram = new Class({
13+
14+
initialize:
15+
16+
function WebGLProgram (renderer, vertexShader, fragmentShader)
17+
{
18+
this.id = programCount++;
19+
20+
this.renderer = renderer;
21+
22+
this.usedTimes = 1;
23+
24+
this.vertexShaderSrc = vertexShader;
25+
this.fragmentShaderSrc = fragmentShader;
26+
27+
this.program = this.createProgram();
28+
29+
this.attributes = this.getAttributes();
30+
31+
// uniforms
32+
},
33+
34+
createProgram: function ()
35+
{
36+
var gl = this.renderer.gl;
37+
38+
var vertexShader = this.createShader(this.vertexShaderSrc, gl.VERTEX_SHADER);
39+
var fragmentShader = this.createShader(this.fragmentShaderSrc, gl.FRAGMENT_SHADER);
40+
41+
var program = gl.createProgram();
42+
43+
gl.attachShader(program, vertexShader);
44+
gl.attachShader(program, fragmentShader);
45+
46+
gl.linkProgram(program);
47+
48+
var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
49+
50+
if (!linked)
51+
{
52+
console.warn('linkProgram failed: ', gl.getProgramInfoLog(program));
53+
}
54+
55+
return program;
56+
},
57+
58+
createShader: function (source, type)
59+
{
60+
var gl = this.renderer.gl;
61+
62+
var shader = gl.createShader(type);
63+
64+
gl.shaderSource(shader, source);
65+
66+
gl.compileShader(shader);
67+
68+
var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
69+
70+
if (!compiled)
71+
{
72+
console.warn('compileShader failed: ', gl.getShaderInfoLog(shader), this.addLineNumbers(source));
73+
}
74+
75+
return shader;
76+
},
77+
78+
addLineNumbers: function (string)
79+
{
80+
var lines = string.split('\n');
81+
82+
for (var i = 0; i < lines.length; i++)
83+
{
84+
lines[i] = (i + 1) + ': ' + lines[i];
85+
}
86+
87+
return lines.join('\n');
88+
},
89+
90+
getAttributes: function ()
91+
{
92+
var gl = this.renderer.gl;
93+
var program = this.program;
94+
95+
var attributes = {};
96+
97+
var totalAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
98+
99+
for (var i = 0; i < totalAttributes; i++)
100+
{
101+
var attribData = gl.getActiveAttrib(program, i);
102+
103+
var name = attribData.name;
104+
105+
var attribute = new WebGLAttribute(gl, program, attribData);
106+
107+
attributes[name] = attribute;
108+
}
109+
110+
return attributes;
111+
}
112+
113+
});
114+
115+
module.exports = WebGLProgram;
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**
2+
* @author Richard Davey <rich@photonstorm.com>
3+
* @copyright 2020 Photon Storm Ltd.
4+
* @license {@link https://opensource.org/licenses/MIT|MIT License}
5+
*/
6+
7+
var Class = require('../../utils/Class');
8+
9+
var WebGLUniforms = new Class({
10+
11+
initialize:
12+
13+
function WebGLUniforms (gl, program)
14+
{
15+
this.seq = [];
16+
this.map = {};
17+
18+
var n = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
19+
20+
for (var i = 0; i < n; i++)
21+
{
22+
var uniform = gl.getActiveUniform(program, i);
23+
var location = gl.getUniformLocation(program, uniform.name);
24+
25+
this.parseUniform(gl, uniform, location, this);
26+
}
27+
},
28+
29+
parseUniform: function (gl, uniform, location, container)
30+
{
31+
var path = uniform.name;
32+
var pathLength = path.length;
33+
34+
// reset RegExp object, because of the early exit of a previous run
35+
RePathPart.lastIndex = 0;
36+
37+
/*
38+
while (true)
39+
{
40+
var match = RePathPart.exec(path);
41+
var matchEnd = RePathPart.lastIndex;
42+
var id = match[1];
43+
var idIsIndex = match[2] === ']';
44+
var subscript = match[3];
45+
46+
if (idIsIndex)
47+
{
48+
id = id | 0;
49+
}
50+
51+
if (!subscript || subscript === '[' && matchEnd + 2 === pathLength)
52+
{
53+
this.addUniform((!subscript) ? new SingleUniform(gl, id, uniform, location) : new PureArrayUniform(gl, id, uniform, location));
54+
55+
break;
56+
}
57+
else
58+
{
59+
// step into inner node / create it in case it doesn't exist
60+
61+
var next = this.map[id];
62+
63+
// var map = container.map,
64+
// next = map[id];
65+
66+
if (!next)
67+
{
68+
next = new StructuredUniform(id);
69+
70+
this.addUniform(next);
71+
}
72+
73+
container = next;
74+
}
75+
}
76+
*/
77+
}
78+
79+
});
80+
81+
module.exports = WebGLUniforms;

0 commit comments

Comments
 (0)