package org.wheelmap.android.tango.mode; import org.rajawali3d.Object3D; import org.wheelmap.android.tango.mode.operations.CreateObjectsOperation; import org.wheelmap.android.tango.mode.operations.OperationsModeRenderer; import java.util.ArrayList; import java.util.List; import java.util.Locale; public abstract class MeasureDistanceModeRenderer extends OperationsModeRenderer { private List<Object3D> pointObjects = new ArrayList<>(); @Override public void onClickedAt(final float[] transform) { if (isOperationRunning()) { return; } addOperation(new CreateObjectsOperation() { @Override public void execute(Manipulator m) { if (isReady()) { return; } Object3D createdPoint = getObjectFactory().createMeasurePoint(); Object3dUtils.setObjectPose(createdPoint, transform); pointObjects.add(createdPoint); m.addObject(createdPoint); int size = pointObjects.size(); if (size > 1) { String text = String.format(Locale.getDefault(), "%.2fm", getDistance()); getObjectFactory().measureLineBetween(m, pointObjects.get(size - 1).getPosition(), pointObjects.get(size - 2).getPosition(), text); } } @Override public void undo(Manipulator manipulator) { super.undo(manipulator); pointObjects.removeAll(getCreatedObjects()); } }); } @Override public boolean isReady() { return pointObjects.size() >= 2; } public double getDistance() { if (pointObjects.size() < 2) { return 0; } int lastItemPosition = pointObjects.size() - 1; Object3D lastItem = pointObjects.get(lastItemPosition); int secondLastItemPosition = pointObjects.size() - 2; Object3D secondLastItem = pointObjects.get(secondLastItemPosition); return lastItem.getPosition().distanceTo(secondLastItem.getPosition()); } @Override public void clear() { super.clear(); pointObjects.clear(); } }