Starsector API
Loading...
Searching...
No Matches
TurbulenceCalc.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.velfield;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.util.Misc;
6
7public class TurbulenceCalc {
8
9 public static Vector2f [] DIRECTIONS = new Vector2f[8];
10 static {
11 for (int i = 0; i < 8; i++) {
12 float angle = i * 45f + 180f;
13 DIRECTIONS[i] = Misc.getUnitVectorAtDegreeAngle(angle);
14 }
15 }
16
17// protected VelocityField field;
18// protected float propagationSpeed;
19//
20// public TurbulenceCalc(VelocityField field, float propagationSpeed) {
21// this.field = field;
22// this.propagationSpeed = propagationSpeed;
23// }
24
25
26 public static void advance(VelocityField field, float propagationSpeed, float amount) {
27
28 Vector2f[][] f = field.getField();
29
30 Vector2f[][] delta = new Vector2f[f.length][f[0].length];
31 for (int i = 0; i < f.length; i++) {
32 for (int j = 0; j < f[0].length; j++) {
33 delta[i][j] = new Vector2f();
34 }
35 }
36 Vector2f[][] delta2 = new Vector2f[f.length][f[0].length];
37 for (int i = 0; i < f.length; i++) {
38 for (int j = 0; j < f[0].length; j++) {
39 delta2[i][j] = new Vector2f();
40 }
41 }
42
43 //Vector2f[][] d = field.getDelta();
44
45 float mult = propagationSpeed * amount;
46 for (int i = 0; i < f.length; i++) {
47 for (int j = 0; j < f[0].length; j++) {
48
49 addCell(f, delta, i + 1, j + 0, i, j, DIRECTIONS[0], mult);
50 addCell(f, delta, i + 1, j + 1, i, j, DIRECTIONS[1], mult);
51 addCell(f, delta, i + 0, j + 1, i, j, DIRECTIONS[2], mult);
52 addCell(f, delta, i - 1, j + 1, i, j, DIRECTIONS[3], mult);
53 addCell(f, delta, i - 1, j + 0, i, j, DIRECTIONS[4], mult);
54 addCell(f, delta, i - 1, j - 1, i, j, DIRECTIONS[5], mult);
55 addCell(f, delta, i - 0, j - 1, i, j, DIRECTIONS[6], mult);
56 addCell(f, delta, i + 1, j - 1, i, j, DIRECTIONS[7], mult);
57 //Misc.wiggle(d[i][j], d[i][j].length() * 0.1f);
58 }
59 }
60
61 mult = -1f;
62 for (int i = 0; i < f.length; i++) {
63 for (int j = 0; j < f[0].length; j++) {
64 addCell(delta, delta2, i + 1, j + 0, i, j, DIRECTIONS[0], mult);
65 addCell(delta, delta2, i + 1, j + 1, i, j, DIRECTIONS[1], mult);
66 addCell(delta, delta2, i + 0, j + 1, i, j, DIRECTIONS[2], mult);
67 addCell(delta, delta2, i - 1, j + 1, i, j, DIRECTIONS[3], mult);
68 addCell(delta, delta2, i - 1, j + 0, i, j, DIRECTIONS[4], mult);
69 addCell(delta, delta2, i - 1, j - 1, i, j, DIRECTIONS[5], mult);
70 addCell(delta, delta2, i - 0, j - 1, i, j, DIRECTIONS[6], mult);
71 addCell(delta, delta2, i + 1, j - 1, i, j, DIRECTIONS[7], mult);
72 //Misc.wiggle(d[i][j], d[i][j].length() * 0.1f);
73 }
74 }
75
76// for (int i = 0; i < f.length; i++) {
77// for (int j = 0; j < f[0].length; j++) {
78// Misc.wiggle(delta[i][j], delta[i][j].length() * 0.1f);
79// Misc.wiggle(delta2[i][j], delta2[i][j].length() * 0.1f);
80// }
81// }
82
83 for (int i = 0; i < f.length; i++) {
84 for (int j = 0; j < f[0].length; j++) {
85 Vector2f.add(f[i][j], delta[i][j], f[i][j]);
86// Vector2f.add(f[i][j], delta2[i][j], f[i][j]);
87// float len = f[i][j].length();
88// if (len > 70f) {
89// f[i][j].scale(70f/len);
90// }
91 }
92 }
93
94 }
95
96 public static Vector2f getCell(Vector2f [][] data, int i, int j) {
97 if (i < 0 || j < 0) return new Vector2f();
98 if (i >= data.length || j >= data[0].length) return new Vector2f();
99 return data[i][j];
100 }
101
102 public static void addCell(Vector2f[][] field, Vector2f[][] delta, int fromX, int fromY, int x, int y, Vector2f dir, float propagationMult) {
103 Vector2f cell = getCell(field, fromX, fromY);
104 Vector2f d = getCell(delta, x, y);
105 Vector2f dFrom = getCell(delta, fromX, fromY);
106 float dot = Vector2f.dot(cell, dir);
107
108 d.x += dir.x * dot * propagationMult;
109 d.y += dir.y * dot * propagationMult;
110
111 dFrom.x -= dir.x * dot * propagationMult;
112 dFrom.y -= dir.y * dot * propagationMult;
113 }
114
115 public static void addCell(Vector2f cell, Vector2f dir, Vector2f delta) {
116 float dot = Vector2f.dot(cell, dir);
117 delta.x += dir.x * dot;
118 delta.y += dir.y * dot;
119 }
120}
121
122
123
124
125
126
127
static void addCell(Vector2f cell, Vector2f dir, Vector2f delta)
static void addCell(Vector2f[][] field, Vector2f[][] delta, int fromX, int fromY, int x, int y, Vector2f dir, float propagationMult)
static Vector2f getCell(Vector2f[][] data, int i, int j)
static void advance(VelocityField field, float propagationSpeed, float amount)