| /******************************************************************************* |
| * 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; |
| } |
| |
| } |