|
14 | 14 | import static arc.Core.*;
|
15 | 15 | import static mindustry.Vars.renderer;
|
16 | 16 |
|
17 |
| -/** Renders the glowing area around black holes. (Do I even need this?) */ |
| 17 | +/** Handles rendering of gravitational lensing and the glow around the center. */ |
18 | 18 | public class BlackHoleRenderer{
|
19 | 19 | private final Seq<BlackHoleZone> zones = new Seq<>(BlackHoleZone.class);
|
20 |
| - private final FrameBuffer buffer; |
| 20 | + private FrameBuffer buffer; |
| 21 | + private boolean advanced = true; |
21 | 22 |
|
22 |
| - public BlackHoleRenderer(){ //TODO setting |
23 |
| - buffer = new FrameBuffer(); |
| 23 | + public BlackHoleRenderer(boolean advanced){ |
| 24 | + toggleAdvanced(advanced); |
24 | 25 |
|
25 | 26 | Events.run(Trigger.draw, () -> {
|
26 |
| - Draw.draw(Layer.min + 0.01f, () -> { |
27 |
| - buffer.resize(graphics.getWidth(), graphics.getHeight()); |
28 |
| - buffer.begin(); |
29 |
| - }); |
30 |
| - |
31 |
| - Draw.draw(Layer.max, () -> { |
32 |
| - buffer.end(); |
33 |
| - |
34 |
| - if(zones.size >= GravitationalLensingShader.len) PMShaders.createBlackholeShader(); |
35 |
| - |
36 |
| - float[] blackholes = new float[zones.size * 4]; |
37 |
| - float[] colors = new float[zones.size * 4]; |
38 |
| - for(int i = 0; i < zones.size; i++){ |
39 |
| - BlackHoleZone zone = zones.get(i); |
40 |
| - blackholes[i * 4] = zone.x; |
41 |
| - blackholes[i * 4 + 1] = zone.y; |
42 |
| - blackholes[i * 4 + 2] = zone.inRadius; |
43 |
| - blackholes[i * 4 + 3] = zone.outRadius; |
44 |
| - |
45 |
| - Tmp.c1.abgr8888(zone.color); |
46 |
| - colors[i * 4] = Tmp.c1.r; |
47 |
| - colors[i * 4 + 1] = Tmp.c1.g; |
48 |
| - colors[i * 4 + 2] = Tmp.c1.b; |
49 |
| - colors[i * 4 + 3] = Tmp.c1.a; |
50 |
| - } |
51 |
| - PMShaders.blackHole.blackholes = blackholes; |
52 |
| - buffer.blit(PMShaders.blackHole); |
53 |
| - |
54 |
| - PMShaders.accretionDisk.blackholes = blackholes; |
55 |
| - PMShaders.accretionDisk.colors = colors; |
56 |
| - buffer.begin(); |
57 |
| - Draw.rect(); |
58 |
| - buffer.end(); |
59 |
| - |
60 |
| - Bloom bloom = renderer.bloom; |
61 |
| - if(bloom != null){ |
62 |
| - bloom.capture(); |
63 |
| - buffer.blit(PMShaders.accretionDisk); |
64 |
| - bloom.render(); |
65 |
| - }else{ |
66 |
| - buffer.blit(PMShaders.accretionDisk); |
67 |
| - } |
68 |
| - |
69 |
| - zones.clear(); |
70 |
| - }); |
| 27 | + if(this.advanced){ |
| 28 | + advancedDraw(); |
| 29 | + }else{ |
| 30 | + simplifiedDraw(); |
| 31 | + } |
71 | 32 | });
|
72 | 33 | }
|
73 | 34 |
|
| 35 | + public void advancedDraw(){ |
| 36 | + Draw.draw(Layer.min + 0.01f, () -> { |
| 37 | + buffer.resize(graphics.getWidth(), graphics.getHeight()); |
| 38 | + buffer.begin(); |
| 39 | + }); |
| 40 | + |
| 41 | + Draw.draw(Layer.max, () -> { |
| 42 | + buffer.end(); |
| 43 | + |
| 44 | + if(zones.size >= GravitationalLensingShader.len) PMShaders.createBlackholeShader(); |
| 45 | + |
| 46 | + float[] blackholes = new float[zones.size * 4]; |
| 47 | + float[] colors = new float[zones.size * 4]; |
| 48 | + for(int i = 0; i < zones.size; i++){ |
| 49 | + BlackHoleZone zone = zones.get(i); |
| 50 | + blackholes[i * 4] = zone.x; |
| 51 | + blackholes[i * 4 + 1] = zone.y; |
| 52 | + blackholes[i * 4 + 2] = zone.inRadius; |
| 53 | + blackholes[i * 4 + 3] = zone.outRadius; |
| 54 | + |
| 55 | + Tmp.c1.abgr8888(zone.color); |
| 56 | + colors[i * 4] = Tmp.c1.r; |
| 57 | + colors[i * 4 + 1] = Tmp.c1.g; |
| 58 | + colors[i * 4 + 2] = Tmp.c1.b; |
| 59 | + colors[i * 4 + 3] = Tmp.c1.a; |
| 60 | + } |
| 61 | + PMShaders.blackHole.blackholes = blackholes; |
| 62 | + buffer.blit(PMShaders.blackHole); |
| 63 | + |
| 64 | + PMShaders.blackholeRim.blackholes = blackholes; |
| 65 | + PMShaders.blackholeRim.colors = colors; |
| 66 | + buffer.begin(); |
| 67 | + Draw.rect(); |
| 68 | + buffer.end(); |
| 69 | + |
| 70 | + Bloom bloom = renderer.bloom; |
| 71 | + if(bloom != null){ |
| 72 | + bloom.capture(); |
| 73 | + buffer.blit(PMShaders.blackholeRim); |
| 74 | + bloom.render(); |
| 75 | + }else{ |
| 76 | + buffer.blit(PMShaders.blackholeRim); |
| 77 | + } |
| 78 | + zones.clear(); |
| 79 | + }); |
| 80 | + } |
| 81 | + |
| 82 | + public void simplifiedDraw(){ |
| 83 | + for(BlackHoleZone zone : zones){ |
| 84 | + float rad = zone.inRadius * 4; |
| 85 | + Fill.light( |
| 86 | + zone.x, zone.y, |
| 87 | + Lines.circleVertices(rad), rad, |
| 88 | + Tmp.c1.abgr8888(zone.color), Tmp.c2.set(Tmp.c1).a(0f) |
| 89 | + ); |
| 90 | + } |
| 91 | + Draw.color(Color.black); |
| 92 | + for(BlackHoleZone zone : zones){ |
| 93 | + Fill.circle(zone.x, zone.y, zone.inRadius); |
| 94 | + } |
| 95 | + Draw.color(); |
| 96 | + zones.clear(); |
| 97 | + } |
| 98 | + |
| 99 | + public void toggleAdvanced(boolean advanced){ |
| 100 | + this.advanced = advanced; |
| 101 | + if(advanced){ |
| 102 | + buffer = new FrameBuffer(); |
| 103 | + }else{ |
| 104 | + if(buffer != null) buffer.dispose(); |
| 105 | + } |
| 106 | + } |
| 107 | + |
74 | 108 | public void add(float x, float y, float inRadius, float outRadius, Color color){
|
75 | 109 | if(inRadius > outRadius || outRadius <= 0) return;
|
76 | 110 |
|
|
0 commit comments