|
@@ -23,7 +23,9 @@ import com.jme3.gde.scenecomposer.tools.MoveTool;
|
|
|
import com.jme3.gde.scenecomposer.tools.RotateTool;
|
|
|
import com.jme3.gde.scenecomposer.tools.ScaleTool;
|
|
|
import com.jme3.gde.scenecomposer.tools.SelectTool;
|
|
|
+import com.jme3.math.FastMath;
|
|
|
import com.jme3.math.Vector3f;
|
|
|
+import com.jme3.renderer.Camera;
|
|
|
import com.jme3.scene.Node;
|
|
|
import com.jme3.scene.Spatial;
|
|
|
import java.io.IOException;
|
|
@@ -98,6 +100,12 @@ public final class SceneComposerTopComponent extends TopComponent implements Sce
|
|
|
sceneInfoPanel = new javax.swing.JPanel();
|
|
|
sceneInfoLabel1 = new javax.swing.JLabel();
|
|
|
sceneInfoLabel2 = new javax.swing.JLabel();
|
|
|
+ jSlider1 = new javax.swing.JSlider();
|
|
|
+ jSlider2 = new javax.swing.JSlider();
|
|
|
+ jSpinner1 = new javax.swing.JSpinner();
|
|
|
+ jSpinner2 = new javax.swing.JSpinner();
|
|
|
+ jLabel7 = new javax.swing.JLabel();
|
|
|
+ jLabel8 = new javax.swing.JLabel();
|
|
|
jToolBar1 = new javax.swing.JToolBar();
|
|
|
transformationTypeComboBox = new javax.swing.JComboBox();
|
|
|
jSeparator9 = new javax.swing.JToolBar.Separator();
|
|
@@ -150,19 +158,84 @@ public final class SceneComposerTopComponent extends TopComponent implements Sce
|
|
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(sceneInfoLabel2, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.sceneInfoLabel2.text")); // NOI18N
|
|
|
|
|
|
+ jSlider1.setMaximum(2000);
|
|
|
+ jSlider1.setMinimum(100);
|
|
|
+ jSlider1.setValue(1000);
|
|
|
+ jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
|
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
|
+ jSlider1StateChanged(evt);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ jSlider2.setMaximum(3000);
|
|
|
+ jSlider2.setMinimum(5);
|
|
|
+ jSlider2.setValue(1000);
|
|
|
+ jSlider2.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
|
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
|
+ jSlider2StateChanged(evt);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ jSpinner1.setModel(new javax.swing.SpinnerNumberModel(0.1f, null, null, 0.01f));
|
|
|
+ jSpinner1.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
|
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
|
+ jSpinner1StateChanged(evt);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ jSpinner2.setModel(new javax.swing.SpinnerNumberModel(500.0f, null, null, 1.0f));
|
|
|
+ jSpinner2.addChangeListener(new javax.swing.event.ChangeListener() {
|
|
|
+ public void stateChanged(javax.swing.event.ChangeEvent evt) {
|
|
|
+ jSpinner2StateChanged(evt);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel7, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.jLabel7.text")); // NOI18N
|
|
|
+
|
|
|
+ org.openide.awt.Mnemonics.setLocalizedText(jLabel8, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.jLabel8.text")); // NOI18N
|
|
|
+
|
|
|
javax.swing.GroupLayout sceneInfoPanelLayout = new javax.swing.GroupLayout(sceneInfoPanel);
|
|
|
sceneInfoPanel.setLayout(sceneInfoPanelLayout);
|
|
|
sceneInfoPanelLayout.setHorizontalGroup(
|
|
|
sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
|
.addComponent(sceneInfoLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
|
.addComponent(sceneInfoLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createSequentialGroup()
|
|
|
+ .addContainerGap()
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
|
+ .addComponent(jLabel7)
|
|
|
+ .addComponent(jLabel8))
|
|
|
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
|
+ .addComponent(jSlider1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
|
+ .addComponent(jSlider2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
|
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
|
|
+ .addComponent(jSpinner2, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE)
|
|
|
+ .addComponent(jSpinner1))
|
|
|
+ .addGap(36, 36, 36))
|
|
|
);
|
|
|
sceneInfoPanelLayout.setVerticalGroup(
|
|
|
sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
|
.addGroup(sceneInfoPanelLayout.createSequentialGroup()
|
|
|
- .addComponent(sceneInfoLabel1)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createSequentialGroup()
|
|
|
+ .addComponent(sceneInfoLabel1)
|
|
|
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
|
+ .addComponent(sceneInfoLabel2)
|
|
|
+ .addGap(18, 18, 18)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
|
+ .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
|
+ .addComponent(jLabel7)))
|
|
|
+ .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
|
- .addComponent(sceneInfoLabel2)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
|
+ .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
|
+ .addGroup(sceneInfoPanelLayout.createSequentialGroup()
|
|
|
+ .addGroup(sceneInfoPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
|
|
+ .addComponent(jSlider2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
|
+ .addComponent(jLabel8))
|
|
|
+ .addGap(1, 1, 1)))
|
|
|
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
|
);
|
|
|
|
|
@@ -436,10 +509,10 @@ public final class SceneComposerTopComponent extends TopComponent implements Sce
|
|
|
fixedCheckBox.setEnabled(false);
|
|
|
jToolBar3.add(fixedCheckBox);
|
|
|
|
|
|
- radiusSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(0.5f), null, null, Float.valueOf(0.1f)));
|
|
|
+ radiusSpinner.setModel(new javax.swing.SpinnerNumberModel(0.5f, null, null, 0.1f));
|
|
|
jToolBar3.add(radiusSpinner);
|
|
|
|
|
|
- heightSpinner.setModel(new javax.swing.SpinnerNumberModel(Float.valueOf(1.8f), null, null, Float.valueOf(0.1f)));
|
|
|
+ heightSpinner.setModel(new javax.swing.SpinnerNumberModel(1.8f, null, null, 0.1f));
|
|
|
jToolBar3.add(heightSpinner);
|
|
|
|
|
|
org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(SceneComposerTopComponent.class, "SceneComposerTopComponent.jLabel5.text")); // NOI18N
|
|
@@ -665,6 +738,57 @@ private void jToggleSelectGeomActionPerformed(java.awt.event.ActionEvent evt) {/
|
|
|
toolController.setTransformationType((String) transformationTypeComboBox.getSelectedItem());
|
|
|
}//GEN-LAST:event_transformationTypeComboBoxActionPerformed
|
|
|
|
|
|
+ private void jSlider1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlider1StateChanged
|
|
|
+ // This is called, when the slider of the near plane has been dragged.
|
|
|
+ float near = ((float)jSlider1.getValue() / 1000f);
|
|
|
+
|
|
|
+ // Prevent an endless loop of state changes
|
|
|
+ if (!FastMath.approximateEquals((Float)(jSpinner1.getValue()), near)) {
|
|
|
+ jSpinner1.setValue(near);
|
|
|
+ }
|
|
|
+ }//GEN-LAST:event_jSlider1StateChanged
|
|
|
+
|
|
|
+ private void jSlider2StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSlider2StateChanged
|
|
|
+ // This is called, when the slider of the far plane has been dragged.
|
|
|
+ float far = jSlider2.getValue();
|
|
|
+
|
|
|
+ // Prevent an endless loop of state changes
|
|
|
+ if (!FastMath.approximateEquals((Float)(jSpinner2.getValue()), far)) {
|
|
|
+ jSpinner2.setValue(far);
|
|
|
+ }
|
|
|
+ }//GEN-LAST:event_jSlider2StateChanged
|
|
|
+
|
|
|
+ private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSpinner1StateChanged
|
|
|
+ // This is called, when the spinner of the near plane has been changed.
|
|
|
+ float near = ((float)jSlider1.getValue() / 1000f);
|
|
|
+ float spin = (Float)jSpinner1.getValue();
|
|
|
+
|
|
|
+ // Prevent an endless loop of state changes and don't change the slider when the spinner
|
|
|
+ // has gone out of range, since this would lead to the slider's StateChanged overwriting the spinner again.
|
|
|
+ // but we want the spinner to be a free-form field
|
|
|
+
|
|
|
+ if (spin <= 2000f && spin >= 100f && !FastMath.approximateEquals((Float)(jSpinner1.getValue()), near)) {
|
|
|
+ jSlider1.setValue((int)((Float)(jSpinner1.getValue()) * 1000f));
|
|
|
+ }
|
|
|
+
|
|
|
+ final Camera cam = SceneApplication.getApplication().getCamera();
|
|
|
+ cam.setFrustumPerspective(45f, (float)cam.getWidth() / cam.getHeight(), spin, cam.getFrustumFar());
|
|
|
+ }//GEN-LAST:event_jSpinner1StateChanged
|
|
|
+
|
|
|
+ private void jSpinner2StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jSpinner2StateChanged
|
|
|
+ // Prevent an endless loop of state changes and don't change the slider when the spinner
|
|
|
+ // has gone out of range, since this would lead to the slider's StateChanged overwriting the spinner again.
|
|
|
+ // but we want the spinner to be a free-form field
|
|
|
+
|
|
|
+ float spin = (Float)jSpinner2.getValue();
|
|
|
+ if (spin <= 3000f && spin >= 5f && !FastMath.approximateEquals(spin, (float)jSlider2.getValue())) {
|
|
|
+ jSlider2.setValue((int)spin);
|
|
|
+ }
|
|
|
+
|
|
|
+ final Camera cam = SceneApplication.getApplication().getCamera();
|
|
|
+ cam.setFrustumPerspective(45f, (float)cam.getWidth() / cam.getHeight(), cam.getFrustumNear(), spin);
|
|
|
+ }//GEN-LAST:event_jSpinner2StateChanged
|
|
|
+
|
|
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
|
private javax.swing.JButton camToCursorSelectionButton;
|
|
|
private javax.swing.JButton createPhysicsMeshButton;
|
|
@@ -682,6 +806,8 @@ private void jToggleSelectGeomActionPerformed(java.awt.event.ActionEvent evt) {/
|
|
|
private javax.swing.JLabel jLabel4;
|
|
|
private javax.swing.JLabel jLabel5;
|
|
|
private javax.swing.JLabel jLabel6;
|
|
|
+ private javax.swing.JLabel jLabel7;
|
|
|
+ private javax.swing.JLabel jLabel8;
|
|
|
private javax.swing.JPanel jPanel3;
|
|
|
private javax.swing.JPanel jPanel4;
|
|
|
private javax.swing.JToolBar.Separator jSeparator1;
|
|
@@ -693,6 +819,10 @@ private void jToggleSelectGeomActionPerformed(java.awt.event.ActionEvent evt) {/
|
|
|
private javax.swing.JToolBar.Separator jSeparator7;
|
|
|
private javax.swing.JToolBar.Separator jSeparator8;
|
|
|
private javax.swing.JToolBar.Separator jSeparator9;
|
|
|
+ private javax.swing.JSlider jSlider1;
|
|
|
+ private javax.swing.JSlider jSlider2;
|
|
|
+ private javax.swing.JSpinner jSpinner1;
|
|
|
+ private javax.swing.JSpinner jSpinner2;
|
|
|
private javax.swing.JTextField jTextField1;
|
|
|
private javax.swing.JToggleButton jToggleGrid;
|
|
|
private javax.swing.JToggleButton jToggleScene;
|