App crashing on Android but not in Desktop

I’m trying to run my app in Android but it’s crashing with the following exception:

java.langNoSuchMethodError: com.jme3.bullet.PhysicsSpace.getDynamicsWorld

It seems that for some reason that method only exists on Desktop and not in Android code.
I can run it without problems on Desktop app.
Some help please.
Thanks in advance!

must be some dependency issue, make sure you have jm3-bullet dependency in your generated apk

You’re not supposed to call this method at all (see its javadoc). What are you doing with it?

I dont have the code with me right now but i dont recall of calling this method directly, i believe its jme that is calling it but even if it was me i dont understand why crashes in android but not in desktop app.

Because that method doesn’t exist in the native version of bullet which is used on android (automatically even when you use jbullet on desktop). And the engine itself surely doesn’t call it when the native version is used, which is the only possible reason why its missing, so it basically must be you who calls it.

Ah ok normen thanks for your quick reply.
I will see if im calling it when i arrive home and replace it for the proper method.

You are right Normen, i was looking in the online examples i used to create my code and one of them uses that method to set the gravity :slight_smile:

@majc said: You are right Normen, i was looking in the online examples i used to create my code and one of them uses that method to set the gravity :)

Best use our examples and not some example from the web.

It was an example given in one post in this forum and it works well in desktop but since im creating an Android game i will have to be more carefull :slight_smile:

@majc said: It was an example given in one post in this forum and it works well in desktop but since im creating an Android game i will have to be more carefull :)

Its simply the wrong way of doing this, you should always use the PhysicsSpace to set the gravity globally. Our examples are available through the “Documentation” link in the main menu of this site (at the left in the current theme).

Thank you Normen point taken.
I will try it when i arrive home.

OK the physics problem is fixed but now i have another problem.
Like before it works on desktop but not in android.
Here is the exception:

E/com.jme3.app.AndroidHarness(10203): SEVERE Exception thrown in Thread[GLThread 1803,5,main]
E/com.jme3.app.AndroidHarness(10203): java.lang.NullPointerException
E/com.jme3.app.AndroidHarness(10203): at java.io.Reader.<init>(Reader.java:64)
E/com.jme3.app.AndroidHarness(10203): at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.copy(IOUtils.java:1906)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.toString(IOUtils.java:778)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.toString(IOUtils.java:759)
E/com.jme3.app.AndroidHarness(10203): at net.medievalsoul.dice.DiceCreator.<init>(DiceCreator.java:48)
E/com.jme3.app.AndroidHarness(10203): at medievalsoul.Main.simpleInitApp(Main.java:102)
E/com.jme3.app.AndroidHarness(10203): at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:226)
E/com.jme3.app.AndroidHarness(10203): at com.jme3.app.AndroidHarness.initialize(AndroidHarness.java:455)
E/com.jme3.app.AndroidHarness(10203): at com.jme3.system.android.OGLESContext.initInThread(OGLESContext.java:229)
E/com.jme3.app.AndroidHarness(10203): at com.jme3.system.android.OGLESContext.onSurfaceCreated(OGLESContext.java:205)
E/com.jme3.app.AndroidHarness(10203): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1520)
E/com.jme3.app.AndroidHarness(10203): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1266)

Here is the line:

[java]diceInfo = GSON.fromJson(IOUtils.toString(getClass().getResourceAsStream("/Models/diceshapes.json")),
new TypeToken<Map<DiceType, DiceShapeInfo>>() {
}.getType());[/java]

and this is the complete class:

[java]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package net.medievalsoul.dice;

import com.jme3.asset.AssetManager;
import com.jme3.bullet.collision.shapes.CollisionShape;
import com.jme3.bullet.collision.shapes.HullCollisionShape;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.material.Material;
import com.jme3.material.RenderState;
import com.jme3.math.Vector3f;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.texture.Texture;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
//import net.medievalsoul.utils.GsonUtil;

import org.apache.commons.io.IOUtils;
import com.google.gson.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
*

  • @author User
    */
    public class DiceCreator {

    Map<DiceType, DiceShapeInfo> diceInfo;
    Map<DiceType, Mesh> diceModels = new HashMap<DiceType, Mesh>();
    Map<DiceType, Mesh> diceHulls = new HashMap<DiceType, Mesh>();
    private AssetManager assetManager;
    private static Gson GSON;

    static {
    GsonBuilder builder = new GsonBuilder().setPrettyPrinting();
    GSON = builder.create();
    }

    public DiceCreator(AssetManager assetManager) throws IOException {
    this.assetManager = assetManager;

     diceInfo = GSON.fromJson(IOUtils.toString(getClass().getResourceAsStream("/Models/diceshapes.json")),
             new TypeToken&lt;Map&lt;DiceType, DiceShapeInfo&gt;&gt;() {
     }.getType());
    
     for (DiceShapeInfo dsi : diceInfo.values()) {
         diceModels.put(dsi.name, ((Geometry) assetManager.loadModel(dsi.smoothModel)).getMesh());
         diceHulls.put(dsi.name, ((Geometry) assetManager.loadModel(dsi.hullModel)).getMesh());
     }
    

    }

    public Geometry createDice(DiceSetDesign setDesign, DiceType diceType) {
    Geometry diceGeometry;

     Mesh diceMesh = diceModels.get(diceType);
     Mesh diceHull = diceHulls.get(diceType);
     DiceShapeInfo dsi = diceInfo.get(diceType);
    
     CollisionShape bulletCollisionShape;
     bulletCollisionShape = new HullCollisionShape(diceHull);
     diceGeometry = new Geometry(diceType.name(), diceMesh);
     diceGeometry.setShadowMode(RenderQueue.ShadowMode.Cast);
    
     Material mat = new Material(assetManager, "/MatDefs/Dice.j3md");
    
     String textureName = dsi.textureName;
    
     if (textureName != null) {
         mat.setTexture("DiffuseMap", assetManager.loadTexture(textureName));
     }
    
     applyDesign(diceGeometry, mat, setDesign);
    
     diceGeometry.setMaterial(mat);
     bulletCollisionShape.setScale(new Vector3f(dsi.modelScale, dsi.modelScale, dsi.modelScale));
     RigidBodyControl rbc = new RigidBodyControl(bulletCollisionShape, 1);
     diceGeometry.addControl(rbc);
     diceGeometry.scale(dsi.modelScale);
    
     return diceGeometry;
    

    }

    public void applyDesign(Geometry diceGeometry, Material mat, DiceSetDesign design) {
    mat.setColor(“DecalColor”, design.decal);

     if (design.backgroundTexture != null) {
         mat.setTexture("DiffuseMapBack", assetManager.loadTexture(design.backgroundTexture));
     } else {
         if (mat.getTextureParam("DiffuseMapBack") != null) {
             mat.setTexture("DiffuseMapBack", null);
         }
     }
    
     //if (design.decalMetal != 0 || design.backgroundMetal != 0) {
     Texture chromeMap = assetManager.loadTexture("/Textures/chrome1.tga");
     mat.setTexture("EnvMap", chromeMap);
     mat.setFloat("BackMetal", design.backgroundMetal);
     mat.setFloat("DecalMetal", design.decalMetal);
     //}
    
     if (design.glowTexture != null) {
         mat.setTexture("GlowMap", assetManager.loadTexture(design.glowTexture));
     } else {
         if (mat.getTextureParam("GlowMap") != null) {
             mat.setTexture("GlowMap", null);
         }
     }
    
     mat.setFloat("Shininess", design.shininess);
     mat.setColor("Specular", design.specular);
     mat.setColor("Ambient", design.ambient);
     mat.setColor("Diffuse", design.diffuse);
     mat.setBoolean("UseMaterialColors", true);
    
     if (design.glow != null) {
         mat.setColor("GlowColor", design.glow);
     }
     if (design.diffuse.a != 1 || design.ambient.a != 1) {
         mat.setTransparent(true);
         diceGeometry.setQueueBucket(RenderQueue.Bucket.Transparent);
         mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha);
     } else {
         diceGeometry.setQueueBucket(RenderQueue.Bucket.Opaque);
     }
    

    }
    }
    [/java]

