-
Notifications
You must be signed in to change notification settings - Fork 636
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
113 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
#define PI 3.14159265359 | ||
#define TWO_PI 6.28318530718 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,12 @@ | ||
import point_frag from '../shader/point_frag.glsl'; | ||
import point_vert from '../shader/point_vert.glsl'; | ||
const shaderslib = { | ||
pointShader: { | ||
fragment: point_frag, | ||
vertex: point_vert | ||
} | ||
}; | ||
// for (const programName in shaderslib) { | ||
// const program = shaderslib[programName]; | ||
// program.fragment = ShaderFactory.parseIncludes(program.fragment); | ||
// program.vertex = ShaderFactory.parseIncludes(program.vertex); | ||
// } | ||
export default shaderslib; | ||
import polygon_frag from '../shader/polygon_frag.glsl'; | ||
import polygon_vert from '../shader/polygon_vert.glsl'; | ||
import common from './common.glsl'; | ||
import { registerModule } from '../../util/shaderModule'; | ||
|
||
export function compileBuiltinModules() { | ||
registerModule('point', { vs: point_vert, fs: point_frag }); | ||
registerModule('common', { vs: common, fs: common }); | ||
registerModule('polygon', { vs: polygon_vert, fs: polygon_frag }); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
const SHADER_TYPE = { | ||
VS: 'vs', | ||
FS: 'fs' | ||
}; | ||
const moduleCache = {}; | ||
const rawContentCache = {}; | ||
const precisionRegExp = /precision\s+(high|low|medium)p\s+float/; | ||
const globalDefaultprecision = '#ifdef GL_FRAGMENT_PRECISION_HIGH\n precision highp float;\n #else\n precision mediump float;\n#endif\n'; | ||
const includeRegExp = /#pragma include (["^+"]?["\ "[a-zA-Z_0-9](.*)"]*?)/g; | ||
|
||
function processModule(rawContent, includeList, type) { | ||
return rawContent.replace(includeRegExp, (_, strMatch) => { | ||
const includeOpt = strMatch.split(' '); | ||
const includeName = includeOpt[0].replace(/"/g, ''); | ||
|
||
if (includeList.indexOf(includeName) > -1) { | ||
return ''; | ||
} | ||
|
||
let txt = rawContentCache[includeName][type]; | ||
includeList.push(includeName); | ||
|
||
txt = processModule(txt, includeList, type); | ||
return txt; | ||
}); | ||
} | ||
|
||
export function registerModule(moduleName, { vs, fs }) { | ||
rawContentCache[moduleName] = { | ||
[SHADER_TYPE.VS]: vs, | ||
[SHADER_TYPE.FS]: fs | ||
}; | ||
} | ||
|
||
export function getModule(moduleName) { | ||
if (moduleCache[moduleName]) { | ||
return moduleCache[moduleName]; | ||
} | ||
|
||
let vs = rawContentCache[moduleName][SHADER_TYPE.VS]; | ||
let fs = rawContentCache[moduleName][SHADER_TYPE.FS]; | ||
|
||
vs = processModule(vs, [], SHADER_TYPE.VS); | ||
fs = processModule(fs, [], SHADER_TYPE.FS); | ||
|
||
/** | ||
* set default precision for fragment shader | ||
* https://stackoverflow.com/questions/28540290/why-it-is-necessary-to-set-precision-for-the-fragment-shader | ||
*/ | ||
if (!precisionRegExp.test(fs)) { | ||
fs = globalDefaultprecision + fs; | ||
} | ||
|
||
moduleCache[moduleName] = { | ||
[SHADER_TYPE.VS]: vs.trim(), | ||
[SHADER_TYPE.FS]: fs.trim() | ||
}; | ||
return moduleCache[moduleName]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import { expect } from 'chai'; | ||
import { registerModule, getModule } from '../../../src/util/shaderModule'; | ||
|
||
describe('test shader module', function() { | ||
|
||
const vs = ` | ||
#define PI 3.14 | ||
`; | ||
|
||
const commonModule = { | ||
vs, | ||
fs: vs | ||
}; | ||
|
||
const module1 = { | ||
vs: ` | ||
#pragma include "common" | ||
`, | ||
fs: '' | ||
}; | ||
|
||
registerModule('common', commonModule); | ||
registerModule('module1', module1); | ||
|
||
it('should import a module correctly.', function() { | ||
const { vs, fs } = getModule('module1'); | ||
|
||
expect(vs).eq('#define PI 3.14'); | ||
expect(fs).eq(''); | ||
}); | ||
|
||
}); |