Clazz.declarePackage ("J.renderbio"); Clazz.load (["J.render.MeshRenderer", "JU.A4", "$.M3", "$.P3", "$.V3"], "J.renderbio.BioMeshRenderer", ["JU.BS", "J.shape.Mesh", "JU.GData", "$.Logger", "$.Normix"], function () { c$ = Clazz.decorateAsClass (function () { this.meshes = null; this.meshReady = null; this.bsRenderMesh = null; this.bsr = null; this.doCap0 = false; this.doCap1 = false; this.controlHermites = null; this.wingHermites = null; this.radiusHermites = null; this.norm = null; this.wing = null; this.wing1 = null; this.wingT = null; this.aa = null; this.pt = null; this.pt1 = null; this.ptPrev = null; this.ptNext = null; this.mat = null; this.bsTemp = null; this.norml = null; Clazz.instantialize (this, arguments); }, J.renderbio, "BioMeshRenderer", J.render.MeshRenderer); Clazz.prepareFields (c$, function () { this.norm = new JU.V3 (); this.wing = new JU.V3 (); this.wing1 = new JU.V3 (); this.wingT = new JU.V3 (); this.aa = new JU.A4 (); this.pt = new JU.P3 (); this.pt1 = new JU.P3 (); this.ptPrev = new JU.P3 (); this.ptNext = new JU.P3 (); this.mat = new JU.M3 (); this.norml = new JU.V3 (); }); Clazz.overrideMethod (c$, "render", function () { return false; }); Clazz.defineMethod (c$, "initialize", function (bsr, bioShape, monomerCount) { this.bsr = bsr; this.bsRenderMesh = JU.BS.newN (monomerCount); this.meshReady = bioShape.meshReady; this.meshes = bioShape.meshes; }, "J.render.ShapeRenderer,J.shapebio.BioShape,~N"); Clazz.defineMethod (c$, "renderBioMesh", function (mesh) { if (mesh.normalsTemp != null) { mesh.setNormixes (mesh.normalsTemp); mesh.normalsTemp = null; } else if (mesh.normixes == null) { mesh.initialize (1073741958, null, null); }this.renderMesh2 (mesh); }, "J.shape.Mesh"); Clazz.defineMethod (c$, "setFancyRibbon", function (i) { try { if ((this.meshes[i] == null || !this.meshReady[i]) && !this.createMesh (i, this.bsr.madBeg, this.bsr.madMid, this.bsr.madEnd, this.bsr.aspectRatio, this.bsr.isNucleic ? 4 : 7)) return; this.meshes[i].setColix (this.bsr.colix); this.meshes[i].setColixBack (this.bsr.colixBack); this.bsRenderMesh.set (i); } catch (e) { if (Clazz.exceptionOf (e, Exception)) { this.bsRenderMesh.clear (i); this.meshes[i] = null; JU.Logger.error ("render mesh error hermiteRibbon: " + e.toString ()); } else { throw e; } } }, "~N"); Clazz.defineMethod (c$, "setFancyConic", function (i, tension) { try { if ((this.meshes[i] == null || !this.meshReady[i]) && !this.createMesh (i, this.bsr.madBeg, this.bsr.madMid, this.bsr.madEnd, 1, tension)) return; this.meshes[i].setColix (this.bsr.colix); this.bsRenderMesh.set (i); return; } catch (e) { if (Clazz.exceptionOf (e, Exception)) { this.bsRenderMesh.clear (i); this.meshes[i] = null; JU.Logger.error ("render mesh error hermiteConic: " + e.toString ()); } else { throw e; } } }, "~N,~N"); Clazz.defineMethod (c$, "setFancyArrowHead", function (i) { try { this.doCap0 = true; this.doCap1 = false; if ((this.meshes[i] == null || !this.meshReady[i]) && !this.createMesh (i, Clazz.doubleToInt (Math.floor (this.bsr.madBeg * 1.2)), Clazz.doubleToInt (Math.floor (this.bsr.madBeg * 0.6)), 0, (this.bsr.aspectRatio == 1 ? this.bsr.aspectRatio : this.bsr.aspectRatio / 2), 7)) return; this.meshes[i].setColix (this.bsr.colix); this.bsRenderMesh.set (i); return; } catch (e) { if (Clazz.exceptionOf (e, Exception)) { this.bsRenderMesh.clear (i); this.meshes[i] = null; JU.Logger.error ("render mesh error hermiteArrowHead: " + e.toString ()); } else { throw e; } } }, "~N"); Clazz.defineMethod (c$, "createMesh", function (i, madBeg, madMid, madEnd, aspectRatio, tension) { this.bsr.setNeighbors (i); var cp = this.bsr.controlPoints; if (cp[i].distanceSquared (cp[this.bsr.iNext]) == 0) return false; var isEccentric = (aspectRatio != 1 && this.bsr.wingVectors != null); var isFlatMesh = (aspectRatio == 0); var isElliptical = (this.bsr.cartoonsFancy || this.bsr.hermiteLevel >= 6); var nHermites = (this.bsr.hermiteLevel + 1) * 2 + 1; var nPer = (isFlatMesh ? 4 : (this.bsr.hermiteLevel + 1) * 4 - 2); var angle = ((isFlatMesh ? 3.141592653589793 / (nPer - 1) : 6.283185307179586 / nPer)); var mesh = this.meshes[i] = new J.shape.Mesh ().mesh1 (this.vwr, "mesh_" + this.shapeID + "_" + i, 0, i); var variableRadius = (madBeg != madMid || madMid != madEnd); if (this.controlHermites == null || this.controlHermites.length < nHermites + 1) { this.controlHermites = new Array (nHermites + 1); }JU.GData.getHermiteList (tension, cp[this.bsr.iPrev], cp[i], cp[this.bsr.iNext], cp[this.bsr.iNext2], cp[this.bsr.iNext3], this.controlHermites, 0, nHermites, true); if (this.wingHermites == null || this.wingHermites.length < nHermites + 1) { this.wingHermites = new Array (nHermites + 1); }this.wing.setT (this.bsr.wingVectors[this.bsr.iPrev]); if (madEnd == 0) this.wing.scale (2.0); JU.GData.getHermiteList (tension, this.wing, this.bsr.wingVectors[i], this.bsr.wingVectors[this.bsr.iNext], this.bsr.wingVectors[this.bsr.iNext2], this.bsr.wingVectors[this.bsr.iNext3], this.wingHermites, 0, nHermites, false); var radius1 = madBeg / 2000; var radius2 = madMid / 2000; var radius3 = madEnd / 2000; if (variableRadius) { if (this.radiusHermites == null || this.radiusHermites.length < ((nHermites + 1) >> 1) + 1) { this.radiusHermites = new Array (((nHermites + 1) >> 1) + 1); }this.ptPrev.set (radius1, radius1, 0); this.pt.set (radius1, radius2, 0); this.pt1.set (radius2, radius3, 0); this.ptNext.set (radius3, radius3, 0); JU.GData.getHermiteList (4, this.ptPrev, this.pt, this.pt1, this.ptNext, this.ptNext, this.radiusHermites, 0, (nHermites + 1) >> 1, true); }var nPoints = 0; var iMid = nHermites >> 1; var kpt1 = Clazz.doubleToInt ((nPer + 2) / 4); var kpt2 = Clazz.doubleToInt ((3 * nPer + 2) / 4); var mode = (!isEccentric ? 0 : isFlatMesh ? 1 : isElliptical ? 2 : 3); var useMat = (mode == 0 || mode == 3); for (var p = 0; p < nHermites; p++) { this.norm.sub2 (this.controlHermites[p + 1], this.controlHermites[p]); var scale = (!variableRadius ? radius1 : p < iMid ? this.radiusHermites[p].x : this.radiusHermites[p - iMid].y); this.wing.setT (this.wingHermites[p]); this.wing1.setT (this.wing); switch (mode) { case 1: break; case 2: this.wing1.cross (this.norm, this.wing); this.wing1.normalize (); this.wing1.scale (this.wing.length () / aspectRatio); break; case 3: this.wing.scale (2 / aspectRatio); this.wing1.sub (this.wing); break; case 0: this.wing.cross (this.wing, this.norm); this.wing.normalize (); break; } this.wing.scale (scale); this.wing1.scale (scale); if (useMat) { this.aa.setVA (this.norm, angle); this.mat.setAA (this.aa); }this.pt1.setT (this.controlHermites[p]); var theta = (isFlatMesh ? 0 : angle); for (var k = 0; k < nPer; k++, theta += angle) { if (useMat && k > 0) this.mat.rotate (this.wing); switch (mode) { case 1: this.wingT.setT (this.wing1); this.wingT.scale (Math.cos (theta)); break; case 2: this.wingT.setT (this.wing1); this.wingT.scale (Math.sin (theta)); this.wingT.scaleAdd2 (Math.cos (theta), this.wing, this.wingT); break; case 3: this.wingT.setT (this.wing); if (k == kpt1 || k == kpt2) this.wing1.scale (-1); this.wingT.add (this.wing1); break; case 0: this.wingT.setT (this.wing); break; } this.pt.add2 (this.pt1, this.wingT); mesh.addV (this.pt, true); } if (p > 0) { var nLast = (isFlatMesh ? nPer - 1 : nPer); for (var k = 0; k < nLast; k++) { var a = nPoints - nPer + k; var b = nPoints - nPer + ((k + 1) % nPer); var c = nPoints + ((k + 1) % nPer); var d = nPoints + k; if (k < Clazz.doubleToInt (nLast / 2)) mesh.addQuad (a, b, c, d); else mesh.addQuad (b, c, d, a); } }nPoints += nPer; } if (!isFlatMesh) { var nPointsPreCap = nPoints; if (this.doCap0) { var vs = mesh.getVertices (); for (var l = 0; l < nPer; l++) mesh.addV (vs[l], true); nPoints += nPer; for (var k = this.bsr.hermiteLevel * 2; --k >= 0; ) mesh.addQuad (nPoints - nPer + k + 2, nPoints - nPer + k + 1, nPoints - nPer + (nPer - k) % nPer, nPoints - k - 1); }if (this.doCap1) { var vs = mesh.getVertices (); for (var l = 0; l < nPer; l++) mesh.addV (vs[nPointsPreCap - nPer + l], true); nPoints += nPer; for (var k = this.bsr.hermiteLevel * 2; --k >= 0; ) mesh.addQuad (nPoints - k - 1, nPoints - nPer + (nPer - k) % nPer, nPoints - nPer + k + 1, nPoints - nPer + k + 2); }}this.meshReady[i] = true; this.adjustCartoonSeamNormals (i, nPer); mesh.setVisibilityFlags (1); return true; }, "~N,~N,~N,~N,~N,~N"); Clazz.defineMethod (c$, "adjustCartoonSeamNormals", function (i, nPer) { if (this.bsTemp == null) this.bsTemp = JU.Normix.newVertexBitSet (); if (i == this.bsr.iNext - 1 && this.bsr.iNext < this.bsr.monomerCount && this.bsr.monomers[i].getStrucNo () == this.bsr.monomers[this.bsr.iNext].getStrucNo () && this.meshReady[i] && this.meshReady[this.bsr.iNext]) { try { var normals2 = this.meshes[this.bsr.iNext].getNormalsTemp (); var normals = this.meshes[i].getNormalsTemp (); var normixCount = normals.length; if (this.doCap0) normixCount -= nPer; for (var j = 1; j <= nPer; ++j) { this.norml.add2 (normals[normixCount - j], normals2[nPer - j]); this.norml.normalize (); normals[normixCount - j].setT (this.norml); normals2[nPer - j].setT (this.norml); } } catch (e) { if (Clazz.exceptionOf (e, Exception)) { } else { throw e; } } }}, "~N,~N"); Clazz.defineMethod (c$, "renderMeshes", function () { if (this.bsRenderMesh.isEmpty ()) return; this.setColix (this.bsr.colix); for (var i = this.bsRenderMesh.nextSetBit (0); i >= 0; i = this.bsRenderMesh.nextSetBit (i + 1)) this.renderBioMesh (this.meshes[i]); }); Clazz.defineMethod (c$, "initBS", function () { this.bsRenderMesh.clearAll (); }); Clazz.defineMethod (c$, "check", function (doCap0, doCap1) { this.doCap0 = doCap0; this.doCap1 = doCap1; return (this.exportType == 1 || this.checkDiameter (this.bsr.diameterBeg) || this.checkDiameter (this.bsr.diameterMid) || this.checkDiameter (this.bsr.diameterEnd)); }, "~B,~B"); Clazz.defineMethod (c$, "checkDiameter", function (d) { return (this.bsr.isHighRes && d > 3 || d >= 8); }, "~N"); Clazz.defineStatics (c$, "ABSOLUTE_MIN_MESH_SIZE", 3, "MIN_MESH_RENDER_SIZE", 8, "MODE_TUBE", 0, "MODE_FLAT", 1, "MODE_ELLIPTICAL", 2, "MODE_NONELLIPTICAL", 3); });