creature Jellyfish
// A bell of five curving ribs with skin stretched between them and beads along them, between
// two rings of glowing cubes.
// Inspired by Jellyfish, a DancerDNA creature.

gene neon = 0 in 0..1  // how much its bell wears its neon texture, as the Neon variant does

gene bell_start   = -94.85  in -114.6..114.6  // how far the ribs tip at the top of the bell
gene bend_1       = 0.4957  in -22.92..22.92  // how far the ribs bend, in two waves added together
gene bend_waves_1 = 3.834   in 1..4
gene bend_start_1 = 0.1518  in -1..1
gene bend_2       = -1.97   in -22.92..22.92
gene bend_waves_2 = 1.41    in 1..4
gene bend_start_2 = 0.04078 in -1..1

gene glow_size       = 1.803 in 0.8..2.5
gene glow_radius     = 34.12 in 20..50
gene glow_turn       = (-0.7045, -7.675, 11.61) in (-57.3, -57.3, -57.3)..(57.3, 57.3, 57.3)  // how far each cube turns from the last: up, sideways and round
gene glow_turn_waves = (1.517, 0.7952, 0.5548) in (0, 0, 0)..(2, 2, 2)
gene glow_turn_start = (0.05573, -0.0008917, 0.1254) in (-0.5, -0.5, -0.5)..(0.5, 0.5, 0.5)

// The skin's and beads' colours, from the top of the bell down, and the gaps between them; and
// the glow, all one hue.
gene skin_1     = hsv(141, 0.37, 0.6) in hsv(0, 0, 0)..hsv(360, 1, 1)
gene skin_2     = hsv(262.3, 0.83, 0.54) in hsv(0, 0, 0)..hsv(360, 1, 1)
gene skin_3     = hsv(250.9, 0.9, 0.43) in hsv(0, 0, 0)..hsv(360, 1, 1)
gene skin_4     = hsv(222.1, 0.47, 0.31) in hsv(0, 0, 0)..hsv(360, 1, 1)
gene skin_gaps  = (0.4264, 0.6327, 0.8156) in (0.25, 0.25, 0.25)..(1, 1, 1)
gene bead_1     = hsv(285.8, 0.58, 1) in hsv(0, 0.4, 1)..hsv(360, 1, 1)
gene bead_2     = hsv(234.3, 0.76, 1) in hsv(0, 0.4, 1)..hsv(360, 1, 1)
gene bead_3     = hsv(273.5, 0.85, 1) in hsv(0, 0.4, 1)..hsv(360, 1, 1)
gene bead_4     = hsv(155.3, 0.88, 1) in hsv(0, 0.4, 1)..hsv(360, 1, 1)
gene bead_gaps  = (0.5986, 0.3542, 0.3142) in (0.25, 0.25, 0.25)..(1, 1, 1)
gene glow_hue   = 104.2  in 0..252
gene glow_sat   = (0.5988, 0.5952, 0.7281) in (0.4, 0.4, 0.4)..(1, 1, 1)  // how strong the glow's colour is: first, middle and last
gene glow_gap_1 = 0.3773 in 0.33..1
gene glow_gap_2 = 0.867  in 0.33..1

let skin = spectrum(skin_1, skin_2 at skin_gaps.x, skin_3 at skin_gaps.x + skin_gaps.y, skin_4 at skin_gaps.x + skin_gaps.y + skin_gaps.z)
let beads = spectrum(bead_1, bead_2 at bead_gaps.x, bead_3 at bead_gaps.x + bead_gaps.y, bead_4 at bead_gaps.x + bead_gaps.y + bead_gaps.z)
let glow_colours = spectrum(hsv(glow_hue, glow_sat.x, 1), hsv(glow_hue, glow_sat.y, 1) at glow_gap_1, hsv(glow_hue, glow_sat.z, 1) at glow_gap_1 + glow_gap_2)

// The middle of the bell, from side to side, measured as the ribs are drawn.
let middle = 0

shine 0
sharpness 0
branch {
  shape tube
  repeat 5 {
    rib
    roll 72
  }
}
forward middle * 2
glow
grow (-1, -1, -1)
glow

