From 92c06c97d90dec7477aa0198cb73e4bafb6d35e8 Mon Sep 17 00:00:00 2001 From: Mark Slee Date: Tue, 20 Aug 2013 01:10:17 -0700 Subject: [PATCH] The BassBox is now in the model, and pushed to the real car location --- SugarCubes.pde | 1 + TestPatterns.pde | 6 ++---- _Internals.pde | 35 +++++++++++++++++++++++++++-------- _Mappings.pde | 25 ++++++++++++++----------- code/GLucose.jar | Bin 19604 -> 22320 bytes 5 files changed, 44 insertions(+), 23 deletions(-) diff --git a/SugarCubes.pde b/SugarCubes.pde index 5d257ca..db21414 100644 --- a/SugarCubes.pde +++ b/SugarCubes.pde @@ -29,6 +29,7 @@ LXPattern[] patterns(GLucose glucose) { new AskewPlanes(glucose), new Swarm(glucose), new SpaceTime(glucose), + new HelixPattern(glucose), new Pong(glucose), new Noise(glucose), new Blinders(glucose), diff --git a/TestPatterns.pde b/TestPatterns.pde index 14572a2..7ba68e9 100644 --- a/TestPatterns.pde +++ b/TestPatterns.pde @@ -343,15 +343,13 @@ class MappingTool extends TestPattern { } public void incStrip() { - int stripsPerCube = Cube.FACES_PER_CUBE * Face.STRIPS_PER_FACE; - stripIndex = (stripIndex + 1) % stripsPerCube; + stripIndex = (stripIndex + 1) % Cube.STRIPS_PER_CUBE; } public void decStrip() { - int stripsPerCube = Cube.FACES_PER_CUBE * Face.STRIPS_PER_FACE; --stripIndex; if (stripIndex < 0) { - stripIndex += stripsPerCube; + stripIndex += Cube.STRIPS_PER_CUBE; } } diff --git a/_Internals.pde b/_Internals.pde index 1b32abd..9f75baf 100644 --- a/_Internals.pde +++ b/_Internals.pde @@ -34,16 +34,11 @@ import rwmidi.*; final int VIEWPORT_WIDTH = 900; final int VIEWPORT_HEIGHT = 700; +// The trailer is measured from the outside of the black metal (but not including the higher welded part on the front) final float TRAILER_WIDTH = 240; final float TRAILER_DEPTH = 97; final float TRAILER_HEIGHT = 33; -final float BASS_WIDTH = 124; -final float BASS_HEIGHT = 31.5; -final float BASS_DEPTH = 66; -final float BASS_X = (TRAILER_WIDTH - BASS_WIDTH) / 2.; -final float BASS_Z = (TRAILER_DEPTH - BASS_DEPTH) / 2.; - int targetFramerate = 60; int startMillis, lastMillis; @@ -182,7 +177,7 @@ void draw() { noStroke(); fill(#393939); - drawBox(BASS_X, 0, BASS_Z, 0, 0, 0, BASS_WIDTH, BASS_HEIGHT, BASS_DEPTH, Cube.CHANNEL_WIDTH); + drawBassBox(glucose.model.bassBox); for (Cube c : glucose.model.cubes) { drawCube(c); } @@ -193,7 +188,6 @@ void draw() { for (Point p : glucose.model.points) { stroke(colors[p.index]); vertex(p.fx, p.fy, p.fz); - // println(p.fx + ":" + p.fy + ":" + p.fz); } endShape(); @@ -215,6 +209,31 @@ void draw() { } } +void drawBassBox(BassBox b) { + float in = .15; + drawBox(b.x+in, b.y+in, b.z+in, 0, 0, 0, BassBox.EDGE_WIDTH-in*2, BassBox.EDGE_HEIGHT-in*2, BassBox.EDGE_DEPTH-in*2, Cube.CHANNEL_WIDTH-in); + + pushMatrix(); + translate(b.x + (Cube.CHANNEL_WIDTH-in)/2., b.y + BassBox.EDGE_HEIGHT/2., b.z + in); + for (int j = 0; j < 2; ++j) { + pushMatrix(); + for (int i = 0; i < BassBox.NUM_FRONT_STRUTS; ++i) { + translate(BassBox.FRONT_STRUT_SPACING, 0, 0); + box(Cube.CHANNEL_WIDTH-in, BassBox.EDGE_HEIGHT - in*2, 0); + } + popMatrix(); + translate(0, 0, BassBox.EDGE_DEPTH - 2*in); + } + popMatrix(); + + pushMatrix(); + translate(b.x + in, b.y + BassBox.EDGE_HEIGHT/2., b.z + BassBox.SIDE_STRUT_SPACING + (Cube.CHANNEL_WIDTH-in)/2.); + box(0, BassBox.EDGE_HEIGHT - in*2, Cube.CHANNEL_WIDTH-in); + translate(BassBox.EDGE_WIDTH-2*in, 0, 0); + box(0, BassBox.EDGE_HEIGHT - in*2, Cube.CHANNEL_WIDTH-in); + popMatrix(); +} + void drawCube(Cube c) { float in = .15; drawBox(c.x+in, c.y+in, c.z+in, c.rx, c.ry, c.rz, Cube.EDGE_WIDTH-in*2, Cube.EDGE_HEIGHT-in*2, Cube.EDGE_WIDTH-in*2, Cube.CHANNEL_WIDTH-in); diff --git a/_Mappings.pde b/_Mappings.pde index 967048f..133a621 100644 --- a/_Mappings.pde +++ b/_Mappings.pde @@ -41,9 +41,10 @@ public Model buildModel() { final float STACKED_RELATIVE = 1; final float STACKED_REL_SPIN = 2; + final float BASS_DEPTH = BassBox.EDGE_DEPTH + 4; TowerMapping[] mapping = new TowerMapping[] { - + new TowerMapping(0, 0, 0, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 5, -10, 20}, @@ -100,49 +101,49 @@ public Model buildModel() { }), // front DJ cubes - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2, BASS_HEIGHT, 10, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2, BassBox.EDGE_HEIGHT, 10, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 0, -10, 20}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + Cube.EDGE_HEIGHT, BASS_HEIGHT, 10, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + Cube.EDGE_HEIGHT, BassBox.EDGE_HEIGHT, 10, new float[][] { {STACKED_RELATIVE, 3, 0}, {STACKED_RELATIVE, 2, -10, 20}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + 2*Cube.EDGE_HEIGHT + 5, BASS_HEIGHT, 10, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + 2*Cube.EDGE_HEIGHT + 5, BassBox.EDGE_HEIGHT, 10, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 1, 0, 10}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + 3*Cube.EDGE_HEIGHT + 9, BASS_HEIGHT, 10, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + 3*Cube.EDGE_HEIGHT + 9, BassBox.EDGE_HEIGHT, 10, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, -1, 0}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BASS_HEIGHT, 10, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BassBox.EDGE_HEIGHT, 10, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, -1, 0}, }), // left dj cubes - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2, BASS_HEIGHT, Cube.EDGE_HEIGHT + 2, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2, BassBox.EDGE_HEIGHT, Cube.EDGE_HEIGHT + 2, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 0, 2, 20}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2, BASS_HEIGHT, 2*Cube.EDGE_HEIGHT + 4, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2, BassBox.EDGE_HEIGHT, 2*Cube.EDGE_HEIGHT + 4, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 0, 2, 20}, }), // right dj cubes - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BASS_HEIGHT, Cube.EDGE_HEIGHT + 2, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BassBox.EDGE_HEIGHT, Cube.EDGE_HEIGHT + 2, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 0, 2, 20}, }), - new TowerMapping((TRAILER_WIDTH - BASS_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BASS_HEIGHT, 2*Cube.EDGE_HEIGHT + 4, new float[][] { + new TowerMapping((TRAILER_WIDTH - BassBox.EDGE_WIDTH)/2 + 4*Cube.EDGE_HEIGHT + 15, BassBox.EDGE_HEIGHT, 2*Cube.EDGE_HEIGHT + 4, new float[][] { {STACKED_RELATIVE, 0, 0}, {STACKED_RELATIVE, 0, 2, 20}, }), @@ -215,8 +216,10 @@ public Model buildModel() { } towerList.add(new Tower(tower)); } + + BassBox bassBox = new BassBox(56, 0, 2); - return new Model(towerList, cubes); + return new Model(towerList, cubes, bassBox); } public PandaMapping[] buildPandaList() { diff --git a/code/GLucose.jar b/code/GLucose.jar index 54b4b706c11da63d6ebdae3b92eab06d903c732e..14710c1e4205d90f629bac80c02cb947c34a1ddd 100644 GIT binary patch delta 8126 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 Q0nh+akpX}hwcl(14+)eIF#rGn delta 5406 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 P3^#ZA%^@cszgPbOaRQ=? -- 2.34.1