It took me a while but here’s the code:
Main.java:
package dungeon;
import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.light.DirectionalLight;
import com.jme3.light.PointLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import dungeon.generation.DungeonGen;
public class Main extends SimpleApplication {
PointLight light;
private BulletAppState bulletAppState;
public Spatial straightPart, bentPart;
public static void main(String[] args) {
Main app = new Main();
app.start();
}
@Override
public void simpleInitApp() {
flyCam.setMoveSpeed(70F);
cam.setLocation(new Vector3f(-22.92931f, 2.6491745f, -0.17925507f));
cam.setRotation(new Quaternion(0.03900462f, 0.70585394f, -0.038985994f, 0.70620745f));
/*Spatial testDungeon = assetManager.loadModel("Scenes/Dungeon.j3o");
rootNode.attachChild(testDungeon);*/
Node dungeonParts = new Node();
straightPart = assetManager.loadModel("Models/dungeon_parts/straight.j3o");
DungeonGen.Dungeon dungeon = DungeonGen.generateDungeon(3, 3, this);
dungeon.attachToNode(dungeonParts);
rootNode.attachChild(dungeonParts);
viewPort.setBackgroundColor(ColorRGBA.Blue);
light = new PointLight();
light.setRadius(27F);
rootNode.addLight(light);
DirectionalLight light2 = new DirectionalLight();
light2.setDirection(new Vector3f(1,0,0));
rootNode.addLight(light2);
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
System.out.println("Root node children: " + rootNode.getChildren().size());
}
@Override
public void simpleUpdate(float tpf) {
light.setPosition(cam.getLocation());
}
@Override
public void simpleRender(RenderManager rm) {
//TODO: add render code
}
}
DungeonGen.java:
package dungeon.generation;
import dungeon.generation.parts.DungeonPart;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import dungeon.Main;
import dungeon.generation.parts.StraightPart;
import java.util.Random;
/**
*
* @author grizeldi
*/
public class DungeonGen {
public static class Dungeon{
public static final float DUNGEON_PART_WU_SIZE = 16;
private DungeonPart[][] parts;
public Dungeon(int xSize, int ySize) {
parts = new DungeonPart[xSize][ySize];
}
public DungeonPart[][] getParts() {
return parts;
}
public void attachToNode(Node node){
for (int i = 0; i < parts.length; i++){
for (int j = 0; j < parts[i].length; j++){
Spatial part = parts[i][j].getRepresentation();
System.out.println("adding a part to " + i*DUNGEON_PART_WU_SIZE + ", " + j*DUNGEON_PART_WU_SIZE);
part.setLocalTranslation(i * DUNGEON_PART_WU_SIZE, 0, j * DUNGEON_PART_WU_SIZE);
node.attachChild(part);
}
}
}
private void setPart(DungeonPart part, int index1, int index2){
parts[index1][index2] = part;
}
}
public static Dungeon generateDungeon(int xSize, int ySize, Main m){
Dungeon dungeon = new Dungeon(xSize, ySize);
Random random = new Random();
for (int i = 0; i < xSize; i++){
for (int j = 0; j < ySize; j++){
switch (random.nextInt(1)){
case 0:
//Straight
StraightPart part;
if (random.nextBoolean()){
part = new StraightPart(m, StraightPart.ROTATION_90);
}else {
part = new StraightPart(m, StraightPart.ROTATION_NORMAL);
}
dungeon.setPart(part, i, j);
break;
case 1:
//Bend
break;
}
}
}
return dungeon;
}
}
DungeonPart.java:
package dungeon.generation.parts;
import com.jme3.scene.Spatial;
/**
*
* @author grizeldi
*/
public abstract class DungeonPart {
protected Spatial representation;
public DungeonPart(int orientationCode) {
initOrientation(orientationCode);
}
public DungeonPart() {}
public Spatial getRepresentation() {
return representation;
}
protected abstract void initOrientation(int orientationCode);
}
And StraightPart.java:
package dungeon.generation.parts;
import com.jme3.asset.AssetManager;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import dungeon.Main;
/**
*
* @author grizeldi
*/
public class StraightPart extends DungeonPart{
public static final int ROTATION_NORMAL = 0, ROTATION_90 = 1;
private Quaternion q = new Quaternion();
public StraightPart(Main m, int orientationCode) {
super();
representation = m.straightPart.clone();
}
@Override
protected void initOrientation(int orientationCode) {
if (orientationCode == ROTATION_90){
representation.setLocalRotation(q.fromAngleAxis(90* FastMath.DEG_TO_RAD, Vector3f.UNIT_Y));
}
}
}
I have tried waiting one frame (for worldTransform to be updated), but nothing happened.