13 Commits

Author SHA1 Message Date
f4c9c91d91 fix an issue with frame wall + small button screw-in space
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 14:25:09 -05:00
bbe1ab25d7 reorganize the READMEs a bit and put both in the .zip
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 11:13:03 -05:00
cb82933e50 docs updates for v4.4.1
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:37:05 -05:00
a1fc85c069 rename the overhang solo lever + 6 button and add a board mount
this makes it essentially the same as the inset panel, just as an
overhang variant

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-07 10:35:44 -05:00
850bbdf5b9 demo for the solo panel stick I'm working on
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:52:29 -05:00
7e42129594 add an inset solo panel, room for lever + 6 buttons + 2 aux
good for classic/mini consoles and MiSTer?

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:46:47 -05:00
66719f84c6 adjust solo lever + 6 button panel
this tested better and allows a bit of space for two aux buttons

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:33:50 -05:00
184664cceb tweak the area around button holes for screw-ins
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-06 09:26:00 -05:00
903b9b40ff actually update the blown up demo image after fixing the file
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-07-01 20:28:53 -05:00
9fd3658518 parameterize more of the slashes used for windowed walls
this was done for a probably-abandoned attempt at something, but the
parameterization is good anyway

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-28 12:01:49 -05:00
bd7b908712 make more windowed frame pieces, this time horizontal stripes
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-28 12:01:26 -05:00
61a67109ce fix alignment of a bottom overhang panel in the demo
Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-25 17:02:03 -05:00
ff85423cee DRY the frame wall slashes and parameterize them a bit
this should allow me to reuse them in another design I've got cooking

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
2024-06-25 17:01:21 -05:00
16 changed files with 221 additions and 100 deletions

View File

@@ -2,6 +2,35 @@
Included is a summary of changes to the project, by version. Details can be found in the commit history.
## v4.4.2
### Bugfixes
* Fix a regression with the small button screw-in space cutting into the frame wall supports. The screw-in space is
potentially more important for some nuts than the thickness of the frame wall supports, so the latter have been
thinned slightly.
## v4.4.1
### Features
* A new lever + Sega 2P 6 button panel has been added. The overhang version hadn't been updated in forever, but the
inset panel moved stuff around in a way that allowed a couple aux buttons to fit in, so those have been added to the
overhang panel as well.
* A horizontal stripe frame windowed piece has been added. YMMV may vary a bit on this vs. an empty window --- you can
see less of the inner object with the stripes, but it's a bit more stable.
### Improvements
* The frame wall slashes have been made a bit more reusable.
* The area around button holes for screw-ins has been tweaked to be a bit smaller for 30mm buttons and a bit larger for
24mm buttons.
### Miscellaneous
* A bottom overhang panel was positioned incorrectly in the demo file; this has been fixed.
* Added a demo of the one-panel overhang lever + 6 button stick.
## v4.4.0
### Features

View File

@@ -1,7 +1,8 @@
all:
python build.py
mkdir -p ./build/docs
cp ./docs/README-objects.md ./build/README.md
cp ./README.md ./build/README.md
cp ./docs/README-objects.md ./build/README-objects.md
cp ./docs/assembly-and-tips.md ./build/docs/assembly-and-tips.md
cp ./docs/printing-and-materials.md ./build/docs/printing-and-materials.md
cp ./LICENSE ./build/LICENSE

View File

@@ -67,6 +67,9 @@ about what the types of parts are and how to use them:
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes.
Feel free to request or contribute to more objects. Additional documentation regarding assembling the stick is available
in `docs/assembly-and-tips.md`.
## Printing
These items all fit on a 256mm^2 print bed; I use a Bambu Lab P1P based on what I've learned from the
@@ -161,12 +164,13 @@ to hang out and discuss issues and features and whatnot.
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later
version.
The Buildable Stick System is free software: you can redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any
later version.
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
The Buildable Stick System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see
<https://www.gnu.org/licenses/>.

View File

@@ -5,3 +5,7 @@ Notes for "next time".
## v4.x
* Engraving some cosmetic stuff? Or maybe a place to mount other plates on the top?
## v5
* Finishing the build123d rewrite?

