{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%gui qt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n# Draw a bunch of lines\n\nThis example demonstrates how multiple line-pieces can be drawn\nusing one call, by discarding some fragments.\n\nNote that this example uses canvas.context.X() to call gloo functions.\nThese functions are also available as vispy.gloo.X(), but apply\nexplicitly to the canvas.\n\nMouse wheel allows zooming in on the lines. Spacebar controls a timer\nthat triggers rotation of the lines in 3D space.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\nfrom vispy import gloo\nfrom vispy import app\nfrom vispy.util.transforms import perspective, translate, rotate\n\nW, H = 400, 400\n\n# Create vertices\nn = 100\na_position = np.random.uniform(-1, 1, (n, 3)).astype(np.float32)\na_id = np.random.randint(0, 30, (n, 1))\na_id = np.sort(a_id, axis=0).astype(np.float32)\n\n\nVERT_SHADER = \"\"\"\nuniform mat4 u_model;\nuniform mat4 u_view;\nuniform mat4 u_projection;\nattribute vec3 a_position;\nattribute float a_id;\nvarying float v_id;\nvoid main (void) {\n v_id = a_id;\n gl_Position = u_projection * u_view * u_model * vec4(a_position,1.0);\n}\n\"\"\"\n\nFRAG_SHADER = \"\"\"\nvarying float v_id;\nvoid main()\n{\n float f = fract(v_id);\n // The second useless test is needed on OSX 10.8\n if( (f > 0.0001) && (f < .9999) )\n discard;\n else\n gl_FragColor = vec4(0,0,0,1);\n}\n\"\"\"\n\n\nclass Canvas(app.Canvas):\n\n # ---------------------------------\n def __init__(self):\n app.Canvas.__init__(self, keys='interactive', size=(W, H))\n\n self.program = gloo.Program(VERT_SHADER, FRAG_SHADER)\n\n # Set uniform and attribute\n self.program['a_id'] = gloo.VertexBuffer(a_id)\n self.program['a_position'] = gloo.VertexBuffer(a_position)\n\n self.translate = 5\n self.view = translate((0, 0, -self.translate), dtype=np.float32)\n self.model = np.eye(4, dtype=np.float32)\n\n gloo.set_viewport(0, 0, self.physical_size[0], self.physical_size[1])\n self.projection = perspective(45.0, self.size[0] /\n float(self.size[1]), 1.0, 1000.0)\n self.program['u_projection'] = self.projection\n\n self.program['u_model'] = self.model\n self.program['u_view'] = self.view\n\n self.theta = 0\n self.phi = 0\n\n self.context.set_clear_color('white')\n self.context.set_state('translucent')\n\n self.timer = app.Timer('auto', connect=self.on_timer, start=True)\n\n self.show()\n\n # ---------------------------------\n def on_key_press(self, event):\n if event.text == ' ':\n if self.timer.running:\n self.timer.stop()\n else:\n self.timer.start()\n\n # ---------------------------------\n def on_timer(self, event):\n self.theta += .5\n self.phi += .5\n self.model = np.dot(rotate(self.theta, (0, 0, 1)),\n rotate(self.phi, (0, 1, 0)))\n self.program['u_model'] = self.model\n self.update()\n\n # ---------------------------------\n def on_resize(self, event):\n gloo.set_viewport(0, 0, event.physical_size[0], event.physical_size[1])\n self.projection = perspective(45.0, event.size[0] /\n float(event.size[1]), 1.0, 1000.0)\n self.program['u_projection'] = self.projection\n\n # ---------------------------------\n def on_mouse_wheel(self, event):\n self.translate += event.delta[1]\n self.translate = max(2, self.translate)\n self.view = translate((0, 0, -self.translate))\n self.program['u_view'] = self.view\n self.update()\n\n # ---------------------------------\n def on_draw(self, event):\n self.context.clear()\n self.program.draw('line_strip')\n\n\nif __name__ == '__main__':\n canvas = Canvas()\n app.run()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.19" } }, "nbformat": 4, "nbformat_minor": 0 }