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}