Initial import of blender loader test classes and assets.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7556 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
Kae..pl 14 years ago
parent 66935d6a4c
commit c50055645f
  1. BIN
      engine/src/test-data/Blender/2.4x/BaseMesh_249.blend
  2. BIN
      engine/src/test-data/Blender/2.4x/BaseScene.blend
  3. BIN
      engine/src/test-data/Blender/2.4x/MountainValley_Track.blend
  4. BIN
      engine/src/test-data/Blender/2.4x/ObjectAnimation.blend
  5. BIN
      engine/src/test-data/Blender/2.4x/SimpleAnimation.blend
  6. BIN
      engine/src/test-data/Blender/2.4x/Sinbad.blend
  7. BIN
      engine/src/test-data/Blender/2.4x/animtest.blend
  8. BIN
      engine/src/test-data/Blender/2.4x/constraints.blend
  9. BIN
      engine/src/test-data/Blender/2.4x/curves.blend
  10. BIN
      engine/src/test-data/Blender/2.4x/kerrigan.blend
  11. BIN
      engine/src/test-data/Blender/2.4x/kerrigan_diffuse.png
  12. BIN
      engine/src/test-data/Blender/2.4x/materials.blend
  13. BIN
      engine/src/test-data/Blender/2.4x/modifiers.blend
  14. BIN
      engine/src/test-data/Blender/2.4x/nurbs.blend
  15. BIN
      engine/src/test-data/Blender/2.4x/particles.blend
  16. BIN
      engine/src/test-data/Blender/2.4x/positions.blend
  17. BIN
      engine/src/test-data/Blender/2.4x/sinbad_body.tga
  18. BIN
      engine/src/test-data/Blender/2.4x/sinbad_clothes.tga
  19. BIN
      engine/src/test-data/Blender/2.4x/sinbad_sword.tga
  20. BIN
      engine/src/test-data/Blender/2.4x/test.conf
  21. BIN
      engine/src/test-data/Blender/2.4x/texturedPlaneTest.blend
  22. BIN
      engine/src/test-data/Blender/2.4x/textures.blend
  23. BIN
      engine/src/test-data/Blender/2.4x/textures/Concrete_Wall.PNG
  24. BIN
      engine/src/test-data/Blender/2.4x/textures/Grass_256.png
  25. BIN
      engine/src/test-data/Blender/2.4x/textures/SandDesert_StartTower.png
  26. BIN
      engine/src/test-data/Blender/2.4x/textures/SkyBox-Mountain.png
  27. BIN
      engine/src/test-data/Blender/2.4x/textures/Tar_Cracked.png
  28. BIN
      engine/src/test-data/Blender/2.4x/textures/WarningStrip.png
  29. BIN
      engine/src/test-data/Blender/2.5x/BaseMesh_256.blend
  30. BIN
      engine/src/test-data/Blender/2.5x/textures.blend
  31. 223
      engine/src/test/jme3test/blender/ManualBlenderTester.java
  32. 376
      engine/src/test/jme3test/blender/config/AbstractConfigDialog.java
  33. 440
      engine/src/test/jme3test/blender/config/ConfigDialog.java
  34. 21
      engine/src/test/jme3test/blender/config/IConfigExecutable.java
  35. 954
      engine/src/test/jme3test/blender/config/NoiseConstantsGenerator.java
  36. 53
      engine/src/test/jme3test/blender/scene/Pivot.java
  37. 47
      engine/src/test/jme3test/blender/scene/VisibleBone.java

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

