📄 sceneeditorapplication.java
字号:
//===========================================================================//= This is the main class for a simple 3D editor application, and serves =//= as the main testbed integration for functionalities in the VSDK toolkit =//=-------------------------------------------------------------------------=//= Module history: =//= - Since august 2005 - Oscar Chavarro =//===========================================================================// Java basic classesimport java.io.File;import java.io.FileReader;import java.io.BufferedReader;import java.util.StringTokenizer;import java.util.ArrayList;// Java GUI classesimport java.awt.BorderLayout;import java.awt.Component;import java.awt.Color;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.border.Border;import javax.swing.BorderFactory; import javax.swing.BoxLayout;import javax.swing.JFrame;import javax.swing.JFileChooser;import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JMenuBar;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTabbedPane;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.SwingUtilities;import javax.swing.SingleSelectionModel;import javax.swing.UIManager;import javax.swing.event.ChangeEvent;import javax.swing.event.ChangeListener;// JOGL Classesimport javax.media.opengl.GLCanvas;// VSDK Classesimport vsdk.toolkit.common.ColorRgb;import vsdk.toolkit.common.Matrix4x4;import vsdk.toolkit.common.Ray;import vsdk.toolkit.common.Vector3D;import vsdk.toolkit.common.VSDK;import vsdk.toolkit.gui.ProgressMonitorConsole;import vsdk.toolkit.media.Image;import vsdk.toolkit.media.IndexedColorImage;import vsdk.toolkit.media.RGBImage;import vsdk.toolkit.media.RGBAImage;import vsdk.toolkit.media.RGBColorPalette;import vsdk.toolkit.environment.Camera;import vsdk.toolkit.environment.Material;import vsdk.toolkit.environment.Light;import vsdk.toolkit.environment.geometry.Arrow;import vsdk.toolkit.environment.geometry.VoxelVolume;import vsdk.toolkit.environment.geometry.Box;import vsdk.toolkit.environment.geometry.Cone;import vsdk.toolkit.environment.geometry.Geometry;import vsdk.toolkit.environment.geometry.ParametricCurve;import vsdk.toolkit.environment.geometry.ParametricBiCubicPatch;import vsdk.toolkit.environment.geometry.PolyhedralBoundedSolid;import vsdk.toolkit.environment.geometry.Sphere;import vsdk.toolkit.environment.geometry.TriangleMesh;import vsdk.toolkit.environment.geometry.TriangleMeshGroup;import vsdk.toolkit.environment.scene.SimpleBody;import vsdk.toolkit.environment.scene.SimpleBodyGroup;import vsdk.toolkit.io.XmlException;import vsdk.toolkit.io.geometry.EnvironmentPersistence;import vsdk.toolkit.io.image.RGBColorPalettePersistence;import vsdk.toolkit.io.image.ImagePersistence;import vsdk.toolkit.processing.ImageProcessing;// Internal classesimport vsdk.transition.gui.GuiCache;import vsdk.transition.io.presentation.GuiCachePersistence;import vsdk.transition.render.swing.SwingGuiCacheRenderer;abstract class SuffixAwareFilter extends javax.swing.filechooser.FileFilter { public String getSuffix(File f) { String s = f.getPath(), suffix = null; int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { suffix = s.substring(i + 1).toLowerCase(); } return suffix; } public boolean accept(File f) { return f.isDirectory(); }}class MainThread implements Runnable{ private String args[]; public MainThread(String args[]) { this.args = args; } public void run() { SceneEditorApplication app; app = new SceneEditorApplication(args); }}class MyFilter extends SuffixAwareFilter { private String suffix; private String description; public MyFilter(String suffix, String description) { this.suffix = suffix; this.description = description; } public boolean accept(File f) { boolean accept = super.accept(f); if (!accept) { String _suffix = getSuffix(f); if (suffix != null) { accept = suffix.equals(_suffix); } } return accept; } public String getDescription() { return description + " (*." + suffix + ")"; }}class MyChangeListener implements ChangeListener{ public SceneEditorApplication parent; public MyChangeListener(SceneEditorApplication parent) { this.parent = parent; } public void stateChanged(ChangeEvent e) { SingleSelectionModel sm = (SingleSelectionModel)e.getSource(); if ( sm.getSelectedIndex() == 1 ) { parent.modifyPanelSelected = true; parent.drawingArea.reportTargetToModifyPanel(); } else { parent.modifyPanelSelected = false; } }}public class SceneEditorApplication { // Application model public Scene theScene; public RGBImage raytracedImage; public RGBImage zbufferImage; public int raytracedImageWidth; public int raytracedImageHeight; public RGBColorPalette palette; public boolean withVisualDebugRay; public Ray visualDebugRay; public int visualDebugRayLevels; // Application GUI public GuiCache gui; public JoglDrawingArea drawingArea; public JLabel statusMessage; public JPanel statusBarPanel; public SwingImageControlWindow imageControlWindow; public SwingSelectorDialog selectorDialog; public ButtonsPanel executorPanel; private JFrame mainWindowWidget; private String lookAndFeel; public String languageGuiFile; public ModifyPanel modifyPanel; public boolean modifyPanelSelected; // Networking private VitralEditorServer networkServer; private VitralCommandClient networkCommandClient; private String currentNetworkCommandClientIp; private String currentNetworkCommandClientPort; public void setLookAndFeel(String lookAndFeel) { this.lookAndFeel = lookAndFeel; // Method 1 destroyGUI(); createGUI(); // Method 2: It doesn't work well when the window decoration style // has to change in the main JFrame /* try { UIManager.setLookAndFeel(lookAndFeel); } catch (Exception e) { System.err.println("Warning: Can not set " + lookAndFeel + "look and feel"); } SwingUtilities.updateComponentTreeUI(mainWindowWidget); mainWindowWidget.pack(); */ } /** Could be better: if the Swing GUI is not destroyed, but all labels are renamed... but ... what if language files are not exactly equal? */ public void setGuiLanguage(String lang) { this.languageGuiFile = lang; destroyGUI(); createGUI(); } private void createModel() { //----------------------------------------------------------------- theScene = new Scene(); raytracedImage = new RGBImage(); raytracedImageWidth = 320; raytracedImageHeight = 240; palette = null; try { palette = RGBColorPalettePersistence.importGimpPalette(new java.io.FileReader("../../../etc/palettes/Cranes.gpl")); } catch (Exception e) { System.err.println(e); System.exit(0); } visualDebugRay = new Ray(new Vector3D(0, -3, 0), new Vector3D(0, 1, 0)); visualDebugRayLevels = 2; withVisualDebugRay = false; networkServer = null; networkCommandClient = null; currentNetworkCommandClientIp = "127.0.0.1"; currentNetworkCommandClientPort = "1235"; } private JPanel createStatusBar()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -