1 /* 2 * To change this template, choose Tools | Templates and open the template in 3 * the editor. 4 */ 5 package jme3test.batching; 6 7 import com.jme3.app.SimpleApplication; 8 import com.jme3.input.KeyInput; 9 import com.jme3.input.controls.ActionListener; 10 import com.jme3.input.controls.KeyTrigger; 11 import com.jme3.material.Material; 12 import com.jme3.math.ColorRGBA; 13 import com.jme3.math.FastMath; 14 import com.jme3.math.Quaternion; 15 import com.jme3.math.Vector3f; 16 import com.jme3.post.FilterPostProcessor; 17 import com.jme3.post.filters.BloomFilter; 18 import com.jme3.scene.*; 19 import com.jme3.scene.debug.Arrow; 20 import com.jme3.scene.shape.Box; 21 import com.jme3.system.AppSettings; 22 import com.jme3.system.NanoTimer; 23 import java.util.ArrayList; 24 import java.util.Random; 25 26 public class TestBatchNodeCluster extends SimpleApplication { 27 main(String[] args)28 public static void main(String[] args) { 29 TestBatchNodeCluster app = new TestBatchNodeCluster(); 30 settingst = new AppSettings(true); 31 //settingst.setFrameRate(75); 32 settingst.setResolution(640, 480); 33 settingst.setVSync(false); 34 settingst.setFullscreen(false); 35 app.setSettings(settingst); 36 app.setShowSettings(false); 37 app.start(); 38 } 39 private ActionListener al = new ActionListener() { 40 41 public void onAction(String name, boolean isPressed, float tpf) { 42 if (name.equals("Start Game")) { 43 // randomGenerator(); 44 } 45 } 46 }; 47 protected Random rand = new Random(); 48 protected int maxCubes = 2000; 49 protected int startAt = 0; 50 protected static int xPositions = 0, yPositions = 0, zPositions = 0; 51 protected int returner = 0; 52 protected ArrayList<Integer> xPosition = new ArrayList<Integer>(); 53 protected ArrayList<Integer> yPosition = new ArrayList<Integer>(); 54 protected ArrayList<Integer> zPosition = new ArrayList<Integer>(); 55 protected int xLimitf = 60, xLimits = -60, yLimitf = 60, yLimits = -20, zLimitf = 60, zLimits = -60; 56 protected int circ = 8;//increases by 8 every time. 57 protected int dynamic = 4; 58 protected static AppSettings settingst; 59 protected boolean isTrue = true; 60 private int lineLength = 50; 61 protected BatchNode batchNode; 62 Material mat1; 63 Material mat2; 64 Material mat3; 65 Material mat4; 66 Node terrain; 67 //protected 68 // protected Geometry player; 69 70 @Override simpleInitApp()71 public void simpleInitApp() { 72 timer = new NanoTimer(); 73 74 batchNode = new SimpleBatchNode("BatchNode"); 75 76 77 xPosition.add(0); 78 yPosition.add(0); 79 zPosition.add(0); 80 81 mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 82 mat1.setColor("Color", ColorRGBA.White); 83 mat1.setColor("GlowColor", ColorRGBA.Blue.mult(10)); 84 85 mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 86 mat2.setColor("Color", ColorRGBA.White); 87 mat2.setColor("GlowColor", ColorRGBA.Red.mult(10)); 88 89 mat3 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 90 mat3.setColor("Color", ColorRGBA.White); 91 mat3.setColor("GlowColor", ColorRGBA.Yellow.mult(10)); 92 93 mat4 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 94 mat4.setColor("Color", ColorRGBA.White); 95 mat4.setColor("GlowColor", ColorRGBA.Orange.mult(10)); 96 97 randomGenerator(); 98 99 //rootNode.attachChild(SkyFactory.createSky( 100 // assetManager, "Textures/SKY02.zip", false)); 101 inputManager.addMapping("Start Game", new KeyTrigger(KeyInput.KEY_J)); 102 inputManager.addListener(al, new String[]{"Start Game"}); 103 104 105 cam.setLocation(new Vector3f(-34.403286f, 126.65158f, 434.791f)); 106 cam.setRotation(new Quaternion(0.022630932f, 0.9749435f, -0.18736298f, 0.11776358f)); 107 108 109 batchNode.batch(); 110 111 112 terrain = new Node("terrain"); 113 terrain.setLocalTranslation(50, 0, 50); 114 terrain.attachChild(batchNode); 115 116 flyCam.setMoveSpeed(100); 117 rootNode.attachChild(terrain); 118 Vector3f pos = new Vector3f(-40, 0, -40); 119 batchNode.setLocalTranslation(pos); 120 121 122 Arrow a = new Arrow(new Vector3f(0, 50, 0)); 123 Geometry g = new Geometry("a", a); 124 g.setLocalTranslation(terrain.getLocalTranslation()); 125 Material m = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 126 m.setColor("Color", ColorRGBA.Blue); 127 g.setMaterial(m); 128 129 130 131 FilterPostProcessor fpp = new FilterPostProcessor(assetManager); 132 fpp.addFilter(new BloomFilter(BloomFilter.GlowMode.Objects)); 133 // SSAOFilter ssao = new SSAOFilter(8.630104f,22.970434f,2.9299977f,0.2999997f); 134 // fpp.addFilter(ssao); 135 viewPort.addProcessor(fpp); 136 // viewPort.setBackgroundColor(ColorRGBA.DarkGray); 137 } 138 randomGenerator()139 public void randomGenerator() { 140 for (int i = startAt; i < maxCubes - 1; i++) { 141 randomize(); 142 Geometry box = new Geometry("Box" + i, new Box(Vector3f.ZERO, 1, 1, 1)); 143 box.setLocalTranslation(new Vector3f(xPosition.get(xPosition.size() - 1), 144 yPosition.get(yPosition.size() - 1), 145 zPosition.get(zPosition.size() - 1))); 146 batchNode.attachChild(box); 147 if (i < 500) { 148 box.setMaterial(mat1); 149 } else if (i < 1000) { 150 151 box.setMaterial(mat2); 152 } else if (i < 1500) { 153 154 box.setMaterial(mat3); 155 } else { 156 157 box.setMaterial(mat4); 158 } 159 160 } 161 } 162 163 // public BatchNode randomBatch() { 164 // 165 // int randomn = rand.nextInt(4); 166 // if (randomn == 0) { 167 // return blue; 168 // } else if (randomn == 1) { 169 // return brown; 170 // } else if (randomn == 2) { 171 // return pink; 172 // } else if (randomn == 3) { 173 // return orange; 174 // } 175 // return null; 176 // } randomColor()177 public ColorRGBA randomColor() { 178 ColorRGBA color = ColorRGBA.Black; 179 int randomn = rand.nextInt(4); 180 if (randomn == 0) { 181 color = ColorRGBA.Orange; 182 } else if (randomn == 1) { 183 color = ColorRGBA.Blue; 184 } else if (randomn == 2) { 185 color = ColorRGBA.Brown; 186 } else if (randomn == 3) { 187 color = ColorRGBA.Magenta; 188 } 189 return color; 190 } 191 randomize()192 public void randomize() { 193 int xpos = xPosition.get(xPosition.size() - 1); 194 int ypos = yPosition.get(yPosition.size() - 1); 195 int zpos = zPosition.get(zPosition.size() - 1); 196 int x = 0; 197 int y = 0; 198 int z = 0; 199 boolean unTrue = true; 200 while (unTrue) { 201 unTrue = false; 202 boolean xChanged = false; 203 x = 0; 204 y = 0; 205 z = 0; 206 if (xpos >= lineLength * 2) { 207 x = 2; 208 xChanged = true; 209 } else { 210 x = xPosition.get(xPosition.size() - 1) + 2; 211 } 212 if (xChanged) { 213 //y = yPosition.get(yPosition.size() - lineLength) + 2; 214 } else { 215 y = rand.nextInt(3); 216 if (yPosition.size() > lineLength) { 217 if (yPosition.size() > 51) { 218 if (y == 0 && ypos < yLimitf && getym(lineLength) > ypos - 2) { 219 y = ypos + 2; 220 } else if (y == 1 && ypos > yLimits && getym(lineLength) < ypos + 2) { 221 y = ypos - 2; 222 } else if (y == 2 && getym(lineLength) > ypos - 2 && getym(lineLength) < ypos + 2) { 223 y = ypos; 224 } else { 225 if (ypos >= yLimitf) { 226 y = ypos - 2; 227 } else if (ypos <= yLimits) { 228 y = ypos + 2; 229 } else if (y == 0 && getym(lineLength) >= ypos - 4) { 230 y = ypos - 2; 231 } else if (y == 0 && getym(lineLength) >= ypos - 2) { 232 y = ypos; 233 } else if (y == 1 && getym(lineLength) >= ypos + 4) { 234 y = ypos + 2; 235 } else if (y == 1 && getym(lineLength) >= ypos + 2) { 236 y = ypos; 237 } else if (y == 2 && getym(lineLength) <= ypos - 2) { 238 y = ypos - 2; 239 } else if (y == 2 && getym(lineLength) >= ypos + 2) { 240 y = ypos + 2; 241 } else { 242 System.out.println("wtf"); 243 } 244 } 245 } else if (yPosition.size() == lineLength) { 246 if (y == 0 && ypos < yLimitf) { 247 y = getym(lineLength) + 2; 248 } else if (y == 1 && ypos > yLimits) { 249 y = getym(lineLength) - 2; 250 } 251 } 252 } else { 253 if (y == 0 && ypos < yLimitf) { 254 y = ypos + 2; 255 } else if (y == 1 && ypos > yLimits) { 256 y = ypos - 2; 257 } else if (y == 2) { 258 y = ypos; 259 } else if (y == 0 && ypos >= yLimitf) { 260 y = ypos - 2; 261 } else if (y == 1 && ypos <= yLimits) { 262 y = ypos + 2; 263 } 264 } 265 } 266 if (xChanged) { 267 z = zpos + 2; 268 } else { 269 z = zpos; 270 } 271 // for (int i = 0; i < xPosition.size(); i++) 272 // { 273 // if (x - xPosition.get(i) <= 1 && x - xPosition.get(i) >= -1 && 274 // y - yPosition.get(i) <= 1 && y - yPosition.get(i) >= -1 275 // &&z - zPosition.get(i) <= 1 && z - zPosition.get(i) >= 276 // -1) 277 // { 278 // unTrue = true; 279 // } 280 // } 281 } 282 xPosition.add(x); 283 yPosition.add(y); 284 zPosition.add(z); 285 } 286 getxm(int i)287 public int getxm(int i) { 288 return xPosition.get(xPosition.size() - i); 289 } 290 getym(int i)291 public int getym(int i) { 292 return yPosition.get(yPosition.size() - i); 293 } 294 getzm(int i)295 public int getzm(int i) { 296 return zPosition.get(zPosition.size() - i); 297 } 298 getx(int i)299 public int getx(int i) { 300 return xPosition.get(i); 301 } 302 gety(int i)303 public int gety(int i) { 304 return yPosition.get(i); 305 } 306 getz(int i)307 public int getz(int i) { 308 return zPosition.get(i); 309 } 310 long nbFrames = 0; 311 long cullTime = 0; 312 float time = 0; 313 Vector3f lookAtPos = new Vector3f(0, 0, 0); 314 float xpos = 0; 315 Spatial box; 316 317 @Override simpleUpdate(float tpf)318 public void simpleUpdate(float tpf) { 319 time += tpf; 320 int random = rand.nextInt(2000); 321 float mult1 = 1.0f; 322 float mult2 = 1.0f; 323 if (random < 500) { 324 mult1 = 1.0f; 325 mult2 = 1.0f; 326 } else if (random < 1000) { 327 mult1 = -1.0f; 328 mult2 = 1.0f; 329 } else if (random < 1500) { 330 mult1 = 1.0f; 331 mult2 = -1.0f; 332 } else if (random <= 2000) { 333 mult1 = -1.0f; 334 mult2 = -1.0f; 335 } 336 box = batchNode.getChild("Box" + random); 337 if (box != null) { 338 Vector3f v = box.getLocalTranslation(); 339 box.setLocalTranslation(v.x + FastMath.sin(time * mult1) * 20, v.y + (FastMath.sin(time * mult1) * FastMath.cos(time * mult1) * 20), v.z + FastMath.cos(time * mult2) * 20); 340 } 341 terrain.setLocalRotation(new Quaternion().fromAngleAxis(time, Vector3f.UNIT_Y)); 342 343 344 } 345 } 346