Thanks in advance!

@majc said:

E/com.jme3.app.AndroidHarness(10203): SEVERE Exception thrown in Thread[GLThread 1803,5,main]
E/com.jme3.app.AndroidHarness(10203): java.lang.NullPointerException
E/com.jme3.app.AndroidHarness(10203): at java.io.Reader.<init>(Reader.java:64)
E/com.jme3.app.AndroidHarness(10203): at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.copy(IOUtils.java:1906)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.toString(IOUtils.java:778)
E/com.jme3.app.AndroidHarness(10203): at org.apache.commons.io.IOUtils.toString(IOUtils.java:759)
E/com.jme3.app.AndroidHarness(10203): at net.medievalsoul.dice.DiceCreator.<init>(DiceCreator.java:48)

Your problem lies at exactly this line: (DiceCreator.java:48)
Your problem is that something is null

I guess because your json-file is not included in the build.

Hi Johan and thanks for your reply.
The file diceshapes.json is in:

D:\Projecto\MedievalSoul\assets\Models\diceshapes.json
D:\Projecto\MedievalSoul\mobile\assets\Models\diceshapes.json
D:\Projecto\MedievalSoul\dist\MedievalSoul-debug.apk\assets\Models\diceshapes.json

Here is the file:

[java]

{
“D4”: {
“name”: “D4”,
“sides”: 4,
“modelScale”: 1.0,
“smoothModel”: “/Models/d4-s2.j3o”,
“hullModel”: “/Models/d4-hull.j3o”,
“textureName”: “/Models/d4.png”,
“controlPoints”: [
{“x”:0.0, “y”:1.0, “z”:0.0},
{“x”:-0.816, “y”:-0.334, “z”:-0.472},
{“x”:0.816, “y”:-0.334, “z”:-0.472},
{“x”:0.0, “y”:-0.33, “z”:0.94}
]
},
“D6”: {
“name”: “D6”,
“sides”: 6,
“modelScale”: 0.9,
“smoothModel”: “/Models/d6-s2.j3o”,
“hullModel”: “/Models/d6-hull.j3o”,
“textureName”: “/Models/d20.png”,
“controlPoints”: [
{“x”:-1.0, “y”:0.0, “z”:0.0},
{“x”:0.0, “y”:-1.0, “z”:0.0},
{“x”:0.0, “y”:0.0, “z”:-1.0},
{“x”:0.0, “y”:0.0, “z”:1.0},
{“x”:0.0, “y”:1.0, “z”:0.0},
{“x”:1.0, “y”:0.0, “z”:0.0}
]
},
“D8”: {
“name”: “D8”,
“sides”: 8,
“modelScale”: 1.0,
“smoothModel”: “/Models/d8-s2.j3o”,
“hullModel”: “/Models/d8-hull.j3o”,
“textureName”: “/Models/d20.png”,
“controlPoints”: [
{“x”:-0.577, “y”:0.577, “z”:-0.577},
{“x”:-0.577, “y”:-0.577, “z”:0.577},
{“x”:-0.5774, “y”:0.5773, “z”:0.5774},
{“x”:-0.577, “y”:-0.577, “z”:-0.577},
{“x”:0.577, “y”:0.577, “z”:0.577},
{“x”:0.577, “y”:-0.577, “z”:-0.577},
{“x”:0.577, “y”:0.577, “z”:-0.577},
{“x”:0.577, “y”:-0.577, “z”:0.577}
]
},
“D10”: {
“name”: “D10”,
“sides”: 10,
“modelScale”: 1.0,
“smoothModel”: “/Models/d10-s2.j3o”,
“hullModel”: “/Models/d10-hull.j3o”,
“textureName”: “/Models/d20.png”,
“controlPoints”: [
{“x”:0.629, “y”:0.629, “z”:0.457},
{“x”:0.24, “y”:-0.629, “z”:0.739},
{“x”:0.629, “y”:0.629, “z”:-0.457},
{“x”:0.24, “y”:-0.629, “z”:-0.739},
{“x”:-0.778, “y”:0.629, “z”:0.0},
{“x”:0.778, “y”:-0.629, “z”:0.0},
{“x”:-0.24, “y”:0.629, “z”:0.739},
{“x”:-0.629, “y”:-0.629, “z”:0.457},
{“x”:-0.24, “y”:0.629, “z”:-0.739},
{“x”:-0.629, “y”:-0.629, “z”:-0.457}
]
},
“D12”: {
“name”: “D12”,
“sides”: 12,
“modelScale”: 1.0,
“smoothModel”: “/Models/d12-s2.j3o”,
“hullModel”: “/Models/d12-hull.j3o”,
“textureName”: “/Models/d20.png”,
“controlPoints”: [
{“x”:0.000, “y”:-0.5259, “z”:-0.8506},
{“x”:0.5258, “y”:0.8506, “z”:0.000},
{“x”:0.5257, “y”:-0.8507, “z”:0.000},
{“x”:0.8507, “y”:0.0000, “z”:0.5257},
{“x”:0.0000, “y”:-0.526, “z”:0.8505},
{“x”:-0.8505, “y”:0.000, “z”:0.5260},
{“x”:0.8505, “y”:0.000, “z”:-0.5260},
{“x”:0.0000, “y”:0.526, “z”:-0.8505},
{“x”:-0.8507, “y”:0.0000, “z”:-0.5257},
{“x”:-0.5257, “y”:0.8507, “z”:0.000},
{“x”:-0.5258, “y”:-0.8506, “z”:0.000},
{“x”:0.00, “y”:0.5266, “z”:0.8501}
]
},
“D20”: {
“name”: “D20”,
“sides”: 20,
“modelScale”: 1.0,
“smoothModel”: “/Models/d20-s2.j3o”,
“hullModel”: “/Models/d20-hull.j3o”,
“textureName”: “/Models/d20.png”,
“controlPoints”: [
{“x”:-0.1884, “y”:0.7944, “z”:-0.5775},
{“x”:-0.4910, “y”:-0.7945, “z”:0.3574},
{“x”:-0.1876, “y”:0.7947, “z”:0.5773},
{“x”:0.4911, “y”:0.7947, “z”:0.3568},
{“x”:0.3035, “y”:-0.1876, “z”:0.9342},
{“x”:0.7944, “y”:0.1870, “z”:0.5779},
{“x”:0.6072, “y”:-0.7945, “z”:0.000},
{“x”:-0.9822, “y”:0.1877, “z”:0.000},
{“x”:-0.795, “y”:-0.1872, “z”:0.577},
{“x”:-0.3036, “y”:0.1876, “z”:0.9342},
{“x”:0.3036, “y”:-0.1876, “z”:-0.9342},
{“x”:0.795, “y”:0.1872, “z”:-0.577},
{“x”:0.9822, “y”:-0.1877, “z”:0.000},
{“x”:-0.6072, “y”:0.7945, “z”:0.000},
{“x”:-0.7944, “y”:-0.1870, “z”:-0.5779},
{“x”:-0.3035, “y”:0.1876, “z”:-0.9342},
{“x”:-0.4911, “y”:-0.7947, “z”:-0.3568},
{“x”:0.1876, “y”:-0.7947, “z”:-0.5773},
{“x”:0.491, “y”:0.7945, “z”:-0.3575},
{“x”:0.1884, “y”:-0.7944, “z”:0.5775}
]
}
}
[/java]

