package com.nilunder.bdx.inputs;
import java.util.ArrayList;
import com.badlogic.gdx.Gdx;
import javax.vecmath.Vector2f;
import javax.vecmath.Vector3f;
import javax.vecmath.Vector4f;
import com.nilunder.bdx.Bdx;
import com.nilunder.bdx.Scene;
import com.nilunder.bdx.RayHit;
abstract class Pointer{
private Vector2f position;
private Vector3f[] rayData;
private Scene scene;
public int id;
public Pointer(int id){
this.id = id;
}
public void init(Scene scene){
this.scene = scene;
position = new Vector2f(Gdx.input.getX(id), Bdx.display.height() - Gdx.input.getY(id));
rayData = null;
}
private void updateRayData(){
if (rayData == null){
rayData = scene.camera.rayData(position);
}
}
public Vector4f clipCoords(){
return new Vector4f(2 * position.x / Bdx.display.width() - 1, 2 * position.y / Bdx.display.height() - 1, -1, 1);
}
public Vector3f raySource(){
updateRayData();
return new Vector3f(rayData[0]);
}
public Vector3f rayDirection(){
updateRayData();
return new Vector3f(rayData[1]);
}
public Vector2f position(){
return new Vector2f(position);
}
public Vector2f positionNormalized(){
return position.div(Bdx.display.size());
}
public RayHit ray(short group, short mask){
updateRayData();
Vector3f target = new Vector3f(rayData[1]);
target.length(100);
return scene.ray(rayData[0], target, group, mask);
}
public RayHit ray(){
return ray((short)~0, (short)~0);
}
public ArrayList<RayHit> xray(boolean includeAll, short group, short mask){
updateRayData();
Vector3f target = new Vector3f(rayData[1]);
target.length(100);
return scene.xray(rayData[0], target, includeAll, group, mask);
}
public ArrayList<RayHit> xray(short group, short mask) {
return xray(false, group, mask);
}
public ArrayList<RayHit> xray(){
return xray(false, (short)~0, (short)~0);
}
}