wonder.js
Version:
248 lines (230 loc) • 10.2 kB
JavaScript
;
var Curry = require("bs-platform/lib/js/curry.js");
var Log$WonderLog = require("wonder-log/lib/js/src/Log.js");
var OptionService$Wonderjs = require("../../../../atom/OptionService.js");
var ShaderChunkSystem$Wonderjs = require("../../../../../glsl/ShaderChunkSystem.js");
var ArrayService$WonderCommonlib = require("wonder-commonlib/lib/js/src/ArrayService.js");
var webgl1_main_begin = "void main(void){\n";
var webgl1_main_end = "}\n";
function _generateAttributeSource(shaderLibDataArr) {
return shaderLibDataArr.reduce((function (result, param) {
var variables = param[/* variables */2];
var match = OptionService$Wonderjs.isJsonSerializedValueNone(variables);
if (match) {
return result;
} else {
var optionalAttributes = OptionService$Wonderjs.unsafeGetJsonSerializedValue(variables)[/* attributes */1];
var match$1 = OptionService$Wonderjs.isJsonSerializedValueNone(optionalAttributes);
if (match$1) {
return result;
} else {
return result + OptionService$Wonderjs.unsafeGetJsonSerializedValue(optionalAttributes).reduce((function (result, param) {
var type_ = param[/* type_ */2];
var name = param[/* name */0];
var match = !OptionService$Wonderjs.isJsonSerializedValueNone(name) && !OptionService$Wonderjs.isJsonSerializedValueNone(type_);
if (match) {
var name$1 = OptionService$Wonderjs.unsafeGetJsonSerializedValue(name);
var type_$1 = OptionService$Wonderjs.unsafeGetJsonSerializedValue(type_);
return result + ("attribute " + (String(type_$1) + (" " + (String(name$1) + ";\n "))));
} else {
return result;
}
}), "");
}
}
}), "");
}
function _isInSource(key, source) {
return source.indexOf(key) > -1;
}
function _generateUniformSourceType(type_) {
if (type_ === "float3") {
return "vec3";
} else {
return type_;
}
}
function _generateUniformSource(shaderLibDataArr, sourceVarDeclare, sourceFuncDefine, sourceBody) {
return shaderLibDataArr.reduce((function (result, param) {
var variables = param[/* variables */2];
var match = OptionService$Wonderjs.isJsonSerializedValueNone(variables);
if (match) {
return result;
} else {
var optionalUniforms = OptionService$Wonderjs.unsafeGetJsonSerializedValue(variables)[/* uniforms */0];
var match$1 = OptionService$Wonderjs.isJsonSerializedValueNone(optionalUniforms);
if (match$1) {
return result;
} else {
return result + OptionService$Wonderjs.unsafeGetJsonSerializedValue(optionalUniforms).filter((function (param) {
var name = param[/* name */0];
if (_isInSource(name, sourceVarDeclare) || _isInSource(name, sourceFuncDefine)) {
return true;
} else {
return _isInSource(name, sourceBody);
}
})).reduce((function (result, param) {
var type_ = _generateUniformSourceType(param[/* type_ */2]);
return result + ("uniform " + (String(type_) + (" " + (String(param[/* name */0]) + ";\n"))));
}), "");
}
}
}), "");
}
function _setSource(sourceChunk, param) {
var sourceTop = sourceChunk[/* top */0];
var sourceDefine = sourceChunk[/* define */1];
var sourceVarDeclare = sourceChunk[/* varDeclare */2];
var sourceFuncDeclare = sourceChunk[/* funcDeclare */3];
var sourceFuncDefine = sourceChunk[/* funcDefine */4];
var sourceBody = sourceChunk[/* body */5];
var top = param[/* top */0];
var define = param[/* define */1];
var varDeclare = param[/* varDeclare */2];
var funcDeclare = param[/* funcDeclare */3];
var funcDefine = param[/* funcDefine */4];
var body = param[/* body */5];
sourceChunk[/* top */0] = sourceTop + top;
sourceChunk[/* define */1] = sourceDefine + define;
sourceChunk[/* varDeclare */2] = sourceVarDeclare + varDeclare;
sourceChunk[/* funcDeclare */3] = sourceFuncDeclare + funcDeclare;
sourceChunk[/* funcDefine */4] = sourceFuncDefine + funcDefine;
sourceChunk[/* body */5] = sourceBody + body;
return sourceChunk;
}
function _buildBody(param, webgl1_main_end) {
var body = param[/* body */5];
return body + webgl1_main_end;
}
function _buildVarDeclare(param, shaderLibDataArr) {
var varDeclare = param[/* varDeclare */2];
var funcDefine = param[/* funcDefine */4];
var body = param[/* body */5];
return varDeclare + ("\n" + _generateUniformSource(shaderLibDataArr, varDeclare, funcDefine, body));
}
function _addAlllParts(param) {
var top = param[/* top */0];
var define = param[/* define */1];
var varDeclare = param[/* varDeclare */2];
var funcDeclare = param[/* funcDeclare */3];
var funcDefine = param[/* funcDefine */4];
var body = param[/* body */5];
return top + (define + (varDeclare + (funcDeclare + (funcDefine + body))));
}
function _execHandle(name, execHandleFunc) {
return Curry._1(execHandleFunc, name);
}
function _createEmptyChunk(param) {
return /* record */[
/* top */"",
/* define */"",
/* varDeclare */"",
/* funcDeclare */"",
/* funcDefine */"",
/* body */""
];
}
function _buildVsAndFsByType(param, param$1, execHandleFunc, glslChunkRecord) {
var name = param$1[1];
var type_ = param$1[0];
var fs = param[1];
var vs = param[0];
switch (type_) {
case "fs" :
return /* tuple */[
vs,
_setSource(fs, ShaderChunkSystem$Wonderjs.getChunk(name, glslChunkRecord))
];
case "fs_function" :
return /* tuple */[
vs,
_setSource(fs, Curry._1(execHandleFunc, name))
];
case "vs" :
return /* tuple */[
_setSource(vs, ShaderChunkSystem$Wonderjs.getChunk(name, glslChunkRecord)),
fs
];
case "vs_function" :
return /* tuple */[
_setSource(vs, Curry._1(execHandleFunc, name)),
fs
];
default:
return Log$WonderLog.fatal(Log$WonderLog.buildFatalMessage("buildGLSLSource", "unknown glsl type: " + (String(type_) + ""), "", "", "name: " + (String(name) + "")));
}
}
function _buildVsAndFs(param, shaderLibDataArr, execHandleFunc, glslChunkRecord) {
return ArrayService$WonderCommonlib.reduceOneParam((function (glslTuple, param) {
var glsls = param[/* glsls */1];
var match = OptionService$Wonderjs.isJsonSerializedValueNone(glsls);
if (match) {
return glslTuple;
} else {
return ArrayService$WonderCommonlib.reduceOneParam((function (sourceTuple, param) {
return _buildVsAndFsByType(sourceTuple, /* tuple */[
param[/* type_ */0],
param[/* name */1]
], execHandleFunc, glslChunkRecord);
}), glslTuple, OptionService$Wonderjs.unsafeGetJsonSerializedValue(glsls));
}
}), /* tuple */[
param[0],
param[1]
], shaderLibDataArr);
}
function buildGLSLSource(shaderLibDataArr, execHandleFunc, param) {
var precision = param[0][/* precision */0];
var vs = /* record */[
/* top */"",
/* define */"",
/* varDeclare */"",
/* funcDeclare */"",
/* funcDefine */"",
/* body */""
];
var fs = /* record */[
/* top */"",
/* define */"",
/* varDeclare */"",
/* funcDeclare */"",
/* funcDefine */"",
/* body */""
];
vs[/* body */5] = vs[/* body */5] + webgl1_main_begin;
fs[/* body */5] = fs[/* body */5] + webgl1_main_begin;
var precision$1 = OptionService$Wonderjs.unsafeGet(precision);
vs[/* top */0] = precision$1 + vs[/* top */0];
fs[/* top */0] = precision$1 + fs[/* top */0];
var match = _buildVsAndFs(/* tuple */[
vs,
fs
], shaderLibDataArr, execHandleFunc, param[1]);
var fs$1 = match[1];
var vs$1 = match[0];
vs$1[/* body */5] = _buildBody(vs$1, webgl1_main_end);
fs$1[/* body */5] = _buildBody(fs$1, webgl1_main_end);
vs$1[/* varDeclare */2] = "\n" + (_generateAttributeSource(shaderLibDataArr) + vs$1[/* varDeclare */2]);
vs$1[/* varDeclare */2] = _buildVarDeclare(vs$1, shaderLibDataArr);
fs$1[/* varDeclare */2] = _buildVarDeclare(fs$1, shaderLibDataArr);
return /* tuple */[
_addAlllParts(vs$1),
_addAlllParts(fs$1)
];
}
exports.webgl1_main_begin = webgl1_main_begin;
exports.webgl1_main_end = webgl1_main_end;
exports._generateAttributeSource = _generateAttributeSource;
exports._isInSource = _isInSource;
exports._generateUniformSourceType = _generateUniformSourceType;
exports._generateUniformSource = _generateUniformSource;
exports._setSource = _setSource;
exports._buildBody = _buildBody;
exports._buildVarDeclare = _buildVarDeclare;
exports._addAlllParts = _addAlllParts;
exports._execHandle = _execHandle;
exports._createEmptyChunk = _createEmptyChunk;
exports._buildVsAndFsByType = _buildVsAndFsByType;
exports._buildVsAndFs = _buildVsAndFs;
exports.buildGLSLSource = buildGLSLSource;
/* Log-WonderLog Not a pure module */