All the …j3o files are in the same folder of diceshapes.json in the 3 folders above.

Here are the folders screenshots:

http://s2.postimg.org/njn9jrend/folder_1.png

http://s2.postimg.org/min0umxnt/folder2.png

http://s2.postimg.org/yhyj1y38p/folder_3.png

What am I missing?

Ok after a lot of trial and error i found the solution to this problem.
It seems in Android the path i have to pass to getResourceAsStream it’s /assets/Models/diceshapes.json but I don’t understand why, that way I’ll have to change the path depending on the platform which I don’t think it’s a good thing.
I still have errors but could be because of the paths.

Now I have this error:
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): WARNING Bad compile of:
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 1 m_ColorMap
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 2 #define DECAL_COLOR 1
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 3 #define DIFFUSEMAP 1
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 4 #define ENVMAP 1
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 5 #define MATERIAL_COLORS 1
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 6 #define ATTENUATION
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 7 //#define HQ_ATTENUATION
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 8
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 9 varying vec2 texCoord;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 10
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 11 varying vec3 AmbientSum;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 12 varying vec4 DiffuseSum;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 13 varying vec3 SpecularSum;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 14
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 15 varying vec3 vPosition;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 16 varying vec3 vViewDir;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 17 varying vec4 vLightDir;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 18
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 19
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 20 #ifdef DIFFUSEMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 21 uniform sampler2D m_DiffuseMap;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 22 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 23
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 24 #ifdef DIFFUSEMAP_BACK
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 25 uniform sampler2D m_DiffuseMapBack;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 26 varying vec2 backgroundTexCoord;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 27 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 28
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 29 #ifdef PARALLAXMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 30 uniform sampler2D m_ParallaxMap;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 31 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 32
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 33 #ifdef NORMALMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 34 uniform sampler2D m_NormalMap;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 35 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 36 varying vec3 vNormal;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 37 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 38
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 39 #ifdef ALPHAMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 40 uniform sampler2D m_AlphaMap;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 41 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 42
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 43 #ifdef DECAL_COLOR
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 44 uniform vec4 m_DecalColor;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 45 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 46
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 47
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 48
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 49 #ifdef ENVMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 50 uniform sampler2D m_EnvMap;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 51 uniform float m_DecalMetal;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 52 uniform float m_BackMetal;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 53
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 54
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 55 varying vec2 reflectTexCoord;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 56 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 57
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 58
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 59 uniform vec4 g_AmbientLightColor;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 60 uniform float m_Shininess;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 61
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 62
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 63 uniform vec4 g_LightDirection;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 64 varying vec3 lightVec;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 65
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 66
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 67 float tangDot(in vec3 v1, in vec3 v2){
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 68 float d = dot(v1,v2);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 69 #ifdef V_TANGENT
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 70 d = 1.0 - dd;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 71 return step(0.0, d) * sqrt(d);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 72 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 73 return d;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 74 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 75 }
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 76
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 77 float lightComputeDiffuse(in vec3 norm, in vec3 lightdir, in vec3 viewdir){
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 78 #ifdef MINNAERT
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 79 float NdotL = max(0.0, dot(norm, lightdir));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 80 float NdotV = max(0.0, dot(norm, viewdir));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 81 return NdotL * pow(max(NdotL * NdotV, 0.1), -1.0) * 0.5;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 82 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 83 return max(0.0, dot(norm, lightdir));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 84 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 85 }
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 86
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 87 float lightComputeSpecular(in vec3 norm, in vec3 viewdir, in vec3 lightdir, in float shiny){
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 88
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 89 #if defined(WARDISO)
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 90 // Isotropic Ward
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 91 vec3 halfVec = normalize(viewdir + lightdir);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 92 float NdotH = max(0.001, tangDot(norm, halfVec));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 93 float NdotV = max(0.001, tangDot(norm, viewdir));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 94 float NdotL = max(0.001, tangDot(norm, lightdir));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 95 float a = tan(acos(NdotH));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 96 float p = max(shiny/128.0, 0.001);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 97 return NdotL * (1.0 / (4.0
3.14159265pp)) * (exp(-(aa)/(pp)) / (sqrt(NdotV * NdotL)));
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 98 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 99 // Standard Phong
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 100 vec3 R = reflect(-lightdir, norm);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 101 return pow(max(tangDot(R, viewdir), 0.0), shiny);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 102 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 103 }
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 104
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 105 vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 wvLightDir){
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 106 float diffuseFactor = lightComputeDiffuse(wvNorm, wvLightDir, wvViewDir);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 107 float specularFactor = lightComputeSpecular(wvNorm, wvViewDir, wvLightDir, m_Shininess);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 108 specularFactor = step(1.0, m_Shininess);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 109
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 110 #ifdef HQ_ATTENUATION
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 111 float att = clamp(1.0 - g_LightPosition.w * length(lightVec), 0.0, 1.0);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 112 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 113 float att = vLightDir.w;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 114 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 115
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 116 specularFactor = diffuseFactor;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 117
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 118 return vec2(diffuseFactor, specularFactor) * vec2(att);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 119 }
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 120
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 121
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 122 void main(){
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 123 vec2 newTexCoord;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 124 #if (defined(PARALLAXMAP) || defined(NORMALMAP_PARALLAX)) && !defined(VERTEX_LIGHTING)
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 125 float h;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 126 #ifdef PARALLAXMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 127 h = texture2D(m_ParallaxMap, texCoord).r;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 128 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 129 h = texture2D(m_NormalMap, texCoord).a;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 130 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 131 float heightScale = 0.05;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 132 float heightBias = heightScale * -0.5;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 133 vec3 normView = normalize(vViewDir);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 134 h = (h * heightScale + heightBias) * normView.z;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 135 newTexCoord = texCoord + (h * normView.xy);
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 136 #else
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 137 newTexCoord = texCoord;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 138 #endif
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 139
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 140 vec4 diffuseColor;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 141
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 142 #ifdef DIFFUSEMAP
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 143 float alp = texture2D(m_DiffuseMap, newTexCoord).a;
W/com.jme3.renderer.android.OGLESShaderRenderer(18970): 144 diffuseColor.rgb = m_DecalColor.rg
D/BufferQueue( 104): [SurfaceView] cancelBuffer: slot=0
I/BufferQueue( 104): [SurfaceView] disconnect: api=1
I/SurfaceTexture( 104): [SurfaceView] [virtual void android::SurfaceTexture::onBuffersReleased()] mCurrentTexture:-1, mCurrentBuf:0x42ac9e88
I/BufferQueue( 104): [SurfaceView] getReleasedBuffers: returning mask 0xffffffff
D/dalvikvm(18970): threadid=12: exiting
W/dalvikvm(18970): threadid=12: thread exiting with uncaught exception (group=0x41485908)
E/com.jme3.app.AndroidHarness(18970): SEVERE Exception thrown in Thread[GLThread 2182,5,main]
E/com.jme3.app.AndroidHarness(18970): com.jme3.renderer.RendererException: compile error in:ShaderSource[name=/Shaders/Dice.frag, defines, type=Fragment, language=GLSL100] error:Compile failed.
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:179: ‘-’ : Wrong operand types. No operation ‘-’ exists that takes a left-hand operand of type ‘const int’ and a right operand of type ‘float’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:179: '
’ : Wrong operand types. No operation '
’ exists that takes a left-hand operand of type ‘uniform float’ and a right operand of type ‘int’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:180: ‘-’ : Wrong operand types. No operation ‘-’ exists that takes a left-hand operand of type ‘const int’ and a right operand of type ‘float’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:180: ‘’ : Wrong operand types. No operation '’ exists that takes a left-hand operand of type ‘3-component vector of float’ and a right operand of type ‘int’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:228: ‘-’ : Wrong operand types. No operation ‘-’ exists that takes a left-hand operand of type ‘const int’ and a right operand of type ‘float’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 0:228: ‘’ : Wrong operand types. No operation '’ exists that takes a left-hand operand of type ‘3-component vector of float’ and a right operand of type ‘int’ (and there is no acceptable conversion)
E/com.jme3.app.AndroidHarness(18970): ERROR: 6 compilation errors. No code generated.
E/com.jme3.app.AndroidHarness(18970):
E/com.jme3.app.AndroidHarness(18970):
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:887)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:912)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:970)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.material.Material.renderMultipassLighting(Material.java:837)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.material.Material.render(Material.java:1107)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:374)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:763)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:467)
E/com.jme3.app.AndroidHarness(18970): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:349)
E/com.jme3.app.AndroidHarness(18970): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1542)
E/com.jme3.app.AndroidHarness(18970): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1266)

