Loading GUI/src/main/java/cz/fidentis/analyst/gui/task/interactivemask/InteractiveMaskAction.java +15 −44 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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( Loading @@ -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(); } Loading @@ -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(); } } } } Rendering/src/main/java/cz/fidentis/analyst/drawables/DrawableInteractiveMask.java +18 −56 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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; } } */ } Rendering/src/main/java/cz/fidentis/analyst/rendering/Scene.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading @@ -316,7 +317,7 @@ public class Scene { } } drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(face.getSurfaceMask().getPoints())); drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(mask)); return true; } Loading Loading
GUI/src/main/java/cz/fidentis/analyst/gui/task/interactivemask/InteractiveMaskAction.java +15 −44 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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( Loading @@ -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(); } Loading @@ -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(); } } } }
Rendering/src/main/java/cz/fidentis/analyst/drawables/DrawableInteractiveMask.java +18 −56 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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; } } */ }
Rendering/src/main/java/cz/fidentis/analyst/rendering/Scene.java +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 { Loading @@ -316,7 +317,7 @@ public class Scene { } } drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(face.getSurfaceMask().getPoints())); drawableInteractiveMasks.set(slot, new DrawableInteractiveMask(mask)); return true; } Loading