[solved]NullPointer with basic LibGDX. Following examples.

I’m following this tutorial for loading models using LibGDX: http://blog.xoppa.com/loading-models-using-libgdx/

I’m getting a nullpointer on this line:

modelBatch.render( playerModelInstance, environment );

After some code reformatting, I saw that the

modelBatch.render( 

was the cause of the error.

Here’s my error

Exception in thread "LWJGL Application" java.lang.NullPointerException
	at com.badlogic.gdx.graphics.g3d.ModelBatch.render(ModelBatch.java:265)
	at com.chris.rpg.Client.render(Client.java:74)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
	at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

Here’s my code:

package com.chris.rpg;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL30;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;


public class Client implements ApplicationListener  {
	
	private PerspectiveCamera playerCamera;
	
	private AssetManager assets;
	
	private Model playerModel;
	private ModelBatch modelBatch;
	private ModelInstance playerModelInstance;
	
	private Environment environment;
	
	private int placeholder_cameraDegrees = 67;
	
	private boolean preloading = false;
	
	@Override
	public void create() {
		
		// Set up the environment
		environment = new Environment();
		environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
		environment.add(new DirectionalLight().set(0.8f, 0.8f,0.8f, -1f, -0.8f, -0.2f));
		
		// Set up the model batch
		modelBatch = new ModelBatch();

		// Set up the player camera
		playerCamera = new PerspectiveCamera(placeholder_cameraDegrees, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
		playerCamera.position.set(10f, 10f, 10f);
		playerCamera.lookAt(0, 0, 0);
		playerCamera.near = 1f;
		playerCamera.far = 300f;
		playerCamera.update();
		
		// Set up the assets manager
		assets = new AssetManager();
		assets.load("models/characters/goku/ss2.g3db", Model.class);
		preloading = true;
	}
	
	private void onAssetsLoaded() {
		
		playerModel = assets.get("models/characters/goku/ss2.g3db", Model.class);
		playerModelInstance = new ModelInstance(playerModel);
		preloading = false;
	}
	
	@Override
	public void render() {
		if(preloading && assets.update()) {
			onAssetsLoaded();
		}
		
		Gdx.gl.glViewport(0,  0,  Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
		Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT);
		modelBatch.begin(playerCamera);
			modelBatch.render( playerModelInstance, environment );
		modelBatch.end();
		
	}
	
	@Override
	public void dispose() {
		modelBatch.dispose();
		playerModel.dispose();
		assets.dispose();
	}
	
	@Override
	public void resume() {
		
	}
	
	@Override
	public void resize(int width, int height) {
		
	}
	
	@Override
	public void pause() {
		
	}
	
	public PerspectiveCamera getPlayerCamera() {
		return playerCamera;
	}
}

What are the values of playerModelInstance and environment when that line of code runs? Add print statements just before that line to find out.

Sorry, I should have posted that information I already had it.


Player Model Instance = null
Game Environment = com.badlogic.gdx.graphics.g3d.Environment@46212667

My confusion is why the instance is null when it’s obviously set:

private void onAssetsLoaded() {
		
		playerModel = assets.get("models/characters/goku/ss2.g3db", Model.class);
		playerModelInstance = new ModelInstance(playerModel);
		preloading = false;
	}

Well, when is the onAssetsLoaded() function called? Try adding print statements to find that out as well.

It seems like the problem is that

assets.update()

is never being set to true, so the following code:

if(preloading && assets.update()) {
			onAssetsLoaded();
		}

is never executed.

AH! I figured out what it was; The example was rendering an ArrayList<> of ModelInstances, and not just a single model instance; So when the array was empty, there wasn’t any effect; However in my case since I am just rendering a single instance, I need to make sure that the model is completely loaded before rendering.