com.jme3.scene.UserData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jme3-core Show documentation
Show all versions of jme3-core Show documentation
jMonkeyEngine is a 3-D game engine for adventurous Java developers
The newest version!
/*
* Copyright (c) 2009-2021 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 com.jme3.scene;
import com.jme3.export.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* UserData
is used to contain user data objects
* set on spatials (primarily primitives) that do not implement
* the {@link Savable} interface. Note that attempting
* to export any models which have non-savable objects
* attached to them will fail.
*/
public final class UserData implements Savable {
/**
* Boolean type on Geometries to indicate that physics collision
* shape generation should ignore them.
*/
public static final String JME_PHYSICSIGNORE = "JmePhysicsIgnore";
/**
* For geometries using shared mesh, this will specify the shared
* mesh reference.
*/
public static final String JME_SHAREDMESH = "JmeSharedMesh";
private static final int TYPE_INTEGER = 0;
private static final int TYPE_FLOAT = 1;
private static final int TYPE_BOOLEAN = 2;
private static final int TYPE_STRING = 3;
private static final int TYPE_LONG = 4;
private static final int TYPE_SAVABLE = 5;
private static final int TYPE_LIST = 6;
private static final int TYPE_MAP = 7;
private static final int TYPE_ARRAY = 8;
private static final int TYPE_DOUBLE = 9;
private static final int TYPE_SHORT = 10;
private static final int TYPE_BYTE = 11;
protected byte type;
protected Object value;
public UserData() {
}
/**
* Creates a new UserData
with the given
* type and value.
*
* @param type
* Type of data, should be between 0 and 8.
* @param value
* Value of the data
*/
public UserData(byte type, Object value) {
assert type >= 0 && type <= 11;
this.type = type;
this.value = value;
}
public Object getValue() {
return value;
}
@Override
public String toString() {
return value.toString();
}
public static byte getObjectType(Object type) {
if (type instanceof Integer) {
return TYPE_INTEGER;
} else if (type instanceof Float) {
return TYPE_FLOAT;
} else if (type instanceof Boolean) {
return TYPE_BOOLEAN;
} else if (type instanceof String) {
return TYPE_STRING;
} else if (type instanceof Long) {
return TYPE_LONG;
} else if (type instanceof Savable) {
return TYPE_SAVABLE;
} else if (type instanceof List) {
return TYPE_LIST;
} else if (type instanceof Map) {
return TYPE_MAP;
} else if (type instanceof Object[]) {
return TYPE_ARRAY;
} else if (type instanceof Double) {
return TYPE_DOUBLE;
} else if (type instanceof Short) {
return TYPE_SHORT;
} else if (type instanceof Byte) {
return TYPE_BYTE;
} else {
throw new IllegalArgumentException("Unsupported type: " + type.getClass().getName());
}
}
@Override
public void write(JmeExporter ex) throws IOException {
OutputCapsule oc = ex.getCapsule(this);
oc.write(type, "type", (byte) 0);
switch (type) {
case TYPE_INTEGER:
int i = (Integer) value;
oc.write(i, "intVal", 0);
break;
case TYPE_FLOAT:
float f = (Float) value;
oc.write(f, "floatVal", 0f);
break;
case TYPE_BOOLEAN:
boolean b = (Boolean) value;
oc.write(b, "boolVal", false);
break;
case TYPE_STRING:
String s = (String) value;
oc.write(s, "strVal", null);
break;
case TYPE_LONG:
Long l = (Long) value;
oc.write(l, "longVal", 0l);
break;
case TYPE_SAVABLE:
Savable sav = (Savable) value;
oc.write(sav, "savableVal", null);
break;
case TYPE_LIST:
this.writeList(oc, (List>) value, "0");
break;
case TYPE_MAP:
Map, ?> map = (Map, ?>) value;
this.writeList(oc, map.keySet(), "0");
this.writeList(oc, map.values(), "1");
break;
case TYPE_ARRAY:
this.writeList(oc, Arrays.asList((Object[]) value), "0");
break;
case TYPE_DOUBLE:
Double d = (Double) value;
oc.write(d, "doubleVal", 0.);
break;
case TYPE_SHORT:
Short sh = (Short) value;
oc.write(sh, "shortVal", (short)0);
break;
case TYPE_BYTE:
Byte bh = (Byte) value;
oc.write(bh, "byteVal", (byte)0);
break;
default:
throw new UnsupportedOperationException("Unsupported value type: " + value.getClass());
}
}
@Override
public void read(JmeImporter im) throws IOException {
InputCapsule ic = im.getCapsule(this);
type = ic.readByte("type", (byte) 0);
switch (type) {
case TYPE_INTEGER:
value = ic.readInt("intVal", 0);
break;
case TYPE_FLOAT:
value = ic.readFloat("floatVal", 0f);
break;
case TYPE_BOOLEAN:
value = ic.readBoolean("boolVal", false);
break;
case TYPE_STRING:
value = ic.readString("strVal", null);
break;
case TYPE_LONG:
value = ic.readLong("longVal", 0l);
break;
case TYPE_SAVABLE:
value = ic.readSavable("savableVal", null);
break;
case TYPE_LIST:
value = this.readList(ic, "0");
break;
case TYPE_MAP:
Map
© 2015 - 2024 Weber Informatics LLC | Privacy Policy