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