package org.wheelmap.android.tango.renderer;
import android.support.annotation.CallSuper;
import org.rajawali3d.Object3D;
import org.rajawali3d.math.Quaternion;
import org.rajawali3d.math.vector.Vector3;
import org.wheelmap.android.model.api.MeasurementInfo;
import org.wheelmap.android.tango.mode.Mode;
import org.wheelmap.android.tango.renderer.objects.TextObject3d;
import java.util.ArrayList;
import java.util.List;
public abstract class WheelmapModeRenderer {
public interface Consumer<T> {
void consume(T t);
}
public interface OnStatusChangeListener {
void onStatusChanged();
}
private OnStatusChangeListener onStatusChangeListener;
private List<Object3D> object3DList = new ArrayList<>();
private List<Object3D> textObjectsList = new ArrayList<>();
private WheelmapTangoRajawaliRenderer renderer;
private Manipulator manipulator = new ManipulatorImpl();
final void setRajawaliRenderer(WheelmapTangoRajawaliRenderer renderer) {
this.renderer = renderer;
}
public final WheelmapTangoRajawaliRenderer getRajawaliRenderer() {
return renderer;
}
protected final void manipulateScene(final Consumer<Manipulator> consumer) {
renderer.invokeAction(new Runnable() {
@Override
public void run() {
consumer.consume(manipulator);
}
});
}
@CallSuper
public void clear() {
renderer.invokeAction(new Runnable() {
@Override
public void run() {
for (Object3D object3D : object3DList) {
renderer.getCurrentScene().removeChild(object3D);
}
object3DList.clear();
for (Object3D object3D : textObjectsList) {
renderer.getCurrentScene().removeChild(object3D);
}
textObjectsList.clear();
}
});
}
public void setOnStatusChangeListener(OnStatusChangeListener listener) {
this.onStatusChangeListener = listener;
}
protected void onStatusHasChanged() {
if (onStatusChangeListener != null) {
onStatusChangeListener.onStatusChanged();
}
}
public WheelmapRajawaliObjectFactory getObjectFactory() {
return renderer.getWheelmapRajawaliObjectFactory();
}
@CallSuper
protected void onRender(long ellapsedRealtime, double deltaTime) {
Quaternion rotation = renderer.getCurrentCamera().getOrientation();
Vector3 position = renderer.getCurrentCamera().getPosition();
for (Object3D textElement : textObjectsList) {
textElement.setOrientation(rotation);
textElement.setLookAt(position);
}
}
public abstract void onClickedAt(float[] transform);
public abstract void undo();
public abstract boolean isReady();
public abstract MeasurementInfo.MetaData createMetaData();
public abstract Mode getMode();
public interface Manipulator {
void addObject(Object3D object3D);
void removeObject(Object3D object3D);
}
private class ManipulatorImpl implements Manipulator {
public final void addObject(Object3D object3D) {
renderer.getCurrentScene().addChild(object3D);
if (object3D instanceof TextObject3d) {
textObjectsList.add(object3D);
} else {
object3DList.add(object3D);
}
}
public final void removeObject(Object3D object3D) {
renderer.getCurrentScene().removeChild(object3D);
textObjectsList.remove(object3D);
object3DList.remove(object3D);
}
}
}