Initial import of blender loader test classes and assets.
git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7556 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
BIN
engine/src/test-data/Blender/2.4x/BaseMesh_249.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/BaseScene.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/MountainValley_Track.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/ObjectAnimation.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/SimpleAnimation.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/Sinbad.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/animtest.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/constraints.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/curves.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/kerrigan.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/kerrigan_diffuse.png
Normal file
BIN
engine/src/test-data/Blender/2.4x/materials.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/modifiers.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/nurbs.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/particles.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/positions.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/sinbad_body.tga
Normal file
After Width: | Height: | Size: 768 KiB |
BIN
engine/src/test-data/Blender/2.4x/sinbad_clothes.tga
Normal file
After Width: | Height: | Size: 768 KiB |
BIN
engine/src/test-data/Blender/2.4x/sinbad_sword.tga
Normal file
After Width: | Height: | Size: 192 KiB |
BIN
engine/src/test-data/Blender/2.4x/test.conf
Normal file
BIN
engine/src/test-data/Blender/2.4x/texturedPlaneTest.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/textures.blend
Normal file
BIN
engine/src/test-data/Blender/2.4x/textures/Concrete_Wall.PNG
Normal file
After Width: | Height: | Size: 105 KiB |
BIN
engine/src/test-data/Blender/2.4x/textures/Grass_256.png
Normal file
After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 28 KiB |
BIN
engine/src/test-data/Blender/2.4x/textures/SkyBox-Mountain.png
Normal file
After Width: | Height: | Size: 449 KiB |
BIN
engine/src/test-data/Blender/2.4x/textures/Tar_Cracked.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
engine/src/test-data/Blender/2.4x/textures/WarningStrip.png
Normal file
After Width: | Height: | Size: 257 KiB |
BIN
engine/src/test-data/Blender/2.5x/BaseMesh_256.blend
Normal file
BIN
engine/src/test-data/Blender/2.5x/textures.blend
Normal file
223
engine/src/test/jme3test/blender/ManualBlenderTester.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
440
engine/src/test/jme3test/blender/config/ConfigDialog.java
Normal file
@ -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 } };
|
||||||
|
|
||||||
|
}
|
53
engine/src/test/jme3test/blender/scene/Pivot.java
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
47
engine/src/test/jme3test/blender/scene/VisibleBone.java
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|