dice.frag
[java]#define ATTENUATION
//#define HQ_ATTENUATION

varying vec2 texCoord;

varying vec3 AmbientSum;
varying vec4 DiffuseSum;
varying vec3 SpecularSum;

varying vec3 vPosition;
varying vec3 vViewDir;
varying vec4 vLightDir;

#ifdef DIFFUSEMAP
uniform sampler2D m_DiffuseMap;
#endif

#ifdef DIFFUSEMAP_BACK
uniform sampler2D m_DiffuseMapBack;
varying vec2 backgroundTexCoord;
#endif

#ifdef PARALLAXMAP
uniform sampler2D m_ParallaxMap;
#endif

#ifdef NORMALMAP
uniform sampler2D m_NormalMap;
#else
varying vec3 vNormal;
#endif

#ifdef ALPHAMAP
uniform sampler2D m_AlphaMap;
#endif

#ifdef DECAL_COLOR
uniform vec4 m_DecalColor;
#endif

#ifdef ENVMAP
uniform sampler2D m_EnvMap;
uniform float m_DecalMetal;
uniform float m_BackMetal;

varying vec2 reflectTexCoord;
#endif

uniform vec4 g_AmbientLightColor;
uniform float m_Shininess;

uniform vec4 g_LightDirection;
varying vec3 lightVec;

