package org.squidy.nodes.optitrack;
import java.util.ArrayList;
import java.util.List;
import javax.sound.midi.Track;
import javax.vecmath.*;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlType;
import org.squidy.designer.model.Data;
import org.squidy.manager.controls.CheckBox;
import org.squidy.manager.controls.ComboBox;
import org.squidy.manager.controls.TextField;
import org.squidy.manager.controls.ComboBoxControl.ComboBoxItemWrapper;
import org.squidy.manager.data.DataConstant;
import org.squidy.manager.data.IData;
import org.squidy.manager.data.IDataContainer;
import org.squidy.manager.data.Processor;
import org.squidy.manager.data.Property;
import org.squidy.manager.data.domainprovider.DomainProvider;
import org.squidy.manager.data.impl.DataButton;
import org.squidy.manager.data.impl.DataPosition2D;
import org.squidy.manager.data.impl.DataPosition3D;
import org.squidy.manager.data.impl.DataPosition6D;
import org.squidy.manager.model.AbstractNode;
import org.squidy.manager.util.DataUtility;
import org.squidy.manager.util.MathUtility;
import org.squidy.nodes.optitrack.utils.TrackingConstant;
import org.squidy.nodes.optitrack.utils.TrackingUtility;
/*<code>RigidBody</code>.
*
* <pre>
* Date: Jan 29 2010
* Time: 1:35:05 AMd
* </pre>
*
* @author Simon Faeh, <a href="mailto:simon.faeh@uni-konstanz.de">Simon.Faeh@uni-konstanz.de<a/>, University of Konstanz
*
* @version
*/
@XmlType(name = "ObjectDistance")
@Processor(
name = "Object-Distance",
icon = "/org/squidy/nodes/image/48x48/objectdistance.png",
description = "",
types = {Processor.Type.OUTPUT, Processor.Type.INPUT },
tags = { "distance", "object", "optitrack", "handtracking", "interception" }
)
public class ObjectDistance extends AbstractNode {
@XmlAttribute(name = "maxRange")
@Property(name = "Maximal Range", description = "Specify the maximum distance to other trackale (in mm)")
@TextField
private Double maxRange = 1000.0;
/**
* @return the maxRange
*/
public final Double getMaxRange() {
return maxRange;
}
/**
* @param maxRange
* the maxRange to set
*/
public final void setMaxRange(Double maxRange) {
this.maxRange = maxRange;
}
// ################################################################################
@XmlAttribute(name = "maxRotation")
@Property(name = "Maximal Rotation", description = "Specify the maximum rotation to other trackable (in degrees)")
@TextField
private int maxRotation = 0;
/**
* @return the maxRotation
*/
public final int getMaxRotation() {
return maxRotation;
}
/**
* @param maxRotation
* the maxRotation to set
*/
public final void setMaxRotation(int maxRotation) {
this.maxRotation = maxRotation;
}
// ################################################################################
@XmlAttribute(name = "onlyRoomObjects")
@Property(name = "Publish only room objects", description = "Onldy Rigidbody with the attribute roomobject will be processed")
@CheckBox
private boolean onlyRoomObjects = false;
/**
* @return the waitForAlarm
*/
public final boolean getOnlyRoomObjects() {
return onlyRoomObjects;
}
/**
* @param waitForAlarm
* the waitForAlarm to set
*/
public final void setOnlyRoomObjects(boolean onlyRoomObjects) {
this.onlyRoomObjects = onlyRoomObjects;
}
// ################################################################################
@XmlAttribute(name = "twoDDistance")
@Property(name = "Use 2D distance", description = "Calculates distance form projection view")
@CheckBox
private boolean twoDDistance = false;
/**
* @return the waitForAlarm
*/
public final boolean getTwoDDistance() {
return twoDDistance;
}
/**
* @param waitForAlarm
* the waitForAlarm to set
*/
public final void setTwoDDistance(boolean twoDDistance) {
this.twoDDistance = twoDDistance;
}
// ################################################################################
// END OF ADJUSTABLES
// ################################################################################
private ArrayList<DataPosition6D> frameObjects,roomObjects;
private int currentFrame;
private MathUtility mu = new MathUtility();
@Override
public void onStart() {
frameObjects = new ArrayList<DataPosition6D>();
roomObjects = new ArrayList<DataPosition6D>();
}
/* (non-Javadoc)
* @see org.squidy.manager.model.AbstractNode#preProcess(org.squidy.manager.data.IDataContainer)
*/
public IData process(DataPosition6D d6d)
{
if (d6d.getGroupID() != this.currentFrame)
{
this.currentFrame = d6d.getGroupID();
for (DataPosition6D d6d1 : roomObjects)
{
Vector3d v3d1 = new Vector3d(d6d1.getX(),d6d1.getY(),d6d1.getZ());
for (DataPosition6D d6d2 : frameObjects)
{
Vector3d v3d2 = new Vector3d(d6d2.getX(),d6d2.getY(),d6d2.getZ());
v3d2.sub(v3d1);
double dist;
if (this.twoDDistance)
dist = mu.euclidDist2D(TrackingUtility.Norm2RoomCoordinates(Optitrack.class, d6d2),TrackingUtility.Norm2RoomCoordinates(Optitrack.class, d6d1));
else
dist = mu.euclidDist(TrackingUtility.Norm2RoomCoordinates(Optitrack.class, d6d2),TrackingUtility.Norm2RoomCoordinates(Optitrack.class, d6d1));
if (dist < this.maxRange)
{
dist /= 2*this.maxRange;
//System.out.println(0.5 + dist * v3d2.x);
v3d2.normalize();
v3d2.x = 0.5 + dist * v3d2.x;
v3d2.z = 0.5 + dist * v3d2.z;
//v3d2.normalize();
DataPosition2D d2d = new DataPosition2D(Optitrack.class,v3d2.x,v3d2.z);
d2d.setAttribute(DataConstant.IDENTIFIER,TrackingUtility.getAttributesAlpha(d6d1, DataConstant.IDENTIFIER));
d2d.setAttribute(TrackingConstant.REMOTEOBJECT,TrackingUtility.getAttributesAlpha(d6d2, DataConstant.IDENTIFIER));
d2d.setAttribute(TrackingConstant.MAXRANGE, this.maxRange);
publish(d2d);
}
}
}
frameObjects.removeAll(frameObjects);
roomObjects.removeAll(roomObjects);
if (TrackingUtility.getAttributesInteger(d6d, TrackingConstant.RIGIDBODYROLE) == TrackingConstant.RBROLE_MOBILEDISPLAY)
roomObjects.add(d6d);
else
frameObjects.add(d6d);
}else
{
if (TrackingUtility.getAttributesInteger(d6d, TrackingConstant.RIGIDBODYROLE) == TrackingConstant.RBROLE_MOBILEDISPLAY)
roomObjects.add(d6d);
else
frameObjects.add(d6d);
}
return null;
}
}