/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.tests.bullet;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.physics.bullet.collision.ContactListener;
import com.badlogic.gdx.utils.Array;

/** @author Xoppa */
public class ContactCallbackTest extends BaseBulletTest {
	// ContactProcessedListenerXXX is called AFTER the contact is processed.
	// Use ContactAddedListenerXXX to get a callback BEFORE the contact processed,
	// which allows you to alter the objects/manifold before it's processed.
	public static class TestContactProcessedListener extends ContactListener {
		public Array<BulletEntity> entities;
		int c = 0;

		@Override
		public void onContactProcessed (int userValue0, boolean match0, int userValue1, boolean match1) {
			if (match0) {
				final BulletEntity e = (BulletEntity)(entities.get(userValue0));
				// Disable future callbacks for this entity
				e.body.setContactCallbackFilter(0);
				e.setColor(Color.RED);
				Gdx.app.log("ContactCallbackTest", "Contact processed " + (++c));
			}
			if (match1) {
				final BulletEntity e = (BulletEntity)(entities.get(userValue1));
				// Disable future callbacks for this entity
				e.body.setContactCallbackFilter(0);
				e.setColor(Color.RED);
				Gdx.app.log("ContactCallbackTest", "Contact processed " + (++c));
			}
		}
	}

	final int BOXCOUNT_X = 5;
	final int BOXCOUNT_Y = 1;
	final int BOXCOUNT_Z = 5;

	final float BOXOFFSET_X = -5f;
	final float BOXOFFSET_Y = 0.5f;
	final float BOXOFFSET_Z = -5f;

	TestContactProcessedListener contactProcessedListener;

	@Override
	public void create () {
		super.create();

		// Create the entities
		world.add("ground", 0f, 0f, 0f).setColor(0.25f + 0.5f * (float)Math.random(), 0.25f + 0.5f * (float)Math.random(),
			0.25f + 0.5f * (float)Math.random(), 1f);

		for (int x = 0; x < BOXCOUNT_X; x++) {
			for (int y = 0; y < BOXCOUNT_Y; y++) {
				for (int z = 0; z < BOXCOUNT_Z; z++) {
					final BulletEntity e = (BulletEntity)world.add("box", BOXOFFSET_X + x * 2f, BOXOFFSET_Y + y * 2f,
						BOXOFFSET_Z + z * 2f);
					e.setColor(0.5f + 0.5f * (float)Math.random(), 0.5f + 0.5f * (float)Math.random(),
						0.5f + 0.5f * (float)Math.random(), 1f);

					e.body.setContactCallbackFlag(2);
					e.body.setContactCallbackFilter(2);
				}
			}
		}

		// Creating a contact listener, also enables that particular type of contact listener and sets it active.
		contactProcessedListener = new TestContactProcessedListener();
		contactProcessedListener.entities = world.entities;
	}

	@Override
	public boolean tap (float x, float y, int count, int button) {
		shoot(x, y);
		return true;
	}

	@Override
	public void dispose () {
		// Deleting the active contact listener, also disables that particular type of contact listener.
		if (contactProcessedListener != null) contactProcessedListener.dispose();
		contactProcessedListener = null;
		super.dispose();
	}
}
