Skip to content

Commit

Permalink
WIP #12: Added DamconCanvas, wireframed model, embedded in main windo…
Browse files Browse the repository at this point in the history
…w/JFrame

- Moved existing UI down to mimic built-in engineering console and make
  room for damcon and other sliders
- The current process of creating a J3D Universe generates a Viewer
  which in turn generates its own JFrame (because it wasn't given a
  Canvas).  We need to figure out how the default canvas is generated,
  make one ourselves, and pass that through (WIP function checked in
  as well but it doesn't work). In the worst case, we might be able to
  pass the J3D JFrame through to the console manager and just reuse it.
  • Loading branch information
jacobmaxfrank committed Jan 11, 2016
1 parent e99109a commit 9a9d881
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 39 deletions.
32 changes: 8 additions & 24 deletions src/com/brindyblitz/artemis/ClientMain.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
package com.brindyblitz.artemis;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import com.brindyblitz.artemis.engconsole.EngineeringConsoleManager;
import com.brindyblitz.artemis.engconsole.FakeEngineeringConsoleManager;
import com.brindyblitz.artemis.engconsole.RealEngineeringConsoleManager;
import com.brindyblitz.artemis.engconsole.ui.UserInterfaceFrame;
import com.brindyblitz.artemis.engconsole.ui.damcon.DamconCanvas;
import com.brindyblitz.artemis.protocol.WorldAwareRobustProxyListener;
import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.universe.SimpleUniverse;

import javax.media.j3d.Canvas3D;
import java.io.IOException;

public class ClientMain {
public static void main(String[] args) throws IOException {
Expand Down Expand Up @@ -49,28 +44,17 @@ public static void main(String[] args) throws IOException {

public ClientMain() {
EngineeringConsoleManager engineeringConsoleManager = new FakeEngineeringConsoleManager();
buildUIFrame(engineeringConsoleManager);
String OBJ_PATH = new File(System.getProperty("user.dir"), "art/models/obj-from-blender/artemis2.obj").getPath();

SimpleUniverse universe = new SimpleUniverse();
universe.getViewingPlatform().setNominalViewingTransform();
try {
Scene scene = new ObjectFile(ObjectFile.RESIZE).load(OBJ_PATH);
universe.addBranchGraph(scene.getSceneGroup());
} catch (FileNotFoundException | IncorrectFormatException | ParsingErrorException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
buildUIFrame(engineeringConsoleManager, DamconCanvas.buildDamconCanvas());
}

public ClientMain(String host, int port) throws IOException {
WorldAwareRobustProxyListener worldAwareRobustProxyListener = new WorldAwareRobustProxyListener(host, port, port);
EngineeringConsoleManager engineeringConsoleManager = new RealEngineeringConsoleManager(worldAwareRobustProxyListener);
buildUIFrame(engineeringConsoleManager);
buildUIFrame(engineeringConsoleManager, DamconCanvas.buildDamconCanvas());
}

private static void buildUIFrame(EngineeringConsoleManager engineeringConsoleManager) {
new UserInterfaceFrame(engineeringConsoleManager).setVisible(true);
private static void buildUIFrame(EngineeringConsoleManager engineeringConsoleManager, Canvas3D damcon_canvas) {
new UserInterfaceFrame(engineeringConsoleManager, damcon_canvas).setVisible(true);
}

private static void printUsage() {
Expand Down
37 changes: 22 additions & 15 deletions src/com/brindyblitz/artemis/engconsole/ui/UserInterfaceFrame.java
Original file line number Diff line number Diff line change
@@ -1,42 +1,46 @@
package com.brindyblitz.artemis.engconsole.ui;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;

import javax.swing.JFrame;

import com.brindyblitz.artemis.engconsole.EngineeringConsoleManager;
import com.brindyblitz.artemis.engconsole.config.InputMapping;

import net.dhleong.acl.enums.ShipSystem;

import javax.media.j3d.Canvas3D;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;

import static net.dhleong.acl.enums.ShipSystem.*;

public class UserInterfaceFrame extends JFrame implements KeyListener{
public class UserInterfaceFrame extends JFrame implements KeyListener {

private static final long serialVersionUID = 1L;
private EngineeringConsoleManager engineeringConsoleManager;
private int numSliders = 0;
private long lastResetEnergy;

// TODO: constant cleanup!
private static final int
WINDOW_WIDTH = 1024,
WINDOW_HEIGHT = 768,
SLIDER_OFFSET_MULTIPLIER = 125,
SLIDER_OFFSET_ADDITIONAL = 25,
MAIN_SLIDER_Y = 200,
HEAT_SLIDER_Y = 150,
HEALTH_SLIDER_Y = 120;
DAMCON_Y = 10,
HEALTH_SLIDER_Y = 250,
HEAT_SLIDER_Y = HEALTH_SLIDER_Y + 30,
MAIN_SLIDER_Y = HEAT_SLIDER_Y + 50,
COOLANT_SLIDER_Y = MAIN_SLIDER_Y + 370;

private InputManager inputManager;
private PresetManager presetManager;

private static HashMap<ShipSystem, String> SYSTEM_NAME_MAP = new HashMap<ShipSystem, String>();

public UserInterfaceFrame(EngineeringConsoleManager engineeringConsoleManager) {
public UserInterfaceFrame(EngineeringConsoleManager engineeringConsoleManager, Canvas3D damcon_canvas) {
this.engineeringConsoleManager = engineeringConsoleManager;
setTitle("Artemis: Engineering Console (Client)");
setSize(1024, 768);
setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
getContentPane().setBackground(Color.BLACK);
setLayout(null);
setLocationRelativeTo(null);
Expand All @@ -60,7 +64,10 @@ public UserInterfaceFrame(EngineeringConsoleManager engineeringConsoleManager) {
this.addSlider(mapping.system, SYSTEM_NAME_MAP.get(mapping.system), mapping);
}

this.add(new CoolantRemainingSlider(engineeringConsoleManager)).setLocation(50, 570);
this.add(new CoolantRemainingSlider(engineeringConsoleManager)).setLocation(50, COOLANT_SLIDER_Y);

// TODO: there is still a separate window...
this.getContentPane().add(damcon_canvas).setLocation(10, DAMCON_Y);
}

private void addSlider(ShipSystem system, String label, InputMapping mapping) {
Expand Down
88 changes: 88 additions & 0 deletions src/com/brindyblitz/artemis/engconsole/ui/damcon/DamconCanvas.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.brindyblitz.artemis.engconsole.ui.damcon;

import com.sun.j3d.loaders.IncorrectFormatException;
import com.sun.j3d.loaders.ParsingErrorException;
import com.sun.j3d.loaders.Scene;
import com.sun.j3d.loaders.objectfile.ObjectFile;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.Viewer;
import com.sun.j3d.utils.universe.ViewingPlatform;

import javax.media.j3d.*;
import javax.swing.*;
import javax.vecmath.Color3f;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Enumeration;

public abstract class DamconCanvas {
private static final Color WIREFRAME_COLOR = Color.GREEN;

public static Canvas3D buildDamconCanvas() {
SimpleUniverse universe = new SimpleUniverse();
universe.getViewingPlatform().setNominalViewingTransform();
String OBJ_PATH = new File(System.getProperty("user.dir"), "art/models/obj-from-blender/artemis2.obj").getPath();
try {
Scene scene = new ObjectFile(ObjectFile.RESIZE).load(OBJ_PATH);
wireframeifyScene(scene);
universe.addBranchGraph(scene.getSceneGroup());
} catch (FileNotFoundException | IncorrectFormatException | ParsingErrorException e) {
e.printStackTrace();
}

// TODO: the reason this creates a new window is explained here:
// http://download.java.net/media/java3d/javadoc/1.3.2/com/sun/j3d/utils/universe/Viewer.html
// JFrame unused_frame = universe.getViewer().getJFrame(0);

return universe.getCanvas();
}

public static Canvas3D buildDamconCanvas_WIP() {
GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas = new Canvas3D(config);
Viewer viewer = new Viewer(canvas);
ViewingPlatform viewingPlatform = new ViewingPlatform();
SimpleUniverse universe = new SimpleUniverse(viewingPlatform, viewer);
universe.getViewingPlatform().setNominalViewingTransform();
String OBJ_PATH = new File(System.getProperty("user.dir"), "art/models/obj-from-blender/artemis2.obj").getPath();
try {
Scene scene = new ObjectFile(ObjectFile.RESIZE).load(OBJ_PATH);
wireframeifyScene(scene);
universe.addBranchGraph(scene.getSceneGroup());
} catch (FileNotFoundException | IncorrectFormatException | ParsingErrorException e) {
e.printStackTrace();
}
return canvas;
}

private static void wireframeifyScene(Scene scene) {
Appearance wireframe = getWireframeAppearance();

// TODO: This works for the Artemis OBJ model. If the scene graph has multiple Shape3D nodes, this would need to be set on all of them. Is that necessary or can we guarantee it won't be needed?

Enumeration<Node> children = scene.getSceneGroup().getAllChildren();
while (children.hasMoreElements()) {
Node node = children.nextElement();
if (node.getClass().equals(Shape3D.class)) {
Shape3D s3d = (Shape3D)node;
s3d.setAppearance(wireframe);
}
}
}

private static Appearance getWireframeAppearance() {
Appearance app = new Appearance();
Color awtColor = WIREFRAME_COLOR;
Color3f color = new Color3f(awtColor);
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(color);
app.setColoringAttributes(ca);
PolygonAttributes pa = new PolygonAttributes();
pa.setPolygonMode(pa.POLYGON_LINE);
pa.setCullFace(pa.CULL_NONE);
app.setPolygonAttributes(pa);
return app;
}
}

0 comments on commit 9a9d881

Please sign in to comment.