@ -0,0 +1,223 @@
/*
* Copyright (c) 2009-2010 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.blender;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import jme3test.blender.config.ConfigDialog;
import jme3test.blender.config.IConfigExecutable;
import jme3test.blender.scene.Pivot;
import com.jme3.animation.AnimControl;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.AssetInfo;
import com.jme3.asset.BlenderKey;
import com.jme3.asset.BlenderKey.LoadingResults;
import com.jme3.asset.ModelKey;
import com.jme3.asset.plugins.FileLocator;
import com.jme3.light.DirectionalLight;
import com.jme3.light.Light;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.plugins.blender.BlenderLoader;
import com.jme3.scene.plugins.blender.BlenderModelLoader;
import com.jme3.texture.plugins.AWTLoader;
/**
* This class allow to manually test the blender loader.
* @author Marcin Roguski (Kaelthas)
*/
public class ManualBlenderTester extends SimpleApplication {
private static final Logger LOGGER = Logger.getLogger(ManualBlenderTester.class.getName());
private ModelKey modelKey;//the key that holds the test file configuration
private final boolean debug;
/**
* Starting method
* @param args input parameters; the following options can be passed to the application:
* <li> -debug : this one indicates if the application runs in debug or not (it is used under linux
* in order to enable the mouse in debug mode since linuxes tend not to give the cursor back
* to eclipse)
*/
public static void main(String[] args) {
//veryfying if the application is in debug mode
boolean debug = false;
for(String arg : args) {
if("-debug".equalsIgnoreCase(arg)) {
debug = true;
break;
}
}
final boolean debugMode = debug;
//running the application
new ConfigDialog("./src/test-data/Blender", new IConfigExecutable() {
@Override
public void execute(ModelKey modelKey, Level logLevel) {
new ManualBlenderTester(modelKey, logLevel, debugMode).start();
}
});
}
/**
* Constructor stores the given key and disables the settings screen.
* @param modelKey the key to be stored
* @param logLevel the jme logger log level
* @param debug variable that indicates if the application runs in debug mode
* (this is required on linux to show release the mouse to be used in debug mode)
*/
public ManualBlenderTester(ModelKey modelKey, Level logLevel, boolean debug) {
this.debug = debug;
Logger.getLogger("com.jme3").setLevel(logLevel);
this.modelKey = modelKey;
this.showSettings = false;
}
@Override
public void simpleInitApp() {
if(debug) {
mouseInput.setCursorVisible(true);
}
assetManager.registerLocator(".", FileLocator.class);
assetManager.registerLoader(BlenderLoader.class, "blend");
assetManager.registerLoader(AWTLoader.class, "png");
viewPort.setBackgroundColor(ColorRGBA.Gray);
flyCam.setMoveSpeed(20);
cam.setFrustumFar(1000.0f);
cam.setFrustumNear(1.0f);
AssetInfo ai = new AssetInfo(assetManager, modelKey) {
@Override
public InputStream openStream() {
try {
return new FileInputStream(this.key.getName());
} catch(FileNotFoundException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
return null;
}
}
};
rootNode.attachChild(new Pivot(assetManager));
if(modelKey instanceof BlenderKey) {
Node blenderModel = this.testBlenderLoader(ai);
Map<String, Map<String, int[]>> animations = ((BlenderKey) modelKey).getAnimations();
//setting the first animation as active
if(((BlenderKey) modelKey).getAnimations()!=null) {
for(Entry<String, Map<String, int[]>> animEntry : animations.entrySet()) {
for(Entry<String, int[]> anim : animEntry.getValue().entrySet()) {
Spatial animatedSpatial = this.findNode(blenderModel, animEntry.getKey());
animatedSpatial.getControl(AnimControl.class).createChannel().setAnim(anim.getKey());
break;
}
break;
}
}
} else {
this.testBlenderModelLoader(ai);
}
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(0, -10, 0).normalizeLocal());
sun.setColor(ColorRGBA.White);
rootNode.addLight(sun);
}
/**
* This method finds a node of a given name.
* @param rootNode the root node to search
* @param name the name of the searched node
* @return the found node or null
*/
private Spatial findNode(Node rootNode, String name) {
if(name.equals(rootNode.getName())) {
return rootNode;
}
return rootNode.getChild(name);
}
/**
* This method loads the model using blenderLoader.
* @param assetInfo
* the asset info
* @return the loaded model
*/
private Node testBlenderLoader(AssetInfo assetInfo) {
Node blenderModel = null;
BlenderLoader blenderLoader = new BlenderLoader();
try {
LoadingResults loadingResults = blenderLoader.load(assetInfo);
for(Node object : loadingResults.getObjects()) {
this.rootNode.attachChild(object);
blenderModel = object;
}
for(Light light : loadingResults.getLights()) {
this.rootNode.addLight(light);
}
for(Camera camera : loadingResults.getCameras()) {
LOGGER.info(camera.toString());
}
} catch(IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
return blenderModel;
}
/**
* This method loads the model using blenderModelLoader.
* @param assetInfo
* the asset info
* @return the loaded model
*/
private Node testBlenderModelLoader(AssetInfo assetInfo) {
BlenderModelLoader blenderLoader = new BlenderModelLoader();
try {
Spatial loadingResults = blenderLoader.load(assetInfo);
this.rootNode.attachChild(loadingResults);
if(loadingResults instanceof Node) {
return (Node)loadingResults;
}
} catch(IOException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
return null;
}
}

@ -0,0 +1,376 @@
package jme3test.blender.config;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractCellEditor;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
/**
* A base class for defining the start configuration.
* This separates the gui window definition from its logic.
* It is made so to easier maintain the dialog window.
* @author Marcin Roguski (Kaelthas)
*/
public abstract class AbstractConfigDialog extends JFrame {
private static final long serialVersionUID = -3677493125861310310L;
private static final Logger LOGGER = Logger.getLogger(AbstractConfigDialog.class.getName());
protected JComboBox jComboBoxVersionSelection;
protected JList jListBlenderFiles;
protected JTable jTableProperties;
protected JTable jTableAnimations;
protected JButton jButtonAddAnimation;
protected JButton jButtonRemoveAnimation;
protected JCheckBox jCheckBoxUseModelKey;
protected JButton jButtonOK;
protected JButton jButtonCancel;
/**
* Cionstructor initializes the gui.
*/
public AbstractConfigDialog() {
this.init();
}
/**
* This method initializes the window.
*/
private void init() {
try {//setting the system Look And Feel
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (InstantiationException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (IllegalAccessException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (UnsupportedLookAndFeelException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
this.setLayout(new BorderLayout());
this.add(this.prepareBlenderFilesAndLogLevelPanel(), BorderLayout.WEST);
this.add(this.prepareFilePropertiesPanel(), BorderLayout.CENTER);
this.add(this.prepareButtonsPanel(), BorderLayout.SOUTH);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* This method prepares a swing panel containing the list of blender files
* and log level chooser.
* @return prepared swing panel
*/
private JPanel prepareBlenderFilesAndLogLevelPanel() {
JPanel jPanelBlenderFilesListAndLogLevel = new JPanel();
jPanelBlenderFilesListAndLogLevel.setBorder(new TitledBorder("Blender test files"));
jPanelBlenderFilesListAndLogLevel.setLayout(new BorderLayout());
//blender version selection combo box
jComboBoxVersionSelection = new JComboBox(new DefaultComboBoxModel());
jComboBoxVersionSelection.setEditable(false);
jPanelBlenderFilesListAndLogLevel.add(jComboBoxVersionSelection, BorderLayout.NORTH);
//blender list files
jListBlenderFiles = new JList(new DefaultListModel());
jListBlenderFiles.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane listScroller = new JScrollPane(jListBlenderFiles);
jPanelBlenderFilesListAndLogLevel.add(listScroller, BorderLayout.CENTER);
//Log Level list
Box box = Box.createVerticalBox();
box.add(new Label("Log level:"));
ButtonGroup buttonGroup = new ButtonGroup();
Level[] levels = new Level[] {Level.OFF, Level.SEVERE, Level.WARNING, Level.INFO,
Level.CONFIG, Level.FINE, Level.FINER, Level.FINEST, Level.ALL};
for(Level level : levels) {
JRadioButtonLevel jRadioButtonLevel = new JRadioButtonLevel(level);
buttonGroup.add(jRadioButtonLevel);
box.add(jRadioButtonLevel);
}
jPanelBlenderFilesListAndLogLevel.add(box, BorderLayout.SOUTH);
return jPanelBlenderFilesListAndLogLevel;
}
/**
* This method prepares a swing panel containing the file's animations.
* @return prepared swing panel
*/
protected JPanel prepareFilePropertiesPanel() {
//properties table
JPanel jPanelProperties = new JPanel();
jPanelProperties.setBorder(new EmptyBorder(new Insets(0, 5, 0, 5)));
jPanelProperties.setLayout(new BorderLayout());
jPanelProperties.add(new JLabel("Properties"), BorderLayout.NORTH);
jTableProperties = new JTable();
jTableProperties.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
jTableProperties.setModel(new BlenderTableModel(new Object[] {"Name", "Value"}));
jTableProperties.getColumnModel().getColumn(1).setCellEditor(new BlenderTableCellEditor());
JScrollPane jScrollPaneProperties = new JScrollPane(jTableProperties);
jTableProperties.setFillsViewportHeight(true);
jPanelProperties.add(jScrollPaneProperties, BorderLayout.CENTER);
//animations table
JPanel jPanelAnimations = new JPanel();
jPanelAnimations.setBorder(new EmptyBorder(new Insets(0, 5, 0, 5)));
jPanelAnimations.setLayout(new BorderLayout());
jPanelAnimations.add(new JLabel("Animations"), BorderLayout.NORTH);
jTableAnimations = new JTable();
jTableAnimations.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
jTableAnimations.setModel(new DefaultTableModel(new Object[] {"Object", "Name", "Start frame", "Stop frame"}, 0));
for(int i=0;i<jTableAnimations.getColumnModel().getColumnCount();++i) {
jTableAnimations.getColumnModel().getColumn(i).setCellEditor(new BlenderTableCellEditor());
}
JScrollPane jScrollPaneAnimations = new JScrollPane(jTableAnimations);
jTableAnimations.setFillsViewportHeight(true);
JPanel jPanelTableButtons = new JPanel();
jPanelTableButtons.setLayout(new FlowLayout(FlowLayout.LEFT));
jButtonAddAnimation = new JButton("Add animation");
jButtonAddAnimation.setEnabled(false);
jButtonRemoveAnimation = new JButton("Remove animation");
jButtonRemoveAnimation.setEnabled(false);
jPanelTableButtons.add(jButtonAddAnimation);
jPanelTableButtons.add(jButtonRemoveAnimation);
jPanelAnimations.add(jScrollPaneAnimations, BorderLayout.CENTER);
jPanelAnimations.add(jPanelTableButtons, BorderLayout.SOUTH);
//model key check-box
jCheckBoxUseModelKey = new JCheckBox();
jCheckBoxUseModelKey.setText("Use ModelKey to start the test");
jCheckBoxUseModelKey.setToolTipText("All BlenderKey settings will remain here, but the application will be " +
"started using a model key. So only the path to the file will be given!");
//building the result panel
JPanel jPanelResult = new JPanel();
jPanelResult.setBorder(new TitledBorder("Loading properties"));
jPanelResult.setLayout(new BorderLayout());
jPanelResult.add(jPanelProperties, BorderLayout.WEST);
jPanelResult.add(jPanelAnimations, BorderLayout.CENTER);
jPanelResult.add(jCheckBoxUseModelKey, BorderLayout.SOUTH);
return jPanelResult;
}
/**
* This method prepares a swing panel containing the buttons.
* @return prepared swing panel
*/
protected JPanel prepareButtonsPanel() {
JPanel jPanelButtons = new JPanel();
jButtonOK = new JButton("OK");
jButtonOK.setEnabled(false);
jPanelButtons.add(jButtonOK);
jButtonCancel = new JButton("Cancel");
jPanelButtons.add(jButtonCancel);
return jPanelButtons;
}
/**
* This class was made only to make the selection of a level radio button easier.
* @author Marcin Roguski
*/
protected static class JRadioButtonLevel extends JRadioButton {
private static final long serialVersionUID = 8874525909060993518L;
private static Level selectedLevel;
private static Map<Level, JRadioButtonLevel> radioButtons = new HashMap<Level, AbstractConfigDialog.JRadioButtonLevel>();
private Level level;
/**
* Constructor. Creates the radio button.
* Stores it inside the buttons map.
* @param level the level of log info
*/
public JRadioButtonLevel(Level level) {
super(level.getName());
this.level = level;
radioButtons.put(level, this);
this.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JRadioButtonLevel.selectedLevel = JRadioButtonLevel.this.level;
}
});
}
/**
* This method returns the currently selected info level.
* @return currently selected info level
*/
public static Level getSelectedLevel() {
return selectedLevel;
}
/**
* This method sets the current info level.
* @param level the current info level
*/
public static synchronized void setSelectedLevel(Level level) {
radioButtons.get(level).setSelected(true);
}
}
/**
* This class is an item that should be stored in the files' list.
* @author Marcin Roguski (Kaelthas)
*/
protected static class FileListItem {
private File file; //the file to be stored
/**
* Constructore. Stores the given file.
* @param file the file to be stored
*/
public FileListItem(File file) {
this.file = file;
}
/**
* This method returns the stored file.
* @return the stored file
*/
public File getFile() {
return file;
}
@Override
public String toString() {
return file.getName();
}
}
/**
* The model for properties table.
* It makes left column ineditable.
* @author Marcin Roguski (Kaelthas)
*/
protected static class BlenderTableModel extends DefaultTableModel {
private static final long serialVersionUID = -4211206550875326553L;
/**
* Constructor only calls super-constuctor.
* @param columnNames the names of table columns
*/
public BlenderTableModel(Object[] columnNames) {
super(columnNames, 0);
}
@Override
public void addRow(Object[] rowData) {
for(int i=0;i<rowData.length;++i) {
if(rowData[i]==null) {
rowData[i] = "";
}
}
super.addRow(rowData);
}
@Override
public boolean isCellEditable(int row, int column) {
return column>0;
}
}
/**
* A cell editor tah improves data input to the table.
* @author Marcin Roguski (Kaelthas)
*/
protected static class BlenderTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private static final long serialVersionUID = -8601975203921608519L;
private JCheckBox jCheckBox = new JCheckBox();
private JTextField jTextField = new JTextField();
private JComboBox jComboBox = new JComboBox();
private Object lastValue;
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
this.lastValue = value;
if(value instanceof Boolean) {
jCheckBox.setSelected(((Boolean) value).booleanValue());
return jCheckBox;
} else if(value instanceof String || value instanceof Number || value instanceof Character) {
jTextField.setText(value.toString());
return jTextField;
} else if(value instanceof Enum<?>) {
DefaultComboBoxModel defaultComboBoxModel = (DefaultComboBoxModel)jComboBox.getModel();
defaultComboBoxModel.removeAllElements();
for(Object object : value.getClass().getEnumConstants()) {
defaultComboBoxModel.addElement(object);
}
return jComboBox;
}
else {
jTextField.setText(value==null ? "" : value.toString());
return jTextField;
}
}
@Override
public Object getCellEditorValue() {
if(lastValue instanceof Boolean) {
return Boolean.valueOf(jCheckBox.isSelected());
} else if(lastValue instanceof String) {
return jTextField.getText();
} else if(lastValue instanceof Character) {
return Character.valueOf(jTextField.getText().charAt(0));
} else if(lastValue instanceof Byte) {
return Byte.valueOf(jTextField.getText());
} else if(lastValue instanceof Short) {
return Short.valueOf(jTextField.getText());
} else if(lastValue instanceof Integer) {
return Integer.valueOf(jTextField.getText());
} else if(lastValue instanceof Long) {
return Long.valueOf(jTextField.getText());
} else if(lastValue instanceof Float) {
return Float.valueOf(jTextField.getText());
} else if(lastValue instanceof Double) {
return Double.valueOf(jTextField.getText());
} else if(lastValue instanceof Enum<?>) {
return jComboBox.getSelectedItem();
}
//TODO: savable objects
return null;
}
}
}

@ -0,0 +1,440 @@
/**
*
*/
package jme3test.blender.config;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import com.jme3.asset.BlenderKey;
import com.jme3.asset.ModelKey;
import com.jme3.export.InputCapsule;
import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule;
import com.jme3.export.Savable;
import com.jme3.export.binary.BinaryExporter;
import com.jme3.export.binary.BinaryImporter;
/**
* A class that shows a dialog box for blender testing configuration.
* @author Marcin Roguski (Kaelthas)
*/
public class ConfigDialog extends AbstractConfigDialog {
private static final long serialVersionUID = 2863364888664674247L;
private static final Logger LOGGER = Logger.getLogger(ConfigDialog.class.getName());
private String baseFolderName;
private File configFile; //the config file
private Map<String, BlenderKeyConfiguration> configMap; //the blender key configuration map
private BlenderKeyConfiguration blenderKeyConfiguration;//the configuration for the files
private IConfigExecutable configExecutable; //this is called after clicking the 'OK' button
/**
* Constructor. Builds the whole window and stores its data.
* @param testAssetsFolderName the path to test files folder
*/
public ConfigDialog(String baseFolderName, IConfigExecutable configExecutable) {
if(baseFolderName==null) {
throw new IllegalArgumentException("No test asset folder given!");
}
if(configExecutable==null) {
throw new IllegalArgumentException("No config executable given!");
}
this.baseFolderName = baseFolderName;
this.configExecutable = configExecutable;
this.configMap = new HashMap<String, ConfigDialog.BlenderKeyConfiguration>();
//setting up version selection (as a folder list in a compo box)
File baseFolder = new File(baseFolderName);
if(!baseFolder.exists() || !baseFolder.isDirectory()) {
throw new IllegalArgumentException("The given base folder path either does not exists or does not point to a directory!");
}
File[] folders = baseFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory() && file.getName().charAt(0)!='.';
}
});
for(File folder : folders) {
((DefaultComboBoxModel)jComboBoxVersionSelection.getModel()).addElement(folder.getName());
configMap.put(folder.getName(), null);
}
this.initListeners();
jComboBoxVersionSelection.setSelectedIndex(0);
}
/**
* This method returns the selected blender key.
* @return the selected blender key
*/
public BlenderKey getSelectedBlenderKey() {
return blenderKeyConfiguration.lastUsedKey;
}
/**
* This method prepares the blender files' list.
* @param testAssetsFolderName the path to test files folder
* @return array of blender files
*/
private File[] prepareFilesList(String testAssetsFolderName) {
File testAssetsFolder = new File(testAssetsFolderName);
//loading blender files
File[] blenderFiles = testAssetsFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.canRead() && file.getName().endsWith(".blend");
}
});
//loading the blender files configuration
File[] files = testAssetsFolder.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile() && file.canRead() && file.getName().endsWith(".conf");
}
});
if (files == null || files.length == 0) {
blenderKeyConfiguration = new BlenderKeyConfiguration(blenderFiles.length);
} else {
BinaryImporter jmeImporter = new BinaryImporter();
String instructionToUser = files.length==1 ?
"No other config file to load! No configuration set!" :
"Please choose different config file!";
do {
if (files.length > 1) {
configFile = (File) JOptionPane.showInputDialog(null, "Choose the config file!", "Config file selection",
JOptionPane.INFORMATION_MESSAGE, null, files, files[0]);
} else {
configFile = files[0];
}
if(configFile==null) {
JOptionPane.showMessageDialog(this, "No config file selected!\nEmpty configuration will be created!",
"No configuration selected", JOptionPane.INFORMATION_MESSAGE);
blenderKeyConfiguration = new BlenderKeyConfiguration(blenderFiles.length);
} else {
try {
Savable loadedData = jmeImporter.load(configFile);
if (loadedData instanceof BlenderKeyConfiguration) {
blenderKeyConfiguration = (BlenderKeyConfiguration) loadedData;
} else {
LOGGER.warning("Cannot load data drom the given file!");
JOptionPane.showMessageDialog(this, "The data stored in the config file is of invalid type!\n"
+ instructionToUser, "Config data error", JOptionPane.ERROR_MESSAGE);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "Unable to load configuration! Reason: " + e.getLocalizedMessage(),
"Loading data error", JOptionPane.ERROR_MESSAGE);
LOGGER.severe("Unable to load configuration");
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Unable to load configuration!",
"Loading data error", JOptionPane.ERROR_MESSAGE);
LOGGER.log(Level.SEVERE, "Unable to load configuration due to unpredicted error!", e);
}
}
} while (blenderKeyConfiguration == null && files.length>1);
}
configFile = new File(testAssetsFolder, "test.conf");
jCheckBoxUseModelKey.setSelected(blenderKeyConfiguration.useModelKey);
//enlisting the files in the list
DefaultListModel defaultListModel = (DefaultListModel) jListBlenderFiles.getModel();
defaultListModel.removeAllElements();
for(int i=0; i<blenderFiles.length; ++i) {
defaultListModel.addElement(new FileListItem(blenderFiles[i]));
}
return blenderFiles;
}
/**
* This method fills the properties panel with blender key data.
* @param blenderKey the belnder key data
*/
private void setBlenderKey(BlenderKey blenderKey) {
//setting properties
BlenderTableModel propertiesModel = (BlenderTableModel) jTableProperties.getModel();
int rowCount = propertiesModel.getRowCount();
for(int i=0;i<rowCount;++i) {
propertiesModel.removeRow(0);
}
Field[] fields = blenderKey.getClass().getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
if(!"animations".equalsIgnoreCase(field.getName()) &&
(field.getModifiers() & Modifier.STATIC)==0) {
try {
propertiesModel.addRow(new Object[] {field.getName(), field.get(blenderKey)});
} catch (IllegalArgumentException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (IllegalAccessException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
}
//setting animations
DefaultTableModel animationsModel = (DefaultTableModel) jTableAnimations.getModel();
rowCount = animationsModel.getRowCount();
for(int i=0;i<rowCount;++i) {
animationsModel.removeRow(0);
}
Map<String, Map<String, int[]>> animations = blenderKey.getAnimations();
if(animations!=null) {
for(Entry<String, Map<String, int[]>> animationEntry : animations.entrySet()) {
for(Entry<String, int[]> animDataEntry : animationEntry.getValue().entrySet()) {
int[] frames = animDataEntry.getValue();
animationsModel.addRow(new Object[] {animationEntry.getKey(), animDataEntry.getKey(),
Integer.valueOf(frames[0]), Integer.valueOf(frames[1])});
}
}
}
this.jButtonOK.setEnabled(true);
this.jButtonOK.requestFocusInWindow();
this.jButtonAddAnimation.setEnabled(true);
}
/**
* This method stores the current blender config.
* @param configuration the blender config to store
*/
private void storeConfig(BlenderKeyConfiguration configuration) {
if(configuration.lastUsedKey!=null) {//reading animations
DefaultTableModel animationsTableModel = (DefaultTableModel)jTableAnimations.getModel();
if(configuration.lastUsedKey.getAnimations()!=null) {
configuration.lastUsedKey.getAnimations().clear();
}
int animCounter = 0;
for(int i=0;i<animationsTableModel.getRowCount();++i) {
String objectName = (String)animationsTableModel.getValueAt(i, 0);
String animName = (String)animationsTableModel.getValueAt(i, 1);
Number startFrame = (Number)animationsTableModel.getValueAt(i, 2);
Number stopFrame = (Number)animationsTableModel.getValueAt(i, 3);
if(objectName!=null && animName!=null && startFrame.intValue()<=stopFrame.intValue()) {
configuration.lastUsedKey.addAnimation(objectName, animName, startFrame.intValue(), stopFrame.intValue());
++animCounter;
}
}
if(animCounter<animationsTableModel.getRowCount()) {
JOptionPane.showMessageDialog(ConfigDialog.this, "Some animations had errors!\nThey had not been added!",
"Invalid animations definitions", JOptionPane.WARNING_MESSAGE);
}
}
//getting the key type
configuration.useModelKey = jCheckBoxUseModelKey.isSelected();
configuration.logLevel = JRadioButtonLevel.getSelectedLevel();
//storing the config
JmeExporter jmeExporter = new BinaryExporter();
try {
if(!jmeExporter.save(configuration, configFile)) {
JOptionPane.showMessageDialog(ConfigDialog.this, "Unable to save the config data!", "Config save problem", JOptionPane.ERROR_MESSAGE);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(ConfigDialog.this, "Error occured during config saving!\nReason: " + e.getLocalizedMessage(),
"Config save problem", JOptionPane.ERROR_MESSAGE);
}
}
/**
* This method initiates components listeners.
*/
private void initListeners() {
//selection of blender version
jComboBoxVersionSelection.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
//save the previous congifuration
if(blenderKeyConfiguration!=null) {
ConfigDialog.this.storeConfig(blenderKeyConfiguration);
blenderKeyConfiguration = null;
}
//load new configuration
File[] blenderFiles = ConfigDialog.this.prepareFilesList(baseFolderName+'/'+jComboBoxVersionSelection.getSelectedItem().toString());
if(blenderKeyConfiguration.lastUsedKey!=null) {
for(int i=0;i<blenderFiles.length; ++i) {
if(blenderFiles[i].getPath().equalsIgnoreCase(blenderKeyConfiguration.lastUsedKey.getName())) {
jListBlenderFiles.setSelectedIndex(i);
break;
}
}
}
if(blenderKeyConfiguration.logLevel==null) {
blenderKeyConfiguration.logLevel = Level.INFO;
}
JRadioButtonLevel.setSelectedLevel(blenderKeyConfiguration.logLevel);
}
});
//selection of the file changes the config on the right
jListBlenderFiles.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent evt) {
BlenderKeyConfiguration config = ConfigDialog.this.blenderKeyConfiguration;
FileListItem selectedItem = (FileListItem) ConfigDialog.this.jListBlenderFiles.getSelectedValue();
if(selectedItem != null) {
String fileName = selectedItem.getFile().getName();
config.lastUsedKey = config.blenderKeys.get(fileName);
if(config.lastUsedKey==null) {
config.lastUsedKey = new BlenderKey(selectedItem.getFile().getPath());
config.blenderKeys.put(fileName, config.lastUsedKey);
}
ConfigDialog.this.setBlenderKey(config.lastUsedKey);
} else {
config.lastUsedKey = null;
}
}
});
jTableProperties.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent evt) {
if(evt.getType()==TableModelEvent.UPDATE) {
BlenderKeyConfiguration config = ConfigDialog.this.blenderKeyConfiguration;
int row = evt.getFirstRow();
String name = (String)jTableProperties.getModel().getValueAt(row, 0);
Object value = jTableProperties.getModel().getValueAt(row, 1);
try {
Field field = config.lastUsedKey.getClass().getDeclaredField(name);
field.setAccessible(true);
field.set(config.lastUsedKey, value);
} catch (IllegalArgumentException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (SecurityException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (IllegalAccessException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
} catch (NoSuchFieldException e) {
LOGGER.log(Level.SEVERE, e.getMessage(), e);
}
}
}
});
jTableAnimations.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent evt) {
if(evt.getType()==TableModelEvent.INSERT) {
jButtonRemoveAnimation.setEnabled(true);
} else if(evt.getType()==TableModelEvent.DELETE && jTableAnimations.getModel().getRowCount()==0) {
jButtonRemoveAnimation.setEnabled(false);
}
}
});
jButtonAddAnimation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
((DefaultTableModel)jTableAnimations.getModel()).addRow(new Object[] {"", "", Integer.valueOf(-1), Integer.valueOf(-1)});
}
});
jButtonRemoveAnimation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
int row = jTableAnimations.getSelectedRow();
if(row>=0) {
((DefaultTableModel)jTableAnimations.getModel()).removeRow(row);
}
}
});
//button listeners
jButtonOK.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
ConfigDialog.this.storeConfig(blenderKeyConfiguration);
//running the test
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
configExecutable.execute(ConfigDialog.this.blenderKeyConfiguration.getKeyToUse(),
ConfigDialog.this.blenderKeyConfiguration.logLevel);
}
});
//disposing the config window
ConfigDialog.this.dispose();
}
});
jButtonCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
ConfigDialog.this.dispose();
}
});
}
/**
* This class holds the configuration for all the files.
* It can be saved and loaded using jme mechanisms.
* @author Marcin Roguski (Kaelthas)
*/
public static class BlenderKeyConfiguration implements Savable {
private Map<String, BlenderKey> blenderKeys;
private BlenderKey lastUsedKey;
private Level logLevel;
private boolean useModelKey;
/**
* Constructor for jme serialization.
*/
public BlenderKeyConfiguration() {}
/**
* Constructor that creates new empty configuration for every blender file.
* @param blenderFilesAmount the amount of blender files
*/
public BlenderKeyConfiguration(int blenderFilesAmount) {
blenderKeys = new HashMap<String, BlenderKey>(blenderFilesAmount);
}
/**
* This method returns the key that will be used during the test.
* @return the key that will be used during the test
*/
public ModelKey getKeyToUse() {
return useModelKey ? new ModelKey(lastUsedKey.getName()) : lastUsedKey;
}
@Override
public void write(JmeExporter ex) throws IOException {
OutputCapsule oc = ex.getCapsule(this);
oc.writeStringSavableMap(blenderKeys, "keys", null);
oc.write(lastUsedKey, "last-key", null);
oc.write(useModelKey, "use-model-key", false);
oc.write(logLevel==null ? null : logLevel.getName(), "log-level", Level.INFO.getName());
}
@Override
@SuppressWarnings("unchecked")
public void read(JmeImporter im) throws IOException {
InputCapsule ic = im.getCapsule(this);
blenderKeys = (Map<String, BlenderKey>) ic.readStringSavableMap("keys", null);
lastUsedKey = (BlenderKey) ic.readSavable("last-key", null);
useModelKey = ic.readBoolean("use-model-key", false);
String logLevelName = ic.readString("log-level", Level.INFO.getName());
logLevel = logLevelName==null ? Level.INFO : Level.parse(logLevelName);
}
}
}

