class JugglingBall : Model { @Custom var diameter = 80 @Custom var round = 5 @Custom var middleRatio = 0.58 @Custom var sides = 6 fun ball() : Shape3d { val foo = ( Circle( diameter/2 ).sides(sides).roundAllCorners( round ) / Square( diameter * 1.5 ).centerY() ).revolve().scale( 1, 1, 1.5 ) return foo / foo.rotateX(-90) / foo.rotateY(90) } @Piece fun half() = ball() / ball().boundingCube().translateZ(ball().size.z/2) @Piece fun middle() = ball() / Cube( diameter*2, diameter*2, diameter * middleRatio ).center() @Piece fun end() = ball() / Cube( diameter*2 ).centerXY().translateZ(diameter * middleRatio/2) override fun build() : Shape3d { val ball : Shape3d = ball() val middle = ball / Cube( diameter*2, diameter*2, diameter * middleRatio ).center() val end = ball / Cube( diameter*2 ).centerXY().translateZ(diameter * middleRatio/2) return middle.color("Yellow").scale(1.01) + end.color("Blue").mirrorZ().also() } }