Commit 05618231 authored by Radek Ošlejšek's avatar Radek Ošlejšek
Browse files

Transform MaskProjector from MeshVisitor to OctreeVisitor

parent 5b6135ad
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -51,11 +51,11 @@ public class InteractiveMaskAction extends ControlPanelAction<InteractiveMaskPan
        SurfaceMask2D mask = getControlPanel().getSurfaceMask();
        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());
                getControlPanel().getSurfaceMaskPanel1().getPanelHeight(),Camera.FIELD_OF_VIEW,
                getCanvas().getCamera().getPosition(), getCanvas().getCamera().getCenter(),
                getCanvas().getCamera().getUpDirection());
        MaskProjector mp = new MaskProjector(config, mask);
        getPrimaryFace().getMeshModel().getFacets().forEach(mp::visitMeshFacet);
        getPrimaryFace().getOctree().accept(mp);
        getScene().setDrawableInteractiveMask(getScene().getPrimaryFaceSlot(), mp.getResult());
        renderScene();
    }
+17 −29
Original line number Diff line number Diff line
package cz.fidentis.analyst.engines.interactivemask;

import cz.fidentis.analyst.data.mesh.MeshFacet;
import cz.fidentis.analyst.data.mesh.MeshTriangle;
import cz.fidentis.analyst.data.mesh.MeshVisitor;
import cz.fidentis.analyst.data.octree.Octree;
import cz.fidentis.analyst.data.octree.OctreeVisitor;
import cz.fidentis.analyst.data.ray.Ray;
import cz.fidentis.analyst.data.ray.RayIntersection;
import cz.fidentis.analyst.data.shapes.SurfaceMask;
import cz.fidentis.analyst.data.shapes.SurfaceMask2D;
import cz.fidentis.analyst.engines.raycasting.RayIntersectionConfig;
import cz.fidentis.analyst.engines.raycasting.RayIntersectionServices;
import java.awt.Point;

import java.awt.*;
import java.util.Objects;

/**
 * Visits meshes and returns intersections with projection of SurfaceMask2D
 * @author Mario Chromik
 */
public class MaskProjector implements MeshVisitor {
public class MaskProjector implements OctreeVisitor {

    private final SurfaceMask2D surfaceMask;

@@ -33,16 +34,6 @@ public class MaskProjector implements MeshVisitor {
        this.surfaceMask = surfaceMask;
    }

    @Override
    public boolean isThreadSafe() {
        return MeshVisitor.super.isThreadSafe();
    }

    @Override
    public void dispose() {
        MeshVisitor.super.dispose();
    }

    private Ray getRayFromPoint(Point point) {
        Point normalizedPoint = new Point((int) point.getX() - (config.panelWidth()/2) ,(int) point.getY() - (config.panelHeight()/2));

@@ -63,19 +54,16 @@ public class MaskProjector implements MeshVisitor {


    @Override
    public void visitMeshFacet(MeshFacet facet) {
        if (facet == null) {
            return;
        }
        for (Point point : surfaceMask.getPointsToProject()) {
            Ray ray = getRayFromPoint(point);
            RayIntersection ri = RayIntersectionServices.computeClosest(
                    config.octree(),
                    new RayIntersectionConfig(ray, MeshTriangle.Smoothing.NORMAL, false));

            if (ri != null) {
                projectedMask.addPoint(ri.getPosition(), ri.getHitTriangle().getFacet(),  ri.getHitTriangle().computeOrientedNormal());
            }
        }
    public void visitOctree(Octree octree) {
        surfaceMask.getPointsToProject().stream()
                .map(this::getRayFromPoint)
                .map(ray -> RayIntersectionServices.computeClosest(
                        octree,
                        new RayIntersectionConfig(ray, MeshTriangle.Smoothing.NORMAL, false)))
                .filter(Objects::nonNull)
                .forEach(ri -> projectedMask.addPoint(
                        ri.getPosition(),
                        ri.getHitTriangle().getFacet(),
                        ri.getHitTriangle().computeOrientedNormal()));
    }
}
+3 −75
Original line number Diff line number Diff line
package cz.fidentis.analyst.engines.interactivemask;

import cz.fidentis.analyst.data.octree.Octree;

import javax.vecmath.Vector3d;

/**
 *  Configuration for MAskProjector
 * Configuration for MaskProjector
 *
 * @param canvasWidth
 * @param canvasHeight
 * @param panelWidth
@@ -14,82 +13,11 @@ import javax.vecmath.Vector3d;
 * @param cameraPosition
 * @param cameraCenter
 * @param cameraUpDirection
 * @param octree
 *
 * @author Mario Chromik
 */
public record MaskProjectorConfig(int canvasWidth, int canvasHeight, int panelWidth,
                                  int panelHeight, int fov, Vector3d cameraPosition,
                                  Vector3d cameraCenter, Vector3d cameraUpDirection, Octree octree) {

    @Override
    public Octree octree() {
        return octree;
    }

    /**
     * Constructor with 9 parameters
     * @param canvasWidth
     * @param canvasHeight
     * @param panelWidth
     * @param panelHeight
     * @param fov
     * @param cameraPosition
     * @param cameraCenter
     * @param cameraUpDirection
     * @param octree
     */
    public MaskProjectorConfig(int canvasWidth, int canvasHeight, int panelWidth, int panelHeight,
                               int fov, Vector3d cameraPosition, Vector3d cameraCenter, Vector3d cameraUpDirection,
                               Octree octree) {
        this.canvasWidth = canvasWidth;
        this.canvasHeight = canvasHeight;
        this.panelWidth = panelWidth;
        this.panelHeight = panelHeight;
        this.fov = fov;
        this.cameraPosition = cameraPosition;
        this.cameraCenter = cameraCenter;
        this.cameraUpDirection = cameraUpDirection;
        this.octree = octree;
    }
                                  Vector3d cameraCenter, Vector3d cameraUpDirection) {

    @Override
    public int canvasWidth() {
        return canvasWidth;
    }

    @Override
    public int canvasHeight() {
        return canvasHeight;
    }

    @Override
    public int panelWidth() {
        return panelWidth;
    }

    @Override
    public int panelHeight() {
        return panelHeight;
    }

    @Override
    public int fov() {
        return fov;
    }

    @Override
    public Vector3d cameraPosition() {
        return cameraPosition;
    }

    @Override
    public Vector3d cameraCenter() {
        return cameraCenter;
    }

    @Override
    public Vector3d cameraUpDirection() {
        return cameraUpDirection;
    }
}