All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ardor3d.example.basic.LwjglHeadlessExample Maven / Gradle / Ivy

/**
 * Copyright (c) 2008-2012 Ardor Labs, Inc.
 *
 * This file is part of Ardor3D.
 *
 * Ardor3D is free software: you can redistribute it and/or modify it 
 * under the terms of its license which may be found in the accompanying
 * LICENSE file or at .
 */

package com.ardor3d.example.basic;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.net.URISyntaxException;
import java.nio.IntBuffer;
import java.util.concurrent.Callable;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

import com.ardor3d.bounding.BoundingBox;
import com.ardor3d.example.Purpose;
import com.ardor3d.framework.DisplaySettings;
import com.ardor3d.framework.Scene;
import com.ardor3d.framework.lwjgl.LwjglHeadlessCanvas;
import com.ardor3d.image.Texture;
import com.ardor3d.image.util.awt.AWTImageLoader;
import com.ardor3d.intersection.PickResults;
import com.ardor3d.light.PointLight;
import com.ardor3d.math.ColorRGBA;
import com.ardor3d.math.MathUtils;
import com.ardor3d.math.Matrix3;
import com.ardor3d.math.Ray3;
import com.ardor3d.math.Vector3;
import com.ardor3d.renderer.Renderer;
import com.ardor3d.renderer.state.LightState;
import com.ardor3d.renderer.state.TextureState;
import com.ardor3d.renderer.state.ZBufferState;
import com.ardor3d.scenegraph.Node;
import com.ardor3d.scenegraph.Spatial;
import com.ardor3d.scenegraph.controller.SpatialController;
import com.ardor3d.scenegraph.shape.Box;
import com.ardor3d.util.GameTaskQueue;
import com.ardor3d.util.GameTaskQueueManager;
import com.ardor3d.util.TextureManager;
import com.ardor3d.util.Timer;
import com.ardor3d.util.resource.ResourceLocatorTool;
import com.ardor3d.util.resource.SimpleResourceLocator;

