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}