|
| 1 | +from mewnala import * |
| 2 | + |
| 3 | +field_obj = None |
| 4 | +particle = None |
| 5 | +mat = None |
| 6 | + |
| 7 | + |
| 8 | +def setup(): |
| 9 | + global field_obj, particle, mat |
| 10 | + |
| 11 | + size(900, 700) |
| 12 | + mode_3d() |
| 13 | + |
| 14 | + create_directional_light((0.95, 0.9, 0.85), 600.0) |
| 15 | + |
| 16 | + # Source mesh whose vertices become particle positions; uvs come along for |
| 17 | + # free and we use them to color each particle. |
| 18 | + source = Geometry.sphere(5.0, 32, 24) |
| 19 | + field_obj = Field( |
| 20 | + geometry=source, |
| 21 | + attributes=[Attribute.position(), Attribute.uv(), Attribute.color()], |
| 22 | + ) |
| 23 | + |
| 24 | + # Read uvs back, build per-particle colors, write to color PBuffer. |
| 25 | + color_buf = field_obj.pbuffer(Attribute.color()) |
| 26 | + uv_buf = field_obj.pbuffer(Attribute.uv()) |
| 27 | + colors = [] |
| 28 | + for uv in uv_buf.read(): |
| 29 | + u = uv[0] |
| 30 | + h = u * 6.0 |
| 31 | + c = h - int(h) |
| 32 | + if h < 1: |
| 33 | + colors.append([1.0, c, 0.0, 1.0]) |
| 34 | + elif h < 2: |
| 35 | + colors.append([1.0 - c, 1.0, 0.0, 1.0]) |
| 36 | + elif h < 3: |
| 37 | + colors.append([0.0, 1.0, c, 1.0]) |
| 38 | + elif h < 4: |
| 39 | + colors.append([0.0, 1.0 - c, 1.0, 1.0]) |
| 40 | + elif h < 5: |
| 41 | + colors.append([c, 0.0, 1.0, 1.0]) |
| 42 | + else: |
| 43 | + colors.append([1.0, 0.0, 1.0 - c, 1.0]) |
| 44 | + color_buf.write(colors) |
| 45 | + |
| 46 | + particle = Geometry.sphere(0.18, 10, 8) |
| 47 | + mat = Material.field_pbr(color_buf) |
| 48 | + |
| 49 | + |
| 50 | +def draw(): |
| 51 | + camera_position(0.0, 4.0, 18.0) |
| 52 | + camera_look_at(0.0, 0.0, 0.0) |
| 53 | + background(15, 15, 20) |
| 54 | + |
| 55 | + use_material(mat) |
| 56 | + draw_field(field_obj, particle) |
| 57 | + |
| 58 | + |
| 59 | +run() |
0 commit comments