/*
* Copyright (C) 2014 James Lawrence.
*
* This file is part of GrimEdi.
*
* GrimEdi is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Created by JFormDesigner on Mon Mar 18 20:01:59 GMT 2013
*/
package com.sqrt4.grimedi.ui.editor;
import com.sqrt.liblab.codec.CodecMapper;
import com.sqrt.liblab.codec.ModelCodec;
import com.sqrt.liblab.entry.model.GrimModel;
import com.sqrt.liblab.entry.model.ModelNode;
import com.sqrt.liblab.threed.Angle;
import com.sqrt4.grimedi.ui.MainWindow;
import com.sqrt4.grimedi.ui.component.AngleEditor;
import com.sqrt4.grimedi.ui.component.ModelRenderer;
import com.sqrt4.grimedi.ui.component.Vector3Editor;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
/**
* @author James Lawrence
*/
public class ModelView extends EditorPanel<GrimModel> {
private boolean bonesUpdating;
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// Generated using JFormDesigner non-commercial license
private JSplitPane panel2;
private ModelRenderer renderer;
private JPanel splitPane1;
private JScrollPane scrollPane1;
private JTree boneTree;
private JPanel panel6;
private Vector3Editor bonePos;
private Vector3Editor bonePivot;
private JPanel panel3;
private AngleEditor boneYaw;
private AngleEditor bonePitch;
private AngleEditor boneRoll;
private JPanel panel1;
private JButton button1;
private ExportObjAction exportObjAction;
// JFormDesigner - End of variables declaration //GEN-END:variables
public ModelView() {
initComponents();
}
private void boneSelected(TreeSelectionEvent e) {
bonesUpdating = true;
if (boneTree.getSelectionPath() == null) {
renderer.setSelectedNode(null);
} else {
ModelNode selected = (ModelNode) boneTree.getSelectionPath().getLastPathComponent();
renderer.setSelectedNode(selected);
boneYaw.setAngle(selected.yaw.degrees);
bonePitch.setAngle(selected.pitch.degrees);
boneRoll.setAngle(selected.roll.degrees);
bonePos.setValue(selected.pos);
bonePivot.setValue(selected.pivot);
}
boolean editable = renderer.getSelectedNode() != null;
boneYaw.setEnabled(editable);
boneRoll.setEnabled(editable);
bonePitch.setEnabled(editable);
bonePos.setEnabled(editable);
bonePivot.setEnabled(editable);
bonesUpdating = false;
}
private void boneChanged() {
ModelNode selected = renderer.getSelectedNode();
if (selected == null || bonesUpdating)
return;
selected.yaw = new Angle(boneYaw.getAngle());
selected.roll = new Angle(boneRoll.getAngle());
selected.pitch = new Angle(bonePitch.getAngle());
selected.pos = bonePos.getValue();
selected.pivot = bonePivot.getValue();
renderer.refreshModelCache();
}
private void boneChanged(PropertyChangeEvent e) {
boneChanged();
}
private void boneChanged(ChangeEvent e) {
boneChanged();
}
ImageIcon icon = new ImageIcon(getClass().getResource("/3do.png"));
public ImageIcon getIcon() {
return icon;
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
// Generated using JFormDesigner non-commercial license
panel2 = new JSplitPane();
renderer = new ModelRenderer();
splitPane1 = new JPanel();
scrollPane1 = new JScrollPane();
boneTree = new JTree();
panel6 = new JPanel();
bonePos = new Vector3Editor();
bonePivot = new Vector3Editor();
panel3 = new JPanel();
boneYaw = new AngleEditor();
bonePitch = new AngleEditor();
boneRoll = new AngleEditor();
panel1 = new JPanel();
button1 = new JButton();
exportObjAction = new ExportObjAction();
//======== this ========
setLayout(new BorderLayout());
//======== panel2 ========
{
panel2.setResizeWeight(1.0);
panel2.setOneTouchExpandable(true);
panel2.setLeftComponent(renderer);
//======== splitPane1 ========
{
splitPane1.setLayout(new BorderLayout());
//======== scrollPane1 ========
{
//---- boneTree ----
boneTree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
boneSelected(e);
}
});
scrollPane1.setViewportView(boneTree);
}
splitPane1.add(scrollPane1, BorderLayout.CENTER);
//======== panel6 ========
{
panel6.setBorder(new TitledBorder("Bone Properties"));
panel6.setLayout(new BoxLayout(panel6, BoxLayout.Y_AXIS));
//---- bonePos ----
bonePos.setEnabled(false);
bonePos.setBorder(new TitledBorder("Position"));
bonePos.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
boneChanged(e);
}
});
panel6.add(bonePos);
//---- bonePivot ----
bonePivot.setEnabled(false);
bonePivot.setBorder(new TitledBorder("Pivot"));
bonePivot.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
boneChanged(e);
}
});
panel6.add(bonePivot);
//======== panel3 ========
{
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS));
//---- boneYaw ----
boneYaw.setEnabled(false);
boneYaw.setBorder(new TitledBorder("Yaw"));
boneYaw.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
boneChanged(e);
}
});
panel3.add(boneYaw);
//---- bonePitch ----
bonePitch.setEnabled(false);
bonePitch.setBorder(new TitledBorder("Pitch"));
bonePitch.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
boneChanged(e);
}
});
panel3.add(bonePitch);
//---- boneRoll ----
boneRoll.setEnabled(false);
boneRoll.setBorder(new TitledBorder("Roll"));
boneRoll.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
boneChanged(e);
}
});
panel3.add(boneRoll);
}
panel6.add(panel3);
//======== panel1 ========
{
panel1.setLayout(new BorderLayout());
//---- button1 ----
button1.setAction(exportObjAction);
panel1.add(button1, BorderLayout.CENTER);
}
panel6.add(panel1);
}
splitPane1.add(panel6, BorderLayout.SOUTH);
}
panel2.setRightComponent(splitPane1);
}
add(panel2, BorderLayout.CENTER);
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
public void onNewData() {
renderer.setModel(data);
DefaultTreeCellRenderer r = (DefaultTreeCellRenderer) boneTree.getCellRenderer();
r.setOpenIcon(r.getLeafIcon());
r.setClosedIcon(r.getLeafIcon());
boneTree.setModel(new TreeModel() {
public Object getRoot() {
return data.hierarchy.get(0);
}
public Object getChild(Object parent, int index) {
ModelNode child = ((ModelNode) parent).child;
for (int i = 0; i < index; i++)
child = child.sibling;
return child;
}
public int getChildCount(Object parent) {
ModelNode child = ((ModelNode) parent).child;
int count = 0;
while (child != null) {
count++;
child = child.sibling;
}
return count;
}
public boolean isLeaf(Object node) {
return getChildCount(node) == 0;
}
public void valueForPathChanged(TreePath path, Object newValue) {
//To change body of implemented methods use File | Settings | File Templates.
}
public int getIndexOfChild(Object parent, Object child) {
ModelNode c = ((ModelNode) parent).child;
int idx = 0;
while (c != null) {
if (c == child)
return idx;
idx++;
c = c.sibling;
}
return -1;
}
public void addTreeModelListener(TreeModelListener l) {
//To change body of implemented methods use File | Settings | File Templates.
}
public void removeTreeModelListener(TreeModelListener l) {
//To change body of implemented methods use File | Settings | File Templates.
}
});
for (int i = 0; i < boneTree.getRowCount(); i++)
boneTree.expandRow(i);
}
private class ExportObjAction extends AbstractAction {
private ExportObjAction() {
// JFormDesigner - Action initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
// Generated using JFormDesigner non-commercial license
putValue(NAME, "Export OBJ");
putValue(SHORT_DESCRIPTION, "Export wavefront obj file");
// JFormDesigner - End of action initialization //GEN-END:initComponents
}
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = MainWindow.getInstance().createFileDialog();
jfc.setFileFilter(new FileNameExtensionFilter("Wavefront OBJ (*.obj)", "obj"));
String name = data.getName();
int idx = name.lastIndexOf('.');
if(idx != -1)
name = name.substring(0, idx);
name += ".obj";
jfc.setSelectedFile(new File(name));
if(jfc.showSaveDialog(ModelView.this) != JFileChooser.APPROVE_OPTION)
return;
File f = jfc.getSelectedFile();
name = f.getName();
if(!name.toLowerCase().endsWith(".obj"))
name += ".obj";
f = new File(f.getParentFile(), name);
try {
((ModelCodec) CodecMapper.codecForClass(GrimModel.class)).exportWavefront(f, renderer.getModel(), renderer.getColorMap());
} catch (IOException e1) {
MainWindow.getInstance().handleException(e1);
}
}
}
}