/**
 * 

* A demonstration of the LwjglHeadlessCanvas class, which is canvas used to draw Scene data to an offscreen target. *

* *

* Also of note, this example does not allow choosing of properties on launch. It also does not handle input or show any * special debugging. This is to simplify the example to the basic essentials. *

*/ @Purpose(htmlDescriptionKey = "com.ardor3d.example.basic.LwjglHeadlessExample", // thumbnailPath = "com/ardor3d/example/media/thumbnails/basic_LwjglHeadlessExample.jpg", // maxHeapMemory = 64) public class LwjglHeadlessExample implements Scene { // Our headless canvas private final LwjglHeadlessCanvas canvas; // Our timer. private final Timer timer = new Timer(); // The root of our scene private final Node _root = new Node(); // The settings for our canvas private final DisplaySettings settings; // A label we'll set our image into for viewing. private final JLabel label; // The frame we'll show to the user. private final JFrame frame; // The buffered image we'll reuse. private final BufferedImage labelImage; // A int array we'll reuse when transferring data between opengl and the labelImage. private final int[] tmpData; private boolean run = true; /** * Our main entry point to the example. News up the example and calls start. * * @param args * unused. */ public static void main(final String[] args) { final LwjglHeadlessExample example = new LwjglHeadlessExample(); example.start(); } /** * Constructs the example class, creating our frame, label, bufferedimage and the headless canvas. */ public LwjglHeadlessExample() { // Setup our headless canvas for rendering. // settings = new DisplaySettings(800, 600, 0, 0, 0, 16, 0, 4, false, false); // use this to try MSAA settings = new DisplaySettings(800, 600, 0, 0, 0, 16, 0, 0, false, false); canvas = new LwjglHeadlessCanvas(settings, this); canvas.getRenderer().setBackgroundColor(ColorRGBA.BLACK_NO_ALPHA); // Set up an image to show our 3d content in. labelImage = new BufferedImage(settings.getWidth(), settings.getHeight(), BufferedImage.TYPE_INT_ARGB); tmpData = ((DataBufferInt) labelImage.getRaster().getDataBuffer()).getData(); // Set up a frame and label with icon to show our image in. frame = new JFrame("Headless Example - close window to exit"); frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); label = new JLabel("View of Headless Content:"); label.setVerticalTextPosition(SwingConstants.TOP); label.setHorizontalTextPosition(SwingConstants.CENTER); label.setIcon(new ImageIcon(labelImage)); frame.getContentPane().add(label); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { GameTaskQueueManager.getManager(canvas).render(new Callable() { @Override public Void call() throws Exception { run = false; return null; } }); } }); } /** * Kicks off the example logic, first setting up the scene, then continuously updating and rendering. */ private void start() { initExample(); while (run) { updateExample(); GameTaskQueueManager.getManager(canvas).getQueue(GameTaskQueue.RENDER).execute(); if (run) { // still run? canvas.draw(); } else { break; } final IntBuffer data = canvas.getDataBuffer(); final int width = settings.getWidth(); for (int x = settings.getHeight(); --x >= 0;) { data.get(tmpData, x * width, width); } label.setIcon(new ImageIcon(labelImage)); } canvas.cleanup(); System.exit(0); } /** * Initialize our scene. */ private void initExample() { // Make a box... final Box _box = new Box("Box", Vector3.ZERO, 5, 5, 5); // Setup a bounding box for it -- updateModelBound is called automatically internally. _box.setModelBound(new BoundingBox()); // Set its location in space. _box.setTranslation(new Vector3(0, 0, -25)); // Add to root. _root.attachChild(_box); // set it to rotate: _box.addController(new SpatialController() { private final Vector3 _axis = new Vector3(1, 1, 0.5f).normalizeLocal(); private final Matrix3 _rotate = new Matrix3(); private double _angle = 0; public void update(final double time, final Spatial caller) { // update our rotation _angle = _angle + (timer.getTimePerFrame() * 25); if (_angle > 180) { _angle = -180; } _rotate.fromAngleNormalAxis(_angle * MathUtils.DEG_TO_RAD, _axis); _box.setRotation(_rotate); } }); // Add our awt based image loader. AWTImageLoader.registerLoader(); // Set the location of our example resources. try { final SimpleResourceLocator srl = new SimpleResourceLocator(ResourceLocatorTool.getClassPathResource( LwjglHeadlessExample.class, "com/ardor3d/example/media/")); ResourceLocatorTool.addResourceLocator(ResourceLocatorTool.TYPE_TEXTURE, srl); } catch (final URISyntaxException ex) { ex.printStackTrace(); } // Create a ZBuffer to display pixels closest to the camera above farther ones. final ZBufferState buf = new ZBufferState(); buf.setEnabled(true); buf.setFunction(ZBufferState.TestFunction.LessThanOrEqualTo); _root.setRenderState(buf); // Create a texture from the Ardor3D logo. final TextureState ts = new TextureState(); ts.setEnabled(true); ts.setTexture(TextureManager.load("images/ardor3d_white_256.jpg", Texture.MinificationFilter.Trilinear, true)); _root.setRenderState(ts); // Set up a basic, default light. final PointLight light = new PointLight(); light.setDiffuse(new ColorRGBA(0.75f, 0.75f, 0.75f, 0.75f)); light.setAmbient(new ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f)); light.setLocation(new Vector3(100, 100, 100)); light.setEnabled(true); // Attach the light to a lightState and the lightState to rootNode. final LightState lightState = new LightState(); lightState.setEnabled(true); lightState.attach(light); _root.setRenderState(lightState); } // Used for calculating fps. private double counter = 0; private int frames = 0; /** * Update our scene... Update our timer, print the current fps (once per second) and finally update the geometric * state of the root and its children. */ private void updateExample() { timer.update(); GameTaskQueueManager.getManager(canvas).getQueue(GameTaskQueue.UPDATE).execute(); counter += timer.getTimePerFrame(); frames++; if (counter > 1) { final double fps = (frames / counter); counter = 0; frames = 0; System.out.printf("%7.1f FPS\n", fps); } // Update controllers/render states/transforms/bounds for rootNode. _root.updateGeometricState(timer.getTimePerFrame(), true); } // ------ Scene methods ------ public boolean renderUnto(final Renderer renderer) { // Draw the root and all its children. renderer.draw(_root); return true; } public PickResults doPick(final Ray3 pickRay) { // Ignore return null; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy