From eefc17428c2c10b91513d605c21d9584f5f30127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Bouquet?= Date: Mon, 4 Jul 2016 07:44:44 +0200 Subject: [PATCH] Merge pull request #501 from MeFisto94/HwSkinningFixV02 Fixes #499: Fix Hardware Skinning in 3.1 --- .../com/jme3/animation/SkeletonControl.java | 3 +- .../main/java/com/jme3/material/MatParam.java | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java b/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java index b753ad2cb..1d14fa61e 100644 --- a/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java +++ b/jme3-core/src/main/java/com/jme3/animation/SkeletonControl.java @@ -255,7 +255,8 @@ public class SkeletonControl extends AbstractControl implements Cloneable, JmeCl // is operating on this material, in that case, user // is sharing materials between models which is NOT allowed // when hardware skinning used. - throw new UnsupportedOperationException( + + Logger.getLogger(SkeletonControl.class.getName()).log(Level.SEVERE, "Material instances cannot be shared when hardware skinning is used. " + "Ensure all models use unique material instances." ); diff --git a/jme3-core/src/main/java/com/jme3/material/MatParam.java b/jme3-core/src/main/java/com/jme3/material/MatParam.java index 8d965e363..6c069a14d 100644 --- a/jme3-core/src/main/java/com/jme3/material/MatParam.java +++ b/jme3-core/src/main/java/com/jme3/material/MatParam.java @@ -309,6 +309,8 @@ When arrays can be inserted in J3M files } else if (value instanceof Boolean) { Boolean b = (Boolean) value; oc.write(b.booleanValue(), "value_bool", false); + } else if (value.getClass().isArray() && value instanceof Savable[]) { + oc.write((Savable[])value, "value_savable_array", null); } } @@ -327,6 +329,41 @@ When arrays can be inserted in J3M files case Int: value = ic.readInt("value_int", 0); break; + case Vector2Array: + Savable[] savableArray = ic.readSavableArray("value_savable_array", null); + if (savableArray != null) { + value = new Vector2f[savableArray.length]; + System.arraycopy(savableArray, 0, value, 0, savableArray.length); + } + break; + case Vector3Array: + savableArray = ic.readSavableArray("value_savable_array", null); + if (savableArray != null) { + value = new Vector3f[savableArray.length]; + System.arraycopy(savableArray, 0, value, 0, savableArray.length); + } + break; + case Vector4Array: + savableArray = ic.readSavableArray("value_savable_array", null); + if (savableArray != null) { + value = new Vector4f[savableArray.length]; + System.arraycopy(savableArray, 0, value, 0, savableArray.length); + } + break; + case Matrix3Array: + savableArray = ic.readSavableArray("value_savable_array", null); + if (savableArray != null) { + value = new Matrix3f[savableArray.length]; + System.arraycopy(savableArray, 0, value, 0, savableArray.length); + } + break; + case Matrix4Array: + savableArray = ic.readSavableArray("value_savable_array", null); + if (savableArray != null) { + value = new Matrix4f[savableArray.length]; + System.arraycopy(savableArray, 0, value, 0, savableArray.length); + } + break; default: value = ic.readSavable("value_savable", null); break;