molstar
Version:
A comprehensive macromolecular library.
75 lines • 3.56 kB
JavaScript
/**
* Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { __assign } from "tslib";
import { createComputeRenderable } from '../../renderable';
import { createComputeRenderItem } from '../../webgl/render-item';
import { TextureSpec } from '../../renderable/schema';
import { ShaderCode } from '../../../mol-gl/shader-code';
import { ValueCell } from '../../../mol-util';
import { decodeFloatRGB } from '../../../mol-util/float-packing';
import { QuadSchema, QuadValues } from '../util';
import { quad_vert } from '../../../mol-gl/shader/quad.vert';
import { sum_frag } from '../../../mol-gl/shader/histogram-pyramid/sum.frag';
import { isWebGL2 } from '../../webgl/compat';
var HistopyramidSumSchema = __assign(__assign({}, QuadSchema), { tTexture: TextureSpec('texture', 'rgba', 'float', 'nearest') });
var HistopyramidSumName = 'histopyramid-sum';
function getHistopyramidSumRenderable(ctx, texture) {
if (ctx.namedComputeRenderables[HistopyramidSumName]) {
var v = ctx.namedComputeRenderables[HistopyramidSumName].values;
ValueCell.update(v.tTexture, texture);
ctx.namedComputeRenderables[HistopyramidSumName].update();
}
else {
ctx.namedComputeRenderables[HistopyramidSumName] = createHistopyramidSumRenderable(ctx, texture);
}
return ctx.namedComputeRenderables[HistopyramidSumName];
}
function createHistopyramidSumRenderable(ctx, texture) {
var values = __assign(__assign({}, QuadValues), { tTexture: ValueCell.create(texture) });
var schema = __assign({}, HistopyramidSumSchema);
var shaderCode = ShaderCode('sum', quad_vert, sum_frag, {}, { 0: 'ivec4' });
var renderItem = createComputeRenderItem(ctx, 'triangles', shaderCode, schema, values);
return createComputeRenderable(renderItem, values);
}
function setRenderingDefaults(ctx) {
var gl = ctx.gl, state = ctx.state;
state.disable(gl.CULL_FACE);
state.disable(gl.BLEND);
state.disable(gl.DEPTH_TEST);
state.disable(gl.SCISSOR_TEST);
state.depthMask(false);
state.colorMask(true, true, true, true);
state.clearColor(0, 0, 0, 0);
}
var sumBytes = new Uint8Array(4);
var sumInts = new Int32Array(4);
export function getHistopyramidSum(ctx, pyramidTopTexture) {
var gl = ctx.gl, resources = ctx.resources;
var renderable = getHistopyramidSumRenderable(ctx, pyramidTopTexture);
ctx.state.currentRenderItemId = -1;
if (!ctx.namedFramebuffers[HistopyramidSumName]) {
ctx.namedFramebuffers[HistopyramidSumName] = resources.framebuffer();
}
var framebuffer = ctx.namedFramebuffers[HistopyramidSumName];
if (!ctx.namedTextures[HistopyramidSumName]) {
ctx.namedTextures[HistopyramidSumName] = isWebGL2(gl)
? resources.texture('image-int32', 'rgba', 'int', 'nearest')
: resources.texture('image-uint8', 'rgba', 'ubyte', 'nearest');
ctx.namedTextures[HistopyramidSumName].define(1, 1);
}
var sumTexture = ctx.namedTextures[HistopyramidSumName];
sumTexture.attachFramebuffer(framebuffer, 0);
setRenderingDefaults(ctx);
gl.viewport(0, 0, 1, 1);
renderable.render();
gl.finish();
ctx.readPixels(0, 0, 1, 1, isWebGL2(gl) ? sumInts : sumBytes);
ctx.unbindFramebuffer();
return isWebGL2(gl)
? sumInts[0]
: decodeFloatRGB(sumBytes[0], sumBytes[1], sumBytes[2]);
}
//# sourceMappingURL=sum.js.map