use of com.ardor3d.math.Ray3 in project energy3d by concord-consortium.
the class SelectUtil method pickPart.
public static PickedHousePart pickPart(final int x, final int y) {
pickResults.clear();
final Ray3 pickRay = SceneManager.getInstance().getCamera().getPickRay(new Vector2(x, y), false, null);
for (final HousePart housePart : Scene.getInstance().getParts()) {
PickingUtil.findPick(housePart.getCollisionSpatial(), pickRay, pickResults, false);
PickingUtil.findPick(housePart.getEditPointsRoot(), pickRay, pickResults, false);
if (housePart instanceof Foundation) {
final Foundation foundation = (Foundation) housePart;
if (foundation.getPolygon().isVisible()) {
PickingUtil.findPick(foundation.getPolygon().getEditPointsRoot(), pickRay, pickResults, false);
}
}
}
return getPickResult(pickRay);
}
use of com.ardor3d.math.Ray3 in project energy3d by concord-consortium.
the class Wall method findRoofIntersection.
public ReadOnlyVector3 findRoofIntersection(final ReadOnlyVector3 p, final ReadOnlyVector3 direction, final double offset) {
if (roof == null) {
return p;
}
final Vector3 origin = new Vector3(p.getX(), p.getY(), direction.equals(Vector3.UNIT_Z) ? 0 : p.getZ());
final PickResults pickResults = new PrimitivePickResults();
PickingUtil.findPick(roof.getRoofPartsRoot(), new Ray3(origin, direction), pickResults, false);
if (pickResults.getNumber() > 0) {
return pickResults.getPickData(0).getIntersectionRecord().getIntersectionPoint(0).add(direction.multiply(roof.getOverhangLength() > 0.05 ? offset : 0, null), null);
} else {
return p;
}
}
use of com.ardor3d.math.Ray3 in project energy3d by concord-consortium.
the class CustomRoof method setPreviewPoint.
@Override
public void setPreviewPoint(final int x, final int y) {
final Foundation foundation = getTopContainer();
if (foundation != null && foundation.getLockEdit()) {
return;
}
final EditState editState = new EditState();
if (editPointIndex == -1) {
recalculateEditPoints = true;
pickContainer(x, y, Wall.class);
} else if (editPointIndex == 0) {
final ReadOnlyVector3 base = getCenter();
final Vector3 p = Util.closestPoint(base, Vector3.UNIT_Z, x, y);
if (p == null) {
return;
}
snapToGrid(p, getAbsPoint(editPointIndex), getGridSize());
height = Math.max(0, p.getZ() - container.getPoints().get(1).getZ());
final double z = container.getPoints().get(1).getZ() + height;
for (final Vector3 v : points) {
v.setZ(z);
}
} else {
final Ray3 pickRay = SceneManager.getInstance().getCamera().getPickRay(new Vector2(x, y), false, null);
final Vector3 p = new Vector3();
if (pickRay.intersectsPlane(new Plane(Vector3.UNIT_Z, points.get(0).getZ()), p)) {
snapToGrid(p, getAbsPoint(editPointIndex), getGridSize(), false);
snapToWallsPolygon(p);
points.get(editPointIndex).set(toRelative(p));
}
}
postEdit(editState);
}
use of com.ardor3d.math.Ray3 in project energy3d by concord-consortium.
the class HousePart method computeNormalAndKeepOnSurface.
protected ReadOnlyVector3 computeNormalAndKeepOnSurface() {
if (container == null) {
return null;
}
if (container instanceof Rack) {
final Rack rack = (Rack) container;
final PickResults pickResults = new PrimitivePickResults();
final Ray3 ray = new Ray3(getAbsPoint(0).multiplyLocal(1, 1, 0), Vector3.UNIT_Z);
PickingUtil.findPick(container.getCollisionSpatial(), ray, pickResults, false);
if (pickResults.getNumber() != 0) {
final PickData pickData = pickResults.getPickData(0);
final Vector3 p = pickData.getIntersectionRecord().getIntersectionPoint(0);
points.get(0).setZ(p.getZ());
} else {
if (rack.getBaseHeight() < Math.abs(0.5 * rack.getRackHeight() / Scene.getInstance().getAnnotationScale() * Math.sin(Math.toRadians(rack.getTiltAngle())))) {
final Ray3 ray2 = new Ray3(getAbsPoint(0).multiplyLocal(1, 1, 0), Vector3.NEG_UNIT_Z);
PickingUtil.findPick(container.getCollisionSpatial(), ray2, pickResults, false);
if (pickResults.getNumber() != 0) {
final PickData pickData = pickResults.getPickData(0);
final Vector3 p = pickData.getIntersectionRecord().getIntersectionPoint(0);
points.get(0).setZ(p.getZ());
}
}
}
return rack.getNormal();
} else if (container instanceof Roof) {
final Roof roof = (Roof) container;
final int[] editPointToRoofIndex = new int[points.size()];
final PickResults pickResults = new PrimitivePickResults();
for (int i = 0; i < points.size(); i++) {
pickResults.clear();
final Ray3 ray = new Ray3(getAbsPoint(i).multiplyLocal(1, 1, 0), Vector3.UNIT_Z);
for (final Spatial roofPart : roof.getRoofPartsRoot().getChildren()) {
if (roofPart.getSceneHints().getCullHint() != CullHint.Always) {
PickingUtil.findPick(((Node) roofPart).getChild(0), ray, pickResults, false);
if (pickResults.getNumber() != 0) {
break;
}
}
}
if (pickResults.getNumber() != 0) {
final PickData pickData = pickResults.getPickData(0);
final Vector3 p = pickData.getIntersectionRecord().getIntersectionPoint(0);
points.get(i).setZ(p.getZ());
final UserData userData = (UserData) ((Spatial) pickData.getTarget()).getUserData();
final int roofPartIndex = userData.getEditPointIndex();
editPointToRoofIndex[i] = roofPartIndex;
}
// find roofPart with most edit points on it
containerRoofIndex = editPointToRoofIndex[0];
if (points.size() > 1) {
containerRoofIndex = 0;
final Map<Integer, Integer> counts = new HashMap<Integer, Integer>(points.size());
for (final int roofIndex : editPointToRoofIndex) {
counts.put(roofIndex, counts.get(roofIndex) == null ? 1 : counts.get(roofIndex) + 1);
}
int highestCount = 0;
for (final int roofIndex : editPointToRoofIndex) {
if (counts.get(roofIndex) > highestCount) {
highestCount = counts.get(roofIndex);
containerRoofIndex = roofIndex;
}
}
}
}
return (ReadOnlyVector3) roof.getRoofPartsRoot().getChild(containerRoofIndex).getUserData();
} else if (container instanceof Foundation) {
final Foundation foundation = (Foundation) container;
final List<Node> nodes = foundation.getImportedNodes();
if (nodes != null) {
final Map<Vector3, ReadOnlyVector3> intersections = new HashMap<Vector3, ReadOnlyVector3>();
final PickResults pickResults = new PrimitivePickResults();
for (final Node n : nodes) {
for (final Spatial s : n.getChildren()) {
if (s instanceof Mesh) {
final Mesh m = (Mesh) s;
pickResults.clear();
PickingUtil.findPick(m, new Ray3(getAbsPoint(0).multiplyLocal(1, 1, 0), Vector3.UNIT_Z), pickResults, false);
if (pickResults.getNumber() > 0) {
intersections.put(pickResults.getPickData(0).getIntersectionRecord().getIntersectionPoint(0), ((UserData) m.getUserData()).getNormal());
}
}
}
}
if (!intersections.isEmpty()) {
double zmax = -Double.MAX_VALUE;
ReadOnlyVector3 normal = null;
for (final Vector3 v : intersections.keySet()) {
if (v.getZ() > zmax) {
zmax = v.getZ();
normal = intersections.get(v);
}
}
if (normal != null) {
pickedNormal = normal;
return normal;
}
}
}
}
return container.getNormal();
}
Aggregations