diff --git a/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler14.java b/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler14.java index 4b39ed24c..59df7c26c 100644 --- a/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler14.java +++ b/jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler14.java @@ -139,8 +139,10 @@ public class AndroidInputHandler14 extends AndroidInputHandler implements View.O boolean isJoystick = ((source & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) || ((source & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK); + boolean isUnknown = + (source & android.view.InputDevice.SOURCE_UNKNOWN) == android.view.InputDevice.SOURCE_UNKNOWN; - if (isTouch && touchInput != null) { + if (touchInput != null && (isTouch || (isUnknown && this.touchInput.isSimulateKeyboard()))) { // logger.log(Level.INFO, "onKey source: {0}, isTouch: {1}", // new Object[]{source, isTouch}); consumed = touchInput.onKey(event); diff --git a/jme3-core/src/main/java/com/jme3/environment/util/EnvMapUtils.java b/jme3-core/src/main/java/com/jme3/environment/util/EnvMapUtils.java index c7b4f9f36..4598ec0d6 100644 --- a/jme3-core/src/main/java/com/jme3/environment/util/EnvMapUtils.java +++ b/jme3-core/src/main/java/com/jme3/environment/util/EnvMapUtils.java @@ -509,15 +509,15 @@ public class EnvMapUtils { float coef7 = coef5; float coef8 = sqrt15Pi / 4f; - shCoefs[0].multLocal(coef0); - shCoefs[1].multLocal(coef1); - shCoefs[2].multLocal(coef2); - shCoefs[3].multLocal(coef3); - shCoefs[4].multLocal(coef4); - shCoefs[5].multLocal(coef5); - shCoefs[6].multLocal(coef6); - shCoefs[7].multLocal(coef7); - shCoefs[8].multLocal(coef8); + shCoefs[0].multLocal(coef0).multLocal(shBandFactor[0]); + shCoefs[1].multLocal(coef1).multLocal(shBandFactor[1]); + shCoefs[2].multLocal(coef2).multLocal(shBandFactor[2]); + shCoefs[3].multLocal(coef3).multLocal(shBandFactor[3]); + shCoefs[4].multLocal(coef4).multLocal(shBandFactor[4]); + shCoefs[5].multLocal(coef5).multLocal(shBandFactor[5]); + shCoefs[6].multLocal(coef6).multLocal(shBandFactor[6]); + shCoefs[7].multLocal(coef7).multLocal(shBandFactor[7]); + shCoefs[8].multLocal(coef8).multLocal(shBandFactor[8]); } diff --git a/jme3-core/src/main/java/com/jme3/light/LightProbe.java b/jme3-core/src/main/java/com/jme3/light/LightProbe.java index 11eacf566..1cc713445 100644 --- a/jme3-core/src/main/java/com/jme3/light/LightProbe.java +++ b/jme3-core/src/main/java/com/jme3/light/LightProbe.java @@ -120,20 +120,32 @@ public class LightProbe extends Light implements Savable { oc.write(position, "position", null); oc.write(bounds, "bounds", new BoundingSphere(1.0f, Vector3f.ZERO)); oc.write(ready, "ready", false); + oc.write(nbMipMaps, "nbMipMaps", 0); } @Override public void read(JmeImporter im) throws IOException { super.read(im); InputCapsule ic = im.getCapsule(this); - shCoeffs = (Vector3f[]) ic.readSavableArray("shCoeffs", null); + + prefilteredEnvMap = (TextureCubeMap) ic.readSavable("prefilteredEnvMap", null); position = (Vector3f) ic.readSavable("position", this); bounds = (BoundingVolume) ic.readSavable("bounds", new BoundingSphere(1.0f, Vector3f.ZERO)); + nbMipMaps = ic.readInt("nbMipMaps", 0); ready = ic.readBoolean("ready", false); - if (shCoeffs == null) { + + + Savable[] coeffs = ic.readSavableArray("shCoeffs", null); + if (coeffs == null) { ready = false; logger.log(Level.WARNING, "LightProbe is missing parameters, it should be recomputed. Please use lightProbeFactory.updateProbe()"); + } else { + shCoeffs = new Vector3f[coeffs.length]; + for (int i = 0; i < coeffs.length; i++) { + shCoeffs[i] = (Vector3f) coeffs[i]; + } + } } 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 b30aab0c5..06bb1c8c8 100644 --- a/jme3-core/src/main/java/com/jme3/material/MatParam.java +++ b/jme3-core/src/main/java/com/jme3/material/MatParam.java @@ -37,6 +37,7 @@ import com.jme3.math.*; import com.jme3.shader.VarType; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; + import java.io.IOException; /** @@ -301,20 +302,21 @@ When arrays can be inserted in J3M files OutputCapsule oc = ex.getCapsule(this); oc.write(type, "varType", null); oc.write(name, "name", null); + + if (value == null) { + return; + } + if (value instanceof Savable) { - Savable s = (Savable) value; - oc.write(s, "value_savable", null); + oc.write((Savable) value, "value_savable", null); } else if (value instanceof Float) { - Float f = (Float) value; - oc.write(f.floatValue(), "value_float", 0f); + oc.write((Float) value, "value_float", 0f); } else if (value instanceof Integer) { - Integer i = (Integer) value; - oc.write(i.intValue(), "value_int", 0); + oc.write((Integer) value, "value_int", 0); } else if (value instanceof Boolean) { - Boolean b = (Boolean) value; - oc.write(b.booleanValue(), "value_bool", false); + oc.write((Boolean) value, "value_bool", false); } else if (value.getClass().isArray() && value instanceof Savable[]) { - oc.write((Savable[])value, "value_savable_array", null); + oc.write((Savable[]) value, "value_savable_array", null); } } diff --git a/jme3-core/src/main/java/com/jme3/scene/Geometry.java b/jme3-core/src/main/java/com/jme3/scene/Geometry.java index 1e1bbcf50..9bd7ace97 100644 --- a/jme3-core/src/main/java/com/jme3/scene/Geometry.java +++ b/jme3-core/src/main/java/com/jme3/scene/Geometry.java @@ -398,6 +398,9 @@ public class Geometry extends Spatial { // Compute the cached world matrix cachedWorldMat.loadIdentity(); + if (ignoreTransform) { + return; + } cachedWorldMat.setRotationQuaternion(worldTransform.getRotation()); cachedWorldMat.setTranslation(worldTransform.getTranslation()); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag index 80b9c4220..118ebbe19 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag @@ -91,8 +91,10 @@ void main(){ vec2 newTexCoord; vec3 viewDir = normalize(g_CameraPosition - wPosition); + vec3 norm = normalize(wNormal); #if defined(NORMALMAP) || defined(PARALLAXMAP) - mat3 tbnMat = mat3(wTangent.xyz, wTangent.w * cross( (wNormal), (wTangent.xyz)), wNormal.xyz); + vec3 tan = normalize(wTangent.xyz); + mat3 tbnMat = mat3(tan, wTangent.w * cross( (norm), (tan)), norm); #endif #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP))) @@ -126,13 +128,13 @@ void main(){ #ifdef USE_PACKED_MR vec2 rm = texture2D(m_MetallicRoughnessMap, newTexCoord).gb; - float Roughness = rm.x * max(m_Roughness, 1e-8); + float Roughness = rm.x * max(m_Roughness, 1e-4); float Metallic = rm.y * max(m_Metallic, 0.0); #else #ifdef ROUGHNESSMAP - float Roughness = texture2D(m_RoughnessMap, newTexCoord).r * max(m_Roughness, 1e-8); + float Roughness = texture2D(m_RoughnessMap, newTexCoord).r * max(m_Roughness, 1e-4); #else - float Roughness = max(m_Roughness, 1e-8); + float Roughness = max(m_Roughness, 1e-4); #endif #ifdef METALLICMAP float Metallic = texture2D(m_MetallicMap, newTexCoord).r * max(m_Metallic, 0.0); @@ -162,7 +164,7 @@ void main(){ normal = normalize(tbnMat * normal); //normal = normalize(normal * inverse(tbnMat)); #else - vec3 normal = normalize(wNormal); + vec3 normal = norm; #endif float specular = 0.5; @@ -185,7 +187,7 @@ void main(){ #endif specularColor *= m_Specular; #endif - vec4 diffuseColor = albedo * (1.0 - max(max(specularColor.r, specularColor.g), specularColor.b)); + vec4 diffuseColor = albedo;// * (1.0 - max(max(specularColor.r, specularColor.g), specularColor.b)); Roughness = 1.0 - glossiness; #else float nonMetalSpec = 0.08 * specular; @@ -250,7 +252,7 @@ void main(){ rv = invRadius * (wPosition - g_LightProbeData.xyz) +rv; //horizon fade from http://marmosetco.tumblr.com/post/81245981087 - float horiz = dot(rv, wNormal.xyz); + float horiz = dot(rv, norm); float horizFadePower = 1.0 - Roughness; horiz = clamp( 1.0 + horizFadePower * horiz, 0.0, 1.0 ); horiz *= horiz; diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md index e2c1b089e..61edf8e0d 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md @@ -288,9 +288,6 @@ MaterialDef PBR Lighting { Defines { NEED_TEXCOORD1 - HAS_GLOWMAP : GlowMap - HAS_GLOWCOLOR : GlowColor - NUM_BONES : NumberOfBones INSTANCING : UseInstancing } diff --git a/jme3-core/src/plugins/java/com/jme3/shader/plugins/GLSLLoader.java b/jme3-core/src/plugins/java/com/jme3/shader/plugins/GLSLLoader.java index 1dc25da8e..d3368e45f 100644 --- a/jme3-core/src/plugins/java/com/jme3/shader/plugins/GLSLLoader.java +++ b/jme3-core/src/plugins/java/com/jme3/shader/plugins/GLSLLoader.java @@ -31,12 +31,9 @@ */ package com.jme3.shader.plugins; -import com.jme3.asset.AssetInfo; -import com.jme3.asset.AssetKey; -import com.jme3.asset.AssetLoadException; -import com.jme3.asset.AssetLoader; -import com.jme3.asset.AssetManager; +import com.jme3.asset.*; import com.jme3.asset.cache.AssetCache; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; @@ -49,7 +46,7 @@ import java.util.*; public class GLSLLoader implements AssetLoader { private AssetManager assetManager; - private final Map dependCache = new HashMap<>(); + private Map dependCache = new HashMap<>(); /** * Used to load {@link ShaderDependencyNode}s. @@ -70,25 +67,27 @@ public class GLSLLoader implements AssetLoader { /** * Creates a {@link ShaderDependencyNode} from a stream representing shader code. - * - * @param in The input stream containing shader code - * @param nodeName - * @return - * @throws IOException + * + * @param reader the reader with shader code + * @param nodeName the node name. + * @return the shader dependency node + * @throws AssetLoadException if we failed to load the shader code. */ private ShaderDependencyNode loadNode(Reader reader, String nodeName) { - ShaderDependencyNode node = new ShaderDependencyNode(nodeName); + ShaderDependencyNode node = new ShaderDependencyNode(nodeName); StringBuilder sb = new StringBuilder(); StringBuilder sbExt = new StringBuilder(); - BufferedReader bufReader = null; - try { - bufReader = new BufferedReader(reader); + + try (final BufferedReader bufferedReader = new BufferedReader(reader)) { + String ln; + if (!nodeName.equals("[main]")) { sb.append("// -- begin import ").append(nodeName).append(" --\n"); } - while ((ln = bufReader.readLine()) != null) { + + while ((ln = bufferedReader.readLine()) != null) { if (ln.trim().startsWith("#import ")) { ln = ln.trim().substring(8).trim(); if (ln.startsWith("\"") && ln.endsWith("\"") && ln.length() > 3) { @@ -118,13 +117,7 @@ public class GLSLLoader implements AssetLoader { if (!nodeName.equals("[main]")) { sb.append("// -- end import ").append(nodeName).append(" --\n"); } - } catch (IOException ex) { - if (bufReader != null) { - try { - bufReader.close(); - } catch (IOException ex1) { - } - } + } catch (final IOException ex) { throw new AssetLoadException("Failed to load shader node: " + nodeName, ex); } @@ -137,7 +130,7 @@ public class GLSLLoader implements AssetLoader { private ShaderDependencyNode nextIndependentNode() throws IOException { Collection allNodes = dependCache.values(); - if (allNodes == null || allNodes.isEmpty()) { + if (allNodes.isEmpty()) { return null; } @@ -182,8 +175,9 @@ public class GLSLLoader implements AssetLoader { } } + @Override public Object load(AssetInfo info) throws IOException { - // The input stream provided is for the vertex shader, + // The input stream provided is for the vertex shader, // to retrieve the fragment shader, use the content manager this.assetManager = info.getManager(); Reader reader = new InputStreamReader(info.openStream()); diff --git a/jme3-core/src/test/java/com/jme3/collision/CollideIgnoreTransformTest.java b/jme3-core/src/test/java/com/jme3/collision/CollideIgnoreTransformTest.java new file mode 100644 index 000000000..f2eb63ef8 --- /dev/null +++ b/jme3-core/src/test/java/com/jme3/collision/CollideIgnoreTransformTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2017 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.collision; + +import com.jme3.asset.AssetManager; +import com.jme3.asset.DesktopAssetManager; +import com.jme3.asset.plugins.ClasspathLocator; +import com.jme3.material.Material; +import com.jme3.material.plugins.J3MLoader; +import com.jme3.math.Ray; +import com.jme3.math.Vector3f; +import com.jme3.scene.Geometry; +import com.jme3.scene.Mesh; +import com.jme3.scene.Node; +import com.jme3.scene.shape.Quad; +import org.junit.Test; + +/** + * Verify that collideWith() works with ignoreTransforms. This was issue #744 at + * GitHub. + * + * @author Stephen Gold + */ +public class CollideIgnoreTransformTest { + + AssetManager assetManager; + + Node rootNode; + + /** + * Cast a ray at the geometry and check the number of collisions. + */ + void castRay(Ray ray, int expectedNumResults) { + CollisionResults results = new CollisionResults(); + rootNode.collideWith(ray, results); + int numResults = results.size(); + if (numResults != expectedNumResults) { + String msg = String.format("Expected %d, got %d.", + expectedNumResults, numResults); + throw new RuntimeException(msg); + } + } + + /** + * Attach a red square in the XY plane with its lower left corner at (0, 0, + * 0). It is composed of 2 triangles. + */ + void createRedSquare() { + Mesh quadMesh = new Quad(1f, 1f); + Geometry redSquare = new Geometry("red square", quadMesh); + Material red = assetManager.loadMaterial("Common/Materials/RedColor.j3m"); + redSquare.setMaterial(red); + rootNode.attachChild(redSquare); + + redSquare.setLocalTranslation(0f, 3f, 0f); + redSquare.setIgnoreTransform(true); + } + + @Test + public void testPhantomTriangles() { + assetManager = new DesktopAssetManager(); + assetManager.registerLocator(null, ClasspathLocator.class); + assetManager.registerLoader(J3MLoader.class, "j3m", "j3md"); + rootNode = new Node(); + + createRedSquare(); + + rootNode.updateLogicalState(0.01f); + rootNode.updateGeometricState(); + /** + * ray in the -Z direction, starting from (0.5, 0.6, 10) + */ + Ray ray1 = new Ray(/* origin */new Vector3f(0.5f, 0.6f, 10f), + /* direction */ new Vector3f(0f, 0f, -1f)); + castRay(ray1, 1); + /** + * ray in the -Z direction, starting from (0.5, 3, 10) + */ + Ray ray0 = new Ray(/* origin */new Vector3f(0.5f, 3f, 10f), + /* direction */ new Vector3f(0f, 0f, -1f)); + castRay(ray0, 0); + } +} diff --git a/jme3-testdata/src/main/resources/Scenes/defaultProbe.j3o b/jme3-testdata/src/main/resources/Scenes/defaultProbe.j3o index 89a086d44..3d7568340 100644 Binary files a/jme3-testdata/src/main/resources/Scenes/defaultProbe.j3o and b/jme3-testdata/src/main/resources/Scenes/defaultProbe.j3o differ