Add support for gltf morph names. (#1100)
* Add support for gltf morph names. * Fix formatting stuff * Add morph name to be saved * Testing changes to gltf plugin * Review changes * Fix comments * Fixes for review * Remove getMorphNames from Geometry class
This commit is contained in:
		
							parent
							
								
									7058439e7d
								
							
						
					
					
						commit
						57db8f618f
					
				| @ -601,6 +601,22 @@ public class Geometry extends Spatial { | ||||
|         this.dirtyMorph = true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Set the state of the morph with the given name. | ||||
|      *  | ||||
|      * If the name of the morph is not found, no state will be set. | ||||
|      *  | ||||
|      * @param morphTarget The name of the morph to set the state of | ||||
|      * @param state The state to set the morph to | ||||
|      */ | ||||
|     public void setMorphState(String morphTarget, float state) { | ||||
|         int index = mesh.getMorphIndex(morphTarget); | ||||
|         if (index >= 0) { | ||||
|             morphState[index] = state; | ||||
|             this.dirtyMorph = true; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * returns true if the morph state has changed on the last frame. | ||||
|      * @return true if changed, otherwise false | ||||
| @ -629,6 +645,20 @@ public class Geometry extends Spatial { | ||||
|         } | ||||
|         return morphState; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Get the state of a morph | ||||
|      * @param morphTarget the name of the morph to get the state of | ||||
|      * @return the state of the morph, or -1 if the morph is not found | ||||
|      */ | ||||
|     public float getMorphState(String morphTarget) { | ||||
|         int index = mesh.getMorphIndex(morphTarget); | ||||
|         if (index < 0) { | ||||
|             return -1; | ||||
|         } else  { | ||||
|             return morphState[index]; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Return the number of morph targets that can be handled on the GPU simultaneously for this geometry. | ||||
|  | ||||
| @ -1529,10 +1529,46 @@ public class Mesh implements Savable, Cloneable, JmeCloneable { | ||||
|     public MorphTarget[] getMorphTargets() { | ||||
|         return morphTargets.getArray(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Get the name of all morphs in order. | ||||
|      * Morphs without names will be null | ||||
|      * @return an array | ||||
|      */ | ||||
|     public String[] getMorphTargetNames() { | ||||
|          | ||||
|         MorphTarget[] nbMorphTargets = getMorphTargets(); | ||||
|         if (nbMorphTargets.length == 0) { | ||||
|             return new String[0]; | ||||
|         } | ||||
|         String[] targets = new String[nbMorphTargets.length]; | ||||
| 
 | ||||
|         for (int index = 0; index < nbMorphTargets.length; index++) { | ||||
|             targets[index] = nbMorphTargets[index].getName(); | ||||
|         } | ||||
|         return targets; | ||||
|     } | ||||
| 
 | ||||
|     public boolean hasMorphTargets() { | ||||
|         return morphTargets != null && !morphTargets.isEmpty(); | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Get the index of the morph that has the given name. | ||||
|      * @param morphName The name of the morph to search for | ||||
|      * @return The index of the morph, or -1 if not found.  | ||||
|      */ | ||||
|     public int getMorphIndex(String morphName) { | ||||
|         int index = -1; | ||||
|         MorphTarget[] nbMorphTargets = getMorphTargets(); | ||||
|         for (int i = 0; i < nbMorphTargets.length; i++) { | ||||
|             if (nbMorphTargets[i].getName().equals(morphName)) { | ||||
|                 index = i; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         return index; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void write(JmeExporter ex) throws IOException { | ||||
|  | ||||
| @ -11,6 +11,23 @@ import java.util.Map; | ||||
| 
 | ||||
| public class MorphTarget implements Savable { | ||||
|     private EnumMap<VertexBuffer.Type, FloatBuffer> buffers = new EnumMap<>(VertexBuffer.Type.class); | ||||
|     private String name = null; | ||||
|      | ||||
|     public MorphTarget() { | ||||
|          | ||||
|     } | ||||
|      | ||||
|     public MorphTarget(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
|      | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
|      | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setBuffer(VertexBuffer.Type type, FloatBuffer buffer) { | ||||
|         buffers.put(type, buffer); | ||||
| @ -35,6 +52,7 @@ public class MorphTarget implements Savable { | ||||
|             Buffer roData = entry.getValue().asReadOnlyBuffer(); | ||||
|             oc.write((FloatBuffer) roData, entry.getKey().name(),null); | ||||
|         } | ||||
|         oc.write(name, "morphName", null); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @ -46,6 +64,6 @@ public class MorphTarget implements Savable { | ||||
|                 setBuffer(type, b); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         name = ic.readString("morphName", null); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -397,10 +397,23 @@ public class GltfLoader implements AssetLoader { | ||||
|                 mesh.generateBindPose(); | ||||
|             } | ||||
| 
 | ||||
|             //Read morph target names | ||||
|             LinkedList<String> targetNames = new LinkedList<>(); | ||||
|             if (meshData.has("extras") && meshData.getAsJsonObject("extras").has("targetNames")) { | ||||
|                 JsonArray targetNamesJson = meshData.getAsJsonObject("extras").getAsJsonArray("targetNames"); | ||||
|                 for (JsonElement target : targetNamesJson) { | ||||
|                     targetNames.add(target.getAsString()); | ||||
|                 } | ||||
|             } | ||||
|              | ||||
|             //Read morph targets | ||||
|             JsonArray targets = meshObject.getAsJsonArray("targets"); | ||||
|             if(targets != null){ | ||||
|                 for (JsonElement target : targets) { | ||||
|                     MorphTarget morphTarget = new MorphTarget(); | ||||
|                     if (targetNames.size() > 0) { | ||||
|                         morphTarget.setName(targetNames.pop()); | ||||
|                     } | ||||
|                     for (Map.Entry<String, JsonElement> entry : target.getAsJsonObject().entrySet()) { | ||||
|                         String bufferType = entry.getKey(); | ||||
|                         VertexBuffer.Type type = getVertexBufferType(bufferType); | ||||
| @ -412,7 +425,8 @@ public class GltfLoader implements AssetLoader { | ||||
|                     mesh.addMorphTarget(morphTarget); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|          | ||||
|             //Read mesh extras | ||||
|             mesh = customContentManager.readExtensionAndExtras("primitive", meshObject, mesh); | ||||
| 
 | ||||
|             Geometry geom = new Geometry(null, mesh); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user