float tangDot(in vec3 v1, in vec3 v2){
float d = dot(v1,v2);
#ifdef V_TANGENT
d = 1.0 - d*d;
return step(0.0, d) * sqrt(d);
#else
return d;
#endif
}

float lightComputeDiffuse(in vec3 norm, in vec3 lightdir, in vec3 viewdir){
#ifdef MINNAERT
float NdotL = max(0.0, dot(norm, lightdir));
float NdotV = max(0.0, dot(norm, viewdir));
return NdotL * pow(max(NdotL * NdotV, 0.1), -1.0) * 0.5;
#else
return max(0.0, dot(norm, lightdir));
#endif
}

float lightComputeSpecular(in vec3 norm, in vec3 viewdir, in vec3 lightdir, in float shiny){

#if defined(WARDISO)
    // Isotropic Ward
    vec3 halfVec = normalize(viewdir + lightdir);
    float NdotH  = max(0.001, tangDot(norm, halfVec));
    float NdotV  = max(0.001, tangDot(norm, viewdir));
    float NdotL  = max(0.001, tangDot(norm, lightdir));
    float a      = tan(acos(NdotH));
    float p      = max(shiny/128.0, 0.001);
    return NdotL * (1.0 / (4.0*3.14159265*p*p)) * (exp(-(a*a)/(p*p)) / (sqrt(NdotV * NdotL)));
#else
   // Standard Phong
   vec3 R = reflect(-lightdir, norm);
   return pow(max(tangDot(R, viewdir), 0.0), shiny);
#endif

}

vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 wvLightDir){
float diffuseFactor = lightComputeDiffuse(wvNorm, wvLightDir, wvViewDir);
float specularFactor = lightComputeSpecular(wvNorm, wvViewDir, wvLightDir, m_Shininess);
specularFactor *= step(1.0, m_Shininess);

#ifdef HQ_ATTENUATION
float att = clamp(1.0 - g_LightPosition.w * length(lightVec), 0.0, 1.0);
#else
float att = vLightDir.w;
#endif

specularFactor *= diffuseFactor;

return vec2(diffuseFactor, specularFactor) * vec2(att);
}

void main(){
vec2 newTexCoord;
#if (defined(PARALLAXMAP) || defined(NORMALMAP_PARALLAX)) && !defined(VERTEX_LIGHTING)
float h;
#ifdef PARALLAXMAP
h = texture2D(m_ParallaxMap, texCoord).r;
#else
h = texture2D(m_NormalMap, texCoord).a;
#endif
float heightScale = 0.05;
float heightBias = heightScale * -0.5;
vec3 normView = normalize(vViewDir);
h = (h * heightScale + heightBias) * normView.z;
newTexCoord = texCoord + (h * normView.xy);
#else
newTexCoord = texCoord;
#endif

vec4 diffuseColor;

#ifdef DIFFUSEMAP
  float alp = texture2D(m_DiffuseMap, newTexCoord).a;
  diffuseColor.rgb = m_DecalColor.rgb*alp;
  diffuseColor.a = alp;
#else
  diffuseColor = vec4(1.0);
#endif


// ***********************
// Read from textures
// ***********************
#if defined(NORMALMAP)
  vec4 normalHeight = texture2D(m_NormalMap, newTexCoord);
  vec3 normal = (normalHeight.xyz * vec3(2.0) - vec3(1.0));
  #ifdef LATC
    normal.z = sqrt(1.0 - (normal.x * normal.x) - (normal.y * normal.y));
  #endif
  //normal.y = -normal.y;
#else
  vec3 normal = vNormal;
  #if !defined(LOW_QUALITY) &amp;&amp; !defined(V_TANGENT)
     normal = normalize(normal);
  #endif
#endif

  
  //color.rgb = color.rgb*(1-alp) + m_DecalColor.rgb*(alp);
  //color.a = color.a*(1-alp) + m_DecalColor.a*(alp);




//TODO: check how alfa plays with transparency
//TODO: make separate 'metal' factor for decal and for background
#ifdef ENVMAP
	vec4 env = texture2D( m_EnvMap, reflectTexCoord.st);
	float useMetal = (m_DecalMetal*diffuseColor.a) + (m_BackMetal*(1-diffuseColor.a));
	diffuseColor.rgb = diffuseColor.rgb * (1-useMetal)  + env.rgb * (useMetal);
	diffuseColor.a = max(diffuseColor.a,useMetal);
#endif

float alpha = max(DiffuseSum.a, diffuseColor.a);
#ifdef ALPHAMAP
   alpha = alpha * texture2D(m_AlphaMap, newTexCoord).r;
#endif


#ifndef VERTEX_LIGHTING
    float spotFallOff = 1.0;
    if(g_LightDirection.w != 0.0){
          vec3 L       = normalize(lightVec.xyz);
          vec3 spotdir = normalize(g_LightDirection.xyz);
          float curAngleCos = dot(-L, spotdir);             
          float innerAngleCos = floor(g_LightDirection.w) * 0.001;
          float outerAngleCos = fract(g_LightDirection.w);
          float innerMinusOuter = innerAngleCos - outerAngleCos;

          spotFallOff = (curAngleCos - outerAngleCos) / innerMinusOuter;

          if(spotFallOff &lt;= 0.0){
              gl_FragColor.rgb = AmbientSum * diffuseColor.rgb;
              gl_FragColor.a   = alpha;
              return;
          }else{
              spotFallOff = clamp(spotFallOff, 0.0, 1.0);
          }
    }
 #endif

   
vec4 lightDir = vLightDir;
lightDir.xyz = normalize(lightDir.xyz);
vec2 light = computeLighting(vPosition, normal, vViewDir.xyz, lightDir.xyz) * spotFallOff;

vec4 finalColor;

#ifdef DIFFUSEMAP_BACK
	vec4 backColor = texture2D(m_DiffuseMapBack, backgroundTexCoord);
	
	finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
   				  (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1-diffuseColor.a)*backColor.rgb +
                  SpecularSum.rgb * light.y;

#else
	finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
   				  (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1-diffuseColor.a) +
                  SpecularSum.rgb * light.y;

#endif

finalColor.a = alpha;
   
gl_FragColor = finalColor;

}
[/java]

