{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-mpm-debugging/src/mpm-debugger/src/visualization/renderer.js"],"names":["Vector2","Configuration","mini","Class","subclass","initialize","renderer","setFillStyle","color","context","fillStyle","setStrokeStyle","strokeStyle","setGlobalAlpha","opacity","globalAlpha","setLineWidth","lineWidth","singlePixelExtent","x","setTextBaseline","baseline","textBaseline","Renderer","canvas","getContext","drawCount","One","copy","configuration","pushViewport","viewport","save","translate","width","height","scale","extent","y","point","screenToWorldCoordinates","sub","Zero","singlePixelExtentLength","length","popViewport","restore","set","withViewport","func","ctx","call","clear","clearRect","drawRectangle","vec","size","fillRect","drawDot","beginPath","arc","Math","PI","closePath","fill","drawLine","from","to","moveTo","lineTo","stroke","drawPolyline","vList","i","drawPlus","drawTextWorld","text","worldPoint","fillText","drawText","screenPoint","drawSystem","system","drawGrid","grid","doObstacles","_","each","obstacles","obstacle","drawObstacle","particles","p","drawParticle","drawSprings","springs","s","drawSpring","drawAABB","boundaries","numberOfNodes","arr","nIndex","n","floor","gsizeY","position","addSelf","Min","aabb","Max","radius","particle","dirLength","max","gridVelocity","add","normalizedCopy","mulFloat","material","colorScale","velocity","lengthSquared","spring","particle1","particle2","springColorScale","restLength","currentDistance","d3","linear","domain","range"],"mappings":"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","file":"renderer.js","sourcesContent":["import Vector2 from \"./../external/vector2.js\";\n\n\tvar Configuration = mini.Class.subclass({\n\t\tinitialize: function(renderer) {\n\t\t\tthis.renderer = renderer;\n\t\t},\n\t\t\n\t\t/*\n\t\t * Configure Drawing\n\t\t */\n\t\tsetFillStyle: function(color) {\n\t\t\tthis.color = color || \"white\";\n\t\t\tthis.renderer.context.fillStyle = this.color;\n\t\t},\n\t\t\n\t\tsetStrokeStyle: function(color) {\n\t\t\tthis.color = color || \"white\";\n\t\t\tthis.renderer.context.strokeStyle = this.color;\n\t\t},\n\t\t\n\t\tsetGlobalAlpha: function(opacity) {\n\t\t\tthis.opacity = opacity || 1.0;\n\t\t\tthis.renderer.context.globalAlpha = this.opacity;\n\t\t},\n\t\t\n\t\tsetLineWidth: function(lineWidth) {\n\t\t\tthis.lineWidth = this.renderer.singlePixelExtent.x * (lineWidth || 1.0);\n\t\t\tthis.renderer.context.lineWidth = this.lineWidth;\n\t\t},\n\t\t\n\t\tsetTextBaseline: function(baseline) {\n\t\t\tthis.baseline = baseline || \"bottom\";\n\t\t\tthis.renderer.context.textBaseline = this.baseline;\n\t\t}\n\t});\n\t\n\tvar Renderer = mini.Class.subclass({\n\t\t/*\n\t\t * Init\n\t\t */\n\t\tinitialize: function(canvas) {\n\t\t\tthis.canvas = canvas;\n\t\t\tthis.context = canvas.getContext('2d');\n\t\t\t\n\t\t\tthis.drawCount = 0;\n\t\t\t\n\t\t\t// set default pixel extent to allow setOptions\n\t\t\tthis.singlePixelExtent = Vector2.One.copy();\n\t\t\t\n\t\t\tthis.configuration = new Configuration(this);\n\t\t},\n\n\t\tpushViewport: function(viewport) {\n\t\t\t// create shortcuts\n\t\t\tvar context = this.context;\n\n\t\t\t// save current context for later restoration\n\t\t\tcontext.save();\n\n\t\t\t// create transformation matrix (note the inverse order):\n\t\t\t// move the coordinate system's origin to the middle of the canvas\n\t\t\tthis.context.translate(\n\t\t\t\tthis.canvas.width / 2,\n\t\t\t\tthis.canvas.height / 2\n\t\t\t);\n\t\t\t// rescale 1 by 1 box to canvas size\n\t\t\tthis.context.scale(\n\t\t\t\tthis.canvas.width,\n\t\t\t\tthis.canvas.height\n\t\t\t);\n\t\t\t// invert y-axis\n\t\t\tthis.context.scale(1, -1);\n\t\t\t// scale the current view into a 1 by 1 box\n\t\t\tthis.context.scale(\n\t\t\t\t1 / viewport.extent.x,\n\t\t\t\t1 / viewport.extent.y\n\t\t\t);\n\t\t\t// move current world camera point to the coordinate system's origin\n\t\t\tthis.context.translate(\n\t\t\t\t-viewport.point.x,\n\t\t\t\t-viewport.point.y\n\t\t\t);\n\t\t\t\n\t\t\tthis.singlePixelExtent = viewport.screenToWorldCoordinates(Vector2.One.copy()).sub(\n\t\t\t\tviewport.screenToWorldCoordinates(Vector2.Zero.copy())\n\t\t\t);\n\t\t\tthis.singlePixelExtentLength = this.singlePixelExtent.length();\n\t\t},\n\t\t\n\t\tpopViewport: function() {\n\t\t\t// restore saved context state to revert adding layer\n\t\t\tthis.context.restore();\n\t\t\tthis.singlePixelExtent.set(Vector2.One.copy());\n\t\t},\n\n\t\twithViewport: function(viewport, func, ctx) {\n\t\t\tthis.pushViewport(viewport);\n\t\t\tfunc.call(ctx);\n\t\t\tthis.popViewport();\n\t\t},\n\n\t\t/*\n\t\t * Drawing\n\t\t */\n\t\tclear: function() {\n\t\t\tthis.drawCount = 0;\n\n\t\t\tthis.context.clearRect(\n\t\t\t\t0,\n\t\t\t\t0, \n\t\t\t\tthis.canvas.width,\n\t\t\t\tthis.canvas.height\n\t\t\t);\n\t\t},\n\t\t\n\t\t/*\n\t\t * Graphical primitives\n\t\t */\n\t\tdrawRectangle: function(vec, size, color, opacity) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setFillStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\t\n\t\t\tsize = size || 2;\n\t\t\tthis.context.fillRect(\n\t\t\t\tvec.x - this.singlePixelExtent.x * size / 2,\n\t\t\t\tvec.y - this.singlePixelExtent.y * size / 2,\n\t\t\t\tthis.singlePixelExtent.x * size,\n\t\t\t\tthis.singlePixelExtent.y * size\n\t\t\t);\n\t\t},\n\t\n\t\tdrawDot: function(vec, size, color, opacity) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setFillStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\n\t\t\tsize = size || 2;\n\t\t\tthis.context.beginPath();\n\t\t\tthis.context.arc(\n\t\t\t\tvec.x,\n\t\t\t\tvec.y,\n\t\t\t\tthis.singlePixelExtent.x * size, // radius\n\t\t\t\t0,\n\t\t\t\t2 * Math.PI,\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis.context.closePath();\n\t\t\tthis.context.fill();\n\t\t},\n\t\t\n\t\tdrawLine: function(from, to, color, opacity, lineWidth) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setStrokeStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\tthis.configuration.setLineWidth(lineWidth);\n\n\t\t\t// draw a line\n\t\t\tthis.context.beginPath();\n\t\n\t\t\tthis.context.moveTo(from.x, from.y);\n\t\t\tthis.context.lineTo(to.x, to.y);\n\t\t\t\n\t\t\tthis.context.stroke();\n\t\t\t\n\t\t\tthis.context.closePath();\n\t\t},\n\n\t\tdrawPolyline: function(vList, color, opacity, lineWidth) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setStrokeStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\tthis.configuration.setLineWidth(lineWidth);\n\n\t\t\t// draw a polyline\n\t\t\tthis.context.beginPath();\n\t\n\t\t\tthis.context.moveTo(vList[0].x, vList[0].y);\n\t\t\tfor(var i = 1; i < vList.length; i++)\n\t\t\t\tthis.context.lineTo(vList[i].x, vList[i].y);\n\t\t\tthis.context.lineTo(vList[0].x, vList[0].y);\n\t\t\t\n\t\t\tthis.context.stroke();\n\t\t\t\n\t\t\tthis.context.closePath();\n\t\t},\n\n\t\tdrawPlus: function(point, size, color, opacity, lineWidth) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setStrokeStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\tthis.configuration.setLineWidth(lineWidth);\n\t\t\t\n\t\t\tsize = size || 3;\n\t\t\t\n\t\t\tthis.context.beginPath();\n\t\t\t\n\t\t\t// draw a polyline\n\t\t\tthis.context.moveTo(\n\t\t\t\tpoint.x - this.singlePixelExtent.x * size,\n\t\t\t\tpoint.y\n\t\t\t);\n\t\t\tthis.context.lineTo(\n\t\t\t\tpoint.x + this.singlePixelExtent.x * size,\n\t\t\t\tpoint.y\n\t\t\t);\n\t\t\tthis.context.moveTo(\n\t\t\t\tpoint.x,\n\t\t\t\tpoint.y - this.singlePixelExtent.y * size\n\t\t\t);\n\t\t\tthis.context.lineTo(\n\t\t\t\tpoint.x,\n\t\t\t\tpoint.y + this.singlePixelExtent.y * size\n\t\t\t);\n\t\n\t\t\tthis.context.stroke();\n\t\t\tthis.context.closePath();\n\t\t},\n\n\t\tdrawTextWorld: function(text, worldPoint, color, opacity, baseline) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setFillStyle(color);\n\t\t\tthis.configuration.setStrokeStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\tthis.configuration.setTextBaseline(baseline);\n\t\t\t\n\t\t\tthis.context.save();\n\n\t\t\tthis.context.translate(\n\t\t\t\tworldPoint.x,\n\t\t\t\tworldPoint.y\n\t\t\t);\n\t\t\tthis.context.scale(\n\t\t\t\tthis.singlePixelExtent.x,\n\t\t\t\tthis.singlePixelExtent.y\n\t\t\t);\n\t\t\tthis.context.fillText(\n\t\t\t\ttext,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t);\n\t\t\tthis.context.restore();\n\t\t},\n\n\t\tdrawText: function(text, screenPoint, color, opacity, baseline) {\n\t\t\tthis.drawCount++;\n\t\t\t\n\t\t\tthis.configuration.setFillStyle(color);\n\t\t\tthis.configuration.setStrokeStyle(color);\n\t\t\tthis.configuration.setGlobalAlpha(opacity);\n\t\t\tthis.configuration.setTextBaseline(baseline);\n\t\t\t\n\t\t\tthis.context.fillText(\n\t\t\t\ttext,\n\t\t\t\tscreenPoint.x,\n\t\t\t\tscreenPoint.y\n\t\t\t);\n\t\t},\n\n\t\t/*\n\t\t * Draw fluid system\n\t\t */\n\t\tdrawSystem: function(system) {\n\t\t\t// draw grid nodes\n\t\t\tif(system.drawGrid)\n\t\t\t\tthis.drawGrid(system.grid);\n\n\t\t\t// draw obstacles\n\t\t\tif(system.doObstacles) {\n\t\t\t\t_.each(system.obstacles, (obstacle) => {\n\t\t\t\t\tthis.drawObstacle(obstacle)\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\t// draw all particles in the system\n\t\t\t_.each(system.particles, (p) => {\n\t\t\t\tthis.drawParticle(p);\n\t\t\t});\n\t\t\t\n\t\t\t// draw all springs in the system\n\t\t\tif(system.drawSprings) {\n\t\t\t\t_.each(system.springs, (s) => {\n\t\t\t\t\tthis.drawSpring(s);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawGrid: function(grid) {\n\t\t\t// draw boundaries\n\t\t\tthis.drawAABB(grid.boundaries);\n\n\t\t\t// draw grid nodes\n\t\t\tvar numberOfNodes = grid.arr.length;\n\t\t\tfor(var nIndex = 0; nIndex < numberOfNodes; nIndex++) {\n\t\t\t\tvar n = grid.arr[nIndex];\n\t\t\t\tvar x = Math.floor(nIndex / grid.gsizeY);\n\t\t\t\tvar y = nIndex - (x * grid.gsizeY);\n\n\t\t\t\tif (n) {\n\t\t\t\t\tvar position = new Vector2(x,y);\n\t\t\t\t\tposition.addSelf(grid.boundaries.Min);\n\t\t\t\t\tthis.drawDot(position, 1, \"red\", 0.5);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawAABB: function(aabb) {\n\t\t\tthis.drawPolyline([\n\t\t\t\t\taabb.Min,\n\t\t\t\t\tnew Vector2(aabb.Min.x, aabb.Max.y),\n\t\t\t\t\taabb.Max,\n\t\t\t\t\tnew Vector2(aabb.Max.x, aabb.Min.y),\n\t\t\t\t\taabb.Min\n\t\t\t\t],\n\t\t\t\t\"red\",\n\t\t\t\t1.0,\n\t\t\t\t1\n\t\t\t);\n\t\t},\n\t\tdrawObstacle: function(obstacle) {\n\t\t\tthis.drawDot(obstacle.position, obstacle.radius, \"pink\", 0.8);\n\t\t},\n\t\tdrawParticle: function(particle) {\n\t\t\t// ensure that a particle is visible even at low velocity\n\t\t\tvar dirLength = Math.max(this.singlePixelExtentLength, particle.gridVelocity.length());\n\n\t\t\tthis.drawLine(\n\t\t\t\tparticle.position,\n\t\t\t\tparticle.position.add(particle.gridVelocity.normalizedCopy().mulFloat(dirLength)),\n\t\t\t\tparticle.material.colorScale(particle.velocity.lengthSquared()),\n\t\t\t\t1.0,\n\t\t\t\t1\n\t\t\t);\n\t\t},\n\t\tdrawSpring: function(spring) {\n\t\t\tthis.drawLine(\n\t\t\t\tspring.particle1.position,\n\t\t\t\tspring.particle2.position,\n\t\t\t\tRenderer.springColorScale(spring.restLength - spring.currentDistance),\n\t\t\t\t1.0,\n\t\t\t\t1\n\t\t\t);\n\t\t}\n\t});\n\t\n\tRenderer.springColorScale = d3.scale.linear()\n\t\t.domain([-3,3])\n\t\t.range([\"#ff0000\", \"#0000ff\"]);\n\t\n\t\n\texport default Renderer;\n"]}