From 4113164b3be1e50251ac40d6fd65660f0a6c2e63 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Tue, 11 Jun 2019 18:46:21 -0400 Subject: [PATCH] Compressed undo stack. --- ObjEditor.java | 514 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 371 insertions(+), 143 deletions(-) diff --git a/ObjEditor.java b/ObjEditor.java index a6194b1..13331f4 100644 --- a/ObjEditor.java +++ b/ObjEditor.java @@ -276,24 +276,40 @@ void SetupMenu() { frame.setMenuBar(menuBar = new MenuBar()); - menuBar.add(windowMenu = new Menu("File")); - windowMenu.add(loadItem = new MenuItem("Load...")); - windowMenu.add("-"); - windowMenu.add(saveItem = new MenuItem("Save")); - windowMenu.add(saveAsItem = new MenuItem("Save As...")); + menuBar.add(fileMenu = new Menu("File")); + fileMenu.add(newItem = new MenuItem("New")); + fileMenu.add(loadItem = new MenuItem("Load...")); + + //oe.menuBar.add(menu = new Menu("Include")); + Menu menu = new Menu("Import"); + importOBJItem = menu.add(new MenuItem("OBJ file...")); + importOBJItem.addActionListener(this); + import3DSItem = menu.add(new MenuItem("3DS file...")); + import3DSItem.addActionListener(this); + importVRMLX3DItem = menu.add(new MenuItem("VRML/X3D file...")); + importVRMLX3DItem.addActionListener(this); + menu.add("-"); + importGFDItem = menu.add(new MenuItem("Grafreed file...")); + importGFDItem.addActionListener(this); + fileMenu.add(menu); + fileMenu.add("-"); + + fileMenu.add(saveItem = new MenuItem("Save")); + fileMenu.add(saveAsItem = new MenuItem("Save As...")); //windowMenu.add(povItem = new MenuItem("Emit POV-Ray...")); - windowMenu.add("-"); - windowMenu.add(exportAsItem = new MenuItem("Export Selection...")); - windowMenu.add(reexportItem = new MenuItem("Re-export")); - windowMenu.add("-"); + fileMenu.add("-"); + fileMenu.add(exportAsItem = new MenuItem("Export Selection...")); + fileMenu.add(reexportItem = new MenuItem("Re-export")); + fileMenu.add("-"); if (client.parent != null) { - windowMenu.add(closeItem = new MenuItem("Close")); + fileMenu.add(closeItem = new MenuItem("Close")); } else { - windowMenu.add(closeItem = new MenuItem("Exit")); + fileMenu.add(closeItem = new MenuItem("Exit")); } + newItem.addActionListener(this); loadItem.addActionListener(this); saveItem.addActionListener(this); saveAsItem.addActionListener(this); @@ -301,78 +317,6 @@ reexportItem.addActionListener(this); //povItem.addActionListener(this); closeItem.addActionListener(this); - - menuBar.add(cameraMenu = new Menu("View")); - //cameraMenu.add(zBufferItem = new CheckboxMenuItem("Z Buffer")); - //zBufferItem.addActionListener(this); - //cameraMenu.add(normalLensItem = new MenuItem("Normal Lens")); - //normalLensItem.addActionListener(this); - cameraMenu.add(revertCameraItem = new MenuItem("Revert Camera")); - revertCameraItem.addActionListener(this); - - cameraMenu.add(toggleFullScreenItem = new CheckboxMenuItem("Full Screen")); - toggleFullScreenItem.addItemListener(this); - toggleFullScreenItem.setState(CameraPane.FULLSCREEN); - cameraMenu.add("-"); - - cameraMenu.add(toggleTextureItem = new CheckboxMenuItem("Texture")); - toggleTextureItem.addItemListener(this); - toggleTextureItem.setState(CameraPane.textureon); - - cameraMenu.add(toggleSwitchItem = new CheckboxMenuItem("Switch")); - toggleSwitchItem.addItemListener(this); - toggleSwitchItem.setState(CameraPane.SWITCH); - - cameraMenu.add(toggleHandleItem = new CheckboxMenuItem("Handles")); - toggleHandleItem.addItemListener(this); - toggleHandleItem.setState(CameraPane.HANDLES); - - cameraMenu.add(togglePaintItem = new CheckboxMenuItem("Paint mode")); - togglePaintItem.addItemListener(this); - togglePaintItem.setState(CameraPane.PAINTMODE); - - if (Globals.ADVANCED) - { - cameraMenu.add("-"); - cameraMenu.add(toggleLiveItem = new CheckboxMenuItem("Live")); - toggleLiveItem.addItemListener(this); - toggleLiveItem.setState(Globals.isLIVE()); - - cameraMenu.add(stepItem = new MenuItem("Step")); - stepItem.addActionListener(this); - // cameraMenu.add(toggleDLItem = new CheckboxMenuItem("Display List")); - // toggleDLItem.addItemListener(this); - // toggleDLItem.setState(false); - - cameraMenu.add(toggleRenderItem = new CheckboxMenuItem("Render")); - toggleRenderItem.addItemListener(this); - toggleRenderItem.setState(!CameraPane.frozen); - - cameraMenu.add(toggleDebugItem = new CheckboxMenuItem("Debug")); - toggleDebugItem.addItemListener(this); - toggleDebugItem.setState(CameraPane.DEBUG); - - cameraMenu.add(toggleFrustumItem = new CheckboxMenuItem("Frustum")); - toggleFrustumItem.addItemListener(this); - toggleFrustumItem.setState(CameraPane.FRUSTUM); - - cameraMenu.add(toggleFootContactItem = new CheckboxMenuItem("Foot contact")); - toggleFootContactItem.addItemListener(this); - toggleFootContactItem.setState(CameraPane.FOOTCONTACT); - - cameraMenu.add(toggleTimelineItem = new CheckboxMenuItem("Timeline")); - toggleTimelineItem.addItemListener(this); - } - -// cameraMenu.add(toggleRootItem = new CheckboxMenuItem("Alternate Root")); -// toggleRootItem.addItemListener(this); -// toggleRootItem.setState(false); -// cameraMenu.add(animationItem = new CheckboxMenuItem("Animation")); -// animationItem.addItemListener(this); -// animationItem.setState(CameraPane.ANIMATION); - cameraMenu.add("-"); - cameraMenu.add(editCameraItem = new MenuItem("Freeze Camera")); - editCameraItem.addActionListener(this); objectPanel = new JTabbedPane(); toolbarPanel = new JPanel(); @@ -501,13 +445,13 @@ //SendInfo("Name:", "bold"); if (sel.GetTextures() != null || debug) { - si.SendInfo(sel.toString(), "bold"); + si.SendInfo(sel.toString() + (Globals.ADVANCED?"":" " + System.identityHashCode(sel)), "bold"); //SendInfo("#children virtual = " + sel.size() + "; real = " + sel.Size() + newline, "regular"); if (sel.Size() > 0) { si.SendInfo("#children = " + sel.Size(), "regular"); } - si.SendInfo((debug ? " Parent: " : " ") + sel.parent, "regular"); + si.SendInfo((debug ? " Parent: " : " ") + sel.parent + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.parent)), "regular"); if (debug) { try @@ -549,7 +493,7 @@ } if (sel.support != null) { - si.SendInfo(" support: " + sel.support, "regular"); + si.SendInfo(" support: " + sel.support + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.support)), "regular"); } if (sel.scriptnode != null) { @@ -784,6 +728,7 @@ // NumberSlider vDivsField; // JCheckBox endcaps; JCheckBox liveCB; + JCheckBox selectCB; JCheckBox hideCB; JCheckBox link2masterCB; JCheckBox markCB; @@ -986,9 +931,11 @@ liveCB = AddCheckBox(setupPanel, "Live", copy.live); liveCB.setToolTipText("Animate object"); + selectCB = AddCheckBox(setupPanel, "Select", !copy.dontselect); + selectCB.setToolTipText("Make object selectable"); +// Return(); hideCB = AddCheckBox(setupPanel, "Hide", copy.hide); hideCB.setToolTipText("Hide object"); -// Return(); markCB = AddCheckBox(setupPanel, "Mark", copy.marked); markCB.setToolTipText("Set the animation target transform"); @@ -1028,7 +975,7 @@ oe.ctrlPanel.add(commandsPanel); oe.ctrlPanel.Return(); - pushPanel = AddSlider(oe.ctrlPanel, "Push", -10, 10, 0, 1); + pushPanel = AddSlider(oe.ctrlPanel, "Push", -1, 1, copy.NORMALPUSH, 1.1); // To have the buttons normalpushField = (cNumberSlider)pushPanel.getComponent(1); //Return(); @@ -1988,6 +1935,7 @@ e2.printStackTrace(); } } + LoadJMEThread loadThread; class LoadJMEThread extends Thread @@ -2045,6 +1993,7 @@ //LoadFile0(filename, converter); } } + LoadOBJThread loadObjThread; class LoadOBJThread extends Thread @@ -2978,7 +2927,7 @@ return; } else if (event.getSource() == toggleSwitchItem) { - cameraView.ToggleRandom(); + cameraView.ToggleSwitch(); cameraView.repaint(); return; } else if (event.getSource() == toggleHandleItem) @@ -3006,6 +2955,10 @@ } else if (event.getSource() == liveCB) { copy.live ^= true; + return; + } else if (event.getSource() == selectCB) + { + copy.dontselect ^= true; return; } else if (event.getSource() == hideCB) { @@ -3045,8 +2998,9 @@ public void actionPerformed(ActionEvent event) { + Object source = event.getSource(); // SCRIPT DIALOG - if (event.getSource() == okbutton) + if (source == okbutton) { textpanel.setVisible(false); textpanel.remove(textarea); @@ -3058,7 +3012,7 @@ textarea = null; textpanel = null; } - if (event.getSource() == cancelbutton) + if (source == cancelbutton) { textpanel.setVisible(false); textpanel.remove(textarea); @@ -3070,50 +3024,50 @@ //applySelf(); //client.refreshEditWindow(); //refreshContents(); - if (event.getSource() == nameField) + if (source == nameField) { //System.out.println("ObjEditor " + event); applySelf0(true); //parent.applySelf(); objEditor.refreshContents(); - } else if (event.getSource() == resetButton) + } else if (source == resetButton) { CameraPane.fullreset = true; copy.Reset(); // ResetMeshes(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == stepItem) + } else if (source == stepItem) { //cameraView.ONESTEP = true; Globals.ONESTEP = true; cameraView.repaint(); return; - } else if (event.getSource() == stepButton) + } else if (source == stepButton) { copy.Step(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == slowerButton) + } else if (source == slowerButton) { copy.Slower(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == fasterButton) + } else if (source == fasterButton) { copy.Faster(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == remarkButton) + } else if (source == remarkButton) { copy.Remark(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == stepAllButton) + } else if (source == stepAllButton) { copy.StepAll(); copy.Touch(); objEditor.refreshContents(); - } else if (event.getSource() == resetAllButton) + } else if (source == resetAllButton) { //CameraPane.fullreset = true; copy.ResetAll(); // ResetMeshes(); @@ -3146,53 +3100,75 @@ // Close(); // } // else - if (event.getSource() == resetSlidersButton) + if (source == resetSlidersButton) { ResetSliders(); - } else if (event.getSource() == clearMaterialButton) + } else if (source == clearMaterialButton) { ClearMaterial(); - } else if (event.getSource() == createMaterialButton) + } else if (source == createMaterialButton) { CreateMaterial(); - } else if (event.getSource() == clearPanelButton) + } else if (source == clearPanelButton) { copy.ClearUI(); refreshContents(true); - } /* - } - - public boolean action(Event event, Object arg) - { - */ else if (event.getSource() == closeItem) + } else if (source == importGFDItem) + { + ImportGFD(); + } else + if (source == importVRMLX3DItem) + { + ImportVRMLX3D(); + } else + if (source == import3DSItem) + { + objEditor.ImportJME(new com.jmex.model.converters.MaxToJme(), "3ds", "Import 3DS"); + } else + if (source == importOBJItem) + { + //objEditor.ImportJME(new com.jmex.model.converters.ObjToJme(), "obj", "Import OBJ"); + FileDialog browser = new FileDialog(frame, "Import OBJ", FileDialog.LOAD); + browser.setVisible(true); + String filename = browser.getFile(); + if (filename != null && filename.length() > 0) + { + String fullname = browser.getDirectory() + filename; + makeSomething(ReadOBJ(fullname), true); + } + } else + if (source == closeItem) { Close(); //return true; - } else if (event.getSource() == loadItem) + } else if (source == loadItem) { load(); //return true; - } else if (event.getSource() == saveItem) + } else if (source == newItem) + { + New(); + } else if (source == saveItem) { save(); //return true; - } else if (event.getSource() == saveAsItem) + } else if (source == saveAsItem) { saveAs(); //return true; - } else if (event.getSource() == reexportItem) + } else if (source == reexportItem) { reexport(); //return true; - } else if (event.getSource() == exportAsItem) + } else if (source == exportAsItem) { export(); //return true; - } else if (event.getSource() == povItem) + } else if (source == povItem) { generatePOV(); //return true; - } else if (event.getSource() == zBufferItem) + } else if (source == zBufferItem) { try { @@ -3214,21 +3190,8 @@ cameraView.repaint(); //return true; } - */ else if (event.getSource() == editCameraItem) - { - cameraView.ProtectCamera(); - cameraView.repaint(); - return; - } else if (event.getSource() == revertCameraItem) - { - cameraView.RevertCamera(); - cameraView.repaint(); - return; -// } else if (event.getSource() == textureButton) -// { -// return; // true; - } else // combos... - if (event.getSource() == texresMenu) + */ else // combos... + if (source == texresMenu) { System.err.println("Object = " + copy + "; change value " + copy.texres + " to " + texresMenu.getSelectedIndex()); copy.texres = texresMenu.getSelectedIndex(); @@ -3240,6 +3203,247 @@ } } + void New() + { + while (copy.Size() > 1) + { + copy.remove(1); + } + + ResetModel(); + objEditor.refreshContents(); + } + + static public byte[] Compress(Object o) + { + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + java.util.zip.GZIPOutputStream zstream = new java.util.zip.GZIPOutputStream(baos); + ObjectOutputStream out = new ObjectOutputStream(zstream); + + out.writeObject(o); + + out.flush(); + + zstream.close(); + out.close(); + + return baos.toByteArray(); + } catch (Exception e) + { + System.err.println(e); + return null; + } + } + + static public Object Uncompress(byte[] bytes) + { + System.out.println("#bytes = " + bytes.length); + try + { + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + java.util.zip.GZIPInputStream istream = new java.util.zip.GZIPInputStream(bais); + ObjectInputStream in = new ObjectInputStream(istream); + Object obj = in.readObject(); + in.close(); + + return obj; + } catch (Exception e) + { + System.err.println(e); + return null; + } + } + + static public Object clone(Object o) + { + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(baos); + + out.writeObject(o); + + out.flush(); + out.close(); + + byte[] bytes = baos.toByteArray(); + + System.out.println("clone = " + bytes.length); + + ByteArrayInputStream bais = new ByteArrayInputStream(bytes); + ObjectInputStream in = new ObjectInputStream(bais); + Object obj = in.readObject(); + in.close(); + + return obj; + } catch (Exception e) + { + System.err.println(e); + return null; + } + } + + cRadio GetCurrentTab() + { + cRadio ab; + for (java.util.Enumeration e = buttonGroup.getElements(); e.hasMoreElements();) + { + ab = (cRadio)e.nextElement(); + if(ab.GetObject() == copy) + { + return ab; + } + } + + return null; + } + + java.util.Hashtable<java.util.UUID, Object3D> hashtable = new java.util.Hashtable<java.util.UUID, Object3D>(); + + public void Save() + { + cRadio tab = GetCurrentTab(); + + copy.ExtractBigData(hashtable); + + //EditorFrame.m_MainFrame.requestFocusInWindow(); + tab.graphs[tab.undoindex++] = Compress(copy); + + copy.RestoreBigData(hashtable); + + //assert(hashtable.isEmpty()); + + for (int i = tab.undoindex; i < tab.graphs.length; i++) + { + tab.graphs[i] = null; + } + + // test save + if (false) + { + try + { + FileOutputStream ostream = new FileOutputStream("save" + tab.undoindex); + ObjectOutputStream p = new ObjectOutputStream(ostream); + + p.writeObject(copy); + + p.flush(); + + ostream.close(); + } catch (Exception e) + { + e.printStackTrace(); + } + } + } + + void CopyChanged(Object3D obj) + { + copy.ExtractBigData(hashtable); + + copy.clear(); + + for (int i=0; i<obj.Size(); i++) + { + copy.add(obj.get(i)); + } + + copy.RestoreBigData(hashtable); + + //assert(hashtable.isEmpty()); + + copy.Touch(); + + ResetModel(); + copy.HardTouch(); // recompile? + + cRadio ab; + for (java.util.Enumeration e = buttonGroup.getElements(); e.hasMoreElements();) + { + ab = (cRadio)e.nextElement(); + Object3D test = copy.GetObject(ab.object.GetUUID()); + //ab.camera = (Camera)copy.GetObject(ab.camera.GetUUID()); + if (test != null) + { + test.editWindow = ab.object.editWindow; + ab.object = test; + } + } + + refreshContents(); + } + + public void Undo() + { + cRadio tab = GetCurrentTab(); + + if (tab.undoindex == 0) + { + java.awt.Toolkit.getDefaultToolkit().beep(); + return; + } + + if (tab.graphs[tab.undoindex] == null) + { + Save(); + tab.undoindex -= 1; + } + + tab.undoindex -= 1; + + CopyChanged((Object3D)Uncompress(tab.graphs[tab.undoindex])); + } + + public void Redo() + { + cRadio tab = GetCurrentTab(); + + if (tab.graphs[tab.undoindex + 1] == null) + { + java.awt.Toolkit.getDefaultToolkit().beep(); + return; + } + + tab.undoindex += 1; + + CopyChanged((Object3D)Uncompress(tab.graphs[tab.undoindex])); + } + + void ImportGFD() + { + FileDialog browser = new FileDialog(objEditor.frame, "Import GrafreeD", FileDialog.LOAD); + browser.show(); + String filename = browser.getFile(); + if (filename != null && filename.length() > 0) + { + String fullname = browser.getDirectory() + filename; + + //Object3D readobj = + objEditor.ReadGFD(fullname, objEditor); + //makeSomething(readobj); + } + } + + void ImportVRMLX3D() + { + if (Grafreed.standAlone) + { + /**/ + FileDialog browser = new FileDialog(objEditor.frame, "Import VRML/X3D", FileDialog.LOAD); + browser.show(); + String filename = browser.getFile(); + if (filename != null && filename.length() > 0) + { + String fullname = browser.getDirectory() + filename; + LoadVRMLX3D(fullname); + } + /**/ + } + } + void ToggleAnimation() { if (!Globals.ANIMATION) @@ -3588,7 +3792,7 @@ } if (normalpushField != null) - copy.NORMALPUSH = (float)normalpushField.getFloat()/1000; + copy.NORMALPUSH = (float)normalpushField.getFloat()/100; } void SnapObject() @@ -3852,6 +4056,7 @@ void makeSomething(Object3D thing, boolean resetmodel) // deselect) { + Save(); //Tween.set(thing, 0).target(1).start(tweenManager); //Tween.to(thing, 0, 0.5f).target(0).start(tweenManager); // if (thing instanceof GenericJointDemo) @@ -4055,6 +4260,7 @@ } } } + LoadGFDThread loadGFDThread; void ReadGFD(String fullname, iCallBack cb) @@ -4075,7 +4281,8 @@ try { java.io.FileInputStream istream = new java.io.FileInputStream(fullname); - java.io.ObjectInputStream p = new java.io.ObjectInputStream(istream); + java.util.zip.GZIPInputStream zstream = new java.util.zip.GZIPInputStream(istream); + java.io.ObjectInputStream p = new java.io.ObjectInputStream(zstream); readobj = (Object3D) p.readObject(); istream.close(); @@ -4083,7 +4290,20 @@ readobj.ResetDisplayList(); } catch (Exception e) { - e.printStackTrace(); + //e.printStackTrace(); + try + { + java.io.FileInputStream istream = new java.io.FileInputStream(fullname); + java.io.ObjectInputStream p = new java.io.ObjectInputStream(istream); + + readobj = (Object3D) p.readObject(); + istream.close(); + + readobj.ResetDisplayList(); + } catch (Exception e2) + { + e2.printStackTrace(); + } } // catch(java.io.StreamCorruptedException e) { e.printStackTrace(); } // catch(java.io.IOException e) { System.out.println("IOexception"); e.printStackTrace(); } @@ -4138,6 +4358,7 @@ if (readobj != null) { + Save(); try { //readobj.deepCopySelf(copy); @@ -4287,11 +4508,13 @@ try { FileOutputStream ostream = new FileOutputStream(lastname); - ObjectOutputStream p = new ObjectOutputStream(ostream); + java.util.zip.GZIPOutputStream zstream = new java.util.zip.GZIPOutputStream(ostream); + ObjectOutputStream p = new ObjectOutputStream(zstream); p.writeObject(copy); p.flush(); + zstream.close(); ostream.close(); //FileOutputStream fos = new FileOutputStream(fullname); @@ -4301,6 +4524,7 @@ { } } + String lastname; void saveAs() @@ -4410,8 +4634,8 @@ try { FileOutputStream ostream = new FileOutputStream(filename); - // ?? java.util.zip.GZIPOutputStream zstream = new java.util.zip.GZIPOutputStream(ostream); - ObjectOutputStream p = new ObjectOutputStream(/*z*/ostream); + java.util.zip.GZIPOutputStream zstream = new java.util.zip.GZIPOutputStream(ostream); + ObjectOutputStream p = new ObjectOutputStream(zstream); Object3D objectparent = obj.parent; obj.parent = null; @@ -4428,8 +4652,8 @@ p.writeObject(object); p.flush(); + zstream.close(); ostream.close(); - // zstream.close(); // group.selection.get(0).parent = parent; //FileOutputStream fos = new FileOutputStream(fullname); @@ -4476,7 +4700,8 @@ Object3D client; Object3D copy; MenuBar menuBar; - Menu windowMenu; + Menu fileMenu; + MenuItem newItem; MenuItem loadItem; MenuItem saveItem; MenuItem saveAsItem; @@ -4484,11 +4709,9 @@ MenuItem reexportItem; MenuItem povItem; MenuItem closeItem; - Menu cameraMenu; + CheckboxMenuItem zBufferItem; //MenuItem normalLensItem; - MenuItem editCameraItem; - MenuItem revertCameraItem; MenuItem stepItem; CheckboxMenuItem toggleLiveItem; CheckboxMenuItem toggleFullScreenItem; @@ -4636,4 +4859,9 @@ //ObjectUI parent; cNumberSlider normalpushField; + + private MenuItem importGFDItem; + private MenuItem importVRMLX3DItem; + private MenuItem import3DSItem; + private MenuItem importOBJItem; } -- Gitblit v1.6.2