ami-cjs.js
Version:
<p align="center"> <img src="https://cloud.githubusercontent.com/assets/214063/23213764/78ade038-f90c-11e6-8208-4fcade5f3832.png" width="60%"> </p>
85 lines (65 loc) • 5.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _shaders = require('./interpolation/shaders.interpolation');
var _shaders2 = _interopRequireDefault(_shaders);
var _shadersHelpers = require('./helpers/shaders.helpers.intersectBox');
var _shadersHelpers2 = _interopRequireDefault(_shadersHelpers);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var ShadersFragment = function () {
// pass uniforms object
function ShadersFragment(uniforms) {
_classCallCheck(this, ShadersFragment);
this._uniforms = uniforms;
this._functions = {};
this._main = '';
}
_createClass(ShadersFragment, [{
key: 'functions',
value: function functions() {
if (this._main === '') {
// if main is empty, functions can not have been computed
this.main();
}
var content = '';
for (var property in this._functions) {
content += this._functions[property] + '\n';
}
return content;
}
}, {
key: 'uniforms',
value: function uniforms() {
var content = '';
for (var property in this._uniforms) {
var uniform = this._uniforms[property];
content += 'uniform ' + uniform.typeGLSL + ' ' + property;
if (uniform && uniform.length) {
content += '[' + uniform.length + ']';
}
content += ';\n';
}
return content;
}
}, {
key: 'main',
value: function main() {
// need to pre-call main to fill up the functions list
this._main = '\nvoid getIntensity(in vec3 dataCoordinates, out float intensity, out vec3 gradient){\n\n vec4 dataValue = vec4(0., 0., 0., 0.);\n ' + (0, _shaders2.default)(this, 'dataCoordinates', 'dataValue', 'gradient') + '\n\n intensity = dataValue.r;\n\n // rescale/slope\n intensity = intensity*uRescaleSlopeIntercept[0] + uRescaleSlopeIntercept[1];\n // window level\n float windowMin = uWindowCenterWidth[0] - uWindowCenterWidth[1] * 0.5;\n intensity = ( intensity - windowMin ) / uWindowCenterWidth[1];\n}\n\nvoid main(void) {\n const int maxSteps = 1024;\n\n // the ray\n vec3 rayOrigin = cameraPosition;\n vec3 rayDirection = normalize(vPos.xyz - rayOrigin);\n\n // the Axe-Aligned B-Box\n vec3 AABBMin = vec3(uWorldBBox[0], uWorldBBox[2], uWorldBBox[4]);\n vec3 AABBMax = vec3(uWorldBBox[1], uWorldBBox[3], uWorldBBox[5]);\n\n // Intersection ray/bbox\n float tNear, tFar;\n bool intersect = false;\n ' + _shadersHelpers2.default.api(this, 'rayOrigin', 'rayDirection', 'AABBMin', 'AABBMax', 'tNear', 'tFar', 'intersect') + '\n if (tNear < 0.0) tNear = 0.0;\n\n // init the ray marching\n float tCurrent = tNear;\n float tStep = (tFar - tNear) / float(uSteps);\n vec4 accumulatedColor = vec4(0.0);\n float accumulatedAlpha = 0.0;\n\n for(int rayStep = 0; rayStep < maxSteps; rayStep++){\n vec3 currentPosition = rayOrigin + rayDirection * tCurrent;\n // some non-linear FUN\n // some occlusion issue to be fixed\n vec3 transformedPosition = currentPosition; //transformPoint(currentPosition, uAmplitude, uFrequence);\n // world to data coordinates\n // rounding trick\n // first center of first voxel in data space is CENTERED on (0,0,0)\n vec4 dataCoordinatesRaw = uWorldToData * vec4(transformedPosition, 1.0);\n vec3 currentVoxel = vec3(dataCoordinatesRaw.x, dataCoordinatesRaw.y, dataCoordinatesRaw.z);\n float intensity = 0.0;\n vec3 gradient = vec3(0., 0., 0.);\n getIntensity(currentVoxel, intensity, gradient);\n\n vec4 colorSample;\n float alphaSample;\n if(uLut == 1){\n vec4 colorFromLUT = texture2D( uTextureLUT, vec2( intensity, 1.0) );\n // 256 colors\n colorSample = colorFromLUT;\n alphaSample = colorFromLUT.a;\n }\n else{\n alphaSample = intensity;\n colorSample.r = colorSample.g = colorSample.b = intensity * alphaSample;\n }\n\n alphaSample = alphaSample * uAlphaCorrection;\n alphaSample *= (1.0 - accumulatedAlpha);\n\n accumulatedColor += alphaSample * colorSample;\n accumulatedAlpha += alphaSample;\n\n tCurrent += tStep;\n\n if(tCurrent > tFar || accumulatedAlpha >= 1.0 ) break;\n }\n\n gl_FragColor = vec4(accumulatedColor.xyz, accumulatedAlpha);\n}\n ';
}
}, {
key: 'compute',
value: function compute() {
var shaderInterpolation = '';
// shaderInterpolation.inline(args) //true/false
// shaderInterpolation.functions(args)
return '\n// uniforms\n' + this.uniforms() + '\n\n// varying (should fetch it from vertex directly)\nvarying vec4 vPos;\n\n// tailored functions\n' + this.functions() + '\n\n// main loop\n' + this._main + '\n ';
}
}]);
return ShadersFragment;
}();
exports.default = ShadersFragment;
module.exports = exports['default'];