From c01b254c1622ce87a7f11f251c1f4d19736ef911 Mon Sep 17 00:00:00 2001 From: headchant Date: Fri, 25 May 2012 12:29:37 +0200 Subject: [PATCH] thinned out the library, removed the lib part, which wasn't used anyway --- LICK/lib/color.lua | 742 ------------------ LICK/lib/docs/classes/Circle.html | 1 - LICK/lib/docs/classes/Drawable.html | 1 - LICK/lib/docs/classes/Image.html | 1 - LICK/lib/docs/classes/Line.html | 1 - LICK/lib/docs/classes/Object.html | 1 - LICK/lib/docs/classes/Point.html | 1 - LICK/lib/docs/classes/Polygon.html | 1 - LICK/lib/docs/classes/Rect.html | 1 - LICK/lib/docs/classes/SCObject.html | 1 - LICK/lib/docs/classes/SCSynth.html | 1 - LICK/lib/docs/classes/Sequencer.html | 1 - LICK/lib/docs/classes/Text.html | 1 - LICK/lib/docs/classes/Triangle.html | 1 - LICK/lib/docs/guidelines.html | 70 -- LICK/lib/docs/guidelines.txt | 51 -- LICK/lib/docs/index.html | 1 - LICK/lib/help.lua | 112 --- LICK/lib/hlpr.lua | 350 --------- LICK/lib/hump/README.md | 48 -- LICK/lib/hump/camera.lua | 90 --- LICK/lib/hump/class.lua | 82 -- LICK/lib/hump/gamestate.lua | 154 ---- LICK/lib/hump/ringbuffer.lua | 99 --- LICK/lib/hump/timer.lua | 83 -- LICK/lib/hump/vector.lua | 156 ---- LICK/lib/images/circle.png | Bin 3033 -> 0 bytes LICK/lib/images/cloud.png | Bin 4080 -> 0 bytes LICK/lib/images/cross.png | Bin 1561 -> 0 bytes LICK/lib/images/dots.png | Bin 8430 -> 0 bytes LICK/lib/images/holger.png | Bin 9945 -> 0 bytes LICK/lib/images/smoke.png | Bin 10866 -> 0 bytes LICK/lib/images/spiral1.png | Bin 6705 -> 0 bytes LICK/lib/images/spiral2.png | Bin 17174 -> 0 bytes LICK/lib/images/star.png | Bin 3071 -> 0 bytes LICK/lib/images/sun.png | Bin 7996 -> 0 bytes LICK/lib/init.lua | 4 - LICK/lib/loveosc/README | 8 - LICK/lib/loveosc/client.lua | 341 -------- LICK/lib/loveosc/init.lua | 3 - LICK/lib/loveosc/server.lua | 81 -- LICK/lib/loveosc/vstruct/CHANGES | 30 - LICK/lib/loveosc/vstruct/COPYING | 19 - LICK/lib/loveosc/vstruct/README | 290 ------- LICK/lib/loveosc/vstruct/common.lua | 48 -- LICK/lib/loveosc/vstruct/compile.lua | 134 ---- LICK/lib/loveosc/vstruct/cursor.lua | 80 -- LICK/lib/loveosc/vstruct/fp.lua | 121 --- LICK/lib/loveosc/vstruct/gen_pack.lua | 132 ---- LICK/lib/loveosc/vstruct/gen_unpack.lua | 117 --- LICK/lib/loveosc/vstruct/init.lua | 94 --- LICK/lib/loveosc/vstruct/io_pack.lua | 127 --- LICK/lib/loveosc/vstruct/io_unpack.lua | 165 ---- LICK/lib/loveosc/vstruct/lexer.lua | 54 -- LICK/lib/loveosc/vstruct/parser.lua | 35 - LICK/lib/object.lua | 506 ------------ README | 12 - README.md | 12 + examples/empty_template/LICK/init.lua | 3 - examples/empty_template/LICK/lib/color.lua | 742 ------------------ .../LICK/lib/docs/classes/Circle.html | 1 - .../LICK/lib/docs/classes/Drawable.html | 1 - .../LICK/lib/docs/classes/Line.html | 1 - .../LICK/lib/docs/classes/Object.html | 1 - .../LICK/lib/docs/classes/SCObject.html | 1 - .../LICK/lib/docs/classes/SCSynth.html | 1 - .../LICK/lib/docs/guidelines.html | 70 -- .../LICK/lib/docs/guidelines.txt | 51 -- .../empty_template/LICK/lib/docs/index.html | 1 - examples/empty_template/LICK/lib/help.lua | 109 --- examples/empty_template/LICK/lib/hlpr.lua | 350 --------- .../empty_template/LICK/lib/hump/README.md | 48 -- .../empty_template/LICK/lib/hump/camera.lua | 90 --- .../empty_template/LICK/lib/hump/class.lua | 82 -- .../LICK/lib/hump/gamestate.lua | 154 ---- .../LICK/lib/hump/ringbuffer.lua | 99 --- .../empty_template/LICK/lib/hump/timer.lua | 83 -- .../empty_template/LICK/lib/hump/vector.lua | 156 ---- .../empty_template/LICK/lib/images/circle.png | Bin 3033 -> 0 bytes .../empty_template/LICK/lib/images/cloud.png | Bin 4080 -> 0 bytes .../empty_template/LICK/lib/images/cross.png | Bin 1561 -> 0 bytes .../empty_template/LICK/lib/images/dots.png | Bin 8430 -> 0 bytes .../empty_template/LICK/lib/images/holger.png | Bin 9945 -> 0 bytes .../empty_template/LICK/lib/images/smoke.png | Bin 10866 -> 0 bytes .../LICK/lib/images/spiral1.png | Bin 6705 -> 0 bytes .../LICK/lib/images/spiral2.png | Bin 17174 -> 0 bytes .../empty_template/LICK/lib/images/star.png | Bin 3071 -> 0 bytes .../empty_template/LICK/lib/images/sun.png | Bin 7996 -> 0 bytes examples/empty_template/LICK/lib/init.lua | 4 - .../empty_template/LICK/lib/loveosc/README | 8 - .../LICK/lib/loveosc/client.lua | 340 -------- .../empty_template/LICK/lib/loveosc/init.lua | 3 - .../LICK/lib/loveosc/server.lua | 81 -- .../LICK/lib/loveosc/vstruct/CHANGES | 30 - .../LICK/lib/loveosc/vstruct/COPYING | 19 - .../LICK/lib/loveosc/vstruct/README | 290 ------- .../LICK/lib/loveosc/vstruct/common.lua | 48 -- .../LICK/lib/loveosc/vstruct/compile.lua | 134 ---- .../LICK/lib/loveosc/vstruct/cursor.lua | 80 -- .../LICK/lib/loveosc/vstruct/fp.lua | 121 --- .../LICK/lib/loveosc/vstruct/gen_pack.lua | 132 ---- .../LICK/lib/loveosc/vstruct/gen_unpack.lua | 117 --- .../LICK/lib/loveosc/vstruct/init.lua | 94 --- .../LICK/lib/loveosc/vstruct/io_pack.lua | 127 --- .../LICK/lib/loveosc/vstruct/io_unpack.lua | 165 ---- .../LICK/lib/loveosc/vstruct/lexer.lua | 54 -- .../LICK/lib/loveosc/vstruct/parser.lua | 35 - examples/empty_template/LICK/lib/object.lua | 282 ------- examples/empty_template/LICK/lick.lua | 127 --- examples/empty_template/conf.lua | 21 - examples/empty_template/main.lua | 12 - examples/lissajous/LICK/init.lua | 3 - examples/lissajous/LICK/lib/color.lua | 742 ------------------ .../LICK/lib/docs/classes/Circle.html | 1 - .../LICK/lib/docs/classes/Drawable.html | 1 - .../lissajous/LICK/lib/docs/classes/Line.html | 1 - .../LICK/lib/docs/classes/Object.html | 1 - .../LICK/lib/docs/classes/SCObject.html | 1 - .../LICK/lib/docs/classes/SCSynth.html | 1 - .../lissajous/LICK/lib/docs/guidelines.html | 70 -- .../lissajous/LICK/lib/docs/guidelines.txt | 51 -- examples/lissajous/LICK/lib/docs/index.html | 1 - examples/lissajous/LICK/lib/help.lua | 109 --- examples/lissajous/LICK/lib/hlpr.lua | 350 --------- examples/lissajous/LICK/lib/hump/README.md | 48 -- examples/lissajous/LICK/lib/hump/camera.lua | 90 --- examples/lissajous/LICK/lib/hump/class.lua | 82 -- .../lissajous/LICK/lib/hump/gamestate.lua | 154 ---- .../lissajous/LICK/lib/hump/ringbuffer.lua | 99 --- examples/lissajous/LICK/lib/hump/timer.lua | 83 -- examples/lissajous/LICK/lib/hump/vector.lua | 156 ---- examples/lissajous/LICK/lib/images/circle.png | Bin 3033 -> 0 bytes examples/lissajous/LICK/lib/images/cloud.png | Bin 4080 -> 0 bytes examples/lissajous/LICK/lib/images/cross.png | Bin 1561 -> 0 bytes examples/lissajous/LICK/lib/images/dots.png | Bin 8430 -> 0 bytes examples/lissajous/LICK/lib/images/holger.png | Bin 9945 -> 0 bytes examples/lissajous/LICK/lib/images/smoke.png | Bin 10866 -> 0 bytes .../lissajous/LICK/lib/images/spiral1.png | Bin 6705 -> 0 bytes .../lissajous/LICK/lib/images/spiral2.png | Bin 17174 -> 0 bytes examples/lissajous/LICK/lib/images/star.png | Bin 3071 -> 0 bytes examples/lissajous/LICK/lib/images/sun.png | Bin 7996 -> 0 bytes examples/lissajous/LICK/lib/init.lua | 4 - examples/lissajous/LICK/lib/loveosc/README | 8 - .../lissajous/LICK/lib/loveosc/client.lua | 340 -------- examples/lissajous/LICK/lib/loveosc/init.lua | 3 - .../lissajous/LICK/lib/loveosc/server.lua | 81 -- .../LICK/lib/loveosc/vstruct/CHANGES | 30 - .../LICK/lib/loveosc/vstruct/COPYING | 19 - .../lissajous/LICK/lib/loveosc/vstruct/README | 290 ------- .../LICK/lib/loveosc/vstruct/common.lua | 48 -- .../LICK/lib/loveosc/vstruct/compile.lua | 134 ---- .../LICK/lib/loveosc/vstruct/cursor.lua | 80 -- .../lissajous/LICK/lib/loveosc/vstruct/fp.lua | 121 --- .../LICK/lib/loveosc/vstruct/gen_pack.lua | 132 ---- .../LICK/lib/loveosc/vstruct/gen_unpack.lua | 117 --- .../LICK/lib/loveosc/vstruct/init.lua | 94 --- .../LICK/lib/loveosc/vstruct/io_pack.lua | 127 --- .../LICK/lib/loveosc/vstruct/io_unpack.lua | 165 ---- .../LICK/lib/loveosc/vstruct/lexer.lua | 54 -- .../LICK/lib/loveosc/vstruct/parser.lua | 35 - examples/lissajous/LICK/lib/object.lua | 282 ------- examples/lissajous/LICK/lick.lua | 127 --- examples/lissajous/conf.lua | 21 - examples/lissajous/main.lua | 56 -- examples/rotate/LICK/init.lua | 3 - examples/rotate/LICK/lib/color.lua | 742 ------------------ .../rotate/LICK/lib/docs/classes/Circle.html | 1 - .../LICK/lib/docs/classes/Drawable.html | 1 - .../rotate/LICK/lib/docs/classes/Line.html | 1 - .../rotate/LICK/lib/docs/classes/Object.html | 1 - .../LICK/lib/docs/classes/SCObject.html | 1 - .../rotate/LICK/lib/docs/classes/SCSynth.html | 1 - examples/rotate/LICK/lib/docs/guidelines.html | 70 -- examples/rotate/LICK/lib/docs/guidelines.txt | 51 -- examples/rotate/LICK/lib/docs/index.html | 1 - examples/rotate/LICK/lib/help.lua | 109 --- examples/rotate/LICK/lib/hlpr.lua | 350 --------- examples/rotate/LICK/lib/hump/README.md | 48 -- examples/rotate/LICK/lib/hump/camera.lua | 90 --- examples/rotate/LICK/lib/hump/class.lua | 82 -- examples/rotate/LICK/lib/hump/gamestate.lua | 154 ---- examples/rotate/LICK/lib/hump/ringbuffer.lua | 99 --- examples/rotate/LICK/lib/hump/timer.lua | 83 -- examples/rotate/LICK/lib/hump/vector.lua | 156 ---- examples/rotate/LICK/lib/images/circle.png | Bin 3033 -> 0 bytes examples/rotate/LICK/lib/images/cloud.png | Bin 4080 -> 0 bytes examples/rotate/LICK/lib/images/cross.png | Bin 1561 -> 0 bytes examples/rotate/LICK/lib/images/dots.png | Bin 8430 -> 0 bytes examples/rotate/LICK/lib/images/holger.png | Bin 9945 -> 0 bytes examples/rotate/LICK/lib/images/smoke.png | Bin 10866 -> 0 bytes examples/rotate/LICK/lib/images/spiral1.png | Bin 6705 -> 0 bytes examples/rotate/LICK/lib/images/spiral2.png | Bin 17174 -> 0 bytes examples/rotate/LICK/lib/images/star.png | Bin 3071 -> 0 bytes examples/rotate/LICK/lib/images/sun.png | Bin 7996 -> 0 bytes examples/rotate/LICK/lib/init.lua | 4 - examples/rotate/LICK/lib/loveosc/README | 8 - examples/rotate/LICK/lib/loveosc/client.lua | 340 -------- examples/rotate/LICK/lib/loveosc/init.lua | 3 - examples/rotate/LICK/lib/loveosc/server.lua | 81 -- .../rotate/LICK/lib/loveosc/vstruct/CHANGES | 30 - .../rotate/LICK/lib/loveosc/vstruct/COPYING | 19 - .../rotate/LICK/lib/loveosc/vstruct/README | 290 ------- .../LICK/lib/loveosc/vstruct/common.lua | 48 -- .../LICK/lib/loveosc/vstruct/compile.lua | 134 ---- .../LICK/lib/loveosc/vstruct/cursor.lua | 80 -- .../rotate/LICK/lib/loveosc/vstruct/fp.lua | 121 --- .../LICK/lib/loveosc/vstruct/gen_pack.lua | 132 ---- .../LICK/lib/loveosc/vstruct/gen_unpack.lua | 117 --- .../rotate/LICK/lib/loveosc/vstruct/init.lua | 94 --- .../LICK/lib/loveosc/vstruct/io_pack.lua | 127 --- .../LICK/lib/loveosc/vstruct/io_unpack.lua | 165 ---- .../rotate/LICK/lib/loveosc/vstruct/lexer.lua | 54 -- .../LICK/lib/loveosc/vstruct/parser.lua | 35 - examples/rotate/LICK/lib/object.lua | 282 ------- examples/rotate/LICK/lick.lua | 127 --- examples/rotate/conf.lua | 21 - examples/rotate/main.lua | 26 - 217 files changed, 12 insertions(+), 17614 deletions(-) delete mode 100644 LICK/lib/color.lua delete mode 100644 LICK/lib/docs/classes/Circle.html delete mode 100644 LICK/lib/docs/classes/Drawable.html delete mode 100644 LICK/lib/docs/classes/Image.html delete mode 100644 LICK/lib/docs/classes/Line.html delete mode 100644 LICK/lib/docs/classes/Object.html delete mode 100644 LICK/lib/docs/classes/Point.html delete mode 100644 LICK/lib/docs/classes/Polygon.html delete mode 100644 LICK/lib/docs/classes/Rect.html delete mode 100644 LICK/lib/docs/classes/SCObject.html delete mode 100644 LICK/lib/docs/classes/SCSynth.html delete mode 100644 LICK/lib/docs/classes/Sequencer.html delete mode 100644 LICK/lib/docs/classes/Text.html delete mode 100644 LICK/lib/docs/classes/Triangle.html delete mode 100644 LICK/lib/docs/guidelines.html delete mode 100644 LICK/lib/docs/guidelines.txt delete mode 100644 LICK/lib/docs/index.html delete mode 100644 LICK/lib/help.lua delete mode 100644 LICK/lib/hlpr.lua delete mode 100644 LICK/lib/hump/README.md delete mode 100644 LICK/lib/hump/camera.lua delete mode 100644 LICK/lib/hump/class.lua delete mode 100644 LICK/lib/hump/gamestate.lua delete mode 100644 LICK/lib/hump/ringbuffer.lua delete mode 100644 LICK/lib/hump/timer.lua delete mode 100644 LICK/lib/hump/vector.lua delete mode 100755 LICK/lib/images/circle.png delete mode 100755 LICK/lib/images/cloud.png delete mode 100755 LICK/lib/images/cross.png delete mode 100755 LICK/lib/images/dots.png delete mode 100755 LICK/lib/images/holger.png delete mode 100755 LICK/lib/images/smoke.png delete mode 100755 LICK/lib/images/spiral1.png delete mode 100755 LICK/lib/images/spiral2.png delete mode 100755 LICK/lib/images/star.png delete mode 100755 LICK/lib/images/sun.png delete mode 100644 LICK/lib/init.lua delete mode 100644 LICK/lib/loveosc/README delete mode 100644 LICK/lib/loveosc/client.lua delete mode 100644 LICK/lib/loveosc/init.lua delete mode 100644 LICK/lib/loveosc/server.lua delete mode 100755 LICK/lib/loveosc/vstruct/CHANGES delete mode 100755 LICK/lib/loveosc/vstruct/COPYING delete mode 100755 LICK/lib/loveosc/vstruct/README delete mode 100755 LICK/lib/loveosc/vstruct/common.lua delete mode 100755 LICK/lib/loveosc/vstruct/compile.lua delete mode 100755 LICK/lib/loveosc/vstruct/cursor.lua delete mode 100755 LICK/lib/loveosc/vstruct/fp.lua delete mode 100755 LICK/lib/loveosc/vstruct/gen_pack.lua delete mode 100755 LICK/lib/loveosc/vstruct/gen_unpack.lua delete mode 100755 LICK/lib/loveosc/vstruct/init.lua delete mode 100755 LICK/lib/loveosc/vstruct/io_pack.lua delete mode 100755 LICK/lib/loveosc/vstruct/io_unpack.lua delete mode 100755 LICK/lib/loveosc/vstruct/lexer.lua delete mode 100755 LICK/lib/loveosc/vstruct/parser.lua delete mode 100644 LICK/lib/object.lua delete mode 100644 README create mode 100644 README.md delete mode 100644 examples/empty_template/LICK/init.lua delete mode 100644 examples/empty_template/LICK/lib/color.lua delete mode 100644 examples/empty_template/LICK/lib/docs/classes/Circle.html delete mode 100644 examples/empty_template/LICK/lib/docs/classes/Drawable.html delete mode 100644 examples/empty_template/LICK/lib/docs/classes/Line.html delete mode 100644 examples/empty_template/LICK/lib/docs/classes/Object.html delete mode 100644 examples/empty_template/LICK/lib/docs/classes/SCObject.html delete mode 100644 examples/empty_template/LICK/lib/docs/classes/SCSynth.html delete mode 100644 examples/empty_template/LICK/lib/docs/guidelines.html delete mode 100644 examples/empty_template/LICK/lib/docs/guidelines.txt delete mode 100644 examples/empty_template/LICK/lib/docs/index.html delete mode 100644 examples/empty_template/LICK/lib/help.lua delete mode 100644 examples/empty_template/LICK/lib/hlpr.lua delete mode 100644 examples/empty_template/LICK/lib/hump/README.md delete mode 100644 examples/empty_template/LICK/lib/hump/camera.lua delete mode 100644 examples/empty_template/LICK/lib/hump/class.lua delete mode 100644 examples/empty_template/LICK/lib/hump/gamestate.lua delete mode 100644 examples/empty_template/LICK/lib/hump/ringbuffer.lua delete mode 100644 examples/empty_template/LICK/lib/hump/timer.lua delete mode 100644 examples/empty_template/LICK/lib/hump/vector.lua delete mode 100755 examples/empty_template/LICK/lib/images/circle.png delete mode 100755 examples/empty_template/LICK/lib/images/cloud.png delete mode 100755 examples/empty_template/LICK/lib/images/cross.png delete mode 100755 examples/empty_template/LICK/lib/images/dots.png delete mode 100755 examples/empty_template/LICK/lib/images/holger.png delete mode 100755 examples/empty_template/LICK/lib/images/smoke.png delete mode 100755 examples/empty_template/LICK/lib/images/spiral1.png delete mode 100755 examples/empty_template/LICK/lib/images/spiral2.png delete mode 100755 examples/empty_template/LICK/lib/images/star.png delete mode 100755 examples/empty_template/LICK/lib/images/sun.png delete mode 100644 examples/empty_template/LICK/lib/init.lua delete mode 100644 examples/empty_template/LICK/lib/loveosc/README delete mode 100644 examples/empty_template/LICK/lib/loveosc/client.lua delete mode 100644 examples/empty_template/LICK/lib/loveosc/init.lua delete mode 100644 examples/empty_template/LICK/lib/loveosc/server.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/CHANGES delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/COPYING delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/README delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/common.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/compile.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/cursor.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/fp.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/gen_pack.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/gen_unpack.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/init.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/io_pack.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/io_unpack.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/lexer.lua delete mode 100755 examples/empty_template/LICK/lib/loveosc/vstruct/parser.lua delete mode 100644 examples/empty_template/LICK/lib/object.lua delete mode 100644 examples/empty_template/LICK/lick.lua delete mode 100644 examples/empty_template/conf.lua delete mode 100644 examples/empty_template/main.lua delete mode 100644 examples/lissajous/LICK/init.lua delete mode 100644 examples/lissajous/LICK/lib/color.lua delete mode 100644 examples/lissajous/LICK/lib/docs/classes/Circle.html delete mode 100644 examples/lissajous/LICK/lib/docs/classes/Drawable.html delete mode 100644 examples/lissajous/LICK/lib/docs/classes/Line.html delete mode 100644 examples/lissajous/LICK/lib/docs/classes/Object.html delete mode 100644 examples/lissajous/LICK/lib/docs/classes/SCObject.html delete mode 100644 examples/lissajous/LICK/lib/docs/classes/SCSynth.html delete mode 100644 examples/lissajous/LICK/lib/docs/guidelines.html delete mode 100644 examples/lissajous/LICK/lib/docs/guidelines.txt delete mode 100644 examples/lissajous/LICK/lib/docs/index.html delete mode 100644 examples/lissajous/LICK/lib/help.lua delete mode 100644 examples/lissajous/LICK/lib/hlpr.lua delete mode 100644 examples/lissajous/LICK/lib/hump/README.md delete mode 100644 examples/lissajous/LICK/lib/hump/camera.lua delete mode 100644 examples/lissajous/LICK/lib/hump/class.lua delete mode 100644 examples/lissajous/LICK/lib/hump/gamestate.lua delete mode 100644 examples/lissajous/LICK/lib/hump/ringbuffer.lua delete mode 100644 examples/lissajous/LICK/lib/hump/timer.lua delete mode 100644 examples/lissajous/LICK/lib/hump/vector.lua delete mode 100755 examples/lissajous/LICK/lib/images/circle.png delete mode 100755 examples/lissajous/LICK/lib/images/cloud.png delete mode 100755 examples/lissajous/LICK/lib/images/cross.png delete mode 100755 examples/lissajous/LICK/lib/images/dots.png delete mode 100755 examples/lissajous/LICK/lib/images/holger.png delete mode 100755 examples/lissajous/LICK/lib/images/smoke.png delete mode 100755 examples/lissajous/LICK/lib/images/spiral1.png delete mode 100755 examples/lissajous/LICK/lib/images/spiral2.png delete mode 100755 examples/lissajous/LICK/lib/images/star.png delete mode 100755 examples/lissajous/LICK/lib/images/sun.png delete mode 100644 examples/lissajous/LICK/lib/init.lua delete mode 100644 examples/lissajous/LICK/lib/loveosc/README delete mode 100644 examples/lissajous/LICK/lib/loveosc/client.lua delete mode 100644 examples/lissajous/LICK/lib/loveosc/init.lua delete mode 100644 examples/lissajous/LICK/lib/loveosc/server.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/CHANGES delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/COPYING delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/README delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/common.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/compile.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/cursor.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/fp.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/gen_pack.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/gen_unpack.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/init.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/io_pack.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/io_unpack.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/lexer.lua delete mode 100755 examples/lissajous/LICK/lib/loveosc/vstruct/parser.lua delete mode 100644 examples/lissajous/LICK/lib/object.lua delete mode 100644 examples/lissajous/LICK/lick.lua delete mode 100644 examples/lissajous/conf.lua delete mode 100644 examples/lissajous/main.lua delete mode 100644 examples/rotate/LICK/init.lua delete mode 100644 examples/rotate/LICK/lib/color.lua delete mode 100644 examples/rotate/LICK/lib/docs/classes/Circle.html delete mode 100644 examples/rotate/LICK/lib/docs/classes/Drawable.html delete mode 100644 examples/rotate/LICK/lib/docs/classes/Line.html delete mode 100644 examples/rotate/LICK/lib/docs/classes/Object.html delete mode 100644 examples/rotate/LICK/lib/docs/classes/SCObject.html delete mode 100644 examples/rotate/LICK/lib/docs/classes/SCSynth.html delete mode 100644 examples/rotate/LICK/lib/docs/guidelines.html delete mode 100644 examples/rotate/LICK/lib/docs/guidelines.txt delete mode 100644 examples/rotate/LICK/lib/docs/index.html delete mode 100644 examples/rotate/LICK/lib/help.lua delete mode 100644 examples/rotate/LICK/lib/hlpr.lua delete mode 100644 examples/rotate/LICK/lib/hump/README.md delete mode 100644 examples/rotate/LICK/lib/hump/camera.lua delete mode 100644 examples/rotate/LICK/lib/hump/class.lua delete mode 100644 examples/rotate/LICK/lib/hump/gamestate.lua delete mode 100644 examples/rotate/LICK/lib/hump/ringbuffer.lua delete mode 100644 examples/rotate/LICK/lib/hump/timer.lua delete mode 100644 examples/rotate/LICK/lib/hump/vector.lua delete mode 100755 examples/rotate/LICK/lib/images/circle.png delete mode 100755 examples/rotate/LICK/lib/images/cloud.png delete mode 100755 examples/rotate/LICK/lib/images/cross.png delete mode 100755 examples/rotate/LICK/lib/images/dots.png delete mode 100755 examples/rotate/LICK/lib/images/holger.png delete mode 100755 examples/rotate/LICK/lib/images/smoke.png delete mode 100755 examples/rotate/LICK/lib/images/spiral1.png delete mode 100755 examples/rotate/LICK/lib/images/spiral2.png delete mode 100755 examples/rotate/LICK/lib/images/star.png delete mode 100755 examples/rotate/LICK/lib/images/sun.png delete mode 100644 examples/rotate/LICK/lib/init.lua delete mode 100644 examples/rotate/LICK/lib/loveosc/README delete mode 100644 examples/rotate/LICK/lib/loveosc/client.lua delete mode 100644 examples/rotate/LICK/lib/loveosc/init.lua delete mode 100644 examples/rotate/LICK/lib/loveosc/server.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/CHANGES delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/COPYING delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/README delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/common.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/compile.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/cursor.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/fp.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/gen_pack.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/gen_unpack.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/init.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/io_pack.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/io_unpack.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/lexer.lua delete mode 100755 examples/rotate/LICK/lib/loveosc/vstruct/parser.lua delete mode 100644 examples/rotate/LICK/lib/object.lua delete mode 100644 examples/rotate/LICK/lick.lua delete mode 100644 examples/rotate/conf.lua delete mode 100644 examples/rotate/main.lua diff --git a/LICK/lib/color.lua b/LICK/lib/color.lua deleted file mode 100644 index b94c709..0000000 --- a/LICK/lib/color.lua +++ /dev/null @@ -1,742 +0,0 @@ -x11_color_table = { --- taken from the SuperCollider Color documentation: -["alice blue"]={240, 248, 255}, -["AliceBlue"]={240, 248, 255}, -["antique white"]={250, 235, 215}, -["AntiqueWhite"]={250, 235, 215}, -["AntiqueWhite1"]={255, 239, 219}, -["AntiqueWhite2"]={238, 223, 204}, -["AntiqueWhite3"]={205, 192, 176}, -["AntiqueWhite4"]={139, 131, 120}, -["aquamarine"]={127, 255, 212}, -["aquamarine1"]={127, 255, 212}, -["aquamarine2"]={118, 238, 198}, -["aquamarine3"]={102, 205, 170}, -["aquamarine4"]={69, 139, 116}, -["azure"]={240, 255, 255}, -["azure1"]={240, 255, 255}, -["azure2"]={224, 238, 238}, -["azure3"]={193, 205, 205}, -["azure4"]={131, 139, 139}, -["beige"]={245, 245, 220}, -["bisque"]={255, 228, 196}, -["bisque1"]={255, 228, 196}, -["bisque2"]={238, 213, 183}, -["bisque3"]={205, 183, 158}, -["bisque4"]={139, 125, 107}, -["black"]={0, 0, 0}, -["blanched almond"]={255, 235, 205}, -["BlanchedAlmond"]={255, 235, 205}, -["blue"]={0, 0, 255}, -["blue violet"]={138, 43, 226}, -["blue1"]={0, 0, 255}, -["blue2"]={0, 0, 238}, -["blue3"]={0, 0, 205}, -["blue4"]={0, 0, 139}, -["BlueViolet"]={138, 43, 226}, -["brown"]={165, 42, 42}, -["brown1"]={255, 64, 64}, -["brown2"]={238, 59, 59}, -["brown3"]={205, 51, 51}, -["brown4"]={139, 35, 35}, -["burlywood"]={222, 184, 135}, -["burlywood1"]={255, 211, 155}, -["burlywood2"]={238, 197, 145}, -["burlywood3"]={205, 170, 125}, -["burlywood4"]={139, 115, 85}, -["cadet blue"]={95, 158, 160}, -["CadetBlue"]={95, 158, 160}, -["CadetBlue1"]={152, 245, 255}, -["CadetBlue2"]={142, 229, 238}, -["CadetBlue3"]={122, 197, 205}, -["CadetBlue4"]={83, 134, 139}, -["chartreuse"]={127, 255, 0}, -["chartreuse1"]={127, 255, 0}, -["chartreuse2"]={118, 238, 0}, -["chartreuse3"]={102, 205, 0}, -["chartreuse4"]={69, 139, 0}, -["chocolate"]={210, 105, 30}, -["chocolate1"]={255, 127, 36}, -["chocolate2"]={238, 118, 33}, -["chocolate3"]={205, 102, 29}, -["chocolate4"]={139, 69, 19}, -["coral"]={255, 127, 80}, -["coral1"]={255, 114, 86}, -["coral2"]={238, 106, 80}, -["coral3"]={205, 91, 69}, -["coral4"]={139, 62, 47}, -["cornflower blue"]={100, 149, 237}, -["CornflowerBlue"]={100, 149, 237}, -["cornsilk"]={255, 248, 220}, -["cornsilk1"]={255, 248, 220}, -["cornsilk2"]={238, 232, 205}, -["cornsilk3"]={205, 200, 177}, -["cornsilk4"]={139, 136, 120}, -["cyan"]={0, 255, 255}, -["cyan1"]={0, 255, 255}, -["cyan2"]={0, 238, 238}, -["cyan3"]={0, 205, 205}, -["cyan4"]={0, 139, 139}, -["dark goldenrod"]={184, 134, 11}, -["dark green"]={0, 100, 0}, -["dark khaki"]={189, 183, 107}, -["dark olive green"]={85, 107, 47}, -["dark orange"]={255, 140, 0}, -["dark orchid"]={153, 50, 204}, -["dark salmon"]={233, 150, 122}, -["dark sea green"]={143, 188, 143}, -["dark slate blue"]={72, 61, 139}, -["dark slate gray"]={47, 79, 79}, -["dark slate grey"]={47, 79, 79}, -["dark turquoise"]={0, 206, 209}, -["dark violet"]={148, 0, 211}, -["DarkGoldenrod"]={184, 134, 11}, -["DarkGoldenrod1"]={255, 185, 15}, -["DarkGoldenrod2"]={238, 173, 14}, -["DarkGoldenrod3"]={205, 149, 12}, -["DarkGoldenrod4"]={139, 101, 8}, -["DarkGreen"]={0, 100, 0}, -["DarkKhaki"]={189, 183, 107}, -["DarkOliveGreen"]={85, 107, 47}, -["DarkOliveGreen1"]={202, 255, 112}, -["DarkOliveGreen2"]={188, 238, 104}, -["DarkOliveGreen3"]={162, 205, 90}, -["DarkOliveGreen4"]={110, 139, 61}, -["DarkOrange"]={255, 140, 0}, -["DarkOrange1"]={255, 127, 0}, -["DarkOrange2"]={238, 118, 0}, -["DarkOrange3"]={205, 102, 0}, -["DarkOrange4"]={139, 69, 0}, -["DarkOrchid"]={153, 50, 204}, -["DarkOrchid1"]={191, 62, 255}, -["DarkOrchid2"]={178, 58, 238}, -["DarkOrchid3"]={154, 50, 205}, -["DarkOrchid4"]={104, 34, 139}, -["DarkSalmon"]={233, 150, 122}, -["DarkSeaGreen"]={143, 188, 143}, -["DarkSeaGreen1"]={193, 255, 193}, -["DarkSeaGreen2"]={180, 238, 180}, -["DarkSeaGreen3"]={155, 205, 155}, -["DarkSeaGreen4"]={105, 139, 105}, -["DarkSlateBlue"]={72, 61, 139}, -["DarkSlateGray"]={47, 79, 79}, -["DarkSlateGray1"]={151, 255, 255}, -["DarkSlateGray2"]={141, 238, 238}, -["DarkSlateGray3"]={121, 205, 205}, -["DarkSlateGray4"]={82, 139, 139}, -["DarkSlateGrey"]={47, 79, 79}, -["DarkTurquoise"]={0, 206, 209}, -["DarkViolet"]={148, 0, 211}, -["deep pink"]={255, 20, 147}, -["deep sky blue"]={0, 191, 255}, -["DeepPink"]={255, 20, 147}, -["DeepPink1"]={255, 20, 147}, -["DeepPink2"]={238, 18, 137}, -["DeepPink3"]={205, 16, 118}, -["DeepPink4"]={139, 10, 80}, -["DeepSkyBlue"]={0, 191, 255}, -["DeepSkyBlue1"]={0, 191, 255}, -["DeepSkyBlue2"]={0, 178, 238}, -["DeepSkyBlue3"]={0, 154, 205}, -["DeepSkyBlue4"]={0, 104, 139}, -["dim gray"]={105, 105, 105}, -["dim grey"]={105, 105, 105}, -["DimGray"]={105, 105, 105}, -["DimGrey"]={105, 105, 105}, -["dodger blue"]={30, 144, 255}, -["DodgerBlue"]={30, 144, 255}, -["DodgerBlue1"]={30, 144, 255}, -["DodgerBlue2"]={28, 134, 238}, -["DodgerBlue3"]={24, 116, 205}, -["DodgerBlue4"]={16, 78, 139}, -["firebrick"]={178, 34, 34}, -["firebrick1"]={255, 48, 48}, -["firebrick2"]={238, 44, 44}, -["firebrick3"]={205, 38, 38}, -["firebrick4"]={139, 26, 26}, -["floral white"]={255, 250, 240}, -["FloralWhite"]={255, 250, 240}, -["forest green"]={34, 139, 34}, -["ForestGreen"]={34, 139, 34}, -["gainsboro"]={220, 220, 220}, -["ghost white"]={248, 248, 255}, -["GhostWhite"]={248, 248, 255}, -["gold"]={255, 215, 0}, -["gold1"]={255, 215, 0}, -["gold2"]={238, 201, 0}, -["gold3"]={205, 173, 0}, -["gold4"]={139, 117, 0}, -["goldenrod"]={218, 165, 32}, -["goldenrod1"]={255, 193, 37}, -["goldenrod2"]={238, 180, 34}, -["goldenrod3"]={205, 155, 29}, -["goldenrod4"]={139, 105, 20}, -["gray"]={190, 190, 190}, -["gray0"]={0, 0, 0}, -["gray1"]={3, 3, 3}, -["gray10"]={26, 26, 26}, -["gray100"]={255, 255, 255}, -["gray11"]={28, 28, 28}, -["gray12"]={31, 31, 31}, -["gray13"]={33, 33, 33}, -["gray14"]={36, 36, 36}, -["gray15"]={38, 38, 38}, -["gray16"]={41, 41, 41}, -["gray17"]={43, 43, 43}, -["gray18"]={46, 46, 46}, -["gray19"]={48, 48, 48}, -["gray2"]={5, 5, 5}, -["gray20"]={51, 51, 51}, -["gray21"]={54, 54, 54}, -["gray22"]={56, 56, 56}, -["gray23"]={59, 59, 59}, -["gray24"]={61, 61, 61}, -["gray25"]={64, 64, 64}, -["gray26"]={66, 66, 66}, -["gray27"]={69, 69, 69}, -["gray28"]={71, 71, 71}, -["gray29"]={74, 74, 74}, -["gray3"]={8, 8, 8}, -["gray30"]={77, 77, 77}, -["gray31"]={79, 79, 79}, -["gray32"]={82, 82, 82}, -["gray33"]={84, 84, 84}, -["gray34"]={87, 87, 87}, -["gray35"]={89, 89, 89}, -["gray36"]={92, 92, 92}, -["gray37"]={94, 94, 94}, -["gray38"]={97, 97, 97}, -["gray39"]={99, 99, 99}, -["gray4"]={10, 10, 10}, -["gray40"]={102, 102, 102}, -["gray41"]={105, 105, 105}, -["gray42"]={107, 107, 107}, -["gray43"]={110, 110, 110}, -["gray44"]={112, 112, 112}, -["gray45"]={115, 115, 115}, -["gray46"]={117, 117, 117}, -["gray47"]={120, 120, 120}, -["gray48"]={122, 122, 122}, -["gray49"]={125, 125, 125}, -["gray5"]={13, 13, 13}, -["gray50"]={127, 127, 127}, -["gray51"]={130, 130, 130}, -["gray52"]={133, 133, 133}, -["gray53"]={135, 135, 135}, -["gray54"]={138, 138, 138}, -["gray55"]={140, 140, 140}, -["gray56"]={143, 143, 143}, -["gray57"]={145, 145, 145}, -["gray58"]={148, 148, 148}, -["gray59"]={150, 150, 150}, -["gray6"]={15, 15, 15}, -["gray60"]={153, 153, 153}, -["gray61"]={156, 156, 156}, -["gray62"]={158, 158, 158}, -["gray63"]={161, 161, 161}, -["gray64"]={163, 163, 163}, -["gray65"]={166, 166, 166}, -["gray66"]={168, 168, 168}, -["gray67"]={171, 171, 171}, -["gray68"]={173, 173, 173}, -["gray69"]={176, 176, 176}, -["gray7"]={18, 18, 18}, -["gray70"]={179, 179, 179}, -["gray71"]={181, 181, 181}, -["gray72"]={184, 184, 184}, -["gray73"]={186, 186, 186}, -["gray74"]={189, 189, 189}, -["gray75"]={191, 191, 191}, -["gray76"]={194, 194, 194}, -["gray77"]={196, 196, 196}, -["gray78"]={199, 199, 199}, -["gray79"]={201, 201, 201}, -["gray8"]={20, 20, 20}, -["gray80"]={204, 204, 204}, -["gray81"]={207, 207, 207}, -["gray82"]={209, 209, 209}, -["gray83"]={212, 212, 212}, -["gray84"]={214, 214, 214}, -["gray85"]={217, 217, 217}, -["gray86"]={219, 219, 219}, -["gray87"]={222, 222, 222}, -["gray88"]={224, 224, 224}, -["gray89"]={227, 227, 227}, -["gray9"]={23, 23, 23}, -["gray90"]={229, 229, 229}, -["gray91"]={232, 232, 232}, -["gray92"]={235, 235, 235}, -["gray93"]={237, 237, 237}, -["gray94"]={240, 240, 240}, -["gray95"]={242, 242, 242}, -["gray96"]={245, 245, 245}, -["gray97"]={247, 247, 247}, -["gray98"]={250, 250, 250}, -["gray99"]={252, 252, 252}, -["green"]={0, 255, 0}, -["green yellow"]={173, 255, 47}, -["green1"]={0, 255, 0}, -["green2"]={0, 238, 0}, -["green3"]={0, 205, 0}, -["green4"]={0, 139, 0}, -["GreenYellow"]={173, 255, 47}, -["grey"]={190, 190, 190}, -["grey0"]={0, 0, 0}, -["grey1"]={3, 3, 3}, -["grey10"]={26, 26, 26}, -["grey100"]={255, 255, 255}, -["grey11"]={28, 28, 28}, -["grey12"]={31, 31, 31}, -["grey13"]={33, 33, 33}, -["grey14"]={36, 36, 36}, -["grey15"]={38, 38, 38}, -["grey16"]={41, 41, 41}, -["grey17"]={43, 43, 43}, -["grey18"]={46, 46, 46}, -["grey19"]={48, 48, 48}, -["grey2"]={5, 5, 5}, -["grey20"]={51, 51, 51}, -["grey21"]={54, 54, 54}, -["grey22"]={56, 56, 56}, -["grey23"]={59, 59, 59}, -["grey24"]={61, 61, 61}, -["grey25"]={64, 64, 64}, -["grey26"]={66, 66, 66}, -["grey27"]={69, 69, 69}, -["grey28"]={71, 71, 71}, -["grey29"]={74, 74, 74}, -["grey3"]={8, 8, 8}, -["grey30"]={77, 77, 77}, -["grey31"]={79, 79, 79}, -["grey32"]={82, 82, 82}, -["grey33"]={84, 84, 84}, -["grey34"]={87, 87, 87}, -["grey35"]={89, 89, 89}, -["grey36"]={92, 92, 92}, -["grey37"]={94, 94, 94}, -["grey38"]={97, 97, 97}, -["grey39"]={99, 99, 99}, -["grey4"]={10, 10, 10}, -["grey40"]={102, 102, 102}, -["grey41"]={105, 105, 105}, -["grey42"]={107, 107, 107}, -["grey43"]={110, 110, 110}, -["grey44"]={112, 112, 112}, -["grey45"]={115, 115, 115}, -["grey46"]={117, 117, 117}, -["grey47"]={120, 120, 120}, -["grey48"]={122, 122, 122}, -["grey49"]={125, 125, 125}, -["grey5"]={13, 13, 13}, -["grey50"]={127, 127, 127}, -["grey51"]={130, 130, 130}, -["grey52"]={133, 133, 133}, -["grey53"]={135, 135, 135}, -["grey54"]={138, 138, 138}, -["grey55"]={140, 140, 140}, -["grey56"]={143, 143, 143}, -["grey57"]={145, 145, 145}, -["grey58"]={148, 148, 148}, -["grey59"]={150, 150, 150}, -["grey6"]={15, 15, 15}, -["grey60"]={153, 153, 153}, -["grey61"]={156, 156, 156}, -["grey62"]={158, 158, 158}, -["grey63"]={161, 161, 161}, -["grey64"]={163, 163, 163}, -["grey65"]={166, 166, 166}, -["grey66"]={168, 168, 168}, -["grey67"]={171, 171, 171}, -["grey68"]={173, 173, 173}, -["grey69"]={176, 176, 176}, -["grey7"]={18, 18, 18}, -["grey70"]={179, 179, 179}, -["grey71"]={181, 181, 181}, -["grey72"]={184, 184, 184}, -["grey73"]={186, 186, 186}, -["grey74"]={189, 189, 189}, -["grey75"]={191, 191, 191}, -["grey76"]={194, 194, 194}, -["grey77"]={196, 196, 196}, -["grey78"]={199, 199, 199}, -["grey79"]={201, 201, 201}, -["grey8"]={20, 20, 20}, -["grey80"]={204, 204, 204}, -["grey81"]={207, 207, 207}, -["grey82"]={209, 209, 209}, -["grey83"]={212, 212, 212}, -["grey84"]={214, 214, 214}, -["grey85"]={217, 217, 217}, -["grey86"]={219, 219, 219}, -["grey87"]={222, 222, 222}, -["grey88"]={224, 224, 224}, -["grey89"]={227, 227, 227}, -["grey9"]={23, 23, 23}, -["grey90"]={229, 229, 229}, -["grey91"]={232, 232, 232}, -["grey92"]={235, 235, 235}, -["grey93"]={237, 237, 237}, -["grey94"]={240, 240, 240}, -["grey95"]={242, 242, 242}, -["grey96"]={245, 245, 245}, -["grey97"]={247, 247, 247}, -["grey98"]={250, 250, 250}, -["grey99"]={252, 252, 252}, -["honeydew"]={240, 255, 240}, -["honeydew1"]={240, 255, 240}, -["honeydew2"]={224, 238, 224}, -["honeydew3"]={193, 205, 193}, -["honeydew4"]={131, 139, 131}, -["hot pink"]={255, 105, 180}, -["HotPink"]={255, 105, 180}, -["HotPink1"]={255, 110, 180}, -["HotPink2"]={238, 106, 167}, -["HotPink3"]={205, 96, 144}, -["HotPink4"]={139, 58, 98}, -["indian red"]={205, 92, 92}, -["IndianRed"]={205, 92, 92}, -["IndianRed1"]={255, 106, 106}, -["IndianRed2"]={238, 99, 99}, -["IndianRed3"]={205, 85, 85}, -["IndianRed4"]={139, 58, 58}, -["ivory"]={255, 255, 240}, -["ivory1"]={255, 255, 240}, -["ivory2"]={238, 238, 224}, -["ivory3"]={205, 205, 193}, -["ivory4"]={139, 139, 131}, -["khaki"]={240, 230, 140}, -["khaki1"]={255, 246, 143}, -["khaki2"]={238, 230, 133}, -["khaki3"]={205, 198, 115}, -["khaki4"]={139, 134, 78}, -["lavender"]={230, 230, 250}, -["lavender blush"]={255, 240, 245}, -["LavenderBlush"]={255, 240, 245}, -["LavenderBlush1"]={255, 240, 245}, -["LavenderBlush2"]={238, 224, 229}, -["LavenderBlush3"]={205, 193, 197}, -["LavenderBlush4"]={139, 131, 134}, -["lawn green"]={124, 252, 0}, -["LawnGreen"]={124, 252, 0}, -["lemon chiffon"]={255, 250, 205}, -["LemonChiffon"]={255, 250, 205}, -["LemonChiffon1"]={255, 250, 205}, -["LemonChiffon2"]={238, 233, 191}, -["LemonChiffon3"]={205, 201, 165}, -["LemonChiffon4"]={139, 137, 112}, -["light blue"]={173, 216, 230}, -["light coral"]={240, 128, 128}, -["light cyan"]={224, 255, 255}, -["light goldenrod"]={238, 221, 130}, -["light goldenrod yellow"]={250, 250, 210}, -["light gray"]={211, 211, 211}, -["light grey"]={211, 211, 211}, -["light pink"]={255, 182, 193}, -["light salmon"]={255, 160, 122}, -["light sea green"]={32, 178, 170}, -["light sky blue"]={135, 206, 250}, -["light slate blue"]={132, 112, 255}, -["light slate gray"]={119, 136, 153}, -["light slate grey"]={119, 136, 153}, -["light steel blue"]={176, 196, 222}, -["light yellow"]={255, 255, 224}, -["LightBlue"]={173, 216, 230}, -["LightBlue1"]={191, 239, 255}, -["LightBlue2"]={178, 223, 238}, -["LightBlue3"]={154, 192, 205}, -["LightBlue4"]={104, 131, 139}, -["LightCoral"]={240, 128, 128}, -["LightCyan"]={224, 255, 255}, -["LightCyan1"]={224, 255, 255}, -["LightCyan2"]={209, 238, 238}, -["LightCyan3"]={180, 205, 205}, -["LightCyan4"]={122, 139, 139}, -["LightGoldenrod"]={238, 221, 130}, -["LightGoldenrod1"]={255, 236, 139}, -["LightGoldenrod2"]={238, 220, 130}, -["LightGoldenrod3"]={205, 190, 112}, -["LightGoldenrod4"]={139, 129, 76}, -["LightGoldenrodYellow"]={250, 250, 210}, -["LightGray"]={211, 211, 211}, -["LightGrey"]={211, 211, 211}, -["LightPink"]={255, 182, 193}, -["LightPink1"]={255, 174, 185}, -["LightPink2"]={238, 162, 173}, -["LightPink3"]={205, 140, 149}, -["LightPink4"]={139, 95, 101}, -["LightSalmon"]={255, 160, 122}, -["LightSalmon1"]={255, 160, 122}, -["LightSalmon2"]={238, 149, 114}, -["LightSalmon3"]={205, 129, 98}, -["LightSalmon4"]={139, 87, 66}, -["LightSeaGreen"]={32, 178, 170}, -["LightSkyBlue"]={135, 206, 250}, -["LightSkyBlue1"]={176, 226, 255}, -["LightSkyBlue2"]={164, 211, 238}, -["LightSkyBlue3"]={141, 182, 205}, -["LightSkyBlue4"]={96, 123, 139}, -["LightSlateBlue"]={132, 112, 255}, -["LightSlateGray"]={119, 136, 153}, -["LightSlateGrey"]={119, 136, 153}, -["LightSteelBlue"]={176, 196, 222}, -["LightSteelBlue1"]={202, 225, 255}, -["LightSteelBlue2"]={188, 210, 238}, -["LightSteelBlue3"]={162, 181, 205}, -["LightSteelBlue4"]={110, 123, 139}, -["LightYellow"]={255, 255, 224}, -["LightYellow1"]={255, 255, 224}, -["LightYellow2"]={238, 238, 209}, -["LightYellow3"]={205, 205, 180}, -["LightYellow4"]={139, 139, 122}, -["lime green"]={50, 205, 50}, -["LimeGreen"]={50, 205, 50}, -["linen"]={250, 240, 230}, -["magenta"]={255, 0, 255}, -["magenta1"]={255, 0, 255}, -["magenta2"]={238, 0, 238}, -["magenta3"]={205, 0, 205}, -["magenta4"]={139, 0, 139}, -["maroon"]={176, 48, 96}, -["maroon1"]={255, 52, 179}, -["maroon2"]={238, 48, 167}, -["maroon3"]={205, 41, 144}, -["maroon4"]={139, 28, 98}, -["medium aquamarine"]={102, 205, 170}, -["medium blue"]={0, 0, 205}, -["medium orchid"]={186, 85, 211}, -["medium purple"]={147, 112, 219}, -["medium sea green"]={60, 179, 113}, -["medium slate blue"]={123, 104, 238}, -["medium spring green"]={0, 250, 154}, -["medium turquoise"]={72, 209, 204}, -["medium violet red"]={199, 21, 133}, -["MediumAquamarine"]={102, 205, 170}, -["MediumBlue"]={0, 0, 205}, -["MediumOrchid"]={186, 85, 211}, -["MediumOrchid1"]={224, 102, 255}, -["MediumOrchid2"]={209, 95, 238}, -["MediumOrchid3"]={180, 82, 205}, -["MediumOrchid4"]={122, 55, 139}, -["MediumPurple"]={147, 112, 219}, -["MediumPurple1"]={171, 130, 255}, -["MediumPurple2"]={159, 121, 238}, -["MediumPurple3"]={137, 104, 205}, -["MediumPurple4"]={93, 71, 139}, -["MediumSeaGreen"]={60, 179, 113}, -["MediumSlateBlue"]={123, 104, 238}, -["MediumSpringGreen"]={0, 250, 154}, -["MediumTurquoise"]={72, 209, 204}, -["MediumVioletRed"]={199, 21, 133}, -["midnight blue"]={25, 25, 112}, -["MidnightBlue"]={25, 25, 112}, -["mint cream"]={245, 255, 250}, -["MintCream"]={245, 255, 250}, -["misty rose"]={255, 228, 225}, -["MistyRose"]={255, 228, 225}, -["MistyRose1"]={255, 228, 225}, -["MistyRose2"]={238, 213, 210}, -["MistyRose3"]={205, 183, 181}, -["MistyRose4"]={139, 125, 123}, -["moccasin"]={255, 228, 181}, -["navajo white"]={255, 222, 173}, -["NavajoWhite"]={255, 222, 173}, -["NavajoWhite1"]={255, 222, 173}, -["NavajoWhite2"]={238, 207, 161}, -["NavajoWhite3"]={205, 179, 139}, -["NavajoWhite4"]={139, 121, 94}, -["navy"]={0, 0, 128}, -["navy blue"]={0, 0, 128}, -["NavyBlue"]={0, 0, 128}, -["old lace"]={253, 245, 230}, -["OldLace"]={253, 245, 230}, -["olive drab"]={107, 142, 35}, -["OliveDrab"]={107, 142, 35}, -["OliveDrab1"]={192, 255, 62}, -["OliveDrab2"]={179, 238, 58}, -["OliveDrab3"]={154, 205, 50}, -["OliveDrab4"]={105, 139, 34}, -["orange"]={255, 165, 0}, -["orange red"]={255, 69, 0}, -["orange1"]={255, 165, 0}, -["orange2"]={238, 154, 0}, -["orange3"]={205, 133, 0}, -["orange4"]={139, 90, 0}, -["OrangeRed"]={255, 69, 0}, -["OrangeRed1"]={255, 69, 0}, -["OrangeRed2"]={238, 64, 0}, -["OrangeRed3"]={205, 55, 0}, -["OrangeRed4"]={139, 37, 0}, -["orchid"]={218, 112, 214}, -["orchid1"]={255, 131, 250}, -["orchid2"]={238, 122, 233}, -["orchid3"]={205, 105, 201}, -["orchid4"]={139, 71, 137}, -["pale goldenrod"]={238, 232, 170}, -["pale green"]={152, 251, 152}, -["pale turquoise"]={175, 238, 238}, -["pale violet red"]={219, 112, 147}, -["PaleGoldenrod"]={238, 232, 170}, -["PaleGreen"]={152, 251, 152}, -["PaleGreen1"]={154, 255, 154}, -["PaleGreen2"]={144, 238, 144}, -["PaleGreen3"]={124, 205, 124}, -["PaleGreen4"]={84, 139, 84}, -["PaleTurquoise"]={175, 238, 238}, -["PaleTurquoise1"]={187, 255, 255}, -["PaleTurquoise2"]={174, 238, 238}, -["PaleTurquoise3"]={150, 205, 205}, -["PaleTurquoise4"]={102, 139, 139}, -["PaleVioletRed"]={219, 112, 147}, -["PaleVioletRed1"]={255, 130, 171}, -["PaleVioletRed2"]={238, 121, 159}, -["PaleVioletRed3"]={205, 104, 137}, -["PaleVioletRed4"]={139, 71, 93}, -["papaya whip"]={255, 239, 213}, -["PapayaWhip"]={255, 239, 213}, -["peach puff"]={255, 218, 185}, -["PeachPuff"]={255, 218, 185}, -["PeachPuff1"]={255, 218, 185}, -["PeachPuff2"]={238, 203, 173}, -["PeachPuff3"]={205, 175, 149}, -["PeachPuff4"]={139, 119, 101}, -["peru"]={205, 133, 63}, -["pink"]={255, 192, 203}, -["pink1"]={255, 181, 197}, -["pink2"]={238, 169, 184}, -["pink3"]={205, 145, 158}, -["pink4"]={139, 99, 108}, -["plum"]={221, 160, 221}, -["plum1"]={255, 187, 255}, -["plum2"]={238, 174, 238}, -["plum3"]={205, 150, 205}, -["plum4"]={139, 102, 139}, -["powder blue"]={176, 224, 230}, -["PowderBlue"]={176, 224, 230}, -["purple"]={160, 32, 240}, -["purple1"]={155, 48, 255}, -["purple2"]={145, 44, 238}, -["purple3"]={125, 38, 205}, -["purple4"]={85, 26, 139}, -["red"]={255, 0, 0}, -["red1"]={255, 0, 0}, -["red2"]={238, 0, 0}, -["red3"]={205, 0, 0}, -["red4"]={139, 0, 0}, -["rosy brown"]={188, 143, 143}, -["RosyBrown"]={188, 143, 143}, -["RosyBrown1"]={255, 193, 193}, -["RosyBrown2"]={238, 180, 180}, -["RosyBrown3"]={205, 155, 155}, -["RosyBrown4"]={139, 105, 105}, -["royal blue"]={65, 105, 225}, -["RoyalBlue"]={65, 105, 225}, -["RoyalBlue1"]={72, 118, 255}, -["RoyalBlue2"]={67, 110, 238}, -["RoyalBlue3"]={58, 95, 205}, -["RoyalBlue4"]={39, 64, 139}, -["saddle brown"]={139, 69, 19}, -["SaddleBrown"]={139, 69, 19}, -["salmon"]={250, 128, 114}, -["salmon1"]={255, 140, 105}, -["salmon2"]={238, 130, 98}, -["salmon3"]={205, 112, 84}, -["salmon4"]={139, 76, 57}, -["sandy brown"]={244, 164, 96}, -["SandyBrown"]={244, 164, 96}, -["sea green"]={46, 139, 87}, -["SeaGreen"]={46, 139, 87}, -["SeaGreen1"]={84, 255, 159}, -["SeaGreen2"]={78, 238, 148}, -["SeaGreen3"]={67, 205, 128}, -["SeaGreen4"]={46, 139, 87}, -["seashell"]={255, 245, 238}, -["seashell1"]={255, 245, 238}, -["seashell2"]={238, 229, 222}, -["seashell3"]={205, 197, 191}, -["seashell4"]={139, 134, 130}, -["sienna"]={160, 82, 45}, -["sienna1"]={255, 130, 71}, -["sienna2"]={238, 121, 66}, -["sienna3"]={205, 104, 57}, -["sienna4"]={139, 71, 38}, -["sky blue"]={135, 206, 235}, -["SkyBlue"]={135, 206, 235}, -["SkyBlue1"]={135, 206, 255}, -["SkyBlue2"]={126, 192, 238}, -["SkyBlue3"]={108, 166, 205}, -["SkyBlue4"]={74, 112, 139}, -["slate blue"]={106, 90, 205}, -["slate gray"]={112, 128, 144}, -["slate grey"]={112, 128, 144}, -["SlateBlue"]={106, 90, 205}, -["SlateBlue1"]={131, 111, 255}, -["SlateBlue2"]={122, 103, 238}, -["SlateBlue3"]={105, 89, 205}, -["SlateBlue4"]={71, 60, 139}, -["SlateGray"]={112, 128, 144}, -["SlateGray1"]={198, 226, 255}, -["SlateGray2"]={185, 211, 238}, -["SlateGray3"]={159, 182, 205}, -["SlateGray4"]={108, 123, 139}, -["SlateGrey"]={112, 128, 144}, -["snow"]={255, 250, 250}, -["snow1"]={255, 250, 250}, -["snow2"]={238, 233, 233}, -["snow3"]={205, 201, 201}, -["snow4"]={139, 137, 137}, -["spring green"]={0, 255, 127}, -["SpringGreen"]={0, 255, 127}, -["SpringGreen1"]={0, 255, 127}, -["SpringGreen2"]={0, 238, 118}, -["SpringGreen3"]={0, 205, 102}, -["SpringGreen4"]={0, 139, 69}, -["steel blue"]={70, 130, 180}, -["SteelBlue"]={70, 130, 180}, -["SteelBlue1"]={99, 184, 255}, -["SteelBlue2"]={92, 172, 238}, -["SteelBlue3"]={79, 148, 205}, -["SteelBlue4"]={54, 100, 139}, -["tan"]={210, 180, 140}, -["tan1"]={255, 165, 79}, -["tan2"]={238, 154, 73}, -["tan3"]={205, 133, 63}, -["tan4"]={139, 90, 43}, -["thistle"]={216, 191, 216}, -["thistle1"]={255, 225, 255}, -["thistle2"]={238, 210, 238}, -["thistle3"]={205, 181, 205}, -["thistle4"]={139, 123, 139}, -["tomato"]={255, 99, 71}, -["tomato1"]={255, 99, 71}, -["tomato2"]={238, 92, 66}, -["tomato3"]={205, 79, 57}, -["tomato4"]={139, 54, 38}, -["turquoise"]={64, 224, 208}, -["turquoise1"]={0, 245, 255}, -["turquoise2"]={0, 229, 238}, -["turquoise3"]={0, 197, 205}, -["turquoise4"]={0, 134, 139}, -["violet"]={238, 130, 238}, -["violet red"]={208, 32, 144}, -["VioletRed"]={208, 32, 144}, -["VioletRed1"]={255, 62, 150}, -["VioletRed2"]={238, 58, 140}, -["VioletRed3"]={205, 50, 120}, -["VioletRed4"]={139, 34, 82}, -["wheat"]={245, 222, 179}, -["wheat1"]={255, 231, 186}, -["wheat2"]={238, 216, 174}, -["wheat3"]={205, 186, 150}, -["wheat4"]={139, 126, 102}, -["white"]={255, 255, 255}, -["white smoke"]={245, 245, 245}, -["WhiteSmoke"]={245, 245, 245}, -["yellow"]={255, 255, 0}, -["yellow green"]={154, 205, 50}, -["yellow1"]={255, 255, 0}, -["yellow2"]={238, 238, 0}, -["yellow3"]={205, 205, 0}, -["yellow4"]={139, 139, 0}, -["YellowGreen"]={154, 205, 50} - -} diff --git a/LICK/lib/docs/classes/Circle.html b/LICK/lib/docs/classes/Circle.html deleted file mode 100644 index 852dc53..0000000 --- a/LICK/lib/docs/classes/Circle.html +++ /dev/null @@ -1 +0,0 @@ -Circle

Circle               drawable circle

       function(self, x, y, r, s, color)

               Constructor

       draw(style)

              draw the circle
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Drawable.html b/LICK/lib/docs/classes/Drawable.html deleted file mode 100644 index dcd58a1..0000000 --- a/LICK/lib/docs/classes/Drawable.html +++ /dev/null @@ -1 +0,0 @@ -Drawable

Drawable               base class for all drawable stuff

       function(self, x, y, color)

               Constructor

       wrapX(min, max)

              can be called via wrapX(max) or wrapX(min,max)

       wrapY(min, max)

              can be called via wrapY(max) or wrapY(min,max)

       wrap(str, min, max)

              internal wrapper

       set(str, val)

              supercollider style 'set'

       draw()

              not yet implemented
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Image.html b/LICK/lib/docs/classes/Image.html deleted file mode 100644 index 82942f2..0000000 --- a/LICK/lib/docs/classes/Image.html +++ /dev/null @@ -1 +0,0 @@ -Image

Image               Image from file

       function(self, file, x, y, color, size, orientation)

               Constructor

       draw()

              draw the image
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Line.html b/LICK/lib/docs/classes/Line.html deleted file mode 100644 index 0963609..0000000 --- a/LICK/lib/docs/classes/Line.html +++ /dev/null @@ -1 +0,0 @@ -Line

Line               draw a line

       function(self, x, y, tx, ty, color) -- wats the dealio for polylines?

               Constructor

       draw(width, style)

              draw the line
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Object.html b/LICK/lib/docs/classes/Object.html deleted file mode 100644 index 84c6db9..0000000 --- a/LICK/lib/docs/classes/Object.html +++ /dev/null @@ -1 +0,0 @@ -Object

Object               base class

       function(self)

               Constructor \ No newline at end of file diff --git a/LICK/lib/docs/classes/Point.html b/LICK/lib/docs/classes/Point.html deleted file mode 100644 index 206cc76..0000000 --- a/LICK/lib/docs/classes/Point.html +++ /dev/null @@ -1 +0,0 @@ -Point

Point               is a point

       function(self, x, y, color, size, style)

               Constructor

       draw()

              draw the point
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Polygon.html b/LICK/lib/docs/classes/Polygon.html deleted file mode 100644 index 4c6ae88..0000000 --- a/LICK/lib/docs/classes/Polygon.html +++ /dev/null @@ -1 +0,0 @@ -Polygon

Polygon               some vertice stuff

       function(self, vertices, color, style)

               Constructor

       draw(style)

              draw the polygon
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Rect.html b/LICK/lib/docs/classes/Rect.html deleted file mode 100644 index e14bc5d..0000000 --- a/LICK/lib/docs/classes/Rect.html +++ /dev/null @@ -1 +0,0 @@ -Rect

Rect               is a rectangle

       function(self, x, y, width, height, color, style)

               Constructor

       draw(style)

              draw the rectangle
\ No newline at end of file diff --git a/LICK/lib/docs/classes/SCObject.html b/LICK/lib/docs/classes/SCObject.html deleted file mode 100644 index 2d1621a..0000000 --- a/LICK/lib/docs/classes/SCObject.html +++ /dev/null @@ -1 +0,0 @@ -SCObject

SCObject               bass class for supercollider communication

       function(self)

               Constructor \ No newline at end of file diff --git a/LICK/lib/docs/classes/SCSynth.html b/LICK/lib/docs/classes/SCSynth.html deleted file mode 100644 index b2f94ac..0000000 --- a/LICK/lib/docs/classes/SCSynth.html +++ /dev/null @@ -1 +0,0 @@ -SCSynth

SCSynth               supercollider synthesizer class

       function(self, nodename, freq)

               Constructor

       set(control, val)

              set a control, TODO: variable lenght of argument-pairs

        os.time(),

              bundle",

       play()

              sends an OSC message to the supercollider to start the synth

        os.time(),

              bundle",

       free()

              frees the node on the supercollider server

        os.time()+0.8,

              bundle",
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Sequencer.html b/LICK/lib/docs/classes/Sequencer.html deleted file mode 100644 index 487893b..0000000 --- a/LICK/lib/docs/classes/Sequencer.html +++ /dev/null @@ -1 +0,0 @@ -Sequencer

Sequencer               a simple Sequencer with callback functions on every beat, bar or phrase

       function(self,bpm, timeSig, phraseLength)

               Constructor

       update(dt)

              counts the time and calls the appropriate functions
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Text.html b/LICK/lib/docs/classes/Text.html deleted file mode 100644 index ce903ed..0000000 --- a/LICK/lib/docs/classes/Text.html +++ /dev/null @@ -1 +0,0 @@ -Text

Text               characters

       function(self, x, y, text, rotation, scaleX, scaleY)

               Constructor

       draw(text)

              display text on screen
\ No newline at end of file diff --git a/LICK/lib/docs/classes/Triangle.html b/LICK/lib/docs/classes/Triangle.html deleted file mode 100644 index 69443f2..0000000 --- a/LICK/lib/docs/classes/Triangle.html +++ /dev/null @@ -1 +0,0 @@ -Triangle

Triangle               has three sides

       function(self, vertices, color, style)

               Constructor

       draw(style)

              draw the triangle
\ No newline at end of file diff --git a/LICK/lib/docs/guidelines.html b/LICK/lib/docs/guidelines.html deleted file mode 100644 index b394e30..0000000 --- a/LICK/lib/docs/guidelines.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - -

Guidelines for new live_libs classes

-


-

1. Howto write a new class

-


-

-

<class name> =  Class(<constructor>)

-

creates a class with function in constructor

-


-

<class name>:inherit(<other class name>)

-

if you want to inherit from any class.Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table

-


-

If you want to call the constructor of the superclass write the following in the constructor of the current class:

-

-

<super class name>.<construct>(self, <arguments>)

-


-

More on Classes and HUMP: http://vrld.github.com/hump/

-


-

2. Commenting

-

-

In order to work the comment parser needs the following comment 'marks':

-


-


-

-- @ <class name>:<short description>

-

This marks a new class. The following line should be the class definition

-

Note: only one line comments are working

-


-

-- # <description>

-

This marks a new method.

-

Note: the limitations of class comments apply

-


-

any '--' without marks will not be included in the helpfile

-

-

Example:

-

-- @Drawable: base class for all drawable stuff

-

Drawable = Class(function(self, x, y, color)

-

self.color = color or hlpr.color("white",255)

-

-- call constructor of Object class

-

Object.construct(self)

-

self.position = Vector(x or 0,y or 0)

-

end)

-

Drawable:inherit(Object)

-


-

-- #can be called via wrapX(max) or wrapX(min,max)

-

function Drawable:wrapX(min, max)

-

if min and max then

-

self:wrap("x", min, max)

-

elseif min and not max then 

-

self:wrap("x", 0, min)

-

end

-

end

-


-


- - diff --git a/LICK/lib/docs/guidelines.txt b/LICK/lib/docs/guidelines.txt deleted file mode 100644 index fd1010f..0000000 --- a/LICK/lib/docs/guidelines.txt +++ /dev/null @@ -1,51 +0,0 @@ -Guidelines for new live_libs classes - -1. Howto write a new class - - - = Class() - creates a class with function in constructor - - :inherit() - if you want to inherit from any class. Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table - -If you want to call the constructor of the superclass write the following in the constructor of the current class: - - .(self, ) -More on Classes and HUMP: http://vrld.github.com/hump/ - -2. Commenting - - In order to work the comment parser needs the following comment 'marks': - - - -- @ : - This marks a new class. - Note: only oneliners are working - - -- # - This marks a new method. - Note: limitation of class comments apply - - any '--' without marks will not be included in the helpfile - - Example: - -- @Drawable: base class for all drawable stuff - Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - self.position = Vector(x or 0,y or 0) - end) - Drawable:inherit(Object) - - -- #can be called via wrapX(max) or wrapX(min,max) - function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end - end - - diff --git a/LICK/lib/docs/index.html b/LICK/lib/docs/index.html deleted file mode 100644 index 90b90a0..0000000 --- a/LICK/lib/docs/index.html +++ /dev/null @@ -1 +0,0 @@ -live_libs_doc

live_libs documentation

Guidelines for new classes and commenting

Classes:

Object
SCObject
SCSynth
Drawable
Circle
Line
Image
Point
Sequencer
Polygon
Rect
Triangle
Text
\ No newline at end of file diff --git a/LICK/lib/help.lua b/LICK/lib/help.lua deleted file mode 100644 index 25aa80e..0000000 --- a/LICK/lib/help.lua +++ /dev/null @@ -1,112 +0,0 @@ --- parse the classes to readable html - -module(..., package.seeall) - -filename = "LICK/lib/object.lua" -help_filename = "LICK/lib/docs/" - --- some styles -local style = "" - -local header1 = "" -local header2 = ""..style.."" -local footer = "" -local _newclasstitle = "

" -local newclasstitle_ = "

" -local tab = "       " - - --- generates the html file -function generate() - class_file = love.filesystem.newFile( filename ) - class_file:open('r') - local output = "" - output = header1.."test"..header2 - local found_methods = 0 - local found_classes = 0 - local classes = {} - for line in class_file:lines() do - local b,e = string.find(line,"@") - local b1,e1 = string.find(line,"Class") - if b and e then - if found_classes > 0 then - output = output..footer - writeClassFile(name, output) - local output = "" - - end - local dp,ep = string.find(line, ":") - if dp then - name = line:sub(e+1, dp-1 or 0) - print(name) - table.insert(classes,name) - output = header1..name..header2 - - output = output .._newclasstitle .. name..tab..tab..line:sub(dp+1) ..newclasstitle_ - found_methods = 0 - found_classes = found_classes + 1 - end - elseif b1 and e1 and not string.find(line,"require") then - output = output .."

"..tab..line:sub(e1+2).."

"..tab..tab.." Constructor" - - end - local b,e = string.find(line,"#") - if method then - local dp,ep = string.find(line, ":") - ep = ep or 1 - if found == 0 then - output = output .."

Methods

" - found_methods = found_methods + 1 - end - output = output.."

".. tab ..line:sub(ep+1).."

"..tab..tab..method - method = nil - end - if b and e then - method = line:sub(e+1).."
" - - --output = output..line:sub(e+1).."
" - end - end - output = output..footer - writeClassFile(name, output) - - -- generate index.html - index = header1.."live_libs_doc"..header2 - index = index.."

live_libs documentation

" - index = index .. "Guidelines for new classes and commenting" - index = index.. "

Classes:

" - for i,v in ipairs(classes) do - index = index..""..v.."
" - end - index = index..footer - writeFile("index", index) - - -end - -function writeClassFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - print(dir) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/shittygames/"..help_filename.."classes/"..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - -function writeFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/shittygames/"..help_filename..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - - diff --git a/LICK/lib/hlpr.lua b/LICK/lib/hlpr.lua deleted file mode 100644 index 6a7d260..0000000 --- a/LICK/lib/hlpr.lua +++ /dev/null @@ -1,350 +0,0 @@ --- hlpr libary: it's not about nice coding, ist about fast and easy coding --- by Rukano and Headchant, 2011 - - --- global math -pi = math.pi -sin = math.sin -deg = math.deg -rad = math.rad - -State = State or {} - -function declare(t) - for i,v in pairs(t) do - if not State[i] then - State[i] = v - _G[i] = State[i] - end - end -end -require "LICK/lib/color" -module(...,package.seeall) - --- syntax shortcuts -checkMode = love.graphics.checkMode -circle = love.graphics.circle -clear = love.graphics.clear -draw = love.graphics.draw -drawq = love.graphics.drawq -getBackgroundColor = love.graphics.getBackgroundColor -getBlendMode = love.graphics.getBlendMode -getCaption =love.graphics.getCaption -getColor = love.graphics.getColor -getColorMode = love.graphics.getColorMode -getFont = love.graphics.getFont -getHeight = love.graphics.getHeight -getLineStipple = love.graphics.getLineStipple -getLineStyle = love.graphics.getLineStyle -getLineWidth = love.graphics.getLineWidth -getMaxPointSize = love.graphics.getMaxPointSize -getModes = love.graphics.getModes -getPointSize = love.graphics.getPointSize -getPointStyle = love.graphics.getPointStyle -getScissor = love.graphics.getScissor -getWidth = love.graphics.getWidth -isCreated = love.graphics.isCreated -line = love.graphics.line -newFont = love.graphics.newFont -newFrameBuffer = love.graphics.newFramebuffer -newImage = love.graphics.newImage -newImageFont = love.graphics.newImageFont -newParticleSystem = love.graphics.newParticleSystem -newQuad = love.graphics.newQuad -newScreenshot = love.graphics.newScreenshot -newSpriteBatch = love.graphics.newSpriteBatch -point = love.graphics.point -polygon = love.graphics.polygon -pop = love.graphics.pop -present = love.graphics.present -print = love.graphics.print -printf = love.graphics.printf -push = love.graphics.push -quad = love.graphics.quad -rectagle = love.graphics.rectangle -reset = love.graphics.reset -rotate = love.graphics.rotate -scale = love.graphics.scale -setBackgroundColor = love.graphics.setBackgroundColor -setBlendMode = love.graphics.setBlendMode -setCaption = love.graphics.setCaption -setColor = love.graphics.setColor -setColorMode = love.graphics.setColorMode -setFont = love.graphics.setFont -setIcon = love.graphics.setIcon -setLine = love.graphics.setLine -setLineStipple = love.graphics.setLineStipple -setLineStyle = love.graphics.setLineStyle -setLineWidth = love.graphics.setLineWidth -setMode = love.graphics.setMode -setPoint = love.graphics.setPoint -setPointSize = love.graphics.setPointSize -setPointStyle = love.graphics.setPointStyle -setRenderTarget = love.graphics.setRenderTarget -setScissor = love.graphics.setScissor -toggleFullscreen = love.graphics.toggleFullscreen -translate = love.graphics.translate -triangle = love.graphics.triangle - - - - - - -function color(r, g,b,a) - local color={} - local alpha=a or 255 - local name=r or "azure" - if type(r) == "string" then - alpha = g or alpha - color = x11_color_table[name] - else - color[1]=r - color[2]=g - color[3]=b - end - color[4]=alpha - return color -end - --- clip withing range -function clip(n,min,max) - return math.min(math.max(n, min or -math.huge), max or math.huge) -end - --- wrap within range, updated version -function wrap(n, min, max) - local min = min or 0 - return ((n - min) % ((max or 0) - min)) + min -end - --- setColor white -function white() - love.graphics.setColor(255,255,255,255) -end - --- setColor black -function black() - love.graphics.setColor(0,0,0,255) -end - --- shorter setColor white -function w() - white() -end - --- shorter setColor black -function b() - black() -end - --- fill the screen with translucent black -function clear_black(alpha) - love.graphics.setColor(0,0,0,alpha) - love.graphics.rectangle("fill", 0,0,800,600) -end - --- shorter clear -function cls(alpha) - clear_black(alpha) -end - --- one time clear -function cls_once() - love.graphics.setColor(0,0,0,255) - love.graphics.rectangle("fill", 0,0,800,600) -end - - --- returns random values from -1 to 1, g sets the equidistance -function norm_random() - return 2 * math.random() - 1 -end - --- shorte norm_random -function n_rnd() - return norm_random() -end - --- drunk, brownnoise/drunk walk: x = x +/- random(width) -function drunk(x, width, g) - x = x or 0 - width = width or 1 - g = g or 100 - return (x + width*norm_random()) -end - - --- drnk, shorter version of drunk, start is only used the first time --- this makes some sense whatsoever... -function drnk(width) - local last = 0 - return function() - last = last + width * norm_random() - return last - end -end - --- scaling functions: - -function linlin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linlin - - local n=n or 0 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case you forgot the parameters... - return n - end - - if clip == "minmax" then - if n <= inMin then - return minoutMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((n-inMin)/(inMax-inMin)) * (outMax-outMin)) + outMin - return n -end - -function linexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = math.pow(outMax/outMin, (n-inMin)/(inMax-inMin)) * outMin - return n -end - -function explin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:explin - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((math.log(n/inMin)) / (math.log(inMax/inMin))) * (outMax-outMin)) + outMin - return n -end - -function expexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:expexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - -- here is the magic! - n = math.pow(outMax/outMin, math.log(n/inMin) / math.log(inMax/inMin)) * outMin - return n -end - --- returns easy sine oscillator -function sin() - local x = 0 - return function(dt) - x = x + (dt or 0) - if x > 2 * pi then x = x - 2*pi end - return math.sin(x) - end -end - --- updates all objects in the _object table -function update_objects(dt) - for i,v in ipairs(_internal_object_table) do - v:update(dt) - end -end - --- rotate around center -function rotateCenter(angle) - local angle=angle or 0 - local w, h = getWidth(), getHeight() - translate(w/2, h/2) - rotate(angle) - translate(-w/2, -h/2) -end - --- return a random table entry -function choose(table) - return table[math.random(#table)] -end diff --git a/LICK/lib/hump/README.md b/LICK/lib/hump/README.md deleted file mode 100644 index 759c724..0000000 --- a/LICK/lib/hump/README.md +++ /dev/null @@ -1,48 +0,0 @@ -HUMP - Helper Utilities for Massive Progression -=============================================== - -__HUMP__ is a small collection of tools for developing games with LÖVE. - -Contents: ------------- - -* *vector.lua*: powerful vector class (pure lua) -* *class.lua*: "class" system supporting function inheritance (pure lua) -* *camera.lua*: translate-, zoom- and rotatable camera -* *gamestate.lua*: class to handle gamestates -* *ringbuffer.lua*: a circular container -* *sequence.lua*: utility to handle ingame cutscenes and such - -Documentation -============= - -You can find the documentation here: [http://vrld.github.com/hump/](http://vrld.github.com/hump/ "project page") - - -License -======= -Yay, *free software*: - -> Copyright (c) 2010 Matthias Richter -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> Except as contained in this notice, the name(s) of the above copyright holders -> shall not be used in advertising or otherwise to promote the sale, use or -> other dealings in this Software without prior written authorization. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/LICK/lib/hump/camera.lua b/LICK/lib/hump/camera.lua deleted file mode 100644 index 4bd8d14..0000000 --- a/LICK/lib/hump/camera.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, require, love = setmetatable, require, love -module(...) -local vector = require(_PACKAGE..'vector') - -local camera = {} -camera.__index = camera - -function new(pos, zoom, rot) - local pos = pos or vector(love.graphics.getWidth(), love.graphics.getHeight()) / 2 - local zoom = zoom or 1 - local rot = rot or 0 - return setmetatable({pos = pos, zoom = zoom, rot = rot}, camera) -end - -function camera:rotate(phi) - self.rot = self.rot + phi -end - -function camera:translate(t) - self.pos = self.pos + t -end -camera.move = camera.translate - -function camera:predraw() - local center = vector(love.graphics.getWidth(), love.graphics.getHeight()) / (self.zoom * 2) - love.graphics.push() - love.graphics.scale(self.zoom) - love.graphics.translate(center:unpack()) - love.graphics.rotate(self.rot) - love.graphics.translate((-self.pos):unpack()) -end - -function camera:postdraw() - love.graphics.pop() -end - -function camera:draw(func) - self:predraw() - func() - self:postdraw() -end - -function camera:toCameraCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = (p - self.pos):rotate_inplace(self.rot) - return vector(p.x * self.zoom + w/2, p.y * self.zoom + h/2) -end - -function camera:toWorldCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = vector((p.x-w/2) / self.zoom, (p.y-h/2) / self.zoom):rotate_inplace(-self.rot) - return p + self.pos -end - -function camera:mousepos() - return self:toWorldCoords(vector(love.mouse.getPosition())) -end - --- camera() as a shortcut to new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/LICK/lib/hump/class.lua b/LICK/lib/hump/class.lua deleted file mode 100644 index 2b014b9..0000000 --- a/LICK/lib/hump/class.lua +++ /dev/null @@ -1,82 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local type, assert, pairs = type, assert, pairs -local tostring, string_format = tostring, string.format -module(...) - -local function __NULL__() end -function new(constructor) - -- check name and constructor - local name = '' - if type(constructor) == "table" then - if constructor.name then name = constructor.name end - constructor = constructor[1] - end - assert(not constructor or type(constructor) == "function", - string_format('%s: constructor has to be nil or a function', name)) - - -- build class - local c = {} - c.__index = c - c.__tostring = function() return string_format("", name) end - c.construct = constructor or __NULL__ - c.Construct = constructor or __NULL__ - c.inherit = inherit - c.Inherit = inherit - - local meta = { - __call = function(self, ...) - local obj = {} - self.construct(obj, ...) - return setmetatable(obj, self) - end, - __tostring = function() return tostring(name) end - } - - return setmetatable(c, meta) -end - -function inherit(class, interface, ...) - if not interface then return end - - -- __index and construct are not overwritten as for them class[name] is defined - for name, func in pairs(interface) do - if not class[name] and type(func) == "function" then - class[name] = func - end - end - - inherit(class, ...) -end - --- class() as shortcut to class.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/LICK/lib/hump/gamestate.lua b/LICK/lib/hump/gamestate.lua deleted file mode 100644 index 746f81b..0000000 --- a/LICK/lib/hump/gamestate.lua +++ /dev/null @@ -1,154 +0,0 @@ ---[[ -Copyright (c) 2010-2011 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local error, assert, love = error, assert, love -module(...) - -local function __NULL__() end --- default gamestate produces error on every callback -local function __ERROR__() error("Gamestate not initialized. Use Gamestate.switch()") end -current = { - enter = __ERROR__, - leave = __NULL__, - update = __ERROR__, - draw = __ERROR__, - focus = __ERROR__, - keyreleased = __ERROR__, - keypressed = __ERROR__, - mousepressed = __ERROR__, - mousereleased = __ERROR__, - joystickpressed = __ERROR__, - joystickreleased = __ERROR__, - quit = __ERROR__, -} - -function new() - return { - enter = __NULL__, - leave = __NULL__, - update = __NULL__, - draw = __NULL__, - focus = __NULL__, - keyreleased = __NULL__, - keypressed = __NULL__, - mousepressed = __NULL__, - mousereleased = __NULL__, - joystickpressed = __NULL__, - joystickreleased = __NULL__, - quit = __NULL__, - } -end - -function switch(to, ...) - assert(to, "Missing argument: Gamestate to switch to") - current:leave() - local pre = current - current = to - return current:enter(pre, ...) -end - -local _update -function update(...) - if _update then _update(...) end - return current:update(...) -end - -local _draw -function draw(...) - if _draw then _draw(...) end - return current:draw(...) -end - -local _focus -function focus(...) - if _focus then _focus(...) end - return current:focus(...) -end - -local _keypressed -function keypressed(...) - if _keypressed then _keypressed(...) end - return current:keypressed(...) -end - -local _keyreleased -function keyreleased(...) - if _keyreleased then _keyreleased(...) end - return current:keyreleased(...) -end - -local _mousepressed -function mousepressed(...) - if _mousereleased then _mousepressed(...) end - return current:mousepressed(...) -end - -local _mousereleased -function mousereleased(...) - if _mousereleased then _mousereleased(...) end - return current:mousereleased(...) -end - -local _joystickpressed -function joystickpressed(...) - if _joystickpressed then _joystickpressed(...) end - return current:joystickpressed(...) -end - -local _joystickreleased -function joystickreleased(...) - if _joystickreleased then _joystickreleased(...) end - return current:joystickreleased(...) -end - -local _quit -function quit(...) - if _quit then _quit(...) end - return current:quit(...) -end - -function registerEvents() - _update = love.update - love.update = update - _draw = love.draw - love.draw = draw - _focus = love.focus - love.focus = focus - _keypressed = love.keypressed - love.keypressed = keypressed - _keyreleased = love.keyreleased - love.keyreleased = keyreleased - _mousepressed = love.mousepressed - love.mousepressed = mousepressed - _mousereleased = love.mousereleased - love.mousereleased = mousereleased - _joystickpressed = love.joystickpressed - love.joystickpressed = joystickpressed - _joystickreleased = love.joystickreleased - love.joystickreleased = joystickreleased - _quit = love.quit - love.quit = quit -end diff --git a/LICK/lib/hump/ringbuffer.lua b/LICK/lib/hump/ringbuffer.lua deleted file mode 100644 index 2b2b3cb..0000000 --- a/LICK/lib/hump/ringbuffer.lua +++ /dev/null @@ -1,99 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable, table = setmetatable, getmetatable, table -module(...) -local ringbuffer = {} -ringbuffer.__index = ringbuffer - -function new(...) - local rb = {} - rb.items = {...} - rb.current = 1 - return setmetatable(rb, ringbuffer) -end - -function ringbuffer:insert(item, ...) - if not item then return end - -- insert rest before self so order is restored, e.g.: - -- {1,<2>,3}:insert(4,5) -> {1,<2>,3}:insert(5) -> {1,<2>,5,3} -> {1,<2>,4,5,3} - self:insert(...) - table.insert(self.items, self.current+1, item) -end - -function ringbuffer:append(item, ...) - if not item then return end - self.items[#self.items+1] = item - return self:append(...) -end - -function ringbuffer:removeAt(k) - -- wrap position - local pos = (self.current + k) % #self.items - while pos < 1 do pos = pos + #self.items end - - -- remove item - local item = table.remove(self.items, pos) - - -- possibly adjust current pointer - if pos < self.current then self.current = self.current - 1 end - if self.current > #self.items then self.current = 1 end - - -- return item - return item -end - -function ringbuffer:remove() - return table.remove(self.items, self.current) -end - -function ringbuffer:get() - return self.items[self.current] -end - -function ringbuffer:size() - return #self.items -end - -function ringbuffer:next() - self.current = (self.current % #self.items) + 1 - return self:get() -end - -function ringbuffer:prev() - self.current = self.current - 1 - if self.current < 1 then - self.current = #self.items - end - return self:get() -end - --- Ringbuffer() as a shortcut to Ringbuffer.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/LICK/lib/hump/timer.lua b/LICK/lib/hump/timer.lua deleted file mode 100644 index 2ce460d..0000000 --- a/LICK/lib/hump/timer.lua +++ /dev/null @@ -1,83 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local assert, type = assert, type -local pairs, ipairs = pairs, ipairs -local min = math.min -module(...) - -functions = {} -function update(dt) - local to_remove = {} - for func, delay in pairs(functions) do - delay = delay - dt - if delay <= 0 then - to_remove[#to_remove+1] = func - else - functions[func] = delay - end - end - for _,func in ipairs(to_remove) do - functions[func] = nil - func(func) - end -end - -function add(delay, func) - assert(type(func) == "function", "second argument needs to be a function") - functions[func] = delay -end - -function addPeriodic(delay, func, count) - assert(type(func) == "function", "second argument needs to be a function") - if count then - return add(delay, function(f) func(func) count = count - 1 if count > 0 then add(delay, f) end end) - end - return add(delay, function(f) func(func) add(delay, f) end) -end - -function clear() - functions = {} -end - -function Interpolator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - return t <= length and func((t-dt)/length, ...) or nil - end -end - -function Oscillator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - while t > length do t = t - length end - return func(t/length, ...) - end -end diff --git a/LICK/lib/hump/vector.lua b/LICK/lib/hump/vector.lua deleted file mode 100644 index b84f948..0000000 --- a/LICK/lib/hump/vector.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local assert, type, tonumber = assert, type, tonumber -local sqrt, cos, sin = math.sqrt, math.cos, math.sin -module(...) - -local vector = {} -vector.__index = vector - -function new(x,y) - local v = {x = x or 0, y = y or 0} - setmetatable(v, vector) - return v -end - -function isvector(v) - return getmetatable(v) == vector -end - -function vector:clone() - return new(self.x, self.y) -end - -function vector:unpack() - return self.x, self.y -end - -function vector:__tostring() - return "("..tonumber(self.x)..","..tonumber(self.y)..")" -end - -function vector.__unm(a) - return new(-a.x, -a.y) -end - -function vector.__add(a,b) - assert(isvector(a) and isvector(b), "Add: wrong argument types ( expected)") - return new(a.x+b.x, a.y+b.y) -end - -function vector.__sub(a,b) - assert(isvector(a) and isvector(b), "Sub: wrong argument types ( expected)") - return new(a.x-b.x, a.y-b.y) -end - -function vector.__mul(a,b) - if type(a) == "number" then - return new(a*b.x, a*b.y) - elseif type(b) == "number" then - return new(b*a.x, b*a.y) - else - assert(isvector(a) and isvector(b), "Mul: wrong argument types ( or expected)") - return a.x*b.x + a.y*b.y - end -end - -function vector.__div(a,b) - assert(isvector(a) and type(b) == "number", "wrong argument types (expected / )") - return new(a.x / b, a.y / b) -end - -function vector.__eq(a,b) - return a.x == b.x and a.y == b.y -end - -function vector.__lt(a,b) - return a.x < b.x or (a.x == b.x and a.y < b.y) -end - -function vector.__le(a,b) - return a.x <= b.x and a.y <= b.y -end - -function vector.permul(a,b) - assert(isvector(a) and isvector(b), "permul: wrong argument types ( expected)") - return new(a.x*b.x, a.y*b.y) -end - -function vector:len2() - return self * self -end - -function vector:len() - return sqrt(self*self) -end - -function vector.dist(a, b) - assert(isvector(a) and isvector(b), "dist: wrong argument types ( expected)") - return (b-a):len() -end - -function vector:normalize_inplace() - local l = self:len() - self.x, self.y = self.x / l, self.y / l - return self -end - -function vector:normalized() - return self / self:len() -end - -function vector:rotate_inplace(phi) - local c, s = cos(phi), sin(phi) - self.x, self.y = c * self.x - s * self.y, s * self.x + c * self.y - return self -end - -function vector:rotated(phi) - return self:clone():rotate_inplace(phi) -end - -function vector:perpendicular() - return new(-self.y, self.x) -end - -function vector:projectOn(v) - assert(isvector(v), "invalid argument: cannot project onto anything other than a new.") - return (self * v) * v / v:len2() -end - -function vector:cross(other) - assert(isvector(other), "cross: wrong argument types ( expected)") - return self.x * other.y - self.y * other.x -end - --- vector() as shortcut to vector.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/LICK/lib/images/circle.png b/LICK/lib/images/circle.png deleted file mode 100755 index 8f9ac298933bf58968999f36cefb08dc3d6db2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 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 QVE_OC07*qoM6N<$f~Wjp+5i9m diff --git a/LICK/lib/images/holger.png b/LICK/lib/images/holger.png deleted file mode 100755 index 7e78b87226d0b368fe2d05941677a0b9119b2d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9945 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

>$y9lIvA!1##Q};vU!jjQNqnKA-NSS~y2H9t{ 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 Hu0mjfVRhi| diff --git a/LICK/lib/images/spiral2.png b/LICK/lib/images/spiral2.png deleted file mode 100755 index d7b9627786701053779e76ece6b0687bbe71de9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17174 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 diff --git a/LICK/lib/images/star.png b/LICK/lib/images/star.png deleted file mode 100755 index 85395e81de310b7b5af0dc3f68dcb48e6718712d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -local socket = require "socket" -local base = _G -local string = require("string") -local vstruct = require "LICK/lib/loveosc/vstruct" -local pack = vstruct.pack -local upack = vstruct.unpack - --------------------------------- --- some constants --------------------------------- - -osc.client = {} -osc.client.host = "localhost" -osc.client.ip = nil -osc.client.port = 57110 -osc.client.timeout = 0 - -PROTOCOL = "OSC/1.0" - -ADJUSTMENT_FACTOR = 2208988800 - -IMMEDIATE = string.rep('0', 31) .. '1' - - -function osc.client:send( data ) - local ip, port = osc.client.ip or assert(socket.dns.toip(osc.client.host)), osc.client.port - -- create a new UDP object - local udp = assert(socket.udp()) - udp:settimeout(0) - - --print(encode(data)) - assert(udp:sendto(encode(data), ip, port), "could not send data") - --assert(udp:sendto(data, ip, port), "could not send data") - - -- retrieve the answer and print results, warning: crashes love - --print(udp:receive() or "") -end - - --------------------------------- --- interface functions: --- decode(string) --- and encode(table) --------------------------------- - -function decode(data) - if #data == 0 then - return nil - end - if string.match(data, "^#bundle") then - return decode_bundle(data) - else - return decode_message(data) - end -end - - -function encode(data) - local msg = "" - local idx = 1 - if data == nil then - return nil - end - - if data[1] == "#bundle" then - msg = msg .. encode_string(data[1]) - --print("1 "..msg.."\n") - msg = msg .. encode_timetag(data[2]) - --print("2 "..msg.."\n") - idx = 3 - while idx <= #data do - local submsg = encode(data[idx]) - msg = msg .. encode_int(#submsg) .. submsg - --print(idx.." "..submsg.."\n") - idx = idx + 1 - end - return msg - else - local typestring = "," - local encodings = "" - idx = idx + 1 - msg = msg .. encode_string(data[1]) - for t, d in iter_pairwise(data, idx) do - typestring = typestring .. t - encodings = encodings .. collect_encoding_for_message(t, d) - end - --print("else "..msg..encode_string(typestring) .. encodings.."\n") - - return msg .. encode_string(typestring) .. encodings - end -end - - --------------------------------- --- auxilliary functions --------------------------------- - -digits = {} -for i=0,9 do digits[i] = string.char(string.byte('0')+i) end -for i=10,36 do digits[i] = string.char(string.byte('A')+i-10) end - -function numberstring(number, bas) - local s = "" - repeat - local remainder = base.math.mod(number,bas) - s = digits[remainder]..s - number = (number-remainder)/bas - until number==0 - return s -end - - -function next_string(astring) - -- this is a workaraound because the lua pttern matching is - -- not as powerful as pcre and I did not want to include another - -- dependecy to an external re lib - local pos = 0 - local num_nzero = 0 - local num_zero = 0 - local result = "" - if astring == nil then - -- ensure that string is not empty - base.error("error: string is empty - probably malformated message") - end - -- we match every character with the help of gmatch - for m in string.gmatch(astring, ".") do - pos = pos + 1 - -- and then check if it is correctly padded with '\0's - if m ~= '\0' and num_zero == 0 then - num_nzero = (num_nzero + 1) % 4 - result = result .. m - elseif num_zero ~= 0 and (num_zero + num_nzero) % 4 == 0 then - return result, pos - elseif m == '\0' then - num_zero = num_zero + 1 - result = result .. m - else - return nil - end - end -end - -function iter_pairwise(atable, startvalue) - local index = startvalue - 2 - return function() - index = index + 2 - return atable[index], atable[index+1] - end -end - -function collect_encoding_for_message(t, data) - if t == 'i' then - return encode_int(data) - elseif t == 'f' then - return encode_float(data) - elseif t == 's' then - return encode_string(data) - elseif t == 'b' then - return encode_blob(data) - end -end - -function collect_decoding_from_message(t, data, message) - table.insert(message, t) - if t == 'i' then - table.insert(message, decode_int(data)) - return string.sub(data, 5) - elseif t == 'f' then - table.insert(message, decode_float(data)) - return string.sub(data, 5) - elseif t == 's' then - local match, last = next_string(data) - table.insert(message, match) - return string.sub(data, last) - elseif t == 'b' then - local length = decode_int(data) - table.insert(message, string.sub(data, 4, length)) - return string.sub(data, 4 + length + 1) - end -end - -function get_addr_from_data(data) - local addr_raw_string,last = next_string(data) - local result = "" - if addr_raw_string == nil then - -- if we could not find an addr something went wrong - base.error("error: could not extract address from OSC message") - end - -- delete possible trailing zeros - for t in string.gmatch(addr_raw_string, "[^%z]") do - result = result .. t - end - return result, string.sub(data, last) -end - -function get_types_from_data(data) - local typestring, last = next_string(data) - local result = {} - if typestring == nil then - return {} - end - -- split typestring into an iterable table - for t in string.gmatch(typestring, "[^,%z]") do - table.insert(result, t) - end - return result, string.sub(data, last) -end - --------------------------------- --- decoding functions --------------------------------- - -function decode_message(data) - local types, addr, tmp_data = nil - local message = {} - addr, tmp_data = get_addr_from_data(data) - types, tmp_data = get_types_from_data(tmp_data) - -- ensure that we at least found something - if addr == nil or types == nil then - return nil - end - for _,t in base.ipairs(types) do - tmp_data = collect_decoding_from_message(t, tmp_data, message) - end - return message -end - - -function decode_bundle(data) - local match, last = next_string(data) - local tmp_data = nil - local msg = {} - local sec, frac - -- skip first string data since it will only contian #bundle - tmp_data = string.sub(data, 9) - -- check that there is a part of the message left - if not tmp_data then - return nil - end - table.insert(msg, "#bundle") - _, sec, frac = upack("> u4 > u4", {string.sub(tmp_data, 1, 8)}) - -- note this is an awful way of decoding to a bin string and - -- then decoding the frac again TODO: make this nicer - frac = numberstring(frac, 2) - if sec == 0 and frac == IMMEDIATE then - table.insert(msg, 0) - else - table.insert(msg, sec - ADJUSTMENT_FACTOR + decode_frac(frac) ) - end - tmp_data = string.sub(tmp_data, 9) - while #tmp_data > 0 do - local length = decode_int(string.sub(tmp_data,1,4)) - table.insert(msg, decode(string.sub(tmp_data, 5, 4 + length))) - tmp_data = string.sub(tmp_data, 9 + length) - end - return msg -end - -function decode_frac(bin) - local frac = 0 - for i=#bin,1 do - frac = (frac + string.sub(bin, i-1, i)) / 2 - end - return frac -end - -function decode_float(bin) - local pos, res = upack("> f4", {bin}) - return res -end - -function decode_int(bin) - local pos, res = upack("> i4", {bin} ) - return res -end - --------------------------------- --- encoding --------------------------------- - -function encode_string(astring) - local fillbits = (4 - #astring % 4) - return astring .. string.rep('\0', fillbits) -end - -function encode_int(num) - return pack("> i4",{ num }) -end - -function encode_blob(blob) - return encode_int(#blob) .. encode_string(#blob) -end - -function encode_timetag(tpoint) - if tpoint == 0 then - return IMMEDIATE - else - local sec = math.floor(tpoint) - local frac = tpoint - sec - - return pack("> u4 > u4", {sec + ADJUSTMENT_FACTOR , encode_frac(frac)}) - - end -end - - - -function encode_frac(num) - local bin = "" - local frac = num - while #bin < 32 do - bin = bin .. base.math.floor(frac * 2) - frac = (frac * 2) - base.math.floor(frac * 2) - end - return bin -end - -function encode_float(num) - return pack("> f4", {num}) -end diff --git a/LICK/lib/loveosc/init.lua b/LICK/lib/loveosc/init.lua deleted file mode 100644 index d7f0bfb..0000000 --- a/LICK/lib/loveosc/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -osc = {} -require "LICK/lib/loveosc/client" -require "LICK/lib/loveosc/server" diff --git a/LICK/lib/loveosc/server.lua b/LICK/lib/loveosc/server.lua deleted file mode 100644 index 3a9a93f..0000000 --- a/LICK/lib/loveosc/server.lua +++ /dev/null @@ -1,81 +0,0 @@ ---[[ - -- luaosc Copyright (C) 2009 Jost Tobias Springenberg -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -require "socket" - -osc.server = {} -osc.server.host = "localhost" -osc.server.port = 7771 -osc.server.socket = socket.udp() or error('error could not create lua socket object') -osc.server.socket:setsockname(osc.server.host, osc.server.port) -osc.server.socket:settimeout(0) - --- call this in LÖVE update -function osc.server:update(dt) - - local message, from = osc.server.socket:receive(1024) - -- invoke handler function - if message ~= nil then - local success, result = pcall(decode, message) - if not success then - print("Error in decoding: \n" .. result) - else - success, result = pcall(handle, from, result) - if not success then - print("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - -end - - --- use this to start the server in lua only (not with LÖVE!) -function osc.server:start() - local length = 1024 - while 1 do - local message, from = self.socket:receivefrom(1024) - -- invoke handler function - if message ~= nil then - local success, result = base.pcall(osc.decode, message) - if not success then - base.io.stderr:write("Error in decoding: \n" .. result) - else - success, result = base.pcall(self.handle, from, result) - if not success then - base.io.stderr:write("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - end - end - - - -function osc.server:setHandler(hdle) - handle = hdle -end diff --git a/LICK/lib/loveosc/vstruct/CHANGES b/LICK/lib/loveosc/vstruct/CHANGES deleted file mode 100755 index ea42ce0..0000000 --- a/LICK/lib/loveosc/vstruct/CHANGES +++ /dev/null @@ -1,30 +0,0 @@ -1.0 ---- -Bugfixes to read error handling -Ability to return unpacked values rather than tables - -1.0 beta 4 ----------- -Added the ability to say 's' with no width to read until EOF. -Modified struct.unpack and struct.pack to return the number of bytes -read/written as a second value. Note that this is not the same as the r/w -pointer delta if seeks are involved. - -1.0 beta 3 ----------- -Lots of bugfixing and general cleanup -Improved error reporting -API name changes - -1.0 beta 2 ----------- -Added the counted string format "c". -Added float and double support, courtesy of Peter "Corsix" Cawley. -Updated the test framework. -Fixed a bug in format m that could result in data loss when manipulating fields -of 7 bytes or more width. - - -1.0 beta 1 ----------- -Released to the world. diff --git a/LICK/lib/loveosc/vstruct/COPYING b/LICK/lib/loveosc/vstruct/COPYING deleted file mode 100755 index 430bce8..0000000 --- a/LICK/lib/loveosc/vstruct/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2008 Ben "ToxicFrog" Kelly -FP module copyright 2008 Peter "Corsix" Cawley - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICK/lib/loveosc/vstruct/README b/LICK/lib/loveosc/vstruct/README deleted file mode 100755 index e274888..0000000 --- a/LICK/lib/loveosc/vstruct/README +++ /dev/null @@ -1,290 +0,0 @@ -Contents -======== -1. Overview -2. API -3. Warning! -4. The Format String - Naming - Grouping - Repetition -5. Format Specifiers -6. Credits - - -1. Overview -=========== -VStruct is a library for Lua 5.1. It provides functions for manipulating binary -data, in particular for unpacking binary files or byte buffers into Lua values -and for packing Lua values back into files or buffers. Supported data types -include: - - signed and unsigned integers of arbitrary byte width - - booleans and bitmasks - - plain and null-terminated strings - - fixed and floating point reals (the latter requires C module support) -In addition, the library supports seeking, alignment, and byte order controls, -repetition, grouping of data into tables, and naming of values within tables. - - - -2. API -====== -exports: - vstruct.pack(fmt, [fd], data) - vstruct.unpack(fmt, , [unpacked]) - vstruct.explode(int) - vstruct.implode(table) - vstruct.cursor(string) - vstruct.compile.read(format) - vstruct.compile.write(format) - -pack takes a format string and a table of data and packs the contents into a -buffer. If the fd argument is present, it will write the data directly to it -using standard file io methods (write and seek), and return the fd; otherwise -it will construct and return a string. In either case it also returns (as a -second value) the number of bytes written - note that if the format involved -seeks, this is not the same as the amount by which the write pointer moved -or the size of the packed string. - -unpack takes a format string and a buffer or file to unpack from, and returns -the unpacked data as a table. It also returns (as a second value) the number of -bytes read - note that if the format string involved seeks, this is not the same -as the difference between read pointer positions. If the _unpacked_ argument is -true, it will return the unpacked data as a series of values rather than as a -table, equivalent to using the standard Lua function unpack() on the return -value. Note that this means it will not return the number of bytes read as an -additional value. - -explode converts a bitmask into a list of booleans, and implode does the -converse. In such lists, list[1] is the least significant bit, and list[n] the -most significant. - -cursor wraps a string in something that looks, at first glance, like a file. -This permits strings to be wrapped and passed to the vstruct IO functions. The -wrapped string supports :seek, and has limited support for :read (the only -supported calling mode is :read(num_bytes)) and :write (as :write(buffer)). - -compile.read takes a format string and returns a function, which can later be -passed a file (or file-like object - see vstruct.cursor) to perform a read -operation. In effect, the following code: - f = vstruct.compile.read(fmt) - d = f(fd) -Is equivalent to: - d = vstruct.unpack(fd, fmt) -f can of course be called repeatedly, with different or the same fds each time. - -compile.write is the converse of compile.read. The emitted function expects a -file and a table of data elements, so that: - f = vstruct.compile.write(fmt) - f(fd, data) -Is equivalent to: - vstruct.pack(fd, fmt, data) -As with compile.read, the emitted function is fully re-usable. - - -3. Warning! -=========== -When reading and writing numeric formats, vstruct is inherently limited by lua's -number format, which is by default the IEEE 754 double. What this means in -practice is that formats cipPu may be subject to data loss when read in widths -of 7 bytes or more, if they contain more than 52 significant bits. (The same is -true of numeric constants declared in Lua itself, of course, and other libraries -which store values in lua numbers). -Formats bfmsxz are unaffected by this, as they either do not use lua numbers or -are guaranteed to fit inside them. - -4. The Format String -==================== -The format string contains any number of endianness controls, seek controls, -format specifiers, and grouping/naming sequences, seperated by whitespace, -commas, or semicolons (or any mix thereof, although you are encouraged to choose -one and stick to it for the sake of consistency). Each of these is detailed -below. - -In the documentation below, the convention is that A represents an address and W -a width in bytes. At present only base-10 numerals are supported. - - -Naming ------- -Under normal operation, when unpacking, the library simply stores unpacked -values sequentially into a list, which is returned. Similarly, when packing, it -expects a list of values which will be packed in order. However, values can be -named, in which case the unpacked value will be stored in a field with that -name, and when packing, it will use the value stored with that key. This is done -by prefixing the format specifier with the name (which can be any sequence of -letters, numbers, and _, provided it does not start with a number) followed by a -':'. For example, the following format would generate a table with three keys, -'x', 'y', and 'z': - "x:u4 y:u4 z:u4" -And, when packing, would expect a table with those three keys and store their -corresponding values. - -If the same name is specified multiple times, or is combined with repetition -(see below), only the last read value is stored there. - -Named and anonymous values can be freely mixed; the named values will be -assigned to their given fields and the anonymous ones to sequential indices. - -Grouping --------- -Rather than generating or expecting a flat table, the library can be instructed to -create or read from a table containing subtables. This is done by surrounding the -group of values you wish to be packed with '{' and '}' in the format string. For example, -the following format string: - "{ u4 i4 } { s32 u4 }" -Would, rather than generating a list of four values, generate a list containing two -lists of two values each. -Similarly, when packing, it would expect not a flat list, but a list of sublists, from -which the values to be packed will be drawn. - -Groups can be named, so formats like: - "flags:m1 coords:{ x:u4 y:u4 z:u4 }" -Are permitted and meaningful. - - -Repetition ----------- -A {} group can be repeated by prefixing or suffixing it with a count, seperated -from the group by a '*'. For example: - "4 * { u4 }" - "{ u4 } * 4" - "{ u4 } { u4 } { u4 } { u4 }" -Are all equivalent. Note that the whitespace in the above examples is optional. -In cases where you want to repeat format specifiers without implying a grouping, -you can use (). For example: - "4 * (u4 b1)" -Is equivalent to: - "u4 b1 u4 b1 u4 b1 u4" -Like grouping, these can be nested. - - -5. Format Specifiers -==================== - -Endianness Controls -------------------- -The formats i, m, and u are affected by the endianness setting, which controls -the order in which bytes are read and written within a field. The following -characters in a format string adjust the endianness setting: - -< - Sets the endianness to little-endian (eg, Intel processors) -> - Sets the endianness to big-endian (eg, PPC and Motorola processors) -= - Sets the endianness to the native endianness. - - -Seek Controls -------------- -These characters are used to seek to specific locations in the input or output. -Note that they only work on buffers or file-like objects that support the seek() -method; for streams which cannot be sought on, use the 'x' (skip/null-pad) -data format instead. - -@A - Seek to absolute address A. -+A - Seek forward A bytes. --A - Seek backwards A bytes. -aW - Align to word width W (ie, seek to the next address which is a multiple of W) - - -Data Format Specifiers ----------------------- -bW Boolean. - Read: as uW, but returns true if the result is non-zero and false otherwise. - Write: as uW with input 1 if true and 0 otherwise. - -cW Counted string. - Read: uW to determine the length of the string W', followed by sW'. - Write: the length of the string as uW, followed by the string itself. - The counted string is a common idiom where a string is immediately prefixed - with its length, as in: - size_t len; - char[] str; - The counted string format can be used to easily read and write these. The - width provided is the width of the len field, which is treated as an - unsigned int. Only the string itself is returned (when unpacking) or - required (when packing). - The len field is affected by endianness, as in format u. - -fW IEEE 754 floating point. - Valid widths are 4 (float) and 8 (double). No quads yet, sorry! - Affected by endianness. - -iW Signed integer. - Read: a signed integer of width W bytes. - Write: a signed integer of width W bytes. - Floating point values will be truncated. - Affected by endianness. - -mW Bitmask. - Read: as uW, but explodes the result into a list of booleans, one per bit. - Write: implodes the input value, then writes it as uW. - Affected by endianness. - See also: vstruct.implode, vstruct.explode. - -pW Signed fixed point rational. - Width is in the format "I.F"; the value before the dot is the number of - bytes in the integer part, and the value after, in the fractional part. - Read: a fixed point rational of I+F bytes. - Write: a fixed point rational of I+F bytes. Values which cannot be exactly - represented in the specified width are truncated. - Affected by endianness. - -PW Signed fixed point rational with bit-aligned subfields - Equivalent to pW, except that the decimal point does not need to be byte - aligned; for example, formats such as P20.12 are possible. - Note that underlying reads must still occur in byte multiples. Using a W - such that I+F is not a multiple of 8 is an error. - -sW String. - Read: reads exactly W bytes and returns them as a string. If W is omitted, - reads until EOF. - Write: - If W is omitted, uses the string length. - If W is shorter than the string length, truncates the string. - If W is greater than the string length, null pads the string. - -uW Unsigned integer. - Read: an unsigned integer of width W bytes. - Write: an unsigned integer of width W bytes. - Floating point values will be truncated. - Negative values will be taken absolute. - Affected by endianness. - -xW Skip/pad. - Read: read and discard the next W bytes. - Write: write W zero bytes. - -zW Null terminated string. - Read: reads exactly W bytes. Returns everything up to the first zero byte. - If W is omitted, reads up to the next zero byte. - Write: writes exactly W bytes. - If the input is shorter than W, zero pads the output. - If as long or longer, truncates to W-1 and writes a zero byte at the end. - If W is omitted, uses the string length plus one (ie, writes the string - out entire and then null terminates it). - - - -6. Credits -========== - While most of the library code was written by me (Ben Kelly), the existence -of this library owes itself to many others: - The floating point code was contributed by Peter Cawley on lua-l. - The original inspiration came from Roberto Ierusalimschy's "struct" library -and Luiz Henrique de Figueiredo's "lpack" library, as well as the "struct" -available in Python. - sanooj, from #lua, has done so much testing and bug reporting that at this -point he's practically a co-author. - The overall library design and interface are the result of much discussion -with rici, sanooj, Keffo, snogglethorpe, Spark, kozure, Vornicus, McMartin, and -probably several others I've forgotten about on IRC (#lua on freenode and #code -on nightstar). - Finally, without Looking Glass Studios to make System Shock, and Team TSSHP -(in particular Jim "hairyjim" Cameron) to reverse engineer it, I wouldn't have -had a reason to write this library in the first place. diff --git a/LICK/lib/loveosc/vstruct/common.lua b/LICK/lib/loveosc/vstruct/common.lua deleted file mode 100755 index 841b5c1..0000000 --- a/LICK/lib/loveosc/vstruct/common.lua +++ /dev/null @@ -1,48 +0,0 @@ --- shared formats - seeking, endianness --- these should all return nil so that they do not mutate the data list --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local common = {} - --- determine if the host system is big-endian or not, by dumping an empty --- function and looking at the endianness flag --- this is kind of hackish -local function bigendian() - return string.byte(string.dump(function() end)) == string.char(0x00) -end -common.is_bigendian = bigendian() - --- seek controls -function common.seekto(fd, w) - fd:seek("set", w) -end - -function common.seekforward(fd, w) - fd:seek("cur", w) -end - -function common.seekback(fd, w) - fd:seek("cur", -w) -end - -function common.a(fd,w) - local a = fd:seek() - if a % w ~= 0 then - fd:seek("cur", w - (a % w)) - end -end - --- endianness controls -function common.littleendian(fd, w) - common.is_bigendian = false -end - -function common.bigendian(fd, w) - common.is_bigendian = true -end - -function common.hostendian(fd, w) - common.is_bigendian = bigendian() -end - -return common diff --git a/LICK/lib/loveosc/vstruct/compile.lua b/LICK/lib/loveosc/vstruct/compile.lua deleted file mode 100755 index 942f743..0000000 --- a/LICK/lib/loveosc/vstruct/compile.lua +++ /dev/null @@ -1,134 +0,0 @@ --- functions for turning a format string into a callable function --- they work by calling parse(), passing it the format string and --- a table of code generators appropriate for whether we are reading --- or writing. --- The resulting code is then prefixed with some setup code and postfixed --- with a return value and loadstring() is called on it to generate a function --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local require,loadstring,setfenv,type,select,unpack,setmetatable - = require,loadstring,setfenv,type,select,unpack,setmetatable - -local print,assert,error,xpcall,pairs,where - = print,assert,error,xpcall,pairs,debug.traceback - -module((...)) - -local parse = require(_PACKAGE.."parser") - -local function nulsafe_error(s) - return error(s:gsub('%z', '_')) -end - -local function xpcall2(f, err, ...) - local args = {n=select('#', ...), ...} - return xpcall(function() return f(unpack(args, 1, args.n)) end, err) -end - -local function err_generate(message, format, trace) - nulsafe_error([[ -struct: internal error in code generator -This is an internal error in the struct library -Please report it as a bug and include the following information: --- error message -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function err_compile(message, format, source) - nulsafe_error([[ -struct: syntax error in emitted lua source -This is an internal error in the struct library -Please report it as a bug and include the following information: --- loadstring error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]) -end - -local function err_execute(message, format, source, trace) - nulsafe_error([[ -struct: runtime error in generated function -This is at some level an internal error in the struct library -It could be a genuine error in the emitted code (in which case this is a code -generation bug) -Alternately, it could be that you gave it a malformed format string, a bad -file descriptor, or data that does not match the given format (in which case -it is an argument validation bug and you should be getting an error anyways). -Please report this as a bug and include the following information: --- execution error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function compile(format, gen, env) - local status,source = xpcall(function() - return parse(format, gen, true) - end, - function(message) - return { message, where("",2) } - end) - - if not status then - if type(source[1]) == "function" then - error(source[1]()..source[2]) - end - err_generate(source[1], format, source[2]) - end - - local fn,err = loadstring(source) - - if not fn then - err_compile(err, format, source) - end - - setfenv(fn, env) - - local fn = function(...) - local status,ret,len = xpcall2(fn, function(message) - return { message, where("",2) } - end, ...) - - -- call succeeded without errors - if status then return ret,len end - - local message,where = ret[1],ret[2] - - -- call generated a deliberate error; call the provided closure - -- it will either emit an error code or re-throw - if type(message) == "function" then return nil,message() end - - -- call generated an internal error; re-throw with extra debug info - err_execute(message, format, source, where) - end - - return fn -end - -local gen_unpack = require(_PACKAGE.."gen_unpack") -local io_unpack = require(_PACKAGE.."io_unpack") - -function _M.unpack(format) - return compile(format, gen_unpack, io_unpack) -end - -local gen_pack = require(_PACKAGE.."gen_pack") -local io_pack = require(_PACKAGE.."io_pack") - -function _M.pack(format) - return compile(format, gen_pack, io_pack) -end - -return _M diff --git a/LICK/lib/loveosc/vstruct/cursor.lua b/LICK/lib/loveosc/vstruct/cursor.lua deleted file mode 100755 index cd913af..0000000 --- a/LICK/lib/loveosc/vstruct/cursor.lua +++ /dev/null @@ -1,80 +0,0 @@ --- cursor - a wrapper for strings that makes them look like files --- exports: seek read write --- read only supports numeric amounts --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local cursor = {} - --- like fseek --- seeking past the end of the string is permitted --- reads will return EOF, writes will fill in the intermediate space with nuls --- seeking past the start of the string is a soft error -function cursor:seek(whence, offset) - whence = whence or "cur" - offset = offset or 0 - - if whence == "set" then - self.pos = offset - elseif whence == "cur" then - self.pos = self.pos + offset - elseif whence == "end" then - self.pos = #self.str + offset - else - error "bad argument #1 to seek" - end - - if self.pos < 0 then - self.pos = 0 - return nil,"attempt to seek prior to start of file" - end - - return self.pos -end - --- read n bytes from the current position --- reads longer than the string can satisfy return as much as it can --- reads while the position is at the end return nil,"eof" -function cursor:read(n) - if self.pos >= #self.str then - return nil,"eof" - end - - if n == "*a" then - n = #self.str - end - - local buf = self.str:sub(self.pos+1, self.pos + n) - self.pos = math.min(self.pos + n, #self.str) - - return buf -end - --- write the contents of the buffer at the current position, overwriting --- any data already present --- if the write pointer is past the end of the string, also fill in the --- intermediate space with nuls -function cursor:write(buf) - if self.pos > #self.str then - self.str = self.str .. string.char(0):rep(self.pos - #self.str) - end - - self.str = self.str:sub(1, self.pos) - .. buf - .. self.str:sub(self.pos + #buf + 1, -1) - self.pos = self.pos + #buf - - return self -end - -function cursor:__call(source) - assert(type(source) == "string", "invalid first argument to cursor()") - return setmetatable( - { str = source, pos = 0 }, - cursor) -end - -cursor.__index = cursor - -setmetatable(cursor, cursor) - -return cursor diff --git a/LICK/lib/loveosc/vstruct/fp.lua b/LICK/lib/loveosc/vstruct/fp.lua deleted file mode 100755 index 5da81da..0000000 --- a/LICK/lib/loveosc/vstruct/fp.lua +++ /dev/null @@ -1,121 +0,0 @@ --- floating point module --- Copyright © 2008 Peter "Corsix" Cawley and Ben "ToxicFrog" Kelly; see COPYING - -local fp = {} -local name = (...):gsub('%.[^%.]+$', '') -local struct = require (name) -local common = require (name..".common") - -local function reader(data, size_exp, size_fraction) - local fraction, exponent, sign - local endian = common.is_bigendian and ">" or "<" - - -- Split the unsigned integer into the 3 IEEE fields - local bits = struct.unpack(endian.."m"..#data, data, true) - local fraction = struct.implode({unpack(bits, 1, size_fraction)}, size_fraction) - local exponent = struct.implode({unpack(bits, size_fraction+1, size_fraction+size_exp)}, size_exp) - local sign = bits[#bits] and -1 or 1 - - -- special case: exponent is all 1s - if exponent == 2^size_exp-1 then - -- significand is 0? +- infinity - if fraction == 0 then - return sign * math.huge - - -- otherwise it's NaN - else - return 0/0 - end - end - - -- restore the MSB of the significand, unless it's a subnormal number - if exponent ~= 0 then - fraction = fraction + (2 ^ size_fraction) - else - exponent = 1 - end - - -- remove the exponent bias - exponent = exponent - 2 ^ (size_exp - 1) + 1 - - -- Decrease the size of the exponent rather than make the fraction (0.5, 1] - exponent = exponent - size_fraction - - return sign * math.ldexp(fraction, exponent) -end - -local function writer(value, size_exp, size_fraction) - local fraction, exponent, sign - local width = (size_exp + size_fraction + 1)/8 - local endian = common.is_bigendian and ">" or "<" - local bias = 2^(size_exp-1)-1 - - if value < 0 - or 1/value == -math.huge then -- handle the case of -0 - sign = true - value = -value - else - sign = false - end - - -- special case: value is infinite - if value == math.huge then - exponent = bias+1 - fraction = 0 - - -- special case: value is NaN - elseif value ~= value then - exponent = bias+1 - fraction = 2^(size_fraction-1) - - --special case: value is 0 - elseif value == 0 then - exponent = -bias - fraction = 0 - - else - fraction,exponent = math.frexp(value) - - -- subnormal number - if exponent+bias <= 1 then - fraction = fraction * 2^(size_fraction+(exponent+bias)-1) - exponent = -bias - - else - -- remove the most significant bit from the fraction and adjust exponent - fraction = fraction - 0.5 - exponent = exponent - 1 - - -- turn the fraction into an integer - fraction = fraction * 2^(size_fraction+1) - end - end - - - -- add the exponent bias - exponent = exponent + bias - - local bits = struct.explode(fraction) - local bits_exp = struct.explode(exponent) - for i=1,size_exp do - bits[size_fraction+i] = bits_exp[i] - end - bits[size_fraction+size_exp+1] = sign - - return struct.pack(endian.."m"..width, {bits}) -end - --- Create readers and writers for the IEEE sizes -fp.sizes = { - [4] = {1, 8, 23}, - [8] = {1, 11, 52}, -} - -fp.r = {} -fp.w = {} -for width, sizes in pairs(fp.sizes) do - fp.r[width] = function(uint) return reader(uint, sizes[2], sizes[3]) end - fp.w[width] = function(valu) return writer(valu, sizes[2], sizes[3]) end -end - -return fp diff --git a/LICK/lib/loveosc/vstruct/gen_pack.lua b/LICK/lib/loveosc/vstruct/gen_pack.lua deleted file mode 100755 index 9449c85..0000000 --- a/LICK/lib/loveosc/vstruct/gen_pack.lua +++ /dev/null @@ -1,132 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd,data = ... -local stack = {} -local index = 1 -local start = fd:seek() -local len = 0 - -local function push(key) - if not key then - key = index - index = index + 1 - end - - stack[#stack+1] = { index, data } - data = data[key] - index = 1 -end - -local function pop(key) - local saved = stack[#stack] - stack[#stack] = nil - - index = saved[1] - data = saved[2] -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return fd,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- <>(fd, data[index], <>) --- ++index -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data[index], "..args..")\nindex = index+1" -end - --- table: --- push() --- <> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - --- named atom: --- <>(fd, data.<>, <>) -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data."..token[1]..", "..args..")" -end - --- named table: --- push(<>) --- <
> --- pop() -function gen.name_table(token) - return "push('"..token[1].."')\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop()" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/LICK/lib/loveosc/vstruct/gen_unpack.lua b/LICK/lib/loveosc/vstruct/gen_unpack.lua deleted file mode 100755 index 369cfc9..0000000 --- a/LICK/lib/loveosc/vstruct/gen_unpack.lua +++ /dev/null @@ -1,117 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd = (...) -local stack = {} -local pack = {} -local start = fd:seek() -local len = 0 - -local function push() - stack[#stack+1],pack = pack,{} -end - -local function pop(key) - local target = stack[#stack] - key = key or #target+1 - target[key],pack = pack,target - stack[#stack] = nil -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return pack,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- pack[#pack+1] = <>(fd, <>) -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack[#pack+1] = "..fn.."(fd, "..args..")" -end - --- table: --- push() --- <
> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack."..token[1].." = "..fn.."(fd, "..args..")" -end - -function gen.name_table(token) - return "push()\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop('"..token[1].."')\n" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/LICK/lib/loveosc/vstruct/init.lua b/LICK/lib/loveosc/vstruct/init.lua deleted file mode 100755 index 8910968..0000000 --- a/LICK/lib/loveosc/vstruct/init.lua +++ /dev/null @@ -1,94 +0,0 @@ --- vstruct, the versatile struct library --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local table,math,type,require,assert,_unpack = table,math,type,require,assert,unpack - -local print = print - -module((...)) - -cursor = require (_NAME..".cursor") -compile = require (_NAME..".compile") - -function math.trunc(n) - if n < 0 then - return math.ceil(n) - else - return math.floor(n) - end -end - --- turn an int into a list of booleans --- the length of the list will be the smallest number of bits needed to --- represent the int -function explode(int, size) - assert(int, "struct.explode: missing argument") - size = size or 0 - - local mask = {} - while int ~= 0 or #mask < size do - table.insert(mask, int % 2 ~= 0) - int = math.trunc(int/2) - end - return mask -end - --- turn a list of booleans into an int --- the converse of explode -function implode(mask, size) - size = size or #mask - - local int = 0 - for i=size,1,-1 do - int = int*2 + ((mask[i] and 1) or 0) - end - return int -end - --- given a source, which is either a string or a file handle, --- unpack it into individual data based on the format string -function unpack(fmt, source, untable) - -- wrap it in a cursor so we can treat it like a file - if type(source) == 'string' then - source = cursor(source) - end - - assert(fmt and source and type(fmt) == "string", "struct: invalid arguments to unpack") - - -- the lexer will take our format string and generate code from it - -- it returns a function that when called with our source, will - -- unpack the data according to the format string and return all - -- values from said unpacking in a list - if untable then - --local t = compile.unpack(fmt)(source) - --print(t) - -- print(_unpack(t)) - return _unpack((compile.unpack(fmt)(source))) - else - return compile.unpack(fmt)(source) - end -end - --- given a format string and a list of data, pack them --- if 'fd' is omitted, pack them into and return a string --- otherwise, write them directly to the given file -function pack(fmt, fd, data) - local str_fd - - if not data then - data = fd - fd = "" - end - - if type(fd) == 'string' then - fd = cursor("") - str_fd = true - end - - assert(fmt and fd and data and type(fmt) == "string", "struct: invalid arguments to pack") - - local fd,len = compile.pack(fmt)(fd, data) - return (str_fd and fd.str) or fd,len -end - -return struct diff --git a/LICK/lib/loveosc/vstruct/io_pack.lua b/LICK/lib/loveosc/vstruct/io_pack.lua deleted file mode 100755 index a785f7e..0000000 --- a/LICK/lib/loveosc/vstruct/io_pack.lua +++ /dev/null @@ -1,127 +0,0 @@ --- write formats --- return true if they have consumed a value from the input stream --- return false/nil otherwise (ie, the next value will be preserved --- for subsequent calls, eg skip/pad) --- Copyright © 2008 Ben "ToxicFrog" Kelly; see COPYING -local require,error,setmetatable,string,print,math,unpack,io - = require,error,setmetatable,string,print,math,unpack,io - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local pack = setmetatable({}, { __index = common }) - --- boolean -function pack.b(fd, d, w) - return pack.u(fd, (d and 1) or 0, w) -end - --- counted string --- a string immediately prefaced with its length as a uint -function pack.c(fd, d, w) - pack.u(fd, #d, w) - return pack.s(fd, d) -end - --- floating point -function pack.f(fd, d, w) - if not fp.w[w] then - error("struct.pack: illegal floating point width") - end --- local f = fp.w[w](d) --- print(f, type(f)) - return pack.s(fd, fp.w[w](d), w) -end - --- signed int -function pack.i(fd, d, w) - if d < 0 then - d = 2^(w*8) + d - end - return pack.u(fd, d, w) -end - --- bitmask --- we use a string here because using an unsigned will lose data on bitmasks --- wider than lua's native number format -function pack.m(fd, d, w) - local buf = "" - - for i=1,w*8,8 do - local bits = { unpack(d, i, i+7) } - local byte = string.char(struct.implode(bits, 8)) - if pack.is_bigendian then - buf = byte..buf - else - buf = buf..byte - end - end - return pack.s(fd, buf, w) -end - --- fixed point bit aligned -function pack.P(fd, d, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return pack.i(fd, d * 2^fp, (dp+fp)/8) -end - --- fixed point byte aligned -function pack.p(fd, d, dp, fp) - return pack.P(fd, d, dp*8, fp*8) -end - --- fixed length string --- length 0 is write string as is --- length >0 is write exactly w bytes, truncating or padding as needed -function pack.s(fd, d, w) - w = w or #d - if w == 0 then return end - - if #d < w then - d = d..string.char(0):rep(w-#d) - end - - return fd:write(d:sub(1,w)) -end - --- unsigned int -function pack.u(fd, d, w) - local s = "" - - for i=1,w do - if pack.is_bigendian then - s = string.char(d % 2^8) .. s - else - s = s .. string.char(d % 2^8) - end - d = math.trunc(d/2^8) - end - - return pack.s(fd, s, w) -end - --- skip/pad --- this is technically a control format, so it has a different signature --- specifically, there is no "data" argument -function pack.x(fd, w) - return pack.s(fd, "", w) -end - --- null terminated string --- w==nil is write string as is + termination --- w>0 is write exactly w bytes, truncating/padding and terminating -function pack.z(fd, d, w) - w = w or #d+1 - if #d >= w then - d = d:sub(1, w-1) - end - - return pack.s(fd, d.."\0", w) -end - -return pack diff --git a/LICK/lib/loveosc/vstruct/io_unpack.lua b/LICK/lib/loveosc/vstruct/io_unpack.lua deleted file mode 100755 index 916c321..0000000 --- a/LICK/lib/loveosc/vstruct/io_unpack.lua +++ /dev/null @@ -1,165 +0,0 @@ --- read formats --- return a value if applicable, which will be packed --- otherwise return nil --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - --- load operations common to both unpack and pack, and set __index so that --- requests for, say, unpack.seekto will succeed -local require,error,setmetatable,string,print - = require,error,setmetatable,string,print - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local unpack = setmetatable({}, { __index = common }) - --- boolean --- true if any bit is 1, false otherwise -function unpack.b(fd, w) - return unpack.u(fd, w) ~= 0 -end - --- counted string --- a string immediately prefaced with its length as a uint -function unpack.c(fd, w) - w = unpack.u(fd, w) - - return unpack.s(fd, w) -end - --- float --- this is callout to the floating-point read/write module, if installed -function unpack.f(fd, w) - if not fp.r[w] then - error("struct.unpack: illegal floating point width") - end - - return fp.r[w](unpack.s(fd,w)) -end - --- utility functions for the i, m and u formats -local function directions(w) - if unpack.is_bigendian then - return 1,w,1 - else - return w,1,-1 - end -end - -local function pve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - for c=sof,eof,dir do - i = i * 2^8 + buf:byte(c) - end - - return i -end - -local function nve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - if buf:byte(sof) < 128 then - return pve_unpack(buf, w) - end - - for c=sof,eof,dir do - i = i * 2^8 - (255 - buf:byte(c)) - end - - return i-1 -end - --- signed int of w bytes -function unpack.i(fd, w) - local buf = unpack.s(fd, w) - - return nve_unpack(buf, w) -end - --- bitmask of w bytes --- we need to read and unpack it as a string, not an unsigned, because otherwise --- we're limited to 52 bits -function unpack.m(fd, w) - local buf = unpack.s(fd, w) - local mask = {} - - local sof,eof,dir = directions(w) - - -- reverse it here because directions() returns numbers for MSB first, - -- and we want LSB first - for i=eof,sof,-dir do - local byte = buf:byte(i) - local bits = struct.explode(byte) - for j=1,8 do - mask[#mask+1] = bits[j] or false - end - end - return mask -end - --- fixed point bit aligned --- w is in the form d.f, where d is the number of bits in the integer part --- and f the number of bits in the fractional part -function unpack.P(fd, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return unpack.i(fd, (dp+fp)/8)/(2^fp) -end - --- fixed point byte aligned -function unpack.p(fd, dp, fp) - return unpack.P(fd, dp*8, fp*8) -end - --- string --- reads exactly w bytes of data and returns them verbatim -function unpack.s(fd, w) - if w == 0 then return "" end - - local buf,err = fd:read(w or "*a") - if not buf then - error(function() return "read error: "..(err or "(unknown error)") end) - elseif #buf < w then - error(function() return "short read: wanted "..w.." bytes, got "..#buf end) - end - return buf -end - --- unsigned int -function unpack.u(fd, w) - local buf,err = unpack.s(fd, w) - - return pve_unpack(buf, w) -end - --- skip/pad --- reads w bytes and discards them -function unpack.x(fd, w) - fd:read(w) - return true -end - --- null-terminated string --- if w is omitted, reads up to and including the first nul, and returns everything --- except that nul --- otherwise, reads exactly w bytes and returns everything up to the first nul -function unpack.z(fd, w) - if w then - return unpack.s(fd, w):match('^%Z*') - end - - local buf = "" - local c = unpack.s(fd, 1) - while #c > 0 and c ~= string.char(0) do - buf = buf..c - c = unpack.s(fd, 1) - end - return buf -end - -return unpack diff --git a/LICK/lib/loveosc/vstruct/lexer.lua b/LICK/lib/loveosc/vstruct/lexer.lua deleted file mode 100755 index 9eb503e..0000000 --- a/LICK/lib/loveosc/vstruct/lexer.lua +++ /dev/null @@ -1,54 +0,0 @@ -local lexis = {} - -local function lexeme(name) - return function(pattern) - lexis[#lexis+1] = { name=name, pattern="^"..pattern } - end -end - -lexeme (false) "%s+" -- whitespace -lexeme "table" "(%b{})" -lexeme "group" "(%b())" -lexeme "name_atom" "([%a_][%w_]*)%:(%a)([%d.]*)" -lexeme "name_table" "([%a_][%w_]*)%:(%b{})" -lexeme "prerepeat" "(%d+)%s*%*" -lexeme "postrepeat" "%*%s*(%d+)" -lexeme "control" "([-+@<>=ax])([%d.]*)" -lexeme "atom" "(%a)([%d.]*)" - -return function(source) - local orig = source - local index = 1 - - local function iter() - if #source == 0 then return nil end - - for _,lexeme in ipairs(lexis) do - if source:match(lexeme.pattern) then - local result = { source:find(lexeme.pattern) } - local eof = table.remove(result, 2) - table.remove(result, 1) - - source = source:sub(eof+1, -1) - index = index+eof - - if lexeme.name then - result.type = lexeme.name - coroutine.yield(result) - end - return iter() - end - end - error (function() return "Error lexing format string [[" - ..(orig) - .."]] at char " - ..index - .." (" - ..(source:sub(1,1)) - ..")" - end) - end - - return coroutine.wrap(iter) -end - diff --git a/LICK/lib/loveosc/vstruct/parser.lua b/LICK/lib/loveosc/vstruct/parser.lua deleted file mode 100755 index 122f68e..0000000 --- a/LICK/lib/loveosc/vstruct/parser.lua +++ /dev/null @@ -1,35 +0,0 @@ --- parser for format strings --- you give it a format string, a table of code generators, --- and a flag indicating whether to apply the preamble/postable --- it gives you lua source - -local require,concat = require,table.concat - -local print = print - -module((...)) - -local lex = require(_PACKAGE.."lexer") - -return function(source, codegen, prepost) - local asl = {} - local get = lex(source) - - for token in get do - -- seperate statements because codegen may change #asl - local code = codegen[token.type](token, get, asl) - asl[#asl+1] = code - end - - local source = concat(asl, "\n") - - if prepost then - source = codegen.preamble - .. source - .. codegen.postamble - end - - return source -end - - diff --git a/LICK/lib/object.lua b/LICK/lib/object.lua deleted file mode 100644 index f36adbc..0000000 --- a/LICK/lib/object.lua +++ /dev/null @@ -1,506 +0,0 @@ --- OBJECT.lua --- object oriented livecoding library -_internal_object_table = {} - --- hump for classing -local Class = require "LICK/lib/hump/.class" -local hlpr = require "LICK/lib/hlpr" -require "LICK/lib/loveosc" - - ---[[ - OBJECT ---]] --- @Object: base class -Object = Class(function(self) - -- TODO: Object base code - table.insert(_internal_object_table, self) -end) - -function Object:update(dt) - -- TODO: insert typical update - -- print("updated") -end - ---[[ - SCOBJECT ---]] - --- @SCObject: bass class for supercollider communication -SCObject = Class(function(self) - Object.construct(self) -end) -SCObject:inherit(Object) - - ---[[ - SCSYNTH ---]] --- @SCSynth: supercollider synthesizer class -SCSynth = Class(function(self, nodename, freq) - SCObject.construct(self) - self.nodename = nodename or "default" - self.freq = freq or 440 - self.nodeid = 1000 + math.random(1000) -end) -SCSynth:inherit(SCObject) - --- #set a control, TODO: variable lenght of argument-pairs -function SCSynth:set(control, val) - local var = { - "#bundle", - os.time(), - { - "/n_set", - "i", - self.nodeid, - "s", - control, - "f", - val - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#sends an OSC message to the supercollider to start the synth -function SCSynth:play() - local var = { - "#bundle", - os.time(), - { - "/s_new", - "s", - self.nodename, - "i", - self.nodeid, - "i", - 0, - "i", - 0, - "s", - "freq", - "f", - self.freq - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#frees the node on the supercollider server -function SCSynth:free() - local var = { - "#bundle", - os.time()+0.8, - { - "/n_free", - "i", - self.nodeid, - "i", - 0 - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---[[ - DRAWABLE ---]] --- @Drawable: base class for all drawable stuff -Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - - self.position = Vector(x,y) - self.pos = self.position - self.x = self.position.x - self.y = self.position.y -end) -Drawable:inherit(Object) - --- #can be called via wrapX(max) or wrapX(min,max) -function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end -end - --- #can be called via wrapY(max) or wrapY(min,max) -function Drawable:wrapY(min, max) - if min and max then - self:wrap("y", min, max) - elseif min and not max then - self:wrap("y", 0, min) - end -end - --- #internal wrapper -function Drawable:wrap(str, min, max) - if str == "x" then - self.position.x = hlpr.wrap(self.position.x, min, max) - elseif str == "y" then - self.position.y = hlpr.wrap(self.position.y, min, max) - end -end - --- #supercollider style 'set' -function Drawable:set(str, val) - - if str == "x" then - self.position.x = val or self.position.x - elseif str == "y" then - self.position.y = val or self.position.y - end - -- TODO: add lots and lots and lots -end - --- #not yet implemented -function Drawable:draw() - -- TODO: abstract draw code... -end - - - - ---[[ - CIRCLE ---]] --- @Circle: drawable circle -Circle = Class(function(self, x, y, r, s, color) - self.r = r or 10 - self.s = s or 16 - -- call constructor of Drawable - Drawable.construct(self,x,y,color) -end) -Circle:inherit(Drawable) - --- #draw the circle -function Circle:draw(style) - if style ~= "fill" and style ~= "line" then - style = "line" - end - love.graphics.setColor(unpack(self.color)) - love.graphics.circle(style, self.position.x, self.position.y, self.r, self.s) -end - - - ----------------------------------------- --- Experimental Objects ----------------------------------------- - - ---[[ - LINE ---]] --- @Line: draw a line -Line = Class(function(self, x, y, tx, ty, color) -- wats the dealio for polylines? - self.x = x or 0 - self.y = y or 0 - self.tx = tx or 0 - self.ty = ty or 0 - -- call constructor of Drawable - Drawable.construct(self, x, y, color) - - end) -Line:inherit(Drawable) --- TODO: FIX the :set("key", value) ... dunno how it works..! - --- #draw the line -function Line:draw(width, style) - local width=width or 1 - if style ~= "smooth" and style ~= "rough" then - style = "smooth" - end - love.graphics.setLine(width, style) - love.graphics.setColor(unpack(self.color)) - love.graphics.line(self.position.x, self.position.y, self.tx, self.ty) -end - - ---[[ - IMAGE ---]] --- @Image: Image from file -Image = Class(function(self, file, x, y, color, size, orientation) - self.image = love.graphics.newImage(file) - -- put positions, size, orientation... - self.size = size or 1 - self.color = color or {255,255,255,255} - self.r = 0 - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Image:inherit(Drawable) - --- #draw the image -function Image:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.draw(self.image, self.position.x, self.position.y,self.r,self.size,self.size) -end - ---[[ - POINT ---]] --- @Point: is a point -Point = Class(function(self, x, y, color, size, style) - local color=color or "" - local size=size or 1 - local style=style or "smooth" - - -- should this be here? or in the constructor? - self.size = size - self.style = style - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Point:inherit(Drawable) - --- #draw the point -function Point:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.setPoint(self.size, self.style) - love.graphics.point(self.position.x, self.position.y) -end - - - ---[[ - Sequencer ---]] ---@Sequencer: a simple Sequencer with callback functions on every beat, bar or phrase -Sequencer = Class(function(self,bpm, timeSig, phraseLength) - self.timer = 0 - self.frame = 0 - self.beat = 1 - self.bar = 1 - self.phrase = 1 - self.bpm = bpm or 120 - - self.timeSignature = timeSig or 8 - self.phraseLength = phraseLength or 4 - - self.newBeat = function() end - self.newBar = function() end - self.newPhrase = function() end - - Object.construct(self) -end) -Sequencer:inherit(Object) - --- #counts the time and calls the appropriate functions -function Sequencer:update(dt) - self.timer = self.timer + dt - self.frame = self.frame + 1 - local _fps = 30 - local fpm = 30 * _fps - --print(math.floor(fpm)) - if self.frame%(math.floor(fpm)/self.bpm) == 0 then - self.beat = self.beat + 1 - self.newBeat() - if self.beat%self.timeSignature == 0 then - self.bar = self.bar + 1 - self.newBar() - if self.bar%self.phraseLength == 0 then - self.phrase = self.phrase + 1 - self.newPhrase() - end - - end - - end -end - ---[[ - POLYGON ---]] --- @Polygon: some vertice stuff -Polygon = Class(function(self, vertices, color, style) - local color=color or {255,255,255,255} - - self.style = style or "line" - - -- todo: ask for odd/even number of table - if type(vertices) ~= "table" then - print("vertices has to be a even table!") - end - - self.vertices = vertices - - -- first vertice = x, y - local x=vertices[1] - local y=vertices[2] - - -- TODO: compute center - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Polygon:inherit(Drawable) - --- #draw the polygon -function Polygon:draw(style) - local style=style or self.style - love.graphics.setColor(unpack(self.color)) - love.graphics.polygon(style, self.vertices) -end - ---[[ - RECT ---]] --- @Rect: is a rectangle -Rect = Class(function(self, x, y, width, height, color, style) - local color=color or {255,255,255,255} - self.style = style or "line" - self.width = width - self.height = height - - -- TODO: compute center - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Rect:inherit(Drawable) - --- #draw the rectangle -function Rect:draw(style) - local style=style or self.style - love.graphics.setColor(unpack(self.color)) - love.graphics.rectangle(style, self.position.x, self.position.y, self.width, self.height) -end - - ---[[ - TRIANGLE ---]] --- @Triangle: has three sides -Triangle = Class(function(self, vertices, color, style) - local color=color or {255,255,255,255} - self.style = style or "line" - - -- todo: ask for 6 number of table - if type(vertices) ~= "table" then - print("vertices has to be a even table!") - end - - self.vertices = vertices - - -- first vertice = x, y - local x=vertices[1] - local y=vertices[2] - - -- TODO: compute center - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Triangle:inherit(Drawable) - --- #draw the triangle -function Triangle:draw(style) - local style=style or self.style - love.graphics.setColor(unpack(self.color)) - love.graphics.triangle(style, unpack(self.vertices)) -end - ---[[ - TEXT ---]] --- @Text: characters -Text = Class(function(self, x, y, text, rotation, scaleX, scaleY) - local color=color or {255,255,255,255} - self.text=text or "LICK WITH LOVE" - self.rotation=rotation or 0 - self.scaleX = scaleX or 1 - self.scaleY = scaleY or 1 - self.font = "implement fonts?..." - - -- TODO: compute center - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Text:inherit(Drawable) - --- #display text on screen -function Text:draw(text) - local text = text or self.text - love.graphics.setColor(unpack(self.color)) - love.graphics.print( - text, - self.position.x, - self.position.y, - self.rotationr, - self.scaleX, - self.scaleY - ) -end - - ---[[ - Sequencer ---]] - -Sequencer = Class(function(self,bpm, timeSig, phraseLength) - self.timer = 0 - self.frame = 0 - self.beat = 1 - self.bar = 1 - self.phrase = 1 - self.bpm = bpm or 120 - - self.timeSignature = timeSig or 8 - self.phraseLength = phraseLength or 4 - - self.newBeat = function() end - self.newBar = function() end - self.newPhrase = function() end - - Object.construct(self) -end) -Sequencer:inherit(Object) - -function Sequencer:update(dt) - self.timer = self.timer + dt - self.frame = self.frame + 1 - local _fps = 30 - local fpm = 30 * _fps - --print(math.floor(fpm)) - if self.frame%(math.floor(fpm)/self.bpm) == 0 then - self.beat = self.beat + 1 - self.newBeat() - if self.beat%self.timeSignature == 0 then - self.bar = self.bar + 1 - self.newBar() - if self.bar%self.phraseLength == 0 then - self.phrase = self.phrase + 1 - self.newPhrase() - end - - end - - end - -end - - - - --- EXAMPLE: --- (put in love.load): --- coco = Circle(300,300) --- (put in love.update): --- coco:set("x", 30) --- (put in love.draw): --- coco:draw("fill") - diff --git a/README b/README deleted file mode 100644 index 3e4b62e..0000000 --- a/README +++ /dev/null @@ -1,12 +0,0 @@ -"LICK is a small live coding environment for LÖVE. It basically just is a customized love.run which presses all errors to the command line(or in debug mode on screen). And reloads the “main.lua” everytime it is being changed - -NOTE: STILL IN DEVELOPMENT - EVERYTHING CAN CHANGE - --- optional parameters --- lick.file = "" -- default is "main.lua" --- lick.debug = true -- displays errors in love window --- lick.reset = true -- calls love.load everytime you save the file, if set to false it will only be called when starting LÖVE --- lick.clearFlag = false -- overrides the clear() function in love.run - -"lib" is a collection of various functions and a classes which should accelerate the live coding process. -Dokumentation: lib/docs/index.html diff --git a/README.md b/README.md new file mode 100644 index 0000000..7272b64 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +#Live Coding Kit For Löve + +A small live coding library for Löve which also enables interactive debugging. It basically just is a customized [love.run](https://love2d.org/wiki/love.run) which presses all errors to the command line(or in debug mode on screen). And reloads the “main.lua” everytime you save. + +note: still in development - everything can change + +#Optional Parameters +* lick.file = "" -- default is "main.lua" +* lick.debug = true -- displays errors in love window +* lick.reset = true -- calls love.load everytime you save the file, if set to false it will only be called when starting Löve +* lick.clearFlag = false -- overrides the clear() function in love.run + diff --git a/examples/empty_template/LICK/init.lua b/examples/empty_template/LICK/init.lua deleted file mode 100644 index 6fc9157..0000000 --- a/examples/empty_template/LICK/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -require "LICK/lick" - - diff --git a/examples/empty_template/LICK/lib/color.lua b/examples/empty_template/LICK/lib/color.lua deleted file mode 100644 index b94c709..0000000 --- a/examples/empty_template/LICK/lib/color.lua +++ /dev/null @@ -1,742 +0,0 @@ -x11_color_table = { --- taken from the SuperCollider Color documentation: -["alice blue"]={240, 248, 255}, -["AliceBlue"]={240, 248, 255}, -["antique white"]={250, 235, 215}, -["AntiqueWhite"]={250, 235, 215}, -["AntiqueWhite1"]={255, 239, 219}, -["AntiqueWhite2"]={238, 223, 204}, -["AntiqueWhite3"]={205, 192, 176}, -["AntiqueWhite4"]={139, 131, 120}, -["aquamarine"]={127, 255, 212}, -["aquamarine1"]={127, 255, 212}, -["aquamarine2"]={118, 238, 198}, -["aquamarine3"]={102, 205, 170}, -["aquamarine4"]={69, 139, 116}, -["azure"]={240, 255, 255}, -["azure1"]={240, 255, 255}, -["azure2"]={224, 238, 238}, -["azure3"]={193, 205, 205}, -["azure4"]={131, 139, 139}, -["beige"]={245, 245, 220}, -["bisque"]={255, 228, 196}, -["bisque1"]={255, 228, 196}, -["bisque2"]={238, 213, 183}, -["bisque3"]={205, 183, 158}, -["bisque4"]={139, 125, 107}, -["black"]={0, 0, 0}, -["blanched almond"]={255, 235, 205}, -["BlanchedAlmond"]={255, 235, 205}, -["blue"]={0, 0, 255}, -["blue violet"]={138, 43, 226}, -["blue1"]={0, 0, 255}, -["blue2"]={0, 0, 238}, -["blue3"]={0, 0, 205}, -["blue4"]={0, 0, 139}, -["BlueViolet"]={138, 43, 226}, -["brown"]={165, 42, 42}, -["brown1"]={255, 64, 64}, -["brown2"]={238, 59, 59}, -["brown3"]={205, 51, 51}, -["brown4"]={139, 35, 35}, -["burlywood"]={222, 184, 135}, -["burlywood1"]={255, 211, 155}, -["burlywood2"]={238, 197, 145}, -["burlywood3"]={205, 170, 125}, -["burlywood4"]={139, 115, 85}, -["cadet blue"]={95, 158, 160}, -["CadetBlue"]={95, 158, 160}, -["CadetBlue1"]={152, 245, 255}, -["CadetBlue2"]={142, 229, 238}, -["CadetBlue3"]={122, 197, 205}, -["CadetBlue4"]={83, 134, 139}, -["chartreuse"]={127, 255, 0}, -["chartreuse1"]={127, 255, 0}, -["chartreuse2"]={118, 238, 0}, -["chartreuse3"]={102, 205, 0}, -["chartreuse4"]={69, 139, 0}, -["chocolate"]={210, 105, 30}, -["chocolate1"]={255, 127, 36}, -["chocolate2"]={238, 118, 33}, -["chocolate3"]={205, 102, 29}, -["chocolate4"]={139, 69, 19}, -["coral"]={255, 127, 80}, -["coral1"]={255, 114, 86}, -["coral2"]={238, 106, 80}, -["coral3"]={205, 91, 69}, -["coral4"]={139, 62, 47}, -["cornflower blue"]={100, 149, 237}, -["CornflowerBlue"]={100, 149, 237}, -["cornsilk"]={255, 248, 220}, -["cornsilk1"]={255, 248, 220}, -["cornsilk2"]={238, 232, 205}, -["cornsilk3"]={205, 200, 177}, -["cornsilk4"]={139, 136, 120}, -["cyan"]={0, 255, 255}, -["cyan1"]={0, 255, 255}, -["cyan2"]={0, 238, 238}, -["cyan3"]={0, 205, 205}, -["cyan4"]={0, 139, 139}, -["dark goldenrod"]={184, 134, 11}, -["dark green"]={0, 100, 0}, -["dark khaki"]={189, 183, 107}, -["dark olive green"]={85, 107, 47}, -["dark orange"]={255, 140, 0}, -["dark orchid"]={153, 50, 204}, -["dark salmon"]={233, 150, 122}, -["dark sea green"]={143, 188, 143}, -["dark slate blue"]={72, 61, 139}, -["dark slate gray"]={47, 79, 79}, -["dark slate grey"]={47, 79, 79}, -["dark turquoise"]={0, 206, 209}, -["dark violet"]={148, 0, 211}, -["DarkGoldenrod"]={184, 134, 11}, -["DarkGoldenrod1"]={255, 185, 15}, -["DarkGoldenrod2"]={238, 173, 14}, -["DarkGoldenrod3"]={205, 149, 12}, -["DarkGoldenrod4"]={139, 101, 8}, -["DarkGreen"]={0, 100, 0}, -["DarkKhaki"]={189, 183, 107}, -["DarkOliveGreen"]={85, 107, 47}, -["DarkOliveGreen1"]={202, 255, 112}, -["DarkOliveGreen2"]={188, 238, 104}, -["DarkOliveGreen3"]={162, 205, 90}, -["DarkOliveGreen4"]={110, 139, 61}, -["DarkOrange"]={255, 140, 0}, -["DarkOrange1"]={255, 127, 0}, -["DarkOrange2"]={238, 118, 0}, -["DarkOrange3"]={205, 102, 0}, -["DarkOrange4"]={139, 69, 0}, -["DarkOrchid"]={153, 50, 204}, -["DarkOrchid1"]={191, 62, 255}, -["DarkOrchid2"]={178, 58, 238}, -["DarkOrchid3"]={154, 50, 205}, -["DarkOrchid4"]={104, 34, 139}, -["DarkSalmon"]={233, 150, 122}, -["DarkSeaGreen"]={143, 188, 143}, -["DarkSeaGreen1"]={193, 255, 193}, -["DarkSeaGreen2"]={180, 238, 180}, -["DarkSeaGreen3"]={155, 205, 155}, -["DarkSeaGreen4"]={105, 139, 105}, -["DarkSlateBlue"]={72, 61, 139}, -["DarkSlateGray"]={47, 79, 79}, -["DarkSlateGray1"]={151, 255, 255}, -["DarkSlateGray2"]={141, 238, 238}, -["DarkSlateGray3"]={121, 205, 205}, -["DarkSlateGray4"]={82, 139, 139}, -["DarkSlateGrey"]={47, 79, 79}, -["DarkTurquoise"]={0, 206, 209}, -["DarkViolet"]={148, 0, 211}, -["deep pink"]={255, 20, 147}, -["deep sky blue"]={0, 191, 255}, -["DeepPink"]={255, 20, 147}, -["DeepPink1"]={255, 20, 147}, -["DeepPink2"]={238, 18, 137}, -["DeepPink3"]={205, 16, 118}, -["DeepPink4"]={139, 10, 80}, -["DeepSkyBlue"]={0, 191, 255}, -["DeepSkyBlue1"]={0, 191, 255}, -["DeepSkyBlue2"]={0, 178, 238}, -["DeepSkyBlue3"]={0, 154, 205}, -["DeepSkyBlue4"]={0, 104, 139}, -["dim gray"]={105, 105, 105}, -["dim grey"]={105, 105, 105}, -["DimGray"]={105, 105, 105}, -["DimGrey"]={105, 105, 105}, -["dodger blue"]={30, 144, 255}, -["DodgerBlue"]={30, 144, 255}, -["DodgerBlue1"]={30, 144, 255}, -["DodgerBlue2"]={28, 134, 238}, -["DodgerBlue3"]={24, 116, 205}, -["DodgerBlue4"]={16, 78, 139}, -["firebrick"]={178, 34, 34}, -["firebrick1"]={255, 48, 48}, -["firebrick2"]={238, 44, 44}, -["firebrick3"]={205, 38, 38}, -["firebrick4"]={139, 26, 26}, -["floral white"]={255, 250, 240}, -["FloralWhite"]={255, 250, 240}, -["forest green"]={34, 139, 34}, -["ForestGreen"]={34, 139, 34}, -["gainsboro"]={220, 220, 220}, -["ghost white"]={248, 248, 255}, -["GhostWhite"]={248, 248, 255}, -["gold"]={255, 215, 0}, -["gold1"]={255, 215, 0}, -["gold2"]={238, 201, 0}, -["gold3"]={205, 173, 0}, -["gold4"]={139, 117, 0}, -["goldenrod"]={218, 165, 32}, -["goldenrod1"]={255, 193, 37}, -["goldenrod2"]={238, 180, 34}, -["goldenrod3"]={205, 155, 29}, -["goldenrod4"]={139, 105, 20}, -["gray"]={190, 190, 190}, -["gray0"]={0, 0, 0}, -["gray1"]={3, 3, 3}, -["gray10"]={26, 26, 26}, -["gray100"]={255, 255, 255}, -["gray11"]={28, 28, 28}, -["gray12"]={31, 31, 31}, -["gray13"]={33, 33, 33}, -["gray14"]={36, 36, 36}, -["gray15"]={38, 38, 38}, -["gray16"]={41, 41, 41}, -["gray17"]={43, 43, 43}, -["gray18"]={46, 46, 46}, -["gray19"]={48, 48, 48}, -["gray2"]={5, 5, 5}, -["gray20"]={51, 51, 51}, -["gray21"]={54, 54, 54}, -["gray22"]={56, 56, 56}, -["gray23"]={59, 59, 59}, -["gray24"]={61, 61, 61}, -["gray25"]={64, 64, 64}, -["gray26"]={66, 66, 66}, -["gray27"]={69, 69, 69}, -["gray28"]={71, 71, 71}, -["gray29"]={74, 74, 74}, -["gray3"]={8, 8, 8}, -["gray30"]={77, 77, 77}, -["gray31"]={79, 79, 79}, -["gray32"]={82, 82, 82}, -["gray33"]={84, 84, 84}, -["gray34"]={87, 87, 87}, -["gray35"]={89, 89, 89}, -["gray36"]={92, 92, 92}, -["gray37"]={94, 94, 94}, -["gray38"]={97, 97, 97}, -["gray39"]={99, 99, 99}, -["gray4"]={10, 10, 10}, -["gray40"]={102, 102, 102}, -["gray41"]={105, 105, 105}, -["gray42"]={107, 107, 107}, -["gray43"]={110, 110, 110}, -["gray44"]={112, 112, 112}, -["gray45"]={115, 115, 115}, -["gray46"]={117, 117, 117}, -["gray47"]={120, 120, 120}, -["gray48"]={122, 122, 122}, -["gray49"]={125, 125, 125}, -["gray5"]={13, 13, 13}, -["gray50"]={127, 127, 127}, -["gray51"]={130, 130, 130}, -["gray52"]={133, 133, 133}, -["gray53"]={135, 135, 135}, -["gray54"]={138, 138, 138}, -["gray55"]={140, 140, 140}, -["gray56"]={143, 143, 143}, -["gray57"]={145, 145, 145}, -["gray58"]={148, 148, 148}, -["gray59"]={150, 150, 150}, -["gray6"]={15, 15, 15}, -["gray60"]={153, 153, 153}, -["gray61"]={156, 156, 156}, -["gray62"]={158, 158, 158}, -["gray63"]={161, 161, 161}, -["gray64"]={163, 163, 163}, -["gray65"]={166, 166, 166}, -["gray66"]={168, 168, 168}, -["gray67"]={171, 171, 171}, -["gray68"]={173, 173, 173}, -["gray69"]={176, 176, 176}, -["gray7"]={18, 18, 18}, -["gray70"]={179, 179, 179}, -["gray71"]={181, 181, 181}, -["gray72"]={184, 184, 184}, -["gray73"]={186, 186, 186}, -["gray74"]={189, 189, 189}, -["gray75"]={191, 191, 191}, -["gray76"]={194, 194, 194}, -["gray77"]={196, 196, 196}, -["gray78"]={199, 199, 199}, -["gray79"]={201, 201, 201}, -["gray8"]={20, 20, 20}, -["gray80"]={204, 204, 204}, -["gray81"]={207, 207, 207}, -["gray82"]={209, 209, 209}, -["gray83"]={212, 212, 212}, -["gray84"]={214, 214, 214}, -["gray85"]={217, 217, 217}, -["gray86"]={219, 219, 219}, -["gray87"]={222, 222, 222}, -["gray88"]={224, 224, 224}, -["gray89"]={227, 227, 227}, -["gray9"]={23, 23, 23}, -["gray90"]={229, 229, 229}, -["gray91"]={232, 232, 232}, -["gray92"]={235, 235, 235}, -["gray93"]={237, 237, 237}, -["gray94"]={240, 240, 240}, -["gray95"]={242, 242, 242}, -["gray96"]={245, 245, 245}, -["gray97"]={247, 247, 247}, -["gray98"]={250, 250, 250}, -["gray99"]={252, 252, 252}, -["green"]={0, 255, 0}, -["green yellow"]={173, 255, 47}, -["green1"]={0, 255, 0}, -["green2"]={0, 238, 0}, -["green3"]={0, 205, 0}, -["green4"]={0, 139, 0}, -["GreenYellow"]={173, 255, 47}, -["grey"]={190, 190, 190}, -["grey0"]={0, 0, 0}, -["grey1"]={3, 3, 3}, -["grey10"]={26, 26, 26}, -["grey100"]={255, 255, 255}, -["grey11"]={28, 28, 28}, -["grey12"]={31, 31, 31}, -["grey13"]={33, 33, 33}, -["grey14"]={36, 36, 36}, -["grey15"]={38, 38, 38}, -["grey16"]={41, 41, 41}, -["grey17"]={43, 43, 43}, -["grey18"]={46, 46, 46}, -["grey19"]={48, 48, 48}, -["grey2"]={5, 5, 5}, -["grey20"]={51, 51, 51}, -["grey21"]={54, 54, 54}, -["grey22"]={56, 56, 56}, -["grey23"]={59, 59, 59}, -["grey24"]={61, 61, 61}, -["grey25"]={64, 64, 64}, -["grey26"]={66, 66, 66}, -["grey27"]={69, 69, 69}, -["grey28"]={71, 71, 71}, -["grey29"]={74, 74, 74}, -["grey3"]={8, 8, 8}, -["grey30"]={77, 77, 77}, -["grey31"]={79, 79, 79}, -["grey32"]={82, 82, 82}, -["grey33"]={84, 84, 84}, -["grey34"]={87, 87, 87}, -["grey35"]={89, 89, 89}, -["grey36"]={92, 92, 92}, -["grey37"]={94, 94, 94}, -["grey38"]={97, 97, 97}, -["grey39"]={99, 99, 99}, -["grey4"]={10, 10, 10}, -["grey40"]={102, 102, 102}, -["grey41"]={105, 105, 105}, -["grey42"]={107, 107, 107}, -["grey43"]={110, 110, 110}, -["grey44"]={112, 112, 112}, -["grey45"]={115, 115, 115}, -["grey46"]={117, 117, 117}, -["grey47"]={120, 120, 120}, -["grey48"]={122, 122, 122}, -["grey49"]={125, 125, 125}, -["grey5"]={13, 13, 13}, -["grey50"]={127, 127, 127}, -["grey51"]={130, 130, 130}, -["grey52"]={133, 133, 133}, -["grey53"]={135, 135, 135}, -["grey54"]={138, 138, 138}, -["grey55"]={140, 140, 140}, -["grey56"]={143, 143, 143}, -["grey57"]={145, 145, 145}, -["grey58"]={148, 148, 148}, -["grey59"]={150, 150, 150}, -["grey6"]={15, 15, 15}, -["grey60"]={153, 153, 153}, -["grey61"]={156, 156, 156}, -["grey62"]={158, 158, 158}, -["grey63"]={161, 161, 161}, -["grey64"]={163, 163, 163}, -["grey65"]={166, 166, 166}, -["grey66"]={168, 168, 168}, -["grey67"]={171, 171, 171}, -["grey68"]={173, 173, 173}, -["grey69"]={176, 176, 176}, -["grey7"]={18, 18, 18}, -["grey70"]={179, 179, 179}, -["grey71"]={181, 181, 181}, -["grey72"]={184, 184, 184}, -["grey73"]={186, 186, 186}, -["grey74"]={189, 189, 189}, -["grey75"]={191, 191, 191}, -["grey76"]={194, 194, 194}, -["grey77"]={196, 196, 196}, -["grey78"]={199, 199, 199}, -["grey79"]={201, 201, 201}, -["grey8"]={20, 20, 20}, -["grey80"]={204, 204, 204}, -["grey81"]={207, 207, 207}, -["grey82"]={209, 209, 209}, -["grey83"]={212, 212, 212}, -["grey84"]={214, 214, 214}, -["grey85"]={217, 217, 217}, -["grey86"]={219, 219, 219}, -["grey87"]={222, 222, 222}, -["grey88"]={224, 224, 224}, -["grey89"]={227, 227, 227}, -["grey9"]={23, 23, 23}, -["grey90"]={229, 229, 229}, -["grey91"]={232, 232, 232}, -["grey92"]={235, 235, 235}, -["grey93"]={237, 237, 237}, -["grey94"]={240, 240, 240}, -["grey95"]={242, 242, 242}, -["grey96"]={245, 245, 245}, -["grey97"]={247, 247, 247}, -["grey98"]={250, 250, 250}, -["grey99"]={252, 252, 252}, -["honeydew"]={240, 255, 240}, -["honeydew1"]={240, 255, 240}, -["honeydew2"]={224, 238, 224}, -["honeydew3"]={193, 205, 193}, -["honeydew4"]={131, 139, 131}, -["hot pink"]={255, 105, 180}, -["HotPink"]={255, 105, 180}, -["HotPink1"]={255, 110, 180}, -["HotPink2"]={238, 106, 167}, -["HotPink3"]={205, 96, 144}, -["HotPink4"]={139, 58, 98}, -["indian red"]={205, 92, 92}, -["IndianRed"]={205, 92, 92}, -["IndianRed1"]={255, 106, 106}, -["IndianRed2"]={238, 99, 99}, -["IndianRed3"]={205, 85, 85}, -["IndianRed4"]={139, 58, 58}, -["ivory"]={255, 255, 240}, -["ivory1"]={255, 255, 240}, -["ivory2"]={238, 238, 224}, -["ivory3"]={205, 205, 193}, -["ivory4"]={139, 139, 131}, -["khaki"]={240, 230, 140}, -["khaki1"]={255, 246, 143}, -["khaki2"]={238, 230, 133}, -["khaki3"]={205, 198, 115}, -["khaki4"]={139, 134, 78}, -["lavender"]={230, 230, 250}, -["lavender blush"]={255, 240, 245}, -["LavenderBlush"]={255, 240, 245}, -["LavenderBlush1"]={255, 240, 245}, -["LavenderBlush2"]={238, 224, 229}, -["LavenderBlush3"]={205, 193, 197}, -["LavenderBlush4"]={139, 131, 134}, -["lawn green"]={124, 252, 0}, -["LawnGreen"]={124, 252, 0}, -["lemon chiffon"]={255, 250, 205}, -["LemonChiffon"]={255, 250, 205}, -["LemonChiffon1"]={255, 250, 205}, -["LemonChiffon2"]={238, 233, 191}, -["LemonChiffon3"]={205, 201, 165}, -["LemonChiffon4"]={139, 137, 112}, -["light blue"]={173, 216, 230}, -["light coral"]={240, 128, 128}, -["light cyan"]={224, 255, 255}, -["light goldenrod"]={238, 221, 130}, -["light goldenrod yellow"]={250, 250, 210}, -["light gray"]={211, 211, 211}, -["light grey"]={211, 211, 211}, -["light pink"]={255, 182, 193}, -["light salmon"]={255, 160, 122}, -["light sea green"]={32, 178, 170}, -["light sky blue"]={135, 206, 250}, -["light slate blue"]={132, 112, 255}, -["light slate gray"]={119, 136, 153}, -["light slate grey"]={119, 136, 153}, -["light steel blue"]={176, 196, 222}, -["light yellow"]={255, 255, 224}, -["LightBlue"]={173, 216, 230}, -["LightBlue1"]={191, 239, 255}, -["LightBlue2"]={178, 223, 238}, -["LightBlue3"]={154, 192, 205}, -["LightBlue4"]={104, 131, 139}, -["LightCoral"]={240, 128, 128}, -["LightCyan"]={224, 255, 255}, -["LightCyan1"]={224, 255, 255}, -["LightCyan2"]={209, 238, 238}, -["LightCyan3"]={180, 205, 205}, -["LightCyan4"]={122, 139, 139}, -["LightGoldenrod"]={238, 221, 130}, -["LightGoldenrod1"]={255, 236, 139}, -["LightGoldenrod2"]={238, 220, 130}, -["LightGoldenrod3"]={205, 190, 112}, -["LightGoldenrod4"]={139, 129, 76}, -["LightGoldenrodYellow"]={250, 250, 210}, -["LightGray"]={211, 211, 211}, -["LightGrey"]={211, 211, 211}, -["LightPink"]={255, 182, 193}, -["LightPink1"]={255, 174, 185}, -["LightPink2"]={238, 162, 173}, -["LightPink3"]={205, 140, 149}, -["LightPink4"]={139, 95, 101}, -["LightSalmon"]={255, 160, 122}, -["LightSalmon1"]={255, 160, 122}, -["LightSalmon2"]={238, 149, 114}, -["LightSalmon3"]={205, 129, 98}, -["LightSalmon4"]={139, 87, 66}, -["LightSeaGreen"]={32, 178, 170}, -["LightSkyBlue"]={135, 206, 250}, -["LightSkyBlue1"]={176, 226, 255}, -["LightSkyBlue2"]={164, 211, 238}, -["LightSkyBlue3"]={141, 182, 205}, -["LightSkyBlue4"]={96, 123, 139}, -["LightSlateBlue"]={132, 112, 255}, -["LightSlateGray"]={119, 136, 153}, -["LightSlateGrey"]={119, 136, 153}, -["LightSteelBlue"]={176, 196, 222}, -["LightSteelBlue1"]={202, 225, 255}, -["LightSteelBlue2"]={188, 210, 238}, -["LightSteelBlue3"]={162, 181, 205}, -["LightSteelBlue4"]={110, 123, 139}, -["LightYellow"]={255, 255, 224}, -["LightYellow1"]={255, 255, 224}, -["LightYellow2"]={238, 238, 209}, -["LightYellow3"]={205, 205, 180}, -["LightYellow4"]={139, 139, 122}, -["lime green"]={50, 205, 50}, -["LimeGreen"]={50, 205, 50}, -["linen"]={250, 240, 230}, -["magenta"]={255, 0, 255}, -["magenta1"]={255, 0, 255}, -["magenta2"]={238, 0, 238}, -["magenta3"]={205, 0, 205}, -["magenta4"]={139, 0, 139}, -["maroon"]={176, 48, 96}, -["maroon1"]={255, 52, 179}, -["maroon2"]={238, 48, 167}, -["maroon3"]={205, 41, 144}, -["maroon4"]={139, 28, 98}, -["medium aquamarine"]={102, 205, 170}, -["medium blue"]={0, 0, 205}, -["medium orchid"]={186, 85, 211}, -["medium purple"]={147, 112, 219}, -["medium sea green"]={60, 179, 113}, -["medium slate blue"]={123, 104, 238}, -["medium spring green"]={0, 250, 154}, -["medium turquoise"]={72, 209, 204}, -["medium violet red"]={199, 21, 133}, -["MediumAquamarine"]={102, 205, 170}, -["MediumBlue"]={0, 0, 205}, -["MediumOrchid"]={186, 85, 211}, -["MediumOrchid1"]={224, 102, 255}, -["MediumOrchid2"]={209, 95, 238}, -["MediumOrchid3"]={180, 82, 205}, -["MediumOrchid4"]={122, 55, 139}, -["MediumPurple"]={147, 112, 219}, -["MediumPurple1"]={171, 130, 255}, -["MediumPurple2"]={159, 121, 238}, -["MediumPurple3"]={137, 104, 205}, -["MediumPurple4"]={93, 71, 139}, -["MediumSeaGreen"]={60, 179, 113}, -["MediumSlateBlue"]={123, 104, 238}, -["MediumSpringGreen"]={0, 250, 154}, -["MediumTurquoise"]={72, 209, 204}, -["MediumVioletRed"]={199, 21, 133}, -["midnight blue"]={25, 25, 112}, -["MidnightBlue"]={25, 25, 112}, -["mint cream"]={245, 255, 250}, -["MintCream"]={245, 255, 250}, -["misty rose"]={255, 228, 225}, -["MistyRose"]={255, 228, 225}, -["MistyRose1"]={255, 228, 225}, -["MistyRose2"]={238, 213, 210}, -["MistyRose3"]={205, 183, 181}, -["MistyRose4"]={139, 125, 123}, -["moccasin"]={255, 228, 181}, -["navajo white"]={255, 222, 173}, -["NavajoWhite"]={255, 222, 173}, -["NavajoWhite1"]={255, 222, 173}, -["NavajoWhite2"]={238, 207, 161}, -["NavajoWhite3"]={205, 179, 139}, -["NavajoWhite4"]={139, 121, 94}, -["navy"]={0, 0, 128}, -["navy blue"]={0, 0, 128}, -["NavyBlue"]={0, 0, 128}, -["old lace"]={253, 245, 230}, -["OldLace"]={253, 245, 230}, -["olive drab"]={107, 142, 35}, -["OliveDrab"]={107, 142, 35}, -["OliveDrab1"]={192, 255, 62}, -["OliveDrab2"]={179, 238, 58}, -["OliveDrab3"]={154, 205, 50}, -["OliveDrab4"]={105, 139, 34}, -["orange"]={255, 165, 0}, -["orange red"]={255, 69, 0}, -["orange1"]={255, 165, 0}, -["orange2"]={238, 154, 0}, -["orange3"]={205, 133, 0}, -["orange4"]={139, 90, 0}, -["OrangeRed"]={255, 69, 0}, -["OrangeRed1"]={255, 69, 0}, -["OrangeRed2"]={238, 64, 0}, -["OrangeRed3"]={205, 55, 0}, -["OrangeRed4"]={139, 37, 0}, -["orchid"]={218, 112, 214}, -["orchid1"]={255, 131, 250}, -["orchid2"]={238, 122, 233}, -["orchid3"]={205, 105, 201}, -["orchid4"]={139, 71, 137}, -["pale goldenrod"]={238, 232, 170}, -["pale green"]={152, 251, 152}, -["pale turquoise"]={175, 238, 238}, -["pale violet red"]={219, 112, 147}, -["PaleGoldenrod"]={238, 232, 170}, -["PaleGreen"]={152, 251, 152}, -["PaleGreen1"]={154, 255, 154}, -["PaleGreen2"]={144, 238, 144}, -["PaleGreen3"]={124, 205, 124}, -["PaleGreen4"]={84, 139, 84}, -["PaleTurquoise"]={175, 238, 238}, -["PaleTurquoise1"]={187, 255, 255}, -["PaleTurquoise2"]={174, 238, 238}, -["PaleTurquoise3"]={150, 205, 205}, -["PaleTurquoise4"]={102, 139, 139}, -["PaleVioletRed"]={219, 112, 147}, -["PaleVioletRed1"]={255, 130, 171}, -["PaleVioletRed2"]={238, 121, 159}, -["PaleVioletRed3"]={205, 104, 137}, -["PaleVioletRed4"]={139, 71, 93}, -["papaya whip"]={255, 239, 213}, -["PapayaWhip"]={255, 239, 213}, -["peach puff"]={255, 218, 185}, -["PeachPuff"]={255, 218, 185}, -["PeachPuff1"]={255, 218, 185}, -["PeachPuff2"]={238, 203, 173}, -["PeachPuff3"]={205, 175, 149}, -["PeachPuff4"]={139, 119, 101}, -["peru"]={205, 133, 63}, -["pink"]={255, 192, 203}, -["pink1"]={255, 181, 197}, -["pink2"]={238, 169, 184}, -["pink3"]={205, 145, 158}, -["pink4"]={139, 99, 108}, -["plum"]={221, 160, 221}, -["plum1"]={255, 187, 255}, -["plum2"]={238, 174, 238}, -["plum3"]={205, 150, 205}, -["plum4"]={139, 102, 139}, -["powder blue"]={176, 224, 230}, -["PowderBlue"]={176, 224, 230}, -["purple"]={160, 32, 240}, -["purple1"]={155, 48, 255}, -["purple2"]={145, 44, 238}, -["purple3"]={125, 38, 205}, -["purple4"]={85, 26, 139}, -["red"]={255, 0, 0}, -["red1"]={255, 0, 0}, -["red2"]={238, 0, 0}, -["red3"]={205, 0, 0}, -["red4"]={139, 0, 0}, -["rosy brown"]={188, 143, 143}, -["RosyBrown"]={188, 143, 143}, -["RosyBrown1"]={255, 193, 193}, -["RosyBrown2"]={238, 180, 180}, -["RosyBrown3"]={205, 155, 155}, -["RosyBrown4"]={139, 105, 105}, -["royal blue"]={65, 105, 225}, -["RoyalBlue"]={65, 105, 225}, -["RoyalBlue1"]={72, 118, 255}, -["RoyalBlue2"]={67, 110, 238}, -["RoyalBlue3"]={58, 95, 205}, -["RoyalBlue4"]={39, 64, 139}, -["saddle brown"]={139, 69, 19}, -["SaddleBrown"]={139, 69, 19}, -["salmon"]={250, 128, 114}, -["salmon1"]={255, 140, 105}, -["salmon2"]={238, 130, 98}, -["salmon3"]={205, 112, 84}, -["salmon4"]={139, 76, 57}, -["sandy brown"]={244, 164, 96}, -["SandyBrown"]={244, 164, 96}, -["sea green"]={46, 139, 87}, -["SeaGreen"]={46, 139, 87}, -["SeaGreen1"]={84, 255, 159}, -["SeaGreen2"]={78, 238, 148}, -["SeaGreen3"]={67, 205, 128}, -["SeaGreen4"]={46, 139, 87}, -["seashell"]={255, 245, 238}, -["seashell1"]={255, 245, 238}, -["seashell2"]={238, 229, 222}, -["seashell3"]={205, 197, 191}, -["seashell4"]={139, 134, 130}, -["sienna"]={160, 82, 45}, -["sienna1"]={255, 130, 71}, -["sienna2"]={238, 121, 66}, -["sienna3"]={205, 104, 57}, -["sienna4"]={139, 71, 38}, -["sky blue"]={135, 206, 235}, -["SkyBlue"]={135, 206, 235}, -["SkyBlue1"]={135, 206, 255}, -["SkyBlue2"]={126, 192, 238}, -["SkyBlue3"]={108, 166, 205}, -["SkyBlue4"]={74, 112, 139}, -["slate blue"]={106, 90, 205}, -["slate gray"]={112, 128, 144}, -["slate grey"]={112, 128, 144}, -["SlateBlue"]={106, 90, 205}, -["SlateBlue1"]={131, 111, 255}, -["SlateBlue2"]={122, 103, 238}, -["SlateBlue3"]={105, 89, 205}, -["SlateBlue4"]={71, 60, 139}, -["SlateGray"]={112, 128, 144}, -["SlateGray1"]={198, 226, 255}, -["SlateGray2"]={185, 211, 238}, -["SlateGray3"]={159, 182, 205}, -["SlateGray4"]={108, 123, 139}, -["SlateGrey"]={112, 128, 144}, -["snow"]={255, 250, 250}, -["snow1"]={255, 250, 250}, -["snow2"]={238, 233, 233}, -["snow3"]={205, 201, 201}, -["snow4"]={139, 137, 137}, -["spring green"]={0, 255, 127}, -["SpringGreen"]={0, 255, 127}, -["SpringGreen1"]={0, 255, 127}, -["SpringGreen2"]={0, 238, 118}, -["SpringGreen3"]={0, 205, 102}, -["SpringGreen4"]={0, 139, 69}, -["steel blue"]={70, 130, 180}, -["SteelBlue"]={70, 130, 180}, -["SteelBlue1"]={99, 184, 255}, -["SteelBlue2"]={92, 172, 238}, -["SteelBlue3"]={79, 148, 205}, -["SteelBlue4"]={54, 100, 139}, -["tan"]={210, 180, 140}, -["tan1"]={255, 165, 79}, -["tan2"]={238, 154, 73}, -["tan3"]={205, 133, 63}, -["tan4"]={139, 90, 43}, -["thistle"]={216, 191, 216}, -["thistle1"]={255, 225, 255}, -["thistle2"]={238, 210, 238}, -["thistle3"]={205, 181, 205}, -["thistle4"]={139, 123, 139}, -["tomato"]={255, 99, 71}, -["tomato1"]={255, 99, 71}, -["tomato2"]={238, 92, 66}, -["tomato3"]={205, 79, 57}, -["tomato4"]={139, 54, 38}, -["turquoise"]={64, 224, 208}, -["turquoise1"]={0, 245, 255}, -["turquoise2"]={0, 229, 238}, -["turquoise3"]={0, 197, 205}, -["turquoise4"]={0, 134, 139}, -["violet"]={238, 130, 238}, -["violet red"]={208, 32, 144}, -["VioletRed"]={208, 32, 144}, -["VioletRed1"]={255, 62, 150}, -["VioletRed2"]={238, 58, 140}, -["VioletRed3"]={205, 50, 120}, -["VioletRed4"]={139, 34, 82}, -["wheat"]={245, 222, 179}, -["wheat1"]={255, 231, 186}, -["wheat2"]={238, 216, 174}, -["wheat3"]={205, 186, 150}, -["wheat4"]={139, 126, 102}, -["white"]={255, 255, 255}, -["white smoke"]={245, 245, 245}, -["WhiteSmoke"]={245, 245, 245}, -["yellow"]={255, 255, 0}, -["yellow green"]={154, 205, 50}, -["yellow1"]={255, 255, 0}, -["yellow2"]={238, 238, 0}, -["yellow3"]={205, 205, 0}, -["yellow4"]={139, 139, 0}, -["YellowGreen"]={154, 205, 50} - -} diff --git a/examples/empty_template/LICK/lib/docs/classes/Circle.html b/examples/empty_template/LICK/lib/docs/classes/Circle.html deleted file mode 100644 index 852dc53..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/Circle.html +++ /dev/null @@ -1 +0,0 @@ -Circle

Circle               drawable circle

       function(self, x, y, r, s, color)

               Constructor

       draw(style)

              draw the circle
\ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/classes/Drawable.html b/examples/empty_template/LICK/lib/docs/classes/Drawable.html deleted file mode 100644 index dcd58a1..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/Drawable.html +++ /dev/null @@ -1 +0,0 @@ -Drawable

Drawable               base class for all drawable stuff

       function(self, x, y, color)

               Constructor

       wrapX(min, max)

              can be called via wrapX(max) or wrapX(min,max)

       wrapY(min, max)

              can be called via wrapY(max) or wrapY(min,max)

       wrap(str, min, max)

              internal wrapper

       set(str, val)

              supercollider style 'set'

       draw()

              not yet implemented
\ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/classes/Line.html b/examples/empty_template/LICK/lib/docs/classes/Line.html deleted file mode 100644 index 4faa005..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/Line.html +++ /dev/null @@ -1 +0,0 @@ -Line

Line               draw a line

       function(self, x, y, tx, ty)

               Constructor \ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/classes/Object.html b/examples/empty_template/LICK/lib/docs/classes/Object.html deleted file mode 100644 index 84c6db9..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/Object.html +++ /dev/null @@ -1 +0,0 @@ -Object

Object               base class

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/classes/SCObject.html b/examples/empty_template/LICK/lib/docs/classes/SCObject.html deleted file mode 100644 index 2d1621a..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/SCObject.html +++ /dev/null @@ -1 +0,0 @@ -SCObject

SCObject               bass class for supercollider communication

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/classes/SCSynth.html b/examples/empty_template/LICK/lib/docs/classes/SCSynth.html deleted file mode 100644 index b2f94ac..0000000 --- a/examples/empty_template/LICK/lib/docs/classes/SCSynth.html +++ /dev/null @@ -1 +0,0 @@ -SCSynth

SCSynth               supercollider synthesizer class

       function(self, nodename, freq)

               Constructor

       set(control, val)

              set a control, TODO: variable lenght of argument-pairs

        os.time(),

              bundle",

       play()

              sends an OSC message to the supercollider to start the synth

        os.time(),

              bundle",

       free()

              frees the node on the supercollider server

        os.time()+0.8,

              bundle",
\ No newline at end of file diff --git a/examples/empty_template/LICK/lib/docs/guidelines.html b/examples/empty_template/LICK/lib/docs/guidelines.html deleted file mode 100644 index b394e30..0000000 --- a/examples/empty_template/LICK/lib/docs/guidelines.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - -

Guidelines for new live_libs classes

-


-

1. Howto write a new class

-


-

-

<class name> =  Class(<constructor>)

-

creates a class with function in constructor

-


-

<class name>:inherit(<other class name>)

-

if you want to inherit from any class.Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table

-


-

If you want to call the constructor of the superclass write the following in the constructor of the current class:

-

-

<super class name>.<construct>(self, <arguments>)

-


-

More on Classes and HUMP: http://vrld.github.com/hump/

-


-

2. Commenting

-

-

In order to work the comment parser needs the following comment 'marks':

-


-


-

-- @ <class name>:<short description>

-

This marks a new class. The following line should be the class definition

-

Note: only one line comments are working

-


-

-- # <description>

-

This marks a new method.

-

Note: the limitations of class comments apply

-


-

any '--' without marks will not be included in the helpfile

-

-

Example:

-

-- @Drawable: base class for all drawable stuff

-

Drawable = Class(function(self, x, y, color)

-

self.color = color or hlpr.color("white",255)

-

-- call constructor of Object class

-

Object.construct(self)

-

self.position = Vector(x or 0,y or 0)

-

end)

-

Drawable:inherit(Object)

-


-

-- #can be called via wrapX(max) or wrapX(min,max)

-

function Drawable:wrapX(min, max)

-

if min and max then

-

self:wrap("x", min, max)

-

elseif min and not max then 

-

self:wrap("x", 0, min)

-

end

-

end

-


-


- - diff --git a/examples/empty_template/LICK/lib/docs/guidelines.txt b/examples/empty_template/LICK/lib/docs/guidelines.txt deleted file mode 100644 index fd1010f..0000000 --- a/examples/empty_template/LICK/lib/docs/guidelines.txt +++ /dev/null @@ -1,51 +0,0 @@ -Guidelines for new live_libs classes - -1. Howto write a new class - - - = Class() - creates a class with function in constructor - - :inherit() - if you want to inherit from any class. Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table - -If you want to call the constructor of the superclass write the following in the constructor of the current class: - - .(self, ) -More on Classes and HUMP: http://vrld.github.com/hump/ - -2. Commenting - - In order to work the comment parser needs the following comment 'marks': - - - -- @ : - This marks a new class. - Note: only oneliners are working - - -- # - This marks a new method. - Note: limitation of class comments apply - - any '--' without marks will not be included in the helpfile - - Example: - -- @Drawable: base class for all drawable stuff - Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - self.position = Vector(x or 0,y or 0) - end) - Drawable:inherit(Object) - - -- #can be called via wrapX(max) or wrapX(min,max) - function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end - end - - diff --git a/examples/empty_template/LICK/lib/docs/index.html b/examples/empty_template/LICK/lib/docs/index.html deleted file mode 100644 index 6868575..0000000 --- a/examples/empty_template/LICK/lib/docs/index.html +++ /dev/null @@ -1 +0,0 @@ -live_libs_doc

live_libs documentation

Guidelines for new classes and commenting

Classes:

Object
SCObject
SCSynth
Drawable
Circle
Line
\ No newline at end of file diff --git a/examples/empty_template/LICK/lib/help.lua b/examples/empty_template/LICK/lib/help.lua deleted file mode 100644 index 744ffd4..0000000 --- a/examples/empty_template/LICK/lib/help.lua +++ /dev/null @@ -1,109 +0,0 @@ --- parse the classes to readable html - -module(..., package.seeall) - -filename = "LICK/lib/object.lua" -help_filename = "LICK/lib/docs/" - --- some styles -local style = "" - -local header1 = "" -local header2 = ""..style.."" -local footer = "" -local _newclasstitle = "

" -local newclasstitle_ = "

" -local tab = "       " - - --- generates the html file -function generate() - class_file = love.filesystem.newFile( filename ) - class_file:open('r') - local output = "" - output = header1.."test"..header2 - local found_methods = 0 - local found_classes = 0 - local classes = {} - for line in class_file:lines() do - local b,e = string.find(line,"@") - local b1,e1 = string.find(line,"Class") - if b and e then - if found_classes > 0 then - output = output..footer - writeClassFile(name, output) - local output = "" - - end - dp,ep = string.find(line, ":") - name = line:sub(e+1, dp-1 or 0) - print(name) - table.insert(classes,name) - output = header1..name..header2 - - output = output .._newclasstitle .. name..tab..tab..line:sub(dp+1) ..newclasstitle_ - found_methods = 0 - found_classes = found_classes + 1 - elseif b1 and e1 and not string.find(line,"require") then - output = output .."

"..tab..line:sub(e1+2).."

"..tab..tab.." Constructor" - - end - local b,e = string.find(line,"#") - if method then - local dp,ep = string.find(line, ":") - ep = ep or 1 - if found == 0 then - output = output .."

Methods

" - found_methods = found_methods + 1 - end - output = output.."

".. tab ..line:sub(ep+1).."

"..tab..tab..method - method = nil - end - if b and e then - method = line:sub(e+1).."
" - - --output = output..line:sub(e+1).."
" - end - end - output = output..footer - writeClassFile(name, output) - - -- generate index.html - index = header1.."live_libs_doc"..header2 - index = index.."

live_libs documentation

" - index = index .. "Guidelines for new classes and commenting" - index = index.. "

Classes:

" - for i,v in ipairs(classes) do - index = index..""..v.."
" - end - index = index..footer - writeFile("index", index) - - -end - -function writeClassFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename.."classes/"..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - -function writeFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - - diff --git a/examples/empty_template/LICK/lib/hlpr.lua b/examples/empty_template/LICK/lib/hlpr.lua deleted file mode 100644 index 13ded41..0000000 --- a/examples/empty_template/LICK/lib/hlpr.lua +++ /dev/null @@ -1,350 +0,0 @@ --- hlpr libary: it's not about nice coding, ist about fast and easy coding --- by Rukano and Headchant, 2011 - - --- global math -pi = math.pi -sin = math.sin -deg = math.deg -rad = math.rad - -State = State or {} - -function declare(t) - for i,v in pairs(t) do - if not State[i] then - State[i] = v - _G[i] = State[i] - end - end -end -require "LICK/lib/color" -module(...,package.seeall) - --- syntax shortcuts -checkMode = love.graphics.checkMode -circle = love.graphics.circle -clear = love.graphics.clear -draw = love.graphics.draw -drawq = love.graphics.drawq -getBackgroundColor = love.graphics.getBackgroundColor -getBlendMode = love.graphics.getBlendMode -getCaption =love.graphics.getCaption -getColor = love.graphics.getColor -getColorMode = love.graphics.getColorMode -getFont = love.graphics.getFont -getHeight = love.graphics.getHeight -getLineStipple = love.graphics.getLineStipple -getLineStyle = love.graphics.getLineStyle -getLineWidth = love.graphics.getLineWidth -getMaxPointSize = love.graphics.getMaxPointSize -getModes = love.graphics.getModes -getPointSize = love.graphics.getPointSize -getPointStyle = love.graphics.getPointStyle -getScissor = love.graphics.getScissor -getWidth = love.graphics.getWidth -isCreated = love.graphics.isCreated -line = love.graphics.line -newFont = love.graphics.newFont -newFrameBuffer = love.graphics.newFramebuffer -newImage = love.graphics.newImage -newImageFont = love.graphics.newImageFont -newParticleSystem = love.graphics.newParticleSystem -newQuad = love.graphics.newQuad -newScreenshot = love.graphics.newScreenshot -newSpriteBatch = love.graphics.newSpriteBatch -point = love.graphics.point -polygon = love.graphics.polygon -pop = love.graphics.pop -present = love.graphics.present -print = love.graphics.print -printf = love.graphics.printf -push = love.graphics.push -quad = love.graphics.quad -rectagle = love.graphics.rectangle -reset = love.graphics.reset -rotate = love.graphics.rotate -scale = love.graphics.scale -setBackgroundColor = love.graphics.setBackgroundColor -setBlendMode = love.graphics.setBlendMode -setCaption = love.graphics.setCaption -setColor = love.graphics.setColor -setColorMode = love.graphics.setColorMode -setFont = love.graphics.setFont -setIcon = love.graphics.setIcon -setLine = love.graphics.setLine -setLineStipple = love.graphics.setLineStipple -setLineStyle = love.graphics.setLineStyle -setLineWidth = love.graphics.setLineWidth -setMode = love.graphics.setMode -setPoint = love.graphics.setPoint -setPointSize = love.graphics.setPointSize -setPointStyle = love.graphics.setPointStyle -setRenderTarget = love.graphics.setRenderTarget -setScissor = love.graphics.setScissor -toggleFullscreen = love.graphics.toggleFullscreen -translate = love.graphics.translate -triangle = love.graphics.triangle - - - - - - -function color(r, g,b,a) - local color={} - local alpha=a or 255 - local name=r or "azure" - if type(r) == "string" then - alpha = g or alpha - color = x11_color_table[name] - else - color[1]=r - color[2]=g - color[3]=b - end - color[4]=alpha - return color -end - --- clip withing range -function clip(n,min,max) - return math.min(math.max(n, min or -math.huge), max or math.huge) -end - --- wrap within range, updated version -function wrap(n, min, max) - local min = min or 0 - return ((n - min) % ((max or 0) - min)) + min -end - --- setColor white -function white() - love.graphics.setColor(255,255,255,255) -end - --- setColor black -function black() - love.graphics.setColor(0,0,0,255) -end - --- shorter setColor white -function w() - white() -end - --- shorter setColor black -function b() - black() -end - --- fill the screen with translucent black -function clear(alpha) - love.graphics.setColor(0,0,0,alpha) - love.graphics.rectangle("fill", 0,0,800,600) -end - --- shorter clear -function cls(alpha) - clear(alpha) -end - --- one time clear -function cls_once() - love.graphics.setColor(0,0,0,255) - love.graphics.rectangle("fill", 0,0,800,600) -end - - --- returns random values from -1 to 1, g sets the equidistance -function norm_random() - return 2 * math.random() - 1 -end - --- shorte norm_random -function n_rnd() - return norm_random() -end - --- drunk, brownnoise/drunk walk: x = x +/- random(width) -function drunk(x, width, g) - x = x or 0 - width = width or 1 - g = g or 100 - return (x + width*norm_random()) -end - - --- drnk, shorter version of drunk, start is only used the first time --- this makes some sense whatsoever... -function drnk(width) - local last = 0 - return function() - last = last + width * norm_random() - return last - end -end - --- scaling functions: - -function linlin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linlin - - local n=n or 0 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case you forgot the parameters... - return n - end - - if clip == "minmax" then - if n <= inMin then - return minoutMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((n-inMin)/(inMax-inMin)) * (outMax-outMin)) + outMin - return n -end - -function linexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = math.pow(outMax/outMin, (n-inMin)/(inMax-inMin)) * outMin - return n -end - -function explin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:explin - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((math.log(n/inMin)) / (math.log(inMax/inMin))) * (outMax-outMin)) + outMin - return n -end - -function expexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:expexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - -- here is the magic! - n = math.pow(outMax/outMin, math.log(n/inMin) / math.log(inMax/inMin)) * outMin - return n -end - --- returns easy sine oscillator -function sin() - local x = 0 - return function(dt) - x = x + (dt or 0) - if x > 2 * pi then x = x - 2*pi end - return math.sin(x) - end -end - --- updates all objects in the _object table -function update_objects() - for i,v in ipairs(_internal_object_table) do - v:update(dt) - end -end - --- rotate around center -function rotateCenter(angle) - local angle=angle or 0 - local w, h = getWidth(), getHeight() - translate(w/2, h/2) - rotate(angle) - translate(-w/2, -h/2) -end - --- return a random table entry -function choose(table) - return table[math.random(#table)] -end diff --git a/examples/empty_template/LICK/lib/hump/README.md b/examples/empty_template/LICK/lib/hump/README.md deleted file mode 100644 index 759c724..0000000 --- a/examples/empty_template/LICK/lib/hump/README.md +++ /dev/null @@ -1,48 +0,0 @@ -HUMP - Helper Utilities for Massive Progression -=============================================== - -__HUMP__ is a small collection of tools for developing games with LÖVE. - -Contents: ------------- - -* *vector.lua*: powerful vector class (pure lua) -* *class.lua*: "class" system supporting function inheritance (pure lua) -* *camera.lua*: translate-, zoom- and rotatable camera -* *gamestate.lua*: class to handle gamestates -* *ringbuffer.lua*: a circular container -* *sequence.lua*: utility to handle ingame cutscenes and such - -Documentation -============= - -You can find the documentation here: [http://vrld.github.com/hump/](http://vrld.github.com/hump/ "project page") - - -License -======= -Yay, *free software*: - -> Copyright (c) 2010 Matthias Richter -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> Except as contained in this notice, the name(s) of the above copyright holders -> shall not be used in advertising or otherwise to promote the sale, use or -> other dealings in this Software without prior written authorization. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/examples/empty_template/LICK/lib/hump/camera.lua b/examples/empty_template/LICK/lib/hump/camera.lua deleted file mode 100644 index 4bd8d14..0000000 --- a/examples/empty_template/LICK/lib/hump/camera.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, require, love = setmetatable, require, love -module(...) -local vector = require(_PACKAGE..'vector') - -local camera = {} -camera.__index = camera - -function new(pos, zoom, rot) - local pos = pos or vector(love.graphics.getWidth(), love.graphics.getHeight()) / 2 - local zoom = zoom or 1 - local rot = rot or 0 - return setmetatable({pos = pos, zoom = zoom, rot = rot}, camera) -end - -function camera:rotate(phi) - self.rot = self.rot + phi -end - -function camera:translate(t) - self.pos = self.pos + t -end -camera.move = camera.translate - -function camera:predraw() - local center = vector(love.graphics.getWidth(), love.graphics.getHeight()) / (self.zoom * 2) - love.graphics.push() - love.graphics.scale(self.zoom) - love.graphics.translate(center:unpack()) - love.graphics.rotate(self.rot) - love.graphics.translate((-self.pos):unpack()) -end - -function camera:postdraw() - love.graphics.pop() -end - -function camera:draw(func) - self:predraw() - func() - self:postdraw() -end - -function camera:toCameraCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = (p - self.pos):rotate_inplace(self.rot) - return vector(p.x * self.zoom + w/2, p.y * self.zoom + h/2) -end - -function camera:toWorldCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = vector((p.x-w/2) / self.zoom, (p.y-h/2) / self.zoom):rotate_inplace(-self.rot) - return p + self.pos -end - -function camera:mousepos() - return self:toWorldCoords(vector(love.mouse.getPosition())) -end - --- camera() as a shortcut to new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/empty_template/LICK/lib/hump/class.lua b/examples/empty_template/LICK/lib/hump/class.lua deleted file mode 100644 index 2b014b9..0000000 --- a/examples/empty_template/LICK/lib/hump/class.lua +++ /dev/null @@ -1,82 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local type, assert, pairs = type, assert, pairs -local tostring, string_format = tostring, string.format -module(...) - -local function __NULL__() end -function new(constructor) - -- check name and constructor - local name = '' - if type(constructor) == "table" then - if constructor.name then name = constructor.name end - constructor = constructor[1] - end - assert(not constructor or type(constructor) == "function", - string_format('%s: constructor has to be nil or a function', name)) - - -- build class - local c = {} - c.__index = c - c.__tostring = function() return string_format("", name) end - c.construct = constructor or __NULL__ - c.Construct = constructor or __NULL__ - c.inherit = inherit - c.Inherit = inherit - - local meta = { - __call = function(self, ...) - local obj = {} - self.construct(obj, ...) - return setmetatable(obj, self) - end, - __tostring = function() return tostring(name) end - } - - return setmetatable(c, meta) -end - -function inherit(class, interface, ...) - if not interface then return end - - -- __index and construct are not overwritten as for them class[name] is defined - for name, func in pairs(interface) do - if not class[name] and type(func) == "function" then - class[name] = func - end - end - - inherit(class, ...) -end - --- class() as shortcut to class.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/empty_template/LICK/lib/hump/gamestate.lua b/examples/empty_template/LICK/lib/hump/gamestate.lua deleted file mode 100644 index 746f81b..0000000 --- a/examples/empty_template/LICK/lib/hump/gamestate.lua +++ /dev/null @@ -1,154 +0,0 @@ ---[[ -Copyright (c) 2010-2011 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local error, assert, love = error, assert, love -module(...) - -local function __NULL__() end --- default gamestate produces error on every callback -local function __ERROR__() error("Gamestate not initialized. Use Gamestate.switch()") end -current = { - enter = __ERROR__, - leave = __NULL__, - update = __ERROR__, - draw = __ERROR__, - focus = __ERROR__, - keyreleased = __ERROR__, - keypressed = __ERROR__, - mousepressed = __ERROR__, - mousereleased = __ERROR__, - joystickpressed = __ERROR__, - joystickreleased = __ERROR__, - quit = __ERROR__, -} - -function new() - return { - enter = __NULL__, - leave = __NULL__, - update = __NULL__, - draw = __NULL__, - focus = __NULL__, - keyreleased = __NULL__, - keypressed = __NULL__, - mousepressed = __NULL__, - mousereleased = __NULL__, - joystickpressed = __NULL__, - joystickreleased = __NULL__, - quit = __NULL__, - } -end - -function switch(to, ...) - assert(to, "Missing argument: Gamestate to switch to") - current:leave() - local pre = current - current = to - return current:enter(pre, ...) -end - -local _update -function update(...) - if _update then _update(...) end - return current:update(...) -end - -local _draw -function draw(...) - if _draw then _draw(...) end - return current:draw(...) -end - -local _focus -function focus(...) - if _focus then _focus(...) end - return current:focus(...) -end - -local _keypressed -function keypressed(...) - if _keypressed then _keypressed(...) end - return current:keypressed(...) -end - -local _keyreleased -function keyreleased(...) - if _keyreleased then _keyreleased(...) end - return current:keyreleased(...) -end - -local _mousepressed -function mousepressed(...) - if _mousereleased then _mousepressed(...) end - return current:mousepressed(...) -end - -local _mousereleased -function mousereleased(...) - if _mousereleased then _mousereleased(...) end - return current:mousereleased(...) -end - -local _joystickpressed -function joystickpressed(...) - if _joystickpressed then _joystickpressed(...) end - return current:joystickpressed(...) -end - -local _joystickreleased -function joystickreleased(...) - if _joystickreleased then _joystickreleased(...) end - return current:joystickreleased(...) -end - -local _quit -function quit(...) - if _quit then _quit(...) end - return current:quit(...) -end - -function registerEvents() - _update = love.update - love.update = update - _draw = love.draw - love.draw = draw - _focus = love.focus - love.focus = focus - _keypressed = love.keypressed - love.keypressed = keypressed - _keyreleased = love.keyreleased - love.keyreleased = keyreleased - _mousepressed = love.mousepressed - love.mousepressed = mousepressed - _mousereleased = love.mousereleased - love.mousereleased = mousereleased - _joystickpressed = love.joystickpressed - love.joystickpressed = joystickpressed - _joystickreleased = love.joystickreleased - love.joystickreleased = joystickreleased - _quit = love.quit - love.quit = quit -end diff --git a/examples/empty_template/LICK/lib/hump/ringbuffer.lua b/examples/empty_template/LICK/lib/hump/ringbuffer.lua deleted file mode 100644 index 2b2b3cb..0000000 --- a/examples/empty_template/LICK/lib/hump/ringbuffer.lua +++ /dev/null @@ -1,99 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable, table = setmetatable, getmetatable, table -module(...) -local ringbuffer = {} -ringbuffer.__index = ringbuffer - -function new(...) - local rb = {} - rb.items = {...} - rb.current = 1 - return setmetatable(rb, ringbuffer) -end - -function ringbuffer:insert(item, ...) - if not item then return end - -- insert rest before self so order is restored, e.g.: - -- {1,<2>,3}:insert(4,5) -> {1,<2>,3}:insert(5) -> {1,<2>,5,3} -> {1,<2>,4,5,3} - self:insert(...) - table.insert(self.items, self.current+1, item) -end - -function ringbuffer:append(item, ...) - if not item then return end - self.items[#self.items+1] = item - return self:append(...) -end - -function ringbuffer:removeAt(k) - -- wrap position - local pos = (self.current + k) % #self.items - while pos < 1 do pos = pos + #self.items end - - -- remove item - local item = table.remove(self.items, pos) - - -- possibly adjust current pointer - if pos < self.current then self.current = self.current - 1 end - if self.current > #self.items then self.current = 1 end - - -- return item - return item -end - -function ringbuffer:remove() - return table.remove(self.items, self.current) -end - -function ringbuffer:get() - return self.items[self.current] -end - -function ringbuffer:size() - return #self.items -end - -function ringbuffer:next() - self.current = (self.current % #self.items) + 1 - return self:get() -end - -function ringbuffer:prev() - self.current = self.current - 1 - if self.current < 1 then - self.current = #self.items - end - return self:get() -end - --- Ringbuffer() as a shortcut to Ringbuffer.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/empty_template/LICK/lib/hump/timer.lua b/examples/empty_template/LICK/lib/hump/timer.lua deleted file mode 100644 index 2ce460d..0000000 --- a/examples/empty_template/LICK/lib/hump/timer.lua +++ /dev/null @@ -1,83 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local assert, type = assert, type -local pairs, ipairs = pairs, ipairs -local min = math.min -module(...) - -functions = {} -function update(dt) - local to_remove = {} - for func, delay in pairs(functions) do - delay = delay - dt - if delay <= 0 then - to_remove[#to_remove+1] = func - else - functions[func] = delay - end - end - for _,func in ipairs(to_remove) do - functions[func] = nil - func(func) - end -end - -function add(delay, func) - assert(type(func) == "function", "second argument needs to be a function") - functions[func] = delay -end - -function addPeriodic(delay, func, count) - assert(type(func) == "function", "second argument needs to be a function") - if count then - return add(delay, function(f) func(func) count = count - 1 if count > 0 then add(delay, f) end end) - end - return add(delay, function(f) func(func) add(delay, f) end) -end - -function clear() - functions = {} -end - -function Interpolator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - return t <= length and func((t-dt)/length, ...) or nil - end -end - -function Oscillator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - while t > length do t = t - length end - return func(t/length, ...) - end -end diff --git a/examples/empty_template/LICK/lib/hump/vector.lua b/examples/empty_template/LICK/lib/hump/vector.lua deleted file mode 100644 index b84f948..0000000 --- a/examples/empty_template/LICK/lib/hump/vector.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local assert, type, tonumber = assert, type, tonumber -local sqrt, cos, sin = math.sqrt, math.cos, math.sin -module(...) - -local vector = {} -vector.__index = vector - -function new(x,y) - local v = {x = x or 0, y = y or 0} - setmetatable(v, vector) - return v -end - -function isvector(v) - return getmetatable(v) == vector -end - -function vector:clone() - return new(self.x, self.y) -end - -function vector:unpack() - return self.x, self.y -end - -function vector:__tostring() - return "("..tonumber(self.x)..","..tonumber(self.y)..")" -end - -function vector.__unm(a) - return new(-a.x, -a.y) -end - -function vector.__add(a,b) - assert(isvector(a) and isvector(b), "Add: wrong argument types ( expected)") - return new(a.x+b.x, a.y+b.y) -end - -function vector.__sub(a,b) - assert(isvector(a) and isvector(b), "Sub: wrong argument types ( expected)") - return new(a.x-b.x, a.y-b.y) -end - -function vector.__mul(a,b) - if type(a) == "number" then - return new(a*b.x, a*b.y) - elseif type(b) == "number" then - return new(b*a.x, b*a.y) - else - assert(isvector(a) and isvector(b), "Mul: wrong argument types ( or expected)") - return a.x*b.x + a.y*b.y - end -end - -function vector.__div(a,b) - assert(isvector(a) and type(b) == "number", "wrong argument types (expected / )") - return new(a.x / b, a.y / b) -end - -function vector.__eq(a,b) - return a.x == b.x and a.y == b.y -end - -function vector.__lt(a,b) - return a.x < b.x or (a.x == b.x and a.y < b.y) -end - -function vector.__le(a,b) - return a.x <= b.x and a.y <= b.y -end - -function vector.permul(a,b) - assert(isvector(a) and isvector(b), "permul: wrong argument types ( expected)") - return new(a.x*b.x, a.y*b.y) -end - -function vector:len2() - return self * self -end - -function vector:len() - return sqrt(self*self) -end - -function vector.dist(a, b) - assert(isvector(a) and isvector(b), "dist: wrong argument types ( expected)") - return (b-a):len() -end - -function vector:normalize_inplace() - local l = self:len() - self.x, self.y = self.x / l, self.y / l - return self -end - -function vector:normalized() - return self / self:len() -end - -function vector:rotate_inplace(phi) - local c, s = cos(phi), sin(phi) - self.x, self.y = c * self.x - s * self.y, s * self.x + c * self.y - return self -end - -function vector:rotated(phi) - return self:clone():rotate_inplace(phi) -end - -function vector:perpendicular() - return new(-self.y, self.x) -end - -function vector:projectOn(v) - assert(isvector(v), "invalid argument: cannot project onto anything other than a new.") - return (self * v) * v / v:len2() -end - -function vector:cross(other) - assert(isvector(other), "cross: wrong argument types ( expected)") - return self.x * other.y - self.y * other.x -end - --- vector() as shortcut to vector.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/empty_template/LICK/lib/images/circle.png b/examples/empty_template/LICK/lib/images/circle.png deleted file mode 100755 index 8f9ac298933bf58968999f36cefb08dc3d6db2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 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 QVE_OC07*qoM6N<$f~Wjp+5i9m diff --git a/examples/empty_template/LICK/lib/images/holger.png b/examples/empty_template/LICK/lib/images/holger.png deleted file mode 100755 index 7e78b87226d0b368fe2d05941677a0b9119b2d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9945 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

>$y9lIvA!1##Q};vU!jjQNqnKA-NSS~y2H9t{ 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 Hu0mjfVRhi| diff --git a/examples/empty_template/LICK/lib/images/spiral2.png b/examples/empty_template/LICK/lib/images/spiral2.png deleted file mode 100755 index d7b9627786701053779e76ece6b0687bbe71de9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17174 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 diff --git a/examples/empty_template/LICK/lib/images/star.png b/examples/empty_template/LICK/lib/images/star.png deleted file mode 100755 index 85395e81de310b7b5af0dc3f68dcb48e6718712d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -local socket = require "socket" -local base = _G -local string = require("string") -local vstruct = require "LICK/lib/loveosc/vstruct" -local pack = vstruct.pack -local upack = vstruct.unpack - --------------------------------- --- some constants --------------------------------- - -osc.client = {} -osc.client.host = "localhost" -osc.client.port = 57110 -osc.client.timeout = 0 - -PROTOCOL = "OSC/1.0" - -ADJUSTMENT_FACTOR = 2208988800 - -IMMEDIATE = string.rep('0', 31) .. '1' - - -function osc.client:send( data ) - local ip, port = assert(socket.dns.toip(osc.client.host)), osc.client.port - -- create a new UDP object - local udp = assert(socket.udp()) - udp:settimeout(0) - - --print(encode(data)) - assert(udp:sendto(encode(data), ip, port), "could not send data") - --assert(udp:sendto(data, ip, port), "could not send data") - - -- retrieve the answer and print results, warning: crashes love - --print(udp:receive() or "") -end - - --------------------------------- --- interface functions: --- decode(string) --- and encode(table) --------------------------------- - -function decode(data) - if #data == 0 then - return nil - end - if string.match(data, "^#bundle") then - return decode_bundle(data) - else - return decode_message(data) - end -end - - -function encode(data) - local msg = "" - local idx = 1 - if data == nil then - return nil - end - - if data[1] == "#bundle" then - msg = msg .. encode_string(data[1]) - --print("1 "..msg.."\n") - msg = msg .. encode_timetag(data[2]) - --print("2 "..msg.."\n") - idx = 3 - while idx <= #data do - local submsg = encode(data[idx]) - msg = msg .. encode_int(#submsg) .. submsg - --print(idx.." "..submsg.."\n") - idx = idx + 1 - end - return msg - else - local typestring = "," - local encodings = "" - idx = idx + 1 - msg = msg .. encode_string(data[1]) - for t, d in iter_pairwise(data, idx) do - typestring = typestring .. t - encodings = encodings .. collect_encoding_for_message(t, d) - end - --print("else "..msg..encode_string(typestring) .. encodings.."\n") - - return msg .. encode_string(typestring) .. encodings - end -end - - --------------------------------- --- auxilliary functions --------------------------------- - -digits = {} -for i=0,9 do digits[i] = string.char(string.byte('0')+i) end -for i=10,36 do digits[i] = string.char(string.byte('A')+i-10) end - -function numberstring(number, bas) - local s = "" - repeat - local remainder = base.math.mod(number,bas) - s = digits[remainder]..s - number = (number-remainder)/bas - until number==0 - return s -end - - -function next_string(astring) - -- this is a workaraound because the lua pttern matching is - -- not as powerful as pcre and I did not want to include another - -- dependecy to an external re lib - local pos = 0 - local num_nzero = 0 - local num_zero = 0 - local result = "" - if astring == nil then - -- ensure that string is not empty - base.error("error: string is empty - probably malformated message") - end - -- we match every character with the help of gmatch - for m in string.gmatch(astring, ".") do - pos = pos + 1 - -- and then check if it is correctly padded with '\0's - if m ~= '\0' and num_zero == 0 then - num_nzero = (num_nzero + 1) % 4 - result = result .. m - elseif num_zero ~= 0 and (num_zero + num_nzero) % 4 == 0 then - return result, pos - elseif m == '\0' then - num_zero = num_zero + 1 - result = result .. m - else - return nil - end - end -end - -function iter_pairwise(atable, startvalue) - local index = startvalue - 2 - return function() - index = index + 2 - return atable[index], atable[index+1] - end -end - -function collect_encoding_for_message(t, data) - if t == 'i' then - return encode_int(data) - elseif t == 'f' then - return encode_float(data) - elseif t == 's' then - return encode_string(data) - elseif t == 'b' then - return encode_blob(data) - end -end - -function collect_decoding_from_message(t, data, message) - table.insert(message, t) - if t == 'i' then - table.insert(message, decode_int(data)) - return string.sub(data, 5) - elseif t == 'f' then - table.insert(message, decode_float(data)) - return string.sub(data, 5) - elseif t == 's' then - local match, last = next_string(data) - table.insert(message, match) - return string.sub(data, last) - elseif t == 'b' then - local length = decode_int(data) - table.insert(message, string.sub(data, 4, length)) - return string.sub(data, 4 + length + 1) - end -end - -function get_addr_from_data(data) - local addr_raw_string,last = next_string(data) - local result = "" - if addr_raw_string == nil then - -- if we could not find an addr something went wrong - base.error("error: could not extract address from OSC message") - end - -- delete possible trailing zeros - for t in string.gmatch(addr_raw_string, "[^%z]") do - result = result .. t - end - return result, string.sub(data, last) -end - -function get_types_from_data(data) - local typestring, last = next_string(data) - local result = {} - if typestring == nil then - return {} - end - -- split typestring into an iterable table - for t in string.gmatch(typestring, "[^,%z]") do - table.insert(result, t) - end - return result, string.sub(data, last) -end - --------------------------------- --- decoding functions --------------------------------- - -function decode_message(data) - local types, addr, tmp_data = nil - local message = {} - addr, tmp_data = get_addr_from_data(data) - types, tmp_data = get_types_from_data(tmp_data) - -- ensure that we at least found something - if addr == nil or types == nil then - return nil - end - for _,t in base.ipairs(types) do - tmp_data = collect_decoding_from_message(t, tmp_data, message) - end - return message -end - - -function decode_bundle(data) - local match, last = next_string(data) - local tmp_data = nil - local msg = {} - local sec, frac - -- skip first string data since it will only contian #bundle - tmp_data = string.sub(data, 9) - -- check that there is a part of the message left - if not tmp_data then - return nil - end - table.insert(msg, "#bundle") - _, sec, frac = upack("> u4 > u4", {string.sub(tmp_data, 1, 8)}) - -- note this is an awful way of decoding to a bin string and - -- then decoding the frac again TODO: make this nicer - frac = numberstring(frac, 2) - if sec == 0 and frac == IMMEDIATE then - table.insert(msg, 0) - else - table.insert(msg, sec - ADJUSTMENT_FACTOR + decode_frac(frac) ) - end - tmp_data = string.sub(tmp_data, 9) - while #tmp_data > 0 do - local length = decode_int(string.sub(tmp_data,1,4)) - table.insert(msg, decode(string.sub(tmp_data, 5, 4 + length))) - tmp_data = string.sub(tmp_data, 9 + length) - end - return msg -end - -function decode_frac(bin) - local frac = 0 - for i=#bin,1 do - frac = (frac + string.sub(bin, i-1, i)) / 2 - end - return frac -end - -function decode_float(bin) - local pos, res = upack("> f4", {bin}) - return res -end - -function decode_int(bin) - local pos, res = upack("> i4", {bin} ) - return res -end - --------------------------------- --- encoding --------------------------------- - -function encode_string(astring) - local fillbits = (4 - #astring % 4) - return astring .. string.rep('\0', fillbits) -end - -function encode_int(num) - return pack("> i4",{ num }) -end - -function encode_blob(blob) - return encode_int(#blob) .. encode_string(#blob) -end - -function encode_timetag(tpoint) - if tpoint == 0 then - return IMMEDIATE - else - local sec = math.floor(tpoint) - local frac = tpoint - sec - - return pack("> u4 > u4", {sec + ADJUSTMENT_FACTOR , encode_frac(frac)}) - - end -end - - - -function encode_frac(num) - local bin = "" - local frac = num - while #bin < 32 do - bin = bin .. base.math.floor(frac * 2) - frac = (frac * 2) - base.math.floor(frac * 2) - end - return bin -end - -function encode_float(num) - return pack("> f4", {num}) -end diff --git a/examples/empty_template/LICK/lib/loveosc/init.lua b/examples/empty_template/LICK/lib/loveosc/init.lua deleted file mode 100644 index d7f0bfb..0000000 --- a/examples/empty_template/LICK/lib/loveosc/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -osc = {} -require "LICK/lib/loveosc/client" -require "LICK/lib/loveosc/server" diff --git a/examples/empty_template/LICK/lib/loveosc/server.lua b/examples/empty_template/LICK/lib/loveosc/server.lua deleted file mode 100644 index 3a9a93f..0000000 --- a/examples/empty_template/LICK/lib/loveosc/server.lua +++ /dev/null @@ -1,81 +0,0 @@ ---[[ - -- luaosc Copyright (C) 2009 Jost Tobias Springenberg -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -require "socket" - -osc.server = {} -osc.server.host = "localhost" -osc.server.port = 7771 -osc.server.socket = socket.udp() or error('error could not create lua socket object') -osc.server.socket:setsockname(osc.server.host, osc.server.port) -osc.server.socket:settimeout(0) - --- call this in LÖVE update -function osc.server:update(dt) - - local message, from = osc.server.socket:receive(1024) - -- invoke handler function - if message ~= nil then - local success, result = pcall(decode, message) - if not success then - print("Error in decoding: \n" .. result) - else - success, result = pcall(handle, from, result) - if not success then - print("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - -end - - --- use this to start the server in lua only (not with LÖVE!) -function osc.server:start() - local length = 1024 - while 1 do - local message, from = self.socket:receivefrom(1024) - -- invoke handler function - if message ~= nil then - local success, result = base.pcall(osc.decode, message) - if not success then - base.io.stderr:write("Error in decoding: \n" .. result) - else - success, result = base.pcall(self.handle, from, result) - if not success then - base.io.stderr:write("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - end - end - - - -function osc.server:setHandler(hdle) - handle = hdle -end diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/CHANGES b/examples/empty_template/LICK/lib/loveosc/vstruct/CHANGES deleted file mode 100755 index ea42ce0..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/CHANGES +++ /dev/null @@ -1,30 +0,0 @@ -1.0 ---- -Bugfixes to read error handling -Ability to return unpacked values rather than tables - -1.0 beta 4 ----------- -Added the ability to say 's' with no width to read until EOF. -Modified struct.unpack and struct.pack to return the number of bytes -read/written as a second value. Note that this is not the same as the r/w -pointer delta if seeks are involved. - -1.0 beta 3 ----------- -Lots of bugfixing and general cleanup -Improved error reporting -API name changes - -1.0 beta 2 ----------- -Added the counted string format "c". -Added float and double support, courtesy of Peter "Corsix" Cawley. -Updated the test framework. -Fixed a bug in format m that could result in data loss when manipulating fields -of 7 bytes or more width. - - -1.0 beta 1 ----------- -Released to the world. diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/COPYING b/examples/empty_template/LICK/lib/loveosc/vstruct/COPYING deleted file mode 100755 index 430bce8..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2008 Ben "ToxicFrog" Kelly -FP module copyright 2008 Peter "Corsix" Cawley - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/README b/examples/empty_template/LICK/lib/loveosc/vstruct/README deleted file mode 100755 index e274888..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/README +++ /dev/null @@ -1,290 +0,0 @@ -Contents -======== -1. Overview -2. API -3. Warning! -4. The Format String - Naming - Grouping - Repetition -5. Format Specifiers -6. Credits - - -1. Overview -=========== -VStruct is a library for Lua 5.1. It provides functions for manipulating binary -data, in particular for unpacking binary files or byte buffers into Lua values -and for packing Lua values back into files or buffers. Supported data types -include: - - signed and unsigned integers of arbitrary byte width - - booleans and bitmasks - - plain and null-terminated strings - - fixed and floating point reals (the latter requires C module support) -In addition, the library supports seeking, alignment, and byte order controls, -repetition, grouping of data into tables, and naming of values within tables. - - - -2. API -====== -exports: - vstruct.pack(fmt, [fd], data) - vstruct.unpack(fmt, , [unpacked]) - vstruct.explode(int) - vstruct.implode(table) - vstruct.cursor(string) - vstruct.compile.read(format) - vstruct.compile.write(format) - -pack takes a format string and a table of data and packs the contents into a -buffer. If the fd argument is present, it will write the data directly to it -using standard file io methods (write and seek), and return the fd; otherwise -it will construct and return a string. In either case it also returns (as a -second value) the number of bytes written - note that if the format involved -seeks, this is not the same as the amount by which the write pointer moved -or the size of the packed string. - -unpack takes a format string and a buffer or file to unpack from, and returns -the unpacked data as a table. It also returns (as a second value) the number of -bytes read - note that if the format string involved seeks, this is not the same -as the difference between read pointer positions. If the _unpacked_ argument is -true, it will return the unpacked data as a series of values rather than as a -table, equivalent to using the standard Lua function unpack() on the return -value. Note that this means it will not return the number of bytes read as an -additional value. - -explode converts a bitmask into a list of booleans, and implode does the -converse. In such lists, list[1] is the least significant bit, and list[n] the -most significant. - -cursor wraps a string in something that looks, at first glance, like a file. -This permits strings to be wrapped and passed to the vstruct IO functions. The -wrapped string supports :seek, and has limited support for :read (the only -supported calling mode is :read(num_bytes)) and :write (as :write(buffer)). - -compile.read takes a format string and returns a function, which can later be -passed a file (or file-like object - see vstruct.cursor) to perform a read -operation. In effect, the following code: - f = vstruct.compile.read(fmt) - d = f(fd) -Is equivalent to: - d = vstruct.unpack(fd, fmt) -f can of course be called repeatedly, with different or the same fds each time. - -compile.write is the converse of compile.read. The emitted function expects a -file and a table of data elements, so that: - f = vstruct.compile.write(fmt) - f(fd, data) -Is equivalent to: - vstruct.pack(fd, fmt, data) -As with compile.read, the emitted function is fully re-usable. - - -3. Warning! -=========== -When reading and writing numeric formats, vstruct is inherently limited by lua's -number format, which is by default the IEEE 754 double. What this means in -practice is that formats cipPu may be subject to data loss when read in widths -of 7 bytes or more, if they contain more than 52 significant bits. (The same is -true of numeric constants declared in Lua itself, of course, and other libraries -which store values in lua numbers). -Formats bfmsxz are unaffected by this, as they either do not use lua numbers or -are guaranteed to fit inside them. - -4. The Format String -==================== -The format string contains any number of endianness controls, seek controls, -format specifiers, and grouping/naming sequences, seperated by whitespace, -commas, or semicolons (or any mix thereof, although you are encouraged to choose -one and stick to it for the sake of consistency). Each of these is detailed -below. - -In the documentation below, the convention is that A represents an address and W -a width in bytes. At present only base-10 numerals are supported. - - -Naming ------- -Under normal operation, when unpacking, the library simply stores unpacked -values sequentially into a list, which is returned. Similarly, when packing, it -expects a list of values which will be packed in order. However, values can be -named, in which case the unpacked value will be stored in a field with that -name, and when packing, it will use the value stored with that key. This is done -by prefixing the format specifier with the name (which can be any sequence of -letters, numbers, and _, provided it does not start with a number) followed by a -':'. For example, the following format would generate a table with three keys, -'x', 'y', and 'z': - "x:u4 y:u4 z:u4" -And, when packing, would expect a table with those three keys and store their -corresponding values. - -If the same name is specified multiple times, or is combined with repetition -(see below), only the last read value is stored there. - -Named and anonymous values can be freely mixed; the named values will be -assigned to their given fields and the anonymous ones to sequential indices. - -Grouping --------- -Rather than generating or expecting a flat table, the library can be instructed to -create or read from a table containing subtables. This is done by surrounding the -group of values you wish to be packed with '{' and '}' in the format string. For example, -the following format string: - "{ u4 i4 } { s32 u4 }" -Would, rather than generating a list of four values, generate a list containing two -lists of two values each. -Similarly, when packing, it would expect not a flat list, but a list of sublists, from -which the values to be packed will be drawn. - -Groups can be named, so formats like: - "flags:m1 coords:{ x:u4 y:u4 z:u4 }" -Are permitted and meaningful. - - -Repetition ----------- -A {} group can be repeated by prefixing or suffixing it with a count, seperated -from the group by a '*'. For example: - "4 * { u4 }" - "{ u4 } * 4" - "{ u4 } { u4 } { u4 } { u4 }" -Are all equivalent. Note that the whitespace in the above examples is optional. -In cases where you want to repeat format specifiers without implying a grouping, -you can use (). For example: - "4 * (u4 b1)" -Is equivalent to: - "u4 b1 u4 b1 u4 b1 u4" -Like grouping, these can be nested. - - -5. Format Specifiers -==================== - -Endianness Controls -------------------- -The formats i, m, and u are affected by the endianness setting, which controls -the order in which bytes are read and written within a field. The following -characters in a format string adjust the endianness setting: - -< - Sets the endianness to little-endian (eg, Intel processors) -> - Sets the endianness to big-endian (eg, PPC and Motorola processors) -= - Sets the endianness to the native endianness. - - -Seek Controls -------------- -These characters are used to seek to specific locations in the input or output. -Note that they only work on buffers or file-like objects that support the seek() -method; for streams which cannot be sought on, use the 'x' (skip/null-pad) -data format instead. - -@A - Seek to absolute address A. -+A - Seek forward A bytes. --A - Seek backwards A bytes. -aW - Align to word width W (ie, seek to the next address which is a multiple of W) - - -Data Format Specifiers ----------------------- -bW Boolean. - Read: as uW, but returns true if the result is non-zero and false otherwise. - Write: as uW with input 1 if true and 0 otherwise. - -cW Counted string. - Read: uW to determine the length of the string W', followed by sW'. - Write: the length of the string as uW, followed by the string itself. - The counted string is a common idiom where a string is immediately prefixed - with its length, as in: - size_t len; - char[] str; - The counted string format can be used to easily read and write these. The - width provided is the width of the len field, which is treated as an - unsigned int. Only the string itself is returned (when unpacking) or - required (when packing). - The len field is affected by endianness, as in format u. - -fW IEEE 754 floating point. - Valid widths are 4 (float) and 8 (double). No quads yet, sorry! - Affected by endianness. - -iW Signed integer. - Read: a signed integer of width W bytes. - Write: a signed integer of width W bytes. - Floating point values will be truncated. - Affected by endianness. - -mW Bitmask. - Read: as uW, but explodes the result into a list of booleans, one per bit. - Write: implodes the input value, then writes it as uW. - Affected by endianness. - See also: vstruct.implode, vstruct.explode. - -pW Signed fixed point rational. - Width is in the format "I.F"; the value before the dot is the number of - bytes in the integer part, and the value after, in the fractional part. - Read: a fixed point rational of I+F bytes. - Write: a fixed point rational of I+F bytes. Values which cannot be exactly - represented in the specified width are truncated. - Affected by endianness. - -PW Signed fixed point rational with bit-aligned subfields - Equivalent to pW, except that the decimal point does not need to be byte - aligned; for example, formats such as P20.12 are possible. - Note that underlying reads must still occur in byte multiples. Using a W - such that I+F is not a multiple of 8 is an error. - -sW String. - Read: reads exactly W bytes and returns them as a string. If W is omitted, - reads until EOF. - Write: - If W is omitted, uses the string length. - If W is shorter than the string length, truncates the string. - If W is greater than the string length, null pads the string. - -uW Unsigned integer. - Read: an unsigned integer of width W bytes. - Write: an unsigned integer of width W bytes. - Floating point values will be truncated. - Negative values will be taken absolute. - Affected by endianness. - -xW Skip/pad. - Read: read and discard the next W bytes. - Write: write W zero bytes. - -zW Null terminated string. - Read: reads exactly W bytes. Returns everything up to the first zero byte. - If W is omitted, reads up to the next zero byte. - Write: writes exactly W bytes. - If the input is shorter than W, zero pads the output. - If as long or longer, truncates to W-1 and writes a zero byte at the end. - If W is omitted, uses the string length plus one (ie, writes the string - out entire and then null terminates it). - - - -6. Credits -========== - While most of the library code was written by me (Ben Kelly), the existence -of this library owes itself to many others: - The floating point code was contributed by Peter Cawley on lua-l. - The original inspiration came from Roberto Ierusalimschy's "struct" library -and Luiz Henrique de Figueiredo's "lpack" library, as well as the "struct" -available in Python. - sanooj, from #lua, has done so much testing and bug reporting that at this -point he's practically a co-author. - The overall library design and interface are the result of much discussion -with rici, sanooj, Keffo, snogglethorpe, Spark, kozure, Vornicus, McMartin, and -probably several others I've forgotten about on IRC (#lua on freenode and #code -on nightstar). - Finally, without Looking Glass Studios to make System Shock, and Team TSSHP -(in particular Jim "hairyjim" Cameron) to reverse engineer it, I wouldn't have -had a reason to write this library in the first place. diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/common.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/common.lua deleted file mode 100755 index 841b5c1..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/common.lua +++ /dev/null @@ -1,48 +0,0 @@ --- shared formats - seeking, endianness --- these should all return nil so that they do not mutate the data list --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local common = {} - --- determine if the host system is big-endian or not, by dumping an empty --- function and looking at the endianness flag --- this is kind of hackish -local function bigendian() - return string.byte(string.dump(function() end)) == string.char(0x00) -end -common.is_bigendian = bigendian() - --- seek controls -function common.seekto(fd, w) - fd:seek("set", w) -end - -function common.seekforward(fd, w) - fd:seek("cur", w) -end - -function common.seekback(fd, w) - fd:seek("cur", -w) -end - -function common.a(fd,w) - local a = fd:seek() - if a % w ~= 0 then - fd:seek("cur", w - (a % w)) - end -end - --- endianness controls -function common.littleendian(fd, w) - common.is_bigendian = false -end - -function common.bigendian(fd, w) - common.is_bigendian = true -end - -function common.hostendian(fd, w) - common.is_bigendian = bigendian() -end - -return common diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/compile.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/compile.lua deleted file mode 100755 index 942f743..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/compile.lua +++ /dev/null @@ -1,134 +0,0 @@ --- functions for turning a format string into a callable function --- they work by calling parse(), passing it the format string and --- a table of code generators appropriate for whether we are reading --- or writing. --- The resulting code is then prefixed with some setup code and postfixed --- with a return value and loadstring() is called on it to generate a function --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local require,loadstring,setfenv,type,select,unpack,setmetatable - = require,loadstring,setfenv,type,select,unpack,setmetatable - -local print,assert,error,xpcall,pairs,where - = print,assert,error,xpcall,pairs,debug.traceback - -module((...)) - -local parse = require(_PACKAGE.."parser") - -local function nulsafe_error(s) - return error(s:gsub('%z', '_')) -end - -local function xpcall2(f, err, ...) - local args = {n=select('#', ...), ...} - return xpcall(function() return f(unpack(args, 1, args.n)) end, err) -end - -local function err_generate(message, format, trace) - nulsafe_error([[ -struct: internal error in code generator -This is an internal error in the struct library -Please report it as a bug and include the following information: --- error message -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function err_compile(message, format, source) - nulsafe_error([[ -struct: syntax error in emitted lua source -This is an internal error in the struct library -Please report it as a bug and include the following information: --- loadstring error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]) -end - -local function err_execute(message, format, source, trace) - nulsafe_error([[ -struct: runtime error in generated function -This is at some level an internal error in the struct library -It could be a genuine error in the emitted code (in which case this is a code -generation bug) -Alternately, it could be that you gave it a malformed format string, a bad -file descriptor, or data that does not match the given format (in which case -it is an argument validation bug and you should be getting an error anyways). -Please report this as a bug and include the following information: --- execution error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function compile(format, gen, env) - local status,source = xpcall(function() - return parse(format, gen, true) - end, - function(message) - return { message, where("",2) } - end) - - if not status then - if type(source[1]) == "function" then - error(source[1]()..source[2]) - end - err_generate(source[1], format, source[2]) - end - - local fn,err = loadstring(source) - - if not fn then - err_compile(err, format, source) - end - - setfenv(fn, env) - - local fn = function(...) - local status,ret,len = xpcall2(fn, function(message) - return { message, where("",2) } - end, ...) - - -- call succeeded without errors - if status then return ret,len end - - local message,where = ret[1],ret[2] - - -- call generated a deliberate error; call the provided closure - -- it will either emit an error code or re-throw - if type(message) == "function" then return nil,message() end - - -- call generated an internal error; re-throw with extra debug info - err_execute(message, format, source, where) - end - - return fn -end - -local gen_unpack = require(_PACKAGE.."gen_unpack") -local io_unpack = require(_PACKAGE.."io_unpack") - -function _M.unpack(format) - return compile(format, gen_unpack, io_unpack) -end - -local gen_pack = require(_PACKAGE.."gen_pack") -local io_pack = require(_PACKAGE.."io_pack") - -function _M.pack(format) - return compile(format, gen_pack, io_pack) -end - -return _M diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/cursor.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/cursor.lua deleted file mode 100755 index cd913af..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/cursor.lua +++ /dev/null @@ -1,80 +0,0 @@ --- cursor - a wrapper for strings that makes them look like files --- exports: seek read write --- read only supports numeric amounts --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local cursor = {} - --- like fseek --- seeking past the end of the string is permitted --- reads will return EOF, writes will fill in the intermediate space with nuls --- seeking past the start of the string is a soft error -function cursor:seek(whence, offset) - whence = whence or "cur" - offset = offset or 0 - - if whence == "set" then - self.pos = offset - elseif whence == "cur" then - self.pos = self.pos + offset - elseif whence == "end" then - self.pos = #self.str + offset - else - error "bad argument #1 to seek" - end - - if self.pos < 0 then - self.pos = 0 - return nil,"attempt to seek prior to start of file" - end - - return self.pos -end - --- read n bytes from the current position --- reads longer than the string can satisfy return as much as it can --- reads while the position is at the end return nil,"eof" -function cursor:read(n) - if self.pos >= #self.str then - return nil,"eof" - end - - if n == "*a" then - n = #self.str - end - - local buf = self.str:sub(self.pos+1, self.pos + n) - self.pos = math.min(self.pos + n, #self.str) - - return buf -end - --- write the contents of the buffer at the current position, overwriting --- any data already present --- if the write pointer is past the end of the string, also fill in the --- intermediate space with nuls -function cursor:write(buf) - if self.pos > #self.str then - self.str = self.str .. string.char(0):rep(self.pos - #self.str) - end - - self.str = self.str:sub(1, self.pos) - .. buf - .. self.str:sub(self.pos + #buf + 1, -1) - self.pos = self.pos + #buf - - return self -end - -function cursor:__call(source) - assert(type(source) == "string", "invalid first argument to cursor()") - return setmetatable( - { str = source, pos = 0 }, - cursor) -end - -cursor.__index = cursor - -setmetatable(cursor, cursor) - -return cursor diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/fp.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/fp.lua deleted file mode 100755 index 5da81da..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/fp.lua +++ /dev/null @@ -1,121 +0,0 @@ --- floating point module --- Copyright © 2008 Peter "Corsix" Cawley and Ben "ToxicFrog" Kelly; see COPYING - -local fp = {} -local name = (...):gsub('%.[^%.]+$', '') -local struct = require (name) -local common = require (name..".common") - -local function reader(data, size_exp, size_fraction) - local fraction, exponent, sign - local endian = common.is_bigendian and ">" or "<" - - -- Split the unsigned integer into the 3 IEEE fields - local bits = struct.unpack(endian.."m"..#data, data, true) - local fraction = struct.implode({unpack(bits, 1, size_fraction)}, size_fraction) - local exponent = struct.implode({unpack(bits, size_fraction+1, size_fraction+size_exp)}, size_exp) - local sign = bits[#bits] and -1 or 1 - - -- special case: exponent is all 1s - if exponent == 2^size_exp-1 then - -- significand is 0? +- infinity - if fraction == 0 then - return sign * math.huge - - -- otherwise it's NaN - else - return 0/0 - end - end - - -- restore the MSB of the significand, unless it's a subnormal number - if exponent ~= 0 then - fraction = fraction + (2 ^ size_fraction) - else - exponent = 1 - end - - -- remove the exponent bias - exponent = exponent - 2 ^ (size_exp - 1) + 1 - - -- Decrease the size of the exponent rather than make the fraction (0.5, 1] - exponent = exponent - size_fraction - - return sign * math.ldexp(fraction, exponent) -end - -local function writer(value, size_exp, size_fraction) - local fraction, exponent, sign - local width = (size_exp + size_fraction + 1)/8 - local endian = common.is_bigendian and ">" or "<" - local bias = 2^(size_exp-1)-1 - - if value < 0 - or 1/value == -math.huge then -- handle the case of -0 - sign = true - value = -value - else - sign = false - end - - -- special case: value is infinite - if value == math.huge then - exponent = bias+1 - fraction = 0 - - -- special case: value is NaN - elseif value ~= value then - exponent = bias+1 - fraction = 2^(size_fraction-1) - - --special case: value is 0 - elseif value == 0 then - exponent = -bias - fraction = 0 - - else - fraction,exponent = math.frexp(value) - - -- subnormal number - if exponent+bias <= 1 then - fraction = fraction * 2^(size_fraction+(exponent+bias)-1) - exponent = -bias - - else - -- remove the most significant bit from the fraction and adjust exponent - fraction = fraction - 0.5 - exponent = exponent - 1 - - -- turn the fraction into an integer - fraction = fraction * 2^(size_fraction+1) - end - end - - - -- add the exponent bias - exponent = exponent + bias - - local bits = struct.explode(fraction) - local bits_exp = struct.explode(exponent) - for i=1,size_exp do - bits[size_fraction+i] = bits_exp[i] - end - bits[size_fraction+size_exp+1] = sign - - return struct.pack(endian.."m"..width, {bits}) -end - --- Create readers and writers for the IEEE sizes -fp.sizes = { - [4] = {1, 8, 23}, - [8] = {1, 11, 52}, -} - -fp.r = {} -fp.w = {} -for width, sizes in pairs(fp.sizes) do - fp.r[width] = function(uint) return reader(uint, sizes[2], sizes[3]) end - fp.w[width] = function(valu) return writer(valu, sizes[2], sizes[3]) end -end - -return fp diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/gen_pack.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/gen_pack.lua deleted file mode 100755 index 9449c85..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/gen_pack.lua +++ /dev/null @@ -1,132 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd,data = ... -local stack = {} -local index = 1 -local start = fd:seek() -local len = 0 - -local function push(key) - if not key then - key = index - index = index + 1 - end - - stack[#stack+1] = { index, data } - data = data[key] - index = 1 -end - -local function pop(key) - local saved = stack[#stack] - stack[#stack] = nil - - index = saved[1] - data = saved[2] -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return fd,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- <>(fd, data[index], <>) --- ++index -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data[index], "..args..")\nindex = index+1" -end - --- table: --- push() --- <

> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - --- named atom: --- <>(fd, data.<>, <>) -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data."..token[1]..", "..args..")" -end - --- named table: --- push(<>) --- <
> --- pop() -function gen.name_table(token) - return "push('"..token[1].."')\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop()" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/gen_unpack.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/gen_unpack.lua deleted file mode 100755 index 369cfc9..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/gen_unpack.lua +++ /dev/null @@ -1,117 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd = (...) -local stack = {} -local pack = {} -local start = fd:seek() -local len = 0 - -local function push() - stack[#stack+1],pack = pack,{} -end - -local function pop(key) - local target = stack[#stack] - key = key or #target+1 - target[key],pack = pack,target - stack[#stack] = nil -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return pack,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- pack[#pack+1] = <>(fd, <>) -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack[#pack+1] = "..fn.."(fd, "..args..")" -end - --- table: --- push() --- <
> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack."..token[1].." = "..fn.."(fd, "..args..")" -end - -function gen.name_table(token) - return "push()\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop('"..token[1].."')\n" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/init.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/init.lua deleted file mode 100755 index 8910968..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/init.lua +++ /dev/null @@ -1,94 +0,0 @@ --- vstruct, the versatile struct library --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local table,math,type,require,assert,_unpack = table,math,type,require,assert,unpack - -local print = print - -module((...)) - -cursor = require (_NAME..".cursor") -compile = require (_NAME..".compile") - -function math.trunc(n) - if n < 0 then - return math.ceil(n) - else - return math.floor(n) - end -end - --- turn an int into a list of booleans --- the length of the list will be the smallest number of bits needed to --- represent the int -function explode(int, size) - assert(int, "struct.explode: missing argument") - size = size or 0 - - local mask = {} - while int ~= 0 or #mask < size do - table.insert(mask, int % 2 ~= 0) - int = math.trunc(int/2) - end - return mask -end - --- turn a list of booleans into an int --- the converse of explode -function implode(mask, size) - size = size or #mask - - local int = 0 - for i=size,1,-1 do - int = int*2 + ((mask[i] and 1) or 0) - end - return int -end - --- given a source, which is either a string or a file handle, --- unpack it into individual data based on the format string -function unpack(fmt, source, untable) - -- wrap it in a cursor so we can treat it like a file - if type(source) == 'string' then - source = cursor(source) - end - - assert(fmt and source and type(fmt) == "string", "struct: invalid arguments to unpack") - - -- the lexer will take our format string and generate code from it - -- it returns a function that when called with our source, will - -- unpack the data according to the format string and return all - -- values from said unpacking in a list - if untable then - --local t = compile.unpack(fmt)(source) - --print(t) - -- print(_unpack(t)) - return _unpack((compile.unpack(fmt)(source))) - else - return compile.unpack(fmt)(source) - end -end - --- given a format string and a list of data, pack them --- if 'fd' is omitted, pack them into and return a string --- otherwise, write them directly to the given file -function pack(fmt, fd, data) - local str_fd - - if not data then - data = fd - fd = "" - end - - if type(fd) == 'string' then - fd = cursor("") - str_fd = true - end - - assert(fmt and fd and data and type(fmt) == "string", "struct: invalid arguments to pack") - - local fd,len = compile.pack(fmt)(fd, data) - return (str_fd and fd.str) or fd,len -end - -return struct diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/io_pack.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/io_pack.lua deleted file mode 100755 index a785f7e..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/io_pack.lua +++ /dev/null @@ -1,127 +0,0 @@ --- write formats --- return true if they have consumed a value from the input stream --- return false/nil otherwise (ie, the next value will be preserved --- for subsequent calls, eg skip/pad) --- Copyright © 2008 Ben "ToxicFrog" Kelly; see COPYING -local require,error,setmetatable,string,print,math,unpack,io - = require,error,setmetatable,string,print,math,unpack,io - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local pack = setmetatable({}, { __index = common }) - --- boolean -function pack.b(fd, d, w) - return pack.u(fd, (d and 1) or 0, w) -end - --- counted string --- a string immediately prefaced with its length as a uint -function pack.c(fd, d, w) - pack.u(fd, #d, w) - return pack.s(fd, d) -end - --- floating point -function pack.f(fd, d, w) - if not fp.w[w] then - error("struct.pack: illegal floating point width") - end --- local f = fp.w[w](d) --- print(f, type(f)) - return pack.s(fd, fp.w[w](d), w) -end - --- signed int -function pack.i(fd, d, w) - if d < 0 then - d = 2^(w*8) + d - end - return pack.u(fd, d, w) -end - --- bitmask --- we use a string here because using an unsigned will lose data on bitmasks --- wider than lua's native number format -function pack.m(fd, d, w) - local buf = "" - - for i=1,w*8,8 do - local bits = { unpack(d, i, i+7) } - local byte = string.char(struct.implode(bits, 8)) - if pack.is_bigendian then - buf = byte..buf - else - buf = buf..byte - end - end - return pack.s(fd, buf, w) -end - --- fixed point bit aligned -function pack.P(fd, d, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return pack.i(fd, d * 2^fp, (dp+fp)/8) -end - --- fixed point byte aligned -function pack.p(fd, d, dp, fp) - return pack.P(fd, d, dp*8, fp*8) -end - --- fixed length string --- length 0 is write string as is --- length >0 is write exactly w bytes, truncating or padding as needed -function pack.s(fd, d, w) - w = w or #d - if w == 0 then return end - - if #d < w then - d = d..string.char(0):rep(w-#d) - end - - return fd:write(d:sub(1,w)) -end - --- unsigned int -function pack.u(fd, d, w) - local s = "" - - for i=1,w do - if pack.is_bigendian then - s = string.char(d % 2^8) .. s - else - s = s .. string.char(d % 2^8) - end - d = math.trunc(d/2^8) - end - - return pack.s(fd, s, w) -end - --- skip/pad --- this is technically a control format, so it has a different signature --- specifically, there is no "data" argument -function pack.x(fd, w) - return pack.s(fd, "", w) -end - --- null terminated string --- w==nil is write string as is + termination --- w>0 is write exactly w bytes, truncating/padding and terminating -function pack.z(fd, d, w) - w = w or #d+1 - if #d >= w then - d = d:sub(1, w-1) - end - - return pack.s(fd, d.."\0", w) -end - -return pack diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/io_unpack.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/io_unpack.lua deleted file mode 100755 index 916c321..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/io_unpack.lua +++ /dev/null @@ -1,165 +0,0 @@ --- read formats --- return a value if applicable, which will be packed --- otherwise return nil --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - --- load operations common to both unpack and pack, and set __index so that --- requests for, say, unpack.seekto will succeed -local require,error,setmetatable,string,print - = require,error,setmetatable,string,print - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local unpack = setmetatable({}, { __index = common }) - --- boolean --- true if any bit is 1, false otherwise -function unpack.b(fd, w) - return unpack.u(fd, w) ~= 0 -end - --- counted string --- a string immediately prefaced with its length as a uint -function unpack.c(fd, w) - w = unpack.u(fd, w) - - return unpack.s(fd, w) -end - --- float --- this is callout to the floating-point read/write module, if installed -function unpack.f(fd, w) - if not fp.r[w] then - error("struct.unpack: illegal floating point width") - end - - return fp.r[w](unpack.s(fd,w)) -end - --- utility functions for the i, m and u formats -local function directions(w) - if unpack.is_bigendian then - return 1,w,1 - else - return w,1,-1 - end -end - -local function pve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - for c=sof,eof,dir do - i = i * 2^8 + buf:byte(c) - end - - return i -end - -local function nve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - if buf:byte(sof) < 128 then - return pve_unpack(buf, w) - end - - for c=sof,eof,dir do - i = i * 2^8 - (255 - buf:byte(c)) - end - - return i-1 -end - --- signed int of w bytes -function unpack.i(fd, w) - local buf = unpack.s(fd, w) - - return nve_unpack(buf, w) -end - --- bitmask of w bytes --- we need to read and unpack it as a string, not an unsigned, because otherwise --- we're limited to 52 bits -function unpack.m(fd, w) - local buf = unpack.s(fd, w) - local mask = {} - - local sof,eof,dir = directions(w) - - -- reverse it here because directions() returns numbers for MSB first, - -- and we want LSB first - for i=eof,sof,-dir do - local byte = buf:byte(i) - local bits = struct.explode(byte) - for j=1,8 do - mask[#mask+1] = bits[j] or false - end - end - return mask -end - --- fixed point bit aligned --- w is in the form d.f, where d is the number of bits in the integer part --- and f the number of bits in the fractional part -function unpack.P(fd, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return unpack.i(fd, (dp+fp)/8)/(2^fp) -end - --- fixed point byte aligned -function unpack.p(fd, dp, fp) - return unpack.P(fd, dp*8, fp*8) -end - --- string --- reads exactly w bytes of data and returns them verbatim -function unpack.s(fd, w) - if w == 0 then return "" end - - local buf,err = fd:read(w or "*a") - if not buf then - error(function() return "read error: "..(err or "(unknown error)") end) - elseif #buf < w then - error(function() return "short read: wanted "..w.." bytes, got "..#buf end) - end - return buf -end - --- unsigned int -function unpack.u(fd, w) - local buf,err = unpack.s(fd, w) - - return pve_unpack(buf, w) -end - --- skip/pad --- reads w bytes and discards them -function unpack.x(fd, w) - fd:read(w) - return true -end - --- null-terminated string --- if w is omitted, reads up to and including the first nul, and returns everything --- except that nul --- otherwise, reads exactly w bytes and returns everything up to the first nul -function unpack.z(fd, w) - if w then - return unpack.s(fd, w):match('^%Z*') - end - - local buf = "" - local c = unpack.s(fd, 1) - while #c > 0 and c ~= string.char(0) do - buf = buf..c - c = unpack.s(fd, 1) - end - return buf -end - -return unpack diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/lexer.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/lexer.lua deleted file mode 100755 index 9eb503e..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/lexer.lua +++ /dev/null @@ -1,54 +0,0 @@ -local lexis = {} - -local function lexeme(name) - return function(pattern) - lexis[#lexis+1] = { name=name, pattern="^"..pattern } - end -end - -lexeme (false) "%s+" -- whitespace -lexeme "table" "(%b{})" -lexeme "group" "(%b())" -lexeme "name_atom" "([%a_][%w_]*)%:(%a)([%d.]*)" -lexeme "name_table" "([%a_][%w_]*)%:(%b{})" -lexeme "prerepeat" "(%d+)%s*%*" -lexeme "postrepeat" "%*%s*(%d+)" -lexeme "control" "([-+@<>=ax])([%d.]*)" -lexeme "atom" "(%a)([%d.]*)" - -return function(source) - local orig = source - local index = 1 - - local function iter() - if #source == 0 then return nil end - - for _,lexeme in ipairs(lexis) do - if source:match(lexeme.pattern) then - local result = { source:find(lexeme.pattern) } - local eof = table.remove(result, 2) - table.remove(result, 1) - - source = source:sub(eof+1, -1) - index = index+eof - - if lexeme.name then - result.type = lexeme.name - coroutine.yield(result) - end - return iter() - end - end - error (function() return "Error lexing format string [[" - ..(orig) - .."]] at char " - ..index - .." (" - ..(source:sub(1,1)) - ..")" - end) - end - - return coroutine.wrap(iter) -end - diff --git a/examples/empty_template/LICK/lib/loveosc/vstruct/parser.lua b/examples/empty_template/LICK/lib/loveosc/vstruct/parser.lua deleted file mode 100755 index 122f68e..0000000 --- a/examples/empty_template/LICK/lib/loveosc/vstruct/parser.lua +++ /dev/null @@ -1,35 +0,0 @@ --- parser for format strings --- you give it a format string, a table of code generators, --- and a flag indicating whether to apply the preamble/postable --- it gives you lua source - -local require,concat = require,table.concat - -local print = print - -module((...)) - -local lex = require(_PACKAGE.."lexer") - -return function(source, codegen, prepost) - local asl = {} - local get = lex(source) - - for token in get do - -- seperate statements because codegen may change #asl - local code = codegen[token.type](token, get, asl) - asl[#asl+1] = code - end - - local source = concat(asl, "\n") - - if prepost then - source = codegen.preamble - .. source - .. codegen.postamble - end - - return source -end - - diff --git a/examples/empty_template/LICK/lib/object.lua b/examples/empty_template/LICK/lib/object.lua deleted file mode 100644 index c8d5350..0000000 --- a/examples/empty_template/LICK/lib/object.lua +++ /dev/null @@ -1,282 +0,0 @@ --- OBJECT.lua --- object oriented livecoding library -_internal_object_table = {} - --- hump for classing -local Class = require "LICK/lib/hump/.class" -local hlpr = require "LICK/lib/hlpr" -require "LICK/lib/loveosc" - - ---[[ - OBJECT ---]] --- @Object: base class -Object = Class(function(self) - -- TODO: Object base code - table.insert(_internal_object_table, self) -end) - -function Object:update(dt) - -- TODO: insert typical update - -- print("updated") -end - ---[[ - SCOBJECT ---]] - --- @SCObject: bass class for supercollider communication -SCObject = Class(function(self) - Object.construct(self) -end) -SCObject:inherit(Object) - - ---[[ - SCSYNTH ---]] --- @SCSynth: supercollider synthesizer class -SCSynth = Class(function(self, nodename, freq) - SCObject.construct(self) - self.nodename = nodename or "default" - self.freq = freq or 440 - self.nodeid = 1000 + math.random(1000) -end) -SCSynth:inherit(SCObject) - --- #set a control, TODO: variable lenght of argument-pairs -function SCSynth:set(control, val) - local var = { - "#bundle", - os.time(), - { - "/n_set", - "i", - self.nodeid, - "s", - control, - "f", - val - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#sends an OSC message to the supercollider to start the synth -function SCSynth:play() - local var = { - "#bundle", - os.time(), - { - "/s_new", - "s", - self.nodename, - "i", - self.nodeid, - "i", - 0, - "i", - 0, - "s", - "freq", - "f", - self.freq - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#frees the node on the supercollider server -function SCSynth:free() - local var = { - "#bundle", - os.time()+0.8, - { - "/n_free", - "i", - self.nodeid, - "i", - 0 - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---[[ - DRAWABLE ---]] --- @Drawable: base class for all drawable stuff -Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - - self.position = Vector(x,y) - self.pos = self.position - self.x = self.position.x - self.y = self.position.y -end) -Drawable:inherit(Object) - --- #can be called via wrapX(max) or wrapX(min,max) -function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end -end - --- #can be called via wrapY(max) or wrapY(min,max) -function Drawable:wrapY(min, max) - if min and max then - self:wrap("y", min, max) - elseif min and not max then - self:wrap("y", 0, min) - end -end - --- #internal wrapper -function Drawable:wrap(str, min, max) - if str == "x" then - self.position.x = hlpr.wrap(self.position.x, min, max) - elseif str == "y" then - self.position.y = hlpr.wrap(self.position.y, min, max) - end -end - --- #supercollider style 'set' -function Drawable:set(str, val) - - if str == "x" then - self.position.x = val or self.position.x - elseif str == "y" then - self.position.y = val or self.position.y - end - -- TODO: add lots and lots and lots -end - --- #not yet implemented -function Drawable:draw() - -- TODO: abstract draw code... -end - - - - ---[[ - CIRCLE ---]] --- @Circle: drawable circle -Circle = Class(function(self, x, y, r, s, color) - self.r = r or 10 - self.s = s or 16 - -- call constructor of Drawable - Drawable.construct(self,x,y,color) -end) -Circle:inherit(Drawable) - --- #draw the circle -function Circle:draw(style) - if style ~= "fill" and style ~= "line" then - style = "line" - end - love.graphics.setColor(unpack(self.color)) - love.graphics.circle(style, self.position.x, self.position.y, self.r, self.s) -end - - - ----------------------------------------- --- Experimental Objects ----------------------------------------- - - ---[[ - LINE ---]] --- @Line: draw a line -Line = Class(function(self, x, y, tx, ty, color) -- wats the dealio for polylines? - self.x = x or 0 - self.y = y or 0 - self.tx = tx or 0 - self.ty = ty or 0 - -- call constructor of Drawable - Drawable.construct(self, x, y, color) - - end) -Line:inherit(Drawable) --- TODO: FIX the :set("key", value) ... dunno how it works..! - --- #draw the line -function Line:draw(width, style) - local width=width or 1 - if style ~= "smooth" and style ~= "rough" then - style = "smooth" - end - love.graphics.setLine(width, style) - love.graphics.setColor(unpack(self.color)) - love.graphics.line(self.position.x, self.position.y, self.tx, self.ty) -end - - ---[[ - IMAGE ---]] --- @Image: Image from file -Image = Class(function(self, file, x, y, color, size, orientation) - self.image = love.graphics.newImage(file) - -- put positions, size, orientation... - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Image:inherit(Drawable) - --- #draw the image -function Image:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.draw(self.image, self.position.x, self.position.y) -end - ---[[ - POINT ---]] --- @Point -Point = Class(function(self, x, y, color, size, style) - local color=color or "" - local size=size or 1 - local style=style or "smooth" - - -- should this be here? or in the constructor? - self.size = size - self.style = style - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Point:inherit(Drawable) - --- #draw the point -function Point:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.setPoint(self.size, self.style) - love.graphics.point(self.position.x, self.position.y) -end - - --- EXAMPLE: --- (put in love.load): --- coco = Circle(300,300) --- (put in love.update): --- coco:set("x", 30) --- (put in love.draw): --- coco:draw("fill") - diff --git a/examples/empty_template/LICK/lick.lua b/examples/empty_template/LICK/lick.lua deleted file mode 100644 index 05cede2..0000000 --- a/examples/empty_template/LICK/lick.lua +++ /dev/null @@ -1,127 +0,0 @@ --- lick.lua --- --- simple LIVECODING environment with löve, overwrites love.run, suppressing errors to the terminal/console - - - -lick = {} -lick.file = "main.lua" -lick.debug = false -lick.reset = false -lick.clearFlag = false - -function handle(err) - return "ERROR: " .. err -end - -function lick.setFile(str) - live.file = str or "lick.lua" -end - --- Initialization -function lick.load() - last_modified = 0 -end - --- load the lickcoding file and execute the contained update function -function lick.update(dt) - if love.filesystem.exists(lick.file) and last_modified < love.filesystem.getLastModified(lick.file) then - last_modified = love.filesystem.getLastModified(lick.file) - success, chunk = pcall(love.filesystem.load, lick.file) - if not success then - print(tostring(chunk)) - lick.debugoutput = chunk .. "\n" - - end - ok,err = xpcall(chunk, handle) - if not ok then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if ok then - print("CHUNK LOADED\n") - lick.debugoutput = nil - end - if lick.reset then - loadok, err = xpcall(love.load, handle) - if not loadok and not loadok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - loadok_old = not loadok - end - - - end - end - updateok, err = pcall(love.update,dt) - if not updateok and not updateok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - - updateok_old = not updateok -end - -function lick.draw() - drawok, err = xpcall(love.draw, handle) - if not drawok and not drawok_old then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if lick.debug and lick.debugoutput then - love.graphics.setColor(255,255,255,120) - love.graphics.print(lick.debugoutput, 0, 0) - end - drawok_old = not drawok -end - -function love.run() - - if love.load then love.load(arg) end - lick.load() - local dt = 0 - - -- Main loop time. - while true do - if love.timer then - love.timer.step() - dt = love.timer.getDelta() - end - -- if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled - lick.update(dt) - if love.graphics then - if not lick.clearFlag then love.graphics.clear() end - -- if love.draw then love.draw() end - lick.draw() - end - - -- Process events. - if love.event then - for e,a,b,c in love.event.poll() do - if e == "q" then - if not love.quit or not love.quit() then - if love.audio then - love.audio.stop() - end - return - end - end - love.handlers[e](a,b,c) - end - end - - if love.timer then love.timer.sleep(1) end - if love.graphics then love.graphics.present() end - - end - -end - diff --git a/examples/empty_template/conf.lua b/examples/empty_template/conf.lua deleted file mode 100644 index 7a7b397..0000000 --- a/examples/empty_template/conf.lua +++ /dev/null @@ -1,21 +0,0 @@ -function love.conf(t) - t.modules.joystick = true -- Enable the joystick module (boolean) - t.modules.audio = true -- Enable the audio module (boolean) - t.modules.keyboard = true -- Enable the keyboard module (boolean) - t.modules.event = true -- Enable the event module (boolean) - t.modules.image = true -- Enable the image module (boolean) - t.modules.graphics = true -- Enable the graphics module (boolean) - t.modules.timer = true -- Enable the timer module (boolean) - t.modules.mouse = true -- Enable the mouse module (boolean) - t.modules.sound = true -- Enable the sound module (boolean) - t.modules.physics = true -- Enable the physics module (boolean) - t.console = false -- Attach a console (boolean, Windows only) - t.title = "live_testproject" -- The title of the window the game is in (string) - t.author = "Tilmann Hars" -- The author of the game (string) - t.screen.fullscreen = false -- Enable fullscreen (boolean) - t.screen.vsync = true -- Enable vertical sync (boolean) - t.screen.fsaa = 0 -- The number of FSAA-buffers (number) - t.screen.height = 600 -- The window height (number) - t.screen.width = 800 -- The window width (number) - t.version = 0 -- The LÖVE version this game was made for (number) -end diff --git a/examples/empty_template/main.lua b/examples/empty_template/main.lua deleted file mode 100644 index 83433c1..0000000 --- a/examples/empty_template/main.lua +++ /dev/null @@ -1,12 +0,0 @@ -require "LICK" -require "LICK/lib" -ez = require "LICK/lib/hlpr" - -function love.load() -end - -function love.update(dt) -end - -function love.draw() -end diff --git a/examples/lissajous/LICK/init.lua b/examples/lissajous/LICK/init.lua deleted file mode 100644 index 6fc9157..0000000 --- a/examples/lissajous/LICK/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -require "LICK/lick" - - diff --git a/examples/lissajous/LICK/lib/color.lua b/examples/lissajous/LICK/lib/color.lua deleted file mode 100644 index b94c709..0000000 --- a/examples/lissajous/LICK/lib/color.lua +++ /dev/null @@ -1,742 +0,0 @@ -x11_color_table = { --- taken from the SuperCollider Color documentation: -["alice blue"]={240, 248, 255}, -["AliceBlue"]={240, 248, 255}, -["antique white"]={250, 235, 215}, -["AntiqueWhite"]={250, 235, 215}, -["AntiqueWhite1"]={255, 239, 219}, -["AntiqueWhite2"]={238, 223, 204}, -["AntiqueWhite3"]={205, 192, 176}, -["AntiqueWhite4"]={139, 131, 120}, -["aquamarine"]={127, 255, 212}, -["aquamarine1"]={127, 255, 212}, -["aquamarine2"]={118, 238, 198}, -["aquamarine3"]={102, 205, 170}, -["aquamarine4"]={69, 139, 116}, -["azure"]={240, 255, 255}, -["azure1"]={240, 255, 255}, -["azure2"]={224, 238, 238}, -["azure3"]={193, 205, 205}, -["azure4"]={131, 139, 139}, -["beige"]={245, 245, 220}, -["bisque"]={255, 228, 196}, -["bisque1"]={255, 228, 196}, -["bisque2"]={238, 213, 183}, -["bisque3"]={205, 183, 158}, -["bisque4"]={139, 125, 107}, -["black"]={0, 0, 0}, -["blanched almond"]={255, 235, 205}, -["BlanchedAlmond"]={255, 235, 205}, -["blue"]={0, 0, 255}, -["blue violet"]={138, 43, 226}, -["blue1"]={0, 0, 255}, -["blue2"]={0, 0, 238}, -["blue3"]={0, 0, 205}, -["blue4"]={0, 0, 139}, -["BlueViolet"]={138, 43, 226}, -["brown"]={165, 42, 42}, -["brown1"]={255, 64, 64}, -["brown2"]={238, 59, 59}, -["brown3"]={205, 51, 51}, -["brown4"]={139, 35, 35}, -["burlywood"]={222, 184, 135}, -["burlywood1"]={255, 211, 155}, -["burlywood2"]={238, 197, 145}, -["burlywood3"]={205, 170, 125}, -["burlywood4"]={139, 115, 85}, -["cadet blue"]={95, 158, 160}, -["CadetBlue"]={95, 158, 160}, -["CadetBlue1"]={152, 245, 255}, -["CadetBlue2"]={142, 229, 238}, -["CadetBlue3"]={122, 197, 205}, -["CadetBlue4"]={83, 134, 139}, -["chartreuse"]={127, 255, 0}, -["chartreuse1"]={127, 255, 0}, -["chartreuse2"]={118, 238, 0}, -["chartreuse3"]={102, 205, 0}, -["chartreuse4"]={69, 139, 0}, -["chocolate"]={210, 105, 30}, -["chocolate1"]={255, 127, 36}, -["chocolate2"]={238, 118, 33}, -["chocolate3"]={205, 102, 29}, -["chocolate4"]={139, 69, 19}, -["coral"]={255, 127, 80}, -["coral1"]={255, 114, 86}, -["coral2"]={238, 106, 80}, -["coral3"]={205, 91, 69}, -["coral4"]={139, 62, 47}, -["cornflower blue"]={100, 149, 237}, -["CornflowerBlue"]={100, 149, 237}, -["cornsilk"]={255, 248, 220}, -["cornsilk1"]={255, 248, 220}, -["cornsilk2"]={238, 232, 205}, -["cornsilk3"]={205, 200, 177}, -["cornsilk4"]={139, 136, 120}, -["cyan"]={0, 255, 255}, -["cyan1"]={0, 255, 255}, -["cyan2"]={0, 238, 238}, -["cyan3"]={0, 205, 205}, -["cyan4"]={0, 139, 139}, -["dark goldenrod"]={184, 134, 11}, -["dark green"]={0, 100, 0}, -["dark khaki"]={189, 183, 107}, -["dark olive green"]={85, 107, 47}, -["dark orange"]={255, 140, 0}, -["dark orchid"]={153, 50, 204}, -["dark salmon"]={233, 150, 122}, -["dark sea green"]={143, 188, 143}, -["dark slate blue"]={72, 61, 139}, -["dark slate gray"]={47, 79, 79}, -["dark slate grey"]={47, 79, 79}, -["dark turquoise"]={0, 206, 209}, -["dark violet"]={148, 0, 211}, -["DarkGoldenrod"]={184, 134, 11}, -["DarkGoldenrod1"]={255, 185, 15}, -["DarkGoldenrod2"]={238, 173, 14}, -["DarkGoldenrod3"]={205, 149, 12}, -["DarkGoldenrod4"]={139, 101, 8}, -["DarkGreen"]={0, 100, 0}, -["DarkKhaki"]={189, 183, 107}, -["DarkOliveGreen"]={85, 107, 47}, -["DarkOliveGreen1"]={202, 255, 112}, -["DarkOliveGreen2"]={188, 238, 104}, -["DarkOliveGreen3"]={162, 205, 90}, -["DarkOliveGreen4"]={110, 139, 61}, -["DarkOrange"]={255, 140, 0}, -["DarkOrange1"]={255, 127, 0}, -["DarkOrange2"]={238, 118, 0}, -["DarkOrange3"]={205, 102, 0}, -["DarkOrange4"]={139, 69, 0}, -["DarkOrchid"]={153, 50, 204}, -["DarkOrchid1"]={191, 62, 255}, -["DarkOrchid2"]={178, 58, 238}, -["DarkOrchid3"]={154, 50, 205}, -["DarkOrchid4"]={104, 34, 139}, -["DarkSalmon"]={233, 150, 122}, -["DarkSeaGreen"]={143, 188, 143}, -["DarkSeaGreen1"]={193, 255, 193}, -["DarkSeaGreen2"]={180, 238, 180}, -["DarkSeaGreen3"]={155, 205, 155}, -["DarkSeaGreen4"]={105, 139, 105}, -["DarkSlateBlue"]={72, 61, 139}, -["DarkSlateGray"]={47, 79, 79}, -["DarkSlateGray1"]={151, 255, 255}, -["DarkSlateGray2"]={141, 238, 238}, -["DarkSlateGray3"]={121, 205, 205}, -["DarkSlateGray4"]={82, 139, 139}, -["DarkSlateGrey"]={47, 79, 79}, -["DarkTurquoise"]={0, 206, 209}, -["DarkViolet"]={148, 0, 211}, -["deep pink"]={255, 20, 147}, -["deep sky blue"]={0, 191, 255}, -["DeepPink"]={255, 20, 147}, -["DeepPink1"]={255, 20, 147}, -["DeepPink2"]={238, 18, 137}, -["DeepPink3"]={205, 16, 118}, -["DeepPink4"]={139, 10, 80}, -["DeepSkyBlue"]={0, 191, 255}, -["DeepSkyBlue1"]={0, 191, 255}, -["DeepSkyBlue2"]={0, 178, 238}, -["DeepSkyBlue3"]={0, 154, 205}, -["DeepSkyBlue4"]={0, 104, 139}, -["dim gray"]={105, 105, 105}, -["dim grey"]={105, 105, 105}, -["DimGray"]={105, 105, 105}, -["DimGrey"]={105, 105, 105}, -["dodger blue"]={30, 144, 255}, -["DodgerBlue"]={30, 144, 255}, -["DodgerBlue1"]={30, 144, 255}, -["DodgerBlue2"]={28, 134, 238}, -["DodgerBlue3"]={24, 116, 205}, -["DodgerBlue4"]={16, 78, 139}, -["firebrick"]={178, 34, 34}, -["firebrick1"]={255, 48, 48}, -["firebrick2"]={238, 44, 44}, -["firebrick3"]={205, 38, 38}, -["firebrick4"]={139, 26, 26}, -["floral white"]={255, 250, 240}, -["FloralWhite"]={255, 250, 240}, -["forest green"]={34, 139, 34}, -["ForestGreen"]={34, 139, 34}, -["gainsboro"]={220, 220, 220}, -["ghost white"]={248, 248, 255}, -["GhostWhite"]={248, 248, 255}, -["gold"]={255, 215, 0}, -["gold1"]={255, 215, 0}, -["gold2"]={238, 201, 0}, -["gold3"]={205, 173, 0}, -["gold4"]={139, 117, 0}, -["goldenrod"]={218, 165, 32}, -["goldenrod1"]={255, 193, 37}, -["goldenrod2"]={238, 180, 34}, -["goldenrod3"]={205, 155, 29}, -["goldenrod4"]={139, 105, 20}, -["gray"]={190, 190, 190}, -["gray0"]={0, 0, 0}, -["gray1"]={3, 3, 3}, -["gray10"]={26, 26, 26}, -["gray100"]={255, 255, 255}, -["gray11"]={28, 28, 28}, -["gray12"]={31, 31, 31}, -["gray13"]={33, 33, 33}, -["gray14"]={36, 36, 36}, -["gray15"]={38, 38, 38}, -["gray16"]={41, 41, 41}, -["gray17"]={43, 43, 43}, -["gray18"]={46, 46, 46}, -["gray19"]={48, 48, 48}, -["gray2"]={5, 5, 5}, -["gray20"]={51, 51, 51}, -["gray21"]={54, 54, 54}, -["gray22"]={56, 56, 56}, -["gray23"]={59, 59, 59}, -["gray24"]={61, 61, 61}, -["gray25"]={64, 64, 64}, -["gray26"]={66, 66, 66}, -["gray27"]={69, 69, 69}, -["gray28"]={71, 71, 71}, -["gray29"]={74, 74, 74}, -["gray3"]={8, 8, 8}, -["gray30"]={77, 77, 77}, -["gray31"]={79, 79, 79}, -["gray32"]={82, 82, 82}, -["gray33"]={84, 84, 84}, -["gray34"]={87, 87, 87}, -["gray35"]={89, 89, 89}, -["gray36"]={92, 92, 92}, -["gray37"]={94, 94, 94}, -["gray38"]={97, 97, 97}, -["gray39"]={99, 99, 99}, -["gray4"]={10, 10, 10}, -["gray40"]={102, 102, 102}, -["gray41"]={105, 105, 105}, -["gray42"]={107, 107, 107}, -["gray43"]={110, 110, 110}, -["gray44"]={112, 112, 112}, -["gray45"]={115, 115, 115}, -["gray46"]={117, 117, 117}, -["gray47"]={120, 120, 120}, -["gray48"]={122, 122, 122}, -["gray49"]={125, 125, 125}, -["gray5"]={13, 13, 13}, -["gray50"]={127, 127, 127}, -["gray51"]={130, 130, 130}, -["gray52"]={133, 133, 133}, -["gray53"]={135, 135, 135}, -["gray54"]={138, 138, 138}, -["gray55"]={140, 140, 140}, -["gray56"]={143, 143, 143}, -["gray57"]={145, 145, 145}, -["gray58"]={148, 148, 148}, -["gray59"]={150, 150, 150}, -["gray6"]={15, 15, 15}, -["gray60"]={153, 153, 153}, -["gray61"]={156, 156, 156}, -["gray62"]={158, 158, 158}, -["gray63"]={161, 161, 161}, -["gray64"]={163, 163, 163}, -["gray65"]={166, 166, 166}, -["gray66"]={168, 168, 168}, -["gray67"]={171, 171, 171}, -["gray68"]={173, 173, 173}, -["gray69"]={176, 176, 176}, -["gray7"]={18, 18, 18}, -["gray70"]={179, 179, 179}, -["gray71"]={181, 181, 181}, -["gray72"]={184, 184, 184}, -["gray73"]={186, 186, 186}, -["gray74"]={189, 189, 189}, -["gray75"]={191, 191, 191}, -["gray76"]={194, 194, 194}, -["gray77"]={196, 196, 196}, -["gray78"]={199, 199, 199}, -["gray79"]={201, 201, 201}, -["gray8"]={20, 20, 20}, -["gray80"]={204, 204, 204}, -["gray81"]={207, 207, 207}, -["gray82"]={209, 209, 209}, -["gray83"]={212, 212, 212}, -["gray84"]={214, 214, 214}, -["gray85"]={217, 217, 217}, -["gray86"]={219, 219, 219}, -["gray87"]={222, 222, 222}, -["gray88"]={224, 224, 224}, -["gray89"]={227, 227, 227}, -["gray9"]={23, 23, 23}, -["gray90"]={229, 229, 229}, -["gray91"]={232, 232, 232}, -["gray92"]={235, 235, 235}, -["gray93"]={237, 237, 237}, -["gray94"]={240, 240, 240}, -["gray95"]={242, 242, 242}, -["gray96"]={245, 245, 245}, -["gray97"]={247, 247, 247}, -["gray98"]={250, 250, 250}, -["gray99"]={252, 252, 252}, -["green"]={0, 255, 0}, -["green yellow"]={173, 255, 47}, -["green1"]={0, 255, 0}, -["green2"]={0, 238, 0}, -["green3"]={0, 205, 0}, -["green4"]={0, 139, 0}, -["GreenYellow"]={173, 255, 47}, -["grey"]={190, 190, 190}, -["grey0"]={0, 0, 0}, -["grey1"]={3, 3, 3}, -["grey10"]={26, 26, 26}, -["grey100"]={255, 255, 255}, -["grey11"]={28, 28, 28}, -["grey12"]={31, 31, 31}, -["grey13"]={33, 33, 33}, -["grey14"]={36, 36, 36}, -["grey15"]={38, 38, 38}, -["grey16"]={41, 41, 41}, -["grey17"]={43, 43, 43}, -["grey18"]={46, 46, 46}, -["grey19"]={48, 48, 48}, -["grey2"]={5, 5, 5}, -["grey20"]={51, 51, 51}, -["grey21"]={54, 54, 54}, -["grey22"]={56, 56, 56}, -["grey23"]={59, 59, 59}, -["grey24"]={61, 61, 61}, -["grey25"]={64, 64, 64}, -["grey26"]={66, 66, 66}, -["grey27"]={69, 69, 69}, -["grey28"]={71, 71, 71}, -["grey29"]={74, 74, 74}, -["grey3"]={8, 8, 8}, -["grey30"]={77, 77, 77}, -["grey31"]={79, 79, 79}, -["grey32"]={82, 82, 82}, -["grey33"]={84, 84, 84}, -["grey34"]={87, 87, 87}, -["grey35"]={89, 89, 89}, -["grey36"]={92, 92, 92}, -["grey37"]={94, 94, 94}, -["grey38"]={97, 97, 97}, -["grey39"]={99, 99, 99}, -["grey4"]={10, 10, 10}, -["grey40"]={102, 102, 102}, -["grey41"]={105, 105, 105}, -["grey42"]={107, 107, 107}, -["grey43"]={110, 110, 110}, -["grey44"]={112, 112, 112}, -["grey45"]={115, 115, 115}, -["grey46"]={117, 117, 117}, -["grey47"]={120, 120, 120}, -["grey48"]={122, 122, 122}, -["grey49"]={125, 125, 125}, -["grey5"]={13, 13, 13}, -["grey50"]={127, 127, 127}, -["grey51"]={130, 130, 130}, -["grey52"]={133, 133, 133}, -["grey53"]={135, 135, 135}, -["grey54"]={138, 138, 138}, -["grey55"]={140, 140, 140}, -["grey56"]={143, 143, 143}, -["grey57"]={145, 145, 145}, -["grey58"]={148, 148, 148}, -["grey59"]={150, 150, 150}, -["grey6"]={15, 15, 15}, -["grey60"]={153, 153, 153}, -["grey61"]={156, 156, 156}, -["grey62"]={158, 158, 158}, -["grey63"]={161, 161, 161}, -["grey64"]={163, 163, 163}, -["grey65"]={166, 166, 166}, -["grey66"]={168, 168, 168}, -["grey67"]={171, 171, 171}, -["grey68"]={173, 173, 173}, -["grey69"]={176, 176, 176}, -["grey7"]={18, 18, 18}, -["grey70"]={179, 179, 179}, -["grey71"]={181, 181, 181}, -["grey72"]={184, 184, 184}, -["grey73"]={186, 186, 186}, -["grey74"]={189, 189, 189}, -["grey75"]={191, 191, 191}, -["grey76"]={194, 194, 194}, -["grey77"]={196, 196, 196}, -["grey78"]={199, 199, 199}, -["grey79"]={201, 201, 201}, -["grey8"]={20, 20, 20}, -["grey80"]={204, 204, 204}, -["grey81"]={207, 207, 207}, -["grey82"]={209, 209, 209}, -["grey83"]={212, 212, 212}, -["grey84"]={214, 214, 214}, -["grey85"]={217, 217, 217}, -["grey86"]={219, 219, 219}, -["grey87"]={222, 222, 222}, -["grey88"]={224, 224, 224}, -["grey89"]={227, 227, 227}, -["grey9"]={23, 23, 23}, -["grey90"]={229, 229, 229}, -["grey91"]={232, 232, 232}, -["grey92"]={235, 235, 235}, -["grey93"]={237, 237, 237}, -["grey94"]={240, 240, 240}, -["grey95"]={242, 242, 242}, -["grey96"]={245, 245, 245}, -["grey97"]={247, 247, 247}, -["grey98"]={250, 250, 250}, -["grey99"]={252, 252, 252}, -["honeydew"]={240, 255, 240}, -["honeydew1"]={240, 255, 240}, -["honeydew2"]={224, 238, 224}, -["honeydew3"]={193, 205, 193}, -["honeydew4"]={131, 139, 131}, -["hot pink"]={255, 105, 180}, -["HotPink"]={255, 105, 180}, -["HotPink1"]={255, 110, 180}, -["HotPink2"]={238, 106, 167}, -["HotPink3"]={205, 96, 144}, -["HotPink4"]={139, 58, 98}, -["indian red"]={205, 92, 92}, -["IndianRed"]={205, 92, 92}, -["IndianRed1"]={255, 106, 106}, -["IndianRed2"]={238, 99, 99}, -["IndianRed3"]={205, 85, 85}, -["IndianRed4"]={139, 58, 58}, -["ivory"]={255, 255, 240}, -["ivory1"]={255, 255, 240}, -["ivory2"]={238, 238, 224}, -["ivory3"]={205, 205, 193}, -["ivory4"]={139, 139, 131}, -["khaki"]={240, 230, 140}, -["khaki1"]={255, 246, 143}, -["khaki2"]={238, 230, 133}, -["khaki3"]={205, 198, 115}, -["khaki4"]={139, 134, 78}, -["lavender"]={230, 230, 250}, -["lavender blush"]={255, 240, 245}, -["LavenderBlush"]={255, 240, 245}, -["LavenderBlush1"]={255, 240, 245}, -["LavenderBlush2"]={238, 224, 229}, -["LavenderBlush3"]={205, 193, 197}, -["LavenderBlush4"]={139, 131, 134}, -["lawn green"]={124, 252, 0}, -["LawnGreen"]={124, 252, 0}, -["lemon chiffon"]={255, 250, 205}, -["LemonChiffon"]={255, 250, 205}, -["LemonChiffon1"]={255, 250, 205}, -["LemonChiffon2"]={238, 233, 191}, -["LemonChiffon3"]={205, 201, 165}, -["LemonChiffon4"]={139, 137, 112}, -["light blue"]={173, 216, 230}, -["light coral"]={240, 128, 128}, -["light cyan"]={224, 255, 255}, -["light goldenrod"]={238, 221, 130}, -["light goldenrod yellow"]={250, 250, 210}, -["light gray"]={211, 211, 211}, -["light grey"]={211, 211, 211}, -["light pink"]={255, 182, 193}, -["light salmon"]={255, 160, 122}, -["light sea green"]={32, 178, 170}, -["light sky blue"]={135, 206, 250}, -["light slate blue"]={132, 112, 255}, -["light slate gray"]={119, 136, 153}, -["light slate grey"]={119, 136, 153}, -["light steel blue"]={176, 196, 222}, -["light yellow"]={255, 255, 224}, -["LightBlue"]={173, 216, 230}, -["LightBlue1"]={191, 239, 255}, -["LightBlue2"]={178, 223, 238}, -["LightBlue3"]={154, 192, 205}, -["LightBlue4"]={104, 131, 139}, -["LightCoral"]={240, 128, 128}, -["LightCyan"]={224, 255, 255}, -["LightCyan1"]={224, 255, 255}, -["LightCyan2"]={209, 238, 238}, -["LightCyan3"]={180, 205, 205}, -["LightCyan4"]={122, 139, 139}, -["LightGoldenrod"]={238, 221, 130}, -["LightGoldenrod1"]={255, 236, 139}, -["LightGoldenrod2"]={238, 220, 130}, -["LightGoldenrod3"]={205, 190, 112}, -["LightGoldenrod4"]={139, 129, 76}, -["LightGoldenrodYellow"]={250, 250, 210}, -["LightGray"]={211, 211, 211}, -["LightGrey"]={211, 211, 211}, -["LightPink"]={255, 182, 193}, -["LightPink1"]={255, 174, 185}, -["LightPink2"]={238, 162, 173}, -["LightPink3"]={205, 140, 149}, -["LightPink4"]={139, 95, 101}, -["LightSalmon"]={255, 160, 122}, -["LightSalmon1"]={255, 160, 122}, -["LightSalmon2"]={238, 149, 114}, -["LightSalmon3"]={205, 129, 98}, -["LightSalmon4"]={139, 87, 66}, -["LightSeaGreen"]={32, 178, 170}, -["LightSkyBlue"]={135, 206, 250}, -["LightSkyBlue1"]={176, 226, 255}, -["LightSkyBlue2"]={164, 211, 238}, -["LightSkyBlue3"]={141, 182, 205}, -["LightSkyBlue4"]={96, 123, 139}, -["LightSlateBlue"]={132, 112, 255}, -["LightSlateGray"]={119, 136, 153}, -["LightSlateGrey"]={119, 136, 153}, -["LightSteelBlue"]={176, 196, 222}, -["LightSteelBlue1"]={202, 225, 255}, -["LightSteelBlue2"]={188, 210, 238}, -["LightSteelBlue3"]={162, 181, 205}, -["LightSteelBlue4"]={110, 123, 139}, -["LightYellow"]={255, 255, 224}, -["LightYellow1"]={255, 255, 224}, -["LightYellow2"]={238, 238, 209}, -["LightYellow3"]={205, 205, 180}, -["LightYellow4"]={139, 139, 122}, -["lime green"]={50, 205, 50}, -["LimeGreen"]={50, 205, 50}, -["linen"]={250, 240, 230}, -["magenta"]={255, 0, 255}, -["magenta1"]={255, 0, 255}, -["magenta2"]={238, 0, 238}, -["magenta3"]={205, 0, 205}, -["magenta4"]={139, 0, 139}, -["maroon"]={176, 48, 96}, -["maroon1"]={255, 52, 179}, -["maroon2"]={238, 48, 167}, -["maroon3"]={205, 41, 144}, -["maroon4"]={139, 28, 98}, -["medium aquamarine"]={102, 205, 170}, -["medium blue"]={0, 0, 205}, -["medium orchid"]={186, 85, 211}, -["medium purple"]={147, 112, 219}, -["medium sea green"]={60, 179, 113}, -["medium slate blue"]={123, 104, 238}, -["medium spring green"]={0, 250, 154}, -["medium turquoise"]={72, 209, 204}, -["medium violet red"]={199, 21, 133}, -["MediumAquamarine"]={102, 205, 170}, -["MediumBlue"]={0, 0, 205}, -["MediumOrchid"]={186, 85, 211}, -["MediumOrchid1"]={224, 102, 255}, -["MediumOrchid2"]={209, 95, 238}, -["MediumOrchid3"]={180, 82, 205}, -["MediumOrchid4"]={122, 55, 139}, -["MediumPurple"]={147, 112, 219}, -["MediumPurple1"]={171, 130, 255}, -["MediumPurple2"]={159, 121, 238}, -["MediumPurple3"]={137, 104, 205}, -["MediumPurple4"]={93, 71, 139}, -["MediumSeaGreen"]={60, 179, 113}, -["MediumSlateBlue"]={123, 104, 238}, -["MediumSpringGreen"]={0, 250, 154}, -["MediumTurquoise"]={72, 209, 204}, -["MediumVioletRed"]={199, 21, 133}, -["midnight blue"]={25, 25, 112}, -["MidnightBlue"]={25, 25, 112}, -["mint cream"]={245, 255, 250}, -["MintCream"]={245, 255, 250}, -["misty rose"]={255, 228, 225}, -["MistyRose"]={255, 228, 225}, -["MistyRose1"]={255, 228, 225}, -["MistyRose2"]={238, 213, 210}, -["MistyRose3"]={205, 183, 181}, -["MistyRose4"]={139, 125, 123}, -["moccasin"]={255, 228, 181}, -["navajo white"]={255, 222, 173}, -["NavajoWhite"]={255, 222, 173}, -["NavajoWhite1"]={255, 222, 173}, -["NavajoWhite2"]={238, 207, 161}, -["NavajoWhite3"]={205, 179, 139}, -["NavajoWhite4"]={139, 121, 94}, -["navy"]={0, 0, 128}, -["navy blue"]={0, 0, 128}, -["NavyBlue"]={0, 0, 128}, -["old lace"]={253, 245, 230}, -["OldLace"]={253, 245, 230}, -["olive drab"]={107, 142, 35}, -["OliveDrab"]={107, 142, 35}, -["OliveDrab1"]={192, 255, 62}, -["OliveDrab2"]={179, 238, 58}, -["OliveDrab3"]={154, 205, 50}, -["OliveDrab4"]={105, 139, 34}, -["orange"]={255, 165, 0}, -["orange red"]={255, 69, 0}, -["orange1"]={255, 165, 0}, -["orange2"]={238, 154, 0}, -["orange3"]={205, 133, 0}, -["orange4"]={139, 90, 0}, -["OrangeRed"]={255, 69, 0}, -["OrangeRed1"]={255, 69, 0}, -["OrangeRed2"]={238, 64, 0}, -["OrangeRed3"]={205, 55, 0}, -["OrangeRed4"]={139, 37, 0}, -["orchid"]={218, 112, 214}, -["orchid1"]={255, 131, 250}, -["orchid2"]={238, 122, 233}, -["orchid3"]={205, 105, 201}, -["orchid4"]={139, 71, 137}, -["pale goldenrod"]={238, 232, 170}, -["pale green"]={152, 251, 152}, -["pale turquoise"]={175, 238, 238}, -["pale violet red"]={219, 112, 147}, -["PaleGoldenrod"]={238, 232, 170}, -["PaleGreen"]={152, 251, 152}, -["PaleGreen1"]={154, 255, 154}, -["PaleGreen2"]={144, 238, 144}, -["PaleGreen3"]={124, 205, 124}, -["PaleGreen4"]={84, 139, 84}, -["PaleTurquoise"]={175, 238, 238}, -["PaleTurquoise1"]={187, 255, 255}, -["PaleTurquoise2"]={174, 238, 238}, -["PaleTurquoise3"]={150, 205, 205}, -["PaleTurquoise4"]={102, 139, 139}, -["PaleVioletRed"]={219, 112, 147}, -["PaleVioletRed1"]={255, 130, 171}, -["PaleVioletRed2"]={238, 121, 159}, -["PaleVioletRed3"]={205, 104, 137}, -["PaleVioletRed4"]={139, 71, 93}, -["papaya whip"]={255, 239, 213}, -["PapayaWhip"]={255, 239, 213}, -["peach puff"]={255, 218, 185}, -["PeachPuff"]={255, 218, 185}, -["PeachPuff1"]={255, 218, 185}, -["PeachPuff2"]={238, 203, 173}, -["PeachPuff3"]={205, 175, 149}, -["PeachPuff4"]={139, 119, 101}, -["peru"]={205, 133, 63}, -["pink"]={255, 192, 203}, -["pink1"]={255, 181, 197}, -["pink2"]={238, 169, 184}, -["pink3"]={205, 145, 158}, -["pink4"]={139, 99, 108}, -["plum"]={221, 160, 221}, -["plum1"]={255, 187, 255}, -["plum2"]={238, 174, 238}, -["plum3"]={205, 150, 205}, -["plum4"]={139, 102, 139}, -["powder blue"]={176, 224, 230}, -["PowderBlue"]={176, 224, 230}, -["purple"]={160, 32, 240}, -["purple1"]={155, 48, 255}, -["purple2"]={145, 44, 238}, -["purple3"]={125, 38, 205}, -["purple4"]={85, 26, 139}, -["red"]={255, 0, 0}, -["red1"]={255, 0, 0}, -["red2"]={238, 0, 0}, -["red3"]={205, 0, 0}, -["red4"]={139, 0, 0}, -["rosy brown"]={188, 143, 143}, -["RosyBrown"]={188, 143, 143}, -["RosyBrown1"]={255, 193, 193}, -["RosyBrown2"]={238, 180, 180}, -["RosyBrown3"]={205, 155, 155}, -["RosyBrown4"]={139, 105, 105}, -["royal blue"]={65, 105, 225}, -["RoyalBlue"]={65, 105, 225}, -["RoyalBlue1"]={72, 118, 255}, -["RoyalBlue2"]={67, 110, 238}, -["RoyalBlue3"]={58, 95, 205}, -["RoyalBlue4"]={39, 64, 139}, -["saddle brown"]={139, 69, 19}, -["SaddleBrown"]={139, 69, 19}, -["salmon"]={250, 128, 114}, -["salmon1"]={255, 140, 105}, -["salmon2"]={238, 130, 98}, -["salmon3"]={205, 112, 84}, -["salmon4"]={139, 76, 57}, -["sandy brown"]={244, 164, 96}, -["SandyBrown"]={244, 164, 96}, -["sea green"]={46, 139, 87}, -["SeaGreen"]={46, 139, 87}, -["SeaGreen1"]={84, 255, 159}, -["SeaGreen2"]={78, 238, 148}, -["SeaGreen3"]={67, 205, 128}, -["SeaGreen4"]={46, 139, 87}, -["seashell"]={255, 245, 238}, -["seashell1"]={255, 245, 238}, -["seashell2"]={238, 229, 222}, -["seashell3"]={205, 197, 191}, -["seashell4"]={139, 134, 130}, -["sienna"]={160, 82, 45}, -["sienna1"]={255, 130, 71}, -["sienna2"]={238, 121, 66}, -["sienna3"]={205, 104, 57}, -["sienna4"]={139, 71, 38}, -["sky blue"]={135, 206, 235}, -["SkyBlue"]={135, 206, 235}, -["SkyBlue1"]={135, 206, 255}, -["SkyBlue2"]={126, 192, 238}, -["SkyBlue3"]={108, 166, 205}, -["SkyBlue4"]={74, 112, 139}, -["slate blue"]={106, 90, 205}, -["slate gray"]={112, 128, 144}, -["slate grey"]={112, 128, 144}, -["SlateBlue"]={106, 90, 205}, -["SlateBlue1"]={131, 111, 255}, -["SlateBlue2"]={122, 103, 238}, -["SlateBlue3"]={105, 89, 205}, -["SlateBlue4"]={71, 60, 139}, -["SlateGray"]={112, 128, 144}, -["SlateGray1"]={198, 226, 255}, -["SlateGray2"]={185, 211, 238}, -["SlateGray3"]={159, 182, 205}, -["SlateGray4"]={108, 123, 139}, -["SlateGrey"]={112, 128, 144}, -["snow"]={255, 250, 250}, -["snow1"]={255, 250, 250}, -["snow2"]={238, 233, 233}, -["snow3"]={205, 201, 201}, -["snow4"]={139, 137, 137}, -["spring green"]={0, 255, 127}, -["SpringGreen"]={0, 255, 127}, -["SpringGreen1"]={0, 255, 127}, -["SpringGreen2"]={0, 238, 118}, -["SpringGreen3"]={0, 205, 102}, -["SpringGreen4"]={0, 139, 69}, -["steel blue"]={70, 130, 180}, -["SteelBlue"]={70, 130, 180}, -["SteelBlue1"]={99, 184, 255}, -["SteelBlue2"]={92, 172, 238}, -["SteelBlue3"]={79, 148, 205}, -["SteelBlue4"]={54, 100, 139}, -["tan"]={210, 180, 140}, -["tan1"]={255, 165, 79}, -["tan2"]={238, 154, 73}, -["tan3"]={205, 133, 63}, -["tan4"]={139, 90, 43}, -["thistle"]={216, 191, 216}, -["thistle1"]={255, 225, 255}, -["thistle2"]={238, 210, 238}, -["thistle3"]={205, 181, 205}, -["thistle4"]={139, 123, 139}, -["tomato"]={255, 99, 71}, -["tomato1"]={255, 99, 71}, -["tomato2"]={238, 92, 66}, -["tomato3"]={205, 79, 57}, -["tomato4"]={139, 54, 38}, -["turquoise"]={64, 224, 208}, -["turquoise1"]={0, 245, 255}, -["turquoise2"]={0, 229, 238}, -["turquoise3"]={0, 197, 205}, -["turquoise4"]={0, 134, 139}, -["violet"]={238, 130, 238}, -["violet red"]={208, 32, 144}, -["VioletRed"]={208, 32, 144}, -["VioletRed1"]={255, 62, 150}, -["VioletRed2"]={238, 58, 140}, -["VioletRed3"]={205, 50, 120}, -["VioletRed4"]={139, 34, 82}, -["wheat"]={245, 222, 179}, -["wheat1"]={255, 231, 186}, -["wheat2"]={238, 216, 174}, -["wheat3"]={205, 186, 150}, -["wheat4"]={139, 126, 102}, -["white"]={255, 255, 255}, -["white smoke"]={245, 245, 245}, -["WhiteSmoke"]={245, 245, 245}, -["yellow"]={255, 255, 0}, -["yellow green"]={154, 205, 50}, -["yellow1"]={255, 255, 0}, -["yellow2"]={238, 238, 0}, -["yellow3"]={205, 205, 0}, -["yellow4"]={139, 139, 0}, -["YellowGreen"]={154, 205, 50} - -} diff --git a/examples/lissajous/LICK/lib/docs/classes/Circle.html b/examples/lissajous/LICK/lib/docs/classes/Circle.html deleted file mode 100644 index 852dc53..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/Circle.html +++ /dev/null @@ -1 +0,0 @@ -Circle

Circle               drawable circle

       function(self, x, y, r, s, color)

               Constructor

       draw(style)

              draw the circle
\ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/classes/Drawable.html b/examples/lissajous/LICK/lib/docs/classes/Drawable.html deleted file mode 100644 index dcd58a1..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/Drawable.html +++ /dev/null @@ -1 +0,0 @@ -Drawable

Drawable               base class for all drawable stuff

       function(self, x, y, color)

               Constructor

       wrapX(min, max)

              can be called via wrapX(max) or wrapX(min,max)

       wrapY(min, max)

              can be called via wrapY(max) or wrapY(min,max)

       wrap(str, min, max)

              internal wrapper

       set(str, val)

              supercollider style 'set'

       draw()

              not yet implemented
\ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/classes/Line.html b/examples/lissajous/LICK/lib/docs/classes/Line.html deleted file mode 100644 index 4faa005..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/Line.html +++ /dev/null @@ -1 +0,0 @@ -Line

Line               draw a line

       function(self, x, y, tx, ty)

               Constructor \ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/classes/Object.html b/examples/lissajous/LICK/lib/docs/classes/Object.html deleted file mode 100644 index 84c6db9..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/Object.html +++ /dev/null @@ -1 +0,0 @@ -Object

Object               base class

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/classes/SCObject.html b/examples/lissajous/LICK/lib/docs/classes/SCObject.html deleted file mode 100644 index 2d1621a..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/SCObject.html +++ /dev/null @@ -1 +0,0 @@ -SCObject

SCObject               bass class for supercollider communication

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/classes/SCSynth.html b/examples/lissajous/LICK/lib/docs/classes/SCSynth.html deleted file mode 100644 index b2f94ac..0000000 --- a/examples/lissajous/LICK/lib/docs/classes/SCSynth.html +++ /dev/null @@ -1 +0,0 @@ -SCSynth

SCSynth               supercollider synthesizer class

       function(self, nodename, freq)

               Constructor

       set(control, val)

              set a control, TODO: variable lenght of argument-pairs

        os.time(),

              bundle",

       play()

              sends an OSC message to the supercollider to start the synth

        os.time(),

              bundle",

       free()

              frees the node on the supercollider server

        os.time()+0.8,

              bundle",
\ No newline at end of file diff --git a/examples/lissajous/LICK/lib/docs/guidelines.html b/examples/lissajous/LICK/lib/docs/guidelines.html deleted file mode 100644 index b394e30..0000000 --- a/examples/lissajous/LICK/lib/docs/guidelines.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - -

Guidelines for new live_libs classes

-


-

1. Howto write a new class

-


-

-

<class name> =  Class(<constructor>)

-

creates a class with function in constructor

-


-

<class name>:inherit(<other class name>)

-

if you want to inherit from any class.Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table

-


-

If you want to call the constructor of the superclass write the following in the constructor of the current class:

-

-

<super class name>.<construct>(self, <arguments>)

-


-

More on Classes and HUMP: http://vrld.github.com/hump/

-


-

2. Commenting

-

-

In order to work the comment parser needs the following comment 'marks':

-


-


-

-- @ <class name>:<short description>

-

This marks a new class. The following line should be the class definition

-

Note: only one line comments are working

-


-

-- # <description>

-

This marks a new method.

-

Note: the limitations of class comments apply

-


-

any '--' without marks will not be included in the helpfile

-

-

Example:

-

-- @Drawable: base class for all drawable stuff

-

Drawable = Class(function(self, x, y, color)

-

self.color = color or hlpr.color("white",255)

-

-- call constructor of Object class

-

Object.construct(self)

-

self.position = Vector(x or 0,y or 0)

-

end)

-

Drawable:inherit(Object)

-


-

-- #can be called via wrapX(max) or wrapX(min,max)

-

function Drawable:wrapX(min, max)

-

if min and max then

-

self:wrap("x", min, max)

-

elseif min and not max then 

-

self:wrap("x", 0, min)

-

end

-

end

-


-


- - diff --git a/examples/lissajous/LICK/lib/docs/guidelines.txt b/examples/lissajous/LICK/lib/docs/guidelines.txt deleted file mode 100644 index fd1010f..0000000 --- a/examples/lissajous/LICK/lib/docs/guidelines.txt +++ /dev/null @@ -1,51 +0,0 @@ -Guidelines for new live_libs classes - -1. Howto write a new class - - - = Class() - creates a class with function in constructor - - :inherit() - if you want to inherit from any class. Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table - -If you want to call the constructor of the superclass write the following in the constructor of the current class: - - .(self, ) -More on Classes and HUMP: http://vrld.github.com/hump/ - -2. Commenting - - In order to work the comment parser needs the following comment 'marks': - - - -- @ : - This marks a new class. - Note: only oneliners are working - - -- # - This marks a new method. - Note: limitation of class comments apply - - any '--' without marks will not be included in the helpfile - - Example: - -- @Drawable: base class for all drawable stuff - Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - self.position = Vector(x or 0,y or 0) - end) - Drawable:inherit(Object) - - -- #can be called via wrapX(max) or wrapX(min,max) - function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end - end - - diff --git a/examples/lissajous/LICK/lib/docs/index.html b/examples/lissajous/LICK/lib/docs/index.html deleted file mode 100644 index 6868575..0000000 --- a/examples/lissajous/LICK/lib/docs/index.html +++ /dev/null @@ -1 +0,0 @@ -live_libs_doc

live_libs documentation

Guidelines for new classes and commenting

Classes:

Object
SCObject
SCSynth
Drawable
Circle
Line
\ No newline at end of file diff --git a/examples/lissajous/LICK/lib/help.lua b/examples/lissajous/LICK/lib/help.lua deleted file mode 100644 index 744ffd4..0000000 --- a/examples/lissajous/LICK/lib/help.lua +++ /dev/null @@ -1,109 +0,0 @@ --- parse the classes to readable html - -module(..., package.seeall) - -filename = "LICK/lib/object.lua" -help_filename = "LICK/lib/docs/" - --- some styles -local style = "" - -local header1 = "" -local header2 = ""..style.."" -local footer = "" -local _newclasstitle = "

" -local newclasstitle_ = "

" -local tab = "       " - - --- generates the html file -function generate() - class_file = love.filesystem.newFile( filename ) - class_file:open('r') - local output = "" - output = header1.."test"..header2 - local found_methods = 0 - local found_classes = 0 - local classes = {} - for line in class_file:lines() do - local b,e = string.find(line,"@") - local b1,e1 = string.find(line,"Class") - if b and e then - if found_classes > 0 then - output = output..footer - writeClassFile(name, output) - local output = "" - - end - dp,ep = string.find(line, ":") - name = line:sub(e+1, dp-1 or 0) - print(name) - table.insert(classes,name) - output = header1..name..header2 - - output = output .._newclasstitle .. name..tab..tab..line:sub(dp+1) ..newclasstitle_ - found_methods = 0 - found_classes = found_classes + 1 - elseif b1 and e1 and not string.find(line,"require") then - output = output .."

"..tab..line:sub(e1+2).."

"..tab..tab.." Constructor" - - end - local b,e = string.find(line,"#") - if method then - local dp,ep = string.find(line, ":") - ep = ep or 1 - if found == 0 then - output = output .."

Methods

" - found_methods = found_methods + 1 - end - output = output.."

".. tab ..line:sub(ep+1).."

"..tab..tab..method - method = nil - end - if b and e then - method = line:sub(e+1).."
" - - --output = output..line:sub(e+1).."
" - end - end - output = output..footer - writeClassFile(name, output) - - -- generate index.html - index = header1.."live_libs_doc"..header2 - index = index.."

live_libs documentation

" - index = index .. "Guidelines for new classes and commenting" - index = index.. "

Classes:

" - for i,v in ipairs(classes) do - index = index..""..v.."
" - end - index = index..footer - writeFile("index", index) - - -end - -function writeClassFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename.."classes/"..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - -function writeFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - - diff --git a/examples/lissajous/LICK/lib/hlpr.lua b/examples/lissajous/LICK/lib/hlpr.lua deleted file mode 100644 index 13ded41..0000000 --- a/examples/lissajous/LICK/lib/hlpr.lua +++ /dev/null @@ -1,350 +0,0 @@ --- hlpr libary: it's not about nice coding, ist about fast and easy coding --- by Rukano and Headchant, 2011 - - --- global math -pi = math.pi -sin = math.sin -deg = math.deg -rad = math.rad - -State = State or {} - -function declare(t) - for i,v in pairs(t) do - if not State[i] then - State[i] = v - _G[i] = State[i] - end - end -end -require "LICK/lib/color" -module(...,package.seeall) - --- syntax shortcuts -checkMode = love.graphics.checkMode -circle = love.graphics.circle -clear = love.graphics.clear -draw = love.graphics.draw -drawq = love.graphics.drawq -getBackgroundColor = love.graphics.getBackgroundColor -getBlendMode = love.graphics.getBlendMode -getCaption =love.graphics.getCaption -getColor = love.graphics.getColor -getColorMode = love.graphics.getColorMode -getFont = love.graphics.getFont -getHeight = love.graphics.getHeight -getLineStipple = love.graphics.getLineStipple -getLineStyle = love.graphics.getLineStyle -getLineWidth = love.graphics.getLineWidth -getMaxPointSize = love.graphics.getMaxPointSize -getModes = love.graphics.getModes -getPointSize = love.graphics.getPointSize -getPointStyle = love.graphics.getPointStyle -getScissor = love.graphics.getScissor -getWidth = love.graphics.getWidth -isCreated = love.graphics.isCreated -line = love.graphics.line -newFont = love.graphics.newFont -newFrameBuffer = love.graphics.newFramebuffer -newImage = love.graphics.newImage -newImageFont = love.graphics.newImageFont -newParticleSystem = love.graphics.newParticleSystem -newQuad = love.graphics.newQuad -newScreenshot = love.graphics.newScreenshot -newSpriteBatch = love.graphics.newSpriteBatch -point = love.graphics.point -polygon = love.graphics.polygon -pop = love.graphics.pop -present = love.graphics.present -print = love.graphics.print -printf = love.graphics.printf -push = love.graphics.push -quad = love.graphics.quad -rectagle = love.graphics.rectangle -reset = love.graphics.reset -rotate = love.graphics.rotate -scale = love.graphics.scale -setBackgroundColor = love.graphics.setBackgroundColor -setBlendMode = love.graphics.setBlendMode -setCaption = love.graphics.setCaption -setColor = love.graphics.setColor -setColorMode = love.graphics.setColorMode -setFont = love.graphics.setFont -setIcon = love.graphics.setIcon -setLine = love.graphics.setLine -setLineStipple = love.graphics.setLineStipple -setLineStyle = love.graphics.setLineStyle -setLineWidth = love.graphics.setLineWidth -setMode = love.graphics.setMode -setPoint = love.graphics.setPoint -setPointSize = love.graphics.setPointSize -setPointStyle = love.graphics.setPointStyle -setRenderTarget = love.graphics.setRenderTarget -setScissor = love.graphics.setScissor -toggleFullscreen = love.graphics.toggleFullscreen -translate = love.graphics.translate -triangle = love.graphics.triangle - - - - - - -function color(r, g,b,a) - local color={} - local alpha=a or 255 - local name=r or "azure" - if type(r) == "string" then - alpha = g or alpha - color = x11_color_table[name] - else - color[1]=r - color[2]=g - color[3]=b - end - color[4]=alpha - return color -end - --- clip withing range -function clip(n,min,max) - return math.min(math.max(n, min or -math.huge), max or math.huge) -end - --- wrap within range, updated version -function wrap(n, min, max) - local min = min or 0 - return ((n - min) % ((max or 0) - min)) + min -end - --- setColor white -function white() - love.graphics.setColor(255,255,255,255) -end - --- setColor black -function black() - love.graphics.setColor(0,0,0,255) -end - --- shorter setColor white -function w() - white() -end - --- shorter setColor black -function b() - black() -end - --- fill the screen with translucent black -function clear(alpha) - love.graphics.setColor(0,0,0,alpha) - love.graphics.rectangle("fill", 0,0,800,600) -end - --- shorter clear -function cls(alpha) - clear(alpha) -end - --- one time clear -function cls_once() - love.graphics.setColor(0,0,0,255) - love.graphics.rectangle("fill", 0,0,800,600) -end - - --- returns random values from -1 to 1, g sets the equidistance -function norm_random() - return 2 * math.random() - 1 -end - --- shorte norm_random -function n_rnd() - return norm_random() -end - --- drunk, brownnoise/drunk walk: x = x +/- random(width) -function drunk(x, width, g) - x = x or 0 - width = width or 1 - g = g or 100 - return (x + width*norm_random()) -end - - --- drnk, shorter version of drunk, start is only used the first time --- this makes some sense whatsoever... -function drnk(width) - local last = 0 - return function() - last = last + width * norm_random() - return last - end -end - --- scaling functions: - -function linlin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linlin - - local n=n or 0 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case you forgot the parameters... - return n - end - - if clip == "minmax" then - if n <= inMin then - return minoutMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((n-inMin)/(inMax-inMin)) * (outMax-outMin)) + outMin - return n -end - -function linexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = math.pow(outMax/outMin, (n-inMin)/(inMax-inMin)) * outMin - return n -end - -function explin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:explin - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((math.log(n/inMin)) / (math.log(inMax/inMin))) * (outMax-outMin)) + outMin - return n -end - -function expexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:expexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - -- here is the magic! - n = math.pow(outMax/outMin, math.log(n/inMin) / math.log(inMax/inMin)) * outMin - return n -end - --- returns easy sine oscillator -function sin() - local x = 0 - return function(dt) - x = x + (dt or 0) - if x > 2 * pi then x = x - 2*pi end - return math.sin(x) - end -end - --- updates all objects in the _object table -function update_objects() - for i,v in ipairs(_internal_object_table) do - v:update(dt) - end -end - --- rotate around center -function rotateCenter(angle) - local angle=angle or 0 - local w, h = getWidth(), getHeight() - translate(w/2, h/2) - rotate(angle) - translate(-w/2, -h/2) -end - --- return a random table entry -function choose(table) - return table[math.random(#table)] -end diff --git a/examples/lissajous/LICK/lib/hump/README.md b/examples/lissajous/LICK/lib/hump/README.md deleted file mode 100644 index 759c724..0000000 --- a/examples/lissajous/LICK/lib/hump/README.md +++ /dev/null @@ -1,48 +0,0 @@ -HUMP - Helper Utilities for Massive Progression -=============================================== - -__HUMP__ is a small collection of tools for developing games with LÖVE. - -Contents: ------------- - -* *vector.lua*: powerful vector class (pure lua) -* *class.lua*: "class" system supporting function inheritance (pure lua) -* *camera.lua*: translate-, zoom- and rotatable camera -* *gamestate.lua*: class to handle gamestates -* *ringbuffer.lua*: a circular container -* *sequence.lua*: utility to handle ingame cutscenes and such - -Documentation -============= - -You can find the documentation here: [http://vrld.github.com/hump/](http://vrld.github.com/hump/ "project page") - - -License -======= -Yay, *free software*: - -> Copyright (c) 2010 Matthias Richter -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> Except as contained in this notice, the name(s) of the above copyright holders -> shall not be used in advertising or otherwise to promote the sale, use or -> other dealings in this Software without prior written authorization. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/examples/lissajous/LICK/lib/hump/camera.lua b/examples/lissajous/LICK/lib/hump/camera.lua deleted file mode 100644 index 4bd8d14..0000000 --- a/examples/lissajous/LICK/lib/hump/camera.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, require, love = setmetatable, require, love -module(...) -local vector = require(_PACKAGE..'vector') - -local camera = {} -camera.__index = camera - -function new(pos, zoom, rot) - local pos = pos or vector(love.graphics.getWidth(), love.graphics.getHeight()) / 2 - local zoom = zoom or 1 - local rot = rot or 0 - return setmetatable({pos = pos, zoom = zoom, rot = rot}, camera) -end - -function camera:rotate(phi) - self.rot = self.rot + phi -end - -function camera:translate(t) - self.pos = self.pos + t -end -camera.move = camera.translate - -function camera:predraw() - local center = vector(love.graphics.getWidth(), love.graphics.getHeight()) / (self.zoom * 2) - love.graphics.push() - love.graphics.scale(self.zoom) - love.graphics.translate(center:unpack()) - love.graphics.rotate(self.rot) - love.graphics.translate((-self.pos):unpack()) -end - -function camera:postdraw() - love.graphics.pop() -end - -function camera:draw(func) - self:predraw() - func() - self:postdraw() -end - -function camera:toCameraCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = (p - self.pos):rotate_inplace(self.rot) - return vector(p.x * self.zoom + w/2, p.y * self.zoom + h/2) -end - -function camera:toWorldCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = vector((p.x-w/2) / self.zoom, (p.y-h/2) / self.zoom):rotate_inplace(-self.rot) - return p + self.pos -end - -function camera:mousepos() - return self:toWorldCoords(vector(love.mouse.getPosition())) -end - --- camera() as a shortcut to new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/lissajous/LICK/lib/hump/class.lua b/examples/lissajous/LICK/lib/hump/class.lua deleted file mode 100644 index 2b014b9..0000000 --- a/examples/lissajous/LICK/lib/hump/class.lua +++ /dev/null @@ -1,82 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local type, assert, pairs = type, assert, pairs -local tostring, string_format = tostring, string.format -module(...) - -local function __NULL__() end -function new(constructor) - -- check name and constructor - local name = '' - if type(constructor) == "table" then - if constructor.name then name = constructor.name end - constructor = constructor[1] - end - assert(not constructor or type(constructor) == "function", - string_format('%s: constructor has to be nil or a function', name)) - - -- build class - local c = {} - c.__index = c - c.__tostring = function() return string_format("", name) end - c.construct = constructor or __NULL__ - c.Construct = constructor or __NULL__ - c.inherit = inherit - c.Inherit = inherit - - local meta = { - __call = function(self, ...) - local obj = {} - self.construct(obj, ...) - return setmetatable(obj, self) - end, - __tostring = function() return tostring(name) end - } - - return setmetatable(c, meta) -end - -function inherit(class, interface, ...) - if not interface then return end - - -- __index and construct are not overwritten as for them class[name] is defined - for name, func in pairs(interface) do - if not class[name] and type(func) == "function" then - class[name] = func - end - end - - inherit(class, ...) -end - --- class() as shortcut to class.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/lissajous/LICK/lib/hump/gamestate.lua b/examples/lissajous/LICK/lib/hump/gamestate.lua deleted file mode 100644 index 746f81b..0000000 --- a/examples/lissajous/LICK/lib/hump/gamestate.lua +++ /dev/null @@ -1,154 +0,0 @@ ---[[ -Copyright (c) 2010-2011 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local error, assert, love = error, assert, love -module(...) - -local function __NULL__() end --- default gamestate produces error on every callback -local function __ERROR__() error("Gamestate not initialized. Use Gamestate.switch()") end -current = { - enter = __ERROR__, - leave = __NULL__, - update = __ERROR__, - draw = __ERROR__, - focus = __ERROR__, - keyreleased = __ERROR__, - keypressed = __ERROR__, - mousepressed = __ERROR__, - mousereleased = __ERROR__, - joystickpressed = __ERROR__, - joystickreleased = __ERROR__, - quit = __ERROR__, -} - -function new() - return { - enter = __NULL__, - leave = __NULL__, - update = __NULL__, - draw = __NULL__, - focus = __NULL__, - keyreleased = __NULL__, - keypressed = __NULL__, - mousepressed = __NULL__, - mousereleased = __NULL__, - joystickpressed = __NULL__, - joystickreleased = __NULL__, - quit = __NULL__, - } -end - -function switch(to, ...) - assert(to, "Missing argument: Gamestate to switch to") - current:leave() - local pre = current - current = to - return current:enter(pre, ...) -end - -local _update -function update(...) - if _update then _update(...) end - return current:update(...) -end - -local _draw -function draw(...) - if _draw then _draw(...) end - return current:draw(...) -end - -local _focus -function focus(...) - if _focus then _focus(...) end - return current:focus(...) -end - -local _keypressed -function keypressed(...) - if _keypressed then _keypressed(...) end - return current:keypressed(...) -end - -local _keyreleased -function keyreleased(...) - if _keyreleased then _keyreleased(...) end - return current:keyreleased(...) -end - -local _mousepressed -function mousepressed(...) - if _mousereleased then _mousepressed(...) end - return current:mousepressed(...) -end - -local _mousereleased -function mousereleased(...) - if _mousereleased then _mousereleased(...) end - return current:mousereleased(...) -end - -local _joystickpressed -function joystickpressed(...) - if _joystickpressed then _joystickpressed(...) end - return current:joystickpressed(...) -end - -local _joystickreleased -function joystickreleased(...) - if _joystickreleased then _joystickreleased(...) end - return current:joystickreleased(...) -end - -local _quit -function quit(...) - if _quit then _quit(...) end - return current:quit(...) -end - -function registerEvents() - _update = love.update - love.update = update - _draw = love.draw - love.draw = draw - _focus = love.focus - love.focus = focus - _keypressed = love.keypressed - love.keypressed = keypressed - _keyreleased = love.keyreleased - love.keyreleased = keyreleased - _mousepressed = love.mousepressed - love.mousepressed = mousepressed - _mousereleased = love.mousereleased - love.mousereleased = mousereleased - _joystickpressed = love.joystickpressed - love.joystickpressed = joystickpressed - _joystickreleased = love.joystickreleased - love.joystickreleased = joystickreleased - _quit = love.quit - love.quit = quit -end diff --git a/examples/lissajous/LICK/lib/hump/ringbuffer.lua b/examples/lissajous/LICK/lib/hump/ringbuffer.lua deleted file mode 100644 index 2b2b3cb..0000000 --- a/examples/lissajous/LICK/lib/hump/ringbuffer.lua +++ /dev/null @@ -1,99 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable, table = setmetatable, getmetatable, table -module(...) -local ringbuffer = {} -ringbuffer.__index = ringbuffer - -function new(...) - local rb = {} - rb.items = {...} - rb.current = 1 - return setmetatable(rb, ringbuffer) -end - -function ringbuffer:insert(item, ...) - if not item then return end - -- insert rest before self so order is restored, e.g.: - -- {1,<2>,3}:insert(4,5) -> {1,<2>,3}:insert(5) -> {1,<2>,5,3} -> {1,<2>,4,5,3} - self:insert(...) - table.insert(self.items, self.current+1, item) -end - -function ringbuffer:append(item, ...) - if not item then return end - self.items[#self.items+1] = item - return self:append(...) -end - -function ringbuffer:removeAt(k) - -- wrap position - local pos = (self.current + k) % #self.items - while pos < 1 do pos = pos + #self.items end - - -- remove item - local item = table.remove(self.items, pos) - - -- possibly adjust current pointer - if pos < self.current then self.current = self.current - 1 end - if self.current > #self.items then self.current = 1 end - - -- return item - return item -end - -function ringbuffer:remove() - return table.remove(self.items, self.current) -end - -function ringbuffer:get() - return self.items[self.current] -end - -function ringbuffer:size() - return #self.items -end - -function ringbuffer:next() - self.current = (self.current % #self.items) + 1 - return self:get() -end - -function ringbuffer:prev() - self.current = self.current - 1 - if self.current < 1 then - self.current = #self.items - end - return self:get() -end - --- Ringbuffer() as a shortcut to Ringbuffer.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/lissajous/LICK/lib/hump/timer.lua b/examples/lissajous/LICK/lib/hump/timer.lua deleted file mode 100644 index 2ce460d..0000000 --- a/examples/lissajous/LICK/lib/hump/timer.lua +++ /dev/null @@ -1,83 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local assert, type = assert, type -local pairs, ipairs = pairs, ipairs -local min = math.min -module(...) - -functions = {} -function update(dt) - local to_remove = {} - for func, delay in pairs(functions) do - delay = delay - dt - if delay <= 0 then - to_remove[#to_remove+1] = func - else - functions[func] = delay - end - end - for _,func in ipairs(to_remove) do - functions[func] = nil - func(func) - end -end - -function add(delay, func) - assert(type(func) == "function", "second argument needs to be a function") - functions[func] = delay -end - -function addPeriodic(delay, func, count) - assert(type(func) == "function", "second argument needs to be a function") - if count then - return add(delay, function(f) func(func) count = count - 1 if count > 0 then add(delay, f) end end) - end - return add(delay, function(f) func(func) add(delay, f) end) -end - -function clear() - functions = {} -end - -function Interpolator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - return t <= length and func((t-dt)/length, ...) or nil - end -end - -function Oscillator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - while t > length do t = t - length end - return func(t/length, ...) - end -end diff --git a/examples/lissajous/LICK/lib/hump/vector.lua b/examples/lissajous/LICK/lib/hump/vector.lua deleted file mode 100644 index b84f948..0000000 --- a/examples/lissajous/LICK/lib/hump/vector.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local assert, type, tonumber = assert, type, tonumber -local sqrt, cos, sin = math.sqrt, math.cos, math.sin -module(...) - -local vector = {} -vector.__index = vector - -function new(x,y) - local v = {x = x or 0, y = y or 0} - setmetatable(v, vector) - return v -end - -function isvector(v) - return getmetatable(v) == vector -end - -function vector:clone() - return new(self.x, self.y) -end - -function vector:unpack() - return self.x, self.y -end - -function vector:__tostring() - return "("..tonumber(self.x)..","..tonumber(self.y)..")" -end - -function vector.__unm(a) - return new(-a.x, -a.y) -end - -function vector.__add(a,b) - assert(isvector(a) and isvector(b), "Add: wrong argument types ( expected)") - return new(a.x+b.x, a.y+b.y) -end - -function vector.__sub(a,b) - assert(isvector(a) and isvector(b), "Sub: wrong argument types ( expected)") - return new(a.x-b.x, a.y-b.y) -end - -function vector.__mul(a,b) - if type(a) == "number" then - return new(a*b.x, a*b.y) - elseif type(b) == "number" then - return new(b*a.x, b*a.y) - else - assert(isvector(a) and isvector(b), "Mul: wrong argument types ( or expected)") - return a.x*b.x + a.y*b.y - end -end - -function vector.__div(a,b) - assert(isvector(a) and type(b) == "number", "wrong argument types (expected / )") - return new(a.x / b, a.y / b) -end - -function vector.__eq(a,b) - return a.x == b.x and a.y == b.y -end - -function vector.__lt(a,b) - return a.x < b.x or (a.x == b.x and a.y < b.y) -end - -function vector.__le(a,b) - return a.x <= b.x and a.y <= b.y -end - -function vector.permul(a,b) - assert(isvector(a) and isvector(b), "permul: wrong argument types ( expected)") - return new(a.x*b.x, a.y*b.y) -end - -function vector:len2() - return self * self -end - -function vector:len() - return sqrt(self*self) -end - -function vector.dist(a, b) - assert(isvector(a) and isvector(b), "dist: wrong argument types ( expected)") - return (b-a):len() -end - -function vector:normalize_inplace() - local l = self:len() - self.x, self.y = self.x / l, self.y / l - return self -end - -function vector:normalized() - return self / self:len() -end - -function vector:rotate_inplace(phi) - local c, s = cos(phi), sin(phi) - self.x, self.y = c * self.x - s * self.y, s * self.x + c * self.y - return self -end - -function vector:rotated(phi) - return self:clone():rotate_inplace(phi) -end - -function vector:perpendicular() - return new(-self.y, self.x) -end - -function vector:projectOn(v) - assert(isvector(v), "invalid argument: cannot project onto anything other than a new.") - return (self * v) * v / v:len2() -end - -function vector:cross(other) - assert(isvector(other), "cross: wrong argument types ( expected)") - return self.x * other.y - self.y * other.x -end - --- vector() as shortcut to vector.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/lissajous/LICK/lib/images/circle.png b/examples/lissajous/LICK/lib/images/circle.png deleted file mode 100755 index 8f9ac298933bf58968999f36cefb08dc3d6db2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 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 QVE_OC07*qoM6N<$f~Wjp+5i9m diff --git a/examples/lissajous/LICK/lib/images/holger.png b/examples/lissajous/LICK/lib/images/holger.png deleted file mode 100755 index 7e78b87226d0b368fe2d05941677a0b9119b2d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9945 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

>$y9lIvA!1##Q};vU!jjQNqnKA-NSS~y2H9t{ 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 Hu0mjfVRhi| diff --git a/examples/lissajous/LICK/lib/images/spiral2.png b/examples/lissajous/LICK/lib/images/spiral2.png deleted file mode 100755 index d7b9627786701053779e76ece6b0687bbe71de9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17174 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 diff --git a/examples/lissajous/LICK/lib/images/star.png b/examples/lissajous/LICK/lib/images/star.png deleted file mode 100755 index 85395e81de310b7b5af0dc3f68dcb48e6718712d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -local socket = require "socket" -local base = _G -local string = require("string") -local vstruct = require "LICK/lib/loveosc/vstruct" -local pack = vstruct.pack -local upack = vstruct.unpack - --------------------------------- --- some constants --------------------------------- - -osc.client = {} -osc.client.host = "localhost" -osc.client.port = 57110 -osc.client.timeout = 0 - -PROTOCOL = "OSC/1.0" - -ADJUSTMENT_FACTOR = 2208988800 - -IMMEDIATE = string.rep('0', 31) .. '1' - - -function osc.client:send( data ) - local ip, port = assert(socket.dns.toip(osc.client.host)), osc.client.port - -- create a new UDP object - local udp = assert(socket.udp()) - udp:settimeout(0) - - --print(encode(data)) - assert(udp:sendto(encode(data), ip, port), "could not send data") - --assert(udp:sendto(data, ip, port), "could not send data") - - -- retrieve the answer and print results, warning: crashes love - --print(udp:receive() or "") -end - - --------------------------------- --- interface functions: --- decode(string) --- and encode(table) --------------------------------- - -function decode(data) - if #data == 0 then - return nil - end - if string.match(data, "^#bundle") then - return decode_bundle(data) - else - return decode_message(data) - end -end - - -function encode(data) - local msg = "" - local idx = 1 - if data == nil then - return nil - end - - if data[1] == "#bundle" then - msg = msg .. encode_string(data[1]) - --print("1 "..msg.."\n") - msg = msg .. encode_timetag(data[2]) - --print("2 "..msg.."\n") - idx = 3 - while idx <= #data do - local submsg = encode(data[idx]) - msg = msg .. encode_int(#submsg) .. submsg - --print(idx.." "..submsg.."\n") - idx = idx + 1 - end - return msg - else - local typestring = "," - local encodings = "" - idx = idx + 1 - msg = msg .. encode_string(data[1]) - for t, d in iter_pairwise(data, idx) do - typestring = typestring .. t - encodings = encodings .. collect_encoding_for_message(t, d) - end - --print("else "..msg..encode_string(typestring) .. encodings.."\n") - - return msg .. encode_string(typestring) .. encodings - end -end - - --------------------------------- --- auxilliary functions --------------------------------- - -digits = {} -for i=0,9 do digits[i] = string.char(string.byte('0')+i) end -for i=10,36 do digits[i] = string.char(string.byte('A')+i-10) end - -function numberstring(number, bas) - local s = "" - repeat - local remainder = base.math.mod(number,bas) - s = digits[remainder]..s - number = (number-remainder)/bas - until number==0 - return s -end - - -function next_string(astring) - -- this is a workaraound because the lua pttern matching is - -- not as powerful as pcre and I did not want to include another - -- dependecy to an external re lib - local pos = 0 - local num_nzero = 0 - local num_zero = 0 - local result = "" - if astring == nil then - -- ensure that string is not empty - base.error("error: string is empty - probably malformated message") - end - -- we match every character with the help of gmatch - for m in string.gmatch(astring, ".") do - pos = pos + 1 - -- and then check if it is correctly padded with '\0's - if m ~= '\0' and num_zero == 0 then - num_nzero = (num_nzero + 1) % 4 - result = result .. m - elseif num_zero ~= 0 and (num_zero + num_nzero) % 4 == 0 then - return result, pos - elseif m == '\0' then - num_zero = num_zero + 1 - result = result .. m - else - return nil - end - end -end - -function iter_pairwise(atable, startvalue) - local index = startvalue - 2 - return function() - index = index + 2 - return atable[index], atable[index+1] - end -end - -function collect_encoding_for_message(t, data) - if t == 'i' then - return encode_int(data) - elseif t == 'f' then - return encode_float(data) - elseif t == 's' then - return encode_string(data) - elseif t == 'b' then - return encode_blob(data) - end -end - -function collect_decoding_from_message(t, data, message) - table.insert(message, t) - if t == 'i' then - table.insert(message, decode_int(data)) - return string.sub(data, 5) - elseif t == 'f' then - table.insert(message, decode_float(data)) - return string.sub(data, 5) - elseif t == 's' then - local match, last = next_string(data) - table.insert(message, match) - return string.sub(data, last) - elseif t == 'b' then - local length = decode_int(data) - table.insert(message, string.sub(data, 4, length)) - return string.sub(data, 4 + length + 1) - end -end - -function get_addr_from_data(data) - local addr_raw_string,last = next_string(data) - local result = "" - if addr_raw_string == nil then - -- if we could not find an addr something went wrong - base.error("error: could not extract address from OSC message") - end - -- delete possible trailing zeros - for t in string.gmatch(addr_raw_string, "[^%z]") do - result = result .. t - end - return result, string.sub(data, last) -end - -function get_types_from_data(data) - local typestring, last = next_string(data) - local result = {} - if typestring == nil then - return {} - end - -- split typestring into an iterable table - for t in string.gmatch(typestring, "[^,%z]") do - table.insert(result, t) - end - return result, string.sub(data, last) -end - --------------------------------- --- decoding functions --------------------------------- - -function decode_message(data) - local types, addr, tmp_data = nil - local message = {} - addr, tmp_data = get_addr_from_data(data) - types, tmp_data = get_types_from_data(tmp_data) - -- ensure that we at least found something - if addr == nil or types == nil then - return nil - end - for _,t in base.ipairs(types) do - tmp_data = collect_decoding_from_message(t, tmp_data, message) - end - return message -end - - -function decode_bundle(data) - local match, last = next_string(data) - local tmp_data = nil - local msg = {} - local sec, frac - -- skip first string data since it will only contian #bundle - tmp_data = string.sub(data, 9) - -- check that there is a part of the message left - if not tmp_data then - return nil - end - table.insert(msg, "#bundle") - _, sec, frac = upack("> u4 > u4", {string.sub(tmp_data, 1, 8)}) - -- note this is an awful way of decoding to a bin string and - -- then decoding the frac again TODO: make this nicer - frac = numberstring(frac, 2) - if sec == 0 and frac == IMMEDIATE then - table.insert(msg, 0) - else - table.insert(msg, sec - ADJUSTMENT_FACTOR + decode_frac(frac) ) - end - tmp_data = string.sub(tmp_data, 9) - while #tmp_data > 0 do - local length = decode_int(string.sub(tmp_data,1,4)) - table.insert(msg, decode(string.sub(tmp_data, 5, 4 + length))) - tmp_data = string.sub(tmp_data, 9 + length) - end - return msg -end - -function decode_frac(bin) - local frac = 0 - for i=#bin,1 do - frac = (frac + string.sub(bin, i-1, i)) / 2 - end - return frac -end - -function decode_float(bin) - local pos, res = upack("> f4", {bin}) - return res -end - -function decode_int(bin) - local pos, res = upack("> i4", {bin} ) - return res -end - --------------------------------- --- encoding --------------------------------- - -function encode_string(astring) - local fillbits = (4 - #astring % 4) - return astring .. string.rep('\0', fillbits) -end - -function encode_int(num) - return pack("> i4",{ num }) -end - -function encode_blob(blob) - return encode_int(#blob) .. encode_string(#blob) -end - -function encode_timetag(tpoint) - if tpoint == 0 then - return IMMEDIATE - else - local sec = math.floor(tpoint) - local frac = tpoint - sec - - return pack("> u4 > u4", {sec + ADJUSTMENT_FACTOR , encode_frac(frac)}) - - end -end - - - -function encode_frac(num) - local bin = "" - local frac = num - while #bin < 32 do - bin = bin .. base.math.floor(frac * 2) - frac = (frac * 2) - base.math.floor(frac * 2) - end - return bin -end - -function encode_float(num) - return pack("> f4", {num}) -end diff --git a/examples/lissajous/LICK/lib/loveosc/init.lua b/examples/lissajous/LICK/lib/loveosc/init.lua deleted file mode 100644 index d7f0bfb..0000000 --- a/examples/lissajous/LICK/lib/loveosc/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -osc = {} -require "LICK/lib/loveosc/client" -require "LICK/lib/loveosc/server" diff --git a/examples/lissajous/LICK/lib/loveosc/server.lua b/examples/lissajous/LICK/lib/loveosc/server.lua deleted file mode 100644 index 3a9a93f..0000000 --- a/examples/lissajous/LICK/lib/loveosc/server.lua +++ /dev/null @@ -1,81 +0,0 @@ ---[[ - -- luaosc Copyright (C) 2009 Jost Tobias Springenberg -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -require "socket" - -osc.server = {} -osc.server.host = "localhost" -osc.server.port = 7771 -osc.server.socket = socket.udp() or error('error could not create lua socket object') -osc.server.socket:setsockname(osc.server.host, osc.server.port) -osc.server.socket:settimeout(0) - --- call this in LÖVE update -function osc.server:update(dt) - - local message, from = osc.server.socket:receive(1024) - -- invoke handler function - if message ~= nil then - local success, result = pcall(decode, message) - if not success then - print("Error in decoding: \n" .. result) - else - success, result = pcall(handle, from, result) - if not success then - print("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - -end - - --- use this to start the server in lua only (not with LÖVE!) -function osc.server:start() - local length = 1024 - while 1 do - local message, from = self.socket:receivefrom(1024) - -- invoke handler function - if message ~= nil then - local success, result = base.pcall(osc.decode, message) - if not success then - base.io.stderr:write("Error in decoding: \n" .. result) - else - success, result = base.pcall(self.handle, from, result) - if not success then - base.io.stderr:write("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - end - end - - - -function osc.server:setHandler(hdle) - handle = hdle -end diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/CHANGES b/examples/lissajous/LICK/lib/loveosc/vstruct/CHANGES deleted file mode 100755 index ea42ce0..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/CHANGES +++ /dev/null @@ -1,30 +0,0 @@ -1.0 ---- -Bugfixes to read error handling -Ability to return unpacked values rather than tables - -1.0 beta 4 ----------- -Added the ability to say 's' with no width to read until EOF. -Modified struct.unpack and struct.pack to return the number of bytes -read/written as a second value. Note that this is not the same as the r/w -pointer delta if seeks are involved. - -1.0 beta 3 ----------- -Lots of bugfixing and general cleanup -Improved error reporting -API name changes - -1.0 beta 2 ----------- -Added the counted string format "c". -Added float and double support, courtesy of Peter "Corsix" Cawley. -Updated the test framework. -Fixed a bug in format m that could result in data loss when manipulating fields -of 7 bytes or more width. - - -1.0 beta 1 ----------- -Released to the world. diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/COPYING b/examples/lissajous/LICK/lib/loveosc/vstruct/COPYING deleted file mode 100755 index 430bce8..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2008 Ben "ToxicFrog" Kelly -FP module copyright 2008 Peter "Corsix" Cawley - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/README b/examples/lissajous/LICK/lib/loveosc/vstruct/README deleted file mode 100755 index e274888..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/README +++ /dev/null @@ -1,290 +0,0 @@ -Contents -======== -1. Overview -2. API -3. Warning! -4. The Format String - Naming - Grouping - Repetition -5. Format Specifiers -6. Credits - - -1. Overview -=========== -VStruct is a library for Lua 5.1. It provides functions for manipulating binary -data, in particular for unpacking binary files or byte buffers into Lua values -and for packing Lua values back into files or buffers. Supported data types -include: - - signed and unsigned integers of arbitrary byte width - - booleans and bitmasks - - plain and null-terminated strings - - fixed and floating point reals (the latter requires C module support) -In addition, the library supports seeking, alignment, and byte order controls, -repetition, grouping of data into tables, and naming of values within tables. - - - -2. API -====== -exports: - vstruct.pack(fmt, [fd], data) - vstruct.unpack(fmt, , [unpacked]) - vstruct.explode(int) - vstruct.implode(table) - vstruct.cursor(string) - vstruct.compile.read(format) - vstruct.compile.write(format) - -pack takes a format string and a table of data and packs the contents into a -buffer. If the fd argument is present, it will write the data directly to it -using standard file io methods (write and seek), and return the fd; otherwise -it will construct and return a string. In either case it also returns (as a -second value) the number of bytes written - note that if the format involved -seeks, this is not the same as the amount by which the write pointer moved -or the size of the packed string. - -unpack takes a format string and a buffer or file to unpack from, and returns -the unpacked data as a table. It also returns (as a second value) the number of -bytes read - note that if the format string involved seeks, this is not the same -as the difference between read pointer positions. If the _unpacked_ argument is -true, it will return the unpacked data as a series of values rather than as a -table, equivalent to using the standard Lua function unpack() on the return -value. Note that this means it will not return the number of bytes read as an -additional value. - -explode converts a bitmask into a list of booleans, and implode does the -converse. In such lists, list[1] is the least significant bit, and list[n] the -most significant. - -cursor wraps a string in something that looks, at first glance, like a file. -This permits strings to be wrapped and passed to the vstruct IO functions. The -wrapped string supports :seek, and has limited support for :read (the only -supported calling mode is :read(num_bytes)) and :write (as :write(buffer)). - -compile.read takes a format string and returns a function, which can later be -passed a file (or file-like object - see vstruct.cursor) to perform a read -operation. In effect, the following code: - f = vstruct.compile.read(fmt) - d = f(fd) -Is equivalent to: - d = vstruct.unpack(fd, fmt) -f can of course be called repeatedly, with different or the same fds each time. - -compile.write is the converse of compile.read. The emitted function expects a -file and a table of data elements, so that: - f = vstruct.compile.write(fmt) - f(fd, data) -Is equivalent to: - vstruct.pack(fd, fmt, data) -As with compile.read, the emitted function is fully re-usable. - - -3. Warning! -=========== -When reading and writing numeric formats, vstruct is inherently limited by lua's -number format, which is by default the IEEE 754 double. What this means in -practice is that formats cipPu may be subject to data loss when read in widths -of 7 bytes or more, if they contain more than 52 significant bits. (The same is -true of numeric constants declared in Lua itself, of course, and other libraries -which store values in lua numbers). -Formats bfmsxz are unaffected by this, as they either do not use lua numbers or -are guaranteed to fit inside them. - -4. The Format String -==================== -The format string contains any number of endianness controls, seek controls, -format specifiers, and grouping/naming sequences, seperated by whitespace, -commas, or semicolons (or any mix thereof, although you are encouraged to choose -one and stick to it for the sake of consistency). Each of these is detailed -below. - -In the documentation below, the convention is that A represents an address and W -a width in bytes. At present only base-10 numerals are supported. - - -Naming ------- -Under normal operation, when unpacking, the library simply stores unpacked -values sequentially into a list, which is returned. Similarly, when packing, it -expects a list of values which will be packed in order. However, values can be -named, in which case the unpacked value will be stored in a field with that -name, and when packing, it will use the value stored with that key. This is done -by prefixing the format specifier with the name (which can be any sequence of -letters, numbers, and _, provided it does not start with a number) followed by a -':'. For example, the following format would generate a table with three keys, -'x', 'y', and 'z': - "x:u4 y:u4 z:u4" -And, when packing, would expect a table with those three keys and store their -corresponding values. - -If the same name is specified multiple times, or is combined with repetition -(see below), only the last read value is stored there. - -Named and anonymous values can be freely mixed; the named values will be -assigned to their given fields and the anonymous ones to sequential indices. - -Grouping --------- -Rather than generating or expecting a flat table, the library can be instructed to -create or read from a table containing subtables. This is done by surrounding the -group of values you wish to be packed with '{' and '}' in the format string. For example, -the following format string: - "{ u4 i4 } { s32 u4 }" -Would, rather than generating a list of four values, generate a list containing two -lists of two values each. -Similarly, when packing, it would expect not a flat list, but a list of sublists, from -which the values to be packed will be drawn. - -Groups can be named, so formats like: - "flags:m1 coords:{ x:u4 y:u4 z:u4 }" -Are permitted and meaningful. - - -Repetition ----------- -A {} group can be repeated by prefixing or suffixing it with a count, seperated -from the group by a '*'. For example: - "4 * { u4 }" - "{ u4 } * 4" - "{ u4 } { u4 } { u4 } { u4 }" -Are all equivalent. Note that the whitespace in the above examples is optional. -In cases where you want to repeat format specifiers without implying a grouping, -you can use (). For example: - "4 * (u4 b1)" -Is equivalent to: - "u4 b1 u4 b1 u4 b1 u4" -Like grouping, these can be nested. - - -5. Format Specifiers -==================== - -Endianness Controls -------------------- -The formats i, m, and u are affected by the endianness setting, which controls -the order in which bytes are read and written within a field. The following -characters in a format string adjust the endianness setting: - -< - Sets the endianness to little-endian (eg, Intel processors) -> - Sets the endianness to big-endian (eg, PPC and Motorola processors) -= - Sets the endianness to the native endianness. - - -Seek Controls -------------- -These characters are used to seek to specific locations in the input or output. -Note that they only work on buffers or file-like objects that support the seek() -method; for streams which cannot be sought on, use the 'x' (skip/null-pad) -data format instead. - -@A - Seek to absolute address A. -+A - Seek forward A bytes. --A - Seek backwards A bytes. -aW - Align to word width W (ie, seek to the next address which is a multiple of W) - - -Data Format Specifiers ----------------------- -bW Boolean. - Read: as uW, but returns true if the result is non-zero and false otherwise. - Write: as uW with input 1 if true and 0 otherwise. - -cW Counted string. - Read: uW to determine the length of the string W', followed by sW'. - Write: the length of the string as uW, followed by the string itself. - The counted string is a common idiom where a string is immediately prefixed - with its length, as in: - size_t len; - char[] str; - The counted string format can be used to easily read and write these. The - width provided is the width of the len field, which is treated as an - unsigned int. Only the string itself is returned (when unpacking) or - required (when packing). - The len field is affected by endianness, as in format u. - -fW IEEE 754 floating point. - Valid widths are 4 (float) and 8 (double). No quads yet, sorry! - Affected by endianness. - -iW Signed integer. - Read: a signed integer of width W bytes. - Write: a signed integer of width W bytes. - Floating point values will be truncated. - Affected by endianness. - -mW Bitmask. - Read: as uW, but explodes the result into a list of booleans, one per bit. - Write: implodes the input value, then writes it as uW. - Affected by endianness. - See also: vstruct.implode, vstruct.explode. - -pW Signed fixed point rational. - Width is in the format "I.F"; the value before the dot is the number of - bytes in the integer part, and the value after, in the fractional part. - Read: a fixed point rational of I+F bytes. - Write: a fixed point rational of I+F bytes. Values which cannot be exactly - represented in the specified width are truncated. - Affected by endianness. - -PW Signed fixed point rational with bit-aligned subfields - Equivalent to pW, except that the decimal point does not need to be byte - aligned; for example, formats such as P20.12 are possible. - Note that underlying reads must still occur in byte multiples. Using a W - such that I+F is not a multiple of 8 is an error. - -sW String. - Read: reads exactly W bytes and returns them as a string. If W is omitted, - reads until EOF. - Write: - If W is omitted, uses the string length. - If W is shorter than the string length, truncates the string. - If W is greater than the string length, null pads the string. - -uW Unsigned integer. - Read: an unsigned integer of width W bytes. - Write: an unsigned integer of width W bytes. - Floating point values will be truncated. - Negative values will be taken absolute. - Affected by endianness. - -xW Skip/pad. - Read: read and discard the next W bytes. - Write: write W zero bytes. - -zW Null terminated string. - Read: reads exactly W bytes. Returns everything up to the first zero byte. - If W is omitted, reads up to the next zero byte. - Write: writes exactly W bytes. - If the input is shorter than W, zero pads the output. - If as long or longer, truncates to W-1 and writes a zero byte at the end. - If W is omitted, uses the string length plus one (ie, writes the string - out entire and then null terminates it). - - - -6. Credits -========== - While most of the library code was written by me (Ben Kelly), the existence -of this library owes itself to many others: - The floating point code was contributed by Peter Cawley on lua-l. - The original inspiration came from Roberto Ierusalimschy's "struct" library -and Luiz Henrique de Figueiredo's "lpack" library, as well as the "struct" -available in Python. - sanooj, from #lua, has done so much testing and bug reporting that at this -point he's practically a co-author. - The overall library design and interface are the result of much discussion -with rici, sanooj, Keffo, snogglethorpe, Spark, kozure, Vornicus, McMartin, and -probably several others I've forgotten about on IRC (#lua on freenode and #code -on nightstar). - Finally, without Looking Glass Studios to make System Shock, and Team TSSHP -(in particular Jim "hairyjim" Cameron) to reverse engineer it, I wouldn't have -had a reason to write this library in the first place. diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/common.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/common.lua deleted file mode 100755 index 841b5c1..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/common.lua +++ /dev/null @@ -1,48 +0,0 @@ --- shared formats - seeking, endianness --- these should all return nil so that they do not mutate the data list --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local common = {} - --- determine if the host system is big-endian or not, by dumping an empty --- function and looking at the endianness flag --- this is kind of hackish -local function bigendian() - return string.byte(string.dump(function() end)) == string.char(0x00) -end -common.is_bigendian = bigendian() - --- seek controls -function common.seekto(fd, w) - fd:seek("set", w) -end - -function common.seekforward(fd, w) - fd:seek("cur", w) -end - -function common.seekback(fd, w) - fd:seek("cur", -w) -end - -function common.a(fd,w) - local a = fd:seek() - if a % w ~= 0 then - fd:seek("cur", w - (a % w)) - end -end - --- endianness controls -function common.littleendian(fd, w) - common.is_bigendian = false -end - -function common.bigendian(fd, w) - common.is_bigendian = true -end - -function common.hostendian(fd, w) - common.is_bigendian = bigendian() -end - -return common diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/compile.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/compile.lua deleted file mode 100755 index 942f743..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/compile.lua +++ /dev/null @@ -1,134 +0,0 @@ --- functions for turning a format string into a callable function --- they work by calling parse(), passing it the format string and --- a table of code generators appropriate for whether we are reading --- or writing. --- The resulting code is then prefixed with some setup code and postfixed --- with a return value and loadstring() is called on it to generate a function --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local require,loadstring,setfenv,type,select,unpack,setmetatable - = require,loadstring,setfenv,type,select,unpack,setmetatable - -local print,assert,error,xpcall,pairs,where - = print,assert,error,xpcall,pairs,debug.traceback - -module((...)) - -local parse = require(_PACKAGE.."parser") - -local function nulsafe_error(s) - return error(s:gsub('%z', '_')) -end - -local function xpcall2(f, err, ...) - local args = {n=select('#', ...), ...} - return xpcall(function() return f(unpack(args, 1, args.n)) end, err) -end - -local function err_generate(message, format, trace) - nulsafe_error([[ -struct: internal error in code generator -This is an internal error in the struct library -Please report it as a bug and include the following information: --- error message -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function err_compile(message, format, source) - nulsafe_error([[ -struct: syntax error in emitted lua source -This is an internal error in the struct library -Please report it as a bug and include the following information: --- loadstring error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]) -end - -local function err_execute(message, format, source, trace) - nulsafe_error([[ -struct: runtime error in generated function -This is at some level an internal error in the struct library -It could be a genuine error in the emitted code (in which case this is a code -generation bug) -Alternately, it could be that you gave it a malformed format string, a bad -file descriptor, or data that does not match the given format (in which case -it is an argument validation bug and you should be getting an error anyways). -Please report this as a bug and include the following information: --- execution error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function compile(format, gen, env) - local status,source = xpcall(function() - return parse(format, gen, true) - end, - function(message) - return { message, where("",2) } - end) - - if not status then - if type(source[1]) == "function" then - error(source[1]()..source[2]) - end - err_generate(source[1], format, source[2]) - end - - local fn,err = loadstring(source) - - if not fn then - err_compile(err, format, source) - end - - setfenv(fn, env) - - local fn = function(...) - local status,ret,len = xpcall2(fn, function(message) - return { message, where("",2) } - end, ...) - - -- call succeeded without errors - if status then return ret,len end - - local message,where = ret[1],ret[2] - - -- call generated a deliberate error; call the provided closure - -- it will either emit an error code or re-throw - if type(message) == "function" then return nil,message() end - - -- call generated an internal error; re-throw with extra debug info - err_execute(message, format, source, where) - end - - return fn -end - -local gen_unpack = require(_PACKAGE.."gen_unpack") -local io_unpack = require(_PACKAGE.."io_unpack") - -function _M.unpack(format) - return compile(format, gen_unpack, io_unpack) -end - -local gen_pack = require(_PACKAGE.."gen_pack") -local io_pack = require(_PACKAGE.."io_pack") - -function _M.pack(format) - return compile(format, gen_pack, io_pack) -end - -return _M diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/cursor.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/cursor.lua deleted file mode 100755 index cd913af..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/cursor.lua +++ /dev/null @@ -1,80 +0,0 @@ --- cursor - a wrapper for strings that makes them look like files --- exports: seek read write --- read only supports numeric amounts --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local cursor = {} - --- like fseek --- seeking past the end of the string is permitted --- reads will return EOF, writes will fill in the intermediate space with nuls --- seeking past the start of the string is a soft error -function cursor:seek(whence, offset) - whence = whence or "cur" - offset = offset or 0 - - if whence == "set" then - self.pos = offset - elseif whence == "cur" then - self.pos = self.pos + offset - elseif whence == "end" then - self.pos = #self.str + offset - else - error "bad argument #1 to seek" - end - - if self.pos < 0 then - self.pos = 0 - return nil,"attempt to seek prior to start of file" - end - - return self.pos -end - --- read n bytes from the current position --- reads longer than the string can satisfy return as much as it can --- reads while the position is at the end return nil,"eof" -function cursor:read(n) - if self.pos >= #self.str then - return nil,"eof" - end - - if n == "*a" then - n = #self.str - end - - local buf = self.str:sub(self.pos+1, self.pos + n) - self.pos = math.min(self.pos + n, #self.str) - - return buf -end - --- write the contents of the buffer at the current position, overwriting --- any data already present --- if the write pointer is past the end of the string, also fill in the --- intermediate space with nuls -function cursor:write(buf) - if self.pos > #self.str then - self.str = self.str .. string.char(0):rep(self.pos - #self.str) - end - - self.str = self.str:sub(1, self.pos) - .. buf - .. self.str:sub(self.pos + #buf + 1, -1) - self.pos = self.pos + #buf - - return self -end - -function cursor:__call(source) - assert(type(source) == "string", "invalid first argument to cursor()") - return setmetatable( - { str = source, pos = 0 }, - cursor) -end - -cursor.__index = cursor - -setmetatable(cursor, cursor) - -return cursor diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/fp.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/fp.lua deleted file mode 100755 index 5da81da..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/fp.lua +++ /dev/null @@ -1,121 +0,0 @@ --- floating point module --- Copyright © 2008 Peter "Corsix" Cawley and Ben "ToxicFrog" Kelly; see COPYING - -local fp = {} -local name = (...):gsub('%.[^%.]+$', '') -local struct = require (name) -local common = require (name..".common") - -local function reader(data, size_exp, size_fraction) - local fraction, exponent, sign - local endian = common.is_bigendian and ">" or "<" - - -- Split the unsigned integer into the 3 IEEE fields - local bits = struct.unpack(endian.."m"..#data, data, true) - local fraction = struct.implode({unpack(bits, 1, size_fraction)}, size_fraction) - local exponent = struct.implode({unpack(bits, size_fraction+1, size_fraction+size_exp)}, size_exp) - local sign = bits[#bits] and -1 or 1 - - -- special case: exponent is all 1s - if exponent == 2^size_exp-1 then - -- significand is 0? +- infinity - if fraction == 0 then - return sign * math.huge - - -- otherwise it's NaN - else - return 0/0 - end - end - - -- restore the MSB of the significand, unless it's a subnormal number - if exponent ~= 0 then - fraction = fraction + (2 ^ size_fraction) - else - exponent = 1 - end - - -- remove the exponent bias - exponent = exponent - 2 ^ (size_exp - 1) + 1 - - -- Decrease the size of the exponent rather than make the fraction (0.5, 1] - exponent = exponent - size_fraction - - return sign * math.ldexp(fraction, exponent) -end - -local function writer(value, size_exp, size_fraction) - local fraction, exponent, sign - local width = (size_exp + size_fraction + 1)/8 - local endian = common.is_bigendian and ">" or "<" - local bias = 2^(size_exp-1)-1 - - if value < 0 - or 1/value == -math.huge then -- handle the case of -0 - sign = true - value = -value - else - sign = false - end - - -- special case: value is infinite - if value == math.huge then - exponent = bias+1 - fraction = 0 - - -- special case: value is NaN - elseif value ~= value then - exponent = bias+1 - fraction = 2^(size_fraction-1) - - --special case: value is 0 - elseif value == 0 then - exponent = -bias - fraction = 0 - - else - fraction,exponent = math.frexp(value) - - -- subnormal number - if exponent+bias <= 1 then - fraction = fraction * 2^(size_fraction+(exponent+bias)-1) - exponent = -bias - - else - -- remove the most significant bit from the fraction and adjust exponent - fraction = fraction - 0.5 - exponent = exponent - 1 - - -- turn the fraction into an integer - fraction = fraction * 2^(size_fraction+1) - end - end - - - -- add the exponent bias - exponent = exponent + bias - - local bits = struct.explode(fraction) - local bits_exp = struct.explode(exponent) - for i=1,size_exp do - bits[size_fraction+i] = bits_exp[i] - end - bits[size_fraction+size_exp+1] = sign - - return struct.pack(endian.."m"..width, {bits}) -end - --- Create readers and writers for the IEEE sizes -fp.sizes = { - [4] = {1, 8, 23}, - [8] = {1, 11, 52}, -} - -fp.r = {} -fp.w = {} -for width, sizes in pairs(fp.sizes) do - fp.r[width] = function(uint) return reader(uint, sizes[2], sizes[3]) end - fp.w[width] = function(valu) return writer(valu, sizes[2], sizes[3]) end -end - -return fp diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/gen_pack.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/gen_pack.lua deleted file mode 100755 index 9449c85..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/gen_pack.lua +++ /dev/null @@ -1,132 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd,data = ... -local stack = {} -local index = 1 -local start = fd:seek() -local len = 0 - -local function push(key) - if not key then - key = index - index = index + 1 - end - - stack[#stack+1] = { index, data } - data = data[key] - index = 1 -end - -local function pop(key) - local saved = stack[#stack] - stack[#stack] = nil - - index = saved[1] - data = saved[2] -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return fd,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- <>(fd, data[index], <>) --- ++index -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data[index], "..args..")\nindex = index+1" -end - --- table: --- push() --- <

> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - --- named atom: --- <>(fd, data.<>, <>) -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data."..token[1]..", "..args..")" -end - --- named table: --- push(<>) --- <
> --- pop() -function gen.name_table(token) - return "push('"..token[1].."')\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop()" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/gen_unpack.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/gen_unpack.lua deleted file mode 100755 index 369cfc9..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/gen_unpack.lua +++ /dev/null @@ -1,117 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd = (...) -local stack = {} -local pack = {} -local start = fd:seek() -local len = 0 - -local function push() - stack[#stack+1],pack = pack,{} -end - -local function pop(key) - local target = stack[#stack] - key = key or #target+1 - target[key],pack = pack,target - stack[#stack] = nil -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return pack,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- pack[#pack+1] = <>(fd, <>) -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack[#pack+1] = "..fn.."(fd, "..args..")" -end - --- table: --- push() --- <
> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack."..token[1].." = "..fn.."(fd, "..args..")" -end - -function gen.name_table(token) - return "push()\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop('"..token[1].."')\n" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/init.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/init.lua deleted file mode 100755 index 8910968..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/init.lua +++ /dev/null @@ -1,94 +0,0 @@ --- vstruct, the versatile struct library --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local table,math,type,require,assert,_unpack = table,math,type,require,assert,unpack - -local print = print - -module((...)) - -cursor = require (_NAME..".cursor") -compile = require (_NAME..".compile") - -function math.trunc(n) - if n < 0 then - return math.ceil(n) - else - return math.floor(n) - end -end - --- turn an int into a list of booleans --- the length of the list will be the smallest number of bits needed to --- represent the int -function explode(int, size) - assert(int, "struct.explode: missing argument") - size = size or 0 - - local mask = {} - while int ~= 0 or #mask < size do - table.insert(mask, int % 2 ~= 0) - int = math.trunc(int/2) - end - return mask -end - --- turn a list of booleans into an int --- the converse of explode -function implode(mask, size) - size = size or #mask - - local int = 0 - for i=size,1,-1 do - int = int*2 + ((mask[i] and 1) or 0) - end - return int -end - --- given a source, which is either a string or a file handle, --- unpack it into individual data based on the format string -function unpack(fmt, source, untable) - -- wrap it in a cursor so we can treat it like a file - if type(source) == 'string' then - source = cursor(source) - end - - assert(fmt and source and type(fmt) == "string", "struct: invalid arguments to unpack") - - -- the lexer will take our format string and generate code from it - -- it returns a function that when called with our source, will - -- unpack the data according to the format string and return all - -- values from said unpacking in a list - if untable then - --local t = compile.unpack(fmt)(source) - --print(t) - -- print(_unpack(t)) - return _unpack((compile.unpack(fmt)(source))) - else - return compile.unpack(fmt)(source) - end -end - --- given a format string and a list of data, pack them --- if 'fd' is omitted, pack them into and return a string --- otherwise, write them directly to the given file -function pack(fmt, fd, data) - local str_fd - - if not data then - data = fd - fd = "" - end - - if type(fd) == 'string' then - fd = cursor("") - str_fd = true - end - - assert(fmt and fd and data and type(fmt) == "string", "struct: invalid arguments to pack") - - local fd,len = compile.pack(fmt)(fd, data) - return (str_fd and fd.str) or fd,len -end - -return struct diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/io_pack.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/io_pack.lua deleted file mode 100755 index a785f7e..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/io_pack.lua +++ /dev/null @@ -1,127 +0,0 @@ --- write formats --- return true if they have consumed a value from the input stream --- return false/nil otherwise (ie, the next value will be preserved --- for subsequent calls, eg skip/pad) --- Copyright © 2008 Ben "ToxicFrog" Kelly; see COPYING -local require,error,setmetatable,string,print,math,unpack,io - = require,error,setmetatable,string,print,math,unpack,io - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local pack = setmetatable({}, { __index = common }) - --- boolean -function pack.b(fd, d, w) - return pack.u(fd, (d and 1) or 0, w) -end - --- counted string --- a string immediately prefaced with its length as a uint -function pack.c(fd, d, w) - pack.u(fd, #d, w) - return pack.s(fd, d) -end - --- floating point -function pack.f(fd, d, w) - if not fp.w[w] then - error("struct.pack: illegal floating point width") - end --- local f = fp.w[w](d) --- print(f, type(f)) - return pack.s(fd, fp.w[w](d), w) -end - --- signed int -function pack.i(fd, d, w) - if d < 0 then - d = 2^(w*8) + d - end - return pack.u(fd, d, w) -end - --- bitmask --- we use a string here because using an unsigned will lose data on bitmasks --- wider than lua's native number format -function pack.m(fd, d, w) - local buf = "" - - for i=1,w*8,8 do - local bits = { unpack(d, i, i+7) } - local byte = string.char(struct.implode(bits, 8)) - if pack.is_bigendian then - buf = byte..buf - else - buf = buf..byte - end - end - return pack.s(fd, buf, w) -end - --- fixed point bit aligned -function pack.P(fd, d, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return pack.i(fd, d * 2^fp, (dp+fp)/8) -end - --- fixed point byte aligned -function pack.p(fd, d, dp, fp) - return pack.P(fd, d, dp*8, fp*8) -end - --- fixed length string --- length 0 is write string as is --- length >0 is write exactly w bytes, truncating or padding as needed -function pack.s(fd, d, w) - w = w or #d - if w == 0 then return end - - if #d < w then - d = d..string.char(0):rep(w-#d) - end - - return fd:write(d:sub(1,w)) -end - --- unsigned int -function pack.u(fd, d, w) - local s = "" - - for i=1,w do - if pack.is_bigendian then - s = string.char(d % 2^8) .. s - else - s = s .. string.char(d % 2^8) - end - d = math.trunc(d/2^8) - end - - return pack.s(fd, s, w) -end - --- skip/pad --- this is technically a control format, so it has a different signature --- specifically, there is no "data" argument -function pack.x(fd, w) - return pack.s(fd, "", w) -end - --- null terminated string --- w==nil is write string as is + termination --- w>0 is write exactly w bytes, truncating/padding and terminating -function pack.z(fd, d, w) - w = w or #d+1 - if #d >= w then - d = d:sub(1, w-1) - end - - return pack.s(fd, d.."\0", w) -end - -return pack diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/io_unpack.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/io_unpack.lua deleted file mode 100755 index 916c321..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/io_unpack.lua +++ /dev/null @@ -1,165 +0,0 @@ --- read formats --- return a value if applicable, which will be packed --- otherwise return nil --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - --- load operations common to both unpack and pack, and set __index so that --- requests for, say, unpack.seekto will succeed -local require,error,setmetatable,string,print - = require,error,setmetatable,string,print - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local unpack = setmetatable({}, { __index = common }) - --- boolean --- true if any bit is 1, false otherwise -function unpack.b(fd, w) - return unpack.u(fd, w) ~= 0 -end - --- counted string --- a string immediately prefaced with its length as a uint -function unpack.c(fd, w) - w = unpack.u(fd, w) - - return unpack.s(fd, w) -end - --- float --- this is callout to the floating-point read/write module, if installed -function unpack.f(fd, w) - if not fp.r[w] then - error("struct.unpack: illegal floating point width") - end - - return fp.r[w](unpack.s(fd,w)) -end - --- utility functions for the i, m and u formats -local function directions(w) - if unpack.is_bigendian then - return 1,w,1 - else - return w,1,-1 - end -end - -local function pve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - for c=sof,eof,dir do - i = i * 2^8 + buf:byte(c) - end - - return i -end - -local function nve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - if buf:byte(sof) < 128 then - return pve_unpack(buf, w) - end - - for c=sof,eof,dir do - i = i * 2^8 - (255 - buf:byte(c)) - end - - return i-1 -end - --- signed int of w bytes -function unpack.i(fd, w) - local buf = unpack.s(fd, w) - - return nve_unpack(buf, w) -end - --- bitmask of w bytes --- we need to read and unpack it as a string, not an unsigned, because otherwise --- we're limited to 52 bits -function unpack.m(fd, w) - local buf = unpack.s(fd, w) - local mask = {} - - local sof,eof,dir = directions(w) - - -- reverse it here because directions() returns numbers for MSB first, - -- and we want LSB first - for i=eof,sof,-dir do - local byte = buf:byte(i) - local bits = struct.explode(byte) - for j=1,8 do - mask[#mask+1] = bits[j] or false - end - end - return mask -end - --- fixed point bit aligned --- w is in the form d.f, where d is the number of bits in the integer part --- and f the number of bits in the fractional part -function unpack.P(fd, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return unpack.i(fd, (dp+fp)/8)/(2^fp) -end - --- fixed point byte aligned -function unpack.p(fd, dp, fp) - return unpack.P(fd, dp*8, fp*8) -end - --- string --- reads exactly w bytes of data and returns them verbatim -function unpack.s(fd, w) - if w == 0 then return "" end - - local buf,err = fd:read(w or "*a") - if not buf then - error(function() return "read error: "..(err or "(unknown error)") end) - elseif #buf < w then - error(function() return "short read: wanted "..w.." bytes, got "..#buf end) - end - return buf -end - --- unsigned int -function unpack.u(fd, w) - local buf,err = unpack.s(fd, w) - - return pve_unpack(buf, w) -end - --- skip/pad --- reads w bytes and discards them -function unpack.x(fd, w) - fd:read(w) - return true -end - --- null-terminated string --- if w is omitted, reads up to and including the first nul, and returns everything --- except that nul --- otherwise, reads exactly w bytes and returns everything up to the first nul -function unpack.z(fd, w) - if w then - return unpack.s(fd, w):match('^%Z*') - end - - local buf = "" - local c = unpack.s(fd, 1) - while #c > 0 and c ~= string.char(0) do - buf = buf..c - c = unpack.s(fd, 1) - end - return buf -end - -return unpack diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/lexer.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/lexer.lua deleted file mode 100755 index 9eb503e..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/lexer.lua +++ /dev/null @@ -1,54 +0,0 @@ -local lexis = {} - -local function lexeme(name) - return function(pattern) - lexis[#lexis+1] = { name=name, pattern="^"..pattern } - end -end - -lexeme (false) "%s+" -- whitespace -lexeme "table" "(%b{})" -lexeme "group" "(%b())" -lexeme "name_atom" "([%a_][%w_]*)%:(%a)([%d.]*)" -lexeme "name_table" "([%a_][%w_]*)%:(%b{})" -lexeme "prerepeat" "(%d+)%s*%*" -lexeme "postrepeat" "%*%s*(%d+)" -lexeme "control" "([-+@<>=ax])([%d.]*)" -lexeme "atom" "(%a)([%d.]*)" - -return function(source) - local orig = source - local index = 1 - - local function iter() - if #source == 0 then return nil end - - for _,lexeme in ipairs(lexis) do - if source:match(lexeme.pattern) then - local result = { source:find(lexeme.pattern) } - local eof = table.remove(result, 2) - table.remove(result, 1) - - source = source:sub(eof+1, -1) - index = index+eof - - if lexeme.name then - result.type = lexeme.name - coroutine.yield(result) - end - return iter() - end - end - error (function() return "Error lexing format string [[" - ..(orig) - .."]] at char " - ..index - .." (" - ..(source:sub(1,1)) - ..")" - end) - end - - return coroutine.wrap(iter) -end - diff --git a/examples/lissajous/LICK/lib/loveosc/vstruct/parser.lua b/examples/lissajous/LICK/lib/loveosc/vstruct/parser.lua deleted file mode 100755 index 122f68e..0000000 --- a/examples/lissajous/LICK/lib/loveosc/vstruct/parser.lua +++ /dev/null @@ -1,35 +0,0 @@ --- parser for format strings --- you give it a format string, a table of code generators, --- and a flag indicating whether to apply the preamble/postable --- it gives you lua source - -local require,concat = require,table.concat - -local print = print - -module((...)) - -local lex = require(_PACKAGE.."lexer") - -return function(source, codegen, prepost) - local asl = {} - local get = lex(source) - - for token in get do - -- seperate statements because codegen may change #asl - local code = codegen[token.type](token, get, asl) - asl[#asl+1] = code - end - - local source = concat(asl, "\n") - - if prepost then - source = codegen.preamble - .. source - .. codegen.postamble - end - - return source -end - - diff --git a/examples/lissajous/LICK/lib/object.lua b/examples/lissajous/LICK/lib/object.lua deleted file mode 100644 index c8d5350..0000000 --- a/examples/lissajous/LICK/lib/object.lua +++ /dev/null @@ -1,282 +0,0 @@ --- OBJECT.lua --- object oriented livecoding library -_internal_object_table = {} - --- hump for classing -local Class = require "LICK/lib/hump/.class" -local hlpr = require "LICK/lib/hlpr" -require "LICK/lib/loveosc" - - ---[[ - OBJECT ---]] --- @Object: base class -Object = Class(function(self) - -- TODO: Object base code - table.insert(_internal_object_table, self) -end) - -function Object:update(dt) - -- TODO: insert typical update - -- print("updated") -end - ---[[ - SCOBJECT ---]] - --- @SCObject: bass class for supercollider communication -SCObject = Class(function(self) - Object.construct(self) -end) -SCObject:inherit(Object) - - ---[[ - SCSYNTH ---]] --- @SCSynth: supercollider synthesizer class -SCSynth = Class(function(self, nodename, freq) - SCObject.construct(self) - self.nodename = nodename or "default" - self.freq = freq or 440 - self.nodeid = 1000 + math.random(1000) -end) -SCSynth:inherit(SCObject) - --- #set a control, TODO: variable lenght of argument-pairs -function SCSynth:set(control, val) - local var = { - "#bundle", - os.time(), - { - "/n_set", - "i", - self.nodeid, - "s", - control, - "f", - val - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#sends an OSC message to the supercollider to start the synth -function SCSynth:play() - local var = { - "#bundle", - os.time(), - { - "/s_new", - "s", - self.nodename, - "i", - self.nodeid, - "i", - 0, - "i", - 0, - "s", - "freq", - "f", - self.freq - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#frees the node on the supercollider server -function SCSynth:free() - local var = { - "#bundle", - os.time()+0.8, - { - "/n_free", - "i", - self.nodeid, - "i", - 0 - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---[[ - DRAWABLE ---]] --- @Drawable: base class for all drawable stuff -Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - - self.position = Vector(x,y) - self.pos = self.position - self.x = self.position.x - self.y = self.position.y -end) -Drawable:inherit(Object) - --- #can be called via wrapX(max) or wrapX(min,max) -function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end -end - --- #can be called via wrapY(max) or wrapY(min,max) -function Drawable:wrapY(min, max) - if min and max then - self:wrap("y", min, max) - elseif min and not max then - self:wrap("y", 0, min) - end -end - --- #internal wrapper -function Drawable:wrap(str, min, max) - if str == "x" then - self.position.x = hlpr.wrap(self.position.x, min, max) - elseif str == "y" then - self.position.y = hlpr.wrap(self.position.y, min, max) - end -end - --- #supercollider style 'set' -function Drawable:set(str, val) - - if str == "x" then - self.position.x = val or self.position.x - elseif str == "y" then - self.position.y = val or self.position.y - end - -- TODO: add lots and lots and lots -end - --- #not yet implemented -function Drawable:draw() - -- TODO: abstract draw code... -end - - - - ---[[ - CIRCLE ---]] --- @Circle: drawable circle -Circle = Class(function(self, x, y, r, s, color) - self.r = r or 10 - self.s = s or 16 - -- call constructor of Drawable - Drawable.construct(self,x,y,color) -end) -Circle:inherit(Drawable) - --- #draw the circle -function Circle:draw(style) - if style ~= "fill" and style ~= "line" then - style = "line" - end - love.graphics.setColor(unpack(self.color)) - love.graphics.circle(style, self.position.x, self.position.y, self.r, self.s) -end - - - ----------------------------------------- --- Experimental Objects ----------------------------------------- - - ---[[ - LINE ---]] --- @Line: draw a line -Line = Class(function(self, x, y, tx, ty, color) -- wats the dealio for polylines? - self.x = x or 0 - self.y = y or 0 - self.tx = tx or 0 - self.ty = ty or 0 - -- call constructor of Drawable - Drawable.construct(self, x, y, color) - - end) -Line:inherit(Drawable) --- TODO: FIX the :set("key", value) ... dunno how it works..! - --- #draw the line -function Line:draw(width, style) - local width=width or 1 - if style ~= "smooth" and style ~= "rough" then - style = "smooth" - end - love.graphics.setLine(width, style) - love.graphics.setColor(unpack(self.color)) - love.graphics.line(self.position.x, self.position.y, self.tx, self.ty) -end - - ---[[ - IMAGE ---]] --- @Image: Image from file -Image = Class(function(self, file, x, y, color, size, orientation) - self.image = love.graphics.newImage(file) - -- put positions, size, orientation... - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Image:inherit(Drawable) - --- #draw the image -function Image:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.draw(self.image, self.position.x, self.position.y) -end - ---[[ - POINT ---]] --- @Point -Point = Class(function(self, x, y, color, size, style) - local color=color or "" - local size=size or 1 - local style=style or "smooth" - - -- should this be here? or in the constructor? - self.size = size - self.style = style - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Point:inherit(Drawable) - --- #draw the point -function Point:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.setPoint(self.size, self.style) - love.graphics.point(self.position.x, self.position.y) -end - - --- EXAMPLE: --- (put in love.load): --- coco = Circle(300,300) --- (put in love.update): --- coco:set("x", 30) --- (put in love.draw): --- coco:draw("fill") - diff --git a/examples/lissajous/LICK/lick.lua b/examples/lissajous/LICK/lick.lua deleted file mode 100644 index 05cede2..0000000 --- a/examples/lissajous/LICK/lick.lua +++ /dev/null @@ -1,127 +0,0 @@ --- lick.lua --- --- simple LIVECODING environment with löve, overwrites love.run, suppressing errors to the terminal/console - - - -lick = {} -lick.file = "main.lua" -lick.debug = false -lick.reset = false -lick.clearFlag = false - -function handle(err) - return "ERROR: " .. err -end - -function lick.setFile(str) - live.file = str or "lick.lua" -end - --- Initialization -function lick.load() - last_modified = 0 -end - --- load the lickcoding file and execute the contained update function -function lick.update(dt) - if love.filesystem.exists(lick.file) and last_modified < love.filesystem.getLastModified(lick.file) then - last_modified = love.filesystem.getLastModified(lick.file) - success, chunk = pcall(love.filesystem.load, lick.file) - if not success then - print(tostring(chunk)) - lick.debugoutput = chunk .. "\n" - - end - ok,err = xpcall(chunk, handle) - if not ok then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if ok then - print("CHUNK LOADED\n") - lick.debugoutput = nil - end - if lick.reset then - loadok, err = xpcall(love.load, handle) - if not loadok and not loadok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - loadok_old = not loadok - end - - - end - end - updateok, err = pcall(love.update,dt) - if not updateok and not updateok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - - updateok_old = not updateok -end - -function lick.draw() - drawok, err = xpcall(love.draw, handle) - if not drawok and not drawok_old then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if lick.debug and lick.debugoutput then - love.graphics.setColor(255,255,255,120) - love.graphics.print(lick.debugoutput, 0, 0) - end - drawok_old = not drawok -end - -function love.run() - - if love.load then love.load(arg) end - lick.load() - local dt = 0 - - -- Main loop time. - while true do - if love.timer then - love.timer.step() - dt = love.timer.getDelta() - end - -- if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled - lick.update(dt) - if love.graphics then - if not lick.clearFlag then love.graphics.clear() end - -- if love.draw then love.draw() end - lick.draw() - end - - -- Process events. - if love.event then - for e,a,b,c in love.event.poll() do - if e == "q" then - if not love.quit or not love.quit() then - if love.audio then - love.audio.stop() - end - return - end - end - love.handlers[e](a,b,c) - end - end - - if love.timer then love.timer.sleep(1) end - if love.graphics then love.graphics.present() end - - end - -end - diff --git a/examples/lissajous/conf.lua b/examples/lissajous/conf.lua deleted file mode 100644 index 7a7b397..0000000 --- a/examples/lissajous/conf.lua +++ /dev/null @@ -1,21 +0,0 @@ -function love.conf(t) - t.modules.joystick = true -- Enable the joystick module (boolean) - t.modules.audio = true -- Enable the audio module (boolean) - t.modules.keyboard = true -- Enable the keyboard module (boolean) - t.modules.event = true -- Enable the event module (boolean) - t.modules.image = true -- Enable the image module (boolean) - t.modules.graphics = true -- Enable the graphics module (boolean) - t.modules.timer = true -- Enable the timer module (boolean) - t.modules.mouse = true -- Enable the mouse module (boolean) - t.modules.sound = true -- Enable the sound module (boolean) - t.modules.physics = true -- Enable the physics module (boolean) - t.console = false -- Attach a console (boolean, Windows only) - t.title = "live_testproject" -- The title of the window the game is in (string) - t.author = "Tilmann Hars" -- The author of the game (string) - t.screen.fullscreen = false -- Enable fullscreen (boolean) - t.screen.vsync = true -- Enable vertical sync (boolean) - t.screen.fsaa = 0 -- The number of FSAA-buffers (number) - t.screen.height = 600 -- The window height (number) - t.screen.width = 800 -- The window width (number) - t.version = 0 -- The LÖVE version this game was made for (number) -end diff --git a/examples/lissajous/main.lua b/examples/lissajous/main.lua deleted file mode 100644 index 8e554eb..0000000 --- a/examples/lissajous/main.lua +++ /dev/null @@ -1,56 +0,0 @@ -require "LICK" -require "LICK/lib" -ez = require "LICK/lib/hlpr" -lick.reset = true -lick.clearFlag = true - - --- put in main.lua -function love.load() - - declare({ - t = 0, - x = 0, - y = 0, - o1 = 0, - o2 = 0, - g1 = 0, - g2 = 0, - k = 0, - h = 0, - circle = Circle(200,200,1,32, ez.color("white")) - }) - - -end - -function love.update(dt) - circle.color = ez.color("green", 150) - h = 5 + 0.01 - k = 1 + 0.0001 -end - -function love.draw() - ez.cls(20) - love.graphics.setBlendMode("alpha") - - for i=1,500 do - t = t + 0.01 - o1 = 1 * h - o2 = 2.5 * k - g1 = 400 - g2 = 300 - scale = 300 - x = scale * sin(o1 * t) + g1 - y = scale * sin(o2 * t) + g2 - circle.pos.x = x - circle.pos.y = y - - - circle:draw("fill") - end - love.graphics.setBlendMode("multiplicative") - - -end - diff --git a/examples/rotate/LICK/init.lua b/examples/rotate/LICK/init.lua deleted file mode 100644 index 6fc9157..0000000 --- a/examples/rotate/LICK/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -require "LICK/lick" - - diff --git a/examples/rotate/LICK/lib/color.lua b/examples/rotate/LICK/lib/color.lua deleted file mode 100644 index b94c709..0000000 --- a/examples/rotate/LICK/lib/color.lua +++ /dev/null @@ -1,742 +0,0 @@ -x11_color_table = { --- taken from the SuperCollider Color documentation: -["alice blue"]={240, 248, 255}, -["AliceBlue"]={240, 248, 255}, -["antique white"]={250, 235, 215}, -["AntiqueWhite"]={250, 235, 215}, -["AntiqueWhite1"]={255, 239, 219}, -["AntiqueWhite2"]={238, 223, 204}, -["AntiqueWhite3"]={205, 192, 176}, -["AntiqueWhite4"]={139, 131, 120}, -["aquamarine"]={127, 255, 212}, -["aquamarine1"]={127, 255, 212}, -["aquamarine2"]={118, 238, 198}, -["aquamarine3"]={102, 205, 170}, -["aquamarine4"]={69, 139, 116}, -["azure"]={240, 255, 255}, -["azure1"]={240, 255, 255}, -["azure2"]={224, 238, 238}, -["azure3"]={193, 205, 205}, -["azure4"]={131, 139, 139}, -["beige"]={245, 245, 220}, -["bisque"]={255, 228, 196}, -["bisque1"]={255, 228, 196}, -["bisque2"]={238, 213, 183}, -["bisque3"]={205, 183, 158}, -["bisque4"]={139, 125, 107}, -["black"]={0, 0, 0}, -["blanched almond"]={255, 235, 205}, -["BlanchedAlmond"]={255, 235, 205}, -["blue"]={0, 0, 255}, -["blue violet"]={138, 43, 226}, -["blue1"]={0, 0, 255}, -["blue2"]={0, 0, 238}, -["blue3"]={0, 0, 205}, -["blue4"]={0, 0, 139}, -["BlueViolet"]={138, 43, 226}, -["brown"]={165, 42, 42}, -["brown1"]={255, 64, 64}, -["brown2"]={238, 59, 59}, -["brown3"]={205, 51, 51}, -["brown4"]={139, 35, 35}, -["burlywood"]={222, 184, 135}, -["burlywood1"]={255, 211, 155}, -["burlywood2"]={238, 197, 145}, -["burlywood3"]={205, 170, 125}, -["burlywood4"]={139, 115, 85}, -["cadet blue"]={95, 158, 160}, -["CadetBlue"]={95, 158, 160}, -["CadetBlue1"]={152, 245, 255}, -["CadetBlue2"]={142, 229, 238}, -["CadetBlue3"]={122, 197, 205}, -["CadetBlue4"]={83, 134, 139}, -["chartreuse"]={127, 255, 0}, -["chartreuse1"]={127, 255, 0}, -["chartreuse2"]={118, 238, 0}, -["chartreuse3"]={102, 205, 0}, -["chartreuse4"]={69, 139, 0}, -["chocolate"]={210, 105, 30}, -["chocolate1"]={255, 127, 36}, -["chocolate2"]={238, 118, 33}, -["chocolate3"]={205, 102, 29}, -["chocolate4"]={139, 69, 19}, -["coral"]={255, 127, 80}, -["coral1"]={255, 114, 86}, -["coral2"]={238, 106, 80}, -["coral3"]={205, 91, 69}, -["coral4"]={139, 62, 47}, -["cornflower blue"]={100, 149, 237}, -["CornflowerBlue"]={100, 149, 237}, -["cornsilk"]={255, 248, 220}, -["cornsilk1"]={255, 248, 220}, -["cornsilk2"]={238, 232, 205}, -["cornsilk3"]={205, 200, 177}, -["cornsilk4"]={139, 136, 120}, -["cyan"]={0, 255, 255}, -["cyan1"]={0, 255, 255}, -["cyan2"]={0, 238, 238}, -["cyan3"]={0, 205, 205}, -["cyan4"]={0, 139, 139}, -["dark goldenrod"]={184, 134, 11}, -["dark green"]={0, 100, 0}, -["dark khaki"]={189, 183, 107}, -["dark olive green"]={85, 107, 47}, -["dark orange"]={255, 140, 0}, -["dark orchid"]={153, 50, 204}, -["dark salmon"]={233, 150, 122}, -["dark sea green"]={143, 188, 143}, -["dark slate blue"]={72, 61, 139}, -["dark slate gray"]={47, 79, 79}, -["dark slate grey"]={47, 79, 79}, -["dark turquoise"]={0, 206, 209}, -["dark violet"]={148, 0, 211}, -["DarkGoldenrod"]={184, 134, 11}, -["DarkGoldenrod1"]={255, 185, 15}, -["DarkGoldenrod2"]={238, 173, 14}, -["DarkGoldenrod3"]={205, 149, 12}, -["DarkGoldenrod4"]={139, 101, 8}, -["DarkGreen"]={0, 100, 0}, -["DarkKhaki"]={189, 183, 107}, -["DarkOliveGreen"]={85, 107, 47}, -["DarkOliveGreen1"]={202, 255, 112}, -["DarkOliveGreen2"]={188, 238, 104}, -["DarkOliveGreen3"]={162, 205, 90}, -["DarkOliveGreen4"]={110, 139, 61}, -["DarkOrange"]={255, 140, 0}, -["DarkOrange1"]={255, 127, 0}, -["DarkOrange2"]={238, 118, 0}, -["DarkOrange3"]={205, 102, 0}, -["DarkOrange4"]={139, 69, 0}, -["DarkOrchid"]={153, 50, 204}, -["DarkOrchid1"]={191, 62, 255}, -["DarkOrchid2"]={178, 58, 238}, -["DarkOrchid3"]={154, 50, 205}, -["DarkOrchid4"]={104, 34, 139}, -["DarkSalmon"]={233, 150, 122}, -["DarkSeaGreen"]={143, 188, 143}, -["DarkSeaGreen1"]={193, 255, 193}, -["DarkSeaGreen2"]={180, 238, 180}, -["DarkSeaGreen3"]={155, 205, 155}, -["DarkSeaGreen4"]={105, 139, 105}, -["DarkSlateBlue"]={72, 61, 139}, -["DarkSlateGray"]={47, 79, 79}, -["DarkSlateGray1"]={151, 255, 255}, -["DarkSlateGray2"]={141, 238, 238}, -["DarkSlateGray3"]={121, 205, 205}, -["DarkSlateGray4"]={82, 139, 139}, -["DarkSlateGrey"]={47, 79, 79}, -["DarkTurquoise"]={0, 206, 209}, -["DarkViolet"]={148, 0, 211}, -["deep pink"]={255, 20, 147}, -["deep sky blue"]={0, 191, 255}, -["DeepPink"]={255, 20, 147}, -["DeepPink1"]={255, 20, 147}, -["DeepPink2"]={238, 18, 137}, -["DeepPink3"]={205, 16, 118}, -["DeepPink4"]={139, 10, 80}, -["DeepSkyBlue"]={0, 191, 255}, -["DeepSkyBlue1"]={0, 191, 255}, -["DeepSkyBlue2"]={0, 178, 238}, -["DeepSkyBlue3"]={0, 154, 205}, -["DeepSkyBlue4"]={0, 104, 139}, -["dim gray"]={105, 105, 105}, -["dim grey"]={105, 105, 105}, -["DimGray"]={105, 105, 105}, -["DimGrey"]={105, 105, 105}, -["dodger blue"]={30, 144, 255}, -["DodgerBlue"]={30, 144, 255}, -["DodgerBlue1"]={30, 144, 255}, -["DodgerBlue2"]={28, 134, 238}, -["DodgerBlue3"]={24, 116, 205}, -["DodgerBlue4"]={16, 78, 139}, -["firebrick"]={178, 34, 34}, -["firebrick1"]={255, 48, 48}, -["firebrick2"]={238, 44, 44}, -["firebrick3"]={205, 38, 38}, -["firebrick4"]={139, 26, 26}, -["floral white"]={255, 250, 240}, -["FloralWhite"]={255, 250, 240}, -["forest green"]={34, 139, 34}, -["ForestGreen"]={34, 139, 34}, -["gainsboro"]={220, 220, 220}, -["ghost white"]={248, 248, 255}, -["GhostWhite"]={248, 248, 255}, -["gold"]={255, 215, 0}, -["gold1"]={255, 215, 0}, -["gold2"]={238, 201, 0}, -["gold3"]={205, 173, 0}, -["gold4"]={139, 117, 0}, -["goldenrod"]={218, 165, 32}, -["goldenrod1"]={255, 193, 37}, -["goldenrod2"]={238, 180, 34}, -["goldenrod3"]={205, 155, 29}, -["goldenrod4"]={139, 105, 20}, -["gray"]={190, 190, 190}, -["gray0"]={0, 0, 0}, -["gray1"]={3, 3, 3}, -["gray10"]={26, 26, 26}, -["gray100"]={255, 255, 255}, -["gray11"]={28, 28, 28}, -["gray12"]={31, 31, 31}, -["gray13"]={33, 33, 33}, -["gray14"]={36, 36, 36}, -["gray15"]={38, 38, 38}, -["gray16"]={41, 41, 41}, -["gray17"]={43, 43, 43}, -["gray18"]={46, 46, 46}, -["gray19"]={48, 48, 48}, -["gray2"]={5, 5, 5}, -["gray20"]={51, 51, 51}, -["gray21"]={54, 54, 54}, -["gray22"]={56, 56, 56}, -["gray23"]={59, 59, 59}, -["gray24"]={61, 61, 61}, -["gray25"]={64, 64, 64}, -["gray26"]={66, 66, 66}, -["gray27"]={69, 69, 69}, -["gray28"]={71, 71, 71}, -["gray29"]={74, 74, 74}, -["gray3"]={8, 8, 8}, -["gray30"]={77, 77, 77}, -["gray31"]={79, 79, 79}, -["gray32"]={82, 82, 82}, -["gray33"]={84, 84, 84}, -["gray34"]={87, 87, 87}, -["gray35"]={89, 89, 89}, -["gray36"]={92, 92, 92}, -["gray37"]={94, 94, 94}, -["gray38"]={97, 97, 97}, -["gray39"]={99, 99, 99}, -["gray4"]={10, 10, 10}, -["gray40"]={102, 102, 102}, -["gray41"]={105, 105, 105}, -["gray42"]={107, 107, 107}, -["gray43"]={110, 110, 110}, -["gray44"]={112, 112, 112}, -["gray45"]={115, 115, 115}, -["gray46"]={117, 117, 117}, -["gray47"]={120, 120, 120}, -["gray48"]={122, 122, 122}, -["gray49"]={125, 125, 125}, -["gray5"]={13, 13, 13}, -["gray50"]={127, 127, 127}, -["gray51"]={130, 130, 130}, -["gray52"]={133, 133, 133}, -["gray53"]={135, 135, 135}, -["gray54"]={138, 138, 138}, -["gray55"]={140, 140, 140}, -["gray56"]={143, 143, 143}, -["gray57"]={145, 145, 145}, -["gray58"]={148, 148, 148}, -["gray59"]={150, 150, 150}, -["gray6"]={15, 15, 15}, -["gray60"]={153, 153, 153}, -["gray61"]={156, 156, 156}, -["gray62"]={158, 158, 158}, -["gray63"]={161, 161, 161}, -["gray64"]={163, 163, 163}, -["gray65"]={166, 166, 166}, -["gray66"]={168, 168, 168}, -["gray67"]={171, 171, 171}, -["gray68"]={173, 173, 173}, -["gray69"]={176, 176, 176}, -["gray7"]={18, 18, 18}, -["gray70"]={179, 179, 179}, -["gray71"]={181, 181, 181}, -["gray72"]={184, 184, 184}, -["gray73"]={186, 186, 186}, -["gray74"]={189, 189, 189}, -["gray75"]={191, 191, 191}, -["gray76"]={194, 194, 194}, -["gray77"]={196, 196, 196}, -["gray78"]={199, 199, 199}, -["gray79"]={201, 201, 201}, -["gray8"]={20, 20, 20}, -["gray80"]={204, 204, 204}, -["gray81"]={207, 207, 207}, -["gray82"]={209, 209, 209}, -["gray83"]={212, 212, 212}, -["gray84"]={214, 214, 214}, -["gray85"]={217, 217, 217}, -["gray86"]={219, 219, 219}, -["gray87"]={222, 222, 222}, -["gray88"]={224, 224, 224}, -["gray89"]={227, 227, 227}, -["gray9"]={23, 23, 23}, -["gray90"]={229, 229, 229}, -["gray91"]={232, 232, 232}, -["gray92"]={235, 235, 235}, -["gray93"]={237, 237, 237}, -["gray94"]={240, 240, 240}, -["gray95"]={242, 242, 242}, -["gray96"]={245, 245, 245}, -["gray97"]={247, 247, 247}, -["gray98"]={250, 250, 250}, -["gray99"]={252, 252, 252}, -["green"]={0, 255, 0}, -["green yellow"]={173, 255, 47}, -["green1"]={0, 255, 0}, -["green2"]={0, 238, 0}, -["green3"]={0, 205, 0}, -["green4"]={0, 139, 0}, -["GreenYellow"]={173, 255, 47}, -["grey"]={190, 190, 190}, -["grey0"]={0, 0, 0}, -["grey1"]={3, 3, 3}, -["grey10"]={26, 26, 26}, -["grey100"]={255, 255, 255}, -["grey11"]={28, 28, 28}, -["grey12"]={31, 31, 31}, -["grey13"]={33, 33, 33}, -["grey14"]={36, 36, 36}, -["grey15"]={38, 38, 38}, -["grey16"]={41, 41, 41}, -["grey17"]={43, 43, 43}, -["grey18"]={46, 46, 46}, -["grey19"]={48, 48, 48}, -["grey2"]={5, 5, 5}, -["grey20"]={51, 51, 51}, -["grey21"]={54, 54, 54}, -["grey22"]={56, 56, 56}, -["grey23"]={59, 59, 59}, -["grey24"]={61, 61, 61}, -["grey25"]={64, 64, 64}, -["grey26"]={66, 66, 66}, -["grey27"]={69, 69, 69}, -["grey28"]={71, 71, 71}, -["grey29"]={74, 74, 74}, -["grey3"]={8, 8, 8}, -["grey30"]={77, 77, 77}, -["grey31"]={79, 79, 79}, -["grey32"]={82, 82, 82}, -["grey33"]={84, 84, 84}, -["grey34"]={87, 87, 87}, -["grey35"]={89, 89, 89}, -["grey36"]={92, 92, 92}, -["grey37"]={94, 94, 94}, -["grey38"]={97, 97, 97}, -["grey39"]={99, 99, 99}, -["grey4"]={10, 10, 10}, -["grey40"]={102, 102, 102}, -["grey41"]={105, 105, 105}, -["grey42"]={107, 107, 107}, -["grey43"]={110, 110, 110}, -["grey44"]={112, 112, 112}, -["grey45"]={115, 115, 115}, -["grey46"]={117, 117, 117}, -["grey47"]={120, 120, 120}, -["grey48"]={122, 122, 122}, -["grey49"]={125, 125, 125}, -["grey5"]={13, 13, 13}, -["grey50"]={127, 127, 127}, -["grey51"]={130, 130, 130}, -["grey52"]={133, 133, 133}, -["grey53"]={135, 135, 135}, -["grey54"]={138, 138, 138}, -["grey55"]={140, 140, 140}, -["grey56"]={143, 143, 143}, -["grey57"]={145, 145, 145}, -["grey58"]={148, 148, 148}, -["grey59"]={150, 150, 150}, -["grey6"]={15, 15, 15}, -["grey60"]={153, 153, 153}, -["grey61"]={156, 156, 156}, -["grey62"]={158, 158, 158}, -["grey63"]={161, 161, 161}, -["grey64"]={163, 163, 163}, -["grey65"]={166, 166, 166}, -["grey66"]={168, 168, 168}, -["grey67"]={171, 171, 171}, -["grey68"]={173, 173, 173}, -["grey69"]={176, 176, 176}, -["grey7"]={18, 18, 18}, -["grey70"]={179, 179, 179}, -["grey71"]={181, 181, 181}, -["grey72"]={184, 184, 184}, -["grey73"]={186, 186, 186}, -["grey74"]={189, 189, 189}, -["grey75"]={191, 191, 191}, -["grey76"]={194, 194, 194}, -["grey77"]={196, 196, 196}, -["grey78"]={199, 199, 199}, -["grey79"]={201, 201, 201}, -["grey8"]={20, 20, 20}, -["grey80"]={204, 204, 204}, -["grey81"]={207, 207, 207}, -["grey82"]={209, 209, 209}, -["grey83"]={212, 212, 212}, -["grey84"]={214, 214, 214}, -["grey85"]={217, 217, 217}, -["grey86"]={219, 219, 219}, -["grey87"]={222, 222, 222}, -["grey88"]={224, 224, 224}, -["grey89"]={227, 227, 227}, -["grey9"]={23, 23, 23}, -["grey90"]={229, 229, 229}, -["grey91"]={232, 232, 232}, -["grey92"]={235, 235, 235}, -["grey93"]={237, 237, 237}, -["grey94"]={240, 240, 240}, -["grey95"]={242, 242, 242}, -["grey96"]={245, 245, 245}, -["grey97"]={247, 247, 247}, -["grey98"]={250, 250, 250}, -["grey99"]={252, 252, 252}, -["honeydew"]={240, 255, 240}, -["honeydew1"]={240, 255, 240}, -["honeydew2"]={224, 238, 224}, -["honeydew3"]={193, 205, 193}, -["honeydew4"]={131, 139, 131}, -["hot pink"]={255, 105, 180}, -["HotPink"]={255, 105, 180}, -["HotPink1"]={255, 110, 180}, -["HotPink2"]={238, 106, 167}, -["HotPink3"]={205, 96, 144}, -["HotPink4"]={139, 58, 98}, -["indian red"]={205, 92, 92}, -["IndianRed"]={205, 92, 92}, -["IndianRed1"]={255, 106, 106}, -["IndianRed2"]={238, 99, 99}, -["IndianRed3"]={205, 85, 85}, -["IndianRed4"]={139, 58, 58}, -["ivory"]={255, 255, 240}, -["ivory1"]={255, 255, 240}, -["ivory2"]={238, 238, 224}, -["ivory3"]={205, 205, 193}, -["ivory4"]={139, 139, 131}, -["khaki"]={240, 230, 140}, -["khaki1"]={255, 246, 143}, -["khaki2"]={238, 230, 133}, -["khaki3"]={205, 198, 115}, -["khaki4"]={139, 134, 78}, -["lavender"]={230, 230, 250}, -["lavender blush"]={255, 240, 245}, -["LavenderBlush"]={255, 240, 245}, -["LavenderBlush1"]={255, 240, 245}, -["LavenderBlush2"]={238, 224, 229}, -["LavenderBlush3"]={205, 193, 197}, -["LavenderBlush4"]={139, 131, 134}, -["lawn green"]={124, 252, 0}, -["LawnGreen"]={124, 252, 0}, -["lemon chiffon"]={255, 250, 205}, -["LemonChiffon"]={255, 250, 205}, -["LemonChiffon1"]={255, 250, 205}, -["LemonChiffon2"]={238, 233, 191}, -["LemonChiffon3"]={205, 201, 165}, -["LemonChiffon4"]={139, 137, 112}, -["light blue"]={173, 216, 230}, -["light coral"]={240, 128, 128}, -["light cyan"]={224, 255, 255}, -["light goldenrod"]={238, 221, 130}, -["light goldenrod yellow"]={250, 250, 210}, -["light gray"]={211, 211, 211}, -["light grey"]={211, 211, 211}, -["light pink"]={255, 182, 193}, -["light salmon"]={255, 160, 122}, -["light sea green"]={32, 178, 170}, -["light sky blue"]={135, 206, 250}, -["light slate blue"]={132, 112, 255}, -["light slate gray"]={119, 136, 153}, -["light slate grey"]={119, 136, 153}, -["light steel blue"]={176, 196, 222}, -["light yellow"]={255, 255, 224}, -["LightBlue"]={173, 216, 230}, -["LightBlue1"]={191, 239, 255}, -["LightBlue2"]={178, 223, 238}, -["LightBlue3"]={154, 192, 205}, -["LightBlue4"]={104, 131, 139}, -["LightCoral"]={240, 128, 128}, -["LightCyan"]={224, 255, 255}, -["LightCyan1"]={224, 255, 255}, -["LightCyan2"]={209, 238, 238}, -["LightCyan3"]={180, 205, 205}, -["LightCyan4"]={122, 139, 139}, -["LightGoldenrod"]={238, 221, 130}, -["LightGoldenrod1"]={255, 236, 139}, -["LightGoldenrod2"]={238, 220, 130}, -["LightGoldenrod3"]={205, 190, 112}, -["LightGoldenrod4"]={139, 129, 76}, -["LightGoldenrodYellow"]={250, 250, 210}, -["LightGray"]={211, 211, 211}, -["LightGrey"]={211, 211, 211}, -["LightPink"]={255, 182, 193}, -["LightPink1"]={255, 174, 185}, -["LightPink2"]={238, 162, 173}, -["LightPink3"]={205, 140, 149}, -["LightPink4"]={139, 95, 101}, -["LightSalmon"]={255, 160, 122}, -["LightSalmon1"]={255, 160, 122}, -["LightSalmon2"]={238, 149, 114}, -["LightSalmon3"]={205, 129, 98}, -["LightSalmon4"]={139, 87, 66}, -["LightSeaGreen"]={32, 178, 170}, -["LightSkyBlue"]={135, 206, 250}, -["LightSkyBlue1"]={176, 226, 255}, -["LightSkyBlue2"]={164, 211, 238}, -["LightSkyBlue3"]={141, 182, 205}, -["LightSkyBlue4"]={96, 123, 139}, -["LightSlateBlue"]={132, 112, 255}, -["LightSlateGray"]={119, 136, 153}, -["LightSlateGrey"]={119, 136, 153}, -["LightSteelBlue"]={176, 196, 222}, -["LightSteelBlue1"]={202, 225, 255}, -["LightSteelBlue2"]={188, 210, 238}, -["LightSteelBlue3"]={162, 181, 205}, -["LightSteelBlue4"]={110, 123, 139}, -["LightYellow"]={255, 255, 224}, -["LightYellow1"]={255, 255, 224}, -["LightYellow2"]={238, 238, 209}, -["LightYellow3"]={205, 205, 180}, -["LightYellow4"]={139, 139, 122}, -["lime green"]={50, 205, 50}, -["LimeGreen"]={50, 205, 50}, -["linen"]={250, 240, 230}, -["magenta"]={255, 0, 255}, -["magenta1"]={255, 0, 255}, -["magenta2"]={238, 0, 238}, -["magenta3"]={205, 0, 205}, -["magenta4"]={139, 0, 139}, -["maroon"]={176, 48, 96}, -["maroon1"]={255, 52, 179}, -["maroon2"]={238, 48, 167}, -["maroon3"]={205, 41, 144}, -["maroon4"]={139, 28, 98}, -["medium aquamarine"]={102, 205, 170}, -["medium blue"]={0, 0, 205}, -["medium orchid"]={186, 85, 211}, -["medium purple"]={147, 112, 219}, -["medium sea green"]={60, 179, 113}, -["medium slate blue"]={123, 104, 238}, -["medium spring green"]={0, 250, 154}, -["medium turquoise"]={72, 209, 204}, -["medium violet red"]={199, 21, 133}, -["MediumAquamarine"]={102, 205, 170}, -["MediumBlue"]={0, 0, 205}, -["MediumOrchid"]={186, 85, 211}, -["MediumOrchid1"]={224, 102, 255}, -["MediumOrchid2"]={209, 95, 238}, -["MediumOrchid3"]={180, 82, 205}, -["MediumOrchid4"]={122, 55, 139}, -["MediumPurple"]={147, 112, 219}, -["MediumPurple1"]={171, 130, 255}, -["MediumPurple2"]={159, 121, 238}, -["MediumPurple3"]={137, 104, 205}, -["MediumPurple4"]={93, 71, 139}, -["MediumSeaGreen"]={60, 179, 113}, -["MediumSlateBlue"]={123, 104, 238}, -["MediumSpringGreen"]={0, 250, 154}, -["MediumTurquoise"]={72, 209, 204}, -["MediumVioletRed"]={199, 21, 133}, -["midnight blue"]={25, 25, 112}, -["MidnightBlue"]={25, 25, 112}, -["mint cream"]={245, 255, 250}, -["MintCream"]={245, 255, 250}, -["misty rose"]={255, 228, 225}, -["MistyRose"]={255, 228, 225}, -["MistyRose1"]={255, 228, 225}, -["MistyRose2"]={238, 213, 210}, -["MistyRose3"]={205, 183, 181}, -["MistyRose4"]={139, 125, 123}, -["moccasin"]={255, 228, 181}, -["navajo white"]={255, 222, 173}, -["NavajoWhite"]={255, 222, 173}, -["NavajoWhite1"]={255, 222, 173}, -["NavajoWhite2"]={238, 207, 161}, -["NavajoWhite3"]={205, 179, 139}, -["NavajoWhite4"]={139, 121, 94}, -["navy"]={0, 0, 128}, -["navy blue"]={0, 0, 128}, -["NavyBlue"]={0, 0, 128}, -["old lace"]={253, 245, 230}, -["OldLace"]={253, 245, 230}, -["olive drab"]={107, 142, 35}, -["OliveDrab"]={107, 142, 35}, -["OliveDrab1"]={192, 255, 62}, -["OliveDrab2"]={179, 238, 58}, -["OliveDrab3"]={154, 205, 50}, -["OliveDrab4"]={105, 139, 34}, -["orange"]={255, 165, 0}, -["orange red"]={255, 69, 0}, -["orange1"]={255, 165, 0}, -["orange2"]={238, 154, 0}, -["orange3"]={205, 133, 0}, -["orange4"]={139, 90, 0}, -["OrangeRed"]={255, 69, 0}, -["OrangeRed1"]={255, 69, 0}, -["OrangeRed2"]={238, 64, 0}, -["OrangeRed3"]={205, 55, 0}, -["OrangeRed4"]={139, 37, 0}, -["orchid"]={218, 112, 214}, -["orchid1"]={255, 131, 250}, -["orchid2"]={238, 122, 233}, -["orchid3"]={205, 105, 201}, -["orchid4"]={139, 71, 137}, -["pale goldenrod"]={238, 232, 170}, -["pale green"]={152, 251, 152}, -["pale turquoise"]={175, 238, 238}, -["pale violet red"]={219, 112, 147}, -["PaleGoldenrod"]={238, 232, 170}, -["PaleGreen"]={152, 251, 152}, -["PaleGreen1"]={154, 255, 154}, -["PaleGreen2"]={144, 238, 144}, -["PaleGreen3"]={124, 205, 124}, -["PaleGreen4"]={84, 139, 84}, -["PaleTurquoise"]={175, 238, 238}, -["PaleTurquoise1"]={187, 255, 255}, -["PaleTurquoise2"]={174, 238, 238}, -["PaleTurquoise3"]={150, 205, 205}, -["PaleTurquoise4"]={102, 139, 139}, -["PaleVioletRed"]={219, 112, 147}, -["PaleVioletRed1"]={255, 130, 171}, -["PaleVioletRed2"]={238, 121, 159}, -["PaleVioletRed3"]={205, 104, 137}, -["PaleVioletRed4"]={139, 71, 93}, -["papaya whip"]={255, 239, 213}, -["PapayaWhip"]={255, 239, 213}, -["peach puff"]={255, 218, 185}, -["PeachPuff"]={255, 218, 185}, -["PeachPuff1"]={255, 218, 185}, -["PeachPuff2"]={238, 203, 173}, -["PeachPuff3"]={205, 175, 149}, -["PeachPuff4"]={139, 119, 101}, -["peru"]={205, 133, 63}, -["pink"]={255, 192, 203}, -["pink1"]={255, 181, 197}, -["pink2"]={238, 169, 184}, -["pink3"]={205, 145, 158}, -["pink4"]={139, 99, 108}, -["plum"]={221, 160, 221}, -["plum1"]={255, 187, 255}, -["plum2"]={238, 174, 238}, -["plum3"]={205, 150, 205}, -["plum4"]={139, 102, 139}, -["powder blue"]={176, 224, 230}, -["PowderBlue"]={176, 224, 230}, -["purple"]={160, 32, 240}, -["purple1"]={155, 48, 255}, -["purple2"]={145, 44, 238}, -["purple3"]={125, 38, 205}, -["purple4"]={85, 26, 139}, -["red"]={255, 0, 0}, -["red1"]={255, 0, 0}, -["red2"]={238, 0, 0}, -["red3"]={205, 0, 0}, -["red4"]={139, 0, 0}, -["rosy brown"]={188, 143, 143}, -["RosyBrown"]={188, 143, 143}, -["RosyBrown1"]={255, 193, 193}, -["RosyBrown2"]={238, 180, 180}, -["RosyBrown3"]={205, 155, 155}, -["RosyBrown4"]={139, 105, 105}, -["royal blue"]={65, 105, 225}, -["RoyalBlue"]={65, 105, 225}, -["RoyalBlue1"]={72, 118, 255}, -["RoyalBlue2"]={67, 110, 238}, -["RoyalBlue3"]={58, 95, 205}, -["RoyalBlue4"]={39, 64, 139}, -["saddle brown"]={139, 69, 19}, -["SaddleBrown"]={139, 69, 19}, -["salmon"]={250, 128, 114}, -["salmon1"]={255, 140, 105}, -["salmon2"]={238, 130, 98}, -["salmon3"]={205, 112, 84}, -["salmon4"]={139, 76, 57}, -["sandy brown"]={244, 164, 96}, -["SandyBrown"]={244, 164, 96}, -["sea green"]={46, 139, 87}, -["SeaGreen"]={46, 139, 87}, -["SeaGreen1"]={84, 255, 159}, -["SeaGreen2"]={78, 238, 148}, -["SeaGreen3"]={67, 205, 128}, -["SeaGreen4"]={46, 139, 87}, -["seashell"]={255, 245, 238}, -["seashell1"]={255, 245, 238}, -["seashell2"]={238, 229, 222}, -["seashell3"]={205, 197, 191}, -["seashell4"]={139, 134, 130}, -["sienna"]={160, 82, 45}, -["sienna1"]={255, 130, 71}, -["sienna2"]={238, 121, 66}, -["sienna3"]={205, 104, 57}, -["sienna4"]={139, 71, 38}, -["sky blue"]={135, 206, 235}, -["SkyBlue"]={135, 206, 235}, -["SkyBlue1"]={135, 206, 255}, -["SkyBlue2"]={126, 192, 238}, -["SkyBlue3"]={108, 166, 205}, -["SkyBlue4"]={74, 112, 139}, -["slate blue"]={106, 90, 205}, -["slate gray"]={112, 128, 144}, -["slate grey"]={112, 128, 144}, -["SlateBlue"]={106, 90, 205}, -["SlateBlue1"]={131, 111, 255}, -["SlateBlue2"]={122, 103, 238}, -["SlateBlue3"]={105, 89, 205}, -["SlateBlue4"]={71, 60, 139}, -["SlateGray"]={112, 128, 144}, -["SlateGray1"]={198, 226, 255}, -["SlateGray2"]={185, 211, 238}, -["SlateGray3"]={159, 182, 205}, -["SlateGray4"]={108, 123, 139}, -["SlateGrey"]={112, 128, 144}, -["snow"]={255, 250, 250}, -["snow1"]={255, 250, 250}, -["snow2"]={238, 233, 233}, -["snow3"]={205, 201, 201}, -["snow4"]={139, 137, 137}, -["spring green"]={0, 255, 127}, -["SpringGreen"]={0, 255, 127}, -["SpringGreen1"]={0, 255, 127}, -["SpringGreen2"]={0, 238, 118}, -["SpringGreen3"]={0, 205, 102}, -["SpringGreen4"]={0, 139, 69}, -["steel blue"]={70, 130, 180}, -["SteelBlue"]={70, 130, 180}, -["SteelBlue1"]={99, 184, 255}, -["SteelBlue2"]={92, 172, 238}, -["SteelBlue3"]={79, 148, 205}, -["SteelBlue4"]={54, 100, 139}, -["tan"]={210, 180, 140}, -["tan1"]={255, 165, 79}, -["tan2"]={238, 154, 73}, -["tan3"]={205, 133, 63}, -["tan4"]={139, 90, 43}, -["thistle"]={216, 191, 216}, -["thistle1"]={255, 225, 255}, -["thistle2"]={238, 210, 238}, -["thistle3"]={205, 181, 205}, -["thistle4"]={139, 123, 139}, -["tomato"]={255, 99, 71}, -["tomato1"]={255, 99, 71}, -["tomato2"]={238, 92, 66}, -["tomato3"]={205, 79, 57}, -["tomato4"]={139, 54, 38}, -["turquoise"]={64, 224, 208}, -["turquoise1"]={0, 245, 255}, -["turquoise2"]={0, 229, 238}, -["turquoise3"]={0, 197, 205}, -["turquoise4"]={0, 134, 139}, -["violet"]={238, 130, 238}, -["violet red"]={208, 32, 144}, -["VioletRed"]={208, 32, 144}, -["VioletRed1"]={255, 62, 150}, -["VioletRed2"]={238, 58, 140}, -["VioletRed3"]={205, 50, 120}, -["VioletRed4"]={139, 34, 82}, -["wheat"]={245, 222, 179}, -["wheat1"]={255, 231, 186}, -["wheat2"]={238, 216, 174}, -["wheat3"]={205, 186, 150}, -["wheat4"]={139, 126, 102}, -["white"]={255, 255, 255}, -["white smoke"]={245, 245, 245}, -["WhiteSmoke"]={245, 245, 245}, -["yellow"]={255, 255, 0}, -["yellow green"]={154, 205, 50}, -["yellow1"]={255, 255, 0}, -["yellow2"]={238, 238, 0}, -["yellow3"]={205, 205, 0}, -["yellow4"]={139, 139, 0}, -["YellowGreen"]={154, 205, 50} - -} diff --git a/examples/rotate/LICK/lib/docs/classes/Circle.html b/examples/rotate/LICK/lib/docs/classes/Circle.html deleted file mode 100644 index 852dc53..0000000 --- a/examples/rotate/LICK/lib/docs/classes/Circle.html +++ /dev/null @@ -1 +0,0 @@ -Circle

Circle               drawable circle

       function(self, x, y, r, s, color)

               Constructor

       draw(style)

              draw the circle
\ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/classes/Drawable.html b/examples/rotate/LICK/lib/docs/classes/Drawable.html deleted file mode 100644 index dcd58a1..0000000 --- a/examples/rotate/LICK/lib/docs/classes/Drawable.html +++ /dev/null @@ -1 +0,0 @@ -Drawable

Drawable               base class for all drawable stuff

       function(self, x, y, color)

               Constructor

       wrapX(min, max)

              can be called via wrapX(max) or wrapX(min,max)

       wrapY(min, max)

              can be called via wrapY(max) or wrapY(min,max)

       wrap(str, min, max)

              internal wrapper

       set(str, val)

              supercollider style 'set'

       draw()

              not yet implemented
\ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/classes/Line.html b/examples/rotate/LICK/lib/docs/classes/Line.html deleted file mode 100644 index 4faa005..0000000 --- a/examples/rotate/LICK/lib/docs/classes/Line.html +++ /dev/null @@ -1 +0,0 @@ -Line

Line               draw a line

       function(self, x, y, tx, ty)

               Constructor \ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/classes/Object.html b/examples/rotate/LICK/lib/docs/classes/Object.html deleted file mode 100644 index 84c6db9..0000000 --- a/examples/rotate/LICK/lib/docs/classes/Object.html +++ /dev/null @@ -1 +0,0 @@ -Object

Object               base class

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/classes/SCObject.html b/examples/rotate/LICK/lib/docs/classes/SCObject.html deleted file mode 100644 index 2d1621a..0000000 --- a/examples/rotate/LICK/lib/docs/classes/SCObject.html +++ /dev/null @@ -1 +0,0 @@ -SCObject

SCObject               bass class for supercollider communication

       function(self)

               Constructor \ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/classes/SCSynth.html b/examples/rotate/LICK/lib/docs/classes/SCSynth.html deleted file mode 100644 index b2f94ac..0000000 --- a/examples/rotate/LICK/lib/docs/classes/SCSynth.html +++ /dev/null @@ -1 +0,0 @@ -SCSynth

SCSynth               supercollider synthesizer class

       function(self, nodename, freq)

               Constructor

       set(control, val)

              set a control, TODO: variable lenght of argument-pairs

        os.time(),

              bundle",

       play()

              sends an OSC message to the supercollider to start the synth

        os.time(),

              bundle",

       free()

              frees the node on the supercollider server

        os.time()+0.8,

              bundle",
\ No newline at end of file diff --git a/examples/rotate/LICK/lib/docs/guidelines.html b/examples/rotate/LICK/lib/docs/guidelines.html deleted file mode 100644 index b394e30..0000000 --- a/examples/rotate/LICK/lib/docs/guidelines.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - -

Guidelines for new live_libs classes

-


-

1. Howto write a new class

-


-

-

<class name> =  Class(<constructor>)

-

creates a class with function in constructor

-


-

<class name>:inherit(<other class name>)

-

if you want to inherit from any class.Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table

-


-

If you want to call the constructor of the superclass write the following in the constructor of the current class:

-

-

<super class name>.<construct>(self, <arguments>)

-


-

More on Classes and HUMP: http://vrld.github.com/hump/

-


-

2. Commenting

-

-

In order to work the comment parser needs the following comment 'marks':

-


-


-

-- @ <class name>:<short description>

-

This marks a new class. The following line should be the class definition

-

Note: only one line comments are working

-


-

-- # <description>

-

This marks a new method.

-

Note: the limitations of class comments apply

-


-

any '--' without marks will not be included in the helpfile

-

-

Example:

-

-- @Drawable: base class for all drawable stuff

-

Drawable = Class(function(self, x, y, color)

-

self.color = color or hlpr.color("white",255)

-

-- call constructor of Object class

-

Object.construct(self)

-

self.position = Vector(x or 0,y or 0)

-

end)

-

Drawable:inherit(Object)

-


-

-- #can be called via wrapX(max) or wrapX(min,max)

-

function Drawable:wrapX(min, max)

-

if min and max then

-

self:wrap("x", min, max)

-

elseif min and not max then 

-

self:wrap("x", 0, min)

-

end

-

end

-


-


- - diff --git a/examples/rotate/LICK/lib/docs/guidelines.txt b/examples/rotate/LICK/lib/docs/guidelines.txt deleted file mode 100644 index fd1010f..0000000 --- a/examples/rotate/LICK/lib/docs/guidelines.txt +++ /dev/null @@ -1,51 +0,0 @@ -Guidelines for new live_libs classes - -1. Howto write a new class - - - = Class() - creates a class with function in constructor - - :inherit() - if you want to inherit from any class. Everything should inherit directly or indirectly from object, because here the instance is added to the _internal_object_table - -If you want to call the constructor of the superclass write the following in the constructor of the current class: - - .(self, ) -More on Classes and HUMP: http://vrld.github.com/hump/ - -2. Commenting - - In order to work the comment parser needs the following comment 'marks': - - - -- @ : - This marks a new class. - Note: only oneliners are working - - -- # - This marks a new method. - Note: limitation of class comments apply - - any '--' without marks will not be included in the helpfile - - Example: - -- @Drawable: base class for all drawable stuff - Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - self.position = Vector(x or 0,y or 0) - end) - Drawable:inherit(Object) - - -- #can be called via wrapX(max) or wrapX(min,max) - function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end - end - - diff --git a/examples/rotate/LICK/lib/docs/index.html b/examples/rotate/LICK/lib/docs/index.html deleted file mode 100644 index 6868575..0000000 --- a/examples/rotate/LICK/lib/docs/index.html +++ /dev/null @@ -1 +0,0 @@ -live_libs_doc

live_libs documentation

Guidelines for new classes and commenting

Classes:

Object
SCObject
SCSynth
Drawable
Circle
Line
\ No newline at end of file diff --git a/examples/rotate/LICK/lib/help.lua b/examples/rotate/LICK/lib/help.lua deleted file mode 100644 index 744ffd4..0000000 --- a/examples/rotate/LICK/lib/help.lua +++ /dev/null @@ -1,109 +0,0 @@ --- parse the classes to readable html - -module(..., package.seeall) - -filename = "LICK/lib/object.lua" -help_filename = "LICK/lib/docs/" - --- some styles -local style = "" - -local header1 = "" -local header2 = ""..style.."" -local footer = "" -local _newclasstitle = "

" -local newclasstitle_ = "

" -local tab = "       " - - --- generates the html file -function generate() - class_file = love.filesystem.newFile( filename ) - class_file:open('r') - local output = "" - output = header1.."test"..header2 - local found_methods = 0 - local found_classes = 0 - local classes = {} - for line in class_file:lines() do - local b,e = string.find(line,"@") - local b1,e1 = string.find(line,"Class") - if b and e then - if found_classes > 0 then - output = output..footer - writeClassFile(name, output) - local output = "" - - end - dp,ep = string.find(line, ":") - name = line:sub(e+1, dp-1 or 0) - print(name) - table.insert(classes,name) - output = header1..name..header2 - - output = output .._newclasstitle .. name..tab..tab..line:sub(dp+1) ..newclasstitle_ - found_methods = 0 - found_classes = found_classes + 1 - elseif b1 and e1 and not string.find(line,"require") then - output = output .."

"..tab..line:sub(e1+2).."

"..tab..tab.." Constructor" - - end - local b,e = string.find(line,"#") - if method then - local dp,ep = string.find(line, ":") - ep = ep or 1 - if found == 0 then - output = output .."

Methods

" - found_methods = found_methods + 1 - end - output = output.."

".. tab ..line:sub(ep+1).."

"..tab..tab..method - method = nil - end - if b and e then - method = line:sub(e+1).."
" - - --output = output..line:sub(e+1).."
" - end - end - output = output..footer - writeClassFile(name, output) - - -- generate index.html - index = header1.."live_libs_doc"..header2 - index = index.."

live_libs documentation

" - index = index .. "Guidelines for new classes and commenting" - index = index.. "

Classes:

" - for i,v in ipairs(classes) do - index = index..""..v.."
" - end - index = index..footer - writeFile("index", index) - - -end - -function writeClassFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename.."classes/"..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - -function writeFile(name, output) - dir = love.filesystem.getWorkingDirectory( ) - --print("touch "..dir.."/"..help_filename) - local path = dir.."/live_testproject/"..help_filename..name..".html" - os.execute("touch "..path) - - local helpfile = io.open(path, "w" ) - helpfile:write(output) - helpfile:close() - -end - - diff --git a/examples/rotate/LICK/lib/hlpr.lua b/examples/rotate/LICK/lib/hlpr.lua deleted file mode 100644 index 13ded41..0000000 --- a/examples/rotate/LICK/lib/hlpr.lua +++ /dev/null @@ -1,350 +0,0 @@ --- hlpr libary: it's not about nice coding, ist about fast and easy coding --- by Rukano and Headchant, 2011 - - --- global math -pi = math.pi -sin = math.sin -deg = math.deg -rad = math.rad - -State = State or {} - -function declare(t) - for i,v in pairs(t) do - if not State[i] then - State[i] = v - _G[i] = State[i] - end - end -end -require "LICK/lib/color" -module(...,package.seeall) - --- syntax shortcuts -checkMode = love.graphics.checkMode -circle = love.graphics.circle -clear = love.graphics.clear -draw = love.graphics.draw -drawq = love.graphics.drawq -getBackgroundColor = love.graphics.getBackgroundColor -getBlendMode = love.graphics.getBlendMode -getCaption =love.graphics.getCaption -getColor = love.graphics.getColor -getColorMode = love.graphics.getColorMode -getFont = love.graphics.getFont -getHeight = love.graphics.getHeight -getLineStipple = love.graphics.getLineStipple -getLineStyle = love.graphics.getLineStyle -getLineWidth = love.graphics.getLineWidth -getMaxPointSize = love.graphics.getMaxPointSize -getModes = love.graphics.getModes -getPointSize = love.graphics.getPointSize -getPointStyle = love.graphics.getPointStyle -getScissor = love.graphics.getScissor -getWidth = love.graphics.getWidth -isCreated = love.graphics.isCreated -line = love.graphics.line -newFont = love.graphics.newFont -newFrameBuffer = love.graphics.newFramebuffer -newImage = love.graphics.newImage -newImageFont = love.graphics.newImageFont -newParticleSystem = love.graphics.newParticleSystem -newQuad = love.graphics.newQuad -newScreenshot = love.graphics.newScreenshot -newSpriteBatch = love.graphics.newSpriteBatch -point = love.graphics.point -polygon = love.graphics.polygon -pop = love.graphics.pop -present = love.graphics.present -print = love.graphics.print -printf = love.graphics.printf -push = love.graphics.push -quad = love.graphics.quad -rectagle = love.graphics.rectangle -reset = love.graphics.reset -rotate = love.graphics.rotate -scale = love.graphics.scale -setBackgroundColor = love.graphics.setBackgroundColor -setBlendMode = love.graphics.setBlendMode -setCaption = love.graphics.setCaption -setColor = love.graphics.setColor -setColorMode = love.graphics.setColorMode -setFont = love.graphics.setFont -setIcon = love.graphics.setIcon -setLine = love.graphics.setLine -setLineStipple = love.graphics.setLineStipple -setLineStyle = love.graphics.setLineStyle -setLineWidth = love.graphics.setLineWidth -setMode = love.graphics.setMode -setPoint = love.graphics.setPoint -setPointSize = love.graphics.setPointSize -setPointStyle = love.graphics.setPointStyle -setRenderTarget = love.graphics.setRenderTarget -setScissor = love.graphics.setScissor -toggleFullscreen = love.graphics.toggleFullscreen -translate = love.graphics.translate -triangle = love.graphics.triangle - - - - - - -function color(r, g,b,a) - local color={} - local alpha=a or 255 - local name=r or "azure" - if type(r) == "string" then - alpha = g or alpha - color = x11_color_table[name] - else - color[1]=r - color[2]=g - color[3]=b - end - color[4]=alpha - return color -end - --- clip withing range -function clip(n,min,max) - return math.min(math.max(n, min or -math.huge), max or math.huge) -end - --- wrap within range, updated version -function wrap(n, min, max) - local min = min or 0 - return ((n - min) % ((max or 0) - min)) + min -end - --- setColor white -function white() - love.graphics.setColor(255,255,255,255) -end - --- setColor black -function black() - love.graphics.setColor(0,0,0,255) -end - --- shorter setColor white -function w() - white() -end - --- shorter setColor black -function b() - black() -end - --- fill the screen with translucent black -function clear(alpha) - love.graphics.setColor(0,0,0,alpha) - love.graphics.rectangle("fill", 0,0,800,600) -end - --- shorter clear -function cls(alpha) - clear(alpha) -end - --- one time clear -function cls_once() - love.graphics.setColor(0,0,0,255) - love.graphics.rectangle("fill", 0,0,800,600) -end - - --- returns random values from -1 to 1, g sets the equidistance -function norm_random() - return 2 * math.random() - 1 -end - --- shorte norm_random -function n_rnd() - return norm_random() -end - --- drunk, brownnoise/drunk walk: x = x +/- random(width) -function drunk(x, width, g) - x = x or 0 - width = width or 1 - g = g or 100 - return (x + width*norm_random()) -end - - --- drnk, shorter version of drunk, start is only used the first time --- this makes some sense whatsoever... -function drnk(width) - local last = 0 - return function() - last = last + width * norm_random() - return last - end -end - --- scaling functions: - -function linlin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linlin - - local n=n or 0 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case you forgot the parameters... - return n - end - - if clip == "minmax" then - if n <= inMin then - return minoutMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((n-inMin)/(inMax-inMin)) * (outMax-outMin)) + outMin - return n -end - -function linexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:linexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = math.pow(outMax/outMin, (n-inMin)/(inMax-inMin)) * outMin - return n -end - -function explin(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:explin - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - - -- here is the magic! - n = (((math.log(n/inMin)) / (math.log(inMax/inMin))) * (outMax-outMin)) + outMin - return n -end - -function expexp(n,inMin,inMax,outMin,outMax,clip) - -- ported and adapted from: - -- SuperCollider SimpleNumber:expexp - - local n=n or 0.00001 -- to avoid giving back nil - local clip=clip or "minmax" -- default:clip minmax - - if (inMin == nil) or (inMax == nil) or (outMin == nil) or (outMax == nil) then - -- just in case... - return n - end - - if clip == "minmax" then - if n <= inMin then - return outMin - elseif n >= inMax then - return outMax - end - elseif clip == "min" then - if n <= inMin then - return outMin - end - elseif clip == "max" then - if n >= inMax then - return outMax - end - end - -- here is the magic! - n = math.pow(outMax/outMin, math.log(n/inMin) / math.log(inMax/inMin)) * outMin - return n -end - --- returns easy sine oscillator -function sin() - local x = 0 - return function(dt) - x = x + (dt or 0) - if x > 2 * pi then x = x - 2*pi end - return math.sin(x) - end -end - --- updates all objects in the _object table -function update_objects() - for i,v in ipairs(_internal_object_table) do - v:update(dt) - end -end - --- rotate around center -function rotateCenter(angle) - local angle=angle or 0 - local w, h = getWidth(), getHeight() - translate(w/2, h/2) - rotate(angle) - translate(-w/2, -h/2) -end - --- return a random table entry -function choose(table) - return table[math.random(#table)] -end diff --git a/examples/rotate/LICK/lib/hump/README.md b/examples/rotate/LICK/lib/hump/README.md deleted file mode 100644 index 759c724..0000000 --- a/examples/rotate/LICK/lib/hump/README.md +++ /dev/null @@ -1,48 +0,0 @@ -HUMP - Helper Utilities for Massive Progression -=============================================== - -__HUMP__ is a small collection of tools for developing games with LÖVE. - -Contents: ------------- - -* *vector.lua*: powerful vector class (pure lua) -* *class.lua*: "class" system supporting function inheritance (pure lua) -* *camera.lua*: translate-, zoom- and rotatable camera -* *gamestate.lua*: class to handle gamestates -* *ringbuffer.lua*: a circular container -* *sequence.lua*: utility to handle ingame cutscenes and such - -Documentation -============= - -You can find the documentation here: [http://vrld.github.com/hump/](http://vrld.github.com/hump/ "project page") - - -License -======= -Yay, *free software*: - -> Copyright (c) 2010 Matthias Richter -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in -> all copies or substantial portions of the Software. -> -> Except as contained in this notice, the name(s) of the above copyright holders -> shall not be used in advertising or otherwise to promote the sale, use or -> other dealings in this Software without prior written authorization. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -> THE SOFTWARE. diff --git a/examples/rotate/LICK/lib/hump/camera.lua b/examples/rotate/LICK/lib/hump/camera.lua deleted file mode 100644 index 4bd8d14..0000000 --- a/examples/rotate/LICK/lib/hump/camera.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, require, love = setmetatable, require, love -module(...) -local vector = require(_PACKAGE..'vector') - -local camera = {} -camera.__index = camera - -function new(pos, zoom, rot) - local pos = pos or vector(love.graphics.getWidth(), love.graphics.getHeight()) / 2 - local zoom = zoom or 1 - local rot = rot or 0 - return setmetatable({pos = pos, zoom = zoom, rot = rot}, camera) -end - -function camera:rotate(phi) - self.rot = self.rot + phi -end - -function camera:translate(t) - self.pos = self.pos + t -end -camera.move = camera.translate - -function camera:predraw() - local center = vector(love.graphics.getWidth(), love.graphics.getHeight()) / (self.zoom * 2) - love.graphics.push() - love.graphics.scale(self.zoom) - love.graphics.translate(center:unpack()) - love.graphics.rotate(self.rot) - love.graphics.translate((-self.pos):unpack()) -end - -function camera:postdraw() - love.graphics.pop() -end - -function camera:draw(func) - self:predraw() - func() - self:postdraw() -end - -function camera:toCameraCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = (p - self.pos):rotate_inplace(self.rot) - return vector(p.x * self.zoom + w/2, p.y * self.zoom + h/2) -end - -function camera:toWorldCoords(p) - local w,h = love.graphics.getWidth(), love.graphics.getHeight() - local p = vector((p.x-w/2) / self.zoom, (p.y-h/2) / self.zoom):rotate_inplace(-self.rot) - return p + self.pos -end - -function camera:mousepos() - return self:toWorldCoords(vector(love.mouse.getPosition())) -end - --- camera() as a shortcut to new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/rotate/LICK/lib/hump/class.lua b/examples/rotate/LICK/lib/hump/class.lua deleted file mode 100644 index 2b014b9..0000000 --- a/examples/rotate/LICK/lib/hump/class.lua +++ /dev/null @@ -1,82 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local type, assert, pairs = type, assert, pairs -local tostring, string_format = tostring, string.format -module(...) - -local function __NULL__() end -function new(constructor) - -- check name and constructor - local name = '' - if type(constructor) == "table" then - if constructor.name then name = constructor.name end - constructor = constructor[1] - end - assert(not constructor or type(constructor) == "function", - string_format('%s: constructor has to be nil or a function', name)) - - -- build class - local c = {} - c.__index = c - c.__tostring = function() return string_format("", name) end - c.construct = constructor or __NULL__ - c.Construct = constructor or __NULL__ - c.inherit = inherit - c.Inherit = inherit - - local meta = { - __call = function(self, ...) - local obj = {} - self.construct(obj, ...) - return setmetatable(obj, self) - end, - __tostring = function() return tostring(name) end - } - - return setmetatable(c, meta) -end - -function inherit(class, interface, ...) - if not interface then return end - - -- __index and construct are not overwritten as for them class[name] is defined - for name, func in pairs(interface) do - if not class[name] and type(func) == "function" then - class[name] = func - end - end - - inherit(class, ...) -end - --- class() as shortcut to class.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/rotate/LICK/lib/hump/gamestate.lua b/examples/rotate/LICK/lib/hump/gamestate.lua deleted file mode 100644 index 746f81b..0000000 --- a/examples/rotate/LICK/lib/hump/gamestate.lua +++ /dev/null @@ -1,154 +0,0 @@ ---[[ -Copyright (c) 2010-2011 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local error, assert, love = error, assert, love -module(...) - -local function __NULL__() end --- default gamestate produces error on every callback -local function __ERROR__() error("Gamestate not initialized. Use Gamestate.switch()") end -current = { - enter = __ERROR__, - leave = __NULL__, - update = __ERROR__, - draw = __ERROR__, - focus = __ERROR__, - keyreleased = __ERROR__, - keypressed = __ERROR__, - mousepressed = __ERROR__, - mousereleased = __ERROR__, - joystickpressed = __ERROR__, - joystickreleased = __ERROR__, - quit = __ERROR__, -} - -function new() - return { - enter = __NULL__, - leave = __NULL__, - update = __NULL__, - draw = __NULL__, - focus = __NULL__, - keyreleased = __NULL__, - keypressed = __NULL__, - mousepressed = __NULL__, - mousereleased = __NULL__, - joystickpressed = __NULL__, - joystickreleased = __NULL__, - quit = __NULL__, - } -end - -function switch(to, ...) - assert(to, "Missing argument: Gamestate to switch to") - current:leave() - local pre = current - current = to - return current:enter(pre, ...) -end - -local _update -function update(...) - if _update then _update(...) end - return current:update(...) -end - -local _draw -function draw(...) - if _draw then _draw(...) end - return current:draw(...) -end - -local _focus -function focus(...) - if _focus then _focus(...) end - return current:focus(...) -end - -local _keypressed -function keypressed(...) - if _keypressed then _keypressed(...) end - return current:keypressed(...) -end - -local _keyreleased -function keyreleased(...) - if _keyreleased then _keyreleased(...) end - return current:keyreleased(...) -end - -local _mousepressed -function mousepressed(...) - if _mousereleased then _mousepressed(...) end - return current:mousepressed(...) -end - -local _mousereleased -function mousereleased(...) - if _mousereleased then _mousereleased(...) end - return current:mousereleased(...) -end - -local _joystickpressed -function joystickpressed(...) - if _joystickpressed then _joystickpressed(...) end - return current:joystickpressed(...) -end - -local _joystickreleased -function joystickreleased(...) - if _joystickreleased then _joystickreleased(...) end - return current:joystickreleased(...) -end - -local _quit -function quit(...) - if _quit then _quit(...) end - return current:quit(...) -end - -function registerEvents() - _update = love.update - love.update = update - _draw = love.draw - love.draw = draw - _focus = love.focus - love.focus = focus - _keypressed = love.keypressed - love.keypressed = keypressed - _keyreleased = love.keyreleased - love.keyreleased = keyreleased - _mousepressed = love.mousepressed - love.mousepressed = mousepressed - _mousereleased = love.mousereleased - love.mousereleased = mousereleased - _joystickpressed = love.joystickpressed - love.joystickpressed = joystickpressed - _joystickreleased = love.joystickreleased - love.joystickreleased = joystickreleased - _quit = love.quit - love.quit = quit -end diff --git a/examples/rotate/LICK/lib/hump/ringbuffer.lua b/examples/rotate/LICK/lib/hump/ringbuffer.lua deleted file mode 100644 index 2b2b3cb..0000000 --- a/examples/rotate/LICK/lib/hump/ringbuffer.lua +++ /dev/null @@ -1,99 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable, table = setmetatable, getmetatable, table -module(...) -local ringbuffer = {} -ringbuffer.__index = ringbuffer - -function new(...) - local rb = {} - rb.items = {...} - rb.current = 1 - return setmetatable(rb, ringbuffer) -end - -function ringbuffer:insert(item, ...) - if not item then return end - -- insert rest before self so order is restored, e.g.: - -- {1,<2>,3}:insert(4,5) -> {1,<2>,3}:insert(5) -> {1,<2>,5,3} -> {1,<2>,4,5,3} - self:insert(...) - table.insert(self.items, self.current+1, item) -end - -function ringbuffer:append(item, ...) - if not item then return end - self.items[#self.items+1] = item - return self:append(...) -end - -function ringbuffer:removeAt(k) - -- wrap position - local pos = (self.current + k) % #self.items - while pos < 1 do pos = pos + #self.items end - - -- remove item - local item = table.remove(self.items, pos) - - -- possibly adjust current pointer - if pos < self.current then self.current = self.current - 1 end - if self.current > #self.items then self.current = 1 end - - -- return item - return item -end - -function ringbuffer:remove() - return table.remove(self.items, self.current) -end - -function ringbuffer:get() - return self.items[self.current] -end - -function ringbuffer:size() - return #self.items -end - -function ringbuffer:next() - self.current = (self.current % #self.items) + 1 - return self:get() -end - -function ringbuffer:prev() - self.current = self.current - 1 - if self.current < 1 then - self.current = #self.items - end - return self:get() -end - --- Ringbuffer() as a shortcut to Ringbuffer.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/rotate/LICK/lib/hump/timer.lua b/examples/rotate/LICK/lib/hump/timer.lua deleted file mode 100644 index 2ce460d..0000000 --- a/examples/rotate/LICK/lib/hump/timer.lua +++ /dev/null @@ -1,83 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local assert, type = assert, type -local pairs, ipairs = pairs, ipairs -local min = math.min -module(...) - -functions = {} -function update(dt) - local to_remove = {} - for func, delay in pairs(functions) do - delay = delay - dt - if delay <= 0 then - to_remove[#to_remove+1] = func - else - functions[func] = delay - end - end - for _,func in ipairs(to_remove) do - functions[func] = nil - func(func) - end -end - -function add(delay, func) - assert(type(func) == "function", "second argument needs to be a function") - functions[func] = delay -end - -function addPeriodic(delay, func, count) - assert(type(func) == "function", "second argument needs to be a function") - if count then - return add(delay, function(f) func(func) count = count - 1 if count > 0 then add(delay, f) end end) - end - return add(delay, function(f) func(func) add(delay, f) end) -end - -function clear() - functions = {} -end - -function Interpolator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - return t <= length and func((t-dt)/length, ...) or nil - end -end - -function Oscillator(length, func) - assert(type(func) == "function", "second argument needs to be a function") - local t = 0 - return function(dt, ...) - t = t + dt - while t > length do t = t - length end - return func(t/length, ...) - end -end diff --git a/examples/rotate/LICK/lib/hump/vector.lua b/examples/rotate/LICK/lib/hump/vector.lua deleted file mode 100644 index b84f948..0000000 --- a/examples/rotate/LICK/lib/hump/vector.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ -Copyright (c) 2010 Matthias Richter - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -Except as contained in this notice, the name(s) of the above copyright holders -shall not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -]]-- - -local setmetatable, getmetatable = setmetatable, getmetatable -local assert, type, tonumber = assert, type, tonumber -local sqrt, cos, sin = math.sqrt, math.cos, math.sin -module(...) - -local vector = {} -vector.__index = vector - -function new(x,y) - local v = {x = x or 0, y = y or 0} - setmetatable(v, vector) - return v -end - -function isvector(v) - return getmetatable(v) == vector -end - -function vector:clone() - return new(self.x, self.y) -end - -function vector:unpack() - return self.x, self.y -end - -function vector:__tostring() - return "("..tonumber(self.x)..","..tonumber(self.y)..")" -end - -function vector.__unm(a) - return new(-a.x, -a.y) -end - -function vector.__add(a,b) - assert(isvector(a) and isvector(b), "Add: wrong argument types ( expected)") - return new(a.x+b.x, a.y+b.y) -end - -function vector.__sub(a,b) - assert(isvector(a) and isvector(b), "Sub: wrong argument types ( expected)") - return new(a.x-b.x, a.y-b.y) -end - -function vector.__mul(a,b) - if type(a) == "number" then - return new(a*b.x, a*b.y) - elseif type(b) == "number" then - return new(b*a.x, b*a.y) - else - assert(isvector(a) and isvector(b), "Mul: wrong argument types ( or expected)") - return a.x*b.x + a.y*b.y - end -end - -function vector.__div(a,b) - assert(isvector(a) and type(b) == "number", "wrong argument types (expected / )") - return new(a.x / b, a.y / b) -end - -function vector.__eq(a,b) - return a.x == b.x and a.y == b.y -end - -function vector.__lt(a,b) - return a.x < b.x or (a.x == b.x and a.y < b.y) -end - -function vector.__le(a,b) - return a.x <= b.x and a.y <= b.y -end - -function vector.permul(a,b) - assert(isvector(a) and isvector(b), "permul: wrong argument types ( expected)") - return new(a.x*b.x, a.y*b.y) -end - -function vector:len2() - return self * self -end - -function vector:len() - return sqrt(self*self) -end - -function vector.dist(a, b) - assert(isvector(a) and isvector(b), "dist: wrong argument types ( expected)") - return (b-a):len() -end - -function vector:normalize_inplace() - local l = self:len() - self.x, self.y = self.x / l, self.y / l - return self -end - -function vector:normalized() - return self / self:len() -end - -function vector:rotate_inplace(phi) - local c, s = cos(phi), sin(phi) - self.x, self.y = c * self.x - s * self.y, s * self.x + c * self.y - return self -end - -function vector:rotated(phi) - return self:clone():rotate_inplace(phi) -end - -function vector:perpendicular() - return new(-self.y, self.x) -end - -function vector:projectOn(v) - assert(isvector(v), "invalid argument: cannot project onto anything other than a new.") - return (self * v) * v / v:len2() -end - -function vector:cross(other) - assert(isvector(other), "cross: wrong argument types ( expected)") - return self.x * other.y - self.y * other.x -end - --- vector() as shortcut to vector.new() -do - local m = {} - m.__call = function(_, ...) return new(...) end - setmetatable(_M, m) -end diff --git a/examples/rotate/LICK/lib/images/circle.png b/examples/rotate/LICK/lib/images/circle.png deleted file mode 100755 index 8f9ac298933bf58968999f36cefb08dc3d6db2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 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 QVE_OC07*qoM6N<$f~Wjp+5i9m diff --git a/examples/rotate/LICK/lib/images/holger.png b/examples/rotate/LICK/lib/images/holger.png deleted file mode 100755 index 7e78b87226d0b368fe2d05941677a0b9119b2d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9945 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

>$y9lIvA!1##Q};vU!jjQNqnKA-NSS~y2H9t{ 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 Hu0mjfVRhi| diff --git a/examples/rotate/LICK/lib/images/spiral2.png b/examples/rotate/LICK/lib/images/spiral2.png deleted file mode 100755 index d7b9627786701053779e76ece6b0687bbe71de9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17174 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 diff --git a/examples/rotate/LICK/lib/images/star.png b/examples/rotate/LICK/lib/images/star.png deleted file mode 100755 index 85395e81de310b7b5af0dc3f68dcb48e6718712d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -local socket = require "socket" -local base = _G -local string = require("string") -local vstruct = require "LICK/lib/loveosc/vstruct" -local pack = vstruct.pack -local upack = vstruct.unpack - --------------------------------- --- some constants --------------------------------- - -osc.client = {} -osc.client.host = "localhost" -osc.client.port = 57110 -osc.client.timeout = 0 - -PROTOCOL = "OSC/1.0" - -ADJUSTMENT_FACTOR = 2208988800 - -IMMEDIATE = string.rep('0', 31) .. '1' - - -function osc.client:send( data ) - local ip, port = assert(socket.dns.toip(osc.client.host)), osc.client.port - -- create a new UDP object - local udp = assert(socket.udp()) - udp:settimeout(0) - - --print(encode(data)) - assert(udp:sendto(encode(data), ip, port), "could not send data") - --assert(udp:sendto(data, ip, port), "could not send data") - - -- retrieve the answer and print results, warning: crashes love - --print(udp:receive() or "") -end - - --------------------------------- --- interface functions: --- decode(string) --- and encode(table) --------------------------------- - -function decode(data) - if #data == 0 then - return nil - end - if string.match(data, "^#bundle") then - return decode_bundle(data) - else - return decode_message(data) - end -end - - -function encode(data) - local msg = "" - local idx = 1 - if data == nil then - return nil - end - - if data[1] == "#bundle" then - msg = msg .. encode_string(data[1]) - --print("1 "..msg.."\n") - msg = msg .. encode_timetag(data[2]) - --print("2 "..msg.."\n") - idx = 3 - while idx <= #data do - local submsg = encode(data[idx]) - msg = msg .. encode_int(#submsg) .. submsg - --print(idx.." "..submsg.."\n") - idx = idx + 1 - end - return msg - else - local typestring = "," - local encodings = "" - idx = idx + 1 - msg = msg .. encode_string(data[1]) - for t, d in iter_pairwise(data, idx) do - typestring = typestring .. t - encodings = encodings .. collect_encoding_for_message(t, d) - end - --print("else "..msg..encode_string(typestring) .. encodings.."\n") - - return msg .. encode_string(typestring) .. encodings - end -end - - --------------------------------- --- auxilliary functions --------------------------------- - -digits = {} -for i=0,9 do digits[i] = string.char(string.byte('0')+i) end -for i=10,36 do digits[i] = string.char(string.byte('A')+i-10) end - -function numberstring(number, bas) - local s = "" - repeat - local remainder = base.math.mod(number,bas) - s = digits[remainder]..s - number = (number-remainder)/bas - until number==0 - return s -end - - -function next_string(astring) - -- this is a workaraound because the lua pttern matching is - -- not as powerful as pcre and I did not want to include another - -- dependecy to an external re lib - local pos = 0 - local num_nzero = 0 - local num_zero = 0 - local result = "" - if astring == nil then - -- ensure that string is not empty - base.error("error: string is empty - probably malformated message") - end - -- we match every character with the help of gmatch - for m in string.gmatch(astring, ".") do - pos = pos + 1 - -- and then check if it is correctly padded with '\0's - if m ~= '\0' and num_zero == 0 then - num_nzero = (num_nzero + 1) % 4 - result = result .. m - elseif num_zero ~= 0 and (num_zero + num_nzero) % 4 == 0 then - return result, pos - elseif m == '\0' then - num_zero = num_zero + 1 - result = result .. m - else - return nil - end - end -end - -function iter_pairwise(atable, startvalue) - local index = startvalue - 2 - return function() - index = index + 2 - return atable[index], atable[index+1] - end -end - -function collect_encoding_for_message(t, data) - if t == 'i' then - return encode_int(data) - elseif t == 'f' then - return encode_float(data) - elseif t == 's' then - return encode_string(data) - elseif t == 'b' then - return encode_blob(data) - end -end - -function collect_decoding_from_message(t, data, message) - table.insert(message, t) - if t == 'i' then - table.insert(message, decode_int(data)) - return string.sub(data, 5) - elseif t == 'f' then - table.insert(message, decode_float(data)) - return string.sub(data, 5) - elseif t == 's' then - local match, last = next_string(data) - table.insert(message, match) - return string.sub(data, last) - elseif t == 'b' then - local length = decode_int(data) - table.insert(message, string.sub(data, 4, length)) - return string.sub(data, 4 + length + 1) - end -end - -function get_addr_from_data(data) - local addr_raw_string,last = next_string(data) - local result = "" - if addr_raw_string == nil then - -- if we could not find an addr something went wrong - base.error("error: could not extract address from OSC message") - end - -- delete possible trailing zeros - for t in string.gmatch(addr_raw_string, "[^%z]") do - result = result .. t - end - return result, string.sub(data, last) -end - -function get_types_from_data(data) - local typestring, last = next_string(data) - local result = {} - if typestring == nil then - return {} - end - -- split typestring into an iterable table - for t in string.gmatch(typestring, "[^,%z]") do - table.insert(result, t) - end - return result, string.sub(data, last) -end - --------------------------------- --- decoding functions --------------------------------- - -function decode_message(data) - local types, addr, tmp_data = nil - local message = {} - addr, tmp_data = get_addr_from_data(data) - types, tmp_data = get_types_from_data(tmp_data) - -- ensure that we at least found something - if addr == nil or types == nil then - return nil - end - for _,t in base.ipairs(types) do - tmp_data = collect_decoding_from_message(t, tmp_data, message) - end - return message -end - - -function decode_bundle(data) - local match, last = next_string(data) - local tmp_data = nil - local msg = {} - local sec, frac - -- skip first string data since it will only contian #bundle - tmp_data = string.sub(data, 9) - -- check that there is a part of the message left - if not tmp_data then - return nil - end - table.insert(msg, "#bundle") - _, sec, frac = upack("> u4 > u4", {string.sub(tmp_data, 1, 8)}) - -- note this is an awful way of decoding to a bin string and - -- then decoding the frac again TODO: make this nicer - frac = numberstring(frac, 2) - if sec == 0 and frac == IMMEDIATE then - table.insert(msg, 0) - else - table.insert(msg, sec - ADJUSTMENT_FACTOR + decode_frac(frac) ) - end - tmp_data = string.sub(tmp_data, 9) - while #tmp_data > 0 do - local length = decode_int(string.sub(tmp_data,1,4)) - table.insert(msg, decode(string.sub(tmp_data, 5, 4 + length))) - tmp_data = string.sub(tmp_data, 9 + length) - end - return msg -end - -function decode_frac(bin) - local frac = 0 - for i=#bin,1 do - frac = (frac + string.sub(bin, i-1, i)) / 2 - end - return frac -end - -function decode_float(bin) - local pos, res = upack("> f4", {bin}) - return res -end - -function decode_int(bin) - local pos, res = upack("> i4", {bin} ) - return res -end - --------------------------------- --- encoding --------------------------------- - -function encode_string(astring) - local fillbits = (4 - #astring % 4) - return astring .. string.rep('\0', fillbits) -end - -function encode_int(num) - return pack("> i4",{ num }) -end - -function encode_blob(blob) - return encode_int(#blob) .. encode_string(#blob) -end - -function encode_timetag(tpoint) - if tpoint == 0 then - return IMMEDIATE - else - local sec = math.floor(tpoint) - local frac = tpoint - sec - - return pack("> u4 > u4", {sec + ADJUSTMENT_FACTOR , encode_frac(frac)}) - - end -end - - - -function encode_frac(num) - local bin = "" - local frac = num - while #bin < 32 do - bin = bin .. base.math.floor(frac * 2) - frac = (frac * 2) - base.math.floor(frac * 2) - end - return bin -end - -function encode_float(num) - return pack("> f4", {num}) -end diff --git a/examples/rotate/LICK/lib/loveosc/init.lua b/examples/rotate/LICK/lib/loveosc/init.lua deleted file mode 100644 index d7f0bfb..0000000 --- a/examples/rotate/LICK/lib/loveosc/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -osc = {} -require "LICK/lib/loveosc/client" -require "LICK/lib/loveosc/server" diff --git a/examples/rotate/LICK/lib/loveosc/server.lua b/examples/rotate/LICK/lib/loveosc/server.lua deleted file mode 100644 index 3a9a93f..0000000 --- a/examples/rotate/LICK/lib/loveosc/server.lua +++ /dev/null @@ -1,81 +0,0 @@ ---[[ - -- luaosc Copyright (C) 2009 Jost Tobias Springenberg -- - - This file is part of luaosc. - - luaosc is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - luaosc is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Foobar. If not, see . ---]] - --- This is a luaOSC Fork from Jost Tobias Springenberg, additional code and modifications by Tilmann Hars, Headchant.com, Copyright 2010 - -require "socket" - -osc.server = {} -osc.server.host = "localhost" -osc.server.port = 7771 -osc.server.socket = socket.udp() or error('error could not create lua socket object') -osc.server.socket:setsockname(osc.server.host, osc.server.port) -osc.server.socket:settimeout(0) - --- call this in LÖVE update -function osc.server:update(dt) - - local message, from = osc.server.socket:receive(1024) - -- invoke handler function - if message ~= nil then - local success, result = pcall(decode, message) - if not success then - print("Error in decoding: \n" .. result) - else - success, result = pcall(handle, from, result) - if not success then - print("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - -end - - --- use this to start the server in lua only (not with LÖVE!) -function osc.server:start() - local length = 1024 - while 1 do - local message, from = self.socket:receivefrom(1024) - -- invoke handler function - if message ~= nil then - local success, result = base.pcall(osc.decode, message) - if not success then - base.io.stderr:write("Error in decoding: \n" .. result) - else - success, result = base.pcall(self.handle, from, result) - if not success then - base.io.stderr:write("Error in your handler function: \n" .. result) - end - end - end - if message == "exit" then - return - end - end - end - - - -function osc.server:setHandler(hdle) - handle = hdle -end diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/CHANGES b/examples/rotate/LICK/lib/loveosc/vstruct/CHANGES deleted file mode 100755 index ea42ce0..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/CHANGES +++ /dev/null @@ -1,30 +0,0 @@ -1.0 ---- -Bugfixes to read error handling -Ability to return unpacked values rather than tables - -1.0 beta 4 ----------- -Added the ability to say 's' with no width to read until EOF. -Modified struct.unpack and struct.pack to return the number of bytes -read/written as a second value. Note that this is not the same as the r/w -pointer delta if seeks are involved. - -1.0 beta 3 ----------- -Lots of bugfixing and general cleanup -Improved error reporting -API name changes - -1.0 beta 2 ----------- -Added the counted string format "c". -Added float and double support, courtesy of Peter "Corsix" Cawley. -Updated the test framework. -Fixed a bug in format m that could result in data loss when manipulating fields -of 7 bytes or more width. - - -1.0 beta 1 ----------- -Released to the world. diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/COPYING b/examples/rotate/LICK/lib/loveosc/vstruct/COPYING deleted file mode 100755 index 430bce8..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright 2008 Ben "ToxicFrog" Kelly -FP module copyright 2008 Peter "Corsix" Cawley - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/README b/examples/rotate/LICK/lib/loveosc/vstruct/README deleted file mode 100755 index e274888..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/README +++ /dev/null @@ -1,290 +0,0 @@ -Contents -======== -1. Overview -2. API -3. Warning! -4. The Format String - Naming - Grouping - Repetition -5. Format Specifiers -6. Credits - - -1. Overview -=========== -VStruct is a library for Lua 5.1. It provides functions for manipulating binary -data, in particular for unpacking binary files or byte buffers into Lua values -and for packing Lua values back into files or buffers. Supported data types -include: - - signed and unsigned integers of arbitrary byte width - - booleans and bitmasks - - plain and null-terminated strings - - fixed and floating point reals (the latter requires C module support) -In addition, the library supports seeking, alignment, and byte order controls, -repetition, grouping of data into tables, and naming of values within tables. - - - -2. API -====== -exports: - vstruct.pack(fmt, [fd], data) - vstruct.unpack(fmt, , [unpacked]) - vstruct.explode(int) - vstruct.implode(table) - vstruct.cursor(string) - vstruct.compile.read(format) - vstruct.compile.write(format) - -pack takes a format string and a table of data and packs the contents into a -buffer. If the fd argument is present, it will write the data directly to it -using standard file io methods (write and seek), and return the fd; otherwise -it will construct and return a string. In either case it also returns (as a -second value) the number of bytes written - note that if the format involved -seeks, this is not the same as the amount by which the write pointer moved -or the size of the packed string. - -unpack takes a format string and a buffer or file to unpack from, and returns -the unpacked data as a table. It also returns (as a second value) the number of -bytes read - note that if the format string involved seeks, this is not the same -as the difference between read pointer positions. If the _unpacked_ argument is -true, it will return the unpacked data as a series of values rather than as a -table, equivalent to using the standard Lua function unpack() on the return -value. Note that this means it will not return the number of bytes read as an -additional value. - -explode converts a bitmask into a list of booleans, and implode does the -converse. In such lists, list[1] is the least significant bit, and list[n] the -most significant. - -cursor wraps a string in something that looks, at first glance, like a file. -This permits strings to be wrapped and passed to the vstruct IO functions. The -wrapped string supports :seek, and has limited support for :read (the only -supported calling mode is :read(num_bytes)) and :write (as :write(buffer)). - -compile.read takes a format string and returns a function, which can later be -passed a file (or file-like object - see vstruct.cursor) to perform a read -operation. In effect, the following code: - f = vstruct.compile.read(fmt) - d = f(fd) -Is equivalent to: - d = vstruct.unpack(fd, fmt) -f can of course be called repeatedly, with different or the same fds each time. - -compile.write is the converse of compile.read. The emitted function expects a -file and a table of data elements, so that: - f = vstruct.compile.write(fmt) - f(fd, data) -Is equivalent to: - vstruct.pack(fd, fmt, data) -As with compile.read, the emitted function is fully re-usable. - - -3. Warning! -=========== -When reading and writing numeric formats, vstruct is inherently limited by lua's -number format, which is by default the IEEE 754 double. What this means in -practice is that formats cipPu may be subject to data loss when read in widths -of 7 bytes or more, if they contain more than 52 significant bits. (The same is -true of numeric constants declared in Lua itself, of course, and other libraries -which store values in lua numbers). -Formats bfmsxz are unaffected by this, as they either do not use lua numbers or -are guaranteed to fit inside them. - -4. The Format String -==================== -The format string contains any number of endianness controls, seek controls, -format specifiers, and grouping/naming sequences, seperated by whitespace, -commas, or semicolons (or any mix thereof, although you are encouraged to choose -one and stick to it for the sake of consistency). Each of these is detailed -below. - -In the documentation below, the convention is that A represents an address and W -a width in bytes. At present only base-10 numerals are supported. - - -Naming ------- -Under normal operation, when unpacking, the library simply stores unpacked -values sequentially into a list, which is returned. Similarly, when packing, it -expects a list of values which will be packed in order. However, values can be -named, in which case the unpacked value will be stored in a field with that -name, and when packing, it will use the value stored with that key. This is done -by prefixing the format specifier with the name (which can be any sequence of -letters, numbers, and _, provided it does not start with a number) followed by a -':'. For example, the following format would generate a table with three keys, -'x', 'y', and 'z': - "x:u4 y:u4 z:u4" -And, when packing, would expect a table with those three keys and store their -corresponding values. - -If the same name is specified multiple times, or is combined with repetition -(see below), only the last read value is stored there. - -Named and anonymous values can be freely mixed; the named values will be -assigned to their given fields and the anonymous ones to sequential indices. - -Grouping --------- -Rather than generating or expecting a flat table, the library can be instructed to -create or read from a table containing subtables. This is done by surrounding the -group of values you wish to be packed with '{' and '}' in the format string. For example, -the following format string: - "{ u4 i4 } { s32 u4 }" -Would, rather than generating a list of four values, generate a list containing two -lists of two values each. -Similarly, when packing, it would expect not a flat list, but a list of sublists, from -which the values to be packed will be drawn. - -Groups can be named, so formats like: - "flags:m1 coords:{ x:u4 y:u4 z:u4 }" -Are permitted and meaningful. - - -Repetition ----------- -A {} group can be repeated by prefixing or suffixing it with a count, seperated -from the group by a '*'. For example: - "4 * { u4 }" - "{ u4 } * 4" - "{ u4 } { u4 } { u4 } { u4 }" -Are all equivalent. Note that the whitespace in the above examples is optional. -In cases where you want to repeat format specifiers without implying a grouping, -you can use (). For example: - "4 * (u4 b1)" -Is equivalent to: - "u4 b1 u4 b1 u4 b1 u4" -Like grouping, these can be nested. - - -5. Format Specifiers -==================== - -Endianness Controls -------------------- -The formats i, m, and u are affected by the endianness setting, which controls -the order in which bytes are read and written within a field. The following -characters in a format string adjust the endianness setting: - -< - Sets the endianness to little-endian (eg, Intel processors) -> - Sets the endianness to big-endian (eg, PPC and Motorola processors) -= - Sets the endianness to the native endianness. - - -Seek Controls -------------- -These characters are used to seek to specific locations in the input or output. -Note that they only work on buffers or file-like objects that support the seek() -method; for streams which cannot be sought on, use the 'x' (skip/null-pad) -data format instead. - -@A - Seek to absolute address A. -+A - Seek forward A bytes. --A - Seek backwards A bytes. -aW - Align to word width W (ie, seek to the next address which is a multiple of W) - - -Data Format Specifiers ----------------------- -bW Boolean. - Read: as uW, but returns true if the result is non-zero and false otherwise. - Write: as uW with input 1 if true and 0 otherwise. - -cW Counted string. - Read: uW to determine the length of the string W', followed by sW'. - Write: the length of the string as uW, followed by the string itself. - The counted string is a common idiom where a string is immediately prefixed - with its length, as in: - size_t len; - char[] str; - The counted string format can be used to easily read and write these. The - width provided is the width of the len field, which is treated as an - unsigned int. Only the string itself is returned (when unpacking) or - required (when packing). - The len field is affected by endianness, as in format u. - -fW IEEE 754 floating point. - Valid widths are 4 (float) and 8 (double). No quads yet, sorry! - Affected by endianness. - -iW Signed integer. - Read: a signed integer of width W bytes. - Write: a signed integer of width W bytes. - Floating point values will be truncated. - Affected by endianness. - -mW Bitmask. - Read: as uW, but explodes the result into a list of booleans, one per bit. - Write: implodes the input value, then writes it as uW. - Affected by endianness. - See also: vstruct.implode, vstruct.explode. - -pW Signed fixed point rational. - Width is in the format "I.F"; the value before the dot is the number of - bytes in the integer part, and the value after, in the fractional part. - Read: a fixed point rational of I+F bytes. - Write: a fixed point rational of I+F bytes. Values which cannot be exactly - represented in the specified width are truncated. - Affected by endianness. - -PW Signed fixed point rational with bit-aligned subfields - Equivalent to pW, except that the decimal point does not need to be byte - aligned; for example, formats such as P20.12 are possible. - Note that underlying reads must still occur in byte multiples. Using a W - such that I+F is not a multiple of 8 is an error. - -sW String. - Read: reads exactly W bytes and returns them as a string. If W is omitted, - reads until EOF. - Write: - If W is omitted, uses the string length. - If W is shorter than the string length, truncates the string. - If W is greater than the string length, null pads the string. - -uW Unsigned integer. - Read: an unsigned integer of width W bytes. - Write: an unsigned integer of width W bytes. - Floating point values will be truncated. - Negative values will be taken absolute. - Affected by endianness. - -xW Skip/pad. - Read: read and discard the next W bytes. - Write: write W zero bytes. - -zW Null terminated string. - Read: reads exactly W bytes. Returns everything up to the first zero byte. - If W is omitted, reads up to the next zero byte. - Write: writes exactly W bytes. - If the input is shorter than W, zero pads the output. - If as long or longer, truncates to W-1 and writes a zero byte at the end. - If W is omitted, uses the string length plus one (ie, writes the string - out entire and then null terminates it). - - - -6. Credits -========== - While most of the library code was written by me (Ben Kelly), the existence -of this library owes itself to many others: - The floating point code was contributed by Peter Cawley on lua-l. - The original inspiration came from Roberto Ierusalimschy's "struct" library -and Luiz Henrique de Figueiredo's "lpack" library, as well as the "struct" -available in Python. - sanooj, from #lua, has done so much testing and bug reporting that at this -point he's practically a co-author. - The overall library design and interface are the result of much discussion -with rici, sanooj, Keffo, snogglethorpe, Spark, kozure, Vornicus, McMartin, and -probably several others I've forgotten about on IRC (#lua on freenode and #code -on nightstar). - Finally, without Looking Glass Studios to make System Shock, and Team TSSHP -(in particular Jim "hairyjim" Cameron) to reverse engineer it, I wouldn't have -had a reason to write this library in the first place. diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/common.lua b/examples/rotate/LICK/lib/loveosc/vstruct/common.lua deleted file mode 100755 index 841b5c1..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/common.lua +++ /dev/null @@ -1,48 +0,0 @@ --- shared formats - seeking, endianness --- these should all return nil so that they do not mutate the data list --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local common = {} - --- determine if the host system is big-endian or not, by dumping an empty --- function and looking at the endianness flag --- this is kind of hackish -local function bigendian() - return string.byte(string.dump(function() end)) == string.char(0x00) -end -common.is_bigendian = bigendian() - --- seek controls -function common.seekto(fd, w) - fd:seek("set", w) -end - -function common.seekforward(fd, w) - fd:seek("cur", w) -end - -function common.seekback(fd, w) - fd:seek("cur", -w) -end - -function common.a(fd,w) - local a = fd:seek() - if a % w ~= 0 then - fd:seek("cur", w - (a % w)) - end -end - --- endianness controls -function common.littleendian(fd, w) - common.is_bigendian = false -end - -function common.bigendian(fd, w) - common.is_bigendian = true -end - -function common.hostendian(fd, w) - common.is_bigendian = bigendian() -end - -return common diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/compile.lua b/examples/rotate/LICK/lib/loveosc/vstruct/compile.lua deleted file mode 100755 index 942f743..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/compile.lua +++ /dev/null @@ -1,134 +0,0 @@ --- functions for turning a format string into a callable function --- they work by calling parse(), passing it the format string and --- a table of code generators appropriate for whether we are reading --- or writing. --- The resulting code is then prefixed with some setup code and postfixed --- with a return value and loadstring() is called on it to generate a function --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local require,loadstring,setfenv,type,select,unpack,setmetatable - = require,loadstring,setfenv,type,select,unpack,setmetatable - -local print,assert,error,xpcall,pairs,where - = print,assert,error,xpcall,pairs,debug.traceback - -module((...)) - -local parse = require(_PACKAGE.."parser") - -local function nulsafe_error(s) - return error(s:gsub('%z', '_')) -end - -local function xpcall2(f, err, ...) - local args = {n=select('#', ...), ...} - return xpcall(function() return f(unpack(args, 1, args.n)) end, err) -end - -local function err_generate(message, format, trace) - nulsafe_error([[ -struct: internal error in code generator -This is an internal error in the struct library -Please report it as a bug and include the following information: --- error message -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function err_compile(message, format, source) - nulsafe_error([[ -struct: syntax error in emitted lua source -This is an internal error in the struct library -Please report it as a bug and include the following information: --- loadstring error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]) -end - -local function err_execute(message, format, source, trace) - nulsafe_error([[ -struct: runtime error in generated function -This is at some level an internal error in the struct library -It could be a genuine error in the emitted code (in which case this is a code -generation bug) -Alternately, it could be that you gave it a malformed format string, a bad -file descriptor, or data that does not match the given format (in which case -it is an argument validation bug and you should be getting an error anyways). -Please report this as a bug and include the following information: --- execution error -]]..message.."\n\n"..[[ --- format string -]]..format.."\n\n"..[[ --- emitted source -]]..source.."\n\n"..[[ --- stack trace -]]..trace) -end - -local function compile(format, gen, env) - local status,source = xpcall(function() - return parse(format, gen, true) - end, - function(message) - return { message, where("",2) } - end) - - if not status then - if type(source[1]) == "function" then - error(source[1]()..source[2]) - end - err_generate(source[1], format, source[2]) - end - - local fn,err = loadstring(source) - - if not fn then - err_compile(err, format, source) - end - - setfenv(fn, env) - - local fn = function(...) - local status,ret,len = xpcall2(fn, function(message) - return { message, where("",2) } - end, ...) - - -- call succeeded without errors - if status then return ret,len end - - local message,where = ret[1],ret[2] - - -- call generated a deliberate error; call the provided closure - -- it will either emit an error code or re-throw - if type(message) == "function" then return nil,message() end - - -- call generated an internal error; re-throw with extra debug info - err_execute(message, format, source, where) - end - - return fn -end - -local gen_unpack = require(_PACKAGE.."gen_unpack") -local io_unpack = require(_PACKAGE.."io_unpack") - -function _M.unpack(format) - return compile(format, gen_unpack, io_unpack) -end - -local gen_pack = require(_PACKAGE.."gen_pack") -local io_pack = require(_PACKAGE.."io_pack") - -function _M.pack(format) - return compile(format, gen_pack, io_pack) -end - -return _M diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/cursor.lua b/examples/rotate/LICK/lib/loveosc/vstruct/cursor.lua deleted file mode 100755 index cd913af..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/cursor.lua +++ /dev/null @@ -1,80 +0,0 @@ --- cursor - a wrapper for strings that makes them look like files --- exports: seek read write --- read only supports numeric amounts --- Copyright 2008 Ben "ToxicFrog" Kelly; see COPYING - -local cursor = {} - --- like fseek --- seeking past the end of the string is permitted --- reads will return EOF, writes will fill in the intermediate space with nuls --- seeking past the start of the string is a soft error -function cursor:seek(whence, offset) - whence = whence or "cur" - offset = offset or 0 - - if whence == "set" then - self.pos = offset - elseif whence == "cur" then - self.pos = self.pos + offset - elseif whence == "end" then - self.pos = #self.str + offset - else - error "bad argument #1 to seek" - end - - if self.pos < 0 then - self.pos = 0 - return nil,"attempt to seek prior to start of file" - end - - return self.pos -end - --- read n bytes from the current position --- reads longer than the string can satisfy return as much as it can --- reads while the position is at the end return nil,"eof" -function cursor:read(n) - if self.pos >= #self.str then - return nil,"eof" - end - - if n == "*a" then - n = #self.str - end - - local buf = self.str:sub(self.pos+1, self.pos + n) - self.pos = math.min(self.pos + n, #self.str) - - return buf -end - --- write the contents of the buffer at the current position, overwriting --- any data already present --- if the write pointer is past the end of the string, also fill in the --- intermediate space with nuls -function cursor:write(buf) - if self.pos > #self.str then - self.str = self.str .. string.char(0):rep(self.pos - #self.str) - end - - self.str = self.str:sub(1, self.pos) - .. buf - .. self.str:sub(self.pos + #buf + 1, -1) - self.pos = self.pos + #buf - - return self -end - -function cursor:__call(source) - assert(type(source) == "string", "invalid first argument to cursor()") - return setmetatable( - { str = source, pos = 0 }, - cursor) -end - -cursor.__index = cursor - -setmetatable(cursor, cursor) - -return cursor diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/fp.lua b/examples/rotate/LICK/lib/loveosc/vstruct/fp.lua deleted file mode 100755 index 5da81da..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/fp.lua +++ /dev/null @@ -1,121 +0,0 @@ --- floating point module --- Copyright © 2008 Peter "Corsix" Cawley and Ben "ToxicFrog" Kelly; see COPYING - -local fp = {} -local name = (...):gsub('%.[^%.]+$', '') -local struct = require (name) -local common = require (name..".common") - -local function reader(data, size_exp, size_fraction) - local fraction, exponent, sign - local endian = common.is_bigendian and ">" or "<" - - -- Split the unsigned integer into the 3 IEEE fields - local bits = struct.unpack(endian.."m"..#data, data, true) - local fraction = struct.implode({unpack(bits, 1, size_fraction)}, size_fraction) - local exponent = struct.implode({unpack(bits, size_fraction+1, size_fraction+size_exp)}, size_exp) - local sign = bits[#bits] and -1 or 1 - - -- special case: exponent is all 1s - if exponent == 2^size_exp-1 then - -- significand is 0? +- infinity - if fraction == 0 then - return sign * math.huge - - -- otherwise it's NaN - else - return 0/0 - end - end - - -- restore the MSB of the significand, unless it's a subnormal number - if exponent ~= 0 then - fraction = fraction + (2 ^ size_fraction) - else - exponent = 1 - end - - -- remove the exponent bias - exponent = exponent - 2 ^ (size_exp - 1) + 1 - - -- Decrease the size of the exponent rather than make the fraction (0.5, 1] - exponent = exponent - size_fraction - - return sign * math.ldexp(fraction, exponent) -end - -local function writer(value, size_exp, size_fraction) - local fraction, exponent, sign - local width = (size_exp + size_fraction + 1)/8 - local endian = common.is_bigendian and ">" or "<" - local bias = 2^(size_exp-1)-1 - - if value < 0 - or 1/value == -math.huge then -- handle the case of -0 - sign = true - value = -value - else - sign = false - end - - -- special case: value is infinite - if value == math.huge then - exponent = bias+1 - fraction = 0 - - -- special case: value is NaN - elseif value ~= value then - exponent = bias+1 - fraction = 2^(size_fraction-1) - - --special case: value is 0 - elseif value == 0 then - exponent = -bias - fraction = 0 - - else - fraction,exponent = math.frexp(value) - - -- subnormal number - if exponent+bias <= 1 then - fraction = fraction * 2^(size_fraction+(exponent+bias)-1) - exponent = -bias - - else - -- remove the most significant bit from the fraction and adjust exponent - fraction = fraction - 0.5 - exponent = exponent - 1 - - -- turn the fraction into an integer - fraction = fraction * 2^(size_fraction+1) - end - end - - - -- add the exponent bias - exponent = exponent + bias - - local bits = struct.explode(fraction) - local bits_exp = struct.explode(exponent) - for i=1,size_exp do - bits[size_fraction+i] = bits_exp[i] - end - bits[size_fraction+size_exp+1] = sign - - return struct.pack(endian.."m"..width, {bits}) -end - --- Create readers and writers for the IEEE sizes -fp.sizes = { - [4] = {1, 8, 23}, - [8] = {1, 11, 52}, -} - -fp.r = {} -fp.w = {} -for width, sizes in pairs(fp.sizes) do - fp.r[width] = function(uint) return reader(uint, sizes[2], sizes[3]) end - fp.w[width] = function(valu) return writer(valu, sizes[2], sizes[3]) end -end - -return fp diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/gen_pack.lua b/examples/rotate/LICK/lib/loveosc/vstruct/gen_pack.lua deleted file mode 100755 index 9449c85..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/gen_pack.lua +++ /dev/null @@ -1,132 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd,data = ... -local stack = {} -local index = 1 -local start = fd:seek() -local len = 0 - -local function push(key) - if not key then - key = index - index = index + 1 - end - - stack[#stack+1] = { index, data } - data = data[key] - index = 1 -end - -local function pop(key) - local saved = stack[#stack] - stack[#stack] = nil - - index = saved[1] - data = saved[2] -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return fd,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- <>(fd, data[index], <>) --- ++index -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data[index], "..args..")\nindex = index+1" -end - --- table: --- push() --- <

> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - --- named atom: --- <>(fd, data.<>, <>) -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return fn.."(fd, data."..token[1]..", "..args..")" -end - --- named table: --- push(<>) --- <
> --- pop() -function gen.name_table(token) - return "push('"..token[1].."')\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop()" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/gen_unpack.lua b/examples/rotate/LICK/lib/loveosc/vstruct/gen_unpack.lua deleted file mode 100755 index 369cfc9..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/gen_unpack.lua +++ /dev/null @@ -1,117 +0,0 @@ -local require,table - = require,table - -module((...)) -local parse = require(_PACKAGE.."parser") - -local gen = {} - -gen.preamble = [[ -local fd = (...) -local stack = {} -local pack = {} -local start = fd:seek() -local len = 0 - -local function push() - stack[#stack+1],pack = pack,{} -end - -local function pop(key) - local target = stack[#stack] - key = key or #target+1 - target[key],pack = pack,target - stack[#stack] = nil -end - -local function update_len() - len = len + fd:seek() - start -end - -local function update_start() - start = fd:seek() -end - -hostendian() -]] - -gen.postamble = [[ - -update_len() -return pack,len -]] - --- control: --- <>(fd, <>) -function gen.control(token) - local tr = { - ["<"] = "littleendian"; - [">"] = "bigendian"; - ["="] = "hostendian"; - ["+"] = "seekforward"; - ["-"] = "seekback"; - ["@"] = "seekto"; - } - local fn = tr[token[1]] or token[1] - - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "update_len(); "..fn.."(fd, "..args..")".."; update_start()" -end - --- atom: --- pack[#pack+1] = <>(fd, <>) -function gen.atom(token) - local fn = token[1] - local args = token[2]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack[#pack+1] = "..fn.."(fd, "..args..")" -end - --- table: --- push() --- <
> --- pop() -function gen.table(token) - return "push()\n" - ..parse(token[1]:sub(2,-2), gen) - .."\npop()" -end - --- group: --- <> -function gen.group(token) - return parse(token[1]:sub(2,-2), gen) -end - -function gen.name_atom(token) - local fn = token[2] - local args = token[3]:gsub('%.', ', ') - if #args == 0 then args = "nil" end - - return "pack."..token[1].." = "..fn.."(fd, "..args..")" -end - -function gen.name_table(token) - return "push()\n" - ..parse(token[2]:sub(2,-2), gen) - .."\npop('"..token[1].."')\n" -end - -function gen.prerepeat(token, get) - local next = get() - local src = gen[next.type](next, get) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -function gen.postrepeat(token, get, asl) - local src = table.remove(asl) - - return "for _idx=1,"..token[1].." do\n\n"..src.."\nend" -end - -return gen - diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/init.lua b/examples/rotate/LICK/lib/loveosc/vstruct/init.lua deleted file mode 100755 index 8910968..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/init.lua +++ /dev/null @@ -1,94 +0,0 @@ --- vstruct, the versatile struct library --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - -local table,math,type,require,assert,_unpack = table,math,type,require,assert,unpack - -local print = print - -module((...)) - -cursor = require (_NAME..".cursor") -compile = require (_NAME..".compile") - -function math.trunc(n) - if n < 0 then - return math.ceil(n) - else - return math.floor(n) - end -end - --- turn an int into a list of booleans --- the length of the list will be the smallest number of bits needed to --- represent the int -function explode(int, size) - assert(int, "struct.explode: missing argument") - size = size or 0 - - local mask = {} - while int ~= 0 or #mask < size do - table.insert(mask, int % 2 ~= 0) - int = math.trunc(int/2) - end - return mask -end - --- turn a list of booleans into an int --- the converse of explode -function implode(mask, size) - size = size or #mask - - local int = 0 - for i=size,1,-1 do - int = int*2 + ((mask[i] and 1) or 0) - end - return int -end - --- given a source, which is either a string or a file handle, --- unpack it into individual data based on the format string -function unpack(fmt, source, untable) - -- wrap it in a cursor so we can treat it like a file - if type(source) == 'string' then - source = cursor(source) - end - - assert(fmt and source and type(fmt) == "string", "struct: invalid arguments to unpack") - - -- the lexer will take our format string and generate code from it - -- it returns a function that when called with our source, will - -- unpack the data according to the format string and return all - -- values from said unpacking in a list - if untable then - --local t = compile.unpack(fmt)(source) - --print(t) - -- print(_unpack(t)) - return _unpack((compile.unpack(fmt)(source))) - else - return compile.unpack(fmt)(source) - end -end - --- given a format string and a list of data, pack them --- if 'fd' is omitted, pack them into and return a string --- otherwise, write them directly to the given file -function pack(fmt, fd, data) - local str_fd - - if not data then - data = fd - fd = "" - end - - if type(fd) == 'string' then - fd = cursor("") - str_fd = true - end - - assert(fmt and fd and data and type(fmt) == "string", "struct: invalid arguments to pack") - - local fd,len = compile.pack(fmt)(fd, data) - return (str_fd and fd.str) or fd,len -end - -return struct diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/io_pack.lua b/examples/rotate/LICK/lib/loveosc/vstruct/io_pack.lua deleted file mode 100755 index a785f7e..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/io_pack.lua +++ /dev/null @@ -1,127 +0,0 @@ --- write formats --- return true if they have consumed a value from the input stream --- return false/nil otherwise (ie, the next value will be preserved --- for subsequent calls, eg skip/pad) --- Copyright © 2008 Ben "ToxicFrog" Kelly; see COPYING -local require,error,setmetatable,string,print,math,unpack,io - = require,error,setmetatable,string,print,math,unpack,io - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local pack = setmetatable({}, { __index = common }) - --- boolean -function pack.b(fd, d, w) - return pack.u(fd, (d and 1) or 0, w) -end - --- counted string --- a string immediately prefaced with its length as a uint -function pack.c(fd, d, w) - pack.u(fd, #d, w) - return pack.s(fd, d) -end - --- floating point -function pack.f(fd, d, w) - if not fp.w[w] then - error("struct.pack: illegal floating point width") - end --- local f = fp.w[w](d) --- print(f, type(f)) - return pack.s(fd, fp.w[w](d), w) -end - --- signed int -function pack.i(fd, d, w) - if d < 0 then - d = 2^(w*8) + d - end - return pack.u(fd, d, w) -end - --- bitmask --- we use a string here because using an unsigned will lose data on bitmasks --- wider than lua's native number format -function pack.m(fd, d, w) - local buf = "" - - for i=1,w*8,8 do - local bits = { unpack(d, i, i+7) } - local byte = string.char(struct.implode(bits, 8)) - if pack.is_bigendian then - buf = byte..buf - else - buf = buf..byte - end - end - return pack.s(fd, buf, w) -end - --- fixed point bit aligned -function pack.P(fd, d, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return pack.i(fd, d * 2^fp, (dp+fp)/8) -end - --- fixed point byte aligned -function pack.p(fd, d, dp, fp) - return pack.P(fd, d, dp*8, fp*8) -end - --- fixed length string --- length 0 is write string as is --- length >0 is write exactly w bytes, truncating or padding as needed -function pack.s(fd, d, w) - w = w or #d - if w == 0 then return end - - if #d < w then - d = d..string.char(0):rep(w-#d) - end - - return fd:write(d:sub(1,w)) -end - --- unsigned int -function pack.u(fd, d, w) - local s = "" - - for i=1,w do - if pack.is_bigendian then - s = string.char(d % 2^8) .. s - else - s = s .. string.char(d % 2^8) - end - d = math.trunc(d/2^8) - end - - return pack.s(fd, s, w) -end - --- skip/pad --- this is technically a control format, so it has a different signature --- specifically, there is no "data" argument -function pack.x(fd, w) - return pack.s(fd, "", w) -end - --- null terminated string --- w==nil is write string as is + termination --- w>0 is write exactly w bytes, truncating/padding and terminating -function pack.z(fd, d, w) - w = w or #d+1 - if #d >= w then - d = d:sub(1, w-1) - end - - return pack.s(fd, d.."\0", w) -end - -return pack diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/io_unpack.lua b/examples/rotate/LICK/lib/loveosc/vstruct/io_unpack.lua deleted file mode 100755 index 916c321..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/io_unpack.lua +++ /dev/null @@ -1,165 +0,0 @@ --- read formats --- return a value if applicable, which will be packed --- otherwise return nil --- Copyright � 2008 Ben "ToxicFrog" Kelly; see COPYING - --- load operations common to both unpack and pack, and set __index so that --- requests for, say, unpack.seekto will succeed -local require,error,setmetatable,string,print - = require,error,setmetatable,string,print - -module((...)) - -local struct = require (_PACKAGE:sub(1,-2)) -local common = require (_PACKAGE.."common") -local fp = require (_PACKAGE.."fp") - -local unpack = setmetatable({}, { __index = common }) - --- boolean --- true if any bit is 1, false otherwise -function unpack.b(fd, w) - return unpack.u(fd, w) ~= 0 -end - --- counted string --- a string immediately prefaced with its length as a uint -function unpack.c(fd, w) - w = unpack.u(fd, w) - - return unpack.s(fd, w) -end - --- float --- this is callout to the floating-point read/write module, if installed -function unpack.f(fd, w) - if not fp.r[w] then - error("struct.unpack: illegal floating point width") - end - - return fp.r[w](unpack.s(fd,w)) -end - --- utility functions for the i, m and u formats -local function directions(w) - if unpack.is_bigendian then - return 1,w,1 - else - return w,1,-1 - end -end - -local function pve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - for c=sof,eof,dir do - i = i * 2^8 + buf:byte(c) - end - - return i -end - -local function nve_unpack(buf, w) - local i,sof,eof,dir = 0,directions(w) - - if buf:byte(sof) < 128 then - return pve_unpack(buf, w) - end - - for c=sof,eof,dir do - i = i * 2^8 - (255 - buf:byte(c)) - end - - return i-1 -end - --- signed int of w bytes -function unpack.i(fd, w) - local buf = unpack.s(fd, w) - - return nve_unpack(buf, w) -end - --- bitmask of w bytes --- we need to read and unpack it as a string, not an unsigned, because otherwise --- we're limited to 52 bits -function unpack.m(fd, w) - local buf = unpack.s(fd, w) - local mask = {} - - local sof,eof,dir = directions(w) - - -- reverse it here because directions() returns numbers for MSB first, - -- and we want LSB first - for i=eof,sof,-dir do - local byte = buf:byte(i) - local bits = struct.explode(byte) - for j=1,8 do - mask[#mask+1] = bits[j] or false - end - end - return mask -end - --- fixed point bit aligned --- w is in the form d.f, where d is the number of bits in the integer part --- and f the number of bits in the fractional part -function unpack.P(fd, dp, fp) - if (dp+fp) % 8 ~= 0 then - error "total width of fixed point value must be byte multiple" - end - return unpack.i(fd, (dp+fp)/8)/(2^fp) -end - --- fixed point byte aligned -function unpack.p(fd, dp, fp) - return unpack.P(fd, dp*8, fp*8) -end - --- string --- reads exactly w bytes of data and returns them verbatim -function unpack.s(fd, w) - if w == 0 then return "" end - - local buf,err = fd:read(w or "*a") - if not buf then - error(function() return "read error: "..(err or "(unknown error)") end) - elseif #buf < w then - error(function() return "short read: wanted "..w.." bytes, got "..#buf end) - end - return buf -end - --- unsigned int -function unpack.u(fd, w) - local buf,err = unpack.s(fd, w) - - return pve_unpack(buf, w) -end - --- skip/pad --- reads w bytes and discards them -function unpack.x(fd, w) - fd:read(w) - return true -end - --- null-terminated string --- if w is omitted, reads up to and including the first nul, and returns everything --- except that nul --- otherwise, reads exactly w bytes and returns everything up to the first nul -function unpack.z(fd, w) - if w then - return unpack.s(fd, w):match('^%Z*') - end - - local buf = "" - local c = unpack.s(fd, 1) - while #c > 0 and c ~= string.char(0) do - buf = buf..c - c = unpack.s(fd, 1) - end - return buf -end - -return unpack diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/lexer.lua b/examples/rotate/LICK/lib/loveosc/vstruct/lexer.lua deleted file mode 100755 index 9eb503e..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/lexer.lua +++ /dev/null @@ -1,54 +0,0 @@ -local lexis = {} - -local function lexeme(name) - return function(pattern) - lexis[#lexis+1] = { name=name, pattern="^"..pattern } - end -end - -lexeme (false) "%s+" -- whitespace -lexeme "table" "(%b{})" -lexeme "group" "(%b())" -lexeme "name_atom" "([%a_][%w_]*)%:(%a)([%d.]*)" -lexeme "name_table" "([%a_][%w_]*)%:(%b{})" -lexeme "prerepeat" "(%d+)%s*%*" -lexeme "postrepeat" "%*%s*(%d+)" -lexeme "control" "([-+@<>=ax])([%d.]*)" -lexeme "atom" "(%a)([%d.]*)" - -return function(source) - local orig = source - local index = 1 - - local function iter() - if #source == 0 then return nil end - - for _,lexeme in ipairs(lexis) do - if source:match(lexeme.pattern) then - local result = { source:find(lexeme.pattern) } - local eof = table.remove(result, 2) - table.remove(result, 1) - - source = source:sub(eof+1, -1) - index = index+eof - - if lexeme.name then - result.type = lexeme.name - coroutine.yield(result) - end - return iter() - end - end - error (function() return "Error lexing format string [[" - ..(orig) - .."]] at char " - ..index - .." (" - ..(source:sub(1,1)) - ..")" - end) - end - - return coroutine.wrap(iter) -end - diff --git a/examples/rotate/LICK/lib/loveosc/vstruct/parser.lua b/examples/rotate/LICK/lib/loveosc/vstruct/parser.lua deleted file mode 100755 index 122f68e..0000000 --- a/examples/rotate/LICK/lib/loveosc/vstruct/parser.lua +++ /dev/null @@ -1,35 +0,0 @@ --- parser for format strings --- you give it a format string, a table of code generators, --- and a flag indicating whether to apply the preamble/postable --- it gives you lua source - -local require,concat = require,table.concat - -local print = print - -module((...)) - -local lex = require(_PACKAGE.."lexer") - -return function(source, codegen, prepost) - local asl = {} - local get = lex(source) - - for token in get do - -- seperate statements because codegen may change #asl - local code = codegen[token.type](token, get, asl) - asl[#asl+1] = code - end - - local source = concat(asl, "\n") - - if prepost then - source = codegen.preamble - .. source - .. codegen.postamble - end - - return source -end - - diff --git a/examples/rotate/LICK/lib/object.lua b/examples/rotate/LICK/lib/object.lua deleted file mode 100644 index c8d5350..0000000 --- a/examples/rotate/LICK/lib/object.lua +++ /dev/null @@ -1,282 +0,0 @@ --- OBJECT.lua --- object oriented livecoding library -_internal_object_table = {} - --- hump for classing -local Class = require "LICK/lib/hump/.class" -local hlpr = require "LICK/lib/hlpr" -require "LICK/lib/loveosc" - - ---[[ - OBJECT ---]] --- @Object: base class -Object = Class(function(self) - -- TODO: Object base code - table.insert(_internal_object_table, self) -end) - -function Object:update(dt) - -- TODO: insert typical update - -- print("updated") -end - ---[[ - SCOBJECT ---]] - --- @SCObject: bass class for supercollider communication -SCObject = Class(function(self) - Object.construct(self) -end) -SCObject:inherit(Object) - - ---[[ - SCSYNTH ---]] --- @SCSynth: supercollider synthesizer class -SCSynth = Class(function(self, nodename, freq) - SCObject.construct(self) - self.nodename = nodename or "default" - self.freq = freq or 440 - self.nodeid = 1000 + math.random(1000) -end) -SCSynth:inherit(SCObject) - --- #set a control, TODO: variable lenght of argument-pairs -function SCSynth:set(control, val) - local var = { - "#bundle", - os.time(), - { - "/n_set", - "i", - self.nodeid, - "s", - control, - "f", - val - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#sends an OSC message to the supercollider to start the synth -function SCSynth:play() - local var = { - "#bundle", - os.time(), - { - "/s_new", - "s", - self.nodename, - "i", - self.nodeid, - "i", - 0, - "i", - 0, - "s", - "freq", - "f", - self.freq - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---#frees the node on the supercollider server -function SCSynth:free() - local var = { - "#bundle", - os.time()+0.8, - { - "/n_free", - "i", - self.nodeid, - "i", - 0 - } - } - - osc.client:send(var) - --print("OUTGOING OSC MESSAGE") -end - ---[[ - DRAWABLE ---]] --- @Drawable: base class for all drawable stuff -Drawable = Class(function(self, x, y, color) - self.color = color or hlpr.color("white",255) - -- call constructor of Object class - Object.construct(self) - - self.position = Vector(x,y) - self.pos = self.position - self.x = self.position.x - self.y = self.position.y -end) -Drawable:inherit(Object) - --- #can be called via wrapX(max) or wrapX(min,max) -function Drawable:wrapX(min, max) - if min and max then - self:wrap("x", min, max) - elseif min and not max then - self:wrap("x", 0, min) - end -end - --- #can be called via wrapY(max) or wrapY(min,max) -function Drawable:wrapY(min, max) - if min and max then - self:wrap("y", min, max) - elseif min and not max then - self:wrap("y", 0, min) - end -end - --- #internal wrapper -function Drawable:wrap(str, min, max) - if str == "x" then - self.position.x = hlpr.wrap(self.position.x, min, max) - elseif str == "y" then - self.position.y = hlpr.wrap(self.position.y, min, max) - end -end - --- #supercollider style 'set' -function Drawable:set(str, val) - - if str == "x" then - self.position.x = val or self.position.x - elseif str == "y" then - self.position.y = val or self.position.y - end - -- TODO: add lots and lots and lots -end - --- #not yet implemented -function Drawable:draw() - -- TODO: abstract draw code... -end - - - - ---[[ - CIRCLE ---]] --- @Circle: drawable circle -Circle = Class(function(self, x, y, r, s, color) - self.r = r or 10 - self.s = s or 16 - -- call constructor of Drawable - Drawable.construct(self,x,y,color) -end) -Circle:inherit(Drawable) - --- #draw the circle -function Circle:draw(style) - if style ~= "fill" and style ~= "line" then - style = "line" - end - love.graphics.setColor(unpack(self.color)) - love.graphics.circle(style, self.position.x, self.position.y, self.r, self.s) -end - - - ----------------------------------------- --- Experimental Objects ----------------------------------------- - - ---[[ - LINE ---]] --- @Line: draw a line -Line = Class(function(self, x, y, tx, ty, color) -- wats the dealio for polylines? - self.x = x or 0 - self.y = y or 0 - self.tx = tx or 0 - self.ty = ty or 0 - -- call constructor of Drawable - Drawable.construct(self, x, y, color) - - end) -Line:inherit(Drawable) --- TODO: FIX the :set("key", value) ... dunno how it works..! - --- #draw the line -function Line:draw(width, style) - local width=width or 1 - if style ~= "smooth" and style ~= "rough" then - style = "smooth" - end - love.graphics.setLine(width, style) - love.graphics.setColor(unpack(self.color)) - love.graphics.line(self.position.x, self.position.y, self.tx, self.ty) -end - - ---[[ - IMAGE ---]] --- @Image: Image from file -Image = Class(function(self, file, x, y, color, size, orientation) - self.image = love.graphics.newImage(file) - -- put positions, size, orientation... - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Image:inherit(Drawable) - --- #draw the image -function Image:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.draw(self.image, self.position.x, self.position.y) -end - ---[[ - POINT ---]] --- @Point -Point = Class(function(self, x, y, color, size, style) - local color=color or "" - local size=size or 1 - local style=style or "smooth" - - -- should this be here? or in the constructor? - self.size = size - self.style = style - - -- call constructor of Drawable - Drawable.construct(self,x,y,color) - end) -Point:inherit(Drawable) - --- #draw the point -function Point:draw() - love.graphics.setColor(unpack(self.color)) - love.graphics.setPoint(self.size, self.style) - love.graphics.point(self.position.x, self.position.y) -end - - --- EXAMPLE: --- (put in love.load): --- coco = Circle(300,300) --- (put in love.update): --- coco:set("x", 30) --- (put in love.draw): --- coco:draw("fill") - diff --git a/examples/rotate/LICK/lick.lua b/examples/rotate/LICK/lick.lua deleted file mode 100644 index 05cede2..0000000 --- a/examples/rotate/LICK/lick.lua +++ /dev/null @@ -1,127 +0,0 @@ --- lick.lua --- --- simple LIVECODING environment with löve, overwrites love.run, suppressing errors to the terminal/console - - - -lick = {} -lick.file = "main.lua" -lick.debug = false -lick.reset = false -lick.clearFlag = false - -function handle(err) - return "ERROR: " .. err -end - -function lick.setFile(str) - live.file = str or "lick.lua" -end - --- Initialization -function lick.load() - last_modified = 0 -end - --- load the lickcoding file and execute the contained update function -function lick.update(dt) - if love.filesystem.exists(lick.file) and last_modified < love.filesystem.getLastModified(lick.file) then - last_modified = love.filesystem.getLastModified(lick.file) - success, chunk = pcall(love.filesystem.load, lick.file) - if not success then - print(tostring(chunk)) - lick.debugoutput = chunk .. "\n" - - end - ok,err = xpcall(chunk, handle) - if not ok then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if ok then - print("CHUNK LOADED\n") - lick.debugoutput = nil - end - if lick.reset then - loadok, err = xpcall(love.load, handle) - if not loadok and not loadok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - loadok_old = not loadok - end - - - end - end - updateok, err = pcall(love.update,dt) - if not updateok and not updateok_old then - print("ERROR: "..tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .."ERROR: ".. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - - updateok_old = not updateok -end - -function lick.draw() - drawok, err = xpcall(love.draw, handle) - if not drawok and not drawok_old then - print(tostring(err)) - if lick.debugoutput then - lick.debugoutput = (lick.debugoutput .. err .. "\n" ) - else lick.debugoutput = err .. "\n" end - end - if lick.debug and lick.debugoutput then - love.graphics.setColor(255,255,255,120) - love.graphics.print(lick.debugoutput, 0, 0) - end - drawok_old = not drawok -end - -function love.run() - - if love.load then love.load(arg) end - lick.load() - local dt = 0 - - -- Main loop time. - while true do - if love.timer then - love.timer.step() - dt = love.timer.getDelta() - end - -- if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled - lick.update(dt) - if love.graphics then - if not lick.clearFlag then love.graphics.clear() end - -- if love.draw then love.draw() end - lick.draw() - end - - -- Process events. - if love.event then - for e,a,b,c in love.event.poll() do - if e == "q" then - if not love.quit or not love.quit() then - if love.audio then - love.audio.stop() - end - return - end - end - love.handlers[e](a,b,c) - end - end - - if love.timer then love.timer.sleep(1) end - if love.graphics then love.graphics.present() end - - end - -end - diff --git a/examples/rotate/conf.lua b/examples/rotate/conf.lua deleted file mode 100644 index 7a7b397..0000000 --- a/examples/rotate/conf.lua +++ /dev/null @@ -1,21 +0,0 @@ -function love.conf(t) - t.modules.joystick = true -- Enable the joystick module (boolean) - t.modules.audio = true -- Enable the audio module (boolean) - t.modules.keyboard = true -- Enable the keyboard module (boolean) - t.modules.event = true -- Enable the event module (boolean) - t.modules.image = true -- Enable the image module (boolean) - t.modules.graphics = true -- Enable the graphics module (boolean) - t.modules.timer = true -- Enable the timer module (boolean) - t.modules.mouse = true -- Enable the mouse module (boolean) - t.modules.sound = true -- Enable the sound module (boolean) - t.modules.physics = true -- Enable the physics module (boolean) - t.console = false -- Attach a console (boolean, Windows only) - t.title = "live_testproject" -- The title of the window the game is in (string) - t.author = "Tilmann Hars" -- The author of the game (string) - t.screen.fullscreen = false -- Enable fullscreen (boolean) - t.screen.vsync = true -- Enable vertical sync (boolean) - t.screen.fsaa = 0 -- The number of FSAA-buffers (number) - t.screen.height = 600 -- The window height (number) - t.screen.width = 800 -- The window width (number) - t.version = 0 -- The LÖVE version this game was made for (number) -end diff --git a/examples/rotate/main.lua b/examples/rotate/main.lua deleted file mode 100644 index 3348717..0000000 --- a/examples/rotate/main.lua +++ /dev/null @@ -1,26 +0,0 @@ -require "LICK" -require "LICK/lib" -ez = require "LICK/lib/hlpr" -lick.reset = true -lick.clearFlag = true - -function love.load() - circle = Circle(300, 300, 5., 32, ez.color("orange")) - x = x or 0 - sin1 = ez.sin(1) -end - -function love.update(dt) - circle.pos.x = circle.pos.x + dt *200 - - circle:wrapX(200, 300) - x = x + dt * 3 -end - -function love.draw() - ez.cls(10) - ez.push() - ez.rotateCenter(x) - circle:draw("fill") - ez.pop() -end