@ -0,0 +1,21 @@
package jme3test.blender.config;
import java.util.logging.Level;
import com.jme3.asset.ModelKey;
/**
* This interface provides a method that allows to execute a method after the config has been properly set. It actually runs the test
* itself.
* @author Marcin Roguski (Kaelthas)
*/
public interface IConfigExecutable {
/**
* This method runs the test with the given blender key.
* @param modelKey
* the model key
* @param logLevel
* the jme3 logger log level
*/
void execute(ModelKey modelKey, Level logLevel);
}

@ -0,0 +1,954 @@
package jme3test.blender.config;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
public class NoiseConstantsGenerator {
private static final Logger LOGGER = Logger.getLogger(NoiseConstantsGenerator.class.getName());
private static final String FILE_NAME = "noiseconstants.dat";
public static void main(String[] args) {
NoiseConstantsGenerator noiseConstantsGenerator = new NoiseConstantsGenerator();
noiseConstantsGenerator.setFilePath("./src/com/jme3/scene/plugins/blender/helpers/" + FILE_NAME);
noiseConstantsGenerator.execute();
LOGGER.info("Noise data generation successfull!");
}
private String filePath;
public void execute() {
if(filePath==null) {
throw new IllegalStateException("The output file path cannot be null!");
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filePath);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(hashpntf);
oos.writeObject(hash);
oos.writeObject(hashvectf);
oos.writeObject(p);
oos.writeObject(g);
oos.flush();
} catch (FileNotFoundException e) {
LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
} finally {
if(fos!=null) {
try {
fos.close();
} catch (IOException e) {
LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
}
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
/*
* Constants to be stored.
*/
private static float[] hashpntf = new float[] { 0.536902f, 0.020915f,
0.501445f, 0.216316f, 0.517036f, 0.822466f, 0.965315f, 0.377313f,
0.678764f, 0.744545f, 0.097731f, 0.396357f, 0.247202f, 0.520897f,
0.613396f, 0.542124f, 0.146813f, 0.255489f, 0.810868f, 0.638641f,
0.980742f, 0.292316f, 0.357948f, 0.114382f, 0.861377f, 0.629634f,
0.722530f, 0.714103f, 0.048549f, 0.075668f, 0.564920f, 0.162026f,
0.054466f, 0.411738f, 0.156897f, 0.887657f, 0.599368f, 0.074249f,
0.170277f, 0.225799f, 0.393154f, 0.301348f, 0.057434f, 0.293849f,
0.442745f, 0.150002f, 0.398732f, 0.184582f, 0.915200f, 0.630984f,
0.974040f, 0.117228f, 0.795520f, 0.763238f, 0.158982f, 0.616211f,
0.250825f, 0.906539f, 0.316874f, 0.676205f, 0.234720f, 0.667673f,
0.792225f, 0.273671f, 0.119363f, 0.199131f, 0.856716f, 0.828554f,
0.900718f, 0.705960f, 0.635923f, 0.989433f, 0.027261f, 0.283507f,
0.113426f, 0.388115f, 0.900176f, 0.637741f, 0.438802f, 0.715490f,
0.043692f, 0.202640f, 0.378325f, 0.450325f, 0.471832f, 0.147803f,
0.906899f, 0.524178f, 0.784981f, 0.051483f, 0.893369f, 0.596895f,
0.275635f, 0.391483f, 0.844673f, 0.103061f, 0.257322f, 0.708390f,
0.504091f, 0.199517f, 0.660339f, 0.376071f, 0.038880f, 0.531293f,
0.216116f, 0.138672f, 0.907737f, 0.807994f, 0.659582f, 0.915264f,
0.449075f, 0.627128f, 0.480173f, 0.380942f, 0.018843f, 0.211808f,
0.569701f, 0.082294f, 0.689488f, 0.573060f, 0.593859f, 0.216080f,
0.373159f, 0.108117f, 0.595539f, 0.021768f, 0.380297f, 0.948125f,
0.377833f, 0.319699f, 0.315249f, 0.972805f, 0.792270f, 0.445396f,
0.845323f, 0.372186f, 0.096147f, 0.689405f, 0.423958f, 0.055675f,
0.117940f, 0.328456f, 0.605808f, 0.631768f, 0.372170f, 0.213723f,
0.032700f, 0.447257f, 0.440661f, 0.728488f, 0.299853f, 0.148599f,
0.649212f, 0.498381f, 0.049921f, 0.496112f, 0.607142f, 0.562595f,
0.990246f, 0.739659f, 0.108633f, 0.978156f, 0.209814f, 0.258436f,
0.876021f, 0.309260f, 0.600673f, 0.713597f, 0.576967f, 0.641402f,
0.853930f, 0.029173f, 0.418111f, 0.581593f, 0.008394f, 0.589904f,
0.661574f, 0.979326f, 0.275724f, 0.111109f, 0.440472f, 0.120839f,
0.521602f, 0.648308f, 0.284575f, 0.204501f, 0.153286f, 0.822444f,
0.300786f, 0.303906f, 0.364717f, 0.209038f, 0.916831f, 0.900245f,
0.600685f, 0.890002f, 0.581660f, 0.431154f, 0.705569f, 0.551250f,
0.417075f, 0.403749f, 0.696652f, 0.292652f, 0.911372f, 0.690922f,
0.323718f, 0.036773f, 0.258976f, 0.274265f, 0.225076f, 0.628965f,
0.351644f, 0.065158f, 0.080340f, 0.467271f, 0.130643f, 0.385914f,
0.919315f, 0.253821f, 0.966163f, 0.017439f, 0.392610f, 0.478792f,
0.978185f, 0.072691f, 0.982009f, 0.097987f, 0.731533f, 0.401233f,
0.107570f, 0.349587f, 0.479122f, 0.700598f, 0.481751f, 0.788429f,
0.706864f, 0.120086f, 0.562691f, 0.981797f, 0.001223f, 0.192120f,
0.451543f, 0.173092f, 0.108960f, 0.549594f, 0.587892f, 0.657534f,
0.396365f, 0.125153f, 0.666420f, 0.385823f, 0.890916f, 0.436729f,
0.128114f, 0.369598f, 0.759096f, 0.044677f, 0.904752f, 0.088052f,
0.621148f, 0.005047f, 0.452331f, 0.162032f, 0.494238f, 0.523349f,
0.741829f, 0.698450f, 0.452316f, 0.563487f, 0.819776f, 0.492160f,
0.004210f, 0.647158f, 0.551475f, 0.362995f, 0.177937f, 0.814722f,
0.727729f, 0.867126f, 0.997157f, 0.108149f, 0.085726f, 0.796024f,
0.665075f, 0.362462f, 0.323124f, 0.043718f, 0.042357f, 0.315030f,
0.328954f, 0.870845f, 0.683186f, 0.467922f, 0.514894f, 0.809971f,
0.631979f, 0.176571f, 0.366320f, 0.850621f, 0.505555f, 0.749551f,
0.750830f, 0.401714f, 0.481216f, 0.438393f, 0.508832f, 0.867971f,
0.654581f, 0.058204f, 0.566454f, 0.084124f, 0.548539f, 0.902690f,
0.779571f, 0.562058f, 0.048082f, 0.863109f, 0.079290f, 0.713559f,
0.783496f, 0.265266f, 0.672089f, 0.786939f, 0.143048f, 0.086196f,
0.876129f, 0.408708f, 0.229312f, 0.629995f, 0.206665f, 0.207308f,
0.710079f, 0.341704f, 0.264921f, 0.028748f, 0.629222f, 0.470173f,
0.726228f, 0.125243f, 0.328249f, 0.794187f, 0.741340f, 0.489895f,
0.189396f, 0.724654f, 0.092841f, 0.039809f, 0.860126f, 0.247701f,
0.655331f, 0.964121f, 0.672536f, 0.044522f, 0.690567f, 0.837238f,
0.631520f, 0.953734f, 0.352484f, 0.289026f, 0.034152f, 0.852575f,
0.098454f, 0.795529f, 0.452181f, 0.826159f, 0.186993f, 0.820725f,
0.440328f, 0.922137f, 0.704592f, 0.915437f, 0.738183f, 0.733461f,
0.193798f, 0.929213f, 0.161390f, 0.318547f, 0.888751f, 0.430968f,
0.740837f, 0.193544f, 0.872253f, 0.563074f, 0.274598f, 0.347805f,
0.666176f, 0.449831f, 0.800991f, 0.588727f, 0.052296f, 0.714761f,
0.420620f, 0.570325f, 0.057550f, 0.210888f, 0.407312f, 0.662848f,
0.924382f, 0.895958f, 0.775198f, 0.688605f, 0.025721f, 0.301913f,
0.791408f, 0.500602f, 0.831984f, 0.828509f, 0.642093f, 0.494174f,
0.525880f, 0.446365f, 0.440063f, 0.763114f, 0.630358f, 0.223943f,
0.333806f, 0.906033f, 0.498306f, 0.241278f, 0.427640f, 0.772683f,
0.198082f, 0.225379f, 0.503894f, 0.436599f, 0.016503f, 0.803725f,
0.189878f, 0.291095f, 0.499114f, 0.151573f, 0.079031f, 0.904618f,
0.708535f, 0.273900f, 0.067419f, 0.317124f, 0.936499f, 0.716511f,
0.543845f, 0.939909f, 0.826574f, 0.715090f, 0.154864f, 0.750150f,
0.845808f, 0.648108f, 0.556564f, 0.644757f, 0.140873f, 0.799167f,
0.632989f, 0.444245f, 0.471978f, 0.435910f, 0.359793f, 0.216241f,
0.007633f, 0.337236f, 0.857863f, 0.380247f, 0.092517f, 0.799973f,
0.919000f, 0.296798f, 0.096989f, 0.854831f, 0.165369f, 0.568475f,
0.216855f, 0.020457f, 0.835511f, 0.538039f, 0.999742f, 0.620226f,
0.244053f, 0.060399f, 0.323007f, 0.294874f, 0.988899f, 0.384919f,
0.735655f, 0.773428f, 0.549776f, 0.292882f, 0.660611f, 0.593507f,
0.621118f, 0.175269f, 0.682119f, 0.794493f, 0.868197f, 0.632150f,
0.807823f, 0.509656f, 0.482035f, 0.001780f, 0.259126f, 0.358002f,
0.280263f, 0.192985f, 0.290367f, 0.208111f, 0.917633f, 0.114422f,
0.925491f, 0.981110f, 0.255570f, 0.974862f, 0.016629f, 0.552599f,
0.575741f, 0.612978f, 0.615965f, 0.803615f, 0.772334f, 0.089745f,
0.838812f, 0.634542f, 0.113709f, 0.755832f, 0.577589f, 0.667489f,
0.529834f, 0.325660f, 0.817597f, 0.316557f, 0.335093f, 0.737363f,
0.260951f, 0.737073f, 0.049540f, 0.735541f, 0.988891f, 0.299116f,
0.147695f, 0.417271f, 0.940811f, 0.524160f, 0.857968f, 0.176403f,
0.244835f, 0.485759f, 0.033353f, 0.280319f, 0.750688f, 0.755809f,
0.924208f, 0.095956f, 0.962504f, 0.275584f, 0.173715f, 0.942716f,
0.706721f, 0.078464f, 0.576716f, 0.804667f, 0.559249f, 0.900611f,
0.646904f, 0.432111f, 0.927885f, 0.383277f, 0.269973f, 0.114244f,
0.574867f, 0.150703f, 0.241855f, 0.272871f, 0.199950f, 0.079719f,
0.868566f, 0.962833f, 0.789122f, 0.320025f, 0.905554f, 0.234876f,
0.991356f, 0.061913f, 0.732911f, 0.785960f, 0.874074f, 0.069035f,
0.658632f, 0.309901f, 0.023676f, 0.791603f, 0.764661f, 0.661278f,
0.319583f, 0.829650f, 0.117091f, 0.903124f, 0.982098f, 0.161631f,
0.193576f, 0.670428f, 0.857390f, 0.003760f, 0.572578f, 0.222162f,
0.114551f, 0.420118f, 0.530404f, 0.470682f, 0.525527f, 0.764281f,
0.040596f, 0.443275f, 0.501124f, 0.816161f, 0.417467f, 0.332172f,
0.447565f, 0.614591f, 0.559246f, 0.805295f, 0.226342f, 0.155065f,
0.714630f, 0.160925f, 0.760001f, 0.453456f, 0.093869f, 0.406092f,
0.264801f, 0.720370f, 0.743388f, 0.373269f, 0.403098f, 0.911923f,
0.897249f, 0.147038f, 0.753037f, 0.516093f, 0.739257f, 0.175018f,
0.045768f, 0.735857f, 0.801330f, 0.927708f, 0.240977f, 0.591870f,
0.921831f, 0.540733f, 0.149100f, 0.423152f, 0.806876f, 0.397081f,
0.061100f, 0.811630f, 0.044899f, 0.460915f, 0.961202f, 0.822098f,
0.971524f, 0.867608f, 0.773604f, 0.226616f, 0.686286f, 0.926972f,
0.411613f, 0.267873f, 0.081937f, 0.226124f, 0.295664f, 0.374594f,
0.533240f, 0.237876f, 0.669629f, 0.599083f, 0.513081f, 0.878719f,
0.201577f, 0.721296f, 0.495038f, 0.079760f, 0.965959f, 0.233090f,
0.052496f, 0.714748f, 0.887844f, 0.308724f, 0.972885f, 0.723337f,
0.453089f, 0.914474f, 0.704063f, 0.823198f, 0.834769f, 0.906561f,
0.919600f, 0.100601f, 0.307564f, 0.901977f, 0.468879f, 0.265376f,
0.885188f, 0.683875f, 0.868623f, 0.081032f, 0.466835f, 0.199087f,
0.663437f, 0.812241f, 0.311337f, 0.821361f, 0.356628f, 0.898054f,
0.160781f, 0.222539f, 0.714889f, 0.490287f, 0.984915f, 0.951755f,
0.964097f, 0.641795f, 0.815472f, 0.852732f, 0.862074f, 0.051108f,
0.440139f, 0.323207f, 0.517171f, 0.562984f, 0.115295f, 0.743103f,
0.977914f, 0.337596f, 0.440694f, 0.535879f, 0.959427f, 0.351427f,
0.704361f, 0.010826f, 0.131162f, 0.577080f, 0.349572f, 0.774892f,
0.425796f, 0.072697f, 0.500001f, 0.267322f, 0.909654f, 0.206176f,
0.223987f, 0.937698f, 0.323423f, 0.117501f, 0.490308f, 0.474372f,
0.689943f, 0.168671f, 0.719417f, 0.188928f, 0.330464f, 0.265273f,
0.446271f, 0.171933f, 0.176133f, 0.474616f, 0.140182f, 0.114246f,
0.905043f, 0.713870f, 0.555261f, 0.951333f };
private static short[] hash = new short[] {// 512
0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28,
0x1D, 0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35,
0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59,
0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2,
0x8F, 0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8,
0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57, 0xBC, 0x7F, 0x6B,
0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55,
0x74, 0x50, 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4,
0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E, 0x5C, 0xA1, 0x64, 0xF1,
0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84,
0x34, 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1,
0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D, 0xBF, 0x33, 0x9C, 0x5F, 0x9,
0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30,
0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F,
0xC2, 0xC0, 0xE, 0xB1, 0x23, 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69,
0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B, 0x56,
0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10,
0xB9, 0xCE, 0xC9, 0x8D, 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE,
0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7, 0x2, 0x7D,
0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF,
0x53, 0x7, 0xE0, 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41,
0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD, 0xF0, 0x91, 0xFF,
0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88,
0xFB, 0x5D, 0xA2, 0xA0, 0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3,
0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC, 0x3F,
0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79,
0x32, 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4,
0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48,
0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57,
0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25,
0x4E, 0x5A, 0x55, 0x74, 0x50, 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB,
0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E, 0x5C,
0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C,
0x90, 0x4B, 0x84, 0x34, 0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7,
0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9, 0x44, 0x6D, 0xBF, 0x33,
0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B,
0x46, 0x15, 0x30, 0x27, 0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F,
0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1, 0x23, 0xA7, 0xDF, 0x47,
0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE,
0x6E, 0x9B, 0x56, 0xEF, 0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3,
0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D, 0xDA, 0x2A, 0xBD, 0x68,
0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70,
0xB7, 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E,
0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0, 0x29, 0xA6, 0xC5, 0xE3, 0xF5,
0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD,
0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF,
0x75, 0xA4, 0x88, 0xFB, 0x5D };
private static float[] hashvectf = new float[] {// 768
0.33783f, 0.715698f, -0.611206f, -0.944031f, -0.326599f, -0.045624f,
-0.101074f, -0.416443f, -0.903503f, 0.799286f, 0.49411f,
-0.341949f, -0.854645f, 0.518036f, 0.033936f, 0.42514f, -0.437866f,
-0.792114f, -0.358948f, 0.597046f, 0.717377f, -0.985413f,
0.144714f, 0.089294f, -0.601776f, -0.33728f, -0.723907f,
-0.449921f, 0.594513f, 0.666382f, 0.208313f, -0.10791f, 0.972076f,
0.575317f, 0.060425f, 0.815643f, 0.293365f, -0.875702f, -0.383453f,
0.293762f, 0.465759f, 0.834686f, -0.846008f, -0.233398f, -0.47934f,
-0.115814f, 0.143036f, -0.98291f, 0.204681f, -0.949036f,
-0.239532f, 0.946716f, -0.263947f, 0.184326f, -0.235596f,
0.573822f, 0.784332f, 0.203705f, -0.372253f, -0.905487f, 0.756989f,
-0.651031f, 0.055298f, 0.497803f, 0.814697f, -0.297363f, -0.16214f,
0.063995f, -0.98468f, -0.329254f, 0.834381f, 0.441925f, 0.703827f,
-0.527039f, -0.476227f, 0.956421f, 0.266113f, 0.119781f, 0.480133f,
0.482849f, 0.7323f, -0.18631f, 0.961212f, -0.203125f, -0.748474f,
-0.656921f, -0.090393f, -0.085052f, -0.165253f, 0.982544f,
-0.76947f, 0.628174f, -0.115234f, 0.383148f, 0.537659f, 0.751068f,
0.616486f, -0.668488f, -0.415924f, -0.259979f, -0.630005f,
0.73175f, 0.570953f, -0.087952f, 0.816223f, -0.458008f, 0.023254f,
0.888611f, -0.196167f, 0.976563f, -0.088287f, -0.263885f,
-0.69812f, -0.665527f, 0.437134f, -0.892273f, -0.112793f,
-0.621674f, -0.230438f, 0.748566f, 0.232422f, 0.900574f,
-0.367249f, 0.22229f, -0.796143f, 0.562744f, -0.665497f, -0.73764f,
0.11377f, 0.670135f, 0.704803f, 0.232605f, 0.895599f, 0.429749f,
-0.114655f, -0.11557f, -0.474243f, 0.872742f, 0.621826f, 0.604004f,
-0.498444f, -0.832214f, 0.012756f, 0.55426f, -0.702484f, 0.705994f,
-0.089661f, -0.692017f, 0.649292f, 0.315399f, -0.175995f,
-0.977997f, 0.111877f, 0.096954f, -0.04953f, 0.994019f, 0.635284f,
-0.606689f, -0.477783f, -0.261261f, -0.607422f, -0.750153f,
0.983276f, 0.165436f, 0.075958f, -0.29837f, 0.404083f, -0.864655f,
-0.638672f, 0.507721f, 0.578156f, 0.388214f, 0.412079f, 0.824249f,
0.556183f, -0.208832f, 0.804352f, 0.778442f, 0.562012f, 0.27951f,
-0.616577f, 0.781921f, -0.091522f, 0.196289f, 0.051056f, 0.979187f,
-0.121216f, 0.207153f, -0.970734f, -0.173401f, -0.384735f,
0.906555f, 0.161499f, -0.723236f, -0.671387f, 0.178497f,
-0.006226f, -0.983887f, -0.126038f, 0.15799f, 0.97934f, 0.830475f,
-0.024811f, 0.556458f, -0.510132f, -0.76944f, 0.384247f, 0.81424f,
0.200104f, -0.544891f, -0.112549f, -0.393311f, -0.912445f,
0.56189f, 0.152222f, -0.813049f, 0.198914f, -0.254517f, -0.946381f,
-0.41217f, 0.690979f, -0.593811f, -0.407257f, 0.324524f, 0.853668f,
-0.690186f, 0.366119f, -0.624115f, -0.428345f, 0.844147f,
-0.322296f, -0.21228f, -0.297546f, -0.930756f, -0.273071f,
0.516113f, 0.811798f, 0.928314f, 0.371643f, 0.007233f, 0.785828f,
-0.479218f, -0.390778f, -0.704895f, 0.058929f, 0.706818f,
0.173248f, 0.203583f, 0.963562f, 0.422211f, -0.904297f, -0.062469f,
-0.363312f, -0.182465f, 0.913605f, 0.254028f, -0.552307f,
-0.793945f, -0.28891f, -0.765747f, -0.574554f, 0.058319f,
0.291382f, 0.954803f, 0.946136f, -0.303925f, 0.111267f, -0.078156f,
0.443695f, -0.892731f, 0.182098f, 0.89389f, 0.409515f, -0.680298f,
-0.213318f, 0.701141f, 0.062469f, 0.848389f, -0.525635f, -0.72879f,
-0.641846f, 0.238342f, -0.88089f, 0.427673f, 0.202637f, -0.532501f,
-0.21405f, 0.818878f, 0.948975f, -0.305084f, 0.07962f, 0.925446f,
0.374664f, 0.055817f, 0.820923f, 0.565491f, 0.079102f, 0.25882f,
0.099792f, -0.960724f, -0.294617f, 0.910522f, 0.289978f, 0.137115f,
0.320038f, -0.937408f, -0.908386f, 0.345276f, -0.235718f,
-0.936218f, 0.138763f, 0.322754f, 0.366577f, 0.925934f, -0.090637f,
0.309296f, -0.686829f, -0.657684f, 0.66983f, 0.024445f, 0.742065f,
-0.917999f, -0.059113f, -0.392059f, 0.365509f, 0.462158f,
-0.807922f, 0.083374f, 0.996399f, -0.014801f, 0.593842f, 0.253143f,
-0.763672f, 0.974976f, -0.165466f, 0.148285f, 0.918976f, 0.137299f,
0.369537f, 0.294952f, 0.694977f, 0.655731f, 0.943085f, 0.152618f,
-0.295319f, 0.58783f, -0.598236f, 0.544495f, 0.203796f, 0.678223f,
0.705994f, -0.478821f, -0.661011f, 0.577667f, 0.719055f, -0.1698f,
-0.673828f, -0.132172f, -0.965332f, 0.225006f, -0.981873f,
-0.14502f, 0.121979f, 0.763458f, 0.579742f, 0.284546f, -0.893188f,
0.079681f, 0.442474f, -0.795776f, -0.523804f, 0.303802f, 0.734955f,
0.67804f, -0.007446f, 0.15506f, 0.986267f, -0.056183f, 0.258026f,
0.571503f, -0.778931f, -0.681549f, -0.702087f, -0.206116f,
-0.96286f, -0.177185f, 0.203613f, -0.470978f, -0.515106f,
0.716095f, -0.740326f, 0.57135f, 0.354095f, -0.56012f, -0.824982f,
-0.074982f, -0.507874f, 0.753204f, 0.417969f, -0.503113f,
0.038147f, 0.863342f, 0.594025f, 0.673553f, -0.439758f, -0.119873f,
-0.005524f, -0.992737f, 0.098267f, -0.213776f, 0.971893f,
-0.615631f, 0.643951f, 0.454163f, 0.896851f, -0.441071f, 0.032166f,
-0.555023f, 0.750763f, -0.358093f, 0.398773f, 0.304688f, 0.864929f,
-0.722961f, 0.303589f, 0.620544f, -0.63559f, -0.621948f,
-0.457306f, -0.293243f, 0.072327f, 0.953278f, -0.491638f,
0.661041f, -0.566772f, -0.304199f, -0.572083f, -0.761688f,
0.908081f, -0.398956f, 0.127014f, -0.523621f, -0.549683f,
-0.650848f, -0.932922f, -0.19986f, 0.299408f, 0.099426f, 0.140869f,
0.984985f, -0.020325f, -0.999756f, -0.002319f, 0.952667f,
0.280853f, -0.11615f, -0.971893f, 0.082581f, 0.220337f, 0.65921f,
0.705292f, -0.260651f, 0.733063f, -0.175537f, 0.657043f,
-0.555206f, 0.429504f, -0.712189f, 0.400421f, -0.89859f, 0.179352f,
0.750885f, -0.19696f, 0.630341f, 0.785675f, -0.569336f, 0.241821f,
-0.058899f, -0.464111f, 0.883789f, 0.129608f, -0.94519f, 0.299622f,
-0.357819f, 0.907654f, 0.219238f, -0.842133f, -0.439117f,
-0.312927f, -0.313477f, 0.84433f, 0.434479f, -0.241211f, 0.053253f,
0.968994f, 0.063873f, 0.823273f, 0.563965f, 0.476288f, 0.862152f,
-0.172516f, 0.620941f, -0.298126f, 0.724915f, 0.25238f, -0.749359f,
-0.612122f, -0.577545f, 0.386566f, 0.718994f, -0.406342f,
-0.737976f, 0.538696f, 0.04718f, 0.556305f, 0.82959f, -0.802856f,
0.587463f, 0.101166f, -0.707733f, -0.705963f, 0.026428f, 0.374908f,
0.68457f, 0.625092f, 0.472137f, 0.208405f, -0.856506f, -0.703064f,
-0.581085f, -0.409821f, -0.417206f, -0.736328f, 0.532623f,
-0.447876f, -0.20285f, -0.870728f, 0.086945f, -0.990417f,
0.107086f, 0.183685f, 0.018341f, -0.982788f, 0.560638f, -0.428864f,
0.708282f, 0.296722f, -0.952576f, -0.0672f, 0.135773f, 0.990265f,
0.030243f, -0.068787f, 0.654724f, 0.752686f, 0.762604f, -0.551758f,
0.337585f, -0.819611f, -0.407684f, 0.402466f, -0.727844f,
-0.55072f, -0.408539f, -0.855774f, -0.480011f, 0.19281f, 0.693176f,
-0.079285f, 0.716339f, 0.226013f, 0.650116f, -0.725433f, 0.246704f,
0.953369f, -0.173553f, -0.970398f, -0.239227f, -0.03244f,
0.136383f, -0.394318f, 0.908752f, 0.813232f, 0.558167f, 0.164368f,
0.40451f, 0.549042f, -0.731323f, -0.380249f, -0.566711f, 0.730865f,
0.022156f, 0.932739f, 0.359741f, 0.00824f, 0.996552f, -0.082306f,
0.956635f, -0.065338f, -0.283722f, -0.743561f, 0.008209f,
0.668579f, -0.859589f, -0.509674f, 0.035767f, -0.852234f,
0.363678f, -0.375977f, -0.201965f, -0.970795f, -0.12915f,
0.313477f, 0.947327f, 0.06546f, -0.254028f, -0.528259f, 0.81015f,
0.628052f, 0.601105f, 0.49411f, -0.494385f, 0.868378f, 0.037933f,
0.275635f, -0.086426f, 0.957336f, -0.197937f, 0.468903f,
-0.860748f, 0.895599f, 0.399384f, 0.195801f, 0.560791f, 0.825012f,
-0.069214f, 0.304199f, -0.849487f, 0.43103f, 0.096375f, 0.93576f,
0.339111f, -0.051422f, 0.408966f, -0.911072f, 0.330444f, 0.942841f,
-0.042389f, -0.452362f, -0.786407f, 0.420563f, 0.134308f,
-0.933472f, -0.332489f, 0.80191f, -0.566711f, -0.188934f,
-0.987946f, -0.105988f, 0.112518f, -0.24408f, 0.892242f,
-0.379791f, -0.920502f, 0.229095f, -0.316376f, 0.7789f, 0.325958f,
0.535706f, -0.912872f, 0.185211f, -0.36377f, -0.184784f, 0.565369f,
-0.803833f, -0.018463f, 0.119537f, 0.992615f, -0.259247f,
-0.935608f, 0.239532f, -0.82373f, -0.449127f, -0.345947f,
-0.433105f, 0.659515f, 0.614349f, -0.822754f, 0.378845f,
-0.423676f, 0.687195f, -0.674835f, -0.26889f, -0.246582f,
-0.800842f, 0.545715f, -0.729187f, -0.207794f, 0.651978f,
0.653534f, -0.610443f, -0.447388f, 0.492584f, -0.023346f,
0.869934f, 0.609039f, 0.009094f, -0.79306f, 0.962494f, -0.271088f,
-0.00885f, 0.2659f, -0.004913f, 0.963959f, 0.651245f, 0.553619f,
-0.518951f, 0.280548f, -0.84314f, 0.458618f, -0.175293f,
-0.983215f, 0.049805f, 0.035339f, -0.979919f, 0.196045f,
-0.982941f, 0.164307f, -0.082245f, 0.233734f, -0.97226f,
-0.005005f, -0.747253f, -0.611328f, 0.260437f, 0.645599f,
0.592773f, 0.481384f, 0.117706f, -0.949524f, -0.29068f, -0.535004f,
-0.791901f, -0.294312f, -0.627167f, -0.214447f, 0.748718f,
-0.047974f, -0.813477f, -0.57959f, -0.175537f, 0.477264f,
-0.860992f, 0.738556f, -0.414246f, -0.53183f, 0.562561f,
-0.704071f, 0.433289f, -0.754944f, 0.64801f, -0.100586f, 0.114716f,
0.044525f, -0.992371f, 0.966003f, 0.244873f, -0.082764f };
/* ********************* FROM PERLIN HIMSELF: ******************** */
// 512 + 2
private static short[] p = new short[] { 0xA2, 0xA0, 0x19, 0x3B, 0xF8,
0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D, 0xED, 0x0, 0xDE,
0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D, 0x6C, 0xBA, 0x36,
0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59, 0xF4, 0x8, 0x8B, 0x63,
0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F, 0x18, 0xC7, 0x51,
0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80, 0xB5, 0x40, 0x13,
0xB2, 0x22, 0x7E, 0x57, 0xBC, 0x7F, 0x6B, 0x9D, 0x86, 0x4C, 0xC8,
0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74, 0x50, 0xCD, 0xB3,
0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC, 0xFD, 0x98, 0xB,
0x96, 0xD3, 0x9E, 0x5C, 0xA1, 0x64, 0xF1, 0x81, 0x61, 0xE1, 0xC4,
0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34, 0x38, 0xAB, 0x78,
0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58, 0xA9, 0x31, 0xF9,
0x44, 0x6D, 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94, 0xA3, 0x85, 0x6,
0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30, 0x27, 0x2B, 0x1B, 0x71,
0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2, 0xC0, 0xE, 0xB1,
0x23, 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5, 0xE9, 0xE6, 0xE7,
0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B, 0x56, 0xEF, 0x12, 0xA5, 0x37,
0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9, 0xCE, 0xC9, 0x8D,
0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4, 0xA, 0xCC, 0xD2,
0xE8, 0x43, 0x3D, 0x70, 0xB7, 0x2, 0x7D, 0x99, 0xD8, 0xD, 0x60,
0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53, 0x7, 0xE0, 0x29,
0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26, 0x6A, 0x16, 0x5E,
0x52, 0x2D, 0x21, 0xAD, 0xF0, 0x91, 0xFF, 0xEA, 0x54, 0xFA, 0x66,
0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB, 0x5D, 0xA2, 0xA0,
0x19, 0x3B, 0xF8, 0xEB, 0xAA, 0xEE, 0xF3, 0x1C, 0x67, 0x28, 0x1D,
0xED, 0x0, 0xDE, 0x95, 0x2E, 0xDC, 0x3F, 0x3A, 0x82, 0x35, 0x4D,
0x6C, 0xBA, 0x36, 0xD0, 0xF6, 0xC, 0x79, 0x32, 0xD1, 0x59, 0xF4,
0x8, 0x8B, 0x63, 0x89, 0x2F, 0xB8, 0xB4, 0x97, 0x83, 0xF2, 0x8F,
0x18, 0xC7, 0x51, 0x14, 0x65, 0x87, 0x48, 0x20, 0x42, 0xA8, 0x80,
0xB5, 0x40, 0x13, 0xB2, 0x22, 0x7E, 0x57, 0xBC, 0x7F, 0x6B, 0x9D,
0x86, 0x4C, 0xC8, 0xDB, 0x7C, 0xD5, 0x25, 0x4E, 0x5A, 0x55, 0x74,
0x50, 0xCD, 0xB3, 0x7A, 0xBB, 0xC3, 0xCB, 0xB6, 0xE2, 0xE4, 0xEC,
0xFD, 0x98, 0xB, 0x96, 0xD3, 0x9E, 0x5C, 0xA1, 0x64, 0xF1, 0x81,
0x61, 0xE1, 0xC4, 0x24, 0x72, 0x49, 0x8C, 0x90, 0x4B, 0x84, 0x34,
0x38, 0xAB, 0x78, 0xCA, 0x1F, 0x1, 0xD7, 0x93, 0x11, 0xC1, 0x58,
0xA9, 0x31, 0xF9, 0x44, 0x6D, 0xBF, 0x33, 0x9C, 0x5F, 0x9, 0x94,
0xA3, 0x85, 0x6, 0xC6, 0x9A, 0x1E, 0x7B, 0x46, 0x15, 0x30, 0x27,
0x2B, 0x1B, 0x71, 0x3C, 0x5B, 0xD6, 0x6F, 0x62, 0xAC, 0x4F, 0xC2,
0xC0, 0xE, 0xB1, 0x23, 0xA7, 0xDF, 0x47, 0xB0, 0x77, 0x69, 0x5,
0xE9, 0xE6, 0xE7, 0x76, 0x73, 0xF, 0xFE, 0x6E, 0x9B, 0x56, 0xEF,
0x12, 0xA5, 0x37, 0xFC, 0xAE, 0xD9, 0x3, 0x8E, 0xDD, 0x10, 0xB9,
0xCE, 0xC9, 0x8D, 0xDA, 0x2A, 0xBD, 0x68, 0x17, 0x9F, 0xBE, 0xD4,
0xA, 0xCC, 0xD2, 0xE8, 0x43, 0x3D, 0x70, 0xB7, 0x2, 0x7D, 0x99,
0xD8, 0xD, 0x60, 0x8A, 0x4, 0x2C, 0x3E, 0x92, 0xE5, 0xAF, 0x53,
0x7, 0xE0, 0x29, 0xA6, 0xC5, 0xE3, 0xF5, 0xF7, 0x4A, 0x41, 0x26,
0x6A, 0x16, 0x5E, 0x52, 0x2D, 0x21, 0xAD, 0xF0, 0x91, 0xFF, 0xEA,
0x54, 0xFA, 0x66, 0x1A, 0x45, 0x39, 0xCF, 0x75, 0xA4, 0x88, 0xFB,
0x5D, 0xA2, 0xA0 };
// [512+2][3]
private static float[][] g = new float[][] {
{ 0.33783f, 0.715698f, -0.611206f },
{ -0.944031f, -0.326599f, -0.045624f },
{ -0.101074f, -0.416443f, -0.903503f },
{ 0.799286f, 0.49411f, -0.341949f },
{ -0.854645f, 0.518036f, 0.033936f },
{ 0.42514f, -0.437866f, -0.792114f },
{ -0.358948f, 0.597046f, 0.717377f },
{ -0.985413f, 0.144714f, 0.089294f },
{ -0.601776f, -0.33728f, -0.723907f },
{ -0.449921f, 0.594513f, 0.666382f },
{ 0.208313f, -0.10791f, 0.972076f },
{ 0.575317f, 0.060425f, 0.815643f },
{ 0.293365f, -0.875702f, -0.383453f },
{ 0.293762f, 0.465759f, 0.834686f },
{ -0.846008f, -0.233398f, -0.47934f },
{ -0.115814f, 0.143036f, -0.98291f },
{ 0.204681f, -0.949036f, -0.239532f },
{ 0.946716f, -0.263947f, 0.184326f },
{ -0.235596f, 0.573822f, 0.784332f },
{ 0.203705f, -0.372253f, -0.905487f },
{ 0.756989f, -0.651031f, 0.055298f },
{ 0.497803f, 0.814697f, -0.297363f },
{ -0.16214f, 0.063995f, -0.98468f },
{ -0.329254f, 0.834381f, 0.441925f },
{ 0.703827f, -0.527039f, -0.476227f },
{ 0.956421f, 0.266113f, 0.119781f },
{ 0.480133f, 0.482849f, 0.7323f },
{ -0.18631f, 0.961212f, -0.203125f },
{ -0.748474f, -0.656921f, -0.090393f },
{ -0.085052f, -0.165253f, 0.982544f },
{ -0.76947f, 0.628174f, -0.115234f },
{ 0.383148f, 0.537659f, 0.751068f },
{ 0.616486f, -0.668488f, -0.415924f },
{ -0.259979f, -0.630005f, 0.73175f },
{ 0.570953f, -0.087952f, 0.816223f },
{ -0.458008f, 0.023254f, 0.888611f },
{ -0.196167f, 0.976563f, -0.088287f },
{ -0.263885f, -0.69812f, -0.665527f },
{ 0.437134f, -0.892273f, -0.112793f },
{ -0.621674f, -0.230438f, 0.748566f },
{ 0.232422f, 0.900574f, -0.367249f },
{ 0.22229f, -0.796143f, 0.562744f },
{ -0.665497f, -0.73764f, 0.11377f },
{ 0.670135f, 0.704803f, 0.232605f },
{ 0.895599f, 0.429749f, -0.114655f },
{ -0.11557f, -0.474243f, 0.872742f },
{ 0.621826f, 0.604004f, -0.498444f },
{ -0.832214f, 0.012756f, 0.55426f },
{ -0.702484f, 0.705994f, -0.089661f },
{ -0.692017f, 0.649292f, 0.315399f },
{ -0.175995f, -0.977997f, 0.111877f },
{ 0.096954f, -0.04953f, 0.994019f },
{ 0.635284f, -0.606689f, -0.477783f },
{ -0.261261f, -0.607422f, -0.750153f },
{ 0.983276f, 0.165436f, 0.075958f },
{ -0.29837f, 0.404083f, -0.864655f },
{ -0.638672f, 0.507721f, 0.578156f },
{ 0.388214f, 0.412079f, 0.824249f },
{ 0.556183f, -0.208832f, 0.804352f },
{ 0.778442f, 0.562012f, 0.27951f },
{ -0.616577f, 0.781921f, -0.091522f },
{ 0.196289f, 0.051056f, 0.979187f },
{ -0.121216f, 0.207153f, -0.970734f },
{ -0.173401f, -0.384735f, 0.906555f },
{ 0.161499f, -0.723236f, -0.671387f },
{ 0.178497f, -0.006226f, -0.983887f },
{ -0.126038f, 0.15799f, 0.97934f },
{ 0.830475f, -0.024811f, 0.556458f },
{ -0.510132f, -0.76944f, 0.384247f },
{ 0.81424f, 0.200104f, -0.544891f },
{ -0.112549f, -0.393311f, -0.912445f },
{ 0.56189f, 0.152222f, -0.813049f },
{ 0.198914f, -0.254517f, -0.946381f },
{ -0.41217f, 0.690979f, -0.593811f },
{ -0.407257f, 0.324524f, 0.853668f },
{ -0.690186f, 0.366119f, -0.624115f },
{ -0.428345f, 0.844147f, -0.322296f },
{ -0.21228f, -0.297546f, -0.930756f },
{ -0.273071f, 0.516113f, 0.811798f },
{ 0.928314f, 0.371643f, 0.007233f },
{ 0.785828f, -0.479218f, -0.390778f },
{ -0.704895f, 0.058929f, 0.706818f },
{ 0.173248f, 0.203583f, 0.963562f },
{ 0.422211f, -0.904297f, -0.062469f },
{ -0.363312f, -0.182465f, 0.913605f },
{ 0.254028f, -0.552307f, -0.793945f },
{ -0.28891f, -0.765747f, -0.574554f },
{ 0.058319f, 0.291382f, 0.954803f },
{ 0.946136f, -0.303925f, 0.111267f },
{ -0.078156f, 0.443695f, -0.892731f },
{ 0.182098f, 0.89389f, 0.409515f },
{ -0.680298f, -0.213318f, 0.701141f },
{ 0.062469f, 0.848389f, -0.525635f },
{ -0.72879f, -0.641846f, 0.238342f },
{ -0.88089f, 0.427673f, 0.202637f },
{ -0.532501f, -0.21405f, 0.818878f },
{ 0.948975f, -0.305084f, 0.07962f },
{ 0.925446f, 0.374664f, 0.055817f },
{ 0.820923f, 0.565491f, 0.079102f },
{ 0.25882f, 0.099792f, -0.960724f },
{ -0.294617f, 0.910522f, 0.289978f },
{ 0.137115f, 0.320038f, -0.937408f },
{ -0.908386f, 0.345276f, -0.235718f },
{ -0.936218f, 0.138763f, 0.322754f },
{ 0.366577f, 0.925934f, -0.090637f },
{ 0.309296f, -0.686829f, -0.657684f },
{ 0.66983f, 0.024445f, 0.742065f },
{ -0.917999f, -0.059113f, -0.392059f },
{ 0.365509f, 0.462158f, -0.807922f },
{ 0.083374f, 0.996399f, -0.014801f },
{ 0.593842f, 0.253143f, -0.763672f },
{ 0.974976f, -0.165466f, 0.148285f },
{ 0.918976f, 0.137299f, 0.369537f },
{ 0.294952f, 0.694977f, 0.655731f },
{ 0.943085f, 0.152618f, -0.295319f },
{ 0.58783f, -0.598236f, 0.544495f },
{ 0.203796f, 0.678223f, 0.705994f },
{ -0.478821f, -0.661011f, 0.577667f },
{ 0.719055f, -0.1698f, -0.673828f },
{ -0.132172f, -0.965332f, 0.225006f },
{ -0.981873f, -0.14502f, 0.121979f },
{ 0.763458f, 0.579742f, 0.284546f },
{ -0.893188f, 0.079681f, 0.442474f },
{ -0.795776f, -0.523804f, 0.303802f },
{ 0.734955f, 0.67804f, -0.007446f },
{ 0.15506f, 0.986267f, -0.056183f },
{ 0.258026f, 0.571503f, -0.778931f },
{ -0.681549f, -0.702087f, -0.206116f },
{ -0.96286f, -0.177185f, 0.203613f },
{ -0.470978f, -0.515106f, 0.716095f },
{ -0.740326f, 0.57135f, 0.354095f },
{ -0.56012f, -0.824982f, -0.074982f },
{ -0.507874f, 0.753204f, 0.417969f },
{ -0.503113f, 0.038147f, 0.863342f },
{ 0.594025f, 0.673553f, -0.439758f },
{ -0.119873f, -0.005524f, -0.992737f },
{ 0.098267f, -0.213776f, 0.971893f },
{ -0.615631f, 0.643951f, 0.454163f },
{ 0.896851f, -0.441071f, 0.032166f },
{ -0.555023f, 0.750763f, -0.358093f },
{ 0.398773f, 0.304688f, 0.864929f },
{ -0.722961f, 0.303589f, 0.620544f },
{ -0.63559f, -0.621948f, -0.457306f },
{ -0.293243f, 0.072327f, 0.953278f },
{ -0.491638f, 0.661041f, -0.566772f },
{ -0.304199f, -0.572083f, -0.761688f },
{ 0.908081f, -0.398956f, 0.127014f },
{ -0.523621f, -0.549683f, -0.650848f },
{ -0.932922f, -0.19986f, 0.299408f },
{ 0.099426f, 0.140869f, 0.984985f },
{ -0.020325f, -0.999756f, -0.002319f },
{ 0.952667f, 0.280853f, -0.11615f },
{ -0.971893f, 0.082581f, 0.220337f },
{ 0.65921f, 0.705292f, -0.260651f },
{ 0.733063f, -0.175537f, 0.657043f },
{ -0.555206f, 0.429504f, -0.712189f },
{ 0.400421f, -0.89859f, 0.179352f },
{ 0.750885f, -0.19696f, 0.630341f },
{ 0.785675f, -0.569336f, 0.241821f },
{ -0.058899f, -0.464111f, 0.883789f },
{ 0.129608f, -0.94519f, 0.299622f },
{ -0.357819f, 0.907654f, 0.219238f },
{ -0.842133f, -0.439117f, -0.312927f },
{ -0.313477f, 0.84433f, 0.434479f },
{ -0.241211f, 0.053253f, 0.968994f },
{ 0.063873f, 0.823273f, 0.563965f },
{ 0.476288f, 0.862152f, -0.172516f },
{ 0.620941f, -0.298126f, 0.724915f },
{ 0.25238f, -0.749359f, -0.612122f },
{ -0.577545f, 0.386566f, 0.718994f },
{ -0.406342f, -0.737976f, 0.538696f },
{ 0.04718f, 0.556305f, 0.82959f },
{ -0.802856f, 0.587463f, 0.101166f },
{ -0.707733f, -0.705963f, 0.026428f },
{ 0.374908f, 0.68457f, 0.625092f },
{ 0.472137f, 0.208405f, -0.856506f },
{ -0.703064f, -0.581085f, -0.409821f },
{ -0.417206f, -0.736328f, 0.532623f },
{ -0.447876f, -0.20285f, -0.870728f },
{ 0.086945f, -0.990417f, 0.107086f },
{ 0.183685f, 0.018341f, -0.982788f },
{ 0.560638f, -0.428864f, 0.708282f },
{ 0.296722f, -0.952576f, -0.0672f },
{ 0.135773f, 0.990265f, 0.030243f },
{ -0.068787f, 0.654724f, 0.752686f },
{ 0.762604f, -0.551758f, 0.337585f },
{ -0.819611f, -0.407684f, 0.402466f },
{ -0.727844f, -0.55072f, -0.408539f },
{ -0.855774f, -0.480011f, 0.19281f },
{ 0.693176f, -0.079285f, 0.716339f },
{ 0.226013f, 0.650116f, -0.725433f },
{ 0.246704f, 0.953369f, -0.173553f },
{ -0.970398f, -0.239227f, -0.03244f },
{ 0.136383f, -0.394318f, 0.908752f },
{ 0.813232f, 0.558167f, 0.164368f },
{ 0.40451f, 0.549042f, -0.731323f },
{ -0.380249f, -0.566711f, 0.730865f },
{ 0.022156f, 0.932739f, 0.359741f },
{ 0.00824f, 0.996552f, -0.082306f },
{ 0.956635f, -0.065338f, -0.283722f },
{ -0.743561f, 0.008209f, 0.668579f },
{ -0.859589f, -0.509674f, 0.035767f },
{ -0.852234f, 0.363678f, -0.375977f },
{ -0.201965f, -0.970795f, -0.12915f },
{ 0.313477f, 0.947327f, 0.06546f },
{ -0.254028f, -0.528259f, 0.81015f },
{ 0.628052f, 0.601105f, 0.49411f },
{ -0.494385f, 0.868378f, 0.037933f },
{ 0.275635f, -0.086426f, 0.957336f },
{ -0.197937f, 0.468903f, -0.860748f },
{ 0.895599f, 0.399384f, 0.195801f },
{ 0.560791f, 0.825012f, -0.069214f },
{ 0.304199f, -0.849487f, 0.43103f },
{ 0.096375f, 0.93576f, 0.339111f },
{ -0.051422f, 0.408966f, -0.911072f },
{ 0.330444f, 0.942841f, -0.042389f },
{ -0.452362f, -0.786407f, 0.420563f },
{ 0.134308f, -0.933472f, -0.332489f },
{ 0.80191f, -0.566711f, -0.188934f },
{ -0.987946f, -0.105988f, 0.112518f },
{ -0.24408f, 0.892242f, -0.379791f },
{ -0.920502f, 0.229095f, -0.316376f },
{ 0.7789f, 0.325958f, 0.535706f },
{ -0.912872f, 0.185211f, -0.36377f },
{ -0.184784f, 0.565369f, -0.803833f },
{ -0.018463f, 0.119537f, 0.992615f },
{ -0.259247f, -0.935608f, 0.239532f },
{ -0.82373f, -0.449127f, -0.345947f },
{ -0.433105f, 0.659515f, 0.614349f },
{ -0.822754f, 0.378845f, -0.423676f },
{ 0.687195f, -0.674835f, -0.26889f },
{ -0.246582f, -0.800842f, 0.545715f },
{ -0.729187f, -0.207794f, 0.651978f },
{ 0.653534f, -0.610443f, -0.447388f },
{ 0.492584f, -0.023346f, 0.869934f },
{ 0.609039f, 0.009094f, -0.79306f },
{ 0.962494f, -0.271088f, -0.00885f },
{ 0.2659f, -0.004913f, 0.963959f },
{ 0.651245f, 0.553619f, -0.518951f },
{ 0.280548f, -0.84314f, 0.458618f },
{ -0.175293f, -0.983215f, 0.049805f },
{ 0.035339f, -0.979919f, 0.196045f },
{ -0.982941f, 0.164307f, -0.082245f },
{ 0.233734f, -0.97226f, -0.005005f },
{ -0.747253f, -0.611328f, 0.260437f },
{ 0.645599f, 0.592773f, 0.481384f },
{ 0.117706f, -0.949524f, -0.29068f },
{ -0.535004f, -0.791901f, -0.294312f },
{ -0.627167f, -0.214447f, 0.748718f },
{ -0.047974f, -0.813477f, -0.57959f },
{ -0.175537f, 0.477264f, -0.860992f },
{ 0.738556f, -0.414246f, -0.53183f },
{ 0.562561f, -0.704071f, 0.433289f },
{ -0.754944f, 0.64801f, -0.100586f },
{ 0.114716f, 0.044525f, -0.992371f },
{ 0.966003f, 0.244873f, -0.082764f },
{ 0.33783f, 0.715698f, -0.611206f },
{ -0.944031f, -0.326599f, -0.045624f },
{ -0.101074f, -0.416443f, -0.903503f },
{ 0.799286f, 0.49411f, -0.341949f },
{ -0.854645f, 0.518036f, 0.033936f },
{ 0.42514f, -0.437866f, -0.792114f },
{ -0.358948f, 0.597046f, 0.717377f },
{ -0.985413f, 0.144714f, 0.089294f },
{ -0.601776f, -0.33728f, -0.723907f },
{ -0.449921f, 0.594513f, 0.666382f },
{ 0.208313f, -0.10791f, 0.972076f },
{ 0.575317f, 0.060425f, 0.815643f },
{ 0.293365f, -0.875702f, -0.383453f },
{ 0.293762f, 0.465759f, 0.834686f },
{ -0.846008f, -0.233398f, -0.47934f },
{ -0.115814f, 0.143036f, -0.98291f },
{ 0.204681f, -0.949036f, -0.239532f },
{ 0.946716f, -0.263947f, 0.184326f },
{ -0.235596f, 0.573822f, 0.784332f },
{ 0.203705f, -0.372253f, -0.905487f },
{ 0.756989f, -0.651031f, 0.055298f },
{ 0.497803f, 0.814697f, -0.297363f },
{ -0.16214f, 0.063995f, -0.98468f },
{ -0.329254f, 0.834381f, 0.441925f },
{ 0.703827f, -0.527039f, -0.476227f },
{ 0.956421f, 0.266113f, 0.119781f },
{ 0.480133f, 0.482849f, 0.7323f },
{ -0.18631f, 0.961212f, -0.203125f },
{ -0.748474f, -0.656921f, -0.090393f },
{ -0.085052f, -0.165253f, 0.982544f },
{ -0.76947f, 0.628174f, -0.115234f },
{ 0.383148f, 0.537659f, 0.751068f },
{ 0.616486f, -0.668488f, -0.415924f },
{ -0.259979f, -0.630005f, 0.73175f },
{ 0.570953f, -0.087952f, 0.816223f },
{ -0.458008f, 0.023254f, 0.888611f },
{ -0.196167f, 0.976563f, -0.088287f },
{ -0.263885f, -0.69812f, -0.665527f },
{ 0.437134f, -0.892273f, -0.112793f },
{ -0.621674f, -0.230438f, 0.748566f },
{ 0.232422f, 0.900574f, -0.367249f },
{ 0.22229f, -0.796143f, 0.562744f },
{ -0.665497f, -0.73764f, 0.11377f },
{ 0.670135f, 0.704803f, 0.232605f },
{ 0.895599f, 0.429749f, -0.114655f },
{ -0.11557f, -0.474243f, 0.872742f },
{ 0.621826f, 0.604004f, -0.498444f },
{ -0.832214f, 0.012756f, 0.55426f },
{ -0.702484f, 0.705994f, -0.089661f },
{ -0.692017f, 0.649292f, 0.315399f },
{ -0.175995f, -0.977997f, 0.111877f },
{ 0.096954f, -0.04953f, 0.994019f },
{ 0.635284f, -0.606689f, -0.477783f },
{ -0.261261f, -0.607422f, -0.750153f },
{ 0.983276f, 0.165436f, 0.075958f },
{ -0.29837f, 0.404083f, -0.864655f },
{ -0.638672f, 0.507721f, 0.578156f },
{ 0.388214f, 0.412079f, 0.824249f },
{ 0.556183f, -0.208832f, 0.804352f },
{ 0.778442f, 0.562012f, 0.27951f },
{ -0.616577f, 0.781921f, -0.091522f },
{ 0.196289f, 0.051056f, 0.979187f },
{ -0.121216f, 0.207153f, -0.970734f },
{ -0.173401f, -0.384735f, 0.906555f },
{ 0.161499f, -0.723236f, -0.671387f },
{ 0.178497f, -0.006226f, -0.983887f },
{ -0.126038f, 0.15799f, 0.97934f },
{ 0.830475f, -0.024811f, 0.556458f },
{ -0.510132f, -0.76944f, 0.384247f },
{ 0.81424f, 0.200104f, -0.544891f },
{ -0.112549f, -0.393311f, -0.912445f },
{ 0.56189f, 0.152222f, -0.813049f },
{ 0.198914f, -0.254517f, -0.946381f },
{ -0.41217f, 0.690979f, -0.593811f },
{ -0.407257f, 0.324524f, 0.853668f },
{ -0.690186f, 0.366119f, -0.624115f },
{ -0.428345f, 0.844147f, -0.322296f },
{ -0.21228f, -0.297546f, -0.930756f },
{ -0.273071f, 0.516113f, 0.811798f },
{ 0.928314f, 0.371643f, 0.007233f },
{ 0.785828f, -0.479218f, -0.390778f },
{ -0.704895f, 0.058929f, 0.706818f },
{ 0.173248f, 0.203583f, 0.963562f },
{ 0.422211f, -0.904297f, -0.062469f },
{ -0.363312f, -0.182465f, 0.913605f },
{ 0.254028f, -0.552307f, -0.793945f },
{ -0.28891f, -0.765747f, -0.574554f },
{ 0.058319f, 0.291382f, 0.954803f },
{ 0.946136f, -0.303925f, 0.111267f },
{ -0.078156f, 0.443695f, -0.892731f },
{ 0.182098f, 0.89389f, 0.409515f },
{ -0.680298f, -0.213318f, 0.701141f },
{ 0.062469f, 0.848389f, -0.525635f },
{ -0.72879f, -0.641846f, 0.238342f },
{ -0.88089f, 0.427673f, 0.202637f },
{ -0.532501f, -0.21405f, 0.818878f },
{ 0.948975f, -0.305084f, 0.07962f },
{ 0.925446f, 0.374664f, 0.055817f },
{ 0.820923f, 0.565491f, 0.079102f },
{ 0.25882f, 0.099792f, -0.960724f },
{ -0.294617f, 0.910522f, 0.289978f },
{ 0.137115f, 0.320038f, -0.937408f },
{ -0.908386f, 0.345276f, -0.235718f },
{ -0.936218f, 0.138763f, 0.322754f },
{ 0.366577f, 0.925934f, -0.090637f },
{ 0.309296f, -0.686829f, -0.657684f },
{ 0.66983f, 0.024445f, 0.742065f },
{ -0.917999f, -0.059113f, -0.392059f },
{ 0.365509f, 0.462158f, -0.807922f },
{ 0.083374f, 0.996399f, -0.014801f },
{ 0.593842f, 0.253143f, -0.763672f },
{ 0.974976f, -0.165466f, 0.148285f },
{ 0.918976f, 0.137299f, 0.369537f },
{ 0.294952f, 0.694977f, 0.655731f },
{ 0.943085f, 0.152618f, -0.295319f },
{ 0.58783f, -0.598236f, 0.544495f },
{ 0.203796f, 0.678223f, 0.705994f },
{ -0.478821f, -0.661011f, 0.577667f },
{ 0.719055f, -0.1698f, -0.673828f },
{ -0.132172f, -0.965332f, 0.225006f },
{ -0.981873f, -0.14502f, 0.121979f },
{ 0.763458f, 0.579742f, 0.284546f },
{ -0.893188f, 0.079681f, 0.442474f },
{ -0.795776f, -0.523804f, 0.303802f },
{ 0.734955f, 0.67804f, -0.007446f },
{ 0.15506f, 0.986267f, -0.056183f },
{ 0.258026f, 0.571503f, -0.778931f },
{ -0.681549f, -0.702087f, -0.206116f },
{ -0.96286f, -0.177185f, 0.203613f },
{ -0.470978f, -0.515106f, 0.716095f },
{ -0.740326f, 0.57135f, 0.354095f },
{ -0.56012f, -0.824982f, -0.074982f },
{ -0.507874f, 0.753204f, 0.417969f },
{ -0.503113f, 0.038147f, 0.863342f },
{ 0.594025f, 0.673553f, -0.439758f },
{ -0.119873f, -0.005524f, -0.992737f },
{ 0.098267f, -0.213776f, 0.971893f },
{ -0.615631f, 0.643951f, 0.454163f },
{ 0.896851f, -0.441071f, 0.032166f },
{ -0.555023f, 0.750763f, -0.358093f },
{ 0.398773f, 0.304688f, 0.864929f },
{ -0.722961f, 0.303589f, 0.620544f },
{ -0.63559f, -0.621948f, -0.457306f },
{ -0.293243f, 0.072327f, 0.953278f },
{ -0.491638f, 0.661041f, -0.566772f },
{ -0.304199f, -0.572083f, -0.761688f },
{ 0.908081f, -0.398956f, 0.127014f },
{ -0.523621f, -0.549683f, -0.650848f },
{ -0.932922f, -0.19986f, 0.299408f },
{ 0.099426f, 0.140869f, 0.984985f },
{ -0.020325f, -0.999756f, -0.002319f },
{ 0.952667f, 0.280853f, -0.11615f },
{ -0.971893f, 0.082581f, 0.220337f },
{ 0.65921f, 0.705292f, -0.260651f },
{ 0.733063f, -0.175537f, 0.657043f },
{ -0.555206f, 0.429504f, -0.712189f },
{ 0.400421f, -0.89859f, 0.179352f },
{ 0.750885f, -0.19696f, 0.630341f },
{ 0.785675f, -0.569336f, 0.241821f },
{ -0.058899f, -0.464111f, 0.883789f },
{ 0.129608f, -0.94519f, 0.299622f },
{ -0.357819f, 0.907654f, 0.219238f },
{ -0.842133f, -0.439117f, -0.312927f },
{ -0.313477f, 0.84433f, 0.434479f },
{ -0.241211f, 0.053253f, 0.968994f },
{ 0.063873f, 0.823273f, 0.563965f },
{ 0.476288f, 0.862152f, -0.172516f },
{ 0.620941f, -0.298126f, 0.724915f },
{ 0.25238f, -0.749359f, -0.612122f },
{ -0.577545f, 0.386566f, 0.718994f },
{ -0.406342f, -0.737976f, 0.538696f },
{ 0.04718f, 0.556305f, 0.82959f },
{ -0.802856f, 0.587463f, 0.101166f },
{ -0.707733f, -0.705963f, 0.026428f },
{ 0.374908f, 0.68457f, 0.625092f },
{ 0.472137f, 0.208405f, -0.856506f },
{ -0.703064f, -0.581085f, -0.409821f },
{ -0.417206f, -0.736328f, 0.532623f },
{ -0.447876f, -0.20285f, -0.870728f },
{ 0.086945f, -0.990417f, 0.107086f },
{ 0.183685f, 0.018341f, -0.982788f },
{ 0.560638f, -0.428864f, 0.708282f },
{ 0.296722f, -0.952576f, -0.0672f },
{ 0.135773f, 0.990265f, 0.030243f },
{ -0.068787f, 0.654724f, 0.752686f },
{ 0.762604f, -0.551758f, 0.337585f },
{ -0.819611f, -0.407684f, 0.402466f },
{ -0.727844f, -0.55072f, -0.408539f },
{ -0.855774f, -0.480011f, 0.19281f },
{ 0.693176f, -0.079285f, 0.716339f },
{ 0.226013f, 0.650116f, -0.725433f },
{ 0.246704f, 0.953369f, -0.173553f },
{ -0.970398f, -0.239227f, -0.03244f },
{ 0.136383f, -0.394318f, 0.908752f },
{ 0.813232f, 0.558167f, 0.164368f },
{ 0.40451f, 0.549042f, -0.731323f },
{ -0.380249f, -0.566711f, 0.730865f },
{ 0.022156f, 0.932739f, 0.359741f },
{ 0.00824f, 0.996552f, -0.082306f },
{ 0.956635f, -0.065338f, -0.283722f },
{ -0.743561f, 0.008209f, 0.668579f },
{ -0.859589f, -0.509674f, 0.035767f },
{ -0.852234f, 0.363678f, -0.375977f },
{ -0.201965f, -0.970795f, -0.12915f },
{ 0.313477f, 0.947327f, 0.06546f },
{ -0.254028f, -0.528259f, 0.81015f },
{ 0.628052f, 0.601105f, 0.49411f },
{ -0.494385f, 0.868378f, 0.037933f },
{ 0.275635f, -0.086426f, 0.957336f },
{ -0.197937f, 0.468903f, -0.860748f },
{ 0.895599f, 0.399384f, 0.195801f },
{ 0.560791f, 0.825012f, -0.069214f },
{ 0.304199f, -0.849487f, 0.43103f },
{ 0.096375f, 0.93576f, 0.339111f },
{ -0.051422f, 0.408966f, -0.911072f },
{ 0.330444f, 0.942841f, -0.042389f },
{ -0.452362f, -0.786407f, 0.420563f },
{ 0.134308f, -0.933472f, -0.332489f },
{ 0.80191f, -0.566711f, -0.188934f },
{ -0.987946f, -0.105988f, 0.112518f },
{ -0.24408f, 0.892242f, -0.379791f },
{ -0.920502f, 0.229095f, -0.316376f },
{ 0.7789f, 0.325958f, 0.535706f },
{ -0.912872f, 0.185211f, -0.36377f },
{ -0.184784f, 0.565369f, -0.803833f },
{ -0.018463f, 0.119537f, 0.992615f },
{ -0.259247f, -0.935608f, 0.239532f },
{ -0.82373f, -0.449127f, -0.345947f },
{ -0.433105f, 0.659515f, 0.614349f },
{ -0.822754f, 0.378845f, -0.423676f },
{ 0.687195f, -0.674835f, -0.26889f },
{ -0.246582f, -0.800842f, 0.545715f },
{ -0.729187f, -0.207794f, 0.651978f },
{ 0.653534f, -0.610443f, -0.447388f },
{ 0.492584f, -0.023346f, 0.869934f },
{ 0.609039f, 0.009094f, -0.79306f },
{ 0.962494f, -0.271088f, -0.00885f },
{ 0.2659f, -0.004913f, 0.963959f },
{ 0.651245f, 0.553619f, -0.518951f },
{ 0.280548f, -0.84314f, 0.458618f },
{ -0.175293f, -0.983215f, 0.049805f },
{ 0.035339f, -0.979919f, 0.196045f },
{ -0.982941f, 0.164307f, -0.082245f },
{ 0.233734f, -0.97226f, -0.005005f },
{ -0.747253f, -0.611328f, 0.260437f },
{ 0.645599f, 0.592773f, 0.481384f },
{ 0.117706f, -0.949524f, -0.29068f },
{ -0.535004f, -0.791901f, -0.294312f },
{ -0.627167f, -0.214447f, 0.748718f },
{ -0.047974f, -0.813477f, -0.57959f },
{ -0.175537f, 0.477264f, -0.860992f },
{ 0.738556f, -0.414246f, -0.53183f },
{ 0.562561f, -0.704071f, 0.433289f },
{ -0.754944f, 0.64801f, -0.100586f },
{ 0.114716f, 0.044525f, -0.992371f },
{ 0.966003f, 0.244873f, -0.082764f },
{ 0.33783f, 0.715698f, -0.611206f },
{ -0.944031f, -0.326599f, -0.045624f } };
}

@ -0,0 +1,53 @@
package jme3test.blender.scene;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Line;
import com.jme3.scene.shape.Sphere;
/**
* The pivot displayed in the scene.
* @author Marcin Roguski
*/
public class Pivot extends Node {
public Pivot(AssetManager assetManager) {
this.attachChild(this.getAxis("x", new Vector3f(10, 0, 0), ColorRGBA.Red, assetManager));
this.attachChild(this.getAxis("y", new Vector3f(0, 10, 0), ColorRGBA.Green, assetManager));
this.attachChild(this.getAxis("z", new Vector3f(0, 0, 10), ColorRGBA.Blue, assetManager));
this.assignPoints(assetManager);
}
private void assignPoints(AssetManager assetManager) {
Material defaultMaterial = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
defaultMaterial.setColor("m_Color", ColorRGBA.DarkGray);
for(int i = -10; i <= 10; ++i) {
Geometry g = new Geometry("", new Sphere(3, 3, 0.05f));
g.setLocalTranslation(i, 0, 0);
g.setMaterial(defaultMaterial);
this.attachChild(g);
g = new Geometry("", new Sphere(3, 3, 0.05f));
g.setLocalTranslation(0, i, 0);
g.setMaterial(defaultMaterial);
this.attachChild(g);
g = new Geometry("", new Sphere(3, 3, 0.05f));
g.setLocalTranslation(0, 0, i);
g.setMaterial(defaultMaterial);
this.attachChild(g);
}
}
private Geometry getAxis(String name, Vector3f endPoint, ColorRGBA color, AssetManager assetManager) {
Line axis = new Line(new Vector3f(0, 0, 0), endPoint);
Material mat = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
mat.setColor("m_Color", color);
Geometry geom = new Geometry(name, axis);
geom.setMaterial(mat);
return geom;
}
}

@ -0,0 +1,47 @@
package jme3test.blender.scene;
import com.jme3.animation.Bone;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.shape.Line;
import com.jme3.scene.shape.Sphere;
/**
* A simple class to create visualization of a skeleton.
* @author Marcin Roguski
*/
public class VisibleBone extends Node {
private Vector3f globalPosition;
public VisibleBone(Bone bone, Vector3f parentLocation, Quaternion parentRotation, AssetManager assetManager) {
Material redMat = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
redMat.setColor("m_Color", ColorRGBA.Red);
Material whiteMat = new Material(assetManager, "Common/MatDefs/Misc/SolidColor.j3md");
whiteMat.setColor("m_Color", ColorRGBA.White);
Geometry g = new Geometry(bone.getName(), new Sphere(9, 9, 0.01f));
globalPosition = bone.getLocalPosition().add(parentLocation);
g.setLocalTranslation(globalPosition);
g.setLocalRotation(bone.getLocalRotation().mult(parentRotation));
g.setMaterial(redMat);
this.attachChild(g);
if(bone.getChildren() != null) {
for(Bone child : bone.getChildren()) {
VisibleBone vb = new VisibleBone(child, bone.getLocalPosition(), bone.getLocalRotation(), assetManager);
this.attachChild(vb);
Line line = new Line(globalPosition, vb.globalPosition);
line.setLineWidth(2);
Geometry geom = new Geometry("", line);
geom.setMaterial(whiteMat);
this.attachChild(geom);
}
}
}
}
Loading…
Cancel
Save