001package com.fs.starfarer.api.impl.campaign.velfield;
002
003import org.lwjgl.util.vector.Vector2f;
004
005import com.fs.starfarer.api.util.Misc;
006
007public class TurbulenceCalc {
008        
009        public static Vector2f [] DIRECTIONS = new Vector2f[8];
010        static {
011                for (int i = 0; i < 8; i++) {
012                        float angle = i * 45f + 180f;
013                        DIRECTIONS[i] = Misc.getUnitVectorAtDegreeAngle(angle);
014                }
015        }
016
017//      protected VelocityField field;
018//      protected float propagationSpeed;
019//
020//      public TurbulenceCalc(VelocityField field, float propagationSpeed) {
021//              this.field = field;
022//              this.propagationSpeed = propagationSpeed;
023//      }
024        
025        
026        public static void advance(VelocityField field, float propagationSpeed, float amount) {
027                
028                Vector2f[][] f = field.getField();
029                
030                Vector2f[][] delta = new Vector2f[f.length][f[0].length];
031                for (int i = 0; i < f.length; i++) {
032                        for (int j = 0; j < f[0].length; j++) {
033                                delta[i][j] = new Vector2f();
034                        }
035                }
036                Vector2f[][] delta2 = new Vector2f[f.length][f[0].length];
037                for (int i = 0; i < f.length; i++) {
038                        for (int j = 0; j < f[0].length; j++) {
039                                delta2[i][j] = new Vector2f();
040                        }
041                }
042                
043                //Vector2f[][] d = field.getDelta();
044                
045                float mult = propagationSpeed * amount;
046                for (int i = 0; i < f.length; i++) {
047                        for (int j = 0; j < f[0].length; j++) {
048                                
049                                addCell(f, delta, i + 1, j + 0, i, j, DIRECTIONS[0], mult);
050                                addCell(f, delta, i + 1, j + 1, i, j, DIRECTIONS[1], mult);
051                                addCell(f, delta, i + 0, j + 1, i, j, DIRECTIONS[2], mult);
052                                addCell(f, delta, i - 1, j + 1, i, j, DIRECTIONS[3], mult);
053                                addCell(f, delta, i - 1, j + 0, i, j, DIRECTIONS[4], mult);
054                                addCell(f, delta, i - 1, j - 1, i, j, DIRECTIONS[5], mult);
055                                addCell(f, delta, i - 0, j - 1, i, j, DIRECTIONS[6], mult);
056                                addCell(f, delta, i + 1, j - 1, i, j, DIRECTIONS[7], mult);
057                                //Misc.wiggle(d[i][j], d[i][j].length() * 0.1f);
058                        }
059                }
060                
061                mult = -1f;
062                for (int i = 0; i < f.length; i++) {
063                        for (int j = 0; j < f[0].length; j++) {
064                                addCell(delta, delta2, i + 1, j + 0, i, j, DIRECTIONS[0], mult);
065                                addCell(delta, delta2, i + 1, j + 1, i, j, DIRECTIONS[1], mult);
066                                addCell(delta, delta2, i + 0, j + 1, i, j, DIRECTIONS[2], mult);
067                                addCell(delta, delta2, i - 1, j + 1, i, j, DIRECTIONS[3], mult);
068                                addCell(delta, delta2, i - 1, j + 0, i, j, DIRECTIONS[4], mult);
069                                addCell(delta, delta2, i - 1, j - 1, i, j, DIRECTIONS[5], mult);
070                                addCell(delta, delta2, i - 0, j - 1, i, j, DIRECTIONS[6], mult);
071                                addCell(delta, delta2, i + 1, j - 1, i, j, DIRECTIONS[7], mult);
072                                //Misc.wiggle(d[i][j], d[i][j].length() * 0.1f);
073                        }
074                }
075
076//              for (int i = 0; i < f.length; i++) {
077//                      for (int j = 0; j < f[0].length; j++) {
078//                              Misc.wiggle(delta[i][j], delta[i][j].length() * 0.1f);
079//                              Misc.wiggle(delta2[i][j], delta2[i][j].length() * 0.1f);
080//                      }
081//              }
082                
083                for (int i = 0; i < f.length; i++) {
084                        for (int j = 0; j < f[0].length; j++) {
085                                Vector2f.add(f[i][j], delta[i][j], f[i][j]);
086//                              Vector2f.add(f[i][j], delta2[i][j], f[i][j]);
087//                              float len = f[i][j].length();
088//                              if (len > 70f) {
089//                                      f[i][j].scale(70f/len);
090//                              }
091                        }
092                }
093                
094        }
095        
096        public static Vector2f getCell(Vector2f [][] data, int i, int j) {
097                if (i < 0 || j < 0) return new Vector2f();
098                if (i >= data.length || j >= data[0].length) return new Vector2f();
099                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