UNPKG

molstar

Version:

A comprehensive macromolecular library.

114 lines (113 loc) 5.57 kB
"use strict"; /** * Copyright (c) 2020-2021 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.readAlphaTexture = exports.readTexture = exports.getSharedCopyRenderable = exports.createCopyRenderable = exports.QuadValues = exports.QuadSchema = exports.QuadPositions = void 0; var tslib_1 = require("tslib"); var texture_1 = require("../../mol-gl/webgl/texture"); var mol_util_1 = require("../../mol-util"); var schema_1 = require("../../mol-gl/renderable/schema"); var linear_algebra_1 = require("../../mol-math/linear-algebra"); var shader_code_1 = require("../shader-code"); var copy_frag_1 = require("../shader/copy.frag"); var quad_vert_1 = require("../shader/quad.vert"); var render_item_1 = require("../webgl/render-item"); var renderable_1 = require("../renderable"); exports.QuadPositions = new Float32Array([ 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0 // Second triangle ]); exports.QuadSchema = { drawCount: (0, schema_1.ValueSpec)('number'), instanceCount: (0, schema_1.ValueSpec)('number'), aPosition: (0, schema_1.AttributeSpec)('float32', 2, 0), uQuadScale: (0, schema_1.UniformSpec)('v2'), }; exports.QuadValues = { drawCount: mol_util_1.ValueCell.create(6), instanceCount: mol_util_1.ValueCell.create(1), aPosition: mol_util_1.ValueCell.create(exports.QuadPositions), uQuadScale: mol_util_1.ValueCell.create(linear_algebra_1.Vec2.create(1, 1)), }; // var CopySchema = tslib_1.__assign(tslib_1.__assign({}, exports.QuadSchema), { tColor: (0, schema_1.TextureSpec)('texture', 'rgba', 'ubyte', 'nearest'), uTexSize: (0, schema_1.UniformSpec)('v2') }); var CopyShaderCode = (0, shader_code_1.ShaderCode)('copy', quad_vert_1.quad_vert, copy_frag_1.copy_frag); function createCopyRenderable(ctx, texture) { var values = tslib_1.__assign(tslib_1.__assign({}, exports.QuadValues), { tColor: mol_util_1.ValueCell.create(texture), uTexSize: mol_util_1.ValueCell.create(linear_algebra_1.Vec2.create(texture.getWidth(), texture.getHeight())) }); var schema = tslib_1.__assign({}, CopySchema); var renderItem = (0, render_item_1.createComputeRenderItem)(ctx, 'triangles', CopyShaderCode, schema, values); return (0, renderable_1.createComputeRenderable)(renderItem, values); } exports.createCopyRenderable = createCopyRenderable; var SharedCopyName = 'shared-copy'; function getSharedCopyRenderable(ctx, texture) { if (!ctx.namedComputeRenderables[SharedCopyName]) { ctx.namedComputeRenderables[SharedCopyName] = createCopyRenderable(ctx, (0, texture_1.createNullTexture)()); } var copy = ctx.namedComputeRenderables[SharedCopyName]; mol_util_1.ValueCell.update(copy.values.tColor, texture); mol_util_1.ValueCell.update(copy.values.uTexSize, linear_algebra_1.Vec2.set(copy.values.uTexSize.ref.value, texture.getWidth(), texture.getHeight())); copy.update(); return copy; } exports.getSharedCopyRenderable = getSharedCopyRenderable; // var ReadTextureName = 'read-texture'; var ReadAlphaTextureName = 'read-alpha-texture'; function readTexture(ctx, texture, array) { var gl = ctx.gl, resources = ctx.resources; if (!array && texture.type !== gl.UNSIGNED_BYTE) throw new Error('unsupported texture type'); if (!ctx.namedFramebuffers[ReadTextureName]) { ctx.namedFramebuffers[ReadTextureName] = resources.framebuffer(); } var framebuffer = ctx.namedFramebuffers[ReadTextureName]; var width = texture.getWidth(); var height = texture.getHeight(); if (!array) array = new Uint8Array(width * height * 4); framebuffer.bind(); texture.attachFramebuffer(framebuffer, 0); ctx.readPixels(0, 0, width, height, array); return { array: array, width: width, height: height }; } exports.readTexture = readTexture; function readAlphaTexture(ctx, texture) { var gl = ctx.gl, state = ctx.state, resources = ctx.resources; if (texture.type !== gl.UNSIGNED_BYTE) throw new Error('unsupported texture type'); var width = texture.getWidth(); var height = texture.getHeight(); var copy = getSharedCopyRenderable(ctx, texture); state.currentRenderItemId = -1; if (!ctx.namedFramebuffers[ReadAlphaTextureName]) { ctx.namedFramebuffers[ReadAlphaTextureName] = resources.framebuffer(); } var framebuffer = ctx.namedFramebuffers[ReadAlphaTextureName]; framebuffer.bind(); if (!ctx.namedTextures[ReadAlphaTextureName]) { ctx.namedTextures[ReadAlphaTextureName] = resources.texture('image-uint8', 'rgba', 'ubyte', 'linear'); } var copyTex = ctx.namedTextures[ReadAlphaTextureName]; copyTex.define(width, height); copyTex.attachFramebuffer(framebuffer, 0); state.disable(gl.CULL_FACE); state.enable(gl.BLEND); state.disable(gl.DEPTH_TEST); state.enable(gl.SCISSOR_TEST); state.depthMask(false); state.clearColor(0, 0, 0, 0); state.blendFunc(gl.ONE, gl.ONE); state.blendEquation(gl.FUNC_ADD); state.viewport(0, 0, width, height); state.scissor(0, 0, width, height); gl.clear(gl.COLOR_BUFFER_BIT); copy.render(); var array = new Uint8Array(width * height * 4); ctx.readPixels(0, 0, width, height, array); return { array: array, width: width, height: height }; } exports.readAlphaTexture = readAlphaTexture;