001/** 002 * Copyright (c) 2008-2014 Ardor Labs, Inc. 003 * 004 * This file is part of Ardor3D. 005 * 006 * Ardor3D is free software: you can redistribute it and/or modify it 007 * under the terms of its license which may be found in the accompanying 008 * LICENSE file or at <http://www.ardor3d.com/LICENSE>. 009 */ 010 011package com.ardor3d.example.canvas; 012 013import java.awt.Dimension; 014import java.awt.GridLayout; 015import java.awt.event.WindowAdapter; 016import java.awt.event.WindowEvent; 017import java.io.IOException; 018import java.net.URISyntaxException; 019import java.util.HashMap; 020import java.util.Map; 021 022import javax.swing.JFrame; 023import javax.swing.JLabel; 024import javax.swing.SwingConstants; 025 026import com.ardor3d.example.Purpose; 027import com.ardor3d.framework.Canvas; 028import com.ardor3d.framework.DisplaySettings; 029import com.ardor3d.framework.FrameHandler; 030import com.ardor3d.framework.jogl.JoglCanvasRenderer; 031import com.ardor3d.framework.jogl.awt.JoglAwtCanvas; 032import com.ardor3d.image.util.awt.AWTImageLoader; 033import com.ardor3d.input.ControllerWrapper; 034import com.ardor3d.input.Key; 035import com.ardor3d.input.MouseCursor; 036import com.ardor3d.input.PhysicalLayer; 037import com.ardor3d.input.awt.AwtFocusWrapper; 038import com.ardor3d.input.awt.AwtKeyboardWrapper; 039import com.ardor3d.input.awt.AwtMouseManager; 040import com.ardor3d.input.awt.AwtMouseWrapper; 041import com.ardor3d.input.logical.DummyControllerWrapper; 042import com.ardor3d.input.logical.InputTrigger; 043import com.ardor3d.input.logical.KeyPressedCondition; 044import com.ardor3d.input.logical.LogicalLayer; 045import com.ardor3d.input.logical.TriggerAction; 046import com.ardor3d.input.logical.TwoInputStates; 047import com.ardor3d.util.Timer; 048import com.ardor3d.util.resource.ResourceLocatorTool; 049import com.ardor3d.util.resource.SimpleResourceLocator; 050 051/** 052 * This examples demonstrates how to render OpenGL (via JOGL) on a AWT canvas. 053 */ 054@Purpose(htmlDescriptionKey = "com.ardor3d.example.canvas.JoglAwtExample", // 055thumbnailPath = "com/ardor3d/example/media/thumbnails/canvas_JoglAwtExample.jpg", // 056maxHeapMemory = 64) 057public class JoglAwtExample { 058 static MouseCursor _cursor1; 059 static MouseCursor _cursor2; 060 061 static Map<Canvas, Boolean> _showCursor1 = new HashMap<>(); 062 063 public static void main(final String[] args) throws Exception { 064 System.setProperty("ardor3d.useMultipleContexts", "true"); 065 066 final Timer timer = new Timer(); 067 final FrameHandler frameWork = new FrameHandler(timer); 068 069 final MyExit exit = new MyExit(); 070 final LogicalLayer logicalLayer = new LogicalLayer(); 071 072 final ExampleScene scene1 = new ExampleScene(); 073 final RotatingCubeGame game1 = new RotatingCubeGame(scene1, exit, logicalLayer, Key.T); 074 075 final ExampleScene scene2 = new ExampleScene(); 076 final RotatingCubeGame game2 = new RotatingCubeGame(scene2, exit, logicalLayer, Key.G); 077 078 frameWork.addUpdater(game1); 079 frameWork.addUpdater(game2); 080 081 final JFrame frame = new JFrame("AWT Example"); 082 frame.addWindowListener(new WindowAdapter() { 083 @Override 084 public void windowClosing(final WindowEvent e) { 085 exit.exit(); 086 } 087 }); 088 089 frame.setLayout(new GridLayout(2, 3)); 090 091 AWTImageLoader.registerLoader(); 092 093 try { 094 final SimpleResourceLocator srl = new SimpleResourceLocator(ResourceLocatorTool.getClassPathResource( 095 JoglAwtExample.class, "com/ardor3d/example/media/")); 096 ResourceLocatorTool.addResourceLocator(ResourceLocatorTool.TYPE_TEXTURE, srl); 097 } catch (final URISyntaxException ex) { 098 ex.printStackTrace(); 099 } 100 101 final AWTImageLoader awtImageLoader = new AWTImageLoader(); 102 _cursor1 = createMouseCursor(awtImageLoader, "com/ardor3d/example/media/input/wait_cursor.png"); 103 _cursor2 = createMouseCursor(awtImageLoader, "com/ardor3d/example/media/input/movedata.gif"); 104 105 addCanvas(frame, scene1, logicalLayer, frameWork); 106 frame.add(new JLabel( 107 "<html>" 108 + "<table>" 109 + "<tr><th align=\"left\" style=\"font-size: 16\">Action</th><th align=\"left\" style=\"font-size: 16\">Command</th></tr>" 110 + "<tr><td>WS</td><td>Move camera position forward/back</td></tr>" 111 + "<tr><td>AD</td><td>Turn camera left/right</td></tr>" 112 + "<tr><td>T</td><td>Toggle cube rotation for scene 1 on press</td></tr>" 113 + "<tr><td>G</td><td>Toggle cube rotation for scene 2 on press</td></tr>" 114 + "<tr><td>U</td><td>Toggle both cube rotations on release</td></tr>" 115 + "<tr><td>0 (zero)</td><td>Reset camera position</td></tr>" 116 + "<tr><td>9</td><td>Face camera towards cube without changing position</td></tr>" 117 + "<tr><td>ESC</td><td>Quit</td></tr>" 118 + "<tr><td>Mouse</td><td>Press left button to rotate camera.</td></tr>" + "</table>" 119 + "</html>", SwingConstants.CENTER)); 120 addCanvas(frame, scene1, logicalLayer, frameWork); 121 frame.add(new JLabel("", SwingConstants.CENTER)); 122 addCanvas(frame, scene2, logicalLayer, frameWork); 123 frame.add(new JLabel("", SwingConstants.CENTER)); 124 125 frame.pack(); 126 frame.setVisible(true); 127 128 game1.init(); 129 game2.init(); 130 131 while (!exit.isExit()) { 132 frameWork.updateFrame(); 133 Thread.yield(); 134 } 135 136 frame.dispose(); 137 System.exit(0); 138 } 139 140 private static MouseCursor createMouseCursor(final AWTImageLoader awtImageLoader, final String resourceName) 141 throws IOException { 142 final com.ardor3d.image.Image image = awtImageLoader.load( 143 ResourceLocatorTool.getClassPathResourceAsStream(JoglAwtExample.class, resourceName), false); 144 145 return new MouseCursor("cursor1", image, 0, image.getHeight() - 1); 146 } 147 148 private static void addCanvas(final JFrame frame, final ExampleScene scene, final LogicalLayer logicalLayer, 149 final FrameHandler frameWork) throws Exception { 150 final JoglCanvasRenderer canvasRenderer = new JoglCanvasRenderer(scene); 151 152 final DisplaySettings settings = new DisplaySettings(400, 300, 24, 0, 0, 16, 0, 0, false, false); 153 final JoglAwtCanvas theCanvas = new JoglAwtCanvas(settings, canvasRenderer); 154 155 frame.add(theCanvas); 156 157 _showCursor1.put(theCanvas, true); 158 159 theCanvas.setSize(new Dimension(400, 300)); 160 theCanvas.setVisible(true); 161 162 final AwtKeyboardWrapper keyboardWrapper = new AwtKeyboardWrapper(theCanvas); 163 final AwtFocusWrapper focusWrapper = new AwtFocusWrapper(theCanvas); 164 final AwtMouseManager mouseManager = new AwtMouseManager(theCanvas); 165 final AwtMouseWrapper mouseWrapper = new AwtMouseWrapper(theCanvas, mouseManager); 166 theCanvas.setMouseManager(mouseManager); 167 final ControllerWrapper controllerWrapper = new DummyControllerWrapper(); 168 169 final PhysicalLayer pl = new PhysicalLayer(keyboardWrapper, mouseWrapper, controllerWrapper, focusWrapper); 170 171 logicalLayer.registerInput(theCanvas, pl); 172 173 logicalLayer.registerTrigger(new InputTrigger(new KeyPressedCondition(Key.H), new TriggerAction() { 174 @Override 175 public void perform(final Canvas source, final TwoInputStates inputStates, final double tpf) { 176 if (source != theCanvas) { 177 return; 178 } 179 180 if (_showCursor1.get(theCanvas)) { 181 mouseManager.setCursor(_cursor1); 182 } else { 183 mouseManager.setCursor(_cursor2); 184 } 185 186 _showCursor1.put(theCanvas, !_showCursor1.get(theCanvas)); 187 } 188 })); 189 logicalLayer.registerTrigger(new InputTrigger(new KeyPressedCondition(Key.J), new TriggerAction() { 190 @Override 191 public void perform(final Canvas source, final TwoInputStates inputStates, final double tpf) { 192 if (source != theCanvas) { 193 return; 194 } 195 196 mouseManager.setCursor(MouseCursor.SYSTEM_DEFAULT); 197 } 198 })); 199 200 frameWork.addCanvas(theCanvas); 201 202 } 203 204 private static class MyExit implements Exit { 205 private volatile boolean exit = false; 206 207 @Override 208 public void exit() { 209 exit = true; 210 } 211 212 public boolean isExit() { 213 return exit; 214 } 215 } 216}