UNPKG

biojs-vis-pdbviewer

Version:

A BioJS 2.0 component to view protein structures

144 lines (141 loc) 5.81 kB
Clazz.declarePackage ("J.renderspecial"); Clazz.load (["J.render.ShapeRenderer", "JU.P3", "$.V3"], "J.renderspecial.DipolesRenderer", ["JU.P3i", "JU.C"], function () { c$ = Clazz.decorateAsClass (function () { this.dipoleVectorScale = 0; this.offset = null; this.screens = null; this.points = null; this.cross0 = null; this.cross1 = null; this.diameter = 0; this.headWidthPixels = 0; this.crossWidthPixels = 0; this.offsetSide = 0; this.colixA = 0; this.colixB = 0; this.noCross = false; Clazz.instantialize (this, arguments); }, J.renderspecial, "DipolesRenderer", J.render.ShapeRenderer); Clazz.prepareFields (c$, function () { this.offset = new JU.V3 (); this.screens = new Array (6); this.points = new Array (6); { for (var i = 0; i < 6; i++) { this.screens[i] = new JU.P3i (); this.points[i] = new JU.P3 (); } }this.cross0 = new JU.P3 (); this.cross1 = new JU.P3 (); }); Clazz.overrideMethod (c$, "render", function () { var dipoles = this.shape; this.dipoleVectorScale = this.vwr.getFloat (570425355); var needTranslucent = false; var vis = this.vwr.ms.getVisibleSet (); for (var i = dipoles.dipoleCount; --i >= 0; ) { var dipole = dipoles.dipoles[i]; if (dipole.visibilityFlags != 0 && (dipole.atoms[0] == null || !this.ms.isAtomHidden (dipole.atoms[0].i)) && (dipole.bsMolecule == null || dipole.bsMolecule.intersects (vis)) && this.renderDipoleVector (dipole, vis)) needTranslucent = true; } return needTranslucent; }); Clazz.defineMethod (c$, "renderDipoleVector", function (dipole, vis) { this.mad = dipole.mad; this.offsetSide = dipole.offsetSide; this.noCross = dipole.noCross; this.colixA = (dipole.bond == null ? dipole.colix : JU.C.getColixInherited (dipole.colix, dipole.bond.colix)); this.colixB = this.colixA; if (dipole.atoms[0] != null) { this.colixA = JU.C.getColixInherited (this.colixA, dipole.atoms[0].getColix ()); this.colixB = JU.C.getColixInherited (this.colixB, dipole.atoms[1].getColix ()); }if (this.colixA == 0) this.colixA = 5; if (this.colixB == 0) this.colixB = 5; if (this.dipoleVectorScale < 0) { var c = this.colixA; this.colixA = this.colixB; this.colixB = c; }var factor = dipole.offsetAngstroms / dipole.dipoleValue; if (dipole.lstDipoles == null) return this.renderVector (dipole.vector, dipole.origin, dipole.center, factor, false); var needTranslucent = false; for (var i = dipole.lstDipoles.size (); --i >= 0; ) { var o = dipole.lstDipoles.get (i); var v = o[0]; var origin = o[1]; var bsAtoms = o[2]; if (bsAtoms.intersects (vis)) needTranslucent = this.renderVector (v, origin, null, dipole.offsetAngstroms, true); } return needTranslucent; }, "J.shapespecial.Dipole,JU.BS"); Clazz.defineMethod (c$, "renderVector", function (vector, origin, dcenter, factor, isGroup) { this.offset.setT (vector); if (dcenter == null) { if (isGroup) { this.offset.normalize (); this.offset.scale (factor); } else { this.offset.scale (factor); if (this.dipoleVectorScale < 0) this.offset.add (vector); }this.points[0].add2 (origin, this.offset); } else { this.offset.scale (-0.5 * this.dipoleVectorScale); this.points[0].add2 (dcenter, this.offset); if (factor != 0) { this.offset.setT (vector); this.offset.scale (factor); this.points[0].add (this.offset); }}this.points[1].scaleAdd2 (this.dipoleVectorScale * 0.1, vector, this.points[0]); this.points[2].scaleAdd2 (this.dipoleVectorScale * (0.14), vector, this.points[0]); this.points[3].scaleAdd2 (this.dipoleVectorScale / 2, vector, this.points[0]); this.points[4].scaleAdd2 (this.dipoleVectorScale * 0.9, vector, this.points[0]); this.points[5].scaleAdd2 (this.dipoleVectorScale, vector, this.points[0]); this.offset.setT (this.points[3]); this.offset.cross (this.offset, vector); if (this.offset.length () == 0) { this.offset.set (this.points[3].x + 0.2345, this.points[3].y + 0.1234, this.points[3].z + 0.4321); this.offset.cross (this.offset, vector); }this.offset.scale (this.offsetSide / this.offset.length ()); for (var i = 0; i < 6; i++) this.points[i].add (this.offset); for (var i = 0; i < 6; i++) this.tm.transformPtScr (this.points[i], this.screens[i]); this.tm.transformPt3f (this.points[1], this.cross0); this.tm.transformPt3f (this.points[2], this.cross1); var d = this.vwr.tm.scaleToScreen (this.screens[3].z, this.mad); this.diameter = Clazz.floatToInt (d); this.headWidthPixels = Clazz.doubleToInt (Math.floor (d * 2.0)); if (this.headWidthPixels < this.diameter + 5) this.headWidthPixels = this.diameter + 5; this.crossWidthPixels = this.headWidthPixels; this.colix = this.colixA; if (this.colix == this.colixB) { if (!this.g3d.setC (this.colix)) return true; this.g3d.fillCylinder (1, this.diameter, this.screens[0], this.screens[4]); if (!this.noCross) this.g3d.fillCylinderBits (2, this.crossWidthPixels, this.cross0, this.cross1); this.g3d.fillConeScreen (2, this.headWidthPixels, this.screens[4], this.screens[5], false); return false; }var needTranslucent = false; if (this.g3d.setC (this.colix)) { this.g3d.fillCylinder (1, this.diameter, this.screens[0], this.screens[3]); if (!this.noCross) this.g3d.fillCylinderBits (2, this.crossWidthPixels, this.cross0, this.cross1); } else { needTranslucent = true; }this.colix = this.colixB; if (this.g3d.setC (this.colix)) { this.g3d.fillCylinder (4, this.diameter, this.screens[3], this.screens[4]); this.g3d.fillConeScreen (2, this.headWidthPixels, this.screens[4], this.screens[5], false); } else { needTranslucent = true; }return needTranslucent; }, "JU.V3,JU.P3,JU.P3,~N,~B"); Clazz.defineStatics (c$, "cylinderBase", 0, "cross", 1, "crossEnd", 2, "center", 3, "arrowHeadBase", 4, "arrowHeadTip", 5, "arrowHeadOffset", 0.9, "arrowHeadWidthFactor", 2, "crossOffset", 0.1, "crossWidth", 0.04); });