package net.anzix.fsz;
import java.awt.EventQueue;
import java.net.URL;
import java.util.Stack;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.ardor3d.annotation.MainThread;
import com.ardor3d.example.ExampleBase;
import com.ardor3d.example.PropertiesDialog;
import com.ardor3d.example.PropertiesGameSettings;
import com.ardor3d.framework.DisplaySettings;
import com.ardor3d.framework.FrameHandler;
import com.ardor3d.framework.NativeCanvas;
import com.ardor3d.framework.Scene;
import com.ardor3d.framework.lwjgl.LwjglCanvas;
import com.ardor3d.framework.lwjgl.LwjglCanvasRenderer;
import com.ardor3d.input.MouseManager;
import com.ardor3d.input.PhysicalLayer;
import com.ardor3d.input.logical.LogicalLayer;
import com.ardor3d.input.lwjgl.LwjglControllerWrapper;
import com.ardor3d.input.lwjgl.LwjglKeyboardWrapper;
import com.ardor3d.input.lwjgl.LwjglMouseManager;
import com.ardor3d.input.lwjgl.LwjglMouseWrapper;
import com.ardor3d.intersection.PickResults;
import com.ardor3d.intersection.PrimitivePickResults;
import com.ardor3d.math.Ray3;
import com.ardor3d.renderer.Renderer;
import com.ardor3d.renderer.TextureRendererFactory;
import com.ardor3d.renderer.lwjgl.LwjglTextureRendererProvider;
import com.ardor3d.renderer.pass.BasicPassManager;
import com.ardor3d.renderer.pass.RenderPass;
import com.ardor3d.renderer.state.LightState;
import com.ardor3d.renderer.state.WireframeState;
import com.ardor3d.scenegraph.Node;
import com.ardor3d.util.ContextGarbageCollector;
import com.ardor3d.util.GameTaskQueue;
import com.ardor3d.util.GameTaskQueueManager;
import com.ardor3d.util.Timer;
import com.ardor3d.util.resource.ResourceLocatorTool;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import net.anzix.fsz.element.Sun;
import net.anzix.fsz.eventbus.EventBus;
import net.anzix.fsz.player.Player;
import net.anzix.fsz.voxelworld.DetailLevel;
import net.anzix.fsz.voxelworld.VoxelBlockPool;
import net.anzix.fsz.voxelworld.VoxelWorld;
import net.anzix.fsz.voxelworld.layers.LayerBlockPool;
import net.anzix.fsz.world.FlatTerrain;
import net.anzix.fsz.world.Physics;
import net.anzix.fsz.world.Terrain;
public class App implements Scene {
private MouseManager _mouseManager;
private static final Logger logger = Logger.getLogger(ExampleBase.class.getName());
private final LogicalLayer _logicalLayer = new LogicalLayer();
private PhysicalLayer _physicalLayer;
private final Timer _timer = new Timer();
private final FrameHandler _frameHandler = new FrameHandler(_timer);
private DisplaySettings _settings;
private final Node _root = new Node();
private LightState _lightState;
private WireframeState _wireframeState;
private static boolean _stereo = false;
private NativeCanvas _canvas;
private static int _minDepthBits = -1;
private static int _minAlphaBits = -1;
private static int _minStencilBits = -1;
private Injector injector;
@Inject
private EventBus eventBus;
@Inject
private NodeRepository nodeRepository;
BasicPassManager passManager = new BasicPassManager();
VoxelWorld voxelWorld;
@MainThread
public boolean renderUnto(final Renderer renderer) {
// Execute renderQueue item
GameTaskQueueManager.getManager(_canvas.getCanvasRenderer().getRenderContext()).getQueue(GameTaskQueue.RENDER).execute(renderer);
// Clean up card garbage such as textures, vbos, etc.
ContextGarbageCollector.doRuntimeCleanup(renderer);
/** Draw the rootNode and all its children. */
if (!_canvas.isClosing()) {
/** Call renderExample in any derived classes. */
voxelWorld.getShadow().initShadowPass(renderer);
passManager.renderPasses(renderer);
//_root.onDraw(renderer);
//renderer.renderBuckets();
//renderer.draw(hud);
return true;
} else {
return false;
}
}
public PickResults doPick(final Ray3 pickRay) {
final PrimitivePickResults pickResults = new PrimitivePickResults();
return pickResults;
}
public static void main(String[] args) {
// Ask for properties
final PropertiesGameSettings prefs = getAttributes(new PropertiesGameSettings("ardorSettings.properties", null));
// Convert to DisplayProperties (XXX: maybe merge these classes?)
final DisplaySettings settings = new DisplaySettings(prefs.getWidth(), prefs.getHeight(), prefs.getDepth(),
prefs.getFrequency(),
// alpha
_minAlphaBits != -1 ? _minAlphaBits : prefs.getAlphaBits(),
// depth
_minDepthBits != -1 ? _minDepthBits : prefs.getDepthBits(),
// stencil
_minStencilBits != -1 ? _minStencilBits : prefs.getStencilBits(),
// samples
prefs.getSamples(),
// other
prefs.isFullscreen(), _stereo);
App app = new App();
app._settings = settings;
app.start();
}
/*public URL getMapTile(int posx, int posy, DetailLevel level) {
if (level.getLevelID() >= VoxelWorld.NUM_OF_BLOCK_LEVELS)
return null;
VoxelWorld voxelWorldForMap = new VoxelWorld(null);
LayerBlockPool layerBlockPool = (LayerBlockPool) voxelWorldForMap.getLayerPoolContainer().get(level.getLevelID());
VoxelBlockPool voxelBlockPool = (VoxelBlockPool) voxelWorldForMap.getVoxelPoolContainer().get(level.getLevelID());
return null;
} */
public void start() {
// get our framework
final LwjglCanvasRenderer canvasRenderer = new LwjglCanvasRenderer(this);
_canvas = new LwjglCanvas( _settings, canvasRenderer);
_physicalLayer = new PhysicalLayer(new LwjglKeyboardWrapper(), new LwjglMouseWrapper(),
new LwjglControllerWrapper(), (LwjglCanvas) _canvas);
_mouseManager = new LwjglMouseManager();
TextureRendererFactory.INSTANCE.setProvider(new LwjglTextureRendererProvider());
_logicalLayer.registerInput(_canvas, _physicalLayer);
MainUpdater updater = new MainUpdater(_mouseManager, _lightState, _wireframeState, _canvas, _logicalLayer, _timer, passManager);
// Register our example as an updater.
_frameHandler.addUpdater(updater);
// register our native canvas
_frameHandler.addCanvas(_canvas);
//
voxelWorld = updater.getVoxelWorld();
injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Terrain.class).to(FlatTerrain.class).asEagerSingleton();
}
});
injector.injectMembers(this);
injector.injectMembers(updater);
nodeRepository.addNode(NodeRepository.ROOT_NODE, _root);
eventBus.registerListener(injector.getInstance(Physics.class));
eventBus.registerListener(injector.getInstance(Sun.class));
eventBus.registerListener(injector.getInstance(Terrain.class));
eventBus.registerListener(injector.getInstance(Player.class));
net.anzix.fsz.MainThread thread = new net.anzix.fsz.MainThread(_frameHandler, _canvas);
eventBus.registerListener(thread);
final RenderPass rootPass = new RenderPass();
rootPass.add(_root);
passManager.add(rootPass);
new Thread(thread).start();
}
protected static PropertiesGameSettings getAttributes(final PropertiesGameSettings settings) {
// Always show the dialog in these examples.
URL dialogImage = null;
final String dflt = settings.getDefaultSettingsWidgetImage();
if (dflt != null) {
try {
dialogImage = ResourceLocatorTool.getClassPathResource(ExampleBase.class, dflt);
} catch (final Exception e) {
logger.log(Level.SEVERE, "Resource lookup of '" + dflt + "' failed. Proceeding.");
}
}
if (dialogImage == null) {
logger.fine("No dialog image loaded");
} else {
logger.fine("Using dialog image '" + dialogImage + "'");
}
final URL dialogImageRef = dialogImage;
final AtomicReference<PropertiesDialog> dialogRef = new AtomicReference<PropertiesDialog>();
final Stack<Runnable> mainThreadTasks = new Stack<Runnable>();
try {
if (EventQueue.isDispatchThread()) {
dialogRef.set(new PropertiesDialog(settings, dialogImageRef, mainThreadTasks));
} else {
EventQueue.invokeLater(new Runnable() {
public void run() {
dialogRef.set(new PropertiesDialog(settings, dialogImageRef, mainThreadTasks));
}
});
}
} catch (final Exception e) {
logger.logp(Level.SEVERE, ExampleBase.class.getClass().toString(), "ExampleBase.getAttributes(settings)",
"Exception", e);
return null;
}
PropertiesDialog dialogCheck = dialogRef.get();
while (dialogCheck == null || dialogCheck.isVisible()) {
try {
// check worker queue for work
while (!mainThreadTasks.isEmpty()) {
mainThreadTasks.pop().run();
}
// go back to sleep for a while
Thread.sleep(50);
} catch (final InterruptedException e) {
logger.warning("Error waiting for dialog system, using defaults.");
}
dialogCheck = dialogRef.get();
}
if (dialogCheck.isCancelled()) {
System.exit(0);
}
return settings;
}
}