part rib {
  let widest = 0
  let narrowest = 0
  branch {
    let angle = bell_start
    let turned = 0
    let out = 0
    let across = 0
    repeat 25 as k {
      let along = k / 25
      pitch angle
      forward 0.6
      turned += angle
      let rise = 0.6 * sin(turned)
      across += 0.6 * cos(turned)
      if across > widest {
        widest = across
      } else if across < narrowest {
        narrowest = across
      }
      let reach = out + rise
      // The skin stretches across to the next rib.
      let width = 2 * abs(reach) * tan(36) - 1.5
      if width > 0.05 {
        branch {
          yaw 90
          colour skin(along)
          texture pattern(plasma, skin(along).hue, 6, electric)
          wear neon
          lay { grow (1, 1, width) }
        }
      }
      branch {
        move ((width + 1.5) / 2, 0, 0)
        shape ball
        texture none
        colour beads(along)
        sharpness 1
        shine 1
        lay { grow 1.5 }
      }
      out = reach + rise
      angle = bend_1 * sin(180 * bend_waves_1 * (along + bend_start_1)) + bend_2 * cos(180 * bend_waves_2 * (along + bend_start_2))
      forward 0.6
    }
  }
  middle = (widest + narrowest) / 2
}

// A ring of glowing cubes round the bell.
part glow {
  branch {
    grow glow_size
    sharpness 0
    shine 0
    shape cube
    repeat 30 as k {
      let along = k / 29
      roll glow_turn.z * sin(180 * glow_turn_waves.z * (along + glow_turn_start.z))
      yaw glow_turn.y * sin(180 * glow_turn_waves.y * (along + glow_turn_start.y))
      pitch glow_turn.x * sin(180 * glow_turn_waves.x * (along + glow_turn_start.x))
      colour glow_colours(along)
      branch {
        forward glow_radius
        grow (0.6, 0.25, 0.1)
        lay { roll 45 }
      }
    }
  }
}

variant member_2 {
  bell_start      = -97.14
  bend_1          = -6.367
  bend_waves_1    = 3.76
  bend_start_1    = 0.4031
  bend_2          = -2.545
  bend_waves_2    = 1.592
  bend_start_2    = 0.6777
  glow_size       = 1.694
  glow_radius     = 41.92
  glow_turn       = (27.39, 0.7622, 19.15)
  glow_turn_waves = (1.555, 0.194, 0.7716)
  glow_turn_start = (-0.006136, 0.01249, -0.01195)
  skin_1          = hsv(212.5, 0.12, 0.31)
  skin_2          = hsv(202.9, 0.94, 0.6)
  skin_3          = hsv(281.9, 0.88, 0.78)
  skin_4          = hsv(228.7, 0.25, 0.27)
  skin_gaps       = (0.4614, 0.6527, 0.9752)
  bead_1          = hsv(236.7, 0.41, 1)
  bead_2          = hsv(249.7, 0.86, 1)
  bead_3          = hsv(290.3, 0.99, 1)
  bead_4          = hsv(104.7, 0.93, 1)
  bead_gaps       = (0.6506, 0.2758, 0.3434)
  glow_hue        = 156.2
  glow_sat        = (0.7007, 0.4396, 0.8146)
  glow_gap_1      = 0.3357
  glow_gap_2      = 0.8541
}

variant member_3 {
  bell_start      = 81.28
  bend_1          = 11.74
  bend_waves_1    = 2.647
  bend_start_1    = 0.461
  bend_2          = -21.22
  bend_waves_2    = 1.209
  bend_start_2    = -0.6976
  glow_size       = 2.106
  glow_radius     = 21.34
  glow_turn       = (-19.7, -49.04, 55.25)
  glow_turn_waves = (0.673, 1.377, 0.2944)
  glow_turn_start = (0.2065, -0.4343, 0.197)
  skin_1          = hsv(91.7, 0.75, 0.84)
  skin_2          = hsv(56.7, 0.62, 0.76)
  skin_3          = hsv(118.5, 0.03, 0.26)
  skin_4          = hsv(180.9, 0.35, 0.84)
  skin_gaps       = (0.6612, 0.44, 0.7056)
  bead_1          = hsv(27.7, 0.73, 1)
  bead_2          = hsv(351.6, 0.6, 1)
  bead_3          = hsv(133.5, 0.48, 1)
  bead_4          = hsv(164.3, 0.77, 1)
  bead_gaps       = (0.2708, 0.5373, 0.7322)
  glow_hue        = 84.67
  glow_sat        = (0.7106, 0.9444, 0.6979)
  glow_gap_1      = 0.4231
  glow_gap_2      = 0.7669
}

