Loading GUI/src/main/java/cz/fidentis/analyst/gui/task/interactivemask/InteractiveMaskAction.java +4 −4 Original line number Diff line number Diff line Loading @@ -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(); } Loading GeometryEngines/src/main/java/cz/fidentis/analyst/engines/interactivemask/MaskProjector.java +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; Loading @@ -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)); Loading @@ -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())); } } GeometryEngines/src/main/java/cz/fidentis/analyst/engines/interactivemask/MaskProjectorConfig.java +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 Loading @@ -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; } } Loading
GUI/src/main/java/cz/fidentis/analyst/gui/task/interactivemask/InteractiveMaskAction.java +4 −4 Original line number Diff line number Diff line Loading @@ -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(); } Loading
GeometryEngines/src/main/java/cz/fidentis/analyst/engines/interactivemask/MaskProjector.java +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; Loading @@ -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)); Loading @@ -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())); } }
GeometryEngines/src/main/java/cz/fidentis/analyst/engines/interactivemask/MaskProjectorConfig.java +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 Loading @@ -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; } }