001package com.fs.starfarer.api.util; 002 003import java.util.Random; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.graphics.SpriteAPI; 008 009public class JitterUtil { 010 011 public static void renderWithJitter(SpriteAPI s, float x, float y, float maxJitter, int numCopies) { 012 for (int i = 0; i < numCopies; i++) { 013 Vector2f jv = new Vector2f(); 014 jv.x = (float) Math.random() * maxJitter - maxJitter/2f; 015 jv.y = (float) Math.random() * maxJitter - maxJitter/2f; 016 //if (jv.lengthSquared() != 0) jv.normalise(); 017 s.renderAtCenter(x + jv.x, y + jv.y); 018 } 019 } 020 021 private long seed = Misc.genRandomSeed(); 022 private Random random = new Random(seed); 023 024 public void updateSeed() { 025 //seed = (long)(Math.random() * 1000000000f); 026 seed = Misc.genRandomSeed(); 027 } 028 029 public Random getRandom() { 030 random.setSeed(seed); 031 return random; 032 } 033 034 public void render(SpriteAPI s, float x, float y, float maxJitter, int numCopies) { 035 render(s, x, y, 0f, maxJitter, numCopies); 036 } 037 038 private boolean setSeedOnRender = true; 039 private boolean circular; 040 public boolean isSetSeedOnRender() { 041 return setSeedOnRender; 042 } 043 044 public void setSetSeedOnRender(boolean resetSeedOnRender) { 045 this.setSeedOnRender = resetSeedOnRender; 046 } 047 048 public void setUseCircularJitter(boolean circular) { 049 this.circular = circular; 050 } 051 052 public void render(SpriteAPI s, float x, float y, float minJitter, float maxJitter, int numCopies) { 053 if (setSeedOnRender) { 054 random.setSeed(seed); 055 } 056 for (int i = 0; i < numCopies; i++) { 057 Vector2f jv = new Vector2f(); 058 059// if (true) { 060// float r = minJitter + (maxJitter - minJitter) * (float) random.nextFloat(); 061// r *= 0.5f; 062// float angle = (float) ((float) random.nextFloat() * Math.PI * 2f); 063// float jx = (float) Math.cos(angle) * r; 064// float jy = (float) Math.sin(angle) * r; 065// s.renderAtCenter(x + jx, y + jy); 066// continue; 067// } 068 069 if (circular) { 070 float r = minJitter + (maxJitter - minJitter) * (float) random.nextFloat(); 071 jv = Misc.getPointAtRadius(jv, r, random); 072 } else { 073 if (minJitter <= 0) { 074 jv.x = random.nextFloat() * maxJitter - maxJitter/2f; 075 jv.y = random.nextFloat() * maxJitter - maxJitter/2f; 076 } else { 077 jv.x = random.nextFloat() * (maxJitter - minJitter) + minJitter; 078 jv.y = random.nextFloat() * (maxJitter - minJitter) + minJitter; 079 if (jv.x < minJitter) jv.x = minJitter; 080 if (jv.y < minJitter) jv.y = minJitter; 081 jv.x *= Math.signum(random.nextFloat() - 0.5f); 082 jv.y *= Math.signum(random.nextFloat() - 0.5f); 083 } 084 } 085 //if (jv.lengthSquared() != 0) jv.normalise(); 086 s.renderAtCenter(x + jv.x, y + jv.y); 087 } 088 } 089}