{
  "version": 3,
  "sources": ["../../../../../src/lib/ui/components/Minimap/minimap-webgl-setup.ts"],
  "sourcesContent": ["import { roundedRectangleDataSize } from './minimap-webgl-shapes'\n\nexport function setupWebGl(canvas: HTMLCanvasElement | null) {\n\tif (!canvas) throw new Error('Canvas element not found')\n\n\tconst context = canvas.getContext('webgl2', {\n\t\tpremultipliedAlpha: false,\n\t})\n\tif (!context) throw new Error('Failed to get webgl2 context')\n\n\tconst vertexShaderSourceCode = `#version 300 es\n  precision mediump float;\n  \n  in vec2 shapeVertexPosition;\n\n\tuniform vec4 canvasPageBounds;\n\n\t// taken (with thanks) from\n\t// https://webglfundamentals.org/webgl/lessons/webgl-2d-matrices.html\n  void main() {\n\t\t// convert the position from pixels to 0.0 to 1.0\n\t\tvec2 zeroToOne = (shapeVertexPosition - canvasPageBounds.xy) / canvasPageBounds.zw;\n\t\n\t\t// convert from 0->1 to 0->2\n\t\tvec2 zeroToTwo = zeroToOne * 2.0;\n\t\n\t\t// convert from 0->2 to -1->+1 (clipspace)\n\t\tvec2 clipSpace = zeroToTwo - 1.0;\n\t\n\t\tgl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\n  }`\n\n\tconst vertexShader = context.createShader(context.VERTEX_SHADER)\n\tif (!vertexShader) {\n\t\tthrow new Error('Failed to create vertex shader')\n\t}\n\tcontext.shaderSource(vertexShader, vertexShaderSourceCode)\n\tcontext.compileShader(vertexShader)\n\tif (!context.getShaderParameter(vertexShader, context.COMPILE_STATUS)) {\n\t\tthrow new Error('Failed to compile vertex shader')\n\t}\n\n\tconst fragmentShaderSourceCode = `#version 300 es\n  precision mediump float;\n  \n\tuniform vec4 fillColor;\n  out vec4 outputColor;\n\n  void main() {\n\toutputColor = fillColor;\n  }`\n\n\tconst fragmentShader = context.createShader(context.FRAGMENT_SHADER)\n\tif (!fragmentShader) {\n\t\tthrow new Error('Failed to create fragment shader')\n\t}\n\tcontext.shaderSource(fragmentShader, fragmentShaderSourceCode)\n\tcontext.compileShader(fragmentShader)\n\tif (!context.getShaderParameter(fragmentShader, context.COMPILE_STATUS)) {\n\t\tthrow new Error('Failed to compile fragment shader')\n\t}\n\n\tconst program = context.createProgram()\n\tif (!program) {\n\t\tthrow new Error('Failed to create program')\n\t}\n\tcontext.attachShader(program, vertexShader)\n\tcontext.attachShader(program, fragmentShader)\n\tcontext.linkProgram(program)\n\tif (!context.getProgramParameter(program, context.LINK_STATUS)) {\n\t\tthrow new Error('Failed to link program')\n\t}\n\tcontext.useProgram(program)\n\n\tconst shapeVertexPositionAttributeLocation = context.getAttribLocation(\n\t\tprogram,\n\t\t'shapeVertexPosition'\n\t)\n\tif (shapeVertexPositionAttributeLocation < 0) {\n\t\tthrow new Error('Failed to get shapeVertexPosition attribute location')\n\t}\n\tcontext.enableVertexAttribArray(shapeVertexPositionAttributeLocation)\n\n\tconst canvasPageBoundsLocation = context.getUniformLocation(program, 'canvasPageBounds')\n\tconst fillColorLocation = context.getUniformLocation(program, 'fillColor')\n\n\tconst selectedShapesBuffer = context.createBuffer()\n\tif (!selectedShapesBuffer) throw new Error('Failed to create buffer')\n\n\tconst unselectedShapesBuffer = context.createBuffer()\n\tif (!unselectedShapesBuffer) throw new Error('Failed to create buffer')\n\n\treturn {\n\t\tcontext,\n\t\tselectedShapes: allocateBuffer(context, 1024),\n\t\tunselectedShapes: allocateBuffer(context, 4096),\n\t\tviewport: allocateBuffer(context, roundedRectangleDataSize),\n\t\tcollaborators: allocateBuffer(context, 1024),\n\n\t\tprepareTriangles(stuff: BufferStuff, len: number) {\n\t\t\tcontext.bindBuffer(context.ARRAY_BUFFER, stuff.buffer)\n\t\t\tcontext.bufferData(context.ARRAY_BUFFER, stuff.vertices, context.STATIC_DRAW, 0, len)\n\t\t\tcontext.enableVertexAttribArray(shapeVertexPositionAttributeLocation)\n\t\t\tcontext.vertexAttribPointer(\n\t\t\t\tshapeVertexPositionAttributeLocation,\n\t\t\t\t2,\n\t\t\t\tcontext.FLOAT,\n\t\t\t\tfalse,\n\t\t\t\t0,\n\t\t\t\t0\n\t\t\t)\n\t\t},\n\n\t\tdrawTrianglesTransparently(len: number) {\n\t\t\tcontext.enable(context.BLEND)\n\t\t\tcontext.blendFunc(context.SRC_ALPHA, context.ONE_MINUS_SRC_ALPHA)\n\t\t\tcontext.drawArrays(context.TRIANGLES, 0, len / 2)\n\t\t\tcontext.disable(context.BLEND)\n\t\t},\n\n\t\tdrawTriangles(len: number) {\n\t\t\tcontext.drawArrays(context.TRIANGLES, 0, len / 2)\n\t\t},\n\n\t\tsetFillColor(color: Float32Array) {\n\t\t\tcontext.uniform4fv(fillColorLocation, color)\n\t\t},\n\n\t\tsetCanvasPageBounds(bounds: Float32Array) {\n\t\t\tcontext.uniform4fv(canvasPageBoundsLocation, bounds)\n\t\t},\n\t}\n}\n\nexport type BufferStuff = ReturnType<typeof allocateBuffer>\n\nfunction allocateBuffer(context: WebGL2RenderingContext, size: number) {\n\tconst buffer = context.createBuffer()\n\tif (!buffer) throw new Error('Failed to create buffer')\n\treturn { buffer, vertices: new Float32Array(size) }\n}\n\nexport function appendVertices(bufferStuff: BufferStuff, offset: number, data: Float32Array) {\n\tlet len = bufferStuff.vertices.length\n\twhile (len < offset + data.length) {\n\t\tlen *= 2\n\t}\n\tif (len != bufferStuff.vertices.length) {\n\t\tconst newVertices = new Float32Array(len)\n\t\tnewVertices.set(bufferStuff.vertices)\n\t\tbufferStuff.vertices = newVertices\n\t}\n\n\tbufferStuff.vertices.set(data, offset)\n}\n"],
  "mappings": "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",
  "names": []
}
