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.pipeline; 012 013import javax.swing.JFrame; 014import javax.swing.JScrollPane; 015import javax.swing.JSplitPane; 016import javax.swing.JTextArea; 017import javax.swing.JTree; 018import javax.swing.event.TreeModelListener; 019import javax.swing.event.TreeSelectionEvent; 020import javax.swing.event.TreeSelectionListener; 021import javax.swing.tree.TreeModel; 022import javax.swing.tree.TreePath; 023 024import com.ardor3d.scenegraph.Mesh; 025import com.ardor3d.scenegraph.Node; 026import com.ardor3d.scenegraph.Spatial; 027import com.ardor3d.scenegraph.hint.SceneHints; 028 029public class ScenegraphTree { 030 031 public void show(final Node node) { 032 final JFrame frame = new JFrame("Scenegraph Tree"); 033 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 034 035 final TreeModel model = new ArdorModel(node); 036 final JTree tree = new JTree(model); 037 038 final JScrollPane scrollPane = new JScrollPane(tree); 039 040 final JTextArea textArea = new JTextArea(20, 40); 041 042 final TreeSelectionListener listener = new ArdorListener(textArea); 043 tree.addTreeSelectionListener(listener); 044 045 final JSplitPane splitPane = new JSplitPane(); 046 splitPane.setLeftComponent(scrollPane); 047 splitPane.setRightComponent(textArea); 048 049 frame.getContentPane().add(splitPane); 050 051 frame.pack(); 052 frame.setVisible(true); 053 } 054 055 private static class ArdorListener implements TreeSelectionListener { 056 JTextArea textArea; 057 058 public ArdorListener(final JTextArea textArea) { 059 this.textArea = textArea; 060 } 061 062 @Override 063 public void valueChanged(final TreeSelectionEvent e) { 064 if (e.getNewLeadSelectionPath() == null || e.getNewLeadSelectionPath().getLastPathComponent() == null) { 065 return; 066 } 067 068 final Spatial spatial = (Spatial) e.getNewLeadSelectionPath().getLastPathComponent(); 069 070 final StringBuilder str = new StringBuilder(); 071 072 str.append(spatial.getName()); 073 str.append(" - "); 074 str.append(spatial.getClass().getName()).append('\n'); 075 076 if (spatial instanceof Mesh) { 077 final Mesh mesh = (Mesh) spatial; 078 str.append("Primitives: "); 079 str.append(mesh.getMeshData().getTotalPrimitiveCount()).append('\n'); 080 str.append("Index mode: "); 081 str.append(mesh.getMeshData().getIndexMode(0)).append('\n'); 082 } 083 084 str.append(spatial.getTransform()).append('\n'); 085 if (spatial.getWorldBound() != null) { 086 str.append(spatial.getWorldBound()).append('\n'); 087 } 088 089 str.append('\n'); 090 final SceneHints sceneHints = spatial.getSceneHints(); 091 str.append("Cull hint: "); 092 str.append(sceneHints.getCullHint()).append('\n'); 093 str.append("Bucket: "); 094 str.append(sceneHints.getRenderBucketType()).append('\n'); 095 096 textArea.setText(str.toString()); 097 } 098 } 099 100 private static class ArdorModel implements TreeModel { 101 private final Node rootNode; 102 103 public ArdorModel(final Node node) { 104 rootNode = node; 105 } 106 107 @Override 108 public Object getChild(final Object parent, final int index) { 109 if (parent instanceof Node) { 110 final Node parentNode = (Node) parent; 111 return parentNode.getChild(index); 112 } 113 return null; 114 } 115 116 @Override 117 public int getChildCount(final Object parent) { 118 if (parent instanceof Node) { 119 final Node parentNode = (Node) parent; 120 return parentNode.getNumberOfChildren(); 121 } 122 return 0; 123 } 124 125 @Override 126 public int getIndexOfChild(final Object parent, final Object child) { 127 if (parent instanceof Node && child instanceof Spatial) { 128 final Node parentNode = (Node) parent; 129 return parentNode.getChildIndex((Spatial) child); 130 } 131 return 0; 132 } 133 134 @Override 135 public Object getRoot() { 136 return rootNode; 137 } 138 139 @Override 140 public boolean isLeaf(final Object node) { 141 return !(node instanceof Node); 142 } 143 144 @Override 145 public void addTreeModelListener(final TreeModelListener l) {} 146 147 @Override 148 public void removeTreeModelListener(final TreeModelListener l) {} 149 150 @Override 151 public void valueForPathChanged(final TreePath path, final Object newValue) {} 152 } 153}