molstar
Version:
A comprehensive macromolecular library.
112 lines (111 loc) • 5.47 kB
JavaScript
"use strict";
/**
* Copyright (c) 2019-2024 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.calcActiveVoxels = calcActiveVoxels;
const renderable_1 = require("../../renderable");
const render_item_1 = require("../../webgl/render-item");
const schema_1 = require("../../renderable/schema");
const shader_code_1 = require("../../../mol-gl/shader-code");
const mol_util_1 = require("../../../mol-util");
const util_1 = require("../util");
const tables_1 = require("./tables");
const quad_vert_1 = require("../../../mol-gl/shader/quad.vert");
const active_voxels_frag_1 = require("../../../mol-gl/shader/marching-cubes/active-voxels.frag");
const debug_1 = require("../../../mol-util/debug");
const compat_1 = require("../../webgl/compat");
const ActiveVoxelsSchema = {
...util_1.QuadSchema,
tTriCount: (0, schema_1.TextureSpec)('image-uint8', 'alpha', 'ubyte', 'nearest'),
tVolumeData: (0, schema_1.TextureSpec)('texture', 'rgba', 'ubyte', 'nearest'),
dValueChannel: (0, schema_1.DefineSpec)('string', ['red', 'alpha']),
uIsoValue: (0, schema_1.UniformSpec)('f'),
uGridDim: (0, schema_1.UniformSpec)('v3'),
uGridTexDim: (0, schema_1.UniformSpec)('v3'),
uScale: (0, schema_1.UniformSpec)('v2'),
};
const ActiveVoxelsName = 'active-voxels';
function valueChannel(ctx, volumeData) {
return (0, compat_1.isWebGL2)(ctx.gl) && volumeData.format === ctx.gl.RED ? 'red' : 'alpha';
}
function getActiveVoxelsRenderable(ctx, volumeData, gridDim, gridTexDim, isoValue, scale) {
if (ctx.namedComputeRenderables[ActiveVoxelsName]) {
const v = ctx.namedComputeRenderables[ActiveVoxelsName].values;
mol_util_1.ValueCell.update(v.uQuadScale, scale);
mol_util_1.ValueCell.update(v.tVolumeData, volumeData);
mol_util_1.ValueCell.update(v.dValueChannel, valueChannel(ctx, volumeData));
mol_util_1.ValueCell.updateIfChanged(v.uIsoValue, isoValue);
mol_util_1.ValueCell.update(v.uGridDim, gridDim);
mol_util_1.ValueCell.update(v.uGridTexDim, gridTexDim);
mol_util_1.ValueCell.update(v.uScale, scale);
ctx.namedComputeRenderables[ActiveVoxelsName].update();
}
else {
ctx.namedComputeRenderables[ActiveVoxelsName] = createActiveVoxelsRenderable(ctx, volumeData, gridDim, gridTexDim, isoValue, scale);
}
return ctx.namedComputeRenderables[ActiveVoxelsName];
}
function createActiveVoxelsRenderable(ctx, volumeData, gridDim, gridTexDim, isoValue, scale) {
const values = {
...util_1.QuadValues,
tTriCount: mol_util_1.ValueCell.create((0, tables_1.getTriCount)()),
uQuadScale: mol_util_1.ValueCell.create(scale),
tVolumeData: mol_util_1.ValueCell.create(volumeData),
dValueChannel: mol_util_1.ValueCell.create(valueChannel(ctx, volumeData)),
uIsoValue: mol_util_1.ValueCell.create(isoValue),
uGridDim: mol_util_1.ValueCell.create(gridDim),
uGridTexDim: mol_util_1.ValueCell.create(gridTexDim),
uScale: mol_util_1.ValueCell.create(scale),
};
const schema = { ...ActiveVoxelsSchema };
const shaderCode = (0, shader_code_1.ShaderCode)('active-voxels', quad_vert_1.quad_vert, active_voxels_frag_1.activeVoxels_frag);
const renderItem = (0, render_item_1.createComputeRenderItem)(ctx, 'triangles', shaderCode, schema, values);
return (0, renderable_1.createComputeRenderable)(renderItem, values);
}
function setRenderingDefaults(ctx) {
const { gl, state } = ctx;
state.disable(gl.CULL_FACE);
state.disable(gl.BLEND);
state.disable(gl.DEPTH_TEST);
state.enable(gl.SCISSOR_TEST);
state.depthMask(false);
state.colorMask(true, true, true, true);
state.clearColor(0, 0, 0, 0);
}
function calcActiveVoxels(ctx, volumeData, gridDim, gridTexDim, isoValue, gridScale) {
if (debug_1.isTimingMode)
ctx.timer.mark('calcActiveVoxels');
const { gl, state, resources } = ctx;
const width = volumeData.getWidth();
const height = volumeData.getHeight();
if (!ctx.namedFramebuffers[ActiveVoxelsName]) {
ctx.namedFramebuffers[ActiveVoxelsName] = resources.framebuffer();
}
const framebuffer = ctx.namedFramebuffers[ActiveVoxelsName];
framebuffer.bind();
if (!ctx.namedTextures[ActiveVoxelsName]) {
ctx.namedTextures[ActiveVoxelsName] = resources.texture('image-uint8', 'rgba', 'ubyte', 'nearest');
}
const activeVoxelsTex = ctx.namedTextures[ActiveVoxelsName];
activeVoxelsTex.define(width, height);
const renderable = getActiveVoxelsRenderable(ctx, volumeData, gridDim, gridTexDim, isoValue, gridScale);
ctx.state.currentRenderItemId = -1;
activeVoxelsTex.attachFramebuffer(framebuffer, 0);
setRenderingDefaults(ctx);
state.viewport(0, 0, width, height);
state.scissor(0, 0, width, height);
gl.clear(gl.COLOR_BUFFER_BIT);
state.scissor(0, 0, gridTexDim[0], gridTexDim[1]);
renderable.render();
// console.log('gridScale', gridScale, 'gridTexDim', gridTexDim, 'gridDim', gridDim);
// console.log('volumeData', volumeData);
// console.log('at', readTexture(ctx, activeVoxelsTex));
// printTextureImage(readTexture(ctx, activeVoxelsTex), { scale: 0.75 });
gl.finish();
if (debug_1.isTimingMode)
ctx.timer.markEnd('calcActiveVoxels');
return activeVoxelsTex;
}