View File

@@ -0,0 +1,28 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <frames/pieces/extended/front-or-back.scad>
use <frames/pieces/extended/side-extended-to-bottom.scad>
use <frames/pieces/extended/front-or-back-clean-for-extended-side-aux-and-neutrik.scad>
use <panels/inset/lever-and-dir_arc-plus-w-30mm-panel.scad>
use <panels/inset/lever-and-sega-2p-6-button-panel-with-aux-with-mount.scad>
use <misc/dustwasher-jlf.scad>
top_panel_color = "#5B6579";
bottom_panel_color = "#8E9089";
frame_top_bottom_color = "#8E9089";
frame_side_color = "#8E9089";
top_deco_color = "#000000";
color(top_panel_color) translate([0, 0, frame_z/2-panel_z+0.01]) lever_and_sega_2p_6_button_panel_with_aux_with_mount();
color(frame_side_color) translate([0, 0, -2.5]) extra_extended_left_or_right_frame_piece();
color(frame_side_color) translate([0, 0, -2.5]) mirror([1, 0, 0]) extra_extended_left_or_right_frame_piece();
color(frame_top_bottom_color) translate([0, 0, -2.5]) extended_front_or_back_frame_piece();
color(frame_top_bottom_color) translate([0, 0, -2.5]) rotate([180, 0, 0]) front_or_back_aux_and_neutrik_box_frame_piece_for_extended_side();
color(bottom_panel_color) translate([0, 0, -5-frame_z/2+5]) panel();
color(top_deco_color) translate([-65, 5, 3+frame_z/2-panel_z]) jlf_dustwasher();

View File

