blob: de728e75eaebcce556d6f21c2f382751e5c333b5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
<<<<<<< HEAD
* Pierre Allard - initial API and implementation
* Regent L'Archeveque
*
=======
* Pierre Allard,
* Regent L'Archeveque - initial API and implementation
*
>>>>>>> refs/heads/eclipse_pa
* SPDX-License-Identifier: EPL-1.0
*
*******************************************************************************/
package org.eclipse.apogy.addons.sensors.imaging.ui.jme3.utils;
import java.awt.image.BufferedImage;
import org.eclipse.apogy.addons.sensors.fov.ui.jme3.scene_objects.ProjectorData;
import org.eclipse.apogy.addons.sensors.fov.ui.jme3.utils.ImageProjectorControl;
import org.eclipse.apogy.addons.sensors.fov.ui.jme3.utils.JME3FovUtilities;
import org.eclipse.apogy.addons.sensors.imaging.ImageSnapshot;
import org.eclipse.apogy.addons.sensors.imaging.RectifiedImageSnapshot;
import org.eclipse.apogy.common.images.AbstractEImage;
import org.eclipse.apogy.common.images.ApogyCommonImagesFactory;
import org.eclipse.apogy.common.images.EImage;
import org.eclipse.apogy.common.images.EImagesUtilities;
import org.eclipse.apogy.common.topology.ui.jme3.JME3Application;
import com.jme3.post.MultiTextureProjectorRenderer.CombineMode;
import com.jme3.renderer.Camera;
public class ImageSnapshotProjectorControl extends ImageProjectorControl<ImageSnapshot> {
private final ImageSnapshot imageSnapshot;
public ImageSnapshotProjectorControl(JME3Application jme3Application, ImageSnapshot imageSnapshot) {
super(jme3Application, imageSnapshot);
this.imageSnapshot = imageSnapshot;
}
@Override
public float getHorizontalFOVAngleDegrees() {
return (float) Math.toDegrees(this.imageSnapshot.getFieldOfView().getHorizontalFieldOfViewAngle());
}
@Override
public float getTextureHtoVRatio() {
return (float) (this.imageSnapshot.getFieldOfView().getHorizontalFieldOfViewAngle()
/ this.imageSnapshot.getFieldOfView().getVerticalFieldOfViewAngle());
}
@Override
public BufferedImage getProjectedImage() {
AbstractEImage image = null;
// Use the rectified image if applicable.
if (this.imageSnapshot instanceof RectifiedImageSnapshot) {
image = ((RectifiedImageSnapshot) this.imageSnapshot).getRectifiedImage();
}
if (image == null) {
image = this.imageSnapshot.getImage();
}
if (image != null) {
// Ensures the image if of the right type.
EImage overlayImage = ApogyCommonImagesFactory.eINSTANCE.createEImage();
overlayImage.setImageContent(image.asBufferedImage());
AbstractEImage transparentImage = EImagesUtilities.INSTANCE.createTransparentImage(overlayImage.getWidth(),
overlayImage.getHeight());
image = EImagesUtilities.INSTANCE.applyOverlay(transparentImage, overlayImage, false);
} else {
image = getEmptyImage();
}
// Rotate the image before projection.
return rotateImage(image).asBufferedImage();
}
@Override
public void updateProjectorFOVSettings() {
ProjectorData projectorData = getProjectorData();
projectorData.projector.setParameter("CombineMode", CombineMode.BLEND_COLOR_ADD_ALPHA);
Camera projectorCamera = projectorData.projector.getProjectorCamera();
projectorCamera.setLocation(getProjectorLocation());
projectorCamera.setRotation(getProjectorRotation());
projectorCamera.setFrustumPerspective(getHorizontalFOVAngleDegrees(), 1.0f / getTextureHtoVRatio(), 1f, 5f);
}
@Override
protected void controlUpdate(float arg0) {
// Updates the geometries onto which to project.
if (getMultiTextureProjectorRenderer().getTargetGeometryList() == null) {
getMultiTextureProjectorRenderer()
.setTargetGeometryList(JME3FovUtilities.createGeometryListForImageProjection(this.jm3Application));
} else {
JME3FovUtilities.updateGeometryListForImageProjection(this.jm3Application.getJMERenderEngineDelegate(),
getMultiTextureProjectorRenderer().getTargetGeometryList());
}
// Updates position and orientation of projector camera.
Camera projectorCamera = getProjectorData().projector.getProjectorCamera();
projectorCamera.setLocation(getProjectorLocation());
projectorCamera.setRotation(getProjectorRotation());
}
private AbstractEImage getEmptyImage() {
AbstractEImage empty = EImagesUtilities.INSTANCE.createTransparentImage(2, 2);
return empty;
}
private AbstractEImage rotateImage(AbstractEImage originalImage) {
BufferedImage original = originalImage.asBufferedImage();
BufferedImage rotated = new BufferedImage(originalImage.getHeight(), originalImage.getWidth(),
BufferedImage.TYPE_INT_ARGB);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
int rgb = original.getRGB(x, y);
rotated.setRGB(y, width - 1 - x, rgb);
}
}
EImage filteredImage = ApogyCommonImagesFactory.eINSTANCE.createEImage();
filteredImage.setImageContent(rotated);
return filteredImage;
}
}