diff --git a/clear_build.bat b/clear_build.bat new file mode 100644 index 0000000..906c560 --- /dev/null +++ b/clear_build.bat @@ -0,0 +1,3 @@ +@echo off +rm build/foldhaus.* +rm build/win32_foldhaus.* \ No newline at end of file diff --git a/custom_4coder.dll b/custom_4coder.dll new file mode 100644 index 0000000..3126644 Binary files /dev/null and b/custom_4coder.dll differ diff --git a/custom_4coder.pdb b/custom_4coder.pdb new file mode 100644 index 0000000..cfb3f00 Binary files /dev/null and b/custom_4coder.pdb differ diff --git a/data/Anonymous Pro.ttf b/data/Anonymous Pro.ttf new file mode 100644 index 0000000..06aafc0 Binary files /dev/null and b/data/Anonymous Pro.ttf differ diff --git a/data/CircularStd-Book.otf b/data/CircularStd-Book.otf new file mode 100644 index 0000000..3a1f1ad Binary files /dev/null and b/data/CircularStd-Book.otf differ diff --git a/data/Gotham-Light.otf b/data/Gotham-Light.otf new file mode 100644 index 0000000..1794f14 Binary files /dev/null and b/data/Gotham-Light.otf differ diff --git a/data/leaderboard.data b/data/leaderboard.data new file mode 100644 index 0000000..c5512e3 --- /dev/null +++ b/data/leaderboard.data @@ -0,0 +1,5 @@ +Peter : 10000 +Andrew : 2500 +Kim : 2000 +Felicia : 1000 +Skye : 200 diff --git a/data/main.exe b/data/main.exe new file mode 100644 index 0000000..0120f1d Binary files /dev/null and b/data/main.exe differ diff --git a/data/radia_old.fold b/data/radia_old.fold new file mode 100644 index 0000000..e50a51e --- /dev/null +++ b/data/radia_old.fold @@ -0,0 +1,338 @@ + +{ + neighbors: [16, 14, 12, 13, 15]; + ip: 192.168.1.200; + x: 0; + y: 0.525731086730957; + z: 0.8506507873535156; + id: 0; +}; +{ + neighbors: [20, 17, 12, 18, 19]; + ip: 192.168.1.201; + x: 0; + y: -0.525731086730957; + z: 0.8506507873535156; + id: 1; +}; +{ + neighbors: [24, 22, 21, 23, 25]; + ip: 192.168.1.202; + x: 0; + y: -0.525731086730957; + z: -0.8506507873535156; + id: 2; +}; +{ + neighbors: [28, 27, 21, 26, 29]; + ip: 192.168.1.203; + x: 0; + y: 0.525731086730957; + z: -0.8506507873535156; + id: 3; +}; +{ + neighbors: [31, 13, 17, 32, 30]; + ip: 192.168.1.204; + x: 0.8506507873535156; + y: 0; + z: 0.525731086730957; + id: 4; +}; +{ + neighbors: [14, 34, 33, 35, 18]; + ip: 192.168.1.205; + x: -0.8506507873535156; + y: 0; + z: 0.525731086730957; + id: 5; +}; +{ + neighbors: [36, 26, 22, 37, 33]; + ip: 192.168.1.206; + x: -0.8506507873535156; + y: 0; + z: -0.525731086730957; + id: 6; +}; +{ + neighbors: [30, 39, 23, 27, 38]; + ip: 192.168.1.207; + x: 0.8506507873535156; + y: 0; + z: -0.525731086730957; + id: 7; +}; +{ + neighbors: [38, 28, 40, 15, 31]; + ip: 192.168.1.208; + x: 0.525731086730957; + y: 0.8506507873535156; + z: 0; + id: 8; +}; +{ + neighbors: [36, 34, 16, 40, 29]; + ip: 192.168.1.209; + x: -0.525731086730957; + y: 0.8506507873535156; + z: 0; + id: 9; +}; +{ + neighbors: [35, 37, 24, 41, 19]; + ip: 192.168.1.210; + x: -0.525731086730957; + y: -0.8506507873535156; + z: 0; + id: 10; +}; +{ + neighbors: [32, 20, 41, 25, 39]; + ip: 192.168.1.211; + x: 0.525731086730957; + y: -0.8506507873535156; + z: 0; + id: 11; +}; +{ + neighbors: [0, 14, 18, 1, 17, 13]; + ip: 192.168.1.212; + x: 0; + y: 0; + z: 1; + id: 12; +}; +{ + neighbors: [4, 31, 15, 0, 12, 17]; + ip: 192.168.1.213; + x: 0.5; + y: 0.30901700258255005; + z: 0.80901700258255; + id: 13; +}; +{ + neighbors: [0, 16, 34, 5, 18, 12]; + ip: 192.168.1.214; + x: -0.5; + y: 0.30901700258255005; + z: 0.80901700258255; + id: 14; +}; +{ + neighbors: [8, 40, 16, 0, 13, 31]; + ip: 192.168.1.215; + x: 0.30901700258255005; + y: 0.80901700258255; + z: 0.5; + id: 15; +}; +{ + neighbors: [9, 34, 14, 0, 15, 40]; + ip: 192.168.1.216; + x: -0.30901700258255005; + y: 0.80901700258255; + z: 0.5; + id: 16; +}; +{ + neighbors: [4, 13, 12, 1, 20, 32]; + ip: 192.168.1.217; + x: 0.5; + y: -0.30901700258255005; + z: 0.80901700258255; + id: 17; +}; +{ + neighbors: [5, 35, 19, 1, 12, 14]; + ip: 192.168.1.218; + x: -0.5; + y: -0.30901700258255005; + z: 0.80901700258255; + id: 18; +}; +{ + neighbors: [1, 18, 35, 10, 41, 20]; + ip: 192.168.1.219; + x: -0.30901700258255005; + y: -0.80901700258255; + z: 0.5; + id: 19; +}; +{ + neighbors: [11, 32, 17, 1, 19, 41]; + ip: 192.168.1.220; + x: 0.30901700258255005; + y: -0.80901700258255; + z: 0.5; + id: 20; +}; +{ + neighbors: [3, 27, 23, 2, 22, 26]; + ip: 192.168.1.221; + x: 0; + y: 0; + z: -1; + id: 21; +}; +{ + neighbors: [6, 26, 21, 2, 24, 37]; + ip: 192.168.1.222; + x: -0.5; + y: -0.30901700258255005; + z: -0.80901700258255; + id: 22; +}; +{ + neighbors: [7, 39, 25, 2, 21, 27]; + ip: 192.168.1.223; + x: 0.5; + y: -0.30901700258255005; + z: -0.80901700258255; + id: 23; +}; +{ + neighbors: [10, 37, 22, 2, 25, 41]; + ip: 192.168.1.224; + x: -0.30901700258255005; + y: -0.80901700258255; + z: -0.5; + id: 24; +}; +{ + neighbors: [11, 41, 24, 2, 23, 39]; + ip: 192.168.1.225; + x: 0.30901700258255005; + y: -0.80901700258255; + z: -0.5; + id: 25; +}; +{ + neighbors: [3, 21, 22, 6, 36, 29]; + ip: 192.168.1.226; + x: -0.5; + y: 0.30901700258255005; + z: -0.80901700258255; + id: 26; +}; +{ + neighbors: [3, 28, 38, 7, 23, 21]; + ip: 192.168.1.227; + x: 0.5; + y: 0.30901700258255005; + z: -0.80901700258255; + id: 27; +}; +{ + neighbors: [8, 38, 27, 3, 29, 40]; + ip: 192.168.1.228; + x: 0.30901700258255005; + y: 0.80901700258255; + z: -0.5; + id: 28; +}; +{ + neighbors: [9, 40, 28, 3, 26, 36]; + ip: 192.168.1.229; + x: -0.30901700258255005; + y: 0.80901700258255; + z: -0.5; + id: 29; +}; +{ + neighbors: [7, 38, 31, 4, 32, 39]; + ip: 192.168.1.230; + x: 1; + y: 0; + z: 0; + id: 30; +}; +{ + neighbors: [8, 15, 13, 4, 30, 38]; + ip: 192.168.1.231; + x: 0.80901700258255; + y: 0.5; + z: 0.30901700258255005; + id: 31; +}; +{ + neighbors: [11, 39, 30, 4, 17, 20]; + ip: 192.168.1.232; + x: 0.80901700258255; + y: -0.5; + z: 0.30901700258255005; + id: 32; +}; +{ + neighbors: [5, 34, 36, 6, 37, 35]; + ip: 192.168.1.233; + x: -1; + y: 0; + z: 0; + id: 33; +}; +{ + neighbors: [5, 14, 16, 9, 36, 33]; + ip: 192.168.1.234; + x: -0.80901700258255; + y: 0.5; + z: 0.30901700258255005; + id: 34; +}; +{ + neighbors: [5, 33, 37, 10, 19, 18]; + ip: 192.168.1.235; + x: -0.80901700258255; + y: -0.5; + z: 0.30901700258255005; + id: 35; +}; +{ + neighbors: [9, 29, 26, 6, 33, 34]; + ip: 192.168.1.236; + x: -0.80901700258255; + y: 0.5; + z: -0.30901700258255005; + id: 36; +}; +{ + neighbors: [10, 35, 33, 6, 22, 24]; + ip: 192.168.1.237; + x: -0.80901700258255; + y: -0.5; + z: -0.30901700258255005; + id: 37; +}; +{ + neighbors: [8, 31, 30, 7, 27, 28]; + ip: 192.168.1.238; + x: 0.80901700258255; + y: 0.5; + z: -0.30901700258255005; + id: 38; +}; +{ + neighbors: [11, 25, 23, 7, 30, 32]; + ip: 192.168.1.239; + x: 0.80901700258255; + y: -0.5; + z: -0.30901700258255005; + id: 39; +}; +{ + neighbors: [8, 28, 29, 9, 16, 15]; + ip: 192.168.1.240; + x: 0; + y: 1; + z: 0; + id: 40; +}; +{ + neighbors: [11, 20, 19, 10, 24, 25]; + ip: 192.168.1.241; + x: 0; + y: -1; + z: 0; + id: 41; +}; +EOF \ No newline at end of file diff --git a/data/radialumia.fold b/data/radialumia.fold new file mode 100644 index 0000000..d255676 --- /dev/null +++ b/data/radialumia.fold @@ -0,0 +1,408 @@ +led_strip_count 406 + +led_strip { 0, 0, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 0, 1, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 0, 2, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 0, 3, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 0, 4, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 1, 25, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 1, 26, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 1, 27, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 1, 28, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 1, 29, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 2, 50, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 2, 51, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 2, 52, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 2, 53, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 2, 54, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 3, 75, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 3, 76, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 3, 77, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 3, 78, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 3, 79, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 4, 100, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 4, 101, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 4, 102, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 4, 103, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 4, 104, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 5, 125, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 5, 126, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 5, 127, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 5, 128, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 5, 129, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 6, 150, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 6, 151, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 6, 152, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 6, 153, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 6, 154, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 7, 175, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 7, 176, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 7, 177, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 7, 178, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 7, 179, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 8, 200, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 8, 201, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 8, 202, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 8, 203, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 8, 204, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 9, 225, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 9, 226, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 9, 227, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 9, 228, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 9, 229, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 10, 250, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 10, 251, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 10, 252, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 10, 253, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 10, 254, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 11, 275, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 11, 276, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 11, 277, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 11, 278, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 11, 279, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 12, 300, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 12, 301, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 12, 302, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 12, 303, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 12, 304, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 12, 305, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 13, 325, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 13, 326, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 13, 327, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 13, 328, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 13, 329, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 13, 330, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 14, 350, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 14, 351, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 14, 352, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 14, 353, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 14, 354, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 14, 355, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 15, 375, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 15, 376, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 15, 377, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 15, 378, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 15, 379, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 15, 380, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 16, 400, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 16, 401, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 16, 402, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 16, 403, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 16, 404, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 16, 405, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 17, 425, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 17, 426, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 17, 427, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 17, 428, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 17, 429, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 17, 430, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 18, 450, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 18, 451, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 18, 452, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 18, 453, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 18, 454, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 18, 455, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 19, 475, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 19, 476, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 19, 477, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 19, 478, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 19, 479, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 19, 480, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 20, 500, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 20, 501, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 20, 502, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 20, 503, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 20, 504, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 20, 505, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 21, 525, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 21, 526, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 21, 527, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 21, 528, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 21, 529, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 21, 530, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 22, 550, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 22, 551, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 22, 552, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 22, 553, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 22, 554, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 22, 555, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 23, 575, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 23, 576, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 23, 577, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 23, 578, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 23, 579, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 23, 580, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 24, 600, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 24, 601, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 24, 602, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 24, 603, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 24, 604, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 24, 605, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 25, 625, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 25, 626, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 25, 627, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 25, 628, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 25, 629, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 25, 630, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 26, 650, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 26, 651, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 26, 652, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 26, 653, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 26, 654, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 26, 655, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 27, 675, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 27, 676, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 27, 677, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 27, 678, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 27, 679, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 27, 680, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 28, 700, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 28, 701, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 28, 702, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 28, 703, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 28, 704, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 28, 705, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 29, 725, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 29, 726, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 29, 727, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 29, 728, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 29, 729, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 29, 730, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 30, 750, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 30, 751, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 30, 752, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 30, 753, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 30, 754, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 30, 755, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 31, 775, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 31, 776, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 31, 777, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 31, 778, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 31, 779, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 31, 780, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 32, 800, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 32, 801, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 32, 802, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 32, 803, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 32, 804, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 32, 805, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 33, 825, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 33, 826, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 33, 827, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, 0.500000, -0.309017), 144 } led_strip { 33, 829, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 33, 830, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 34, 850, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 34, 851, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 34, 852, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 34, 853, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 34, 854, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 34, 855, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 35, 875, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 35, 876, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 35, 877, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 35, 878, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 35, 879, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.309017, -0.809017, 0.500000), 144 } led_strip { 36, 900, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 36, 901, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 36, 902, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 36, 903, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 36, 904, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 36, 905, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 37, 925, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 37, 926, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 37, 927, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 37, 928, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 37, 929, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 37, 930, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 38, 950, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 38, 951, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 38, 952, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 38, 953, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 38, 954, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 38, 955, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 39, 975, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 39, 976, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 39, 977, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 39, 978, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 39, 979, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 39, 980, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 40, 1000, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 40, 1001, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 40, 1002, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 40, 1003, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 40, 1004, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 40, 1005, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 41, 1025, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 41, 1026, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 41, 1027, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 41, 1028, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 41, 1029, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 41, 1030, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.309017, -0.809017, -0.500000), 144 } + +led_strip { 0, 5, 0, INTERPOLATE_POINTS, (-0.005654, 0.530914, 0.844235), (-0.005654, 0.662347, 1.056898), 144 } +led_strip { 0, 6, 0, INTERPOLATE_POINTS, (0.005654, 0.651981, 1.069729), (0.005654, 0.520548, 0.857067), 144 } +led_strip { 0, 7, 0, INTERPOLATE_POINTS, (-0.009149, 0.521766, 0.849889), (-0.009149, 0.653199, 1.062552), 144 } +led_strip { 0, 8, 0, INTERPOLATE_POINTS, (0.002160, 0.642832, 1.075384), (0.002160, 0.511399, 0.862721), 144 } +led_strip { 1, 30, 0, INTERPOLATE_POINTS, (0.005654, -0.530914, 0.844235), (0.005654, -0.662347, 1.056898), 144 } +led_strip { 1, 31, 0, INTERPOLATE_POINTS, (-0.005654, -0.651981, 1.069729), (-0.005654, -0.520548, 0.857067), 144 } +led_strip { 1, 32, 0, INTERPOLATE_POINTS, (0.009149, -0.521766, 0.849889), (0.009149, -0.653199, 1.062552), 144 } +led_strip { 1, 33, 0, INTERPOLATE_POINTS, (-0.002160, -0.642832, 1.075384), (-0.002160, -0.511399, 0.862721), 144 } +led_strip { 2, 55, 0, INTERPOLATE_POINTS, (-0.005654, -0.530914, -0.844235), (-0.005654, -0.662347, -1.056898), 144 } +led_strip { 2, 56, 0, INTERPOLATE_POINTS, (0.005654, -0.651981, -1.069729), (0.005654, -0.520548, -0.857067), 144 } +led_strip { 2, 57, 0, INTERPOLATE_POINTS, (-0.009149, -0.521766, -0.849889), (-0.009149, -0.653199, -1.062552), 144 } +led_strip { 2, 58, 0, INTERPOLATE_POINTS, (0.002160, -0.642832, -1.075384), (0.002160, -0.511399, -0.862721), 144 } +led_strip { 3, 80, 0, INTERPOLATE_POINTS, (0.005654, 0.530914, -0.844235), (0.005654, 0.662347, -1.056898), 144 } +led_strip { 3, 81, 0, INTERPOLATE_POINTS, (-0.005654, 0.651981, -1.069729), (-0.005654, 0.520548, -0.857067), 144 } +led_strip { 3, 82, 0, INTERPOLATE_POINTS, (0.009149, 0.521766, -0.849889), (0.009149, 0.653199, -1.062552), 144 } +led_strip { 3, 83, 0, INTERPOLATE_POINTS, (-0.002160, 0.642832, -1.075384), (-0.002160, 0.511399, -0.862721), 144 } +led_strip { 4, 105, 0, INTERPOLATE_POINTS, (0.849889, 0.009149, 0.521766), (1.062552, 0.009149, 0.653199), 144 } +led_strip { 4, 106, 0, INTERPOLATE_POINTS, (1.064075, -0.009149, 0.661129), (0.851413, -0.009149, 0.529696), 144 } +led_strip { 4, 107, 0, INTERPOLATE_POINTS, (0.844235, 0.005654, 0.530914), (1.056898, 0.005654, 0.662347), 144 } +led_strip { 4, 108, 0, INTERPOLATE_POINTS, (1.058421, -0.012643, 0.670278), (0.845758, -0.012643, 0.538845), 144 } +led_strip { 5, 130, 0, INTERPOLATE_POINTS, (-0.844235, 0.005654, 0.530914), (-1.056898, 0.005654, 0.662347), 144 } +led_strip { 5, 131, 0, INTERPOLATE_POINTS, (-1.069729, -0.005654, 0.651981), (-0.857067, -0.005654, 0.520548), 144 } +led_strip { 5, 132, 0, INTERPOLATE_POINTS, (-0.849889, 0.009149, 0.521766), (-1.062552, 0.009149, 0.653199), 144 } +led_strip { 5, 133, 0, INTERPOLATE_POINTS, (-1.075384, -0.002160, 0.642832), (-0.862721, -0.002160, 0.511399), 144 } +led_strip { 6, 155, 0, INTERPOLATE_POINTS, (-0.849889, 0.009149, -0.521766), (-1.062552, 0.009149, -0.653199), 144 } +led_strip { 6, 156, 0, INTERPOLATE_POINTS, (-1.064075, -0.009149, -0.661129), (-0.851413, -0.009149, -0.529696), 144 } +led_strip { 6, 157, 0, INTERPOLATE_POINTS, (-0.844235, 0.005654, -0.530914), (-1.056898, 0.005654, -0.662347), 144 } +led_strip { 6, 158, 0, INTERPOLATE_POINTS, (-1.058421, -0.012643, -0.670278), (-0.845758, -0.012643, -0.538845), 144 } +led_strip { 7, 180, 0, INTERPOLATE_POINTS, (0.853383, 0.000000, -0.516112), (1.066046, 0.000000, -0.647545), 144 } +led_strip { 7, 181, 0, INTERPOLATE_POINTS, (1.060581, 0.000000, -0.666783), (0.847918, 0.000000, -0.535351), 144 } +led_strip { 7, 182, 0, INTERPOLATE_POINTS, (0.849889, -0.009149, -0.521766), (1.062552, -0.009149, -0.653199), 144 } +led_strip { 7, 183, 0, INTERPOLATE_POINTS, (1.057086, -0.009149, -0.672437), (0.844424, -0.009149, -0.541005), 144 } +led_strip { 8, 205, 0, INTERPOLATE_POINTS, (0.530914, 0.844235, -0.005654), (0.662347, 1.056898, -0.005654), 144 } +led_strip { 8, 206, 0, INTERPOLATE_POINTS, (0.651981, 1.069729, 0.005654), (0.520548, 0.857067, 0.005654), 144 } +led_strip { 8, 207, 0, INTERPOLATE_POINTS, (0.521766, 0.849889, -0.009149), (0.653199, 1.062552, -0.009149), 144 } +led_strip { 8, 208, 0, INTERPOLATE_POINTS, (0.642832, 1.075384, 0.002160), (0.511399, 0.862721, 0.002160), 144 } +led_strip { 9, 230, 0, INTERPOLATE_POINTS, (-0.530914, 0.844235, -0.005654), (-0.662347, 1.056898, -0.005654), 144 } +led_strip { 9, 231, 0, INTERPOLATE_POINTS, (-0.651981, 1.069729, 0.005654), (-0.520548, 0.857067, 0.005654), 144 } +led_strip { 9, 232, 0, INTERPOLATE_POINTS, (-0.530914, 0.844235, 0.005654), (-0.662347, 1.056898, 0.005654), 144 } +led_strip { 9, 233, 0, INTERPOLATE_POINTS, (-0.651981, 1.069729, 0.016962), (-0.520548, 0.857067, 0.016962), 144 } +led_strip { 10, 255, 0, INTERPOLATE_POINTS, (-0.530914, -0.844235, 0.005654), (-0.662347, -1.056898, 0.005654), 144 } +led_strip { 10, 256, 0, INTERPOLATE_POINTS, (-0.651981, -1.069729, -0.005654), (-0.520548, -0.857067, -0.005654), 144 } +led_strip { 10, 257, 0, INTERPOLATE_POINTS, (-0.530914, -0.844235, -0.005654), (-0.662347, -1.056898, -0.005654), 144 } +led_strip { 10, 258, 0, INTERPOLATE_POINTS, (-0.651981, -1.069729, -0.016962), (-0.520548, -0.857067, -0.016962), 144 } +led_strip { 11, 280, 0, INTERPOLATE_POINTS, (0.530914, -0.844235, 0.005654), (0.662347, -1.056898, 0.005654), 144 } +led_strip { 11, 281, 0, INTERPOLATE_POINTS, (0.651981, -1.069729, -0.005654), (0.520548, -0.857067, -0.005654), 144 } +led_strip { 11, 282, 0, INTERPOLATE_POINTS, (0.521766, -0.849889, 0.009149), (0.653199, -1.062552, 0.009149), 144 } +led_strip { 11, 283, 0, INTERPOLATE_POINTS, (0.642832, -1.075384, -0.002160), (0.511399, -0.862721, -0.002160), 144 } +led_strip { 12, 306, 0, INTERPOLATE_POINTS, (0.000000, 0.009619, 0.997267), (0.000000, 0.009619, 1.247267), 144 } +led_strip { 12, 307, 0, INTERPOLATE_POINTS, (0.000000, -0.009619, 1.252733), (0.000000, -0.009619, 1.002733), 144 } +led_strip { 12, 308, 0, INTERPOLATE_POINTS, (-0.008090, 0.005000, 0.996910), (-0.008090, 0.005000, 1.246910), 144 } +led_strip { 12, 309, 0, INTERPOLATE_POINTS, (-0.008090, -0.014239, 1.252375), (-0.008090, -0.014239, 1.002375), 144 } +led_strip { 13, 331, 0, INTERPOLATE_POINTS, (0.506416, 0.303363, 0.803834), (0.631416, 0.380617, 1.006088), 144 } +led_strip { 13, 332, 0, INTERPOLATE_POINTS, (0.618584, 0.391925, 1.016455), (0.493584, 0.314671, 0.814200), 144 } +led_strip { 13, 333, 0, INTERPOLATE_POINTS, (0.505000, 0.312107, 0.800927), (0.630000, 0.389361, 1.003181), 144 } +led_strip { 13, 334, 0, INTERPOLATE_POINTS, (0.617168, 0.400670, 1.013548), (0.492168, 0.323415, 0.811293), 144 } +led_strip { 14, 356, 0, INTERPOLATE_POINTS, (-0.490851, 0.312982, 0.809779), (-0.615851, 0.390236, 1.012033), 144 } +led_strip { 14, 357, 0, INTERPOLATE_POINTS, (-0.634149, 0.382306, 1.010509), (-0.509149, 0.305052, 0.808255), 144 } +led_strip { 14, 358, 0, INTERPOLATE_POINTS, (-0.496910, 0.317107, 0.804017), (-0.621910, 0.394361, 1.006271), 144 } +led_strip { 14, 359, 0, INTERPOLATE_POINTS, (-0.640207, 0.386431, 1.004748), (-0.515207, 0.309177, 0.802493), 144 } +led_strip { 15, 381, 0, INTERPOLATE_POINTS, (0.312982, 0.809779, 0.490851), (0.390236, 1.012033, 0.615851), 144 } +led_strip { 15, 382, 0, INTERPOLATE_POINTS, (0.382306, 1.010509, 0.634149), (0.305052, 0.808255, 0.509149), 144 } +led_strip { 15, 383, 0, INTERPOLATE_POINTS, (0.304017, 0.812107, 0.491910), (0.381271, 1.014361, 0.616910), 144 } +led_strip { 15, 384, 0, INTERPOLATE_POINTS, (0.373341, 1.012838, 0.635207), (0.296086, 0.810584, 0.510207), 144 } +led_strip { 16, 406, 0, INTERPOLATE_POINTS, (-0.312982, 0.809779, 0.490851), (-0.390236, 1.012033, 0.615851), 144 } +led_strip { 16, 407, 0, INTERPOLATE_POINTS, (-0.382306, 1.010509, 0.634149), (-0.305052, 0.808255, 0.509149), 144 } +led_strip { 16, 408, 0, INTERPOLATE_POINTS, (-0.317107, 0.804017, 0.496910), (-0.394361, 1.006271, 0.621910), 144 } +led_strip { 16, 409, 0, INTERPOLATE_POINTS, (-0.386431, 1.004748, 0.640207), (-0.309177, 0.802493, 0.515207), 144 } +led_strip { 17, 431, 0, INTERPOLATE_POINTS, (0.506416, -0.303363, 0.803834), (0.631416, -0.380617, 1.006088), 144 } +led_strip { 17, 432, 0, INTERPOLATE_POINTS, (0.618584, -0.391925, 1.016455), (0.493584, -0.314671, 0.814200), 144 } +led_strip { 17, 433, 0, INTERPOLATE_POINTS, (0.500000, -0.299017, 0.809017), (0.625000, -0.376271, 1.011271), 144 } +led_strip { 17, 434, 0, INTERPOLATE_POINTS, (0.612168, -0.387580, 1.021638), (0.487168, -0.310325, 0.819384), 144 } +led_strip { 18, 456, 0, INTERPOLATE_POINTS, (-0.506416, -0.303363, 0.803834), (-0.631416, -0.380617, 1.006088), 144 } +led_strip { 18, 457, 0, INTERPOLATE_POINTS, (-0.618584, -0.391925, 1.016455), (-0.493584, -0.314671, 0.814200), 144 } +led_strip { 18, 458, 0, INTERPOLATE_POINTS, (-0.505000, -0.312107, 0.800927), (-0.630000, -0.389361, 1.003181), 144 } +led_strip { 18, 459, 0, INTERPOLATE_POINTS, (-0.617168, -0.400670, 1.013548), (-0.492168, -0.323415, 0.811293), 144 } +led_strip { 19, 481, 0, INTERPOLATE_POINTS, (-0.303363, -0.803834, 0.506416), (-0.380617, -1.006088, 0.631416), 144 } +led_strip { 19, 482, 0, INTERPOLATE_POINTS, (-0.391925, -1.016455, 0.618584), (-0.314671, -0.814200, 0.493584), 144 } +led_strip { 19, 483, 0, INTERPOLATE_POINTS, (-0.312107, -0.800927, 0.505000), (-0.389361, -1.003181, 0.630000), 144 } +led_strip { 19, 484, 0, INTERPOLATE_POINTS, (-0.400670, -1.013548, 0.617168), (-0.323415, -0.811293, 0.492168), 144 } +led_strip { 20, 506, 0, INTERPOLATE_POINTS, (0.312982, -0.809779, 0.490851), (0.390236, -1.012033, 0.615851), 144 } +led_strip { 20, 507, 0, INTERPOLATE_POINTS, (0.382306, -1.010509, 0.634149), (0.305052, -0.808255, 0.509149), 144 } +led_strip { 20, 508, 0, INTERPOLATE_POINTS, (0.317107, -0.804017, 0.496910), (0.394361, -1.006271, 0.621910), 144 } +led_strip { 20, 509, 0, INTERPOLATE_POINTS, (0.386431, -1.004748, 0.640207), (0.309177, -0.802493, 0.515207), 144 } +led_strip { 21, 531, 0, INTERPOLATE_POINTS, (0.000000, 0.009619, -0.997267), (0.000000, 0.009619, -1.247267), 144 } +led_strip { 21, 532, 0, INTERPOLATE_POINTS, (0.000000, -0.009619, -1.252733), (0.000000, -0.009619, -1.002733), 144 } +led_strip { 21, 533, 0, INTERPOLATE_POINTS, (0.008090, 0.005000, -0.996910), (0.008090, 0.005000, -1.246910), 144 } +led_strip { 21, 534, 0, INTERPOLATE_POINTS, (0.008090, -0.014239, -1.252375), (0.008090, -0.014239, -1.002375), 144 } +led_strip { 22, 556, 0, INTERPOLATE_POINTS, (-0.506416, -0.303363, -0.803834), (-0.631416, -0.380617, -1.006088), 144 } +led_strip { 22, 557, 0, INTERPOLATE_POINTS, (-0.618584, -0.391925, -1.016455), (-0.493584, -0.314671, -0.814200), 144 } +led_strip { 22, 558, 0, INTERPOLATE_POINTS, (-0.500000, -0.299017, -0.809017), (-0.625000, -0.376271, -1.011271), 144 } +led_strip { 22, 559, 0, INTERPOLATE_POINTS, (-0.612168, -0.387580, -1.021638), (-0.487168, -0.310325, -0.819384), 144 } +led_strip { 23, 581, 0, INTERPOLATE_POINTS, (0.506416, -0.303363, -0.803834), (0.631416, -0.380617, -1.006088), 144 } +led_strip { 23, 582, 0, INTERPOLATE_POINTS, (0.618584, -0.391925, -1.016455), (0.493584, -0.314671, -0.814200), 144 } +led_strip { 23, 583, 0, INTERPOLATE_POINTS, (0.505000, -0.312107, -0.800927), (0.630000, -0.389361, -1.003181), 144 } +led_strip { 23, 584, 0, INTERPOLATE_POINTS, (0.617168, -0.400670, -1.013548), (0.492168, -0.323415, -0.811293), 144 } +led_strip { 24, 606, 0, INTERPOLATE_POINTS, (-0.312982, -0.809779, -0.490851), (-0.390236, -1.012033, -0.615851), 144 } +led_strip { 24, 607, 0, INTERPOLATE_POINTS, (-0.382306, -1.010509, -0.634149), (-0.305052, -0.808255, -0.509149), 144 } +led_strip { 24, 608, 0, INTERPOLATE_POINTS, (-0.317107, -0.804017, -0.496910), (-0.394361, -1.006271, -0.621910), 144 } +led_strip { 24, 609, 0, INTERPOLATE_POINTS, (-0.386431, -1.004748, -0.640207), (-0.309177, -0.802493, -0.515207), 144 } +led_strip { 25, 631, 0, INTERPOLATE_POINTS, (0.312982, -0.809779, -0.490851), (0.390236, -1.012033, -0.615851), 144 } +led_strip { 25, 632, 0, INTERPOLATE_POINTS, (0.382306, -1.010509, -0.634149), (0.305052, -0.808255, -0.509149), 144 } +led_strip { 25, 633, 0, INTERPOLATE_POINTS, (0.304017, -0.812107, -0.491910), (0.381271, -1.014361, -0.616910), 144 } +led_strip { 25, 634, 0, INTERPOLATE_POINTS, (0.373341, -1.012838, -0.635207), (0.296086, -0.810584, -0.510207), 144 } +led_strip { 26, 656, 0, INTERPOLATE_POINTS, (-0.490851, 0.312982, -0.809779), (-0.615851, 0.390236, -1.012033), 144 } +led_strip { 26, 657, 0, INTERPOLATE_POINTS, (-0.634149, 0.382306, -1.010509), (-0.509149, 0.305052, -0.808255), 144 } +led_strip { 26, 658, 0, INTERPOLATE_POINTS, (-0.491910, 0.304017, -0.812107), (-0.616910, 0.381271, -1.014361), 144 } +led_strip { 26, 659, 0, INTERPOLATE_POINTS, (-0.635207, 0.373341, -1.012838), (-0.510207, 0.296086, -0.810584), 144 } +led_strip { 27, 681, 0, INTERPOLATE_POINTS, (0.490851, 0.312982, -0.809779), (0.615851, 0.390236, -1.012033), 144 } +led_strip { 27, 682, 0, INTERPOLATE_POINTS, (0.634149, 0.382306, -1.010509), (0.509149, 0.305052, -0.808255), 144 } +led_strip { 27, 683, 0, INTERPOLATE_POINTS, (0.496910, 0.317107, -0.804017), (0.621910, 0.394361, -1.006271), 144 } +led_strip { 27, 684, 0, INTERPOLATE_POINTS, (0.640207, 0.386431, -1.004748), (0.515207, 0.309177, -0.802493), 144 } +led_strip { 28, 706, 0, INTERPOLATE_POINTS, (0.312982, 0.809779, -0.490851), (0.390236, 1.012033, -0.615851), 144 } +led_strip { 28, 707, 0, INTERPOLATE_POINTS, (0.382306, 1.010509, -0.634149), (0.305052, 0.808255, -0.509149), 144 } +led_strip { 28, 708, 0, INTERPOLATE_POINTS, (0.317107, 0.804017, -0.496910), (0.394361, 1.006271, -0.621910), 144 } +led_strip { 28, 709, 0, INTERPOLATE_POINTS, (0.386431, 1.004748, -0.640207), (0.309177, 0.802493, -0.515207), 144 } +led_strip { 29, 731, 0, INTERPOLATE_POINTS, (-0.312982, 0.809779, -0.490851), (-0.390236, 1.012033, -0.615851), 144 } +led_strip { 29, 732, 0, INTERPOLATE_POINTS, (-0.382306, 1.010509, -0.634149), (-0.305052, 0.808255, -0.509149), 144 } +led_strip { 29, 733, 0, INTERPOLATE_POINTS, (-0.304017, 0.812107, -0.491910), (-0.381271, 1.014361, -0.616910), 144 } +led_strip { 29, 734, 0, INTERPOLATE_POINTS, (-0.373341, 1.012838, -0.635207), (-0.296086, 0.810584, -0.510207), 144 } +led_strip { 30, 756, 0, INTERPOLATE_POINTS, (0.997267, 0.000000, -0.009619), (1.247267, 0.000000, -0.009619), 144 } +led_strip { 30, 757, 0, INTERPOLATE_POINTS, (1.252733, 0.000000, 0.009619), (1.002733, 0.000000, 0.009619), 144 } +led_strip { 30, 758, 0, INTERPOLATE_POINTS, (0.996910, 0.008090, -0.005000), (1.246910, 0.008090, -0.005000), 144 } +led_strip { 30, 759, 0, INTERPOLATE_POINTS, (1.252375, 0.008090, 0.014239), (1.002375, 0.008090, 0.014239), 144 } +led_strip { 31, 781, 0, INTERPOLATE_POINTS, (0.803834, 0.506416, 0.303363), (1.006088, 0.631416, 0.380617), 144 } +led_strip { 31, 782, 0, INTERPOLATE_POINTS, (1.016455, 0.618584, 0.391925), (0.814200, 0.493584, 0.314671), 144 } +led_strip { 31, 783, 0, INTERPOLATE_POINTS, (0.800927, 0.505000, 0.312107), (1.003181, 0.630000, 0.389361), 144 } +led_strip { 31, 784, 0, INTERPOLATE_POINTS, (1.013548, 0.617168, 0.400670), (0.811293, 0.492168, 0.323415), 144 } +led_strip { 32, 806, 0, INTERPOLATE_POINTS, (0.803834, -0.506416, 0.303363), (1.006088, -0.631416, 0.380617), 144 } +led_strip { 32, 807, 0, INTERPOLATE_POINTS, (1.016455, -0.618584, 0.391925), (0.814200, -0.493584, 0.314671), 144 } +led_strip { 32, 808, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.299017), (1.011271, -0.625000, 0.376271), 144 } +led_strip { 32, 809, 0, INTERPOLATE_POINTS, (1.021638, -0.612168, 0.387580), (0.819384, -0.487168, 0.310325), 144 } +led_strip { 33, 831, 0, INTERPOLATE_POINTS, (-0.997267, 0.000000, 0.009619), (-1.247267, 0.000000, 0.009619), 144 } +led_strip { 33, 832, 0, INTERPOLATE_POINTS, (-1.252733, 0.000000, -0.009619), (-1.002733, 0.000000, -0.009619), 144 } +led_strip { 33, 833, 0, INTERPOLATE_POINTS, (-0.996910, 0.008090, 0.005000), (-1.246910, 0.008090, 0.005000), 144 } +led_strip { 33, 834, 0, INTERPOLATE_POINTS, (-1.252375, 0.008090, -0.014239), (-1.002375, 0.008090, -0.014239), 144 } +led_strip { 34, 856, 0, INTERPOLATE_POINTS, (-0.809779, 0.490851, 0.312982), (-1.012033, 0.615851, 0.390236), 144 } +led_strip { 34, 857, 0, INTERPOLATE_POINTS, (-1.010509, 0.634149, 0.382306), (-0.808255, 0.509149, 0.305052), 144 } +led_strip { 34, 858, 0, INTERPOLATE_POINTS, (-0.804017, 0.496910, 0.317107), (-1.006271, 0.621910, 0.394361), 144 } +led_strip { 34, 859, 0, INTERPOLATE_POINTS, (-1.004748, 0.640207, 0.386431), (-0.802493, 0.515207, 0.309177), 144 } +led_strip { 35, 881, 0, INTERPOLATE_POINTS, (-0.809779, -0.490851, 0.312982), (-1.012033, -0.615851, 0.390236), 144 } +led_strip { 35, 882, 0, INTERPOLATE_POINTS, (-1.010509, -0.634149, 0.382306), (-0.808255, -0.509149, 0.305052), 144 } +led_strip { 35, 883, 0, INTERPOLATE_POINTS, (-0.812107, -0.491910, 0.304017), (-1.014361, -0.616910, 0.381271), 144 } +led_strip { 35, 884, 0, INTERPOLATE_POINTS, (-1.012838, -0.635207, 0.373341), (-0.810584, -0.510207, 0.296086), 144 } +led_strip { 36, 906, 0, INTERPOLATE_POINTS, (-0.803834, 0.506416, -0.303363), (-1.006088, 0.631416, -0.380617), 144 } +led_strip { 36, 907, 0, INTERPOLATE_POINTS, (-1.016455, 0.618584, -0.391925), (-0.814200, 0.493584, -0.314671), 144 } +led_strip { 36, 908, 0, INTERPOLATE_POINTS, (-0.800927, 0.505000, -0.312107), (-1.003181, 0.630000, -0.389361), 144 } +led_strip { 36, 909, 0, INTERPOLATE_POINTS, (-1.013548, 0.617168, -0.400670), (-0.811293, 0.492168, -0.323415), 144 } +led_strip { 37, 931, 0, INTERPOLATE_POINTS, (-0.803834, -0.506416, -0.303363), (-1.006088, -0.631416, -0.380617), 144 } +led_strip { 37, 932, 0, INTERPOLATE_POINTS, (-1.016455, -0.618584, -0.391925), (-0.814200, -0.493584, -0.314671), 144 } +led_strip { 37, 933, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.299017), (-1.011271, -0.625000, -0.376271), 144 } +led_strip { 37, 934, 0, INTERPOLATE_POINTS, (-1.021638, -0.612168, -0.387580), (-0.819384, -0.487168, -0.310325), 144 } +led_strip { 38, 956, 0, INTERPOLATE_POINTS, (0.803834, 0.506416, -0.303363), (1.006088, 0.631416, -0.380617), 144 } +led_strip { 38, 957, 0, INTERPOLATE_POINTS, (1.016455, 0.618584, -0.391925), (0.814200, 0.493584, -0.314671), 144 } +led_strip { 38, 958, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.299017), (1.011271, 0.625000, -0.376271), 144 } +led_strip { 38, 959, 0, INTERPOLATE_POINTS, (1.021638, 0.612168, -0.387580), (0.819384, 0.487168, -0.310325), 144 } +led_strip { 39, 981, 0, INTERPOLATE_POINTS, (0.803834, -0.506416, -0.303363), (1.006088, -0.631416, -0.380617), 144 } +led_strip { 39, 982, 0, INTERPOLATE_POINTS, (1.016455, -0.618584, -0.391925), (0.814200, -0.493584, -0.314671), 144 } +led_strip { 39, 983, 0, INTERPOLATE_POINTS, (0.800927, -0.505000, -0.312107), (1.003181, -0.630000, -0.389361), 144 } +led_strip { 39, 984, 0, INTERPOLATE_POINTS, (1.013548, -0.617168, -0.400670), (0.811293, -0.492168, -0.323415), 144 } +led_strip { 40, 1006, 0, INTERPOLATE_POINTS, (0.009619, 0.997267, 0.000000), (0.009619, 1.247267, 0.000000), 144 } +led_strip { 40, 1007, 0, INTERPOLATE_POINTS, (-0.009619, 1.252733, 0.000000), (-0.009619, 1.002733, 0.000000), 144 } +led_strip { 40, 1008, 0, INTERPOLATE_POINTS, (0.005000, 0.996910, -0.008090), (0.005000, 1.246910, -0.008090), 144 } +led_strip { 40, 1009, 0, INTERPOLATE_POINTS, (-0.014239, 1.252375, -0.008090), (-0.014239, 1.002375, -0.008090), 144 } +led_strip { 41, 1031, 0, INTERPOLATE_POINTS, (0.009619, -0.997267, 0.000000), (0.009619, -1.247267, 0.000000), 144 } +led_strip { 41, 1032, 0, INTERPOLATE_POINTS, (-0.009619, -1.252733, 0.000000), (-0.009619, -1.002733, 0.000000), 144 } +led_strip { 41, 1033, 0, INTERPOLATE_POINTS, (0.005000, -0.996910, 0.008090), (0.005000, -1.246910, 0.008090), 144 } +led_strip { 41, 1034, 0, INTERPOLATE_POINTS, (-0.014239, -1.252375, 0.008090), (-0.014239, -1.002375, 0.008090), 144 } +END_OF_ASSEMBLY_FILE \ No newline at end of file diff --git a/data/radialumia.txt b/data/radialumia.txt new file mode 100644 index 0000000..53c8824 Binary files /dev/null and b/data/radialumia.txt differ diff --git a/data/radialumia_burn.fold b/data/radialumia_burn.fold new file mode 100644 index 0000000..6be257f --- /dev/null +++ b/data/radialumia_burn.fold @@ -0,0 +1,452 @@ +control_box_count 42 +led_strip_count 240 + +control_box { 0, "192.168.1.200", (0.000000, 0.525731, 0.850651) } +control_box { 1, "192.168.1.201", (0.000000, -0.525731, 0.850651) } +control_box { 2, "192.168.1.202", (0.000000, -0.525731, -0.850651) } +control_box { 3, "192.168.1.203", (0.000000, 0.525731, -0.850651) } +control_box { 4, "192.168.1.204", (0.850651, 0.000000, 0.525731) } +control_box { 5, "192.168.1.205", (-0.850651, 0.000000, 0.525731) } +control_box { 6, "192.168.1.206", (-0.850651, 0.000000, -0.525731) } +control_box { 7, "192.168.1.207", (0.850651, 0.000000, -0.525731) } +control_box { 8, "192.168.1.208", (0.525731, 0.850651, 0.000000) } +control_box { 9, "192.168.1.209", (-0.525731, 0.850651, 0.000000) } +control_box { 10, "192.168.1.210", (-0.525731, -0.850651, 0.000000) } +control_box { 11, "192.168.1.211", (0.525731, -0.850651, 0.000000) } +control_box { 12, "192.168.1.212", (0.000000, 0.000000, 1.000000) } +control_box { 13, "192.168.1.213", (0.500000, 0.309017, 0.809017) } +control_box { 14, "192.168.1.214", (-0.500000, 0.309017, 0.809017) } +control_box { 15, "192.168.1.215", (0.309017, 0.809017, 0.500000) } +control_box { 16, "192.168.1.216", (-0.309017, 0.809017, 0.500000) } +control_box { 17, "192.168.1.217", (0.500000, -0.309017, 0.809017) } +control_box { 18, "192.168.1.218", (-0.500000, -0.309017, 0.809017) } +control_box { 19, "192.168.1.219", (-0.309017, -0.809017, 0.500000) } +control_box { 20, "192.168.1.220", (0.309017, -0.809017, 0.500000) } +control_box { 21, "192.168.1.221", (0.000000, 0.000000, -1.000000) } +control_box { 22, "192.168.1.222", (-0.500000, -0.309017, -0.809017) } +control_box { 23, "192.168.1.223", (0.500000, -0.309017, -0.809017) } +control_box { 24, "192.168.1.224", (-0.309017, -0.809017, -0.500000) } +control_box { 25, "192.168.1.225", (0.309017, -0.809017, -0.500000) } +control_box { 26, "192.168.1.226", (-0.500000, 0.309017, -0.809017) } +control_box { 27, "192.168.1.227", (0.500000, 0.309017, -0.809017) } +control_box { 28, "192.168.1.228", (0.309017, 0.809017, -0.500000) } +control_box { 29, "192.168.1.229", (-0.309017, 0.809017, -0.500000) } +control_box { 30, "192.168.1.230", (1.000000, 0.000000, 0.000000) } +control_box { 31, "192.168.1.231", (0.809017, 0.500000, 0.309017) } +control_box { 32, "192.168.1.232", (0.809017, -0.500000, 0.309017) } +control_box { 33, "192.168.1.233", (-1.000000, 0.000000, 0.000000) } +control_box { 34, "192.168.1.234", (-0.809017, 0.500000, 0.309017) } +control_box { 35, "192.168.1.235", (-0.809017, -0.500000, 0.309017) } +control_box { 36, "192.168.1.236", (-0.809017, 0.500000, -0.309017) } +control_box { 37, "192.168.1.237", (-0.809017, -0.500000, -0.309017) } +control_box { 38, "192.168.1.238", (0.809017, 0.500000, -0.309017) } +control_box { 39, "192.168.1.239", (0.809017, -0.500000, -0.309017) } +control_box { 40, "192.168.1.240", (0.000000, 1.000000, 0.000000) } +control_box { 41, "192.168.1.241", (0.000000, -1.000000, 0.000000) } + +led_strip { 0, 0, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 0, 1, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 0, 2, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 0, 3, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 0, 4, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, 0.850651), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 1, 25, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 1, 26, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 1, 27, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 1, 28, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 1, 29, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, 0.850651), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 2, 50, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 2, 51, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 2, 52, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 2, 53, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 2, 54, 0, INTERPOLATE_POINTS, (0.000000, -0.525731, -0.850651), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 3, 75, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 3, 76, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 3, 77, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 3, 78, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 3, 79, 0, INTERPOLATE_POINTS, (0.000000, 0.525731, -0.850651), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 4, 100, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 4, 101, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 4, 102, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 4, 103, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 4, 104, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, 0.525731), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 5, 125, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 5, 126, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 5, 127, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 5, 128, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 5, 129, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, 0.525731), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 6, 150, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 6, 151, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 6, 152, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 6, 153, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 6, 154, 0, INTERPOLATE_POINTS, (-0.850651, 0.000000, -0.525731), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 7, 175, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 7, 176, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 7, 177, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 7, 178, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 7, 179, 0, INTERPOLATE_POINTS, (0.850651, 0.000000, -0.525731), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 8, 200, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 8, 201, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 8, 202, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 8, 203, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 8, 204, 0, INTERPOLATE_POINTS, (0.525731, 0.850651, 0.000000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 9, 225, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 9, 226, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 9, 227, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 9, 228, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 9, 229, 0, INTERPOLATE_POINTS, (-0.525731, 0.850651, 0.000000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 10, 250, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 10, 251, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 10, 252, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 10, 253, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 10, 254, 0, INTERPOLATE_POINTS, (-0.525731, -0.850651, 0.000000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 11, 275, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 11, 276, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 11, 277, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 11, 278, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 11, 279, 0, INTERPOLATE_POINTS, (0.525731, -0.850651, 0.000000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 12, 300, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 12, 301, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 12, 302, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 12, 303, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 12, 304, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 12, 305, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, 1.000000), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 13, 325, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 13, 326, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 13, 327, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 13, 328, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 13, 329, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 13, 330, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, 0.809017), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 14, 350, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 14, 351, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 14, 352, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 14, 353, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 14, 354, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 14, 355, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 15, 375, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 15, 376, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 15, 377, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 15, 378, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 15, 379, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 15, 380, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, 0.500000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 16, 400, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 16, 401, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 16, 402, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 16, 403, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.000000, 0.525731, 0.850651), 144 } +led_strip { 16, 404, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 16, 405, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, 0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 17, 425, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 17, 426, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 17, 427, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 17, 428, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 17, 429, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 17, 430, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, 0.809017), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 18, 450, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 18, 451, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 18, 452, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 18, 453, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 18, 454, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (0.000000, 0.000000, 1.000000), 144 } +led_strip { 18, 455, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, 0.809017), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 19, 475, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 19, 476, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.500000, -0.309017, 0.809017), 144 } +led_strip { 19, 477, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 19, 478, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 19, 479, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 19, 480, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, 0.500000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 20, 500, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 20, 501, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 20, 502, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 20, 503, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.000000, -0.525731, 0.850651), 144 } +led_strip { 20, 504, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 20, 505, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, 0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 21, 525, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 21, 526, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 21, 527, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 21, 528, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 21, 529, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 21, 530, 0, INTERPOLATE_POINTS, (0.000000, 0.000000, -1.000000), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 22, 550, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 22, 551, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 22, 552, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 22, 553, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 22, 554, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 22, 555, 0, INTERPOLATE_POINTS, (-0.500000, -0.309017, -0.809017), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 23, 575, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 23, 576, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 23, 577, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 23, 578, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 23, 579, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 23, 580, 0, INTERPOLATE_POINTS, (0.500000, -0.309017, -0.809017), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 24, 600, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 24, 601, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 24, 602, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 24, 603, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 24, 604, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 24, 605, 0, INTERPOLATE_POINTS, (-0.309017, -0.809017, -0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 25, 625, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 25, 626, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.000000, -1.000000, 0.000000), 144 } +led_strip { 25, 627, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 25, 628, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.000000, -0.525731, -0.850651), 144 } +led_strip { 25, 629, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 25, 630, 0, INTERPOLATE_POINTS, (0.309017, -0.809017, -0.500000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 26, 650, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 26, 651, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 26, 652, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 26, 653, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 26, 654, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 26, 655, 0, INTERPOLATE_POINTS, (-0.500000, 0.309017, -0.809017), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 27, 675, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 27, 676, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 27, 677, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 27, 678, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 27, 679, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 27, 680, 0, INTERPOLATE_POINTS, (0.500000, 0.309017, -0.809017), (0.000000, 0.000000, -1.000000), 144 } +led_strip { 28, 700, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 28, 701, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 28, 702, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 28, 703, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 28, 704, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 28, 705, 0, INTERPOLATE_POINTS, (0.309017, 0.809017, -0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 29, 725, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 29, 726, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.000000, 1.000000, 0.000000), 144 } +led_strip { 29, 727, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 29, 728, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (0.000000, 0.525731, -0.850651), 144 } +led_strip { 29, 729, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 29, 730, 0, INTERPOLATE_POINTS, (-0.309017, 0.809017, -0.500000), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 30, 750, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 30, 751, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 30, 752, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 30, 753, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 30, 754, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 30, 755, 0, INTERPOLATE_POINTS, (1.000000, 0.000000, 0.000000), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 31, 775, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 31, 776, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 31, 777, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.500000, 0.309017, 0.809017), 144 } +led_strip { 31, 778, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 31, 779, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 31, 780, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, 0.309017), (0.809017, 0.500000, -0.309017), 144 } +led_strip { 32, 800, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 32, 801, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.809017, -0.500000, -0.309017), 144 } +led_strip { 32, 802, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 32, 803, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.850651, 0.000000, 0.525731), 144 } +led_strip { 32, 804, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.500000, -0.309017, 0.809017), 144 } +led_strip { 32, 805, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.309017), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 33, 825, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 33, 826, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 33, 827, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, 0.500000, -0.309017), 144 } led_strip { 33, 829, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 33, 830, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 34, 850, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 34, 851, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.500000, 0.309017, 0.809017), 144 } +led_strip { 34, 852, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 34, 853, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 34, 854, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-0.809017, 0.500000, -0.309017), 144 } +led_strip { 34, 855, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, 0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 35, 875, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.850651, 0.000000, 0.525731), 144 } +led_strip { 35, 876, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 35, 877, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.809017, -0.500000, -0.309017), 144 } +led_strip { 35, 878, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 35, 879, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, 0.309017), (-0.309017, -0.809017, 0.500000), 144 } led_strip { 36, 900, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 36, 901, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 36, 902, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.500000, 0.309017, -0.809017), 144 } +led_strip { 36, 903, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 36, 904, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 36, 905, 0, INTERPOLATE_POINTS, (-0.809017, 0.500000, -0.309017), (-0.809017, 0.500000, 0.309017), 144 } +led_strip { 37, 925, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 37, 926, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.809017, -0.500000, 0.309017), 144 } +led_strip { 37, 927, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-1.000000, 0.000000, 0.000000), 144 } +led_strip { 37, 928, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.850651, 0.000000, -0.525731), 144 } +led_strip { 37, 929, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.500000, -0.309017, -0.809017), 144 } +led_strip { 37, 930, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.309017), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 38, 950, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 38, 951, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.809017, 0.500000, 0.309017), 144 } +led_strip { 38, 952, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 38, 953, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 38, 954, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.500000, 0.309017, -0.809017), 144 } +led_strip { 38, 955, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.309017), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 39, 975, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 39, 976, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.309017, -0.809017, -0.500000), 144 } +led_strip { 39, 977, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.500000, -0.309017, -0.809017), 144 } +led_strip { 39, 978, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.850651, 0.000000, -0.525731), 144 } +led_strip { 39, 979, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (1.000000, 0.000000, 0.000000), 144 } +led_strip { 39, 980, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, -0.309017), (0.809017, -0.500000, 0.309017), 144 } +led_strip { 40, 1000, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.525731, 0.850651, 0.000000), 144 } +led_strip { 40, 1001, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.309017, 0.809017, -0.500000), 144 } +led_strip { 40, 1002, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.309017, 0.809017, -0.500000), 144 } +led_strip { 40, 1003, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.525731, 0.850651, 0.000000), 144 } +led_strip { 40, 1004, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (-0.309017, 0.809017, 0.500000), 144 } +led_strip { 40, 1005, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.309017, 0.809017, 0.500000), 144 } +led_strip { 41, 1025, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.525731, -0.850651, 0.000000), 144 } +led_strip { 41, 1026, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.309017, -0.809017, 0.500000), 144 } +led_strip { 41, 1027, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.309017, -0.809017, 0.500000), 144 } +led_strip { 41, 1028, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.525731, -0.850651, 0.000000), 144 } +led_strip { 41, 1029, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (-0.309017, -0.809017, -0.500000), 144 } +led_strip { 41, 1030, 0, INTERPOLATE_POINTS, (0.000000, -1.000000, 0.000000), (0.309017, -0.809017, -0.500000), 144 } + +led_strip { 0, 5, 0, INTERPOLATE_POINTS, (-0.005654, 0.530914, 0.844235), (-0.005654, 0.662347, 1.056898), 144 } +led_strip { 0, 6, 0, INTERPOLATE_POINTS, (0.005654, 0.651981, 1.069729), (0.005654, 0.520548, 0.857067), 144 } +led_strip { 0, 7, 0, INTERPOLATE_POINTS, (-0.009149, 0.521766, 0.849889), (-0.009149, 0.653199, 1.062552), 144 } +led_strip { 0, 8, 0, INTERPOLATE_POINTS, (0.002160, 0.642832, 1.075384), (0.002160, 0.511399, 0.862721), 144 } +led_strip { 1, 30, 0, INTERPOLATE_POINTS, (0.005654, -0.530914, 0.844235), (0.005654, -0.662347, 1.056898), 144 } +led_strip { 1, 31, 0, INTERPOLATE_POINTS, (-0.005654, -0.651981, 1.069729), (-0.005654, -0.520548, 0.857067), 144 } +led_strip { 1, 32, 0, INTERPOLATE_POINTS, (0.009149, -0.521766, 0.849889), (0.009149, -0.653199, 1.062552), 144 } +led_strip { 1, 33, 0, INTERPOLATE_POINTS, (-0.002160, -0.642832, 1.075384), (-0.002160, -0.511399, 0.862721), 144 } +led_strip { 2, 55, 0, INTERPOLATE_POINTS, (-0.005654, -0.530914, -0.844235), (-0.005654, -0.662347, -1.056898), 144 } +led_strip { 2, 56, 0, INTERPOLATE_POINTS, (0.005654, -0.651981, -1.069729), (0.005654, -0.520548, -0.857067), 144 } +led_strip { 2, 57, 0, INTERPOLATE_POINTS, (-0.009149, -0.521766, -0.849889), (-0.009149, -0.653199, -1.062552), 144 } +led_strip { 2, 58, 0, INTERPOLATE_POINTS, (0.002160, -0.642832, -1.075384), (0.002160, -0.511399, -0.862721), 144 } +led_strip { 3, 80, 0, INTERPOLATE_POINTS, (0.005654, 0.530914, -0.844235), (0.005654, 0.662347, -1.056898), 144 } +led_strip { 3, 81, 0, INTERPOLATE_POINTS, (-0.005654, 0.651981, -1.069729), (-0.005654, 0.520548, -0.857067), 144 } +led_strip { 3, 82, 0, INTERPOLATE_POINTS, (0.009149, 0.521766, -0.849889), (0.009149, 0.653199, -1.062552), 144 } +led_strip { 3, 83, 0, INTERPOLATE_POINTS, (-0.002160, 0.642832, -1.075384), (-0.002160, 0.511399, -0.862721), 144 } +led_strip { 4, 105, 0, INTERPOLATE_POINTS, (0.849889, 0.009149, 0.521766), (1.062552, 0.009149, 0.653199), 144 } +led_strip { 4, 106, 0, INTERPOLATE_POINTS, (1.064075, -0.009149, 0.661129), (0.851413, -0.009149, 0.529696), 144 } +led_strip { 4, 107, 0, INTERPOLATE_POINTS, (0.844235, 0.005654, 0.530914), (1.056898, 0.005654, 0.662347), 144 } +led_strip { 4, 108, 0, INTERPOLATE_POINTS, (1.058421, -0.012643, 0.670278), (0.845758, -0.012643, 0.538845), 144 } +led_strip { 5, 130, 0, INTERPOLATE_POINTS, (-0.844235, 0.005654, 0.530914), (-1.056898, 0.005654, 0.662347), 144 } +led_strip { 5, 131, 0, INTERPOLATE_POINTS, (-1.069729, -0.005654, 0.651981), (-0.857067, -0.005654, 0.520548), 144 } +led_strip { 5, 132, 0, INTERPOLATE_POINTS, (-0.849889, 0.009149, 0.521766), (-1.062552, 0.009149, 0.653199), 144 } +led_strip { 5, 133, 0, INTERPOLATE_POINTS, (-1.075384, -0.002160, 0.642832), (-0.862721, -0.002160, 0.511399), 144 } +led_strip { 6, 155, 0, INTERPOLATE_POINTS, (-0.849889, 0.009149, -0.521766), (-1.062552, 0.009149, -0.653199), 144 } +led_strip { 6, 156, 0, INTERPOLATE_POINTS, (-1.064075, -0.009149, -0.661129), (-0.851413, -0.009149, -0.529696), 144 } +led_strip { 6, 157, 0, INTERPOLATE_POINTS, (-0.844235, 0.005654, -0.530914), (-1.056898, 0.005654, -0.662347), 144 } +led_strip { 6, 158, 0, INTERPOLATE_POINTS, (-1.058421, -0.012643, -0.670278), (-0.845758, -0.012643, -0.538845), 144 } +led_strip { 7, 180, 0, INTERPOLATE_POINTS, (0.853383, 0.000000, -0.516112), (1.066046, 0.000000, -0.647545), 144 } +led_strip { 7, 181, 0, INTERPOLATE_POINTS, (1.060581, 0.000000, -0.666783), (0.847918, 0.000000, -0.535351), 144 } +led_strip { 7, 182, 0, INTERPOLATE_POINTS, (0.849889, -0.009149, -0.521766), (1.062552, -0.009149, -0.653199), 144 } +led_strip { 7, 183, 0, INTERPOLATE_POINTS, (1.057086, -0.009149, -0.672437), (0.844424, -0.009149, -0.541005), 144 } +led_strip { 8, 205, 0, INTERPOLATE_POINTS, (0.530914, 0.844235, -0.005654), (0.662347, 1.056898, -0.005654), 144 } +led_strip { 8, 206, 0, INTERPOLATE_POINTS, (0.651981, 1.069729, 0.005654), (0.520548, 0.857067, 0.005654), 144 } +led_strip { 8, 207, 0, INTERPOLATE_POINTS, (0.521766, 0.849889, -0.009149), (0.653199, 1.062552, -0.009149), 144 } +led_strip { 8, 208, 0, INTERPOLATE_POINTS, (0.642832, 1.075384, 0.002160), (0.511399, 0.862721, 0.002160), 144 } +led_strip { 9, 230, 0, INTERPOLATE_POINTS, (-0.530914, 0.844235, -0.005654), (-0.662347, 1.056898, -0.005654), 144 } +led_strip { 9, 231, 0, INTERPOLATE_POINTS, (-0.651981, 1.069729, 0.005654), (-0.520548, 0.857067, 0.005654), 144 } +led_strip { 9, 232, 0, INTERPOLATE_POINTS, (-0.530914, 0.844235, 0.005654), (-0.662347, 1.056898, 0.005654), 144 } +led_strip { 9, 233, 0, INTERPOLATE_POINTS, (-0.651981, 1.069729, 0.016962), (-0.520548, 0.857067, 0.016962), 144 } +led_strip { 10, 255, 0, INTERPOLATE_POINTS, (-0.530914, -0.844235, 0.005654), (-0.662347, -1.056898, 0.005654), 144 } +led_strip { 10, 256, 0, INTERPOLATE_POINTS, (-0.651981, -1.069729, -0.005654), (-0.520548, -0.857067, -0.005654), 144 } +led_strip { 10, 257, 0, INTERPOLATE_POINTS, (-0.530914, -0.844235, -0.005654), (-0.662347, -1.056898, -0.005654), 144 } +led_strip { 10, 258, 0, INTERPOLATE_POINTS, (-0.651981, -1.069729, -0.016962), (-0.520548, -0.857067, -0.016962), 144 } +led_strip { 11, 280, 0, INTERPOLATE_POINTS, (0.530914, -0.844235, 0.005654), (0.662347, -1.056898, 0.005654), 144 } +led_strip { 11, 281, 0, INTERPOLATE_POINTS, (0.651981, -1.069729, -0.005654), (0.520548, -0.857067, -0.005654), 144 } +led_strip { 11, 282, 0, INTERPOLATE_POINTS, (0.521766, -0.849889, 0.009149), (0.653199, -1.062552, 0.009149), 144 } +led_strip { 11, 283, 0, INTERPOLATE_POINTS, (0.642832, -1.075384, -0.002160), (0.511399, -0.862721, -0.002160), 144 } +led_strip { 12, 306, 0, INTERPOLATE_POINTS, (0.000000, 0.009619, 0.997267), (0.000000, 0.009619, 1.247267), 144 } +led_strip { 12, 307, 0, INTERPOLATE_POINTS, (0.000000, -0.009619, 1.252733), (0.000000, -0.009619, 1.002733), 144 } +led_strip { 12, 308, 0, INTERPOLATE_POINTS, (-0.008090, 0.005000, 0.996910), (-0.008090, 0.005000, 1.246910), 144 } +led_strip { 12, 309, 0, INTERPOLATE_POINTS, (-0.008090, -0.014239, 1.252375), (-0.008090, -0.014239, 1.002375), 144 } +led_strip { 13, 331, 0, INTERPOLATE_POINTS, (0.506416, 0.303363, 0.803834), (0.631416, 0.380617, 1.006088), 144 } +led_strip { 13, 332, 0, INTERPOLATE_POINTS, (0.618584, 0.391925, 1.016455), (0.493584, 0.314671, 0.814200), 144 } +led_strip { 13, 333, 0, INTERPOLATE_POINTS, (0.505000, 0.312107, 0.800927), (0.630000, 0.389361, 1.003181), 144 } +led_strip { 13, 334, 0, INTERPOLATE_POINTS, (0.617168, 0.400670, 1.013548), (0.492168, 0.323415, 0.811293), 144 } +led_strip { 14, 356, 0, INTERPOLATE_POINTS, (-0.490851, 0.312982, 0.809779), (-0.615851, 0.390236, 1.012033), 144 } +led_strip { 14, 357, 0, INTERPOLATE_POINTS, (-0.634149, 0.382306, 1.010509), (-0.509149, 0.305052, 0.808255), 144 } +led_strip { 14, 358, 0, INTERPOLATE_POINTS, (-0.496910, 0.317107, 0.804017), (-0.621910, 0.394361, 1.006271), 144 } +led_strip { 14, 359, 0, INTERPOLATE_POINTS, (-0.640207, 0.386431, 1.004748), (-0.515207, 0.309177, 0.802493), 144 } +led_strip { 15, 381, 0, INTERPOLATE_POINTS, (0.312982, 0.809779, 0.490851), (0.390236, 1.012033, 0.615851), 144 } +led_strip { 15, 382, 0, INTERPOLATE_POINTS, (0.382306, 1.010509, 0.634149), (0.305052, 0.808255, 0.509149), 144 } +led_strip { 15, 383, 0, INTERPOLATE_POINTS, (0.304017, 0.812107, 0.491910), (0.381271, 1.014361, 0.616910), 144 } +led_strip { 15, 384, 0, INTERPOLATE_POINTS, (0.373341, 1.012838, 0.635207), (0.296086, 0.810584, 0.510207), 144 } +led_strip { 16, 406, 0, INTERPOLATE_POINTS, (-0.312982, 0.809779, 0.490851), (-0.390236, 1.012033, 0.615851), 144 } +led_strip { 16, 407, 0, INTERPOLATE_POINTS, (-0.382306, 1.010509, 0.634149), (-0.305052, 0.808255, 0.509149), 144 } +led_strip { 16, 408, 0, INTERPOLATE_POINTS, (-0.317107, 0.804017, 0.496910), (-0.394361, 1.006271, 0.621910), 144 } +led_strip { 16, 409, 0, INTERPOLATE_POINTS, (-0.386431, 1.004748, 0.640207), (-0.309177, 0.802493, 0.515207), 144 } +led_strip { 17, 431, 0, INTERPOLATE_POINTS, (0.506416, -0.303363, 0.803834), (0.631416, -0.380617, 1.006088), 144 } +led_strip { 17, 432, 0, INTERPOLATE_POINTS, (0.618584, -0.391925, 1.016455), (0.493584, -0.314671, 0.814200), 144 } +led_strip { 17, 433, 0, INTERPOLATE_POINTS, (0.500000, -0.299017, 0.809017), (0.625000, -0.376271, 1.011271), 144 } +led_strip { 17, 434, 0, INTERPOLATE_POINTS, (0.612168, -0.387580, 1.021638), (0.487168, -0.310325, 0.819384), 144 } +led_strip { 18, 456, 0, INTERPOLATE_POINTS, (-0.506416, -0.303363, 0.803834), (-0.631416, -0.380617, 1.006088), 144 } +led_strip { 18, 457, 0, INTERPOLATE_POINTS, (-0.618584, -0.391925, 1.016455), (-0.493584, -0.314671, 0.814200), 144 } +led_strip { 18, 458, 0, INTERPOLATE_POINTS, (-0.505000, -0.312107, 0.800927), (-0.630000, -0.389361, 1.003181), 144 } +led_strip { 18, 459, 0, INTERPOLATE_POINTS, (-0.617168, -0.400670, 1.013548), (-0.492168, -0.323415, 0.811293), 144 } +led_strip { 19, 481, 0, INTERPOLATE_POINTS, (-0.303363, -0.803834, 0.506416), (-0.380617, -1.006088, 0.631416), 144 } +led_strip { 19, 482, 0, INTERPOLATE_POINTS, (-0.391925, -1.016455, 0.618584), (-0.314671, -0.814200, 0.493584), 144 } +led_strip { 19, 483, 0, INTERPOLATE_POINTS, (-0.312107, -0.800927, 0.505000), (-0.389361, -1.003181, 0.630000), 144 } +led_strip { 19, 484, 0, INTERPOLATE_POINTS, (-0.400670, -1.013548, 0.617168), (-0.323415, -0.811293, 0.492168), 144 } +led_strip { 20, 506, 0, INTERPOLATE_POINTS, (0.312982, -0.809779, 0.490851), (0.390236, -1.012033, 0.615851), 144 } +led_strip { 20, 507, 0, INTERPOLATE_POINTS, (0.382306, -1.010509, 0.634149), (0.305052, -0.808255, 0.509149), 144 } +led_strip { 20, 508, 0, INTERPOLATE_POINTS, (0.317107, -0.804017, 0.496910), (0.394361, -1.006271, 0.621910), 144 } +led_strip { 20, 509, 0, INTERPOLATE_POINTS, (0.386431, -1.004748, 0.640207), (0.309177, -0.802493, 0.515207), 144 } +led_strip { 21, 531, 0, INTERPOLATE_POINTS, (0.000000, 0.009619, -0.997267), (0.000000, 0.009619, -1.247267), 144 } +led_strip { 21, 532, 0, INTERPOLATE_POINTS, (0.000000, -0.009619, -1.252733), (0.000000, -0.009619, -1.002733), 144 } +led_strip { 21, 533, 0, INTERPOLATE_POINTS, (0.008090, 0.005000, -0.996910), (0.008090, 0.005000, -1.246910), 144 } +led_strip { 21, 534, 0, INTERPOLATE_POINTS, (0.008090, -0.014239, -1.252375), (0.008090, -0.014239, -1.002375), 144 } +led_strip { 22, 556, 0, INTERPOLATE_POINTS, (-0.506416, -0.303363, -0.803834), (-0.631416, -0.380617, -1.006088), 144 } +led_strip { 22, 557, 0, INTERPOLATE_POINTS, (-0.618584, -0.391925, -1.016455), (-0.493584, -0.314671, -0.814200), 144 } +led_strip { 22, 558, 0, INTERPOLATE_POINTS, (-0.500000, -0.299017, -0.809017), (-0.625000, -0.376271, -1.011271), 144 } +led_strip { 22, 559, 0, INTERPOLATE_POINTS, (-0.612168, -0.387580, -1.021638), (-0.487168, -0.310325, -0.819384), 144 } +led_strip { 23, 581, 0, INTERPOLATE_POINTS, (0.506416, -0.303363, -0.803834), (0.631416, -0.380617, -1.006088), 144 } +led_strip { 23, 582, 0, INTERPOLATE_POINTS, (0.618584, -0.391925, -1.016455), (0.493584, -0.314671, -0.814200), 144 } +led_strip { 23, 583, 0, INTERPOLATE_POINTS, (0.505000, -0.312107, -0.800927), (0.630000, -0.389361, -1.003181), 144 } +led_strip { 23, 584, 0, INTERPOLATE_POINTS, (0.617168, -0.400670, -1.013548), (0.492168, -0.323415, -0.811293), 144 } +led_strip { 24, 606, 0, INTERPOLATE_POINTS, (-0.312982, -0.809779, -0.490851), (-0.390236, -1.012033, -0.615851), 144 } +led_strip { 24, 607, 0, INTERPOLATE_POINTS, (-0.382306, -1.010509, -0.634149), (-0.305052, -0.808255, -0.509149), 144 } +led_strip { 24, 608, 0, INTERPOLATE_POINTS, (-0.317107, -0.804017, -0.496910), (-0.394361, -1.006271, -0.621910), 144 } +led_strip { 24, 609, 0, INTERPOLATE_POINTS, (-0.386431, -1.004748, -0.640207), (-0.309177, -0.802493, -0.515207), 144 } +led_strip { 25, 631, 0, INTERPOLATE_POINTS, (0.312982, -0.809779, -0.490851), (0.390236, -1.012033, -0.615851), 144 } +led_strip { 25, 632, 0, INTERPOLATE_POINTS, (0.382306, -1.010509, -0.634149), (0.305052, -0.808255, -0.509149), 144 } +led_strip { 25, 633, 0, INTERPOLATE_POINTS, (0.304017, -0.812107, -0.491910), (0.381271, -1.014361, -0.616910), 144 } +led_strip { 25, 634, 0, INTERPOLATE_POINTS, (0.373341, -1.012838, -0.635207), (0.296086, -0.810584, -0.510207), 144 } +led_strip { 26, 656, 0, INTERPOLATE_POINTS, (-0.490851, 0.312982, -0.809779), (-0.615851, 0.390236, -1.012033), 144 } +led_strip { 26, 657, 0, INTERPOLATE_POINTS, (-0.634149, 0.382306, -1.010509), (-0.509149, 0.305052, -0.808255), 144 } +led_strip { 26, 658, 0, INTERPOLATE_POINTS, (-0.491910, 0.304017, -0.812107), (-0.616910, 0.381271, -1.014361), 144 } +led_strip { 26, 659, 0, INTERPOLATE_POINTS, (-0.635207, 0.373341, -1.012838), (-0.510207, 0.296086, -0.810584), 144 } +led_strip { 27, 681, 0, INTERPOLATE_POINTS, (0.490851, 0.312982, -0.809779), (0.615851, 0.390236, -1.012033), 144 } +led_strip { 27, 682, 0, INTERPOLATE_POINTS, (0.634149, 0.382306, -1.010509), (0.509149, 0.305052, -0.808255), 144 } +led_strip { 27, 683, 0, INTERPOLATE_POINTS, (0.496910, 0.317107, -0.804017), (0.621910, 0.394361, -1.006271), 144 } +led_strip { 27, 684, 0, INTERPOLATE_POINTS, (0.640207, 0.386431, -1.004748), (0.515207, 0.309177, -0.802493), 144 } +led_strip { 28, 706, 0, INTERPOLATE_POINTS, (0.312982, 0.809779, -0.490851), (0.390236, 1.012033, -0.615851), 144 } +led_strip { 28, 707, 0, INTERPOLATE_POINTS, (0.382306, 1.010509, -0.634149), (0.305052, 0.808255, -0.509149), 144 } +led_strip { 28, 708, 0, INTERPOLATE_POINTS, (0.317107, 0.804017, -0.496910), (0.394361, 1.006271, -0.621910), 144 } +led_strip { 28, 709, 0, INTERPOLATE_POINTS, (0.386431, 1.004748, -0.640207), (0.309177, 0.802493, -0.515207), 144 } +led_strip { 29, 731, 0, INTERPOLATE_POINTS, (-0.312982, 0.809779, -0.490851), (-0.390236, 1.012033, -0.615851), 144 } +led_strip { 29, 732, 0, INTERPOLATE_POINTS, (-0.382306, 1.010509, -0.634149), (-0.305052, 0.808255, -0.509149), 144 } +led_strip { 29, 733, 0, INTERPOLATE_POINTS, (-0.304017, 0.812107, -0.491910), (-0.381271, 1.014361, -0.616910), 144 } +led_strip { 29, 734, 0, INTERPOLATE_POINTS, (-0.373341, 1.012838, -0.635207), (-0.296086, 0.810584, -0.510207), 144 } +led_strip { 30, 756, 0, INTERPOLATE_POINTS, (0.997267, 0.000000, -0.009619), (1.247267, 0.000000, -0.009619), 144 } +led_strip { 30, 757, 0, INTERPOLATE_POINTS, (1.252733, 0.000000, 0.009619), (1.002733, 0.000000, 0.009619), 144 } +led_strip { 30, 758, 0, INTERPOLATE_POINTS, (0.996910, 0.008090, -0.005000), (1.246910, 0.008090, -0.005000), 144 } +led_strip { 30, 759, 0, INTERPOLATE_POINTS, (1.252375, 0.008090, 0.014239), (1.002375, 0.008090, 0.014239), 144 } +led_strip { 31, 781, 0, INTERPOLATE_POINTS, (0.803834, 0.506416, 0.303363), (1.006088, 0.631416, 0.380617), 144 } +led_strip { 31, 782, 0, INTERPOLATE_POINTS, (1.016455, 0.618584, 0.391925), (0.814200, 0.493584, 0.314671), 144 } +led_strip { 31, 783, 0, INTERPOLATE_POINTS, (0.800927, 0.505000, 0.312107), (1.003181, 0.630000, 0.389361), 144 } +led_strip { 31, 784, 0, INTERPOLATE_POINTS, (1.013548, 0.617168, 0.400670), (0.811293, 0.492168, 0.323415), 144 } +led_strip { 32, 806, 0, INTERPOLATE_POINTS, (0.803834, -0.506416, 0.303363), (1.006088, -0.631416, 0.380617), 144 } +led_strip { 32, 807, 0, INTERPOLATE_POINTS, (1.016455, -0.618584, 0.391925), (0.814200, -0.493584, 0.314671), 144 } +led_strip { 32, 808, 0, INTERPOLATE_POINTS, (0.809017, -0.500000, 0.299017), (1.011271, -0.625000, 0.376271), 144 } +led_strip { 32, 809, 0, INTERPOLATE_POINTS, (1.021638, -0.612168, 0.387580), (0.819384, -0.487168, 0.310325), 144 } +led_strip { 33, 831, 0, INTERPOLATE_POINTS, (-0.997267, 0.000000, 0.009619), (-1.247267, 0.000000, 0.009619), 144 } +led_strip { 33, 832, 0, INTERPOLATE_POINTS, (-1.252733, 0.000000, -0.009619), (-1.002733, 0.000000, -0.009619), 144 } +led_strip { 33, 833, 0, INTERPOLATE_POINTS, (-0.996910, 0.008090, 0.005000), (-1.246910, 0.008090, 0.005000), 144 } +led_strip { 33, 834, 0, INTERPOLATE_POINTS, (-1.252375, 0.008090, -0.014239), (-1.002375, 0.008090, -0.014239), 144 } +led_strip { 34, 856, 0, INTERPOLATE_POINTS, (-0.809779, 0.490851, 0.312982), (-1.012033, 0.615851, 0.390236), 144 } +led_strip { 34, 857, 0, INTERPOLATE_POINTS, (-1.010509, 0.634149, 0.382306), (-0.808255, 0.509149, 0.305052), 144 } +led_strip { 34, 858, 0, INTERPOLATE_POINTS, (-0.804017, 0.496910, 0.317107), (-1.006271, 0.621910, 0.394361), 144 } +led_strip { 34, 859, 0, INTERPOLATE_POINTS, (-1.004748, 0.640207, 0.386431), (-0.802493, 0.515207, 0.309177), 144 } +led_strip { 35, 881, 0, INTERPOLATE_POINTS, (-0.809779, -0.490851, 0.312982), (-1.012033, -0.615851, 0.390236), 144 } +led_strip { 35, 882, 0, INTERPOLATE_POINTS, (-1.010509, -0.634149, 0.382306), (-0.808255, -0.509149, 0.305052), 144 } +led_strip { 35, 883, 0, INTERPOLATE_POINTS, (-0.812107, -0.491910, 0.304017), (-1.014361, -0.616910, 0.381271), 144 } +led_strip { 35, 884, 0, INTERPOLATE_POINTS, (-1.012838, -0.635207, 0.373341), (-0.810584, -0.510207, 0.296086), 144 } +led_strip { 36, 906, 0, INTERPOLATE_POINTS, (-0.803834, 0.506416, -0.303363), (-1.006088, 0.631416, -0.380617), 144 } +led_strip { 36, 907, 0, INTERPOLATE_POINTS, (-1.016455, 0.618584, -0.391925), (-0.814200, 0.493584, -0.314671), 144 } +led_strip { 36, 908, 0, INTERPOLATE_POINTS, (-0.800927, 0.505000, -0.312107), (-1.003181, 0.630000, -0.389361), 144 } +led_strip { 36, 909, 0, INTERPOLATE_POINTS, (-1.013548, 0.617168, -0.400670), (-0.811293, 0.492168, -0.323415), 144 } +led_strip { 37, 931, 0, INTERPOLATE_POINTS, (-0.803834, -0.506416, -0.303363), (-1.006088, -0.631416, -0.380617), 144 } +led_strip { 37, 932, 0, INTERPOLATE_POINTS, (-1.016455, -0.618584, -0.391925), (-0.814200, -0.493584, -0.314671), 144 } +led_strip { 37, 933, 0, INTERPOLATE_POINTS, (-0.809017, -0.500000, -0.299017), (-1.011271, -0.625000, -0.376271), 144 } +led_strip { 37, 934, 0, INTERPOLATE_POINTS, (-1.021638, -0.612168, -0.387580), (-0.819384, -0.487168, -0.310325), 144 } +led_strip { 38, 956, 0, INTERPOLATE_POINTS, (0.803834, 0.506416, -0.303363), (1.006088, 0.631416, -0.380617), 144 } +led_strip { 38, 957, 0, INTERPOLATE_POINTS, (1.016455, 0.618584, -0.391925), (0.814200, 0.493584, -0.314671), 144 } +led_strip { 38, 958, 0, INTERPOLATE_POINTS, (0.809017, 0.500000, -0.299017), (1.011271, 0.625000, -0.376271), 144 } +led_strip { 38, 959, 0, INTERPOLATE_POINTS, (1.021638, 0.612168, -0.387580), (0.819384, 0.487168, -0.310325), 144 } +led_strip { 39, 981, 0, INTERPOLATE_POINTS, (0.803834, -0.506416, -0.303363), (1.006088, -0.631416, -0.380617), 144 } +led_strip { 39, 982, 0, INTERPOLATE_POINTS, (1.016455, -0.618584, -0.391925), (0.814200, -0.493584, -0.314671), 144 } +led_strip { 39, 983, 0, INTERPOLATE_POINTS, (0.800927, -0.505000, -0.312107), (1.003181, -0.630000, -0.389361), 144 } +led_strip { 39, 984, 0, INTERPOLATE_POINTS, (1.013548, -0.617168, -0.400670), (0.811293, -0.492168, -0.323415), 144 } +led_strip { 40, 1006, 0, INTERPOLATE_POINTS, (0.009619, 0.997267, 0.000000), (0.009619, 1.247267, 0.000000), 144 } +led_strip { 40, 1007, 0, INTERPOLATE_POINTS, (-0.009619, 1.252733, 0.000000), (-0.009619, 1.002733, 0.000000), 144 } +led_strip { 40, 1008, 0, INTERPOLATE_POINTS, (0.005000, 0.996910, -0.008090), (0.005000, 1.246910, -0.008090), 144 } +led_strip { 40, 1009, 0, INTERPOLATE_POINTS, (-0.014239, 1.252375, -0.008090), (-0.014239, 1.002375, -0.008090), 144 } +led_strip { 41, 1031, 0, INTERPOLATE_POINTS, (0.009619, -0.997267, 0.000000), (0.009619, -1.247267, 0.000000), 144 } +led_strip { 41, 1032, 0, INTERPOLATE_POINTS, (-0.009619, -1.252733, 0.000000), (-0.009619, -1.002733, 0.000000), 144 } +led_strip { 41, 1033, 0, INTERPOLATE_POINTS, (0.005000, -0.996910, 0.008090), (0.005000, -1.246910, 0.008090), 144 } +led_strip { 41, 1034, 0, INTERPOLATE_POINTS, (-0.014239, -1.252375, 0.008090), (-0.014239, -1.002375, 0.008090), 144 } +END_OF_ASSEMBLY_FILE \ No newline at end of file diff --git a/data/shrumen_lumen.fold b/data/shrumen_lumen.fold new file mode 100644 index 0000000..a867a1f --- /dev/null +++ b/data/shrumen_lumen.fold @@ -0,0 +1,20 @@ +led_strip_count 16 + +led_strip { 0, 1, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (1.0, 0.75, 0.0), 90 } +led_strip { 0, 2, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.66, 0.75, 0.33), 90 } +led_strip { 0, 3, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.33, 0.75, 0.66), 90 } +led_strip { 0, 4, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.0, 0.75, 1.0), 90 } +led_strip { 0, 5, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (-0.33, 0.75, 0.66), 90 } +led_strip { 0, 6, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (-0.66, 0.75, 0.33), 90 } +led_strip { 0, 7, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (-1.0, 0.75, 0.0), 90 } +led_strip { 0, 8, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (-0.66, 0.75, -0.33), 90 } +led_strip { 0, 9, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (-0.33, 0.75, -0.66), 90 } +led_strip { 0, 10, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.0, 0.75, -1.0), 90 } +led_strip { 0, 11, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.33, 0.75, -0.66), 90 } +led_strip { 0, 12, 0, INTERPOLATE_POINTS, (0.0, 0.75, 0.0), (0.66, 0.75, -0.33), 90 } + +led_strip { 0, 41, 0, INTERPOLATE_POINTS, (0.05, -0.75, 0.0), (0.05, 0.0, 0.0), 170 } +led_strip { 0, 42, 0, INTERPOLATE_POINTS, (0.05, 0.0, 0.0), (0.05, 0.75, 0.0), 130 } +led_strip { 0, 43, 0, INTERPOLATE_POINTS, (-0.05, -0.75, 0.0), (-0.05, 0.0, 0.0), 170 } +led_strip { 0, 44, 0, INTERPOLATE_POINTS, (-0.05, 0.0, 0.0), (-0.05, 0.75, 0.0), 130 } +END_OF_ASSEMBLY_FILE diff --git a/data/splash.png b/data/splash.png new file mode 100644 index 0000000..02bb10a Binary files /dev/null and b/data/splash.png differ diff --git a/data/test_assembly.fold b/data/test_assembly.fold new file mode 100644 index 0000000..69a1cb1 --- /dev/null +++ b/data/test_assembly.fold @@ -0,0 +1,14 @@ +control_box_count 4 +led_strip_count 4 + +control_box { 0, "192.168.0.1", (1, 1, 1) } +control_box { 1, "192.168.0.2", (-1, 1, 1) } +control_box { 2, "192.168.0.3", (-1, 1, -1) } +control_box { 3, "192.168.0.4", (1, 1, -1) } + +led_strip { 0, 1, 0, INTERPOLATE_POINTS, (1.0, 1.0, 1.0), (-1.0, 1.0, 1.0), 144 } +led_strip { 1, 2, 0, INTERPOLATE_POINTS, (-1.0, 1.0, 1.0), (-1.0, 1.0, -1.0), 144 } +led_strip { 2, 3, 0, INTERPOLATE_POINTS, (-1.0, 1.0, -1.0), (1.0, 1.0, -1.0), 144 } +led_strip { 3, 4, 0, INTERPOLATE_POINTS, (1.0, 1.0, -1.0), (1.0, 1.0, 1.0), 144 } + +END_OF_ASSEMBLY_FILE \ No newline at end of file diff --git a/foldhaus_command_dispatch.cpp b/foldhaus_command_dispatch.cpp deleted file mode 100644 index a96944c..0000000 --- a/foldhaus_command_dispatch.cpp +++ /dev/null @@ -1,89 +0,0 @@ -internal void -InitializeInputCommandRegistry (input_command_registry* CommandRegistry, - s32 Size, - memory_arena* Storage) -{ - CommandRegistry->Commands = PushArray(Storage, input_command, Size); - CommandRegistry->Size = Size; - CommandRegistry->Used = 0; -} - -internal input_command* -FindExistingCommand (input_command_registry* CommandRegistry, key_code Key, key_code Mdfr) -{ - input_command* Result = 0; - - for (s32 Cmd = 0; Cmd < CommandRegistry->Used; Cmd++) - { - input_command* Command = CommandRegistry->Commands + Cmd; - if (Command->Key == Key && Command->Mdfr == Mdfr) - { - Result = Command; - break; - } - } - - return Result; -} - -internal void -RegisterKeyPressCommand (input_command_registry* CommandRegistry, - key_code Key, - b32 Held, - key_code Mdfr, - input_command_proc* Proc) -{ - input_command* Command = FindExistingCommand(CommandRegistry, Key, Mdfr); - - if (!Command) - { - Assert(CommandRegistry->Size > CommandRegistry->Used); - Assert(Mdfr == KeyCode_Invalid || Mdfr == KeyCode_LeftShift || Mdfr == KeyCode_RightShift || - Mdfr == KeyCode_LeftCtrl || Mdfr == KeyCode_RightCtrl || Mdfr == KeyCode_Alt); - Command = CommandRegistry->Commands + CommandRegistry->Used++; - } - - Command->Key = Key; - Command->Held = Held; - Command->Mdfr = Mdfr; - Command->Proc = Proc; -} - -internal void -RegisterMouseWheelCommand (input_command_registry* CommandRegistry, - input_command_proc* Proc) -{ - CommandRegistry->MouseWheelCommand = Proc; -} - -internal void -ExecuteAllRegisteredCommands (input_command_registry* CommandRegistry, - input Input, - app_state* State) -{ - if (Input.New->MouseScroll != 0) - { - CommandRegistry->MouseWheelCommand(State, Input); - } - - for (s32 i = 0; i < CommandRegistry->Used; i++) - { - input_command Command = CommandRegistry->Commands[i]; - if (Command.Held) - { - if (KeyDown(Input, Command.Key) && - (Command.Mdfr == KeyCode_Invalid || KeyDown(Input, Command.Mdfr))) - { - Command.Proc(State, Input); - } - } - else - { - if (KeyTransitionedDown(Input, Command.Key) && - (Command.Mdfr == KeyCode_Invalid || KeyDown(Input, Command.Mdfr))) - { - Command.Proc(State, Input); - } - } - } -} diff --git a/foldhaus_interface.cpp b/foldhaus_interface.cpp deleted file mode 100644 index c7ab0d1..0000000 --- a/foldhaus_interface.cpp +++ /dev/null @@ -1,68 +0,0 @@ -FOLDHAUS_INPUT_COMMAND_PROC(CameraMouseControl) -{ - if (State->NodeInteraction.NodeOffset >= 0) { return; } - - if (KeyTransitionedDown(Input, KeyCode_MouseLeftButton)) - { - State->Camera_StartDragPos = V4(State->Camera.Position, 1); - } - - if (KeyTransitionedUp(Input, KeyCode_MouseLeftButton)) - { - State->Camera_StartDragPos = V4(State->Camera.Position, 1); - } - else - { - if (!State->DrawUniverseOutputDisplay) - { - v2 DeltaPos = v2{ - (r32)(Input.New->MouseX - Input.MouseDownX), - (r32)(Input.New->MouseY - Input.MouseDownY) - }; - - m44 XRotation = GetXRotation(-DeltaPos.y * State->PixelsToWorldScale); - m44 YRotation = GetYRotation(DeltaPos.x * State->PixelsToWorldScale); - m44 Combined = XRotation * YRotation; - - State->Camera.Position = V3(Combined * State->Camera_StartDragPos); - } - else - { - v2 DeltaPos = v2{ - (r32)(Input.New->MouseX - Input.Old->MouseX), - (r32)(Input.New->MouseY - Input.Old->MouseY) - }; - - State->UniverseOutputDisplayOffset += DeltaPos; - } - } -} - -FOLDHAUS_INPUT_COMMAND_PROC(CameraMouseZoom) -{ - if (State->DrawUniverseOutputDisplay) - { - r32 DeltaZoom = (r32)(Input.New->MouseScroll) / 120; - State->UniverseOutputDisplayZoom = GSClamp(0.1f, State->UniverseOutputDisplayZoom + DeltaZoom, 4.f); - } - -} - -FOLDHAUS_INPUT_COMMAND_PROC(ToggleUniverseDebugView) -{ - State->DrawUniverseOutputDisplay = !State->DrawUniverseOutputDisplay; -} - - -FOLDHAUS_INPUT_COMMAND_PROC(OpenNodeLister) -{ - State->InterfaceShowNodeList = true; - State->NodeListMenuPosition = v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}; - SetTextInputDestinationToString(&State->ActiveTextEntry, &State->GeneralPurposeSearchString); - State->ActiveCommands = &State->NodeListerCommandRegistry; -} - -FOLDHAUS_INPUT_COMMAND_PROC(ToggleNodeDisplay) -{ - State->NodeRenderSettings.Display = !State->NodeRenderSettings.Display; -} \ No newline at end of file diff --git a/generated_old.cpp b/generated_old.cpp new file mode 100644 index 0000000..716bd1f --- /dev/null +++ b/generated_old.cpp @@ -0,0 +1,27 @@ +node_struct_member MemberList_multiply_data[] = { + { MemberType_r32, "A", (u64)&(((multiply_data*)0)->A), IsInputMember}, + { MemberType_r32, "B", (u64)&(((multiply_data*)0)->B), IsInputMember}, + { MemberType_r32, "Result", (u64)&(((multiply_data*)0)->Result), IsOutputMember}, +}; + +enum node_type +{ + NodeType_MultiplyNodeProc, +}; + +node_specification NodeSpecifications[] = { + { NodeType_MultiplyNodeProc, "Multiply", 8, MemberList_multiply_data, 3, 2, 1}, +}; +s32 NodeSpecificationsCount = 1; + +internal void +CallNodeProc (interface_node* Node, u8* Data) +{ + switch (Node->Type) + { + case NodeType_MultiplyNodeProc: + { + MultiplyNodeProc((multiply_data*)Data); + } break; + } +} \ No newline at end of file diff --git a/gs_input.h b/gs_input.h deleted file mode 100644 index e69de29..0000000 diff --git a/meta/build.bat b/meta/build.bat new file mode 100644 index 0000000..7c459fe --- /dev/null +++ b/meta/build.bat @@ -0,0 +1,26 @@ +@echo off + +set ProjectDevRoot=C:\projects +set ProjectName=foldhaus +set ProjectDevPath=%ProjectDevRoot%\%ProjectName% + +pushd %ProjectDevPath% + +IF NOT EXIST .\build\ mkdir .\build + +C:\programs\ctime\ctime.exe -begin %ProjectDevPath%\build\win32_gs_meta_build_time.ctm + +set CommonCompilerFlags=-nologo -DDEBUG=1 -DPLATFORM_WINDOWS -FC -WX -W4 -Z7 -Oi -GR- -EHsc -EHa- -MTd -fp:fast -fp:except- +set CommonCompilerFlags=-wd4127 -wd4702 -wd4101 -wd4505 -wd4100 -wd4189 -wd4244 -wd4201 -wd4996 -I%CommonLibs% -O2 %CommonCompilerFlags% +set CommonLinkerFlags= -opt:ref + +pushd build + +del *.pdb > NUL 2> NUL + +REM cl %CommonCompilerFlags% ..\meta\main_meta.cpp /link %CommonLinkerFlags% user32.lib winmm.lib gdi32.lib -incremental:no +cl %CommonCompilerFlags% ..\meta\foldhaus_meta.cpp /link %CommonLinkerFlags% + +C:\programs\ctime\ctime.exe -end C:\projects\foldhaus\build\win32_gs_meta_build_time.ctm %LastError% +C:\programs\ctime\ctime.exe -stats C:\projects\foldhaus\build\win32_gs_meta_build_time.ctm +popd \ No newline at end of file diff --git a/meta/foldhaus_meta.cpp b/meta/foldhaus_meta.cpp new file mode 100644 index 0000000..5cd8640 --- /dev/null +++ b/meta/foldhaus_meta.cpp @@ -0,0 +1,749 @@ +#include "..\src\gs_language.h" +#include "..\src\foldhaus_memory.h" +#include "..\src\gs_string.h" + +#include "gs_meta_error.h" +#include "gs_meta_lexer.h" + +#include +#include + +error_list GlobalErrorList = {}; + +PLATFORM_ALLOC(StdAlloc) +{ + platform_memory_result Result = {}; + Result.Base = (u8*)malloc(Size); + Result.Size = Size; + Result.Error = 0; + return Result; +} + +struct source_code_file +{ + string Path; + s32 FileSize; + string Contents; +}; + +struct code_block_builder +{ + memory_arena Data; + string String; +}; + +#define TYPE_TABLE_IDENTIFIER_MAX_LENGTH 128 +#define TYPE_TABLE_BUFFER_MAX 64 +struct type_table_buffer +{ + u8* IdentifiersBackbuffer; + string* Identifiers; + s32* Sizes; + s32 Used; + s32 Max; + type_table_buffer* Next; +}; + +struct type_table +{ + type_table_buffer* Head; + s32 TotalUsed; + s32 TotalMax; +}; + +internal void +AddTypeToTable (string Identifier, s32 Size, type_table* Table) +{ + if (!Table->Head || Table->TotalUsed >= Table->TotalMax) + { + s32 NewHeadSize = sizeof(type_table_buffer) + ((sizeof(string) + TYPE_TABLE_IDENTIFIER_MAX_LENGTH + sizeof(s32)) * TYPE_TABLE_BUFFER_MAX); + u8* NewHeadBuffer = (u8*)malloc(NewHeadSize); + static_memory_arena Memory = CreateMemoryArena(NewHeadBuffer, NewHeadSize); + + type_table_buffer* NewHead = PushStruct(&Memory, type_table_buffer); + NewHead->IdentifiersBackbuffer = PushArray(&Memory, u8, TYPE_TABLE_IDENTIFIER_MAX_LENGTH * TYPE_TABLE_BUFFER_MAX); + NewHead->Identifiers = PushArray(&Memory, string, TYPE_TABLE_BUFFER_MAX); + NewHead->Sizes = PushArray(&Memory, s32, TYPE_TABLE_BUFFER_MAX); + NewHead->Used = 0; + NewHead->Max = TYPE_TABLE_BUFFER_MAX; + NewHead->Next = 0; + + // Init Strings + for (s32 i = 0; i < NewHead->Max; i++) + { + string* String = NewHead->Identifiers + i; + u8* Backbuffer = NewHead->IdentifiersBackbuffer + (TYPE_TABLE_IDENTIFIER_MAX_LENGTH * i); + InitializeString(String, (char*)Backbuffer, 0, TYPE_TABLE_IDENTIFIER_MAX_LENGTH); + } + + if (Table->Head) { NewHead->Next = Table->Head; } + Table->Head = NewHead; + Table->TotalMax += NewHead->Max; + } + + s32 TypeIndex = Table->Head->Used++; + string* DestIdentifier = Table->Head->Identifiers + TypeIndex; + + CopyStringTo(Identifier, DestIdentifier); + Table->Head->Sizes[TypeIndex] = Size; +} + +internal s32 +GetSizeOfType (string Identifier, type_table* TypeTable) +{ + s32 Result = -1; + + type_table_buffer* Buffer = TypeTable->Head; + while (Buffer) + { + for (s32 i = 0; i < Buffer->Used; i++) + { + string StoredIdentifier = Buffer->Identifiers[i]; + if (StringsEqual(StoredIdentifier, Identifier)) + { + Result = Buffer->Sizes[i]; + break; + } + } + + if (Result > 0) + { + break; + } + else + { + Buffer = Buffer->Next; + } + } + + return Result; +} + +internal code_block_builder +InitCodeBlockBuilder() +{ + code_block_builder Result = {}; + InitMemoryArena(&Result.Data, 0, 0, StdAlloc); + return Result; +} + +internal void +CodeBlockPrint (code_block_builder* Block, string Source) +{ + char* NewCode = PushArray(&Block->Data, char, Source.Length); + GSMemCopy(Source.Memory, NewCode, Source.Length); + if (Block->String.Memory == 0) + { + Block->String.Memory = NewCode; + } + Block->String.Max += Source.Length; + Block->String.Length += Source.Length; +} + +internal void +WriteMemoryRegionToFile (memory_region* Region, FILE* WriteFile) +{ + if (Region->PreviousRegion) + { + WriteMemoryRegionToFile(Region->PreviousRegion, WriteFile); + } + fwrite(Region->Base, 1, Region->Used, WriteFile); +} + +internal void +WriteCodeBlockToFile(code_block_builder CodeBlock, FILE* WriteFile) +{ + memory_region* Region = CodeBlock.Data.CurrentRegion; + WriteMemoryRegionToFile (Region, WriteFile); +} + +internal s32 +GetFileSize (char* FileName) +{ + s32 Result = 0; + + FILE* ReadFile = fopen(FileName, "r"); + if (ReadFile) + { + fseek(ReadFile, 0, SEEK_END); + size_t FileSize = ftell(ReadFile); + fseek(ReadFile, 0, SEEK_SET); + + Result = (s32)FileSize; + fclose(ReadFile); + } + + return Result; +} + +internal s32 +ReadEntireFileAndNullTerminate (char* Filename, char* Memory, s32 MemorySize) +{ + s32 LengthRead = 0; + + FILE* ReadFile = fopen(Filename, "r"); + if (ReadFile) + { + fseek(ReadFile, 0, SEEK_END); + size_t FileSize = ftell(ReadFile); + fseek(ReadFile, 0, SEEK_SET); + if (FileSize <= MemorySize) + { + size_t ReadSize = fread(Memory, 1, FileSize, ReadFile); + Memory[FileSize] = 0; + LengthRead = (s32)ReadSize + 1; + } + fclose(ReadFile); + } + else + { + LogError(&GlobalErrorList, "Could Not Read File: %s", Filename); + } + + return LengthRead; +} + +internal void +EatToNextLine (tokenizer* Tokenizer) +{ + while (AtValidPosition(*Tokenizer) && !IsNewline(*Tokenizer->At)) + { + Tokenizer->At++; + } +} + +struct seen_node_struct +{ + string Name; + s32 MembersSize; + s32 MembersCount; + seen_node_struct* Next; +}; + +internal seen_node_struct* +FindSeenStructInList (seen_node_struct* SeenStructList, string Name) +{ + seen_node_struct* Result = 0; + + seen_node_struct* Iter = SeenStructList; + while(Iter) + { + if (StringsEqual(Name, Iter->Name)) + { + Result = Iter; + break; + } + Iter = Iter->Next; + } + + return Result; +} + +internal void +ParseNodeStruct (token* NodeStruct, code_block_builder* NodeMembersBlock, seen_node_struct* SeenStruct, type_table* TypeTable) +{ + token* OpenParen = NodeStruct->Next; + token* StructName = OpenParen->Next; + + SeenStruct->Name = StructName->Text; + + MakeStringBuffer(Buffer, 256); + + PrintF(&Buffer, "node_struct_member MemberList_%.*s[] = {\n", + StructName->Text.Length, StructName->Text.Memory); + CodeBlockPrint(NodeMembersBlock, Buffer); + + token* Token = StructName->Next; + while (Token->Type != Token_RightCurlyBracket) + { + if (Token->Type != Token_Identifier) + { + Token = Token->Next; + } + else + { + b32 IsInput = false; + b32 IsOutput = false; + + if (StringsEqual(MakeStringLiteral("NODE_IN"), Token->Text) || + StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_IN"), Token->Text)) + { + IsInput = true; + } + else if (StringsEqual(MakeStringLiteral("NODE_OUT"), Token->Text) || + StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_OUT"), Token->Text)) + { + IsOutput = true; + } + else if (StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_INOUT"), Token->Text)) + { + IsInput = true; + IsOutput = true; + } + else + { + SeenStruct->MembersSize += GetSizeOfType(Token->Text, TypeTable); + Token = GetNextTokenOfType(Token, Token_Semicolon)->Next; + continue; + } + + token* TypeToken = GetNextTokenOfType(Token, Token_Identifier); + token* NameToken = GetNextTokenOfType(TypeToken, Token_Identifier); + + MakeStringBuffer(TypeBuffer, 64); + MakeStringBuffer(NameBuffer, 64); + + CopyStringTo(TypeToken->Text, &TypeBuffer); + CopyStringTo(NameToken->Text, &NameBuffer); + + if (StringsEqual(MakeStringLiteral("s32"), TypeToken->Text)) + { + SeenStruct->MembersSize += sizeof(s32); + } + else if (StringsEqual(MakeStringLiteral("r32"), TypeToken->Text)) + { + SeenStruct->MembersSize += sizeof(r32); + } + else if (StringsEqual(MakeStringLiteral("v4"), TypeToken->Text)) + { + SeenStruct->MembersSize += sizeof(r32) * 4; + } + else if (StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_INOUT"), Token->Text)) + { + SeenStruct->MembersSize += sizeof(u32*) + sizeof(u32*) + sizeof(s32); + + CopyStringTo(MakeStringLiteral("NODE_COLOR_BUFFER"), &TypeBuffer); + CopyStringTo(MakeStringLiteral("LEDs"), &NameBuffer); + } + else if (StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_IN"), Token->Text) || + StringsEqual(MakeStringLiteral("NODE_COLOR_BUFFER_OUT"), Token->Text)) + { + SeenStruct->MembersSize += sizeof(u32*) + sizeof(u32*) + sizeof(s32); + + CopyStringTo(MakeStringLiteral("NODE_COLOR_BUFFER"), &TypeBuffer); + + CopyStringTo(TypeToken->Text, &NameBuffer); + ConcatString(MakeStringLiteral("LEDs"), &NameBuffer); + } + else + { + PrintF(&Buffer, "Invalid Type Specified for %.*s %.*s\n", + TypeToken->Text.Length, TypeToken->Text.Memory, + NameToken->Text.Length, NameToken->Text.Memory); + NullTerminate(&Buffer); + printf(Buffer.Memory); + return; + } + + PrintF(&Buffer, "{ MemberType_%.*s, \"%.*s\", (u64)&((%.*s*)0)->%.*s, %s %s %s},\n", + TypeBuffer.Length, TypeBuffer.Memory, + NameBuffer.Length, NameBuffer.Memory, + StructName->Text.Length, StructName->Text.Memory, + NameBuffer.Length, NameBuffer.Memory, + (IsInput ? "IsInputMember" : ""), + (IsInput && IsOutput ? "|" : ""), + (IsOutput ? "IsOutputMember" : "")); + CodeBlockPrint(NodeMembersBlock, Buffer); + + SeenStruct->MembersCount++; + Token = GetNextTokenOfType(Token, Token_Semicolon)->Next; + } + } + + CodeBlockPrint(NodeMembersBlock, MakeStringLiteral("};\n\n")); +} + +internal s32 +GetTypedefSize (token* Token) +{ + s32 Size = 0; + + token* LookingAt = Token->Next; + + if (StringsEqual(LookingAt->Text, MakeStringLiteral("unsigned")) || + StringsEqual(LookingAt->Text, MakeStringLiteral("signed"))) + { + LookingAt = LookingAt->Next; + } + + s32 Level = 1; + if (StringsEqual(LookingAt->Text, MakeStringLiteral("short"))) + { + Level = -1; + LookingAt = LookingAt->Next; + } + while (StringsEqual(LookingAt->Text, MakeStringLiteral("long"))) + { + Level= 2.f; + LookingAt = LookingAt->Next; + } + + if (StringsEqual(LookingAt->Text, MakeStringLiteral("char"))) + { + Size = 1; + } + else if (StringsEqual(LookingAt->Text, MakeStringLiteral("int"))) + { + switch (Level) + { + case -1: { Size = 2; } break; + case 1: { Size = 4; } break; + case 2: { Size = 8; } break; + InvalidDefaultCase; + } + } + else if (StringsEqual(LookingAt->Text, MakeStringLiteral("float"))) + { + Size = 4; + } + else if (StringsEqual(LookingAt->Text, MakeStringLiteral("double"))) + { + Size = 8; + } + else if (StringsEqual(LookingAt->Text, MakeStringLiteral("bool"))) + { + Size = 1; + } + else if (StringsEqual(LookingAt->Text, MakeStringLiteral("void"))) + { + LogError(&GlobalErrorList, "void type Not Handled"); + } + + return Size; +} + +internal string +GetTypedefIdentifier (token* Token) +{ + string Identifier = {}; + + token* PreviousToken = Token; + token* LookingAt = Token->Next; + while (LookingAt->Type != Token_Semicolon) + { + PreviousToken = LookingAt; + LookingAt = LookingAt->Next; + } + + if (PreviousToken->Type == Token_Identifier) + { + Identifier = PreviousToken->Text; + } + + return Identifier; +} + +internal void +ParseTypedefs (token* Tokens, type_table* TypeTable) +{ + string TypedefIdentifier = MakeStringLiteral("typedef"); + string StructIdentifier = MakeStringLiteral("struct"); + + token* Token = Tokens; + while (Token) + { + if (StringsEqual(Token->Text, TypedefIdentifier)) + { + if (!StringsEqual(Token->Next->Text, StructIdentifier)) + { + s32 Size = GetTypedefSize(Token); + string Identifier = GetTypedefIdentifier(Token); + if (Size > 0) // NOTE(Peter): This is just to skip over typedefs of structs and function pointers + { + AddTypeToTable(Identifier, Size, TypeTable); + } + } + } + Token = Token->Next; + } +} + +internal void +ParseNodeProc (token* NodeProc, + code_block_builder* NodeTypeBlock, + code_block_builder* NodeSpecificationsBlock, + code_block_builder* CallNodeProcBlock, + seen_node_struct* SeenStructs, + b32 IsPatternProc) +{ + token* ProcName = GetNextTokenOfType(NodeProc, Token_Identifier); + token* ProcArg = GetNextTokenOfType(ProcName, Token_Identifier); + + MakeStringBuffer(Buffer, 256); + + // Types Enum + PrintF(&Buffer, "NodeType_%.*s,\n", ProcName->Text.Length, ProcName->Text.Memory); + CodeBlockPrint(NodeTypeBlock, Buffer); + + // Node Specification + string ArgName = ProcArg->Text; + seen_node_struct* ArgStruct = FindSeenStructInList(SeenStructs, ArgName); + + PrintF(&Buffer, "{ NodeType_%.*s, \"%.*s\", %d, MemberList_%.*s, %d, %d, %.*s},\n", + ProcName->Text.Length, ProcName->Text.Memory, + ProcName->Text.Length, ProcName->Text.Memory, + ProcName->Text.Length, + ProcArg->Text.Length, ProcArg->Text.Memory, + ArgStruct->MembersSize, + ArgStruct->MembersCount, + (IsPatternProc ? 4 : 5), (IsPatternProc ? "true" : "false")); + CodeBlockPrint(NodeSpecificationsBlock, Buffer); + + // Call Node Proc + if (IsPatternProc) + { + LogError(&GlobalErrorList, "Node Proc is no longer supported"); + } + else + { + PrintF(&Buffer, "case NodeType_%.*s: { %.*s((%.*s*)Data, DeltaTime); } break; \n", + ProcName->Text.Length, ProcName->Text.Memory, + ProcName->Text.Length, ProcName->Text.Memory, + ProcArg->Text.Length, ProcArg->Text.Memory); + CodeBlockPrint(CallNodeProcBlock, Buffer); + } +} + +internal s32 +PreprocessStructsAndProcs (string StructSearchString, string ProcSearchString, b32 FindingPatterns, + token* Tokens, + code_block_builder* NodeMembersBlock, + code_block_builder* NodeTypeBlock, + code_block_builder* NodeSpecificationsBlock, + code_block_builder* CallNodeProcBlock, + type_table* TypeTable) +{ + // Node Structs + seen_node_struct* Structs = 0; + + token_selection_spec NodeStructSpec = {}; + NodeStructSpec.MatchText = true; + NodeStructSpec.Text = StructSearchString; + + token* NodeStructToken = FindNextMatchingToken(Tokens, NodeStructSpec); + while (NodeStructToken) + { + seen_node_struct* SeenStruct = (seen_node_struct*)malloc(sizeof(seen_node_struct)); + *SeenStruct = {}; + + if (Structs != 0) + { + SeenStruct->Next = Structs; + } + Structs = SeenStruct; + + ParseNodeStruct(NodeStructToken, NodeMembersBlock, SeenStruct, TypeTable); + NodeStructToken = FindNextMatchingToken(NodeStructToken->Next, NodeStructSpec); + } + + // Node Procs + token_selection_spec NodeProcSpec = {}; + NodeProcSpec.MatchText = true; + NodeProcSpec.Text = ProcSearchString; + + token* NodeProcToken = FindNextMatchingToken(Tokens, NodeProcSpec); + s32 NodeProcCount = 0; + while (NodeProcToken) + { + NodeProcCount++; + ParseNodeProc(NodeProcToken, NodeTypeBlock, NodeSpecificationsBlock, CallNodeProcBlock, Structs, FindingPatterns); + NodeProcToken = FindNextMatchingToken(NodeProcToken->Next, NodeProcSpec); + } + return NodeProcCount; +} + +// Step 1: Get All Tokens, for every file +// Step 2: Identify all preprocessor directives +// Step 3: Apply Preprocessor Directives && Generate Code +// Step 4: Write out new files +// Step 5: Compile +int main(int ArgCount, char** ArgV) +{ + if (ArgCount <= 1) + { + printf("Please supply at least one source directory to analyze.\n"); + return 0; + } + + type_table TypeTable = {}; + + memory_arena SourceFileArena = {}; + InitMemoryArena(&SourceFileArena, 0, 0, StdAlloc); + + code_block_builder NodeTypeBlock = InitCodeBlockBuilder(); + CodeBlockPrint(&NodeTypeBlock, MakeStringLiteral("enum node_type\n{\nNodeType_OutputNode,\n")); + + code_block_builder NodeMembersBlock = InitCodeBlockBuilder(); + + code_block_builder NodeSpecificationsBlock = InitCodeBlockBuilder(); + CodeBlockPrint(&NodeSpecificationsBlock, MakeStringLiteral("node_specification NodeSpecifications[] = {\n")); + + code_block_builder CallNodeProcBlock = InitCodeBlockBuilder(); + CodeBlockPrint(&CallNodeProcBlock, MakeStringLiteral("internal void CallNodeProc(interface_node* Node, u8* Data, led* LEDs, s32 LEDsCount, r32 DeltaTime)\n{\n")); + CodeBlockPrint(&CallNodeProcBlock, MakeStringLiteral("switch (Node->Type)\n{\n")); + + // Build Search Paths Array + s32 SearchPathsCount = 1; //ArgCount - 1; + string* SearchPaths = PushArray(&SourceFileArena, string, SearchPathsCount); + for (s32 InputPath = 0; InputPath < SearchPathsCount; InputPath++) + { + string* SearchPathString = SearchPaths + InputPath; + InitializeEmptyString(SearchPathString, PushArray(&SourceFileArena, char, MAX_PATH), MAX_PATH); + + // NOTE(Peter): Adding one to skip the default argument which is the name of the application currently running + CopyCharArrayToString(ArgV[InputPath + 1], SearchPathString); + ConcatCharArrayToString("*", SearchPathString); + NullTerminate(SearchPathString); + } + + // Total Source Files Count + s32 SourceFileCount = 0; + for (s32 SearchPath = 0; SearchPath < SearchPathsCount; SearchPath++) + { + string* SearchPathString = SearchPaths + SearchPath; + + WIN32_FIND_DATA FindFileData; + HANDLE CurrentFile = FindFirstFile(SearchPathString->Memory, &FindFileData); + + if (CurrentFile == INVALID_HANDLE_VALUE) + { + printf("Invalid File Handle\n"); + return 0; + } + + do { + if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) + { + continue; // TODO(Peter): Recurse? + } + SourceFileCount++; + } while (FindNextFile(CurrentFile, &FindFileData)); + } + + // Allocate Source File Array + source_code_file* SourceFiles = PushArray(&SourceFileArena, source_code_file, SourceFileCount); + + // Populate Source File Array + s32 SourceFilesUsed = 0; + for (s32 SearchPath = 0; SearchPath < SearchPathsCount; SearchPath++) + { + string* SearchPathString = SearchPaths + SearchPath; + + WIN32_FIND_DATA FindFileData; + HANDLE CurrentFile = FindFirstFile(SearchPathString->Memory, &FindFileData); + + do { + if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) + { + continue; // TODO(Peter): Recurse? + } + + string FileName = MakeString(FindFileData.cFileName); + string FileExtension = Substring(FileName, LastIndexOfChar(FileName, '.')); + + if (StringsEqual(FileExtension, MakeStringLiteral("cpp")) || + StringsEqual(FileExtension, MakeStringLiteral("h"))) + { + source_code_file* File = SourceFiles + SourceFilesUsed++; + + PushString(&File->Path, &SourceFileArena, SearchPathString->Length + CharArrayLength(FindFileData.cFileName)); + CopyStringTo(Substring(*SearchPathString, 0, SearchPathString->Length - 2), &File->Path); + ConcatCharArrayToString(FindFileData.cFileName, &File->Path); + NullTerminate(&File->Path); + + File->FileSize = FindFileData.nFileSizeLow; + ErrorAssert(FindFileData.nFileSizeHigh == 0, &GlobalErrorList, "File Too Big. Peter needs to handle this. File: %.*s", FileName.Length, FileName.Memory); + + PushString(&File->Contents, &SourceFileArena, File->FileSize + 1); + File->Contents.Length = ReadEntireFileAndNullTerminate(File->Path.Memory, File->Contents.Memory, File->Contents.Max); + } + + } while (FindNextFile(CurrentFile, &FindFileData)); + } + + // Tokenize All The Files + s32 TokensCount = 0; + token* Tokens = 0; + token** FileStartTokens = PushArray(&SourceFileArena, token*, SourceFilesUsed); + for (s32 SourceFileIdx = 0; SourceFileIdx < SourceFilesUsed; SourceFileIdx++) + { + source_code_file* File = SourceFiles + SourceFileIdx; + + tokenizer Tokenizer = {}; + Tokenizer.At = File->Contents.Memory; + Tokenizer.Memory = File->Contents.Memory; + Tokenizer.MemoryLength = File->Contents.Max; + + token* LastToken = 0; + while(AtValidPosition(Tokenizer)) + { + token* Token = PushStruct(&SourceFileArena, token); + if (Tokens == 0) + { + Tokens = Token; + } + + TokensCount++; + *Token = GetNextToken(&Tokenizer); + + Token->Next = 0; + if (LastToken) { + LastToken->Next = Token; + } + else + { + FileStartTokens[SourceFileIdx] = Token; + } + LastToken = Token; + } + } + + for (s32 SourceFile = 0; SourceFile < SourceFilesUsed; SourceFile++) + { + ParseTypedefs (FileStartTokens[SourceFile], &TypeTable); + } + + s32 NodeProcCount = 0; + + + for (s32 SourceFileIdx = 0; SourceFileIdx < SourceFilesUsed; SourceFileIdx++) + { + token* FileStartToken = FileStartTokens[SourceFileIdx]; + NodeProcCount += PreprocessStructsAndProcs (MakeStringLiteral("NODE_STRUCT"), + MakeStringLiteral("NODE_PROC"), + false, + FileStartToken, &NodeMembersBlock, &NodeTypeBlock, &NodeSpecificationsBlock, &CallNodeProcBlock, + &TypeTable); + NodeProcCount += PreprocessStructsAndProcs (MakeStringLiteral("NODE_PATTERN_STRUCT"), + MakeStringLiteral("NODE_PATTERN_PROC"), + true, + FileStartToken, &NodeMembersBlock, &NodeTypeBlock, &NodeSpecificationsBlock, &CallNodeProcBlock, + &TypeTable); + } + + MakeStringBuffer(Buffer, 256); + + // Close Types Block - overwrite the last comma and '\' newline character with newlines. + CodeBlockPrint(&NodeTypeBlock, MakeStringLiteral("NodeType_Count,\n};\n\n")); + + // Close Specifications Block + CodeBlockPrint(&NodeSpecificationsBlock, MakeStringLiteral("};\n")); + PrintF(&Buffer, "s32 NodeSpecificationsCount = %d;\n\n", NodeProcCount); + CodeBlockPrint(&NodeSpecificationsBlock, Buffer); + + // Close Call Node Proc Block + CodeBlockPrint(&CallNodeProcBlock, MakeStringLiteral("}\n}\n")); + + FILE* NodeGeneratedCPP = fopen("C:\\projects\\foldhaus\\src\\generated\\foldhaus_nodes_generated.cpp", "w"); + if (NodeGeneratedCPP) + { + WriteCodeBlockToFile(NodeTypeBlock, NodeGeneratedCPP); + WriteCodeBlockToFile(NodeMembersBlock, NodeGeneratedCPP); + WriteCodeBlockToFile(NodeSpecificationsBlock, NodeGeneratedCPP); + WriteCodeBlockToFile(CallNodeProcBlock, NodeGeneratedCPP); + fclose(NodeGeneratedCPP); + } + + PrintErrorList(GlobalErrorList); + return 0; +} \ No newline at end of file diff --git a/meta/gs_meta.cpp b/meta/gs_meta.cpp new file mode 100644 index 0000000..9ba0add --- /dev/null +++ b/meta/gs_meta.cpp @@ -0,0 +1,747 @@ +#include "..\src\gs_language.h" +#include "..\src\gs_string.h" + +#include "gs_meta_error.h" +#include "gs_meta_lexer.h" + +#ifndef MAX_PATH +#define MAX_PATH 512 +#endif // MAX_PATH + +#define META_FILES_ARRAY_INCREMENT_SIZE 32 + +struct file_contents +{ + u8* Backbuffer; + string Buffer; +}; + +#define TOKEN_BUFFER_SIZE 256 + +struct token_buffer +{ + token* Tokens; + s32 Used; + s32 Max; + token_buffer* Next; +}; + +struct token_list +{ + token_buffer* Head; + s32 TotalUsed; + s32 TotalMax; +}; + +struct token_list_iterator +{ + token_list* List; + token_buffer* BufferAt; + token* At; + s32 AtTotalIndex; +}; + +enum basic_type +{ + BasicType_Int8, + BasicType_Int16, + BasicType_Int32, + BasicType_Int64, + BasicType_UnsignedInt8, + BasicType_UnsignedInt16, + BasicType_UnsignedInt32, + BasicType_UnsignedInt64, + BasicType_Char, + BasicType_Float32, + BasicType_Float64, + BasicType_Void, +}; + +struct variable_definition_symbol +{ + string Identifier; + basic_type Type; + b32 IsArray; + s32 Size; +}; + +struct struct_definition_symbol +{ + string Identifier; + s32 MemberCount; + variable_definition_symbol* Members; +}; + +struct function_definition_symbol +{ + string Identifier; + + s32 ArgumentCount; + variable_definition_symbol* Arguments; + + // TODO(Peter): An AST of the actual code that makes up the function? +}; + +enum symbol_type +{ + SymbolType_Function, + SymbolType_Struct +}; + +struct symbol +{ + symbol_type Type; + union + { + struct_definition_symbol StructDef; + function_definition_symbol FunctionDef; + }; +}; + +enum parser_symbol_type +{ + ParserSymbol_Invalid, + ParserSymbol_Unknown, + + ParserSymbol_Auto, + ParserSymbol_Break, + ParserSymbol_Case, + ParserSymbol_Char, + ParserSymbol_Const, + ParserSymbol_Continue, + ParserSymbol_Default, + ParserSymbol_Do, + ParserSymbol_Double, + ParserSymbol_Else, + ParserSymbol_Enum, + ParserSymbol_Extern, + ParserSymbol_Float, + ParserSymbol_For, + ParserSymbol_Goto, + ParserSymbol_If, + ParserSymbol_Inline, + ParserSymbol_Int, + ParserSymbol_Long, + ParserSymbol_Register, + ParserSymbol_Restrict, + ParserSymbol_Return, + ParserSymbol_Short, + ParserSymbol_Signed, + ParserSymbol_Sizeof, + ParserSymbol_Static, + ParserSymbol_Struct, + ParserSymbol_Switch, + ParserSymbol_Typedef, + ParserSymbol_Union, + ParserSymbol_Unsigned, + ParserSymbol_Void, + ParserSymbol_Volatile, + ParserSymbol_While, + + // Assignment Operators + ParserSymbol_AssignEquals, + ParserSymbol_PlusEquals, + ParserSymbol_MinusEquals, + ParserSymbol_TimesEquals, + ParserSymbol_DividedEquals, + ParserSymbol_ModEquals, + ParserSymbol_BitAndEquals, + ParserSymbol_BitOrEquals, + ParserSymbol_BitNotEquals, + ParserSymbol_BitShiftUpEquals, + ParserSymbol_BitShiftDownEquals, + + // Increment/Decrement Operators + ParserSymbol_Increment, + ParserSymbol_Decrement, +}; + +struct parser_symbol_definition +{ + parser_symbol_type Type; + string Text; +}; + +global_variable parser_symbol_definition ParserSymbolTable[] = +{ + // Keywords + { ParserSymbol_Auto, MakeStringLiteral("auto")}, + { ParserSymbol_Break, MakeStringLiteral("break")}, + { ParserSymbol_Case, MakeStringLiteral("case")}, + { ParserSymbol_Char, MakeStringLiteral("char")}, + { ParserSymbol_Const, MakeStringLiteral("const")}, + { ParserSymbol_Continue, MakeStringLiteral("continue")}, + { ParserSymbol_Default, MakeStringLiteral("default")}, + { ParserSymbol_Do, MakeStringLiteral("do")}, + { ParserSymbol_Double, MakeStringLiteral("double")}, + { ParserSymbol_Else, MakeStringLiteral("else")}, + { ParserSymbol_Enum, MakeStringLiteral("enum")}, + { ParserSymbol_Extern, MakeStringLiteral("extern")}, + { ParserSymbol_Float, MakeStringLiteral("float")}, + { ParserSymbol_For, MakeStringLiteral("for")}, + { ParserSymbol_Goto, MakeStringLiteral("goto")}, + { ParserSymbol_If, MakeStringLiteral("if")}, + { ParserSymbol_Inline, MakeStringLiteral("inline")}, + { ParserSymbol_Int, MakeStringLiteral("int")}, + { ParserSymbol_Long, MakeStringLiteral("long")}, + { ParserSymbol_Register, MakeStringLiteral("register")}, + { ParserSymbol_Restrict, MakeStringLiteral("restrict")}, + { ParserSymbol_Return, MakeStringLiteral("return")}, + { ParserSymbol_Short, MakeStringLiteral("short")}, + { ParserSymbol_Signed, MakeStringLiteral("signed")}, + { ParserSymbol_Sizeof, MakeStringLiteral("sizeof")}, + { ParserSymbol_Static, MakeStringLiteral("static")}, + { ParserSymbol_Struct, MakeStringLiteral("struct")}, + { ParserSymbol_Switch, MakeStringLiteral("switch")}, + { ParserSymbol_Typedef, MakeStringLiteral("typedef")}, + { ParserSymbol_Union, MakeStringLiteral("union")}, + { ParserSymbol_Unsigned, MakeStringLiteral("unsigned")}, + { ParserSymbol_Void, MakeStringLiteral("void")}, + { ParserSymbol_Volatile, MakeStringLiteral("volatile")}, + { ParserSymbol_While, MakeStringLiteral("while")}, + + // Assignment Operators + { ParserSymbol_AssignEquals, MakeStringLiteral("=")}, + { ParserSymbol_PlusEquals, MakeStringLiteral("+=")}, + { ParserSymbol_MinusEquals, MakeStringLiteral("-=")}, + { ParserSymbol_TimesEquals, MakeStringLiteral("*=")}, + { ParserSymbol_DividedEquals, MakeStringLiteral("/=")}, + { ParserSymbol_ModEquals, MakeStringLiteral("%=")}, + { ParserSymbol_BitAndEquals, MakeStringLiteral("&=")}, + { ParserSymbol_BitOrEquals, MakeStringLiteral("|=")}, + { ParserSymbol_BitNotEquals, MakeStringLiteral("^=")}, + { ParserSymbol_BitShiftUpEquals, MakeStringLiteral("<<=")}, + { ParserSymbol_BitShiftDownEquals, MakeStringLiteral(">>=")}, + + // Increment/Decrement Operators + { ParserSymbol_Increment, MakeStringLiteral("++")}, + { ParserSymbol_Decrement, MakeStringLiteral("--")}, + + /* + // Arithmetic Operators + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + { ParserSymbol_, MakeStringLiteral("")}, + */ +}; + +struct gs_meta_processor +{ + error_list ErrorList; + + u8* FileStringMemory; + s32 FileStringMemorySize; + + string* Files; + file_contents* Contents; + token_list* FileTokens; + s32 FilesUsed; + s32 FilesMax; +}; + +internal gs_meta_processor +CreateMetaProcessor () +{ + gs_meta_processor Result = {}; + return Result; +} + +internal void +SetMetaFilesStringMemory (gs_meta_processor* Meta, s32 StartIndex, s32 EndIndex) +{ + char* StringMemoryAt = (char*)(Meta->FileStringMemory + (MAX_PATH * StartIndex)); + for (s32 i = StartIndex; i < EndIndex; i++) + { + string* String = Meta->Files + i; + InitializeString(String, StringMemoryAt, MAX_PATH); + StringMemoryAt += MAX_PATH; + } +} + +internal b32 +IsValidFileType(char* Filename) +{ + string FileString = MakeString(Filename); + s32 IndexOfDot = LastIndexOfChar(FileString, '.'); + string ExtensionString = Substring(FileString, IndexOfDot); + + b32 Result = false; + if (StringsEqual(ExtensionString, MakeStringLiteral("cpp")) || + StringsEqual(ExtensionString, MakeStringLiteral("h"))) + { + Result = true; + } + + return Result; +} + +internal void +AddFile(gs_meta_processor* Meta, char* Filename) +{ + if (!IsValidFileType(Filename)) + { + LogError(&Meta->ErrorList, "AddFile: %s has an extension that cannot be processed.", Filename); + } + + if(!Meta->Files) + { + Meta->FilesMax = META_FILES_ARRAY_INCREMENT_SIZE; + Meta->FilesUsed = 0; + Meta->Files = (string*)malloc(sizeof(string) * Meta->FilesMax); + + Meta->FileStringMemorySize = Meta->FilesMax * MAX_PATH; + Meta->FileStringMemory = (u8*)malloc(Meta->FileStringMemorySize); + + SetMetaFilesStringMemory(Meta, 0, Meta->FilesMax); + } + + if (Meta->Files && Meta->FilesUsed >= Meta->FilesMax) + { + Meta->FilesMax += META_FILES_ARRAY_INCREMENT_SIZE; + Meta->Files = (string*)realloc(Meta->Files, sizeof(string) * Meta->FilesMax); + + Meta->FileStringMemorySize = Meta->FilesMax * MAX_PATH; + Meta->FileStringMemory = (u8*)realloc(Meta->FileStringMemory, Meta->FileStringMemorySize); + + SetMetaFilesStringMemory(Meta, Meta->FilesUsed, Meta->FilesMax); + } + + string* File = Meta->Files + Meta->FilesUsed++; + File->Length = CharArrayLength(Filename); + GSMemCopy(Filename, File->Memory, File->Length); + NullTerminate(File); +} + +internal void +LoadFileContents (file_contents* Contents, string* FileName, error_list* Errors) +{ + FILE* ReadFile = fopen(FileName->Memory, "r"); + if (ReadFile) + { + fseek(ReadFile, 0, SEEK_END); + size_t FileSize = ftell(ReadFile); + fseek(ReadFile, 0, SEEK_SET); + if (FileSize > 0) + { + Contents->Backbuffer = (u8*)malloc(FileSize + 1); + size_t ReadSize = fread(Contents->Backbuffer, 1, FileSize, ReadFile); + Contents->Backbuffer[FileSize] = 0; + + InitializeString(&Contents->Buffer, (char*)Contents->Backbuffer, (s32)FileSize + 1); + Contents->Buffer.Length = (s32)FileSize + 1; + } + else + { + LogError(Errors, "LoadFileContents: File Size Was Zero for %s", FileName->Memory); + } + fclose(ReadFile); + } + else + { + LogError(Errors, "LoadFileContents: Could Not Read File %s", FileName->Memory); + } + +} + +internal void +LoadAllFiles (gs_meta_processor* Meta) +{ + Meta->Contents = (file_contents*)malloc(sizeof(file_contents) * Meta->FilesUsed); + + for (s32 FileIdx = 0; FileIdx < Meta->FilesUsed; FileIdx++) + { + file_contents* Contents = Meta->Contents + FileIdx; + string* FileName = Meta->Files + FileIdx; + LoadFileContents(Contents, FileName, &Meta->ErrorList); + } +} + +internal token* +PushTokenOnList(token_list* List) +{ + token* Result = 0; + + if (!List->Head) + { + s32 NewBufferSize = sizeof(token_buffer) + (sizeof(token) * TOKEN_BUFFER_SIZE); + u8* NewBufferContents = (u8*)malloc(NewBufferSize); + List->Head = (token_buffer*)NewBufferContents; + List->Head->Used = 0; + List->Head->Max = TOKEN_BUFFER_SIZE; + List->Head->Tokens = (token*)(NewBufferContents + sizeof(token_buffer)); + List->TotalUsed = List->Head->Used; + List->TotalMax = List->Head->Max; + } + else if (List->TotalUsed >= List->TotalMax) + { + s32 NewBufferSize = sizeof(token_buffer) + (sizeof(token) * TOKEN_BUFFER_SIZE); + u8* NewBufferContents = (u8*)malloc(NewBufferSize); + + token_buffer* NewBuffer = (token_buffer*)NewBufferContents; + NewBuffer->Tokens = (token*)(NewBufferContents + sizeof(token_buffer)); + + NewBuffer->Next = NewBuffer; + List->Head = NewBuffer; + List->TotalUsed += List->Head->Used; + List->TotalMax += List->Head->Max; + } + + Result = List->Head->Tokens + List->Head->Used++; + List->TotalUsed++; + + return Result; +} + +internal void +LexFile (file_contents* Contents, token_list* TokensList) +{ + tokenizer FileTokenizer = {}; + FileTokenizer.Memory = Contents->Buffer.Memory; + FileTokenizer.MemoryLength = Contents->Buffer.Length; + FileTokenizer.At = FileTokenizer.Memory; + + while (AtValidPosition(FileTokenizer)) + { + token* Token = PushTokenOnList(TokensList); + *Token = GetNextToken(&FileTokenizer); + } +} + +internal void +LexAllFiles (gs_meta_processor* Meta) +{ + LoadAllFiles(Meta); + + Meta->FileTokens = (token_list*)malloc(sizeof(token_list) * Meta->FilesUsed); + + for (s32 SourceFile = 0; SourceFile < Meta->FilesUsed; SourceFile++) + { + Meta->FileTokens[SourceFile] = {}; + + token_list* FileTokenList = Meta->FileTokens + SourceFile; + file_contents* FileContents = Meta->Contents + SourceFile; + LexFile (FileContents, FileTokenList); + } +} + +internal token_list_iterator +GetTokenIterator(token_list* List) +{ + token_list_iterator Result = {}; + Result.List = List; + Result.BufferAt = List->Head; + Result.At = List->Head->Tokens; + Result.AtTotalIndex = 0; + return Result; +} + +internal b32 +IsValid (token_list_iterator Iterator) +{ + b32 Result = false; + if (Iterator.At && Iterator.AtTotalIndex < Iterator.List->TotalUsed) + { + Result = true; + } + return Result; +} + +internal void +Advance (token_list_iterator* Iterator) +{ + if ((Iterator->At - Iterator->BufferAt->Tokens) >= Iterator->BufferAt->Used) + { + Iterator->BufferAt = Iterator->BufferAt->Next; + if (Iterator->BufferAt) + { + Iterator->At = Iterator->BufferAt->Tokens; + Iterator->AtTotalIndex++; + } + else + { + Iterator->At = 0; + } + } + else + { + Iterator->At++; + Iterator->AtTotalIndex++; + } +} + +internal parser_symbol_type +GetSymbolType (string Text, parser_symbol_type Fallback) +{ + parser_symbol_type Result = Fallback; + + for (s32 i = 0; i < (sizeof(ParserSymbolTable)/sizeof(ParserSymbolTable[0])); i++) + { + if (StringsEqual(Text, ParserSymbolTable[i].Text)) + { + Result = ParserSymbolTable[i].Type; + break; + } + } + + return Result; +} + +internal void +ParseFile (token_list* TokenList, gs_meta_processor* Meta) +{ + for (token_list_iterator TokenIter = GetTokenIterator(TokenList); + IsValid(TokenIter); + Advance(&TokenIter)) + { + token* At = TokenIter.At; + parser_symbol_type SymbolType = GetSymbolType(At->Text, ParserSymbol_Unknown); + + switch (SymbolType) + { + case SymbolType_Struct: + { + printf("Found Struct: %.*s\n", (At + 1)->Text.Length, (At + 1)->Text.Memory); + }break; + } + } +} + +internal void +ParseAllFiles (gs_meta_processor* Meta) +{ + for (s32 SourceFile = 0; SourceFile < Meta->FilesUsed; SourceFile++) + { + token_list* FileTokenList = Meta->FileTokens + SourceFile; + ParseFile(FileTokenList, Meta); + } +} + +#if 0 +#include +#define GS_PRINTF(v) OutputDebugStringA(v) +#include "gs_string.h" + +static char DEBUGCharArray[256]; +#define GS_DEBUG_PRINTF(format, ...) sprintf(DEBUGCharArray, format, __VA_ARGS__); OutputDebugStringA(DEBUGCharArray); + +#include "gs_meta_lexer.h" +#include "gs_meta_parser.h" +#include "gs_meta_generator.h" + +internal char* +ReadEntireFileAndNullTerminate (char* Filename) +{ + char* Result = 0; + + FILE* ReadFile = fopen(Filename, "r"); + if (ReadFile) + { + fseek(ReadFile, 0, SEEK_END); + size_t FileSize = ftell(ReadFile); + fseek(ReadFile, 0, SEEK_SET); + + Result = (char*)malloc(FileSize + 1); + size_t ReadSize = fread(Result, 1, FileSize, ReadFile); + Result[FileSize] = 0; + + fclose(ReadFile); + } + else + { + GS_DEBUG_PRINTF("Failed to fopen file"); + } + + return Result; +} + +int PrecompileFile (char* FileName) +{ + char* SourceFileContents = ReadEntireFileAndNullTerminate(FileName); + if (!SourceFileContents) + { + GS_DEBUG_PRINTF("Failed to get source file contents"); + return 0; + } + + tokenizer Tokenizer = {}; + Tokenizer.At = SourceFileContents; + + s32 TokensGrowSize = 256; + s32 TokensMax = TokensGrowSize; + s32 TokensCount = 0; + token* Tokens = (token*)malloc(TokensGrowSize * sizeof(token)); + + token* Current = Tokens; + while (Tokenizer.At[0]) + { + *Current = GetNextToken(&Tokenizer); + Current->Next = 0; + + TokensCount++; + + if (TokensCount >= TokensMax) + { + token* Addition = (token*)malloc(TokensGrowSize * sizeof(token)); + TokensMax += TokensGrowSize; + + token* Old = Current; + Current = Addition; + Old->Next = Current; + } + else if(Tokenizer.At[0]) + { + token* Old = Current; + Current++; + Old->Next = Current; + } + } + + + + Current = Tokens; +#if 0 // Print Tokens + if (Current) + { + do + { + GS_DEBUG_PRINTF("%s %.*s\n", TokenNames[(int)Current->Type], Current->TextLength, Current->Text); + Current = Current->Next; + }while(Current); + } +#endif + + ast_node Ast = {}; + Ast.Type = ASTNode_Program; + ast_node* CurrentNode = Ast.Children; + + // Preprocessor Defines + // TODO(Peter): Actually preprocess the file + token* CurrentToken = Tokens; + /*while (CurrentToken) + { + CurrentToken = CurrentToken->Next; + } + */ + + // Analyze File + CurrentToken = Tokens; + while (CurrentToken) + { + /*GS_DEBUG_PRINTF("%s %.*s\n", TokenNames[(int)CurrentToken->Type], + CurrentToken->TextLength, CurrentToken->Text); + */ + + parse_result ParseResult = {}; + ParseResult.Parsed = false; + + if (CurrentToken->Type == Token_Identifier) + { + if (StringsEqual(CurrentToken->Text, "struct", 6)) + { + ParseResult = ParseStructDeclaration(CurrentNode, CurrentToken); + CurrentToken = ParseResult.NextToken; + } + else if (IsFunction(CurrentToken)) + { + ParseResult = ParseFunctionDeclaration(CurrentNode, CurrentToken); + CurrentToken = ParseResult.NextToken; + } + else + { + CurrentToken = CurrentToken->Next; + } + + if (ParseResult.Parsed) + { + if (CurrentNode == 0) + { + Ast.Children = ParseResult.Node; + CurrentNode = Ast.Children; + } + else + { + CurrentNode->Next = ParseResult.Node; + CurrentNode = CurrentNode->Next; + } + } + } + else + { + CurrentToken = CurrentToken->Next; + } + } + + string_partition StringPart = {}; + { + memory_arena StringMemory = {}; + InitMemoryArena(&StringMemory, (u8*)malloc(Megabytes(4)), Megabytes(4)); + InitStringPartition(&StringPart, &StringMemory); + } + + // Print Structs + ast_node* Node = Ast.Children; + while (Node) + { + switch (Node->Type) + { + case ASTNode_StructDeclaration: + { + string_buffer* CodeBuffer = GenerateStructCode(Node, &StringPart); + PrintStringBuffer(CodeBuffer); + }break; + + case ASTNode_FunctionDeclaration: + { + string_buffer* CodeBuffer = GenerateFunctionDeclaration(Node, &StringPart); + PrintStringBuffer(CodeBuffer); + }break; + } + + Node = Node->Next; + } + + return 0; +} + +int main(int ArgCount, char** ArgV) +{ + if (ArgCount <= 1) + { + printf("Please supply at least one source directory to analyze.\n"); + return 0; + } + + TCHAR Win32FileNameBuffer[MAX_PATH]; + char FullFilePath[MAX_PATH]; + + for (int i = 1; i < ArgCount; i++) + { + WIN32_FIND_DATA FindFileData; + + StringCchCopy(Win32FileNameBuffer, MAX_PATH, ArgV[i]); + StringCchCat(Win32FileNameBuffer, MAX_PATH, TEXT("\\*")); + + HANDLE CurrentFile = FindFirstFile(Win32FileNameBuffer, &FindFileData); + + int FileIdx = 0; + do { + if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { + // TODO(Peter): Recurse? + continue; + } + + printf("File %d: %s\n", FileIdx++, FindFileData.cFileName); + + + } while (FindNextFile(CurrentFile, &FindFileData)); + } +} +#endif \ No newline at end of file diff --git a/meta/gs_meta_error.h b/meta/gs_meta_error.h new file mode 100644 index 0000000..ae110a0 --- /dev/null +++ b/meta/gs_meta_error.h @@ -0,0 +1,98 @@ +#define MAX_ERROR_LENGTH 256 + +struct error +{ + char Backbuffer[MAX_ERROR_LENGTH]; + string Buffer; +}; + +struct error_list_buffer +{ + error* List; + s32 Used; + s32 Max; + error_list_buffer* Next; +}; + +struct error_list +{ + error_list_buffer* Head; + s32 TotalUsed; + s32 TotalMax; +}; + +#define ERROR_LIST_GROW_SIZE 32 + +internal void +GrowErrorList (error_list* Errors) +{ + Assert(Errors); + + s32 ExtensionSize = sizeof(error_list_buffer) + (sizeof(error) * ERROR_LIST_GROW_SIZE); + u8* ExtensionMemory = (u8*)malloc(ExtensionSize); + + error_list_buffer* Extension = (error_list_buffer*)ExtensionMemory; + Extension->Used = 0; + Extension->Max = ERROR_LIST_GROW_SIZE; + Extension->List = (error*)(ExtensionMemory + sizeof(error_list_buffer)); + + Extension->Next = Errors->Head; + Errors->Head = Extension; + + Errors->TotalMax += ERROR_LIST_GROW_SIZE; +} + +#define ErrorAssert(condition, list, format, ...) \ +if (!(condition)) { LogError_((list), __FILE__, __LINE__, (format), __VA_ARGS__); } + +#define LogError(list, format, ...) LogError_((list), __FILE__, __LINE__, (format), __VA_ARGS__) + +internal void +LogError_ (error_list* Errors, char* File, s32 Line, char* Format, ...) +{ + if (Errors->TotalUsed >= Errors->TotalMax) + { + GrowErrorList(Errors); + } + + error* Error = (Errors->Head->List + Errors->Head->Used++); + Errors->TotalUsed++; + + InitializeEmptyString(&Error->Buffer, Error->Backbuffer, MAX_ERROR_LENGTH); + + va_list Args; + va_start(Args, Format); + + PrintF(&Error->Buffer, "%s(%d): ", File, Line); + Error->Buffer.Length += PrintFArgsList(Error->Buffer.Memory + Error->Buffer.Length, + Error->Buffer.Max - Error->Buffer.Length, + Format, Args); + + va_end(Args); +} + +internal void +PrintErrorListBuffer (error_list_buffer* Buffer) +{ + if (Buffer->Next) + { + PrintErrorListBuffer(Buffer->Next); + } + + for (s32 i = 0; i < Buffer->Used; i++) + { + error* Error = Buffer->List + i; + NullTerminate(&Error->Buffer); + printf(Error->Backbuffer); + printf("\n"); + } +} + +internal void +PrintErrorList (error_list Errors) +{ + if (Errors.Head) + { + PrintErrorListBuffer(Errors.Head); + } +} \ No newline at end of file diff --git a/meta/gs_meta_generator.h b/meta/gs_meta_generator.h new file mode 100644 index 0000000..c2be5e6 --- /dev/null +++ b/meta/gs_meta_generator.h @@ -0,0 +1,164 @@ +#define CODE_SIZE 256 +struct generated_code +{ + s32 Used; + char* Code; + generated_code* Next; +}; + +internal void +InitGeneratedCode (generated_code* Code) +{ + Code->Used = 0; + Code->Code = (char*)malloc(sizeof(char) * CODE_SIZE); + *(Code->Code + CODE_SIZE - 1) = 0; + Code->Next = 0; +} + +// NOTE(Peter): This ONLY supports printing strings into the buffer at the moment +static void +PrintF_ ( +generated_code* Dest, +char* Format, +va_list Args +) +{ + if (!Dest->Code) { + InitGeneratedCode(Dest); + } + + char* Src = Format; + char* Dst = Dest->Code + Dest->Used; + + while (*Src && (Dst - Dest->Code) < CODE_SIZE) + { + if (*Src == '\\' && *(Src + 1) && *(Src + 1) == '%') + { + *Src++; + *Dst++ = *Src++; + } + else if (*Src == '%') + { + Src++; + if (*Src == 's') + { + Src++; + s32 StringLength = va_arg(Args, s32); + char* String = va_arg(Args, char*); + char* C = String; + while(*C && StringLength > 0 && (Dst - Dest->Code) < CODE_SIZE) + { + StringLength--; + *Dst++ = *C++; + } + } + else + { + InvalidCodePath; + } + } + else + { + *Dst++ = *Src++; + } + } + + if (!*Dst && *Src) + { + Dest->Next = (generated_code*)malloc(sizeof(generated_code)); + InitGeneratedCode(Dest->Next); + PrintF_(Dest->Next, Src, Args); + } + + if (*Dst && !*Src) { *Dst = 0; } + + Dest->Used = (s32)(Dst - Dest->Code); +} + +static void +PrintF ( +generated_code* Dest, +char* Format, +...) +{ + va_list Args; + va_start(Args, Format); + + PrintF_(Dest, Format, Args); + + va_end(Args); +} + +static void +PrintCode (generated_code* Code) +{ + GS_PRINTF(Code->Code); + if (Code->Next) { PrintCode(Code->Next); } +} + +static void +GenerateFieldCode (ast_field_declaration* Field, string_buffer* CodeBuffer, string_partition* Partition, + s32 IndentLevel, char* Terminator) +{ + for (s32 i = 0; i < IndentLevel; i++) + { + PrintStringBufferFormat(CodeBuffer, Partition, " "); + } + + PrintStringBufferFormat(CodeBuffer, Partition, "%s%s %s%s", + Field->TypeLength, Field->Type, + (Field->TypePointer ? 1 : 0), (Field->TypePointer ? "*" : ""), + Field->NameLength, Field->Name, + (Field->TypeArray ? 2 : 0), (Field->TypeArray ? "[]" : "")); + + PrintStringBufferFormat(CodeBuffer, Partition, Terminator); +} + +static string_buffer* +GenerateStructCode (ast_node* Struct, string_partition* StringPartition) +{ + Assert(Struct->Type == ASTNode_StructDeclaration); + + string_buffer* StructCodeBuffer = GetStringBuffer(StringPartition); + + PrintStringBufferFormat(StructCodeBuffer, StringPartition, "struct %s\n{\n", + Struct->StructDeclaration.NameLength, Struct->StructDeclaration.Name); + + ast_field_declaration* Member = Struct->StructDeclaration.Members; + while (Member) + { + GenerateFieldCode(Member, StructCodeBuffer, StringPartition, 1, ";\n"); + Member = Member->Next; + } + + PrintStringBufferFormat(StructCodeBuffer, StringPartition, "}\n\n"); + return StructCodeBuffer; +} + +static string_buffer* +GenerateFunctionDeclaration (ast_node* Function, string_partition* Partition) +{ + Assert(Function->Type == ASTNode_FunctionDeclaration); + + ast_function_declaration* FuncDecl = &Function->FunctionDeclaration; + + string_buffer* FunctionDeclBuffer = GetStringBuffer(Partition); + + PrintStringBufferFormat(FunctionDeclBuffer, Partition, "%s %s (", + FuncDecl->ReturnTypeLength, FuncDecl->ReturnType, + FuncDecl->NameLength, FuncDecl->Name); + + ast_field_declaration* Param = FuncDecl->Arguments; + while (Param) + { + GenerateFieldCode(Param, FunctionDeclBuffer, Partition, 0, ""); + if (Param->Next) + { + PrintStringBufferFormat(FunctionDeclBuffer, Partition, ", "); + } + Param = Param->Next; + } + + PrintStringBufferFormat(FunctionDeclBuffer, Partition, ")\n"); + return FunctionDeclBuffer; +} \ No newline at end of file diff --git a/meta/gs_meta_lexer.h b/meta/gs_meta_lexer.h new file mode 100644 index 0000000..8e1af94 --- /dev/null +++ b/meta/gs_meta_lexer.h @@ -0,0 +1,212 @@ +struct token_selection_spec +{ + b32 MatchText; + string Text; +}; + +internal s32 +EatPreprocessor (tokenizer* Tokenizer, token_type* Type) +{ + s32 Length = 0; + + // TODO(Peter): Make this actually separate out the different arguments? + while (Tokenizer->At[0] && !IsNewline(Tokenizer->At[0])) + { + ++Tokenizer->At; + Length++; + } + + return Length; +} + +internal s32 +EatString (tokenizer* Tokenizer) +{ + s32 Length = 0; + + while (Tokenizer->At[0] && Tokenizer->At[0] != '"') + { + if (Tokenizer->At[0] == '/') + { + ++Tokenizer->At; + Length++; + } + ++Tokenizer->At; + Length++; + } + + ++Tokenizer->At; + + return Length; +} + +internal s32 +EatIdentifier (tokenizer* Tokenizer) +{ + s32 Length = 0; + + while (Tokenizer->At[0] && + (IsAlpha(Tokenizer->At[0]) || IsNumericExtended(Tokenizer->At[0]))) + { + ++Tokenizer->At; + Length++; + } + + return Length; +} + +internal token +GetNextToken (tokenizer* Tokenizer) +{ + token Result = {}; + + EatWhitespace(Tokenizer); + + Result.Text = MakeString(Tokenizer->At, 1, 1); + + + char C = Tokenizer->At[0]; + ++Tokenizer->At; + + if (C == 0) { Result.Type = Token_EndOfStream; } + else if (C == '(') { Result.Type = Token_LeftParen; } + else if (C == ')') { Result.Type = Token_RightParen; } + else if (C == '[') { Result.Type = Token_LeftSquareBracket; } + else if (C == ']') { Result.Type = Token_RightSquareBracket; } + else if (C == '{') { Result.Type = Token_LeftCurlyBracket; } + else if (C == '}') { Result.Type = Token_RightCurlyBracket; } + else if (C == ';') { Result.Type = Token_Semicolon; } + else if (C == ',') { Result.Type = Token_Comma; } + else if (C == '.') { Result.Type = Token_Period; } + else if (C == '-' && Tokenizer->At[0] && Tokenizer->At[0] == '>') + { + Result.Type = Token_PointerReference; + Result.Text.Length = 2; + ++Tokenizer->At; + } + else if (C == '#') + { + Result.Text.Length += EatPreprocessor(Tokenizer, &Result.Type); + + if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#define", 7)) + { Result.Type = Token_PoundDefine; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#undef", 6)) + { Result.Type = Token_PoundUndef; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#include", 8)) + { Result.Type = Token_PoundInclude; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#ifdef", 6)) + { Result.Type = Token_PoundIfDef; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#ifndef", 7)) + { Result.Type = Token_PoundIfNDef; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#if", 3)) + { Result.Type = Token_PoundIf; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#elif", 5)) + { Result.Type = Token_PoundElif; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#else", 5)) + { Result.Type = Token_PoundElse; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#endif", 6)) + { Result.Type = Token_PoundEndif; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#error", 6)) + { Result.Type = Token_PoundError; } + else if (CharArraysEqual(Result.Text.Memory, Result.Text.Length, "#pragma", 7)) + { Result.Type = Token_PoundPragma; } + } + else if (IsNumeric(C)) + { + Result.Type = Token_Number; + char* Start = Tokenizer->At; + EatNumber(Tokenizer); + Result.Text.Length = Tokenizer->At - Start; + } + else if (C == '\'') + { + Result.Type = Token_Char; + Result.Text.Memory = Tokenizer->At; + if (Tokenizer->At[0] && Tokenizer->At[0] == '\\') + { + ++Tokenizer->At; + } + ++Tokenizer->At; + ++Tokenizer->At; + } + else if (C == '"') + { + Result.Type = Token_String; + // replace the length added by the quote + Result.Text.Memory = Tokenizer->At; + Result.Text.Length = EatString(Tokenizer); + } + else if (C == '/' && Tokenizer->At[0] && Tokenizer->At[0] == '/') + { + Result.Type = Token_Comment; + char* Start = Tokenizer->At; + EatToNewLine(Tokenizer); + Result.Text.Length += 1 + (Tokenizer->At - Start); + } + else if (C == '/' && Tokenizer->At[0] && Tokenizer->At[0] == '*') + { + s32 CommentLength = 1; + while (Tokenizer->At[0] && Tokenizer->At[0] != '*' && + Tokenizer->At[1] && Tokenizer->At[1] != '/') + { + ++Tokenizer->At; + CommentLength++; + } + + Result.Text.Length += CommentLength; + } + // NOTE(Peter): This is after comment parsing so that the division operator + // falls through the comment case + else if (IsOperator(C)) { Result.Type = Token_Operator; } + else + { + Result.Type = Token_Identifier; + Result.Text.Length += EatIdentifier(Tokenizer); + } + + return Result; +} + +internal token* +FindNextMatchingToken (token* Tokens, token_selection_spec Spec) +{ + token* Result = 0; + + token* Token = Tokens; + while (Token) + { + if (Token->Text.Memory) + { + b32 Matches = false; + if (Spec.MatchText && StringsEqual(Spec.Text, Token->Text)) + { + Matches = true; + } + + if (Matches) + { + Result = Token; + break; + } + } + + Token = Token->Next; + } + + return Result; +} + +internal token* +GetNextTokenOfType (token* Tokens, token_type Type) +{ + token* Result = 0; + + token* Iter = Tokens->Next; + while((Iter != 0) && (Iter->Type != Type)) + { + Iter = Iter->Next; + } + + Result = Iter; + return Result; +} \ No newline at end of file diff --git a/meta/gs_meta_parser.h b/meta/gs_meta_parser.h new file mode 100644 index 0000000..3d33168 --- /dev/null +++ b/meta/gs_meta_parser.h @@ -0,0 +1,337 @@ +enum ast_node_type +{ + ASTNode_Invalid, + + ASTNode_Program, + ASTNode_StructDeclaration, + ASTNode_FunctionDeclaration, + + ASTNode_Count +}; + +struct ast_field_declaration +{ + s32 NameLength; + char* Name; + + s32 TypeLength; + char* Type; + b32 TypePointer; + b32 TypeArray; + + ast_field_declaration* Next; +}; + +struct ast_struct_declaration +{ + s32 NameLength; + char* Name; + + s32 MembersCount; + ast_field_declaration* Members; +}; + +struct ast_function_declaration +{ + s32 ReturnTypeLength; + char* ReturnType; + + s32 NameLength; + char* Name; + + ast_field_declaration* Arguments; +}; + +struct ast_node +{ + ast_node_type Type; + ast_node* Children; + + union + { + ast_struct_declaration StructDeclaration; + ast_function_declaration FunctionDeclaration; + }; + + ast_node* Next; +}; + +struct parse_field_decl_result +{ + ast_field_declaration* Member; + token* NextToken; +}; + +internal parse_field_decl_result +ParseFieldDeclaration (//ast_field_declaration** Container, ast_field_declaration* PreviousMember, + token* StartToken, token_type TerminatorToken, token_type EnclosingToken) +{ + parse_field_decl_result Result = {}; + + ast_field_declaration* Member = 0; + + token* CurrentToken = StartToken; + if (StartToken->Type == Token_Identifier) + { + Member = (ast_field_declaration*)malloc(sizeof(ast_field_declaration)); + Member->Next = 0; + + Member->Type = CurrentToken->Text; + Member->TypeLength = CurrentToken->TextLength; + Member->TypePointer = false; + Member->TypeArray = false; + + CurrentToken = CurrentToken->Next; + if (*CurrentToken->Text == '*') + { + Member->TypePointer = true; + CurrentToken = CurrentToken->Next; + } + + Member->Name = CurrentToken->Text; + Member->NameLength = CurrentToken->TextLength; + + CurrentToken = CurrentToken->Next; + if (CurrentToken->Type == Token_LeftSquareBracket) + { + CurrentToken = CurrentToken->Next; + if (CurrentToken->Type != Token_RightSquareBracket) + { + GS_DEBUG_PRINTF("ALERT: Skipping Array parameter that has a size"); + while (CurrentToken->Type != Token_RightSquareBracket) + { + CurrentToken = CurrentToken->Next; + } + } + CurrentToken = CurrentToken->Next; + Member->TypeArray = true; + } + else if (CurrentToken->Type != TerminatorToken && + CurrentToken->Type != EnclosingToken) + { + GS_DEBUG_PRINTF("Error: struct member %s %.*s not followed by its terminator type: %s or %s\n", + TokenNames[CurrentToken->Type], CurrentToken->TextLength, CurrentToken->Text, + TokenNames[(int)TerminatorToken], TokenNames[(int)EnclosingToken]); + } + } + else if (StartToken->Type == Token_Comment) + { + CurrentToken = StartToken->Next; + } + + // NOTE(Peter): this is here because if the current token is the enclosing type, + // ie. the ')' in a parameter list, it isn't the responsibility of this function + // to deal with that. + if (CurrentToken->Type == TerminatorToken) + { + CurrentToken = CurrentToken->Next; + } + + Result.Member = Member; + Result.NextToken = CurrentToken; + + return Result; +} + +struct parse_result +{ + b32 Parsed; + ast_node* Node; + token* NextToken; +}; + +internal parse_result +ParseStructDeclaration (ast_node* PreviousNode, token* StartToken) +{ + parse_result Result = {}; + + ast_node* Struct = 0; + token* CurrentToken = StartToken; + + if (PreviousNode == 0) + { + Struct = (ast_node*)malloc(sizeof(ast_node));; + } + else + { + PreviousNode->Next = (ast_node*)malloc(sizeof(ast_node)); + Struct = PreviousNode->Next; + } + Struct->Next = 0; + Struct->StructDeclaration.Members = 0; + + Struct->Type = ASTNode_StructDeclaration; + + CurrentToken = CurrentToken->Next; + // Name Before Declaration + if (CurrentToken->Type == Token_Identifier) + { + Struct->StructDeclaration.NameLength = CurrentToken->TextLength; + Struct->StructDeclaration.Name = CurrentToken->Text; + CurrentToken = CurrentToken->Next; + } + + if (CurrentToken->Type == Token_LeftCurlyBracket) + { + CurrentToken = CurrentToken->Next; + + ast_field_declaration* Member = 0; + while (CurrentToken->Type != Token_RightCurlyBracket) + { + parse_field_decl_result MemberResult = ParseFieldDeclaration(CurrentToken, Token_Semicolon, Token_RightCurlyBracket); + + if (!Member) + { + Member = MemberResult.Member; + Member->Next = 0; + Struct->StructDeclaration.Members = Member; + } + else if (MemberResult.Member) + { + Member->Next = MemberResult.Member; + Member = Member->Next; + } + CurrentToken = MemberResult.NextToken; + } + // Advance Past the Right Bracket + CurrentToken = CurrentToken->Next; + } + else + { + GS_DEBUG_PRINTF("Error: struct not followed by {"); + } + + // Name After Declaration + if (CurrentToken->Type == Token_Identifier) + { + Struct->StructDeclaration.NameLength = CurrentToken->TextLength; + Struct->StructDeclaration.Name = CurrentToken->Text; + CurrentToken = CurrentToken->Next; + } + + if (CurrentToken->Type == Token_Semicolon) + { + CurrentToken = CurrentToken->Next; + } + else + { + GS_DEBUG_PRINTF("Error: struct declaration did not finish with a semicolon"); + } + + Result.Node = Struct; + Result.NextToken = CurrentToken; + Result.Parsed = true; + + return Result; +} + +internal b32 +IsFunction (token* StartToken) +{ + b32 Result = true; + + token* Current = StartToken; + // TODO(Peter): check a type table to see if we can do this now. + // TODO(Peter): is there a way to defer this to later? + if (Current->Type != Token_Identifier) // Return Type + { + Result = false; + return Result; + } + + Current = Current->Next; + if (Current->Type != Token_Identifier) // Function Name + { + Result = false; + return Result; + } + + Current = Current->Next; + if (Current->Type != Token_LeftParen) + { + Result = false; + return Result; + } + + Current = Current->Next; + while (Current && Current->Type != Token_RightParen) + { + Current = Current->Next; + } + + if (Current->Type != Token_RightParen) + { + Result = false; + return Result; + } + + return Result; +} + +internal parse_result +ParseFunctionDeclaration (ast_node* PreviousNode, token* StartToken) +{ + parse_result Result; + + ast_node* Function = 0; + token* CurrentToken = StartToken; + + if (PreviousNode == 0) + { + Function = (ast_node*)malloc(sizeof(ast_node)); + } + else + { + PreviousNode->Next = (ast_node*)malloc(sizeof(ast_node)); + Function = PreviousNode->Next; + } + Function->Next = 0; + + Function->Type = ASTNode_FunctionDeclaration; + Function->FunctionDeclaration.Arguments = 0; + + Function->FunctionDeclaration.ReturnTypeLength = CurrentToken->TextLength; + Function->FunctionDeclaration.ReturnType = CurrentToken->Text; + CurrentToken = CurrentToken->Next; + + Function->FunctionDeclaration.NameLength = CurrentToken->TextLength; + Function->FunctionDeclaration.Name = CurrentToken->Text; + CurrentToken = CurrentToken->Next; + + if (CurrentToken->Type == Token_LeftParen) + { + CurrentToken = CurrentToken->Next; + + ast_field_declaration* Param = 0; + while (CurrentToken->Type != Token_RightParen) + { + parse_field_decl_result ParamResult = ParseFieldDeclaration(CurrentToken, Token_Comma, Token_RightParen); + if (!Param) + { + Param = ParamResult.Member; + Param->Next = 0; + } + else if (ParamResult.Member) + { + Param->Next = ParamResult.Member; + Param = Param->Next; + } + CurrentToken = ParamResult.NextToken; + + } + + CurrentToken = CurrentToken->Next; + } + else + { + GS_DEBUG_PRINTF("Error: Function declaration is not followed by left parenthesis"); + InvalidCodePath; + } + + + Result.Node = Function; + Result.NextToken = CurrentToken; + Result.Parsed = true; + + return Result; +} \ No newline at end of file diff --git a/meta/main_meta.cpp b/meta/main_meta.cpp new file mode 100644 index 0000000..a426edf --- /dev/null +++ b/meta/main_meta.cpp @@ -0,0 +1,42 @@ +#include "..\src\gs_language.h" +#include "..\src\foldhaus_memory.h" +#include "..\src\gs_string.h" + +#include "gs_meta.cpp" + +#include +#include + +int main (int ArgCount, char* Arg[]) +{ + gs_meta_processor Meta = CreateMetaProcessor(); + AddFile(&Meta, "C:/projects/foldhaus/meta/meta_test.cpp"); + + LexAllFiles(&Meta); + ParseAllFiles(&Meta); + + +#if 0 + identifier_table_entry* NodeStructEntry = AddDefineToIdentifierTable(&Meta, "NODE_STRUCT", "NODE_STRUCT(%name)", StructDefinition); + identifier_table_entr* NodeProcEntry = AddDefineToIdentifierTable(&Meta, "NODE_PROC", "NODE_PROC(%name, %data)", FunctionDefinition); + + symbol_list NodeStructs = FindAllMatchingSymbols(Meta, NodeStructEntry); + for (s32 i = 0; i < NodeStructs.Length; i++) + { + struct_definition_symbol Struct = NodeStructs.List[i]; + + Struct.Size; + + for (s32 m = 0; m < Struct.MembersCount; m++) + { + Struct.Members[m]; + } + } +#endif + + if (Meta.ErrorList.TotalUsed > 0) + { + PrintErrorList(Meta.ErrorList); + } + return 0; +} \ No newline at end of file diff --git a/meta/meta_test.cpp b/meta/meta_test.cpp new file mode 100644 index 0000000..45abfef --- /dev/null +++ b/meta/meta_test.cpp @@ -0,0 +1,21 @@ +typedef float r32; + +struct test_struct +{ + float Float; + int Int; + char* CharPointer; +}; + +struct nested_struct +{ + float Hello; + test_struct NestedValue; + r32 TypedefedValue; +}; + +int main(char* Args, int ArgCount) +{ + return 0; +} + diff --git a/msdev.bat b/msdev.bat new file mode 100644 index 0000000..544328c --- /dev/null +++ b/msdev.bat @@ -0,0 +1,3 @@ +@echo off + +remedybg build\remedy_win32_foldhaus.rdbg \ No newline at end of file diff --git a/osx_debug_platform_layer b/osx_debug_platform_layer new file mode 160000 index 0000000..74618e0 --- /dev/null +++ b/osx_debug_platform_layer @@ -0,0 +1 @@ +Subproject commit 74618e0c5b065fb2cb8b0e3cde2020dd784e5879 diff --git a/project.4coder b/project.4coder new file mode 100644 index 0000000..c3e0944 --- /dev/null +++ b/project.4coder @@ -0,0 +1,43 @@ +version(1); +project_name = "main.exe"; +patterns = { +"*.c", +"*.cpp", +"*.h", +"*.m", +"*.bat", +"*.sh", +"*.4coder", +}; +blacklist_patterns = { +".*", +}; +load_paths_base = { + { "src", .relative = true, .recursive = true, }, + { "meta", .relative = true, .recursive = true, }, +}; +load_paths = { + { load_paths_base, .os = "win", }, + { load_paths_base, .os = "linux", }, + { load_paths_base, .os = "mac", }, +}; + +command_list = { + { .name = "build_application", + .out = "*app compilation*", .footer_panel = false, .save_dirty_files = true, + .cmd = { { "src\\build.bat" , .os = "win" }, + { "./build.sh", .os = "linux" }, + { "./build.sh", .os = "mac" }, }, }, + { .name = "build_meta", + .out = "*meta compilation*", .footer_panel = false, .save_dirty_files = true, + .cmd = { { "meta\\build.bat" , .os = "win" }, + { "./meta/build.sh", .os = "linux" }, + { "./meta/build.sh", .os = "mac" }, }, }, + { .name = "run_application", + .out = "*run*", .footer_panel = false, .save_dirty_files = false, + .cmd = { { "build\\win32_foldhaus.exe", .os = "win" }, + { "build/main.exe" , .os = "linux" }, + { "build/main.exe" , .os = "mac" }, }, }, +}; +fkey_command[1] = "build"; +fkey_command[2] = "run"; diff --git a/assembly_parser.cpp b/src/assembly_parser.cpp similarity index 100% rename from assembly_parser.cpp rename to src/assembly_parser.cpp diff --git a/assembly_parser.h b/src/assembly_parser.h similarity index 100% rename from assembly_parser.h rename to src/assembly_parser.h diff --git a/build.bat b/src/build.bat similarity index 100% rename from build.bat rename to src/build.bat diff --git a/foldhaus_app.cpp b/src/foldhaus_app.cpp similarity index 90% rename from foldhaus_app.cpp rename to src/foldhaus_app.cpp index 28d5155..0ce2f66 100644 --- a/foldhaus_app.cpp +++ b/src/foldhaus_app.cpp @@ -336,6 +336,12 @@ UnloadAssembly (s32 AssemblyIndex, app_state* State, context Context) //////////////////////////////////////////////////////////////////////// +internal void +RegisterTextEntryCommands (input_command_registry* CommandRegistry) +{ + +} + RELOAD_STATIC_DATA(ReloadStaticData) { app_state* State = (app_state*)Context.MemoryBase; @@ -373,9 +379,15 @@ INITIALIZE_APPLICATION(InitializeApplication) InitMemoryArena(&State->SACNMemory, 0, 0, Context.PlatformAlloc); InitializeInputCommandRegistry(&State->InputCommandRegistry, 32, State->Permanent); - InitializeInputCommandRegistry(&State->NodeListerCommandRegistry, 32, State->Permanent); + InitializeInputCommandRegistry(&State->NodeListerCommandRegistry, 128, State->Permanent); State->ActiveCommands = &State->InputCommandRegistry; + s32 CommandQueueSize = 32; + command_queue_entry* CommandQueueMemory = PushArray(State->Permanent, + command_queue_entry, + CommandQueueSize); + State->CommandQueue = InitializeCommandQueue(CommandQueueMemory, CommandQueueSize); + State->ActiveTextEntry.Buffer = MakeString(PushArray(State->Permanent, char, 256), 0, 256); // TODO(Peter): put in InitializeInterface? @@ -494,11 +506,61 @@ UPDATE_AND_RENDER(UpdateAndRender) // incorrect to clear the arena, and then access the memory later. ClearArena(State->Transient); - if (State->ActiveCommands == &State->NodeListerCommandRegistry) + // NOTE(Peter): Input Handling + gui_mouse GuiMouse = {}; + GuiMouse.Pos = Mouse.Pos; + GuiMouse.OldPos = Mouse.OldPos; + GuiMouse.DeltaPos = Mouse.DeltaPos; + GuiMouse.DownPos = Mouse.DownPos; { - AppendInputToEntryString(&State->ActiveTextEntry, Input.New->StringInput, Input.New->StringInputUsed); + ActivateQueuedCommandRegistry(State); + + // CommandQueue holds the list of commands, generated from the current InputCommandRegistry + // Every command entry in the queue should be executed. + // For every Input Event, attempt to add an entry to the CommandQueue if an appropriate command + // exists in ActiveCommands + RemoveNonPersistantCommandsFromQueueAndUpdatePersistentEvents(&State->CommandQueue); + + for (s32 EventIdx = 0; EventIdx < InputQueue.QueueUsed; EventIdx++) + { + input_entry Event = InputQueue.Entries[EventIdx]; + input_command* Command = FindExistingCommand(State->ActiveCommands, Event.Key, (key_code)0); + if (Command) + { + if (KeyTransitionedDown(Event)) + { + PushCommandOnQueue(&State->CommandQueue, *Command, Event); + } + else if (Command->PersistsUntilReleased && KeyTransitionedUp(Event)) + { + RemoveCommandFromQueue(&State->CommandQueue, *Command, Event); + } + } + + if (Event.Key == KeyCode_MouseLeftButton) + { + GuiMouse.LeftButtonTransitionedDown = KeyTransitionedDown(Event); + GuiMouse.LeftButtonTransitionedUp = KeyTransitionedUp(Event); + } + else if (Event.Key == KeyCode_MouseMiddleButton) + { + GuiMouse.MiddleButtonTransitionedDown = KeyTransitionedDown(Event); + GuiMouse.MiddleButtonTransitionedUp = KeyTransitionedUp(Event); + } + else if (Event.Key == KeyCode_MouseRightButton) + { + GuiMouse.RightButtonTransitionedDown = KeyTransitionedDown(Event); + GuiMouse.RightButtonTransitionedUp = KeyTransitionedUp(Event); + } + } + + // Execute all commands in CommandQueue + for (s32 CommandIdx = 0; CommandIdx < State->CommandQueue.Used; CommandIdx++) + { + command_queue_entry Entry = State->CommandQueue.Commands[CommandIdx]; + Entry.Command.Proc(State, Entry.Event, Mouse); + } } - ExecuteAllRegisteredCommands(State->ActiveCommands, Input, State); if (State->LEDBufferList) { @@ -700,13 +762,13 @@ UPDATE_AND_RENDER(UpdateAndRender) panel_result TopBarPanel = EvaluatePanel(RenderBuffer, v2{0, Context.WindowHeight - TopBarHeight}, v2{Context.WindowWidth, Context.WindowHeight}, - 0, State->Interface, Input); + 0, State->Interface); v2 ButtonDim = v2{200, (r32)NewLineYOffset(*State->Interface.Font) + 10}; v2 ButtonPos = v2{State->Interface.Margin.x, Context.WindowHeight - (ButtonDim.y + 10)}; button_result LoadAssemblyBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, MakeStringLiteral("Load Assembly"), - State->Interface, Input); + State->Interface, GuiMouse); string InterfaceString = MakeString(PushArray(State->Transient, char, 256), 256); for (int i = 0; i < State->AssembliesUsed; i++) @@ -715,7 +777,7 @@ UPDATE_AND_RENDER(UpdateAndRender) ButtonPos.x += ButtonDim.x + 10; button_result UnloadAssemblyBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - InterfaceString, State->Interface, Input); + InterfaceString, State->Interface, GuiMouse); if (UnloadAssemblyBtn.Pressed) { @@ -738,30 +800,25 @@ UPDATE_AND_RENDER(UpdateAndRender) // Figuring Out Nodes ////////////////////////////////////// - v2 MousePos = v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}; - v2 LastFrameMousePos = v2{(r32)Input.Old->MouseX, (r32)Input.Old->MouseY}; - - if (KeyTransitionedDown(Input, KeyCode_MouseLeftButton)) + if (GuiMouse.LeftButtonTransitionedDown) { - node_offset Node = GetNodeUnderPoint(State->NodeList, MousePos, State->NodeRenderSettings); + node_offset Node = GetNodeUnderPoint(State->NodeList, GuiMouse.Pos, State->NodeRenderSettings); if (Node.Node) { - State->NodeInteraction = GetNodeInteractionType(Node.Node, Node.Offset, MousePos, State->NodeRenderSettings); + State->NodeInteraction = GetNodeInteractionType(Node.Node, Node.Offset, GuiMouse.Pos, State->NodeRenderSettings); } } - else if (KeyTransitionedUp(Input, KeyCode_MouseLeftButton)) + else if (GuiMouse.LeftButtonTransitionedUp) { if (IsDraggingNodePort(State->NodeInteraction)) { - TryConnectNodes(State->NodeInteraction, MousePos, State->NodeList, State->NodeRenderSettings); + TryConnectNodes(State->NodeInteraction, GuiMouse.Pos, State->NodeList, State->NodeRenderSettings); State->NodeInteraction = NewEmptyNodeInteraction(); } else if(IsDraggingNodeValue(State->NodeInteraction)) { - v2 MouseDelta = MousePos - LastFrameMousePos; - // This is just a click - if (Mag(MouseDelta) < 10) + if (Mag(Mouse.DeltaPos) < 10) { node_interaction Interaction = State->NodeInteraction; interface_node* Node = GetNodeAtOffset(State->NodeList, Interaction.NodeOffset); @@ -788,11 +845,11 @@ UPDATE_AND_RENDER(UpdateAndRender) } - UpdateDraggingNode(MousePos, State->NodeInteraction, State->NodeList, + UpdateDraggingNode(Mouse.Pos, State->NodeInteraction, State->NodeList, State->NodeRenderSettings); - UpdateDraggingNodePort(MousePos, State->NodeInteraction, State->NodeList, + UpdateDraggingNodePort(Mouse.Pos, State->NodeInteraction, State->NodeList, State->NodeRenderSettings, RenderBuffer); - UpdateDraggingNodeValue(MousePos, LastFrameMousePos, State->NodeInteraction, State->NodeList, State->NodeRenderSettings, State); + UpdateDraggingNodeValue(Mouse.Pos, Mouse.OldPos, State->NodeInteraction, State->NodeList, State->NodeRenderSettings, State); ResetNodesUpdateState(State->NodeList); @@ -812,7 +869,7 @@ UPDATE_AND_RENDER(UpdateAndRender) NodeListerGetNodeName, &State->ActiveTextEntry.Buffer, State->ActiveTextEntry.CursorPosition, - State->Font, State->Interface, Input); + State->Font, State->Interface, GuiMouse); State->GeneralPurposeSearchHotItem = NodeListResult.HotItem; } } @@ -820,10 +877,9 @@ UPDATE_AND_RENDER(UpdateAndRender) if (State->ColorPickerEditValue != 0) { b32 ShouldClose = EvaluateColorPicker(RenderBuffer, State->ColorPickerEditValue, - v2{200, 200}, State->Interface, Input); + v2{200, 200}, State->Interface, GuiMouse); - if (ShouldClose || - KeyTransitionedDown(Input, KeyCode_Esc)) + if (ShouldClose) { State->ColorPickerEditValue = 0; } @@ -831,7 +887,7 @@ UPDATE_AND_RENDER(UpdateAndRender) DrawDebugInterface(RenderBuffer, 25, State->Interface, Context.WindowWidth, Context.WindowHeight - TopBarHeight, - Context.DeltaTime, State, State->Camera, Input, State->Transient); + Context.DeltaTime, State, State->Camera, GuiMouse, State->Transient); } EndDebugFrame(GlobalDebugServices); diff --git a/foldhaus_app.h b/src/foldhaus_app.h similarity index 87% rename from foldhaus_app.h rename to src/foldhaus_app.h index 1d113b2..6f04ccd 100644 --- a/foldhaus_app.h +++ b/src/foldhaus_app.h @@ -68,7 +68,13 @@ struct app_state input_command_registry InputCommandRegistry; input_command_registry NodeListerCommandRegistry; + // NOTE(Peter): stores the address of the command registry to be activated next frame. + // was having a problem where switching command registry's in the middle of the loop trying to + // execute commands was causing problems. + input_command_registry* NextCommandRegistry; input_command_registry* ActiveCommands; + + input_command_queue CommandQueue; text_entry ActiveTextEntry; streaming_acn SACN; diff --git a/src/foldhaus_command_dispatch.cpp b/src/foldhaus_command_dispatch.cpp new file mode 100644 index 0000000..c8a88f1 --- /dev/null +++ b/src/foldhaus_command_dispatch.cpp @@ -0,0 +1,149 @@ +internal void +InitializeInputCommandRegistry (input_command_registry* CommandRegistry, + s32 Size, + memory_arena* Storage) +{ + CommandRegistry->Commands = PushArray(Storage, input_command, Size); + CommandRegistry->Size = Size; + CommandRegistry->Used = 0; +} + +internal input_command* +FindExistingCommand (input_command_registry* CommandRegistry, key_code Key, key_code Mdfr) +{ + input_command* Result = 0; + + for (s32 Cmd = 0; Cmd < CommandRegistry->Used; Cmd++) + { + input_command* Command = CommandRegistry->Commands + Cmd; + if (Command->Key == Key && Command->Mdfr == Mdfr) + { + Result = Command; + break; + } + } + + return Result; +} + +internal void +RegisterKeyPressCommand (input_command_registry* CommandRegistry, + key_code Key, + b32 PersistsUntilReleased, + key_code Mdfr, + input_command_proc* Proc) +{ + input_command* Command = FindExistingCommand(CommandRegistry, Key, Mdfr); + + if (!Command) + { + Assert(CommandRegistry->Size > CommandRegistry->Used); + Assert(Mdfr == KeyCode_Invalid || Mdfr == KeyCode_LeftShift || Mdfr == KeyCode_RightShift || + Mdfr == KeyCode_LeftCtrl || Mdfr == KeyCode_RightCtrl || Mdfr == KeyCode_Alt); + Command = CommandRegistry->Commands + CommandRegistry->Used++; + } + + Command->Key = Key; + Command->PersistsUntilReleased = PersistsUntilReleased; + Command->Mdfr = Mdfr; + Command->Proc = Proc; +} + +internal void +RegisterMouseWheelCommand (input_command_registry* CommandRegistry, + input_command_proc* Proc) +{ + CommandRegistry->MouseWheelCommand = Proc; +} + +internal input_command_queue +InitializeCommandQueue(command_queue_entry* Memory, s32 MemorySize) +{ + input_command_queue Result = {}; + Result.Size = MemorySize; + Result.Used = 0; + Result.Commands = Memory; + return Result; +} + +internal void +RemoveNonPersistantCommandsFromQueueAndUpdatePersistentEvents(input_command_queue* Queue) +{ + s32 PersistantCommandsCount = 0; + for (s32 i = 0; i < Queue->Used; i++) + { + command_queue_entry* Entry = Queue->Commands + i; + if (Entry->Command.PersistsUntilReleased) + { + Entry->Event.State |= KeyState_WasDown; + // NOTE(Peter): If i == PersistantCommandsCount, then we don't need to copy the + // command anywhere + if (i != PersistantCommandsCount) + { + Queue->Commands[PersistantCommandsCount] = *Entry; + } + PersistantCommandsCount++; + } + } + Queue->Used = PersistantCommandsCount; +} + +internal void +PushCommandOnQueue(input_command_queue* Queue, input_command Command, input_entry Event) +{ + Assert(Queue->Used < Queue->Size); + command_queue_entry Entry = {}; + Entry.Command = Command; + Entry.Event = Event; + Queue->Commands[Queue->Used++] = Entry; +} + +internal void +RemoveCommandFromQueue(input_command_queue* Queue, input_command Command, input_entry Event) +{ + s32 CommandIndex = 0; + for (CommandIndex = 0; CommandIndex < Queue->Used; CommandIndex++) + { + command_queue_entry* Entry = Queue->Commands + CommandIndex; + if(Entry->Event.Key == Event.Key) + { + break; + } + } + + // NOTE(Peter): If we made it through the queue without finding an event, there wasn't one + // to remove. This happens when we've changed command registries as a result of an input command, + // and the command exists in the new registry. + // For example: + // clicking a mouse button triggers a command to switch registries + // the new registry tracks mouse drag (persist until release) + // when the mouse is released, the event fires, but there is no mouse down event to remove + // For this reason, I'm allowing the case where we try and remove a command where non exists + // I don't think this is a great solution but Im not super familiar with the codebase right now + // so leaving it as is. revisit if it becomes a problem. + if (CommandIndex < Queue->Used) + { + Queue->Used -= 1; + + for (; CommandIndex < Queue->Used; CommandIndex++) + { + Queue->Commands[CommandIndex] = Queue->Commands[CommandIndex + 1]; + } + } +} + +internal void +QueueNextFrameCommandRegistry (input_command_registry* NewRegistry, app_state* State) +{ + State->NextCommandRegistry = NewRegistry; +} + +internal void +ActivateQueuedCommandRegistry (app_state* State) +{ + if (State->NextCommandRegistry) + { + State->ActiveCommands = State->NextCommandRegistry; + State->NextCommandRegistry = 0; + } +} \ No newline at end of file diff --git a/foldhaus_command_dispatch.h b/src/foldhaus_command_dispatch.h similarity index 74% rename from foldhaus_command_dispatch.h rename to src/foldhaus_command_dispatch.h index 255622f..8a2383f 100644 --- a/foldhaus_command_dispatch.h +++ b/src/foldhaus_command_dispatch.h @@ -7,7 +7,7 @@ ExecuteRegisteredCommands(Context, Input); #endif // USAGE_CODE -#define FOLDHAUS_INPUT_COMMAND_PROC(name) void name(app_state* State, input Input) +#define FOLDHAUS_INPUT_COMMAND_PROC(name) void name(app_state* State, input_entry Event, mouse_state Mouse) typedef FOLDHAUS_INPUT_COMMAND_PROC(input_command_proc); // TODO(Peter): At the moment these are all key press commands. Need a way to differentiate between @@ -15,7 +15,7 @@ typedef FOLDHAUS_INPUT_COMMAND_PROC(input_command_proc); struct input_command { key_code Key; - b32 Held; + b32 PersistsUntilReleased; key_code Mdfr; input_command_proc* Proc; }; @@ -28,3 +28,16 @@ struct input_command_registry input_command_proc* MouseWheelCommand; }; + +struct command_queue_entry +{ + input_command Command; + input_entry Event; +}; + +struct input_command_queue +{ + s32 Size; + s32 Used; + command_queue_entry* Commands; +}; \ No newline at end of file diff --git a/foldhaus_debug.h b/src/foldhaus_debug.h similarity index 100% rename from foldhaus_debug.h rename to src/foldhaus_debug.h diff --git a/foldhaus_debug_visuals.h b/src/foldhaus_debug_visuals.h similarity index 89% rename from foldhaus_debug_visuals.h rename to src/foldhaus_debug_visuals.h index 2745241..8454ddc 100644 --- a/foldhaus_debug_visuals.h +++ b/src/foldhaus_debug_visuals.h @@ -1,5 +1,5 @@ internal void -DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_config Interface, r32 WindowWidth, r32 WindowHeight, r32 DeltaTime, app_state* State, camera Camera, input Input, memory_arena* Transient) +DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_config Interface, r32 WindowWidth, r32 WindowHeight, r32 DeltaTime, app_state* State, camera Camera, gui_mouse Mouse, memory_arena* Transient) { DEBUG_TRACK_SCOPE(DrawDebugInterface); @@ -20,8 +20,8 @@ DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_c r32 FramesPerSecond = 1.0f / DeltaTime; - string InputCommands = MakeStringLiteral("Default Input Registry - HI KALAN"); - string NodeListerCommands = MakeStringLiteral("Node Lister Input Registry - HI KALAN"); + string InputCommands = MakeStringLiteral("Default Input Registry - HELLO DAVID"); + string NodeListerCommands = MakeStringLiteral("Node Lister Input Registry"); string ActiveInputRegistry = {}; if (State->ActiveCommands == &State->InputCommandRegistry) { @@ -41,14 +41,14 @@ DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_c TopOfScreenLinePos.y -= ButtonDim.y + 10; v2 ButtonPos = TopOfScreenLinePos; button_result CameraBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - MakeStringLiteral("Camera"), Interface, Input); + MakeStringLiteral("Camera"), Interface, Mouse); ButtonPos.x += ButtonDim.x + 10; button_result ScopeTimeBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - MakeStringLiteral("Scope Time"), Interface, Input); + MakeStringLiteral("Scope Time"), Interface, Mouse); ButtonPos.x += ButtonDim.x + 10; button_result RenderSculptureBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - MakeStringLiteral("Visualize"), Interface, Input); + MakeStringLiteral("Visualize"), Interface, Mouse); ButtonPos.x += ButtonDim.x + 10; @@ -63,7 +63,7 @@ DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_c } button_result SendSACNDataBtn = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - SACNButtonString, Interface, Input); + SACNButtonString, Interface, Mouse); TopOfScreenLinePos.y -= NewLineYOffset(*Interface.Font) + 10; @@ -99,6 +99,16 @@ DrawDebugInterface (render_command_buffer* RenderBuffer, r32 StartX, interface_c 3, Camera.LookAt.z); DrawString(RenderBuffer, DebugString, Interface.Font, Interface.FontSize, TopOfScreenLinePos, v4{1.0f, 1.0f, 1.0f, 1.0f}); TopOfScreenLinePos.y -= NewLineYOffset(*Interface.Font); + + s32 MousePrecision = 0; + PrintF(&DebugString, "Mouse Pos: (%.*f, %.*f) Down: (%.*f, %.*f)", + MousePrecision, Mouse.Pos.x, + MousePrecision, Mouse.Pos.y, + MousePrecision, Mouse.DownPos.x, + MousePrecision, Mouse.DownPos.y); + DrawString(RenderBuffer, DebugString, Interface.Font, Interface.FontSize, + TopOfScreenLinePos, WhiteV4); + TopOfScreenLinePos.y -= NewLineYOffset(*Interface.Font); } if (GlobalDebugServices->Interface.ShowTrackedScopes) diff --git a/foldhaus_default_nodes.h b/src/foldhaus_default_nodes.h similarity index 100% rename from foldhaus_default_nodes.h rename to src/foldhaus_default_nodes.h diff --git a/src/foldhaus_interface.cpp b/src/foldhaus_interface.cpp new file mode 100644 index 0000000..c6eb2e9 --- /dev/null +++ b/src/foldhaus_interface.cpp @@ -0,0 +1,53 @@ +FOLDHAUS_INPUT_COMMAND_PROC(CameraMouseControl) +{ + if (State->NodeInteraction.NodeOffset >= 0) { return; } + + if (KeyTransitionedDown(Event)) + { + State->Camera_StartDragPos = V4(State->Camera.Position, 1); + } + + if (!State->DrawUniverseOutputDisplay) + { + v2 TotalDeltaPos = Mouse.Pos - Mouse.DownPos; + + m44 XRotation = GetXRotation(-TotalDeltaPos.y * State->PixelsToWorldScale); + m44 YRotation = GetYRotation(TotalDeltaPos.x * State->PixelsToWorldScale); + m44 Combined = XRotation * YRotation; + + State->Camera.Position = V3(Combined * State->Camera_StartDragPos); + } + else + { + State->UniverseOutputDisplayOffset += Mouse.DeltaPos; + } +} + +FOLDHAUS_INPUT_COMMAND_PROC(CameraMouseZoom) +{ + if (State->DrawUniverseOutputDisplay) + { + r32 DeltaZoom = (r32)(Mouse.Scroll) / 120; + State->UniverseOutputDisplayZoom = GSClamp(0.1f, State->UniverseOutputDisplayZoom + DeltaZoom, 4.f); + } + +} + +FOLDHAUS_INPUT_COMMAND_PROC(ToggleUniverseDebugView) +{ + State->DrawUniverseOutputDisplay = !State->DrawUniverseOutputDisplay; +} + + +FOLDHAUS_INPUT_COMMAND_PROC(OpenNodeLister) +{ + State->InterfaceShowNodeList = true; + State->NodeListMenuPosition = Mouse.Pos; + SetTextInputDestinationToString(&State->ActiveTextEntry, &State->GeneralPurposeSearchString); + State->ActiveCommands = &State->NodeListerCommandRegistry; +} + +FOLDHAUS_INPUT_COMMAND_PROC(ToggleNodeDisplay) +{ + State->NodeRenderSettings.Display = !State->NodeRenderSettings.Display; +} \ No newline at end of file diff --git a/foldhaus_interface.h b/src/foldhaus_interface.h similarity index 100% rename from foldhaus_interface.h rename to src/foldhaus_interface.h diff --git a/foldhaus_memory.h b/src/foldhaus_memory.h similarity index 100% rename from foldhaus_memory.h rename to src/foldhaus_memory.h diff --git a/foldhaus_network_ordering.h b/src/foldhaus_network_ordering.h similarity index 100% rename from foldhaus_network_ordering.h rename to src/foldhaus_network_ordering.h diff --git a/foldhaus_node.cpp b/src/foldhaus_node.cpp similarity index 100% rename from foldhaus_node.cpp rename to src/foldhaus_node.cpp diff --git a/foldhaus_node.h b/src/foldhaus_node.h similarity index 100% rename from foldhaus_node.h rename to src/foldhaus_node.h diff --git a/foldhaus_platform.h b/src/foldhaus_platform.h similarity index 97% rename from foldhaus_platform.h rename to src/foldhaus_platform.h index e8a95b9..5c0bc24 100644 --- a/foldhaus_platform.h +++ b/src/foldhaus_platform.h @@ -3,12 +3,15 @@ #include "foldhaus_memory.h" #include "gs_string.h" -#include "gs_input.h" #include "foldhaus_debug.h" global_variable debug_services* GlobalDebugServices; #include "gs_vector_matrix.h" + +#include "gs_input.h" + + #include "foldhaus_renderer.h" typedef struct context context; @@ -19,7 +22,7 @@ typedef struct context context; #define INITIALIZE_APPLICATION(name) void name(context Context) typedef INITIALIZE_APPLICATION(initialize_application); -#define UPDATE_AND_RENDER(name) void name(context Context, input Input, render_command_buffer* RenderBuffer) +#define UPDATE_AND_RENDER(name) void name(context Context, input_queue InputQueue, mouse_state Mouse, render_command_buffer* RenderBuffer) typedef UPDATE_AND_RENDER(update_and_render); #define RELOAD_STATIC_DATA(name) void name(context Context, debug_services* DebugServices) diff --git a/foldhaus_renderer.cpp b/src/foldhaus_renderer.cpp similarity index 100% rename from foldhaus_renderer.cpp rename to src/foldhaus_renderer.cpp diff --git a/foldhaus_renderer.h b/src/foldhaus_renderer.h similarity index 100% rename from foldhaus_renderer.h rename to src/foldhaus_renderer.h diff --git a/foldhaus_sacn.h b/src/foldhaus_sacn.h similarity index 100% rename from foldhaus_sacn.h rename to src/foldhaus_sacn.h diff --git a/foldhaus_sacn_view.cpp b/src/foldhaus_sacn_view.cpp similarity index 100% rename from foldhaus_sacn_view.cpp rename to src/foldhaus_sacn_view.cpp diff --git a/foldhaus_search_lister.cpp b/src/foldhaus_search_lister.cpp similarity index 89% rename from foldhaus_search_lister.cpp rename to src/foldhaus_search_lister.cpp index 1c7c91f..9f9121c 100644 --- a/foldhaus_search_lister.cpp +++ b/src/foldhaus_search_lister.cpp @@ -60,15 +60,14 @@ FOLDHAUS_INPUT_COMMAND_PROC(CloseSearchLister) State->InterfaceShowNodeList = false; // TODO(Peter): This also assumes we know where we came from. Probably need to implement // push/pop functionality for the activecommands. - State->ActiveCommands = &State->InputCommandRegistry; + QueueNextFrameCommandRegistry(&State->InputCommandRegistry, State); State->GeneralPurposeSearchHotItem = -1; } FOLDHAUS_INPUT_COMMAND_PROC(SelectAndCloseSearchLister) { s32 HotItem = State->GeneralPurposeSearchHotItem; - v2 MousePos = v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}; PushNodeOnListFromSpecification(State->NodeList, NodeSpecifications[HotItem], - MousePos, State->NodeRenderSettings, State->Permanent); - CloseSearchLister(State, Input); -} \ No newline at end of file + Mouse.Pos, State->NodeRenderSettings, State->Permanent); + CloseSearchLister(State, Event, Mouse); +} diff --git a/foldhaus_search_lister.h b/src/foldhaus_search_lister.h similarity index 100% rename from foldhaus_search_lister.h rename to src/foldhaus_search_lister.h diff --git a/foldhaus_text_entry.cpp b/src/foldhaus_text_entry.cpp similarity index 80% rename from foldhaus_text_entry.cpp rename to src/foldhaus_text_entry.cpp index 3de57d2..720fd0c 100644 --- a/foldhaus_text_entry.cpp +++ b/src/foldhaus_text_entry.cpp @@ -59,20 +59,6 @@ SetTextInputDestinationToFloat (text_entry* TextInput, r32* DestinationFloat) } } -internal void -AppendInputToEntryString (text_entry* EntryString, char* InputString, s32 InputStringLength) -{ - if (InputStringLength > 0) - { - for (s32 i = 0; i < InputStringLength; i++) - { - InsertChar(&EntryString->Buffer, InputString[i], EntryString->CursorPosition); - EntryString->CursorPosition++; - } - } - PipeSearchStringToDestination(EntryString); -} - internal void MoveCursorRight (text_entry* TextEntry) { @@ -86,6 +72,21 @@ MoveCursorLeft (text_entry* TextEntry) TextEntry->CursorPosition = GSMax(0, TextEntry->CursorPosition - 1); } +FOLDHAUS_INPUT_COMMAND_PROC(TextEntryInsertChar) +{ + + char Char = CharacterFromKeyCode(Event.Key); + if (Event.Key >= KeyCode_A && Event.Key <= KeyCode_Z && (Event.Modifiers & Modifier_Shift) == 0) + { + Char += ('a' - 'A'); + } + + InsertChar(&State->ActiveTextEntry.Buffer, Char, State->ActiveTextEntry.CursorPosition); + State->ActiveTextEntry.CursorPosition++; + // TODO(Peter): Do we want to do this after every single character? + PipeSearchStringToDestination(&State->ActiveTextEntry); +} + FOLDHAUS_INPUT_COMMAND_PROC(RemoveCharacterFromEntryString) { RemoveCharacterAtCursor(&State->ActiveTextEntry); @@ -109,5 +110,11 @@ InitializeTextInputCommands (input_command_registry* Commands, memory_arena* Per RegisterKeyPressCommand(Commands, KeyCode_Backspace, false, KeyCode_Invalid, RemoveCharacterFromEntryString); RegisterKeyPressCommand(Commands, KeyCode_LeftArrow, false, KeyCode_Invalid, TextEntryMoveCursorLeft); RegisterKeyPressCommand(Commands, KeyCode_RightArrow, false, KeyCode_Invalid, TextEntryMoveCursorRight); + + for (s32 i = KeyCode_a; i < KeyCode_UpArrow; i++) + { + RegisterKeyPressCommand(Commands, (key_code)i, false, KeyCode_Invalid, TextEntryInsertChar); + } + } } diff --git a/foldhaus_text_entry.h b/src/foldhaus_text_entry.h similarity index 100% rename from foldhaus_text_entry.h rename to src/foldhaus_text_entry.h diff --git a/foldhaus_util_radialumia_file_converter.cpp b/src/foldhaus_util_radialumia_file_converter.cpp similarity index 100% rename from foldhaus_util_radialumia_file_converter.cpp rename to src/foldhaus_util_radialumia_file_converter.cpp diff --git a/generated/foldhaus_nodes_generated.cpp b/src/generated/foldhaus_nodes_generated.cpp similarity index 100% rename from generated/foldhaus_nodes_generated.cpp rename to src/generated/foldhaus_nodes_generated.cpp diff --git a/generated/foldhaus_nodes_generated.h b/src/generated/foldhaus_nodes_generated.h similarity index 100% rename from generated/foldhaus_nodes_generated.h rename to src/generated/foldhaus_nodes_generated.h diff --git a/gs_font.h b/src/gs_font.h similarity index 100% rename from gs_font.h rename to src/gs_font.h diff --git a/src/gs_input.h b/src/gs_input.h new file mode 100644 index 0000000..cc5ac77 --- /dev/null +++ b/src/gs_input.h @@ -0,0 +1,88 @@ +enum key_state_flags +{ + KeyState_WasDown = 1 << 0, + KeyState_IsDown = 1 << 1, +}; + +#define KeyWasDown(event) ((event.State & KeyState_WasDown) > 0) +#define KeyIsDown(event) ((event.State & KeyState_IsDown) > 0) + +struct input_entry +{ + key_code Key; + b32 State; + b32 Modifiers; +}; + +struct input_queue +{ + s32 QueueSize; + s32 QueueUsed; + input_entry* Entries; +}; + +struct mouse_state +{ + s32 Scroll; + + v2 Pos; + v2 OldPos; + v2 DeltaPos; + + v2 DownPos; +}; + +internal input_queue +InitializeInputQueue (u8* Memory, s32 MemorySize) +{ + input_queue Result = {}; + s32 EntriesCount = MemorySize / sizeof(input_entry); + Result.QueueSize = EntriesCount; + Result.QueueUsed = 0; + Result.Entries = (input_entry*)Memory; + return Result; +} + +internal void +ResetInputQueue (input_queue* Queue) +{ + Queue->QueueUsed = 0; +} + +internal void +AddInputEventEntry (input_queue* Queue, key_code Key, + b32 WasDown, b32 IsDown, b32 ShiftDown, b32 AltDown, b32 CtrlDown, b32 SysDown) +{ + Assert(Queue->QueueUsed < Queue->QueueSize); + + input_entry* Entry = Queue->Entries + Queue->QueueUsed++; + Entry->Key = Key; + + Entry->State = (key_state_flags)0; + if (WasDown) { Entry->State |= KeyState_WasDown; } + if (IsDown) { Entry->State |= KeyState_IsDown; } + + Entry->Modifiers = 0; + if (ShiftDown) { Entry->Modifiers |= Modifier_Shift; } + if (CtrlDown) { Entry->Modifiers |= Modifier_Ctrl; } + if (AltDown) { Entry->Modifiers |= Modifier_Alt; } + if (SysDown) { Entry->Modifiers |= Modifier_Sys; } +} + +internal b32 +KeyTransitionedDown (input_entry Entry) +{ + return (!KeyWasDown(Entry) && KeyIsDown(Entry)); +} + +internal b32 +KeyTransitionedUp (input_entry Entry) +{ + return (KeyWasDown(Entry) && !KeyIsDown(Entry)); +} + +internal b32 +KeyHeldDown (input_entry Entry) +{ + return (KeyWasDown(Entry) && KeyIsDown(Entry)); +} \ No newline at end of file diff --git a/gs_language.h b/src/gs_language.h similarity index 100% rename from gs_language.h rename to src/gs_language.h diff --git a/gs_memory.h b/src/gs_memory.h similarity index 100% rename from gs_memory.h rename to src/gs_memory.h diff --git a/gs_platform.h b/src/gs_platform.h similarity index 58% rename from gs_platform.h rename to src/gs_platform.h index 266e3b9..2e525b6 100644 --- a/gs_platform.h +++ b/src/gs_platform.h @@ -169,6 +169,133 @@ enum key_code KeyCode_Count, }; +internal char +CharacterFromKeyCode (key_code Code) +{ + char Result = 0; + + switch (Code) + { + case KeyCode_Space: { Result = ' '; }break; + case KeyCode_Tab: { Result = '\t'; }break; + + // Letters + case KeyCode_a: { Result = 'a'; }break; + case KeyCode_b: { Result = 'b'; }break; + case KeyCode_c: { Result = 'c'; }break; + case KeyCode_d: { Result = 'd'; }break; + case KeyCode_e: { Result = 'e'; }break; + case KeyCode_f: { Result = 'f'; }break; + case KeyCode_g: { Result = 'g'; }break; + case KeyCode_h: { Result = 'h'; }break; + case KeyCode_i: { Result = 'i'; }break; + case KeyCode_j: { Result = 'j'; }break; + case KeyCode_k: { Result = 'k'; }break; + case KeyCode_l: { Result = 'l'; }break; + case KeyCode_m: { Result = 'm'; }break; + case KeyCode_n: { Result = 'n'; }break; + case KeyCode_o: { Result = 'o'; }break; + case KeyCode_p: { Result = 'p'; }break; + case KeyCode_q: { Result = 'q'; }break; + case KeyCode_r: { Result = 'r'; }break; + case KeyCode_s: { Result = 's'; }break; + case KeyCode_t: { Result = 't'; }break; + case KeyCode_u: { Result = 'u'; }break; + case KeyCode_v: { Result = 'v'; }break; + case KeyCode_w: { Result = 'w'; }break; + case KeyCode_x: { Result = 'x'; }break; + case KeyCode_y: { Result = 'y'; }break; + case KeyCode_z: { Result = 'z'; }break; + + case KeyCode_A: { Result = 'A'; }break; + case KeyCode_B: { Result = 'B'; }break; + case KeyCode_C: { Result = 'C'; }break; + case KeyCode_D: { Result = 'D'; }break; + case KeyCode_E: { Result = 'E'; }break; + case KeyCode_F: { Result = 'F'; }break; + case KeyCode_G: { Result = 'G'; }break; + case KeyCode_H: { Result = 'H'; }break; + case KeyCode_I: { Result = 'I'; }break; + case KeyCode_J: { Result = 'J'; }break; + case KeyCode_K: { Result = 'K'; }break; + case KeyCode_L: { Result = 'L'; }break; + case KeyCode_M: { Result = 'M'; }break; + case KeyCode_N: { Result = 'N'; }break; + case KeyCode_O: { Result = 'O'; }break; + case KeyCode_P: { Result = 'P'; }break; + case KeyCode_Q: { Result = 'Q'; }break; + case KeyCode_R: { Result = 'R'; }break; + case KeyCode_S: { Result = 'S'; }break; + case KeyCode_T: { Result = 'T'; }break; + case KeyCode_U: { Result = 'U'; }break; + case KeyCode_V: { Result = 'V'; }break; + case KeyCode_W: { Result = 'W'; }break; + case KeyCode_X: { Result = 'X'; }break; + case KeyCode_Y: { Result = 'Y'; }break; + case KeyCode_Z: { Result = 'Z'; }break; + + // Numbers + case KeyCode_0: { Result = '0'; }break; + case KeyCode_1: { Result = '1'; }break; + case KeyCode_2: { Result = '2'; }break; + case KeyCode_3: { Result = '3'; }break; + case KeyCode_4: { Result = '4'; }break; + case KeyCode_5: { Result = '5'; }break; + case KeyCode_6: { Result = '6'; }break; + case KeyCode_7: { Result = '7'; }break; + case KeyCode_8: { Result = '8'; }break; + case KeyCode_9: { Result = '9'; }break; + + case KeyCode_Num0: { Result = '0'; }break; + case KeyCode_Num1: { Result = '1'; }break; + case KeyCode_Num2: { Result = '2'; }break; + case KeyCode_Num3: { Result = '3'; }break; + case KeyCode_Num4: { Result = '4'; }break; + case KeyCode_Num5: { Result = '5'; }break; + case KeyCode_Num6: { Result = '6'; }break; + case KeyCode_Num7: { Result = '7'; }break; + case KeyCode_Num8: { Result = '8'; }break; + case KeyCode_Num9: { Result = '9'; }break; + + // Symbols + case KeyCode_Bang: { Result = '!'; }break; + case KeyCode_At: { Result = '@'; }break; + case KeyCode_Pound: { Result = '#'; }break; + case KeyCode_Dollar: { Result = '$'; }break; + case KeyCode_Percent: { Result = '%'; }break; + case KeyCode_Carrot: { Result = '^'; }break; + case KeyCode_Ampersand: { Result = '&'; }break; + case KeyCode_Star: { Result = '*'; }break; + case KeyCode_LeftParen: { Result = '('; }break; + case KeyCode_RightParen: { Result = ')'; }break; + case KeyCode_Minus: { Result = '-'; }break; + case KeyCode_Plus: { Result = '+'; }break; + case KeyCode_Equals: { Result = '='; }break; + case KeyCode_Underscore: { Result = '_'; }break; + case KeyCode_LeftBrace: { Result = '['; }break; + case KeyCode_RightBrace: { Result = ']'; }break; + case KeyCode_LeftBracket: { Result = '{'; }break; + case KeyCode_RightBracket: { Result = '}'; }break; + case KeyCode_Colon: { Result = ':'; }break; + case KeyCode_SemiColon: { Result = ';'; }break; + case KeyCode_SingleQuote: { Result = '\''; }break; + case KeyCode_DoubleQuote: { Result = '"'; }break; + case KeyCode_ForwardSlash: { Result = '/'; }break; + case KeyCode_Backslash: { Result = '\\'; }break; + case KeyCode_Pipe: { Result = '|'; }break; + case KeyCode_Comma: { Result = ','; }break; + case KeyCode_Period: { Result = '.'; }break; + case KeyCode_QuestionMark: { Result = '?'; }break; + case KeyCode_LessThan: { Result = '<'; }break; + case KeyCode_GreaterThan: { Result = '>'; }break; + case KeyCode_Tilde: { Result = '~'; }break; + case KeyCode_BackQuote: { Result = '`'; }break; + } + + Assert(Result != 0); + return Result; +} + enum modifier_flags { Modifier_Shift = 1 << 0, diff --git a/gs_string.h b/src/gs_string.h similarity index 100% rename from gs_string.h rename to src/gs_string.h diff --git a/gs_vector_matrix.h b/src/gs_vector_matrix.h similarity index 100% rename from gs_vector_matrix.h rename to src/gs_vector_matrix.h diff --git a/gs_win32.cpp b/src/gs_win32.cpp similarity index 80% rename from gs_win32.cpp rename to src/gs_win32.cpp index 03c3217..e798741 100644 --- a/gs_win32.cpp +++ b/src/gs_win32.cpp @@ -300,110 +300,108 @@ LPARAM lParam return EventResult.Result; } -#define WIN32_SHOULD_TRANSLATE_TO_CHAR -1 - -static int -Win32GetKeyIndex (int Win32VirtualKey, bool NumpadValid, bool TranslateToChar) +static key_code +Win32GetKeyCode (int Win32VirtualKey, bool NumpadValid, bool TranslateToChar) { - int Result = WIN32_SHOULD_TRANSLATE_TO_CHAR; + key_code Result = KeyCode_Invalid; - if (Win32VirtualKey == VK_ESCAPE) { Result = (int)KeyCode_Esc; } + if (Win32VirtualKey == VK_ESCAPE) { Result = KeyCode_Esc; } if (!TranslateToChar) { - if (Win32VirtualKey == VK_SPACE) { Result = (int)KeyCode_Space; } + if (Win32VirtualKey == VK_SPACE) { Result = KeyCode_Space; } } - if (Win32VirtualKey == VK_CAPITAL) { Result = (int)KeyCode_CapsLock; } - else if (Win32VirtualKey == VK_TAB) { Result = (int)KeyCode_Tab; } - else if (Win32VirtualKey == VK_LSHIFT) { Result = (int)KeyCode_LeftShift; } - else if (Win32VirtualKey == VK_RSHIFT) { Result = (int)KeyCode_RightShift; } - else if (Win32VirtualKey == VK_LCONTROL) { Result = (int)KeyCode_LeftCtrl; } - else if (Win32VirtualKey == VK_RCONTROL) { Result = (int)KeyCode_RightCtrl; } + if (Win32VirtualKey == VK_CAPITAL) { Result = KeyCode_CapsLock; } + else if (Win32VirtualKey == VK_TAB) { Result = KeyCode_Tab; } + else if (Win32VirtualKey == VK_LSHIFT) { Result = KeyCode_LeftShift; } + else if (Win32VirtualKey == VK_RSHIFT) { Result = KeyCode_RightShift; } + else if (Win32VirtualKey == VK_LCONTROL) { Result = KeyCode_LeftCtrl; } + else if (Win32VirtualKey == VK_RCONTROL) { Result = KeyCode_RightCtrl; } // TODO(Peter): support the function key? - //else if (Win32VirtualKey == VK_) { Result = (int)KeyCode_Fn; } + //else if (Win32VirtualKey == VK_) { Result = KeyCode_Fn; } - else if (Win32VirtualKey == VK_MENU) { Result = (int)KeyCode_Alt; } - else if (Win32VirtualKey == VK_PRIOR) { Result = (int)KeyCode_PageUp; } - else if (Win32VirtualKey == VK_NEXT) { Result = (int)KeyCode_PageDown; } - else if (Win32VirtualKey == VK_BACK) { Result = (int)KeyCode_Backspace; } - else if (Win32VirtualKey == VK_DELETE) { Result = (int)KeyCode_Delete; } - else if (Win32VirtualKey == VK_RETURN) { Result = (int)KeyCode_Enter; } + else if (Win32VirtualKey == VK_MENU) { Result = KeyCode_Alt; } + else if (Win32VirtualKey == VK_PRIOR) { Result = KeyCode_PageUp; } + else if (Win32VirtualKey == VK_NEXT) { Result = KeyCode_PageDown; } + else if (Win32VirtualKey == VK_BACK) { Result = KeyCode_Backspace; } + else if (Win32VirtualKey == VK_DELETE) { Result = KeyCode_Delete; } + else if (Win32VirtualKey == VK_RETURN) { Result = KeyCode_Enter; } - else if (Win32VirtualKey == VK_F1) { Result = (int)KeyCode_F1; } - else if (Win32VirtualKey == VK_F2) { Result = (int)KeyCode_F2; } - else if (Win32VirtualKey == VK_F3) { Result = (int)KeyCode_F3; } - else if (Win32VirtualKey == VK_F4) { Result = (int)KeyCode_F4; } - else if (Win32VirtualKey == VK_F5) { Result = (int)KeyCode_F5; } - else if (Win32VirtualKey == VK_F6) { Result = (int)KeyCode_F6; } - else if (Win32VirtualKey == VK_F7) { Result = (int)KeyCode_F7; } - else if (Win32VirtualKey == VK_F8) { Result = (int)KeyCode_F8; } - else if (Win32VirtualKey == VK_F9) { Result = (int)KeyCode_F9; } - else if (Win32VirtualKey == VK_F10) { Result = (int)KeyCode_F10; } - else if (Win32VirtualKey == VK_F11) { Result = (int)KeyCode_F11; } - else if (Win32VirtualKey == VK_F12) { Result = (int)KeyCode_F12; } + else if (Win32VirtualKey == VK_F1) { Result = KeyCode_F1; } + else if (Win32VirtualKey == VK_F2) { Result = KeyCode_F2; } + else if (Win32VirtualKey == VK_F3) { Result = KeyCode_F3; } + else if (Win32VirtualKey == VK_F4) { Result = KeyCode_F4; } + else if (Win32VirtualKey == VK_F5) { Result = KeyCode_F5; } + else if (Win32VirtualKey == VK_F6) { Result = KeyCode_F6; } + else if (Win32VirtualKey == VK_F7) { Result = KeyCode_F7; } + else if (Win32VirtualKey == VK_F8) { Result = KeyCode_F8; } + else if (Win32VirtualKey == VK_F9) { Result = KeyCode_F9; } + else if (Win32VirtualKey == VK_F10) { Result = KeyCode_F10; } + else if (Win32VirtualKey == VK_F11) { Result = KeyCode_F11; } + else if (Win32VirtualKey == VK_F12) { Result = KeyCode_F12; } if (!TranslateToChar) { - if (Win32VirtualKey == 0x30) { Result = (int)KeyCode_0; } - else if (Win32VirtualKey == 0x31) { Result = (int)KeyCode_1; } - else if (Win32VirtualKey == 0x32) { Result = (int)KeyCode_2; } - else if (Win32VirtualKey == 0x33) { Result = (int)KeyCode_3; } - else if (Win32VirtualKey == 0x34) { Result = (int)KeyCode_4; } - else if (Win32VirtualKey == 0x35) { Result = (int)KeyCode_5; } - else if (Win32VirtualKey == 0x36) { Result = (int)KeyCode_6; } - else if (Win32VirtualKey == 0x37) { Result = (int)KeyCode_7; } - else if (Win32VirtualKey == 0x38) { Result = (int)KeyCode_8; } - else if (Win32VirtualKey == 0x39) { Result = (int)KeyCode_9; } + if (Win32VirtualKey == 0x30) { Result = KeyCode_0; } + else if (Win32VirtualKey == 0x31) { Result = KeyCode_1; } + else if (Win32VirtualKey == 0x32) { Result = KeyCode_2; } + else if (Win32VirtualKey == 0x33) { Result = KeyCode_3; } + else if (Win32VirtualKey == 0x34) { Result = KeyCode_4; } + else if (Win32VirtualKey == 0x35) { Result = KeyCode_5; } + else if (Win32VirtualKey == 0x36) { Result = KeyCode_6; } + else if (Win32VirtualKey == 0x37) { Result = KeyCode_7; } + else if (Win32VirtualKey == 0x38) { Result = KeyCode_8; } + else if (Win32VirtualKey == 0x39) { Result = KeyCode_9; } - else if (Win32VirtualKey == 0x41) { Result = (int)KeyCode_A; } - else if (Win32VirtualKey == 0x42) { Result = (int)KeyCode_B; } - else if (Win32VirtualKey == 0x43) { Result = (int)KeyCode_C; } - else if (Win32VirtualKey == 0x44) { Result = (int)KeyCode_D; } - else if (Win32VirtualKey == 0x45) { Result = (int)KeyCode_E; } - else if (Win32VirtualKey == 0x46) { Result = (int)KeyCode_F; } - else if (Win32VirtualKey == 0x47) { Result = (int)KeyCode_G; } - else if (Win32VirtualKey == 0x48) { Result = (int)KeyCode_H; } - else if (Win32VirtualKey == 0x49) { Result = (int)KeyCode_I; } - else if (Win32VirtualKey == 0x4A) { Result = (int)KeyCode_J; } - else if (Win32VirtualKey == 0x4B) { Result = (int)KeyCode_K; } - else if (Win32VirtualKey == 0x4C) { Result = (int)KeyCode_L; } - else if (Win32VirtualKey == 0x4D) { Result = (int)KeyCode_M; } - else if (Win32VirtualKey == 0x4E) { Result = (int)KeyCode_N; } - else if (Win32VirtualKey == 0x4F) { Result = (int)KeyCode_O; } - else if (Win32VirtualKey == 0x50) { Result = (int)KeyCode_P; } - else if (Win32VirtualKey == 0x51) { Result = (int)KeyCode_Q; } - else if (Win32VirtualKey == 0x52) { Result = (int)KeyCode_R; } - else if (Win32VirtualKey == 0x53) { Result = (int)KeyCode_S; } - else if (Win32VirtualKey == 0x54) { Result = (int)KeyCode_T; } - else if (Win32VirtualKey == 0x55) { Result = (int)KeyCode_U; } - else if (Win32VirtualKey == 0x56) { Result = (int)KeyCode_V; } - else if (Win32VirtualKey == 0x57) { Result = (int)KeyCode_W; } - else if (Win32VirtualKey == 0x58) { Result = (int)KeyCode_X; } - else if (Win32VirtualKey == 0x59) { Result = (int)KeyCode_Y; } - else if (Win32VirtualKey == 0x5A) { Result = (int)KeyCode_Z; } + else if (Win32VirtualKey == 0x41) { Result = KeyCode_A; } + else if (Win32VirtualKey == 0x42) { Result = KeyCode_B; } + else if (Win32VirtualKey == 0x43) { Result = KeyCode_C; } + else if (Win32VirtualKey == 0x44) { Result = KeyCode_D; } + else if (Win32VirtualKey == 0x45) { Result = KeyCode_E; } + else if (Win32VirtualKey == 0x46) { Result = KeyCode_F; } + else if (Win32VirtualKey == 0x47) { Result = KeyCode_G; } + else if (Win32VirtualKey == 0x48) { Result = KeyCode_H; } + else if (Win32VirtualKey == 0x49) { Result = KeyCode_I; } + else if (Win32VirtualKey == 0x4A) { Result = KeyCode_J; } + else if (Win32VirtualKey == 0x4B) { Result = KeyCode_K; } + else if (Win32VirtualKey == 0x4C) { Result = KeyCode_L; } + else if (Win32VirtualKey == 0x4D) { Result = KeyCode_M; } + else if (Win32VirtualKey == 0x4E) { Result = KeyCode_N; } + else if (Win32VirtualKey == 0x4F) { Result = KeyCode_O; } + else if (Win32VirtualKey == 0x50) { Result = KeyCode_P; } + else if (Win32VirtualKey == 0x51) { Result = KeyCode_Q; } + else if (Win32VirtualKey == 0x52) { Result = KeyCode_R; } + else if (Win32VirtualKey == 0x53) { Result = KeyCode_S; } + else if (Win32VirtualKey == 0x54) { Result = KeyCode_T; } + else if (Win32VirtualKey == 0x55) { Result = KeyCode_U; } + else if (Win32VirtualKey == 0x56) { Result = KeyCode_V; } + else if (Win32VirtualKey == 0x57) { Result = KeyCode_W; } + else if (Win32VirtualKey == 0x58) { Result = KeyCode_X; } + else if (Win32VirtualKey == 0x59) { Result = KeyCode_Y; } + else if (Win32VirtualKey == 0x5A) { Result = KeyCode_Z; } } if (NumpadValid) { - if (Win32VirtualKey == VK_NUMPAD0) { Result = (int)KeyCode_Num0; } - else if (Win32VirtualKey == VK_NUMPAD1) { Result = (int)KeyCode_Num1; } - else if (Win32VirtualKey == VK_NUMPAD2) { Result = (int)KeyCode_Num2; } - else if (Win32VirtualKey == VK_NUMPAD3) { Result = (int)KeyCode_Num3; } - else if (Win32VirtualKey == VK_NUMPAD4) { Result = (int)KeyCode_Num4; } - else if (Win32VirtualKey == VK_NUMPAD5) { Result = (int)KeyCode_Num5; } - else if (Win32VirtualKey == VK_NUMPAD6) { Result = (int)KeyCode_Num6; } - else if (Win32VirtualKey == VK_NUMPAD7) { Result = (int)KeyCode_Num7; } - else if (Win32VirtualKey == VK_NUMPAD8) { Result = (int)KeyCode_Num8; } - else if (Win32VirtualKey == VK_NUMPAD9) { Result = (int)KeyCode_Num9; } + if (Win32VirtualKey == VK_NUMPAD0) { Result = KeyCode_Num0; } + else if (Win32VirtualKey == VK_NUMPAD1) { Result = KeyCode_Num1; } + else if (Win32VirtualKey == VK_NUMPAD2) { Result = KeyCode_Num2; } + else if (Win32VirtualKey == VK_NUMPAD3) { Result = KeyCode_Num3; } + else if (Win32VirtualKey == VK_NUMPAD4) { Result = KeyCode_Num4; } + else if (Win32VirtualKey == VK_NUMPAD5) { Result = KeyCode_Num5; } + else if (Win32VirtualKey == VK_NUMPAD6) { Result = KeyCode_Num6; } + else if (Win32VirtualKey == VK_NUMPAD7) { Result = KeyCode_Num7; } + else if (Win32VirtualKey == VK_NUMPAD8) { Result = KeyCode_Num8; } + else if (Win32VirtualKey == VK_NUMPAD9) { Result = KeyCode_Num9; } } - if (Win32VirtualKey == VK_UP) { Result = (int)KeyCode_UpArrow; } - else if (Win32VirtualKey == VK_DOWN) { Result = (int)KeyCode_DownArrow; } - else if (Win32VirtualKey == VK_LEFT) { Result = (int)KeyCode_LeftArrow; } - else if (Win32VirtualKey == VK_RIGHT) { Result = (int)KeyCode_RightArrow; } + if (Win32VirtualKey == VK_UP) { Result = KeyCode_UpArrow; } + else if (Win32VirtualKey == VK_DOWN) { Result = KeyCode_DownArrow; } + else if (Win32VirtualKey == VK_LEFT) { Result = KeyCode_LeftArrow; } + else if (Win32VirtualKey == VK_RIGHT) { Result = KeyCode_RightArrow; } return Result; } @@ -474,7 +472,7 @@ MSG Message) { int VirtualKey = (int)Message.wParam; bool KeyDown = (Message.lParam & (1 << 31)) == 0; - int KeyIndex = Win32GetKeyIndex(VirtualKey, true, true); + int KeyIndex = Win32GetKeyCode(VirtualKey, true, true); /* if (KeyIndex >= 0) { diff --git a/gs_win32.h b/src/gs_win32.h similarity index 100% rename from gs_win32.h rename to src/gs_win32.h diff --git a/interface.h b/src/interface.h similarity index 88% rename from interface.h rename to src/interface.h index 45393f3..dfc3218 100644 --- a/interface.h +++ b/src/interface.h @@ -1,3 +1,17 @@ +struct gui_mouse +{ + v2 Pos; + v2 OldPos; + v2 DeltaPos; + v2 DownPos; + b32 LeftButtonTransitionedDown; + b32 LeftButtonTransitionedUp; + b32 MiddleButtonTransitionedDown; + b32 MiddleButtonTransitionedUp; + b32 RightButtonTransitionedDown; + b32 RightButtonTransitionedUp; +}; + internal v2 DrawCharacter (render_quad_batch_constructor* BatchConstructor, char C, bitmap_font Font, v2 Position, v4 Color, r32 FontScale) { @@ -115,7 +129,7 @@ internal button_result EvaluateButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, v2 Margin, string Label, v4 IdleBGColor, v4 HotBGColor, v4 IdleTextColor, v4 HotTextColor, - bitmap_font* Font, input Input) + bitmap_font* Font, gui_mouse Mouse) { button_result Result = {}; Result.Pressed = false; @@ -123,10 +137,9 @@ EvaluateButton (render_command_buffer* RenderBuffer, v4 BGColor = IdleBGColor; v4 TextColor = IdleTextColor; - v2 MousePos = v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}; - if (PointIsInRange(MousePos, Min, Max)) + if (PointIsInRange(Mouse.Pos, Min, Max)) { - if (KeyTransitionedDown(Input, KeyCode_MouseLeftButton)) + if (Mouse.LeftButtonTransitionedDown) { Result.Pressed = true; } @@ -145,18 +158,18 @@ EvaluateButton (render_command_buffer* RenderBuffer, } internal button_result -EvaluateButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, interface_config Config, input Input) +EvaluateButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, interface_config Config, gui_mouse Mouse) { button_result Result = EvaluateButton(RenderBuffer, Min, Max, Config.Margin, Label, Config.ButtonColor_Inactive, Config.ButtonColor_Active, Config.TextColor, Config.TextColor, - Config.Font, Input); + Config.Font, Mouse); return Result; } internal button_result -EvaluateSelectableButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, interface_config Config, input Input, b32 Selected) +EvaluateSelectableButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, interface_config Config, gui_mouse Mouse, b32 Selected) { v4 BGColor = Config.ButtonColor_Inactive; if (Selected) @@ -168,7 +181,7 @@ EvaluateSelectableButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, s Min, Max, Config.Margin, Label, Config.ButtonColor_Inactive, Config.ButtonColor_Active, Config.TextColor, Config.TextColor, - Config.Font, Input); + Config.Font, Mouse); return Result; } @@ -182,7 +195,7 @@ struct multi_option_label_result internal multi_option_label_result EvaluateMultiOptionLabel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, string Options[], - interface_config Config, input Input) + interface_config Config, gui_mouse Mouse) { multi_option_label_result Result = {}; Result.Pressed = false; @@ -196,7 +209,7 @@ EvaluateMultiOptionLabel (render_command_buffer* RenderBuffer, for (s32 b = 0; b < sizeof(Options) / sizeof(Options[0]); b++) { button_result Button = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - Options[b], Config, Input); + Options[b], Config, Mouse); if (Button.Pressed) { Result.Pressed = true; @@ -212,7 +225,7 @@ EvaluateMultiOptionLabel (render_command_buffer* RenderBuffer, // to one of its options internal multi_option_label_result EvaluateMultiOptionButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Text, string Options[], b32 Selected, - interface_config Config, input Input) + interface_config Config, gui_mouse Mouse) { multi_option_label_result Result = {}; Result.Pressed = false; @@ -224,7 +237,7 @@ EvaluateMultiOptionButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, v2 FirstButtonPos = Max - ((ButtonDim + Config.Margin) * OptionsCount); v2 NewMax = v2{FirstButtonPos.x - Config.Margin.x, Max.y}; - button_result MainButton = EvaluateSelectableButton(RenderBuffer, Min, NewMax, Text, Config, Input, Selected); + button_result MainButton = EvaluateSelectableButton(RenderBuffer, Min, NewMax, Text, Config, Mouse, Selected); if (MainButton.Pressed) { Result.Pressed = true; @@ -236,7 +249,7 @@ EvaluateMultiOptionButton (render_command_buffer* RenderBuffer, v2 Min, v2 Max, for (s32 b = 0; b < OptionsCount; b++) { button_result Button = EvaluateButton(RenderBuffer, ButtonPos, ButtonPos + ButtonDim, - Options[b], Config, Input); + Options[b], Config, Mouse); if (Button.Pressed) { Result.Pressed = true; @@ -255,7 +268,7 @@ struct slider_result }; internal slider_result -EvaluateSlider (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, r32 Percent, interface_config Config, input Input) +EvaluateSlider (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, r32 Percent, interface_config Config, gui_mouse Mouse) { slider_result Result = {}; @@ -264,18 +277,16 @@ EvaluateSlider (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Labe r32 DisplayPercent = Percent; - v2 MousePos = v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}; - if (PointIsInRange(MousePos, Min, Max)) + if (PointIsInRange(Mouse.Pos, Min, Max)) { BGColor = Config.ButtonColor_Active; } - if (KeyDown(Input, KeyCode_MouseLeftButton)) + if (Mouse.LeftButtonTransitionedDown) { - v2 MouseDownPos = v2{(r32)Input.MouseDownX, (r32)Input.MouseDownY}; - if (PointIsInRange(MouseDownPos, Min, Max)) + if (PointIsInRange(Mouse.DownPos, Min, Max)) { - r32 TempFillPercent = (MousePos.y - Min.y) / (Max.y - Min.y); + r32 TempFillPercent = (Mouse.Pos.y - Min.y) / (Max.y - Min.y); DisplayPercent = GSClamp(0.0f, TempFillPercent, 1.0f); } @@ -304,7 +315,7 @@ struct panel_result }; internal panel_result -EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, s32 Depth, interface_config Config, input Input) +EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, s32 Depth, interface_config Config) { panel_result Result = {}; @@ -320,9 +331,9 @@ EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, s32 Depth, i } internal panel_result -EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, s32 Depth, interface_config Config, input Input) +EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label, s32 Depth, interface_config Config) { - panel_result Result = EvaluatePanel(RenderBuffer, Min, Max, Depth, Config, Input); + panel_result Result = EvaluatePanel(RenderBuffer, Min, Max, Depth, Config); v2 TextPos = v2{ Min.x + Config.Margin.x, @@ -335,11 +346,11 @@ EvaluatePanel (render_command_buffer* RenderBuffer, v2 Min, v2 Max, string Label } internal panel_result -EvaluatePanel(render_command_buffer* RenderBuffer, panel_result* ParentPanel, r32 Height, string Title, interface_config Config, input Input) +EvaluatePanel(render_command_buffer* RenderBuffer, panel_result* ParentPanel, r32 Height, string Title, interface_config Config) { v2 Min = v2{ParentPanel->ChildMin.x, ParentPanel->ChildMax.y - Height}; v2 Max = ParentPanel->ChildMax; - panel_result Result = EvaluatePanel(RenderBuffer, Min, Max, Title, ParentPanel->Depth + 1, Config, Input); + panel_result Result = EvaluatePanel(RenderBuffer, Min, Max, Title, ParentPanel->Depth + 1, Config); ParentPanel->ChildMax.y = Min.y - Config.Margin.y; @@ -363,7 +374,7 @@ struct scroll_list_result internal scroll_list_result DrawOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, string* Options, s32 OptionsCount, - s32 Start, interface_config Config, input Input) + s32 Start, interface_config Config, gui_mouse Mouse) { scroll_list_result Result = {}; Result.IndexSelected = -1; @@ -384,7 +395,7 @@ DrawOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, { button_result Button = EvaluateButton(RenderBuffer, ButtonMin, ButtonMax, *OptionCursor, - Config, Input); + Config, Mouse); if (Button.Pressed) { Result.IndexSelected = Start + i; @@ -399,10 +410,10 @@ DrawOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, string DownArrowString = MakeStringLiteral(" v "); string UpArrowString = MakeStringLiteral(" ^ "); button_result Down = EvaluateButton(RenderBuffer, Min, v2{Min.x + HalfWidthWithMargin, Min.y + OptionHeight}, - DownArrowString, Config, Input); + DownArrowString, Config, Mouse); button_result Up = EvaluateButton(RenderBuffer, v2{Min.x + HalfWidthWithMargin + Config.Margin.x, Min.y}, v2{Max.x, Min.y + OptionHeight}, - UpArrowString, Config, Input); + UpArrowString, Config, Mouse); if (Down.Pressed) { Result.StartIndex += 1; @@ -420,7 +431,7 @@ DrawOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, internal scroll_list_result DrawSelectableOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, string* Options, s32 OptionsCount, - s32 Start, s32 Selected, interface_config Config, input Input) + s32 Start, s32 Selected, interface_config Config, gui_mouse Mouse) { scroll_list_result Result = {}; Result.IndexSelected = Selected; @@ -443,7 +454,7 @@ DrawSelectableOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, { button_result Button = EvaluateSelectableButton(RenderBuffer, ButtonMin, ButtonMax, *OptionCursor, - Config, Input, (Selected == Start + i)); + Config, Mouse, (Selected == Start + i)); if (Button.Pressed) { s32 SelectedIndex = Start + i; @@ -469,10 +480,10 @@ DrawSelectableOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, string DownArrowString = MakeStringLiteral(" v "); string UpArrowString = MakeStringLiteral(" ^ "); button_result Down = EvaluateButton(RenderBuffer, Min, v2{Min.x + HalfWidthWithMargin, Min.y + OptionHeight}, - DownArrowString, Config, Input); + DownArrowString, Config, Mouse); button_result Up = EvaluateButton(RenderBuffer, v2{Min.x + HalfWidthWithMargin + Config.Margin.x, Min.y}, v2{Max.x, Min.y + OptionHeight}, - UpArrowString, Config, Input); + UpArrowString, Config, Mouse); if (Down.Pressed) { Result.StartIndex += 1; @@ -488,7 +499,7 @@ DrawSelectableOptionsList(render_command_buffer* RenderBuffer, v2 Min, v2 Max, } internal r32 -EvaluateColorChannelSlider (render_command_buffer* RenderBuffer, v4 ChannelMask, v2 Min, v2 Max, r32 Current, input Input) +EvaluateColorChannelSlider (render_command_buffer* RenderBuffer, v4 ChannelMask, v2 Min, v2 Max, r32 Current, gui_mouse Mouse) { r32 Result = Current; @@ -502,12 +513,11 @@ EvaluateColorChannelSlider (render_command_buffer* RenderBuffer, v4 ChannelMask, v2{0, 0}, v2{1, 0}, v2{1, 1}, v2{0, 1}, LeftColor, RightColor, RightColor, LeftColor); - if (KeyDown(Input, KeyCode_MouseLeftButton)) + if (Mouse.LeftButtonTransitionedDown) { - v2 MouseDownPos = v2{(r32)Input.MouseDownX, (r32)Input.MouseDownY}; - if (PointIsInRange(MouseDownPos, Min, Max)) + if (PointIsInRange(Mouse.DownPos, Min, Max)) { - Result = ((r32)Input.New->MouseX - Min.x) / (Max.x - Min.x); + Result = ((r32)Mouse.Pos.x - Min.x) / (Max.x - Min.x); Result = GSClamp01(Result); } } @@ -522,13 +532,12 @@ EvaluateColorChannelSlider (render_command_buffer* RenderBuffer, v4 ChannelMask, } internal b32 -EvaluateColorPicker (render_command_buffer* RenderBuffer, v4* Value, v2 PanelMin, interface_config Config, input Input) +EvaluateColorPicker (render_command_buffer* RenderBuffer, v4* Value, v2 PanelMin, interface_config Config, gui_mouse Mouse) { b32 ShouldClose = false; v2 PanelMax = v2{400, 500}; - if (KeyTransitionedDown(Input, KeyCode_MouseLeftButton) && - !PointIsInRange(v2{(r32)Input.New->MouseX, (r32)Input.New->MouseY}, PanelMin, PanelMax)) + if (Mouse.LeftButtonTransitionedDown && !PointIsInRange(Mouse.Pos, PanelMin, PanelMax)) { ShouldClose = true; } @@ -543,13 +552,13 @@ EvaluateColorPicker (render_command_buffer* RenderBuffer, v4* Value, v2 PanelMin v2 SliderDim = v2{(PanelMax.x - PanelMin.x) - 20, 32}; // channel sliders v2 SliderMin = TitleMin - v2{0, SliderDim.y + 10}; - Value->r = EvaluateColorChannelSlider(RenderBuffer, RedV4, SliderMin, SliderMin + SliderDim, Value->r, Input); + Value->r = EvaluateColorChannelSlider(RenderBuffer, RedV4, SliderMin, SliderMin + SliderDim, Value->r, Mouse); SliderMin.y -= SliderDim.y + 10; - Value->g = EvaluateColorChannelSlider(RenderBuffer, GreenV4, SliderMin, SliderMin + SliderDim, Value->g, Input); + Value->g = EvaluateColorChannelSlider(RenderBuffer, GreenV4, SliderMin, SliderMin + SliderDim, Value->g, Mouse); SliderMin.y -= SliderDim.y + 10; - Value->b = EvaluateColorChannelSlider(RenderBuffer, BlueV4, SliderMin, SliderMin + SliderDim, Value->b, Input); + Value->b = EvaluateColorChannelSlider(RenderBuffer, BlueV4, SliderMin, SliderMin + SliderDim, Value->b, Mouse); SliderMin.y -= SliderDim.y + 10; - Value->a = EvaluateColorChannelSlider(RenderBuffer, WhiteV4, SliderMin, SliderMin + SliderDim, Value->a, Input); + Value->a = EvaluateColorChannelSlider(RenderBuffer, WhiteV4, SliderMin, SliderMin + SliderDim, Value->a, Mouse); // Output Color Display SliderMin.y -= 100; @@ -572,7 +581,7 @@ internal search_lister_result EvaluateSearchLister (render_command_buffer* RenderBuffer, v2 TopLeft, v2 Dimension, string Title, s32 ListLength, u8* ListMemory, s32 HotItem, search_lister_get_list_item_at_offset* GetListItem, string* SearchString, s32 SearchStringCursorPosition, - bitmap_font* Font, interface_config Config, input Input) + bitmap_font* Font, interface_config Config, gui_mouse Mouse) { Assert(GetListItem != 0); @@ -611,7 +620,7 @@ EvaluateSearchLister (render_command_buffer* RenderBuffer, v2 TopLeft, v2 Dimens button_result Button = EvaluateButton(RenderBuffer, Min, Max, Config.Margin, ListItemString, ButtonColor, ButtonColor, Config.TextColor, Config.TextColor, - Config.Font, Input); + Config.Font, Mouse); if (Button.Pressed) { Result.SelectedItem = i; diff --git a/kraftwerks_patterns.h b/src/kraftwerks_patterns.h similarity index 100% rename from kraftwerks_patterns.h rename to src/kraftwerks_patterns.h diff --git a/sse_mathfun.h b/src/sse_mathfun.h similarity index 100% rename from sse_mathfun.h rename to src/sse_mathfun.h diff --git a/sse_mathfun_extension.h b/src/sse_mathfun_extension.h similarity index 100% rename from sse_mathfun_extension.h rename to src/sse_mathfun_extension.h diff --git a/test_patterns.h b/src/test_patterns.h similarity index 100% rename from test_patterns.h rename to src/test_patterns.h diff --git a/testmain.cpp b/src/testmain.cpp similarity index 100% rename from testmain.cpp rename to src/testmain.cpp diff --git a/src/todo.txt b/src/todo.txt new file mode 100644 index 0000000..8ed6f9a --- /dev/null +++ b/src/todo.txt @@ -0,0 +1,78 @@ +TODO FOLDHAUS + +Hardening +- memory visualization +- separate rendering thread +- cache led positions. Only update if they are moving +- input context changes +- - shift drag to 10x drag speed +- select nodes -> delete nodes +- remove node connections + +Name +- Splash screen (like blender) (thisll be fun) +- - Image importer (stb image? or find a png > bmp converter for the image you have) +- - Display on startup + +/Debug +x Make debug scope tracking thread safe - was throwing an error in stringsequal but that stopped. +x Keep an eye out. + +Application +- More efficient HSV <-> RGB + +- Save and load a session +- - Serialize Nodes +- Don't render if the window isn't visible + +Development +- Fix your scope time tracker to account for threads. +- Nest scope times so you can see totals/dig in +- Log memory allocations + +Interface +- fullscreen +- In world interface elements +- - Handles for Patterns +- - UI Popups +- - Value modifiers +- Scroll view +- Update the text system - use system fonts + +Switch To Nodes +x basic node elements +- - evaluation step (one node at a time) +- - selector node (has a list of connections that it can switch between) +- serialize +- delete nodes + +Structure +- motion + +Renderer +- Mouse Picking - point at a led and see info about it +- Camera: pan +- Camera: zoom +- Camera: leds always face camera + +Resource Management +- TODO: Need to figure out which textures are currently in graphics memory and which need to be resubmitted +- Icons + +Animation +- timeline +- create clips that play +- clips can have parameters that drive them? +- clips should have prerequesites +- - channels active +- - patterns active in the channel +- - when a clip is playing, it should just take over the whole structure + +Command Line +- select a channel/pattern + +Optimization +- patterns are asking to be multithreaded +- probably want to convert as much color functions to use u32 Packed Colors +- - Probably want to think about this more. What about supporting different color depths +- for different output devices? \ No newline at end of file diff --git a/win32_foldhaus.cpp b/src/win32_foldhaus.cpp similarity index 88% rename from win32_foldhaus.cpp rename to src/win32_foldhaus.cpp index 0b66267..dc674ab 100644 --- a/win32_foldhaus.cpp +++ b/src/win32_foldhaus.cpp @@ -277,10 +277,6 @@ GET_FONT_INFO(Win32GetFontInfo) return Result; } -/* -u8* DestBuffer, s32 DestBufferWidth, s32 DestBufferHeight, u32 XOffset, u32 YOffset, char Codepoint, platform_font_info FontInfo, u32* OutWidth, u32* OutHeight -*/ - DRAW_FONT_CODEPOINT(Win32DrawFontCodepoint) { SIZE CodepointSize = {}; @@ -368,23 +364,50 @@ HandleWindowEvents (HWND WindowHandle, UINT Msg, WPARAM WParam, LPARAM LParam) } internal void -HandleWindowMessage (MSG Message, window* Window, input_frame* InputFrame) +HandleWindowMessage (MSG Message, window* Window, input_queue* InputQueue, mouse_state* Mouse) { switch (Message.message) { case WM_MOUSEWHEEL: { - Win32UpdateInputFrameMouseWheelDelta(InputFrame, Message); + Mouse->Scroll = GET_WHEEL_DELTA_WPARAM(Message.wParam); }break; case WM_LBUTTONDOWN: - case WM_LBUTTONUP: + { + AddInputEventEntry(InputQueue, KeyCode_MouseLeftButton, false, true, + false, false, false, false); + Mouse->DownPos = Mouse->Pos; + }break; + case WM_MBUTTONDOWN: - case WM_MBUTTONUP: + { + AddInputEventEntry(InputQueue, KeyCode_MouseMiddleButton, false, true, + false, false, false, false); + }break; + case WM_RBUTTONDOWN: + { + AddInputEventEntry(InputQueue, KeyCode_MouseRightButton, false, true, + false, false, false, false); + }break; + + case WM_LBUTTONUP: + { + AddInputEventEntry(InputQueue, KeyCode_MouseLeftButton, true, false, + false, false, false, false); + }break; + + case WM_MBUTTONUP: + { + AddInputEventEntry(InputQueue, KeyCode_MouseMiddleButton, true, false, + false, false, false, false); + }break; + case WM_RBUTTONUP: { - Win32UpdateInputFrameMouseState(InputFrame); + AddInputEventEntry(InputQueue, KeyCode_MouseRightButton, true, false, + false, false, false, false); }break; case WM_SYSKEYDOWN: @@ -393,26 +416,15 @@ HandleWindowMessage (MSG Message, window* Window, input_frame* InputFrame) case WM_KEYUP: { int VirtualKey = (int)Message.wParam; - bool KeyDown = (Message.lParam & (1 << 31)) == 0; - int KeyIndex = Win32GetKeyIndex(VirtualKey, true, true); - if (KeyIndex == WIN32_SHOULD_TRANSLATE_TO_CHAR) - { - KeyIndex = Win32GetKeyIndex(VirtualKey, true, false); - InputFrame->KeysDown[KeyIndex] = KeyDown; - - TranslateMessage(&Message); - DispatchMessage(&Message); - } - else - { - InputFrame->KeysDown[KeyIndex] = KeyDown; - } - }break; - - case WM_CHAR: - { - char Char = (char)Message.wParam; - InputFrame->StringInput[InputFrame->StringInputUsed++] = Char; + key_code Key = Win32GetKeyCode(VirtualKey, true, false); + s32 KeyIndex = (int)Key; + + b32 KeyWasDown = (Message.lParam & (1 << 30)) != 0; + b32 KeyIsDown = (Message.lParam & (1 << 31)) == 0; + + // New Input Queue + // TODO(Peter): Come back and add state tracking for the modifier keys + AddInputEventEntry(InputQueue, Key, KeyWasDown, KeyIsDown, false, false, false, false); }break; default: @@ -480,8 +492,15 @@ INT NCmdShow InitDebugServices(GlobalDebugServices, (u8*)malloc(Megabytes(8)), Megabytes(8), 1000, PerformanceCountFrequency); GlobalDebugServices->GetWallClock = GetWallClock; - input Input; - InitializeInput(&Input); + mouse_state Mouse; + input_queue InputQueue; + { + s32 InputQueueMemorySize = sizeof(input_entry) * 32; + u8* InputQueueMemory = Win32Alloc(InputQueueMemorySize).Base; + InputQueue = InitializeInputQueue(InputQueueMemory, InputQueueMemorySize); + + Mouse = {0, 0}; + } // // Set up worker threads @@ -557,31 +576,28 @@ INT NCmdShow { DEBUG_TRACK_SCOPE(MainLoop); - SwapInputBuffers(&Input); + ResetInputQueue(&InputQueue); if (HotLoadDLL(&DLLRefresh)) { SetApplicationLinks(&Context, DLLRefresh, &WorkQueue); Context.ReloadStaticData(Context, GlobalDebugServices); } - MSG Message; - while (PeekMessageA(&Message, MainWindow.Handle, 0, 0, PM_REMOVE)) - { - HandleWindowMessage(Message, &MainWindow, Input.New); - } - { // Mouse Position POINT MousePos; GetCursorPos (&MousePos); ScreenToClient(MainWindow.Handle, &MousePos); - Input.New->MouseX = MousePos.x; - Input.New->MouseY = MainWindow.Height - MousePos.y; - if (KeyTransitionedDown(Input, KeyCode_MouseLeftButton)) - { - Input.MouseDownX = Input.New->MouseX; - Input.MouseDownY = Input.New->MouseY; - } + Mouse.Scroll = 0; + Mouse.OldPos = Mouse.Pos; + Mouse.Pos = v2{(r32)MousePos.x, (r32)MainWindow.Height - MousePos.y}; + Mouse.DeltaPos = Mouse.Pos - Mouse.OldPos; + } + + MSG Message; + while (PeekMessageA(&Message, MainWindow.Handle, 0, 0, PM_REMOVE)) + { + HandleWindowMessage(Message, &MainWindow, &InputQueue, &Mouse); } // TODO(Peter): We shouldn't need to do this translation. the platform layer knows about win32_windows. We should just make that the interface @@ -590,7 +606,7 @@ INT NCmdShow Context.WindowHeight = MainWindow.Height; Context.DeltaTime = LastFrameSecondsElapsed; - Context.UpdateAndRender(Context, Input, &RenderBuffer); + Context.UpdateAndRender(Context, InputQueue, Mouse, &RenderBuffer); RenderCommandBuffer(RenderBuffer); ClearRenderBuffer(&RenderBuffer); diff --git a/todo.txt b/todo.txt index ad1bef3..e69de29 100644 --- a/todo.txt +++ b/todo.txt @@ -1,79 +0,0 @@ -TODO FOLDHAUS - -Hardening -- more robust windows input layer -- memory visualization -- separate rendering thread -- cache led positions. Only update if they are moving -- input context changes -- - shift drag to 10x drag speed -- select nodes -> delete nodes -- remove node connections - -Name -- Splash screen (like blender) (thisll be fun) -- - Image importer (stb image? or find a png > bmp converter for the image you have) -- - Display on startup - -/Debug -x Make debug scope tracking thread safe - was throwing an error in stringsequal but that stopped. -x Keep an eye out. - -Application -- More efficient HSV <-> RGB - -- Save and load a session -- - Serialize Nodes -- Don't render if the window isn't visible - -Development -- Fix your scope time tracker to account for threads. -- Nest scope times so you can see totals/dig in -- Log memory allocations - -Interface -- fullscreen -- In world interface elements -- - Handles for Patterns -- - UI Popups -- - Value modifiers -- Scroll view -- Update the text system - use system fonts - -Switch To Nodes -x basic node elements -- - evaluation step (one node at a time) -- - selector node (has a list of connections that it can switch between) -- serialize -- delete nodes - -Structure -- motion - -Renderer -- Mouse Picking - point at a led and see info about it -- Camera: pan -- Camera: zoom -- Camera: leds always face camera - -Resource Management -- TODO: Need to figure out which textures are currently in graphics memory and which need to be resubmitted -- Icons - -Animation -- timeline -- create clips that play -- clips can have parameters that drive them? -- clips should have prerequesites -- - channels active -- - patterns active in the channel -- - when a clip is playing, it should just take over the whole structure - -Command Line -- select a channel/pattern - -Optimization -- patterns are asking to be multithreaded -- probably want to convert as much color functions to use u32 Packed Colors -- - Probably want to think about this more. What about supporting different color depths -- for different output devices? \ No newline at end of file diff --git a/vc140.pdb b/vc140.pdb new file mode 100644 index 0000000..18bd3c1 Binary files /dev/null and b/vc140.pdb differ diff --git a/working_data/splash.afdesign b/working_data/splash.afdesign new file mode 100644 index 0000000..19258f2 Binary files /dev/null and b/working_data/splash.afdesign differ diff --git a/working_data/splash.png b/working_data/splash.png new file mode 100644 index 0000000..02bb10a Binary files /dev/null and b/working_data/splash.png differ