The lines are:

line 179:
[java]

float alpha = max(DiffuseSum.a, diffuseColor.a);
[/java]

line 228:

[java]

finalColor.a = alpha;

[/java]

NOTE: the lines in code editor aren’t the same since it removes some blank lines, the correct lines are the above.

Could this be because my phone doesn’t support these shaders??

You try to do operations with ints and floats (the error message says so), you cannot multiply an int with a float for example in GLSL. It might work on some drivers but per the GLSL spec its not allowed. You will have to use separate transfer variables.

HI Normen,
I don’t know GLSL programming but i will try to fix it.
Thanks a lot!

I solved the problem but it wasn’t in the lines above.
I replaced the following lines:

[java]vec4 env = texture2D( m_EnvMap, reflectTexCoord.st);
float useMetal = (m_DecalMetaldiffuseColor.a) + (m_BackMetal(1 - diffuseColor.a));
diffuseColor.rgb = diffuseColor.rgb * (1 - useMetal) + env.rgb * (useMetal);[/java]
for:
[java]vec4 env = texture2D( m_EnvMap, reflectTexCoord.st);
float useMetal = (m_DecalMetaldiffuseColor.a) + (m_BackMetal(1.0 - diffuseColor.a));
diffuseColor.rgb = diffuseColor.rgb * (1.0 - useMetal) + env.rgb * (useMetal);[/java]

and

[java]#ifdef DIFFUSEMAP_BACK
vec4 backColor = texture2D(m_DiffuseMapBack, backgroundTexCoord);

    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1-diffuseColor.a)*backColor.rgb +
                  SpecularSum.rgb * light.y;

#else
    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1-diffuseColor.a) +
                  SpecularSum.rgb * light.y;

[/java]

for

[java]#ifdef DIFFUSEMAP_BACK
vec4 backColor = texture2D(m_DiffuseMapBack, backgroundTexCoord);

    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1.0-diffuseColor.a)*backColor.rgb +
                  SpecularSum.rgb * light.y;

#else
    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1.0-diffuseColor.a) +
                  SpecularSum.rgb * light.y;[/java]

Now gave me this error:

E/com.jme3.app.AndroidHarness(23925): SEVERE Exception thrown in Thread[GLThread 2491,5,main]
E/com.jme3.app.AndroidHarness(23925): com.jme3.renderer.RendererException: Shader link failure, shader:Shader[numSources=2, numUniforms=18, shaderSources=[ShaderSource[name=/Shaders/Dice.vert, defines, type=Vertex, language=GLSL100], ShaderSource[name=/Shaders/Dice.frag, defines, type=Fragment, language=GLSL100]]] info:Uniform variable g_AmbientLightColor type/precision does not match in vertex and fragment shader
E/com.jme3.app.AndroidHarness(23925):
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:958)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:970)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.material.Material.renderMultipassLighting(Material.java:837)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.material.Material.render(Material.java:1107)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:374)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:763)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.app.AndroidHarness.update(AndroidHarness.java:467)
E/com.jme3.app.AndroidHarness(23925): at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:349)
E/com.jme3.app.AndroidHarness(23925): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1542)
E/com.jme3.app.AndroidHarness(23925): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1266)

I believe the important info is this:

Shader link failure, shader:Shader[numSources=2, numUniforms=18, shaderSources=[ShaderSource[name=/Shaders/Dice.vert, defines, type=Vertex, language=GLSL100], ShaderSource[name=/Shaders/Dice.frag, defines, type=Fragment, language=GLSL100]]] info:Uniform variable g_AmbientLightColor type/precision does not match in vertex and fragment shader

I compared both files and they are of the same type but i don’t know how to compare precision.

Here it is dice.frag and dice.vert

Dice.frag

[java]#define ATTENUATION
//#define HQ_ATTENUATION

varying vec2 texCoord;

varying vec3 AmbientSum;
varying vec4 DiffuseSum;
varying vec3 SpecularSum;

varying vec3 vPosition;
varying vec3 vViewDir;
varying vec4 vLightDir;

#ifdef DIFFUSEMAP
uniform sampler2D m_DiffuseMap;
#endif

#ifdef DIFFUSEMAP_BACK
uniform sampler2D m_DiffuseMapBack;
varying vec2 backgroundTexCoord;
#endif

#ifdef PARALLAXMAP
uniform sampler2D m_ParallaxMap;
#endif

