/*******************************************************************************
* 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.math.Vector3;
import com.badlogic.gdx.physics.bullet.collision.Collision;
import com.badlogic.gdx.physics.bullet.collision.btCollisionObject;
import com.badlogic.gdx.physics.bullet.linearmath.LinearMathConstants;
/** @author xoppa */
public class KinematicTest extends BaseBulletTest {
BulletEntity kinematicBox, kinematicBox1, kinematicBox2, kinematicBox3;
Vector3 position;
final static Vector3 position1 = new Vector3(5f, 0.5f, 0f);
final static Vector3 position2 = new Vector3(8f, 0.5f, 0f);
final static Vector3 position3 = new Vector3(10f, 0.5f, 0f);
float angle;
@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);
kinematicBox1 = world.add("staticbox", position1.x, position1.y, position1.z);
kinematicBox1.setColor(Color.RED);
kinematicBox1.body.setCollisionFlags(kinematicBox1.body.getCollisionFlags()
| btCollisionObject.CollisionFlags.CF_KINEMATIC_OBJECT);
kinematicBox2 = world.add("staticbox", position2.x, position2.y, position2.z);
kinematicBox2.setColor(Color.RED);
kinematicBox2.body.setCollisionFlags(kinematicBox2.body.getCollisionFlags()
| btCollisionObject.CollisionFlags.CF_KINEMATIC_OBJECT);
;
kinematicBox3 = world.add("staticbox", position3.x, position3.y, position3.z);
kinematicBox3.setColor(Color.RED);
kinematicBox3.body.setCollisionFlags(kinematicBox3.body.getCollisionFlags()
| btCollisionObject.CollisionFlags.CF_KINEMATIC_OBJECT);
;
// This makes bullet call btMotionState#getWorldTransform on every update:
kinematicBox3.body.setActivationState(Collision.DISABLE_DEACTIVATION);
angle = 360f;
}
@Override
public void render () {
angle = angle + Gdx.graphics.getDeltaTime() * 360f / 5f;
kinematicBox3.transform.idt().rotate(Vector3.Y, 360f - 2f * angle).translate(position3);
if (angle >= 360f) {
angle = 0;
kinematicBox = (kinematicBox == kinematicBox1) ? kinematicBox2 : kinematicBox1;
position = (position == position1) ? position2 : position1;
}
kinematicBox.transform.idt().rotate(Vector3.Y, angle).translate(position);
// This makes bullet call btMotionState#getWorldTransform once:
kinematicBox.body.setActivationState(Collision.ACTIVE_TAG);
super.render();
}
@Override
public void dispose () {
kinematicBox = kinematicBox1 = kinematicBox2 = kinematicBox3 = null;
position = null;
super.dispose();
}
@Override
public boolean tap (float x, float y, int count, int button) {
shoot(x, y);
return true;
}
}