variant member_4 {
  bell_start      = 92.78
  bend_1          = 7.373
  bend_waves_1    = 2.755
  bend_start_1    = -0.6238
  bend_2          = 0
  bend_waves_2    = 2.592
  bend_start_2    = -0.03367
  glow_size       = 1.361
  glow_radius     = 42.15
  glow_turn       = (-1.278, 1.923, 3.593)
  glow_turn_waves = (0.9906, 0.9078, 0.3685)
  glow_turn_start = (-0.04387, -0.03288, -0.1774)
  skin_1          = hsv(243.4, 0.2, 0.48)
  skin_2          = hsv(27.7, 0.48, 0.22)
  skin_3          = hsv(167.7, 0.31, 0.47)
  skin_4          = hsv(352.3, 0.65, 0.87)
  skin_gaps       = (0.3188, 0.4124, 0.8573)
  bead_1          = hsv(134.3, 0.75, 1)
  bead_2          = hsv(256, 0.4, 1)
  bead_3          = hsv(243.2, 0.58, 1)
  bead_4          = hsv(59.9, 0.47, 1)
  bead_gaps       = (0.4879, 0.8477, 0.25)
  glow_hue        = 178.2
  glow_sat        = (0.6076, 0.7302, 0.4898)
  glow_gap_1      = 0.6626
  glow_gap_2      = 0.9583
}

variant member_5 {
  bell_start      = -24.16
  bend_1          = 18.44
  bend_waves_1    = 3.046
  bend_start_1    = 0.4965
  bend_2          = 10.57
  bend_waves_2    = 2.013
  bend_start_2    = 0.2995
  glow_size       = 2.106
  glow_radius     = 24.41
  glow_turn       = (11.5, -55.9, 3.645)
  glow_turn_waves = (1.106, 0.2015, 1.479)
  glow_turn_start = (-0.005883, 0.1158, 0.1301)
  skin_1          = hsv(91.7, 0.75, 0.84)
  skin_2          = hsv(222.4, 0.13, 0.12)
  skin_3          = hsv(174.8, 0.97, 0.53)
  skin_4          = hsv(230.3, 0.92, 0.5)
  skin_gaps       = (0.8263, 0.9977, 0.2969)
  bead_1          = hsv(194.1, 0.54, 1)
  bead_2          = hsv(242.7, 0.57, 1)
  bead_3          = hsv(133.5, 0.48, 1)
  bead_4          = hsv(294.4, 0.61, 1)
  bead_gaps       = (0.7819, 0.5913, 0.9682)
  glow_hue        = 234
  glow_sat        = (0.8869, 0.53, 0.6931)
  glow_gap_1      = 0.8963
  glow_gap_2      = 0.4147
}

variant member_6 {
  bell_start      = 87.01
  bend_1          = 7.373
  bend_waves_1    = 1.066
  bend_start_1    = 0.4727
  bend_2          = -4.139
  bend_waves_2    = 3.984
  bend_start_2    = -0.03367
  glow_size       = 1.361
  glow_radius     = 47.99
  glow_turn       = (34.78, 1.923, 6.869)
  glow_turn_waves = (1.863, 1.536, 0.5195)
  glow_turn_start = (0.3336, 0.00245, -0.4421)
  skin_1          = hsv(357.1, 0.96, 0.88)
  skin_2          = hsv(196.6, 0.48, 0.1)
  skin_3          = hsv(109, 0.36, 0.98)
  skin_4          = hsv(352.3, 0.65, 0.87)
  skin_gaps       = (0.8195, 0.3346, 0.3507)
  bead_1          = hsv(18.6, 0.73, 1)
  bead_2          = hsv(181.7, 0.81, 1)
  bead_3          = hsv(93.2, 0.55, 1)
  bead_4          = hsv(59.9, 0.47, 1)
  bead_gaps       = (0.9612, 0.696, 0.25)
  glow_hue        = 91.59
  glow_sat        = (0.9316, 0.8052, 0.4898)
  glow_gap_1      = 0.8806
  glow_gap_2      = 0.9583
}