@@ -26,7 +26,8 @@ color("black") rotate([180, 0, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front
color("black") rotate([180, 0, 0]) rotate([0, 180, 0]) translate([-frame_x/2+5-25, -55, -2.5]) front_or_back_aux_and_neutrik_box_frame_piece();
color("black") rotate([0, 180, 0]) interconnect_frame_piece();
color("#C12E1F") translate([-panel_x/2-25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) left_or_right_overhang_panel();
color("#C12E1F") mirror([0, 1, 0]) translate([panel_x/2+25, 0, -5-frame_z/2-75]) rotate([0, 0, 180])
left_or_right_overhang_panel();
color("black") translate([0, 0, 3+frame_z/2+150]) dir_arc_plus_w_30mm_and_sega_2p_plus_one_decorative_plate();
color("black") translate([-195, 25, 3+frame_z/2+150]) lsx_nobi_dustwasher();

View File

@@ -1,54 +1,11 @@
# The Buildable Stick System
Files for 3D printing an arcade stick.
Files for 3D printing an arcade stick. See `README.md` for the core documentation, this file is specific to distributed
objects.
## Objects
## Attribution
The following notes document the objects in the Buildable Stick System and how you can use them:
* `frames/`
* `complete/` --- these are the four walls of the frame as one piece, in a couple variations for combining into
larger arcade sticks. They are simple to assemble, but you have fewer modularity/customization options, and they
are harder to print because the physics of the material cooling will probably pull the corners up. They also need
supports, since the top and bottom of the frame both have trays for panels to go into. Use at your own risk.
* `pieces/`
* `box/` --- these are the same four walls (generally speaking) as in the complete frames above, broken out into
modular pieces to print separately. Because they are separate pieces, you can mix and match colors, and you
can lay them all face down on the print surface for better adhesion and surface patterns. There are also
variants here, the "windowed" pieces, for doing two-tone variants and that kind of thing.
* `extended/` --- the frame walls are pulled out to create MCZ TE-style extended sides. Rather than getting a
box look, you get a longer slab with nice bevels. These look nice, but slightly fiddily to print (and of
course need more material) --- watch your surface adhesion.
* `interconnect` --- complete frames are bolted to one another, but for frame pieces, there is an interconnect
that stands in for the joined inner wall. You need this if you are combining multiple sets of walls, e.g. for
a two-panel-long stick.
* `panels/`
* `inset/` --- various panels, all of the same size, that fit into and flush with the frame, making the arcade stick
top or bottom. These work equally well with box or extended frames, and aside from using up a bit of the space
inside the frame, come with no downsides --- they print easily and are a pretty simple shape to tweak and remix.
* `overhang/` --- overhang panels have their plane extending over the edge of the frame, creating a bit of a
sandwich look. This is mostly an aesthetic choice, but they sit higher in the frame as well, the main panel being
over/under the frame rather than within it. This extra space is useful for taller levers. The only downside to
these is that they aren't as reusable as the inset panels, since the inset panels can go anywhere, but the
overhang panels must be designed to not overlap with other overhang panels, so you might have to make more custom
variants depending on where you put things.
* `misc/`
* Pieces that I haven't organized better (yet) --- there are decorative plates for top buttons and similar to give
more color variance and some layers to the arcade stick, some very simple dustwashers, plates that fit rocker
switches and the like in Neutrik D or 20mm holes, and a lever mount spacer for getting your lever shaft at the
desired height. You don't *need* any of these, but you'll probably use a few.
* `extras/`
* Various experiments and things not directly related to making an arcade stick. At time of writing, there's a
couple pieces for a little stand for the stick, solely for vanity purposes.
Feel free to request or contribute to more objects, see the links to Git repos below.
## Printing and Assembling
Additional documentation regarding printing the objects and assembling the stick are available in
`docs/printing-and-materials.md` and `docs/assembly-and-tips.md`, respectively.
## Author and Licensing
### Author and Licensing
Written by and copyright Brian S. Stephan (<bss@incorporeal.org>).
@@ -71,9 +28,13 @@ details.
You should have received a copy of the GNU General Public License along with the Buildable Stick System. If not, see
<https://www.gnu.org/licenses/>.
## Lineage
### Distributing BSS Sticks
Inspired by the incredible work of [TheTrain](https://github.com/TheTrainGoes) on the [OpenStickCommunity Fightstick
Case](https://github.com/OpenStickCommunity/Hardware/tree/main/Fightstick%20Case), itself based on the incredible work
by [Dash n'Mash](https://twitter.com/Dash_xx_Mash?s=20). Original work Copyright 2023 TheTrain, [licensed under CC BY
4.0](https://creativecommons.org/licenses/by/4.0/).
Under the terms of the GPLv3, you must inform the receiver of the "object code" of their rights under the GPLv3. This is
a bit of a gray area for physical objects, but likely applies to distribution of modified or unmodified STL, STEP, etc.
files at a minimum. The easiest way to satisfy the GPLv3 in either situation is to provide a link to the source code
(either the unmodified mainline project, or your copy, with modifications listed in a "prominent notice"); something
like the below should suffice in either electronic or printed form:
> This arcade stick is part of the Buildable Stick System, version X.Y.Z; the source code to this program is available
> under the terms of the GNU General Public License, at [LINK].

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -28,10 +28,9 @@ module panel_holes() {
// for snap-ins, etc.
module button_24mm_hole() {
cylinder(r=small_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 29.5mm, so radius+3 to leave some space
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=small_button_radius+3, h=49, $fn=50, center=true);
translate([0, 0, -25]) cylinder(r=small_button_radius+button_radius_connector_space, h=49, $fn=50, center=true);
// space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=small_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=small_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
@@ -41,10 +40,9 @@ module button_24mm_hole() {
// for snap-ins, etc.
module button_30mm_hole() {
cylinder(r=big_button_radius, h=100, $fn=50, center=true);
// carve out space for snap-ins, leave 3mm
// slagcoin has screw-in nut diameter at 36mm, so radius+6 to leave some space
// carve out space for snap-ins and screw-in nuts
// translation is to leave 3mm thickness in the plate without recentering anything
translate([0, 0, -25]) cylinder(r=big_button_radius+6, h=49, $fn=50, center=true);
translate([0, 0, -25]) cylinder(r=big_button_radius+button_radius_connector_space, h=49, $fn=50, center=true);
// space for decorative button surround stuff
translate([0, 0, 50]) cylinder(r=big_button_radius*decorative_radius_scale, h=20, $fn=50, center=true);
translate([0, 0, 70]) cylinder(r=big_button_radius*jumbo_decorative_radius_scale, h=20, $fn=50, center=true);
@@ -82,7 +80,7 @@ module rocker_20mm_mount() {
// space for a neutrik D mount or 24mm button --- Z is meant to leave some lip now that frames
// are primarily printed on their side
module frame_cutout() {
cube([30.5, 8, frame_z-(panel_z*3)], center=true);
cube([35, 8, frame_z-(panel_z*3)], center=true);
}
// bank of three 24mm buttons, commonly on a frame face
@@ -339,6 +337,22 @@ module frame() {
}
}
/* MISC SHAPES --- for cutting out decorative panels, frame wall windows, etc. */
// for cutting out slashes from the frame outer wall
module slash_cutout() {
polyhedron([
[slash_inner_displacement/2, -frame_wall/2, -slash_height/2],
[(slash_inner_displacement/2+slash_width), -frame_wall/2, -slash_height/2],
[(slash_inner_displacement/2+slash_width), frame_wall/2, -slash_height/2],
[slash_inner_displacement/2, frame_wall/2, -slash_height/2],
[-(slash_inner_displacement/2+slash_width), -frame_wall/2, slash_height/2],
[-slash_inner_displacement/2, -frame_wall/2, slash_height/2],
[-slash_inner_displacement/2, frame_wall/2, slash_height/2],
[-(slash_inner_displacement/2+slash_width), frame_wall/2, slash_height/2]
], [[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]);
}
/* LAYOUTS */
// Directional Arc (both hands)

View File

@@ -8,23 +8,14 @@ include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module backslash() {
polyhedron([[5, -frame_y/2, -(frame_z-panel_z*3)/2], [20, -frame_y/2, -(frame_z-panel_z*3)/2],
[20, -frame_y/2+frame_wall, -(frame_z-panel_z*3)/2], [5, -frame_y/2+frame_wall, -(frame_z-panel_z*3)/2],
[-20, -frame_y/2, (frame_z-panel_z*3)/2], [-5, -frame_y/2, (frame_z-panel_z*3)/2],
[-5, -frame_y/2+frame_wall, (frame_z-panel_z*3)/2], [-20, -frame_y/2+frame_wall, (frame_z-panel_z*3)/2]],
[[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]
);
}
module backslashes() {
translate([-60, 0, 0]) backslash();
translate([-40, 0, 0]) backslash();
translate([-20, 0, 0]) backslash();
backslash();
translate([20, 0, 0]) backslash();
translate([40, 0, 0]) backslash();
translate([60, 0, 0]) backslash();
translate([-60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([-20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([0, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([20, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([40, -(frame_y-frame_wall)/2, 0]) slash_cutout();
translate([60, -(frame_y-frame_wall)/2, 0]) slash_cutout();
}
module backslashes_windowed_front_or_back_box_frame_piece() {

View File

@@ -0,0 +1,29 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <front-or-back.scad>
use <front-or-back-inner-wall.scad>
module front_stripe() {
cube([frame_x-(frame_mount_column_width*1.75)*2, frame_wall, 6], center=true);
}
module windowed_front_or_back_box_frame_piece() {
difference() {
front_or_back_box_frame_piece();
// subtract frame wall windows
translate([0, -(frame_y-frame_wall)/2, 18]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, 9]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, 0]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, -9]) front_stripe();
translate([0, -(frame_y-frame_wall)/2, -18]) front_stripe();
// subtract the inner wall area that will be provided by the other piece
front_or_back_inner_wall_frame_piece();
}
}
windowed_front_or_back_box_frame_piece();

View File

@@ -8,21 +8,12 @@ include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module backslash() {
polyhedron([[-frame_x/2, -5, -(frame_z-panel_z*3)/2], [-frame_x/2, -20, -(frame_z-panel_z*3)/2],
[-frame_x/2+frame_wall, -20, -(frame_z-panel_z*3)/2], [-frame_x/2+frame_wall, -5, -(frame_z-panel_z*3)/2],
[-frame_x/2, 20, (frame_z-panel_z*3)/2], [-frame_x/2, 5, (frame_z-panel_z*3)/2],
[-frame_x/2+frame_wall, 5, (frame_z-panel_z*3)/2], [-frame_x/2+frame_wall, 20, (frame_z-panel_z*3)/2]],
[[0, 1, 2, 3], [4, 5, 1, 0], [7, 6, 5, 4], [5, 6, 2, 1], [6, 7, 3, 2], [7, 4, 0, 3]]
);
}
module backslashes() {
translate([0, -40, 0]) backslash();
translate([0, -20, 0]) backslash();
backslash();
translate([0, 20, 0]) backslash();
translate([0, 40, 0]) backslash();
translate([-(frame_x-frame_wall)/2, -40, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, -20, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 0, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 20, 0]) rotate([0, 0, -90]) slash_cutout();
translate([-(frame_x-frame_wall)/2, 40, 0]) rotate([0, 0, -90]) slash_cutout();
}
module backslashes_windowed_side_box_frame_piece() {

View File

@@ -0,0 +1,29 @@
/*
* SPDX-FileCopyrightText: © 2024 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
use <side.scad>
use <side-inner-wall.scad>
module side_stripe() {
cube([frame_wall, frame_y-(frame_mount_column_width*1.75)*2, 6], center=true);
}
module windowed_side_box_frame_piece() {
difference() {
side_box_frame_piece();
// subtract frame wall windows
translate([-(frame_x-frame_wall)/2, 0, 18]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, 9]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, 0]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, -9]) side_stripe();
translate([-(frame_x-frame_wall)/2, 0, -18]) side_stripe();
// subtract the inner wall area that will be provided by the other piece
side_inner_wall_frame_piece();
}
}
windowed_side_box_frame_piece();

View File

@@ -0,0 +1,25 @@
/*
* SPDX-FileCopyrightText: © 2023 Brian S. Stephan <bss@incorporeal.org>
* SPDX-License-Identifier: GPL-3.0-or-later
*/
include <parameters.scad>
include <components.scad>
module lever_and_sega_2p_6_button_panel_with_aux_with_mount() {
difference() {
union() {
panel();
translate([45, -58, -panel_z/2]) rotate([0, 0, 13]) pcb_mount();
}
translate([90, -25, 0]) sega_2p_6_button();
translate([-65, 5, 0]) union() {
levermountholes();
levermountcountersinks();
}
translate([17, 70, 0]) button_24mm_hole();
translate([-17, 70, 0]) button_24mm_hole();
}
}
lever_and_sega_2p_6_button_panel_with_aux_with_mount();

View File

@@ -8,13 +8,17 @@ include <components.scad>
module lever_and_sega_2p_6_button_solo_overhang_panel() {
difference() {
// base plate
union() {
panel_with_raised_overhang();
translate([-60, 18, -((panel_z/2)+(lever_mount_z/2))]) levermountbase();
translate([45, -58, -panel_z/2]) rotate([0, 0, 13]) pcb_mount();
}
translate([95, -20, 0]) sega_2p_6_button();
translate([-60, 18, 0]) levermountholes();
translate([90, -25, 0]) sega_2p_6_button();
translate([-65, 5, 0]) union() {
levermountholes();
levermountcountersinks();
}
translate([17, 70, 0]) button_24mm_hole();
translate([-17, 70, 0]) button_24mm_hole();
}
}

View File

@@ -23,6 +23,11 @@ small_button_radius = 12 + hole_tolerance;
// 30mm button
big_button_radius = 15 + hole_tolerance;
// carve out space around buttons for screw-in nuts
// slagcoin has screw-in nut diameter at 36mm for 30mm buttons, 29.5 for 24mm buttons
// radius + value below should leave space for the nut and for fingers to grab the nut
button_radius_connector_space = 5;
// JLF mount dimensions
lever_mount_x = 53;
lever_mount_y = 95;
@@ -89,3 +94,8 @@ neutrik_d_radius = 12 + hole_tolerance;
// additional button radius for decorative panels, etc.
decorative_radius_scale = 1.75;
jumbo_decorative_radius_scale = 2;
// decorative slash parameters
slash_inner_displacement = 10;
slash_width = 15;
slash_height = frame_z-panel_z*3;