/* * Copyright (c) 2005–2012 Goethe Center for Scientific Computing - Simulation and Modelling (G-CSC Frankfurt) * Copyright (c) 2012-2015 Goethe Center for Scientific Computing - Computational Neuroscience (G-CSC Frankfurt) * * This file is part of NeuGen. * * NeuGen is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. * * see: http://opensource.org/licenses/LGPL-3.0 * file://path/to/NeuGen/LICENSE * * NeuGen is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * This version of NeuGen includes copyright notice and attribution requirements. * According to the LGPL this information must be displayed even if you modify * the source code of NeuGen. The copyright statement/attribution may not be removed. * * Attribution Requirements: * * If you create derived work you must do the following regarding copyright * notice and author attribution. * * Add an additional notice, stating that you modified NeuGen. In addition * you must cite the publications listed below. A suitable notice might read * "NeuGen source code modified by YourName 2012". * * Note, that these requirements are in full accordance with the LGPL v3 * (see 7. Additional Terms, b). * * Publications: * * S. Wolf, S. Grein, G. Queisser. NeuGen 2.0 - * Employing NeuGen 2.0 to automatically generate realistic * morphologies of hippocapal neurons and neural networks in 3D. * Neuroinformatics, 2013, 11(2), pp. 137-148, doi: 10.1007/s12021-012-9170-1 * * * J. P. Eberhard, A. Wanner, G. Wittum. NeuGen - * A tool for the generation of realistic morphology * of cortical neurons and neural networks in 3D. * Neurocomputing, 70(1-3), pp. 327-343, doi: 10.1016/j.neucom.2006.01.028 * */ /* * MainApp.java * * Created on March 10, 2007 * */ package org.neugen.surface3d; import java.applet.Applet; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GraphicsConfiguration; import javax.media.j3d.Background; import javax.media.j3d.BoundingSphere; import javax.media.j3d.BranchGroup; import javax.media.j3d.Canvas3D; import javax.media.j3d.ImageComponent2D; import javax.vecmath.Point3d; import org.neugen.datastructures.VolumeOfVoxels; import org.neugen.geometry3d.Cube3dCreator; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.behaviors.vp.OrbitBehavior; import com.sun.j3d.utils.universe.SimpleUniverse; import com.sun.j3d.utils.universe.ViewingPlatform; import java.util.Vector; import javax.media.j3d.Material; import org.neugen.geometry3d.Triangle3dCreator; import org.neugen.simpletriangulation.Triangle; /** * * @author Jens P Eberhard */ @SuppressWarnings("serial") public final class MainApp extends Applet { private static int FrameWidth = 600; private static int FrameHeight = 700; private SimpleUniverse simpleU; ///////////////////////////////////////////////// // // create scene graph branch group // public BranchGroup createSceneGraph(boolean wireFrame) { int VOV_L = 42; // dimensions of volume of voxels 50 int VOV_W = 42; int VOV_H = 42; BranchGroup contentRoot = new BranchGroup(); ColorUtil.addCoordinateSphereAxesToSceneGraph(contentRoot, 0.01f); VolumeOfVoxels vv = new VolumeOfVoxels(VOV_L, VOV_W, VOV_H); vv.fillVolumeOfSphere(true); /* Simple visualization by triangles */ Vector<Triangle> triangleVector = new Vector<Triangle>(); Util.triangulation(vv.getVoxelsValueAsFloatArray(), VOV_L, VOV_W, VOV_H, triangleVector); Triangle3dCreator triangleCreator = new Triangle3dCreator(ColorUtil.grey); for (Triangle t : triangleVector) { triangleCreator.addTriangleToContainer( t.getP1AsScaledPoint3f(1.0f / VOV_L, 1.0f / VOV_W, 1.0f / VOV_H), t.getP2AsScaledPoint3f(1.0f / VOV_L, 1.0f / VOV_W, 1.0f / VOV_H), t.getP3AsScaledPoint3f(1.0f / VOV_L, 1.0f / VOV_W, 1.0f / VOV_H)); //t.printData(); } contentRoot.addChild(triangleCreator.getTriangleContainer()); /* Simple visualization by boxes */ Material mat = new Material(); mat.setEmissiveColor(ColorUtil.red); Cube3dCreator cubeCreator = new Cube3dCreator(0.05f, 0.05f, 0.05f, mat, 0.0f); // vv.addAllTagedVoxelsToContainer(cubeCreator); contentRoot.addChild(cubeCreator.getCubeContainer()); /* For cube testing */ contentRoot.addChild(cubeCreator.getCubeAsShapeOfQuadArrays(0.1f, 0.1f, 0.1f)); contentRoot.addChild(cubeCreator.getCubeAsBox(0.15f, 0.15f, 0.15f)); Background background = new Background(new ImageComponent2D(ImageComponent2D.FORMAT_RGB, ColorUtil.createColoredGradientImage(FrameWidth, FrameHeight))); background.setApplicationBounds(new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0)); contentRoot.addChild(background); contentRoot.compile(); return contentRoot; } /** Creates a new instance of MainApp * Create a simple scene and attach it to the virtual universe * */ public MainApp(String[] args) { setLayout(new BorderLayout()); GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas3D = new Canvas3D(config); add("Center", canvas3D); // SimpleUniverse is a Convenience Utility class simpleU = new SimpleUniverse(canvas3D); // This will move the ViewPlatform back a bit so the // objects in the scene can be viewed. simpleU.getViewingPlatform().setNominalViewingTransform(); BranchGroup scene = createSceneGraph(args.length > 0); orbitControls(canvas3D); simpleU.addBranchGraph(scene); } private void orbitControls(Canvas3D canvas3D) { OrbitBehavior orbit = new OrbitBehavior(canvas3D, OrbitBehavior.REVERSE_ALL); orbit.setSchedulingBounds(new BoundingSphere()); ViewingPlatform vp = simpleU.getViewingPlatform(); vp.setViewPlatformBehavior(orbit); } /** * The following allows this to be run as an application as well as an applet * * @param args the command line arguments */ public static void main(String[] args) { @SuppressWarnings("unused") Frame frame = new MainFrame(new MainApp(args), FrameWidth, FrameHeight); } }