#ifdef NORMALMAP
uniform sampler2D m_NormalMap;
#else
varying vec3 vNormal;
#endif

#ifdef ALPHAMAP
uniform sampler2D m_AlphaMap;
#endif

#ifdef DECAL_COLOR
uniform vec4 m_DecalColor;
#endif

#ifdef ENVMAP
uniform sampler2D m_EnvMap;
uniform float m_DecalMetal;
uniform float m_BackMetal;

varying vec2 reflectTexCoord;
#endif

uniform vec4 g_AmbientLightColor;
uniform float m_Shininess;

uniform vec4 g_LightDirection;
varying vec3 lightVec;

float tangDot(in vec3 v1, in vec3 v2){
float d = dot(v1,v2);
#ifdef V_TANGENT
d = 1.0 - d*d;
return step(0.0, d) * sqrt(d);
#else
return d;
#endif
}

float lightComputeDiffuse(in vec3 norm, in vec3 lightdir, in vec3 viewdir){
#ifdef MINNAERT
float NdotL = max(0.0, dot(norm, lightdir));
float NdotV = max(0.0, dot(norm, viewdir));
return NdotL * pow(max(NdotL * NdotV, 0.1), -1.0) * 0.5;
#else
return max(0.0, dot(norm, lightdir));
#endif
}

float lightComputeSpecular(in vec3 norm, in vec3 viewdir, in vec3 lightdir, in float shiny){

#if defined(WARDISO)
    // Isotropic Ward
    vec3 halfVec = normalize(viewdir + lightdir);
    float NdotH  = max(0.001, tangDot(norm, halfVec));
    float NdotV  = max(0.001, tangDot(norm, viewdir));
    float NdotL  = max(0.001, tangDot(norm, lightdir));
    float a      = tan(acos(NdotH));
    float p      = max(shiny/128.0, 0.001);
    return NdotL * (1.0 / (4.0*3.14159265*p*p)) * (exp(-(a*a)/(p*p)) / (sqrt(NdotV * NdotL)));
#else
   // Standard Phong
   vec3 R = reflect(-lightdir, norm);
   return pow(max(tangDot(R, viewdir), 0.0), shiny);
#endif

}

vec2 computeLighting(in vec3 wvPos, in vec3 wvNorm, in vec3 wvViewDir, in vec3 wvLightDir){
float diffuseFactor = lightComputeDiffuse(wvNorm, wvLightDir, wvViewDir);
float specularFactor = lightComputeSpecular(wvNorm, wvViewDir, wvLightDir, m_Shininess);
specularFactor *= step(1.0, m_Shininess);

#ifdef HQ_ATTENUATION
float att = clamp(1.0 - g_LightPosition.w * length(lightVec), 0.0, 1.0);
#else
float att = vLightDir.w;
#endif

specularFactor *= diffuseFactor;

return vec2(diffuseFactor, specularFactor) * vec2(att);
}

void main(){
vec2 newTexCoord;
#if (defined(PARALLAXMAP) || defined(NORMALMAP_PARALLAX)) && !defined(VERTEX_LIGHTING)
float h;
#ifdef PARALLAXMAP
h = texture2D(m_ParallaxMap, texCoord).r;
#else
h = texture2D(m_NormalMap, texCoord).a;
#endif
float heightScale = 0.05;
float heightBias = heightScale * -0.5;
vec3 normView = normalize(vViewDir);
h = (h * heightScale + heightBias) * normView.z;
newTexCoord = texCoord + (h * normView.xy);
#else
newTexCoord = texCoord;
#endif

vec4 diffuseColor;

#ifdef DIFFUSEMAP
  float alp = texture2D(m_DiffuseMap, newTexCoord).a;
  diffuseColor.rgb = m_DecalColor.rgb*alp;
  diffuseColor.a = alp;
#else
  diffuseColor = vec4(1.0);
#endif

// ***********************
// Read from textures
// ***********************
#if defined(NORMALMAP)
  vec4 normalHeight = texture2D(m_NormalMap, newTexCoord);
  vec3 normal = (normalHeight.xyz * vec3(2.0) - vec3(1.0));
  #ifdef LATC
    normal.z = sqrt(1.0 - (normal.x * normal.x) - (normal.y * normal.y));
  #endif
  //normal.y = -normal.y;
#else
  vec3 normal = vNormal;
  #if !defined(LOW_QUALITY) &amp;&amp; !defined(V_TANGENT)
     normal = normalize(normal);
  #endif
#endif

  //color.rgb = color.rgb*(1-alp) + m_DecalColor.rgb*(alp);
  //color.a = color.a*(1-alp) + m_DecalColor.a*(alp);

//TODO: check how alfa plays with transparency
//TODO: make separate ‘metal’ factor for decal and for background
#ifdef ENVMAP
    vec4 env = texture2D( m_EnvMap, reflectTexCoord.st);
    float useMetal = (m_DecalMetal*diffuseColor.a) + (m_BackMetal*(1.0 - diffuseColor.a));
    diffuseColor.rgb = diffuseColor.rgb * (1.0 - useMetal)  + env.rgb * (useMetal);
    diffuseColor.a = max(diffuseColor.a,useMetal);
#endif

float alpha = max(DiffuseSum.a, diffuseColor.a);
#ifdef ALPHAMAP
   alpha = alpha * texture2D(m_AlphaMap, newTexCoord).r;
#endif

#ifndef VERTEX_LIGHTING
    float spotFallOff = 1.0;
    if(g_LightDirection.w != 0.0){
          vec3 L       = normalize(lightVec.xyz);
          vec3 spotdir = normalize(g_LightDirection.xyz);
          float curAngleCos = dot(-L, spotdir);
          float innerAngleCos = floor(g_LightDirection.w) * 0.001;
          float outerAngleCos = fract(g_LightDirection.w);
          float innerMinusOuter = innerAngleCos - outerAngleCos;

          spotFallOff = (curAngleCos - outerAngleCos) / innerMinusOuter;

          if(spotFallOff &lt;= 0.0){
              gl_FragColor.rgb = AmbientSum * diffuseColor.rgb;
              gl_FragColor.a   = alpha;
              return;
          }else{
              spotFallOff = clamp(spotFallOff, 0.0, 1.0);
          }
    }
 #endif

vec4 lightDir = vLightDir;
lightDir.xyz = normalize(lightDir.xyz);
vec2 light = computeLighting(vPosition, normal, vViewDir.xyz, lightDir.xyz) * spotFallOff;

vec4 finalColor;

#ifdef DIFFUSEMAP_BACK
    vec4 backColor = texture2D(m_DiffuseMapBack, backgroundTexCoord);

    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1.0-diffuseColor.a)*backColor.rgb +
                  SpecularSum.rgb * light.y;