variant member_7 {
  bell_start      = -13.14
  bend_1          = 11.09
  bend_waves_1    = 1.487
  bend_start_1    = 0.157
  bend_2          = 8.114
  bend_waves_2    = 3.758
  bend_start_2    = -0.126
  glow_size       = 1.485
  glow_radius     = 29.88
  glow_turn       = (-23.48, -26.47, 7.239)
  glow_turn_waves = (0.9952, 0.2643, 1.679)
  glow_turn_start = (-0.005883, 0.005505, -0.1581)
  skin_1          = hsv(352.5, 0.88, 0.28)
  skin_2          = hsv(289.2, 0.25, 0.09)
  skin_3          = hsv(35.7, 0.07, 0.01)
  skin_4          = hsv(167.2, 0.6, 0.94)
  skin_gaps       = (0.9952, 0.7228, 0.3354)
  bead_1          = hsv(263.7, 0.78, 1)
  bead_2          = hsv(16.8, 0.86, 1)
  bead_3          = hsv(153.2, 0.61, 1)
  bead_4          = hsv(144.4, 0.49, 1)
  bead_gaps       = (0.7074, 0.4592, 0.9362)
  glow_hue        = 220.9
  glow_sat        = (0.6791, 0.4207, 0.8178)
  glow_gap_1      = 0.4809
  glow_gap_2      = 0.6565
}

variant member_8 {
  bell_start      = -4.185
  bend_1          = -19.53
  bend_waves_1    = 2.3
  bend_start_1    = -0.8337
  bend_2          = -3.205
  bend_waves_2    = 2.394
  bend_start_2    = -0.4128
  glow_size       = 2.401
  glow_radius     = 33.63
  glow_turn       = (50.67, 31.44, -51.25)
  glow_turn_waves = (0.7519, 0.7777, 0.5134)
  glow_turn_start = (-0.005883, -0.2603, 0.2785)
  skin_1          = hsv(188.7, 1, 0.37)
  skin_2          = hsv(304, 0.99, 0.2)
  skin_3          = hsv(265.3, 0.51, 0.27)
  skin_4          = hsv(322.9, 0.84, 0)
  skin_gaps       = (0.7201, 0.3082, 0.6018)
  bead_1          = hsv(35, 0.92, 1)
  bead_2          = hsv(60.9, 0.92, 1)
  bead_3          = hsv(97.4, 0.6, 1)
  bead_4          = hsv(35.4, 0.5, 1)
  bead_gaps       = (0.727, 0.5818, 0.5787)
  glow_hue        = 65.75
  glow_sat        = (0.9714, 0.8834, 0.5052)
  glow_gap_1      = 0.9547
  glow_gap_2      = 0.7785
}

variant member_9 {
  bell_start      = 28.45
  bend_1          = -16.37
  bend_waves_1    = 1.733
  bend_start_1    = 0.7577
  bend_2          = 0.6781
  bend_waves_2    = 2.262
  bend_start_2    = 0.9348
  glow_size       = 2.148
  glow_radius     = 24.67
  glow_turn       = (2.367, -1.101, 3.593)
  glow_turn_waves = (1.452, 1.037, 1)
  glow_turn_start = (0.4028, -0.03288, -0.2001)
  skin_1          = hsv(216.1, 0.12, 0.61)
  skin_2          = hsv(240.6, 1, 0.79)
  skin_3          = hsv(305.9, 0.68, 0.22)
  skin_4          = hsv(258.4, 0.97, 0.7)
  skin_gaps       = (0.8431, 0.548, 0.5505)
  bead_1          = hsv(208.8, 0.46, 1)
  bead_2          = hsv(97.2, 0.81, 1)
  bead_3          = hsv(144.1, 0.96, 1)
  bead_4          = hsv(82.6, 0.99, 1)
  bead_gaps       = (0.4949, 0.91, 0.25)
  glow_hue        = 229.3
  glow_sat        = (0.6383, 0.5549, 0.5546)
  glow_gap_1      = 0.8607
  glow_gap_2      = 0.717
}

variant member_10 {
  bell_start      = 43.5
  bend_1          = -11.74
  bend_waves_1    = 2.445
  bend_start_1    = 0.4965
  bend_2          = -21.22
  bend_waves_2    = 3.641
  bend_start_2    = -0.8694
  glow_size       = 1.337
  glow_radius     = 41.07
  glow_turn       = (8.46, -9.583, 49.23)
  glow_turn_waves = (0.03959, 0.9871, 0.6785)
  glow_turn_start = (-0.005883, -0.3686, 0.2733)
  skin_1          = hsv(72.6, 0.36, 0.27)
  skin_2          = hsv(186, 0.4, 0.75)
  skin_3          = hsv(25.6, 0.05, 0.37)
  skin_4          = hsv(141.1, 0.52, 0.45)
  skin_gaps       = (0.9451, 0.44, 0.8925)
  bead_1          = hsv(259.2, 0.8, 1)
  bead_2          = hsv(111.2, 0.45, 1)
  bead_3          = hsv(242.8, 0.93, 1)
  bead_4          = hsv(278.1, 0.71, 1)
  bead_gaps       = (0.7819, 0.8607, 0.7368)
  glow_hue        = 238.4
  glow_sat        = (0.8869, 0.9446, 0.5897)
  glow_gap_1      = 0.4809
  glow_gap_2      = 0.7394
}

