1 /*
2  * Copyright (c) 2009-2010 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 package com.jme3.scene;
33 
34 import com.jme3.export.*;
35 import java.io.IOException;
36 
37 /**
38  * <code>UserData</code> is used to contain user data objects
39  * set on spatials (primarily primitives) that do not implement
40  * the {@link Savable} interface. Note that attempting
41  * to export any models which have non-savable objects
42  * attached to them will fail.
43  */
44 public final class UserData implements Savable {
45 
46     /**
47      * Boolean type on Geometries to indicate that physics collision
48      * shape generation should ignore them.
49      */
50     public static final String JME_PHYSICSIGNORE = "JmePhysicsIgnore";
51 
52     /**
53      * For geometries using shared mesh, this will specify the shared
54      * mesh reference.
55      */
56     public static final String JME_SHAREDMESH = "JmeSharedMesh";
57 
58     protected byte type;
59     protected Object value;
60 
UserData()61     public UserData() {
62     }
63 
64     /**
65      * Creates a new <code>UserData</code> with the given
66      * type and value.
67      *
68      * @param type Type of data, should be between 0 and 4.
69      * @param value Value of the data
70      */
UserData(byte type, Object value)71     public UserData(byte type, Object value) {
72         assert type >= 0 && type <= 4;
73         this.type = type;
74         this.value = value;
75     }
76 
getValue()77     public Object getValue() {
78         return value;
79     }
80 
81     @Override
toString()82     public String toString() {
83         return value.toString();
84     }
85 
getObjectType(Object type)86     public static byte getObjectType(Object type) {
87         if (type instanceof Integer) {
88             return 0;
89         } else if (type instanceof Float) {
90             return 1;
91         } else if (type instanceof Boolean) {
92             return 2;
93         } else if (type instanceof String) {
94             return 3;
95         } else if (type instanceof Long) {
96             return 4;
97         } else {
98             throw new IllegalArgumentException("Unsupported type: " + type.getClass().getName());
99         }
100     }
101 
write(JmeExporter ex)102     public void write(JmeExporter ex) throws IOException {
103         OutputCapsule oc = ex.getCapsule(this);
104         oc.write(type, "type", (byte)0);
105 
106         switch (type) {
107             case 0:
108                 int i = (Integer) value;
109                 oc.write(i, "intVal", 0);
110                 break;
111             case 1:
112                 float f = (Float) value;
113                 oc.write(f, "floatVal", 0f);
114                 break;
115             case 2:
116                 boolean b = (Boolean) value;
117                 oc.write(b, "boolVal", false);
118                 break;
119             case 3:
120                 String s = (String) value;
121                 oc.write(s, "strVal", null);
122                 break;
123             case 4:
124                 Long l = (Long) value;
125                 oc.write(l, "longVal", 0l);
126                 break;
127             default:
128                 throw new UnsupportedOperationException();
129         }
130     }
131 
read(JmeImporter im)132     public void read(JmeImporter im) throws IOException {
133         InputCapsule ic = im.getCapsule(this);
134         type = ic.readByte("type", (byte) 0);
135 
136         switch (type) {
137             case 0:
138                 value = ic.readInt("intVal", 0);
139                 break;
140             case 1:
141                 value = ic.readFloat("floatVal", 0f);
142                 break;
143             case 2:
144                 value = ic.readBoolean("boolVal", false);
145                 break;
146             case 3:
147                 value = ic.readString("strVal", null);
148                 break;
149             case 4:
150                 value = ic.readLong("longVal", 0l);
151                 break;
152             default:
153                 throw new UnsupportedOperationException();
154         }
155     }
156 }
157