molstar
Version:
A comprehensive macromolecular library.
106 lines (105 loc) • 4.96 kB
JavaScript
/**
* Copyright (c) 2021-2025 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.Clip = Clip;
const linear_algebra_1 = require("../mol-math/linear-algebra");
const misc_1 = require("../mol-math/misc");
const param_definition_1 = require("./param-definition");
const string_1 = require("./string");
function Clip() {
}
(function (Clip) {
/** Clip object types */
Clip.Type = {
none: 0, // to switch clipping off
plane: 1,
sphere: 2,
cube: 3,
cylinder: 4,
infiniteCone: 5,
};
Clip.Params = {
variant: param_definition_1.ParamDefinition.Select('pixel', param_definition_1.ParamDefinition.arrayToOptions(['instance', 'pixel'])),
objects: param_definition_1.ParamDefinition.ObjectList({
type: param_definition_1.ParamDefinition.Select('plane', param_definition_1.ParamDefinition.objectToOptions(Clip.Type, t => (0, string_1.stringToWords)(t))),
invert: param_definition_1.ParamDefinition.Boolean(false),
position: param_definition_1.ParamDefinition.Vec3((0, linear_algebra_1.Vec3)()),
rotation: param_definition_1.ParamDefinition.Group({
axis: param_definition_1.ParamDefinition.Vec3(linear_algebra_1.Vec3.create(1, 0, 0)),
angle: param_definition_1.ParamDefinition.Numeric(0, { min: -180, max: 180, step: 1 }, { description: 'Angle in Degrees' }),
}, { isExpanded: true }),
scale: param_definition_1.ParamDefinition.Vec3(linear_algebra_1.Vec3.create(1, 1, 1)),
transform: param_definition_1.ParamDefinition.Mat4(linear_algebra_1.Mat4.identity()),
}, o => (0, string_1.stringToWords)(o.type))
};
function createClipObjects(count) {
return {
count: 0,
type: (new Array(count)).fill(1),
invert: (new Array(count)).fill(false),
position: (new Array(count * 3)).fill(0),
rotation: (new Array(count * 4)).fill(0),
scale: (new Array(count * 3)).fill(1),
transform: (new Array(count * 16)).fill(0),
};
}
const qA = (0, linear_algebra_1.Quat)();
const qB = (0, linear_algebra_1.Quat)();
const vA = (0, linear_algebra_1.Vec3)();
const vB = (0, linear_algebra_1.Vec3)();
const mA = (0, linear_algebra_1.Mat4)();
const mB = (0, linear_algebra_1.Mat4)();
function getClip(props, clip) {
const count = props.objects.length;
const { type, invert, position, rotation, scale, transform } = (clip === null || clip === void 0 ? void 0 : clip.objects) || createClipObjects(count);
for (let i = 0; i < count; ++i) {
const p = props.objects[i];
type[i] = Clip.Type[p.type];
invert[i] = p.invert;
linear_algebra_1.Vec3.toArray(p.position, position, i * 3);
linear_algebra_1.Quat.toArray(linear_algebra_1.Quat.setAxisAngle(qA, p.rotation.axis, (0, misc_1.degToRad)(p.rotation.angle)), rotation, i * 4);
linear_algebra_1.Vec3.toArray(p.scale, scale, i * 3);
linear_algebra_1.Mat4.toArray(p.transform, transform, i * 16);
}
return {
variant: props.variant,
objects: { count, type, invert, position, rotation, scale, transform }
};
}
Clip.getClip = getClip;
function areEqual(cA, cB) {
if (cA.variant !== cB.variant)
return false;
if (cA.objects.count !== cB.objects.count)
return false;
const oA = cA.objects, oB = cB.objects;
for (let i = 0, il = oA.count; i < il; ++i) {
if (oA.invert[i] !== oB.invert[i])
return false;
if (oA.type[i] !== oB.type[i])
return false;
linear_algebra_1.Vec3.fromArray(vA, oA.position, i * 3);
linear_algebra_1.Vec3.fromArray(vB, oB.position, i * 3);
if (!linear_algebra_1.Vec3.equals(vA, vB))
return false;
linear_algebra_1.Vec3.fromArray(vA, oA.scale, i * 3);
linear_algebra_1.Vec3.fromArray(vB, oB.scale, i * 3);
if (!linear_algebra_1.Vec3.equals(vA, vB))
return false;
linear_algebra_1.Quat.fromArray(qA, oA.rotation, i * 4);
linear_algebra_1.Quat.fromArray(qB, oB.rotation, i * 4);
if (!linear_algebra_1.Quat.equals(qA, qB))
return false;
linear_algebra_1.Mat4.fromArray(mA, oA.transform, i * 16);
linear_algebra_1.Mat4.fromArray(mB, oB.transform, i * 16);
if (!linear_algebra_1.Mat4.areEqual(mA, mB, linear_algebra_1.EPSILON))
return false;
}
return true;
}
Clip.areEqual = areEqual;
})(Clip || (exports.Clip = Clip = {}));
;