variant member_11 {
  bell_start      = 28.45
  bend_1          = -16.37
  bend_waves_1    = 3.499
  bend_start_1    = -0.2231
  bend_2          = -16.35
  bend_waves_2    = 2.592
  bend_start_2    = -0.03367
  glow_size       = 1.751
  glow_radius     = 29.65
  glow_turn       = (2.367, 44.56, 53.51)
  glow_turn_waves = (1.826, 1.037, 0.5195)
  glow_turn_start = (-0.1702, -0.3334, 0.1305)
  skin_1          = hsv(251.7, 0.06, 0.39)
  skin_2          = hsv(180.3, 0.77, 0.92)
  skin_3          = hsv(167.7, 0.31, 0.47)
  skin_4          = hsv(126.7, 0.87, 0.51)
  skin_gaps       = (0.8581, 0.548, 0.4634)
  bead_1          = hsv(174, 0.78, 1)
  bead_2          = hsv(18.1, 0.61, 1)
  bead_3          = hsv(99.6, 0.59, 1)
  bead_4          = hsv(73.5, 0.48, 1)
  bead_gaps       = (0.8784, 0.882, 0.6238)
  glow_hue        = 180
  glow_sat        = (0.6383, 0.5549, 0.4898)
  glow_gap_1      = 0.4825
  glow_gap_2      = 0.7298
}

variant member_12 {
  bell_start      = 8.032
  bend_1          = -8.417
  bend_waves_1    = 3.215
  bend_start_1    = -0.8035
  bend_2          = -12.35
  bend_waves_2    = 3.908
  bend_start_2    = 0.3237
  glow_size       = 1.654
  glow_radius     = 31.81
  glow_turn       = (-40.21, 0.7622, -0.8528)
  glow_turn_waves = (1.971, 1.883, 0.6257)
  glow_turn_start = (0.02599, 0.1269, -0.3247)
  skin_1          = hsv(311.2, 0.68, 0.64)
  skin_2          = hsv(31, 0.21, 0.61)
  skin_3          = hsv(327.3, 0.08, 0.46)
  skin_4          = hsv(42.4, 0.39, 0.38)
  skin_gaps       = (0.5087, 0.6212, 0.9729)
  bead_1          = hsv(77.3, 0.54, 1)
  bead_2          = hsv(131.5, 0.76, 1)
  bead_3          = hsv(141.1, 0.79, 1)
  bead_4          = hsv(340.7, 0.89, 1)
  bead_gaps       = (0.7893, 0.4032, 0.7167)
  glow_hue        = 156.2
  glow_sat        = (0.9091, 0.8553, 0.686)
  glow_gap_1      = 0.3613
  glow_gap_2      = 0.4053
}

variant member_13 {
  bell_start      = -0.2965
  bend_1          = 15.77
  bend_waves_1    = 2.256
  bend_start_1    = -0.6886
  bend_2          = -11.88
  bend_waves_2    = 3.209
  bend_start_2    = 0.4707
  glow_size       = 2.495
  glow_radius     = 32.03
  glow_turn       = (12.32, -1.844, 50.41)
  glow_turn_waves = (0.7203, 0.1428, 1.572)
  glow_turn_start = (0.3459, 0.3342, -0.01057)
  skin_1          = hsv(175.1, 0.54, 0.54)
  skin_2          = hsv(186.8, 0.46, 0.2)
  skin_3          = hsv(320.4, 0.69, 0.64)
  skin_4          = hsv(185.3, 0.6, 0.99)
  skin_gaps       = (0.3475, 0.3084, 0.7526)
  bead_1          = hsv(199.6, 0.69, 1)
  bead_2          = hsv(122.7, 0.66, 1)
  bead_3          = hsv(270.1, 0.51, 1)
  bead_4          = hsv(147, 0.64, 1)
  bead_gaps       = (0.715, 0.4309, 0.8426)
  glow_hue        = 80.57
  glow_sat        = (0.8383, 0.8499, 0.518)
  glow_gap_1      = 0.5097
  glow_gap_2      = 0.7541
}

variant Neon { neon = 1 }
