Skip to content
Snippets Groups Projects
CurvatureAction.java 3.84 KiB
Newer Older
package cz.fidentis.analyst.curvature;

import cz.fidentis.analyst.canvas.Canvas;
import cz.fidentis.analyst.core.ControlPanelAction;
import cz.fidentis.analyst.visitors.mesh.Curvature;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;

/**
 * Action listener for the curvature computation.
 * 
 * @author Radek Oslejsek
 */
public class CurvatureAction extends ControlPanelAction {
    /*
     * Attributes handling the state
     */
    private Curvature visitor = null;
    private String curvatureType = CurvaturePanel.GAUSSIAN_CURVATURE;
    private final CurvaturePanel controlPanel;
    private final JTabbedPane topControlPanel;
    /**
     * Constructor.
     * 
     * @param canvas OpenGL canvas
     * @param topControlPanel Top component for placing control panels
    public CurvatureAction(Canvas canvas, JTabbedPane topControlPanel) {
        super(canvas, topControlPanel);
        this.topControlPanel = topControlPanel;
        this.controlPanel = new CurvaturePanel(this);

        // Place control panel to the topControlPanel
        this.topControlPanel.addTab(controlPanel.getName(), controlPanel.getIcon(), controlPanel);
        this.topControlPanel.addChangeListener(e -> {
            // If the symmetry panel is focused...
            if (((JTabbedPane) e.getSource()).getSelectedComponent() instanceof CurvaturePanel) {
                getCanvas().getScene().setDefaultColors();
            }
        });

        topControlPanel.setSelectedComponent(controlPanel);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        String action = ae.getActionCommand();
        
        switch (action) {
            case CurvaturePanel.ACTION_COMMAND_SHOW_HIDE_PANEL:
                hideShowPanelActionPerformed(ae, this.controlPanel);
            case CurvaturePanel.ACTION_COMMAND_SHOW_HIDE_HEATMAP:
                if (((JToggleButton) ae.getSource()).isSelected()) {
                    setHeatmap();
                    getPrimaryDrawableFace().setRenderHeatmap(true);
                    getPrimaryDrawableFace().setRenderHeatmap(false);
            case CurvaturePanel.ACTION_COMMAND_SET_CURVATURE_TYPE:
                this.curvatureType = (String) ((JComboBox) ae.getSource()).getSelectedItem();
                setHeatmap();
                break;
Radek Ošlejšek's avatar
Radek Ošlejšek committed
                // to nothing
        
        renderScene();
    
    protected void setHeatmap() {
        if (visitor == null) { // compute missing curvature
            this.visitor = new Curvature();
            getPrimaryDrawableFace().getModel().compute(visitor);
            out.printDuration("Computation of curvature for a model with " 
                    + getPrimaryDrawableFace().getHumanFace().getMeshModel().getNumVertices()
                    + " vertices"
            );
        }
        
        switch (this.curvatureType) {
            case CurvaturePanel.GAUSSIAN_CURVATURE:
                    getPrimaryDrawableFace().setHeatMap(visitor.getGaussianCurvatures());
                break;
            case CurvaturePanel.MEAN_CURVATURE:
                    getPrimaryDrawableFace().setHeatMap(visitor.getMeanCurvatures());
                break;
            case CurvaturePanel.MIN_CURVATURE:
                    getPrimaryDrawableFace().setHeatMap(visitor.getMinPrincipalCurvatures());
                break;
            case CurvaturePanel.MAX_CURVATURE:
                    getPrimaryDrawableFace().setHeatMap(visitor.getMaxPrincipalCurvatures());
                break;
            default:
                throw new UnsupportedOperationException(curvatureType);
        }
        
    }