#else
    finalColor.rgb = (g_AmbientLightColor.rgb + vec3(1.0)* light.x)  * diffuseColor.rgb * diffuseColor.a +
                     (AmbientSum.rgb + DiffuseSum.rgb * light.x) * (1.0-diffuseColor.a) +
                  SpecularSum.rgb * light.y;

#endif

finalColor.a = alpha;

gl_FragColor = finalColor;

}[/java]

Dice.vert

[java]#define ATTENUATION
//#define HQ_ATTENUATION

uniform mat4 g_WorldViewProjectionMatrix;
uniform mat4 g_WorldViewMatrix;
uniform mat3 g_NormalMatrix;
uniform mat4 g_ViewMatrix;

uniform vec4 m_Ambient;
uniform vec4 m_Diffuse;
uniform vec4 m_Specular;
uniform float m_Shininess;

uniform vec4 g_LightColor;
uniform vec4 g_LightPosition;
uniform vec4 g_AmbientLightColor;

varying vec2 texCoord;

#ifdef ENVMAP
varying vec2 reflectTexCoord;
#endif

#if defined(DIFFUSEMAP_BACK) || defined(HAS_GLOWMAP)
varying vec2 backgroundTexCoord;
#endif

varying vec3 AmbientSum;
varying vec4 DiffuseSum;
varying vec3 SpecularSum;

attribute vec3 inPosition;
attribute vec2 inTexCoord;
attribute vec3 inNormal;

varying vec3 lightVec;

attribute vec3 inTangent;

#ifndef NORMALMAP
varying vec3 vNormal;
#endif
varying vec3 vPosition;
varying vec3 vViewDir;
varying vec4 vLightDir;

// JME3 lights in world space
void lightComputeDir(in vec3 worldPos, in vec4 color, in vec4 position, out vec4 lightDir){
float posLight = step(0.5, color.w);
vec3 tempVec = position.xyz * sign(posLight - 0.5) - (worldPos * posLight);
lightVec = tempVec;
#ifdef ATTENUATION
float dist = length(tempVec);
lightDir.w = clamp(1.0 - position.w * dist * posLight, 0.0, 1.0);
lightDir.xyz = tempVec / vec3(dist);
#else
lightDir = vec4(normalize(tempVec), 1.0);
#endif
}

void main(){
vec4 pos = vec4(inPosition, 1.0);
gl_Position = g_WorldViewProjectionMatrix * pos;
texCoord = inTexCoord;

vec3 wvPosition = (g_WorldViewMatrix * pos).xyz;
vec3 wvNormal = normalize(g_NormalMatrix * inNormal);
vec3 viewDir = normalize(-wvPosition);

   //vec4 lightColor = g_LightColor[gl_InstanceID];
   //vec4 lightPos   = g_LightPosition[gl_InstanceID];
   //vec4 wvLightPos = (g_ViewMatrix * vec4(lightPos.xyz, lightColor.w));
   //wvLightPos.w = lightPos.w;

vec4 wvLightPos = (g_ViewMatrix * vec4(g_LightPosition.xyz,clamp(g_LightColor.w,0.0,1.0)));
wvLightPos.w = g_LightPosition.w;
vec4 lightColor = g_LightColor;

#if defined(NORMALMAP)
vec3 wvTangent = normalize(g_NormalMatrix * inTangent);
vec3 wvBinormal = cross(wvNormal, wvTangent);
mat3 tbnMat = mat3(wvTangent, wvBinormal, wvNormal);

 vPosition = wvPosition * tbnMat;
 vViewDir  = viewDir * tbnMat;
 lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir);
 vLightDir.xyz = (vLightDir.xyz * tbnMat).xyz;

#else
vNormal = wvNormal;

 vPosition = wvPosition;
 vViewDir = viewDir;

 lightComputeDir(wvPosition, lightColor, wvLightPos, vLightDir);

 #ifdef V_TANGENT
    vNormal = normalize(g_NormalMatrix * inTangent);
    vNormal = -cross(cross(vLightDir.xyz, vNormal), vNormal);
 #endif

#endif

lightColor.w = 1.0;

#ifdef MATERIAL_COLORS
AmbientSum = (m_Ambient * g_AmbientLightColor).rgb;
DiffuseSum = m_Diffuse * lightColor;
SpecularSum = (m_Specular * lightColor).rgb;
#else
AmbientSum = vec3(0.2, 0.2, 0.2) * g_AmbientLightColor.rgb; // Default: ambient color is dark gray
DiffuseSum = lightColor;
SpecularSum = lightColor.rgb;
#endif

#ifdef ENVMAP
	vec3 u = normalize( wvPosition );
	vec3 n = wvNormal;
	vec3 r = reflect( u, n );
	float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) );
	reflectTexCoord.s = r.x/m + 0.5;
	reflectTexCoord.t = r.y/m + 0.5;
#endif

#if defined(DIFFUSEMAP_BACK) || defined(HAS_GLOWMAP)
	vec3 r2 = normalize(inPosition);
	float m2 = 2.0 * sqrt( r2.x*r2.x + r2.y*r2.y + (r2.z+1.0)*(r2.z+1.0) );
	backgroundTexCoord.s = r2.x/m2 + 0.5;
	backgroundTexCoord.t = r2.y/m2 + 0.5;
#endif

}[/java]

How can I fix the precision since they are of the same type?
Thanks in advance!