Commit 78365960 authored by Mario Chromik's avatar Mario Chromik
Browse files

integrating MaskProjector

parent 092f2280
Loading
Loading
Loading
Loading
+15 −44
Original line number Diff line number Diff line
@@ -2,13 +2,13 @@ package cz.fidentis.analyst.gui.task.interactivemask;

import cz.fidentis.analyst.canvas.Canvas;
import cz.fidentis.analyst.data.shapes.SurfaceMask2D;
import cz.fidentis.analyst.engines.face.events.HumanFaceSelectedEvent;
import cz.fidentis.analyst.data.face.HumanFaceEvent;
import cz.fidentis.analyst.data.face.HumanFaceListener;
import cz.fidentis.analyst.engines.face.FaceStateServices;
import cz.fidentis.analyst.engines.interactivemask.MaskProjector;
import cz.fidentis.analyst.engines.interactivemask.MaskProjectorConfig;
import cz.fidentis.analyst.gui.task.ControlPanelAction;
import cz.fidentis.analyst.project.FacesProxy;
import cz.fidentis.analyst.data.ray.RayIntersection;
import cz.fidentis.analyst.rendering.Camera;

import javax.swing.*;
import java.awt.event.ActionEvent;

@@ -17,7 +17,7 @@ import java.awt.event.ActionEvent;
 *
 * @author Mario Chromik
 */
public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPanel> implements HumanFaceListener {
public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPanel> {

    private String mode = InteractiveMaskPanel.ACTION_DRAW;

@@ -32,7 +32,6 @@ public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPan
    public InteractiveMaskAction(Canvas canvas, FacesProxy faces, JTabbedPane topControlPane) {
        super(canvas, faces, topControlPane);
        InteractiveMaskPanel pl = new InteractiveMaskPanel(this);
        //pl.getSurfaceMaskPanel1().setCanvasAndFace(canvas, faces.getPrimaryFace());
        setControlPanel(pl);

        setShowHideCode(
@@ -45,19 +44,20 @@ public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPan
                    getCanvas().getScene().showInteractiveMask(getCanvas().getScene().getSecondaryFaceSlot(), false);
                }
        );

        getPrimaryDrawableFace().getHumanFace().registerListener(this);
        if (getSecondaryDrawableFace() != null) {
            getSecondaryDrawableFace().getHumanFace().registerListener(this);
        }
    }

    private void project() {
        FaceStateServices.updateOctree(getPrimaryFace(), FaceStateServices.Mode.COMPUTE_IF_ABSENT);
        SurfaceMask2D mask = getControlPanel().getSurfaceMask();
        MaskProjector mp = new MaskProjector(mask);
        InteractiveMaskTaskNoParallel task = new InteractiveMaskTaskNoParallel(getCanvas(), mask.getPointsToProject(), getControlPanel().getSurfaceMaskPanel1().getPanelWidth(), getControlPanel().getSurfaceMaskPanel1().getPanelHeight());
        task.project();
        //getPrimaryFace().getMeshModel().getFacets().forEach(mp::visitMeshFacet);
        MaskProjectorConfig config = new MaskProjectorConfig(getCanvas().getWidth(),
                getCanvas().getHeight(), getControlPanel().getSurfaceMaskPanel1().getPanelWidth(),
                getControlPanel().getSurfaceMaskPanel1().getPanelHeight(),Camera.FIELD_OF_VIEW
                ,getCanvas().getCamera().getPosition(), getCanvas().getCamera().getCenter(), getCanvas().getCamera().getUpDirection(),
                getPrimaryFace().getOctree());
        MaskProjector mp = new MaskProjector(config, mask);
        getPrimaryFace().getMeshModel().getFacets().forEach(mp::visitMeshFacet);
        getScene().setDrawableInteractiveMask(getScene().getPrimaryFaceSlot(), mp.getResult());
        renderScene();
    }


@@ -79,33 +79,4 @@ public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPan
        }
    }

    @Override
    public void acceptEvent(HumanFaceEvent event) {
        if (event instanceof HumanFaceSelectedEvent) {
            HumanFaceSelectedEvent huEvent = (HumanFaceSelectedEvent) event;

            RayIntersection closestIntersection = huEvent.getIntersection();

            if (mode.equals(InteractiveMaskPanel.ACTION_DRAW) && closestIntersection != null && huEvent.getFace().getSurfaceMask() != null) {
                huEvent.getFace().getSurfaceMask().addPoint(
                        huEvent.getIntersection().getPosition(),
                        huEvent.getIntersection().getHitTriangle().getFacet(),
                        huEvent.getIntersection().getHitTriangle().computeOrientedNormal()
                );
            }


            if ( event.getName().equals("Render")) {
                if (huEvent.getFace().equals(getPrimaryFace())) {
                    getScene().setDrawableInteractiveMask(getScene().getPrimaryFaceSlot(),
                            huEvent.getFace());
                } else {
                    getScene().setDrawableInteractiveMask(getScene().getSecondaryFaceSlot(),
                            huEvent.getFace());
                }

                renderScene();
            }
        }
    }
}
+18 −56
Original line number Diff line number Diff line
@@ -21,7 +21,8 @@ import java.util.List;
 * @author Mario Chromik
 */
public class DrawableInteractiveMask extends Drawable {
    private final List<SurfaceMask.MaskPoint> maskPoints;

    private final SurfaceMask mask;

    private final double defaultRadius = 1;
    
@@ -30,15 +31,14 @@ public class DrawableInteractiveMask extends Drawable {
    /**
     * Constructor.
     *
     * @param maskPoints Points projected onto face and ready to be drawn
     * @param mask mask with points projected onto face and ready to be drawn
     * @throws IllegalArgumentException if the {@code mask} is {@code null}
     * TODO: switch to mask point defined locally after switching from using SurfaceMask(3D)
     */
    public DrawableInteractiveMask(List<SurfaceMask.MaskPoint> maskPoints) {
        if (maskPoints == null) {
    public DrawableInteractiveMask(SurfaceMask mask) {
        if (mask == null) {
            throw new IllegalArgumentException("MaskPoints cannot be null");
        }
        this.maskPoints = maskPoints;
        this.mask = mask;
    }

    @Override
@@ -52,7 +52,7 @@ public class DrawableInteractiveMask extends Drawable {
        gl.glMaterialfv(GL2.GL_FRONT_AND_BACK, GL2.GL_DIFFUSE, rgba, 0);

        // draw mask points
        for (SurfaceMask.MaskPoint maskPoint : maskPoints) {
        for (SurfaceMask.MaskPoint maskPoint : mask.getPoints()) {
            gl.glPushMatrix(); 
            gl.glTranslated(maskPoint.getPosition().x, maskPoint.getPosition().y, maskPoint.getPosition().z);
            GLUquadric center = GLU_CONTEXT.gluNewQuadric();
@@ -94,14 +94,14 @@ public class DrawableInteractiveMask extends Drawable {
    protected List<CrossSection3D> interpolatePoints() {
        List<CrossSection3D> curves = new ArrayList<>();

        for (int i = 0; i < maskPoints.size() - 1; i++) {
            var p1 = maskPoints.get(i);
            var p2 = maskPoints.get(i + 1);
        for (int i = 0; i < mask.getPoints().size() - 1; i++) {
            var p1 = mask.getPoints().get(i);
            var p2 = mask.getPoints().get(i + 1);
            curves.add(interpolateLine(p1, p2));
        }

        if (maskPoints.size() >= 3) {
            curves.add(interpolateLine(maskPoints.get(maskPoints.size() - 1), maskPoints.get(0)));
        if (mask.getPoints().size() >= 3) {
            curves.add(interpolateLine(mask.getPoints().get(mask.getPoints().size() - 1), mask.getPoints().get(0)));
        }

        return curves;
@@ -129,56 +129,18 @@ public class DrawableInteractiveMask extends Drawable {
     */
    protected List<Cylinder> getCylinders() {
        List<Cylinder> cylinders = new ArrayList<>();
        for (int i = 0; i < maskPoints.size() - 1; i++) {
            var p1 = maskPoints.get(i);
            var p2 = maskPoints.get(i + 1);
        for (int i = 0; i < mask.getPoints().size() - 1; i++) {
            var p1 = mask.getPoints().get(i);
            var p2 = mask.getPoints().get(i + 1);
            Cylinder cyl = new Cylinder(p1.getPosition(), p2.getPosition(), 10);
            cylinders.add(cyl);
        }

        if (maskPoints.size() >= 3 ) {
            cylinders.add(new Cylinder(maskPoints.get(maskPoints.size() - 1).getPosition(),
                    maskPoints.get(0).getPosition(),
        if (mask.getPoints().size() >= 3 ) {
            cylinders.add(new Cylinder(mask.getPoints().get(mask.getPoints().size() - 1).getPosition(),
                    mask.getPoints().get(0).getPosition(),
                    10));
        }
        return cylinders;
    }

/**
    /**
     * Class representing a single point of Interactive Mask.
     *
     * @author Mario Chromik

    public static final class MaskPoint {

        private final Point3d position;
        private final MeshFacet facet;

        private final Vector3d normal;
        /**
         * Constructor.
         *
         * @param pos position of an Interactive Mask point in 3D space
         * @param fac facet of IM point

        private MaskPoint(Point3d pos, MeshFacet fac, Vector3d norm) {
            position = pos;
            facet = fac;
            normal = norm;
        }

        public Point3d getPosition() {
            return position;
        }

        public MeshFacet getFacet() {
            return facet;
        }

        public Vector3d getNormal() {
            return normal;
        }
    }
    */
}
+4 −3
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ package cz.fidentis.analyst.rendering;

import cz.fidentis.analyst.data.face.HumanFace;
import cz.fidentis.analyst.data.shapes.Box;
import cz.fidentis.analyst.data.shapes.SurfaceMask;
import cz.fidentis.analyst.drawables.*;
import cz.fidentis.analyst.engines.bbox.BoundingBoxConfig;
import cz.fidentis.analyst.engines.bbox.BoundingBoxServices;
@@ -304,10 +305,10 @@ public class Scene {
     * @param face New face or {@code null}
     * @return {@code true} on success.
     */
    public boolean setDrawableInteractiveMask(int slot, HumanFace face) {
    public boolean setDrawableInteractiveMask(int slot, SurfaceMask mask) {
        if (slot < 0 || slot >= Scene.MAX_FACES_IN_SCENE) {
            return false;
        } else if (face == null || face.getSurfaceMask().isEmpty()) { // remove
        } else if (mask == null || mask.getPoints().isEmpty()) { // remove
            if (slot >= getArraySize()){
                return false;
            } else {
@@ -316,7 +317,7 @@ public class Scene {
            }
        } 
     
        drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(face.getSurfaceMask().getPoints()));
        drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(mask));
        return true;
    }