package com.badlogic.gdx.tools.flame;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.badlogic.gdx.graphics.g3d.particles.ParticleShader.AlignMode;
import com.badlogic.gdx.graphics.g3d.particles.ParticleSorter;
import com.badlogic.gdx.graphics.g3d.particles.batches.BillboardParticleBatch;
/** @author Inferno */
public class BillboardBatchPanel extends EditorPanel<BillboardParticleBatch> {
private enum AlignModeWrapper{
Screen( AlignMode.Screen, "Screen"),
ViewPoint(AlignMode.ViewPoint, "View Point");
//ParticleDirection( AlignMode.ParticleDirection, "Particle Direction");
public String desc;
public AlignMode mode;
AlignModeWrapper(AlignMode mode, String desc){
this.mode = mode;
this.desc = desc;
}
@Override
public String toString () {
return desc;
}
}
private enum SortMode{
None( "None", new ParticleSorter.None()),
Distance("Distance", new ParticleSorter.Distance());
public String desc;
public ParticleSorter sorter;
SortMode(String desc, ParticleSorter sorter){
this.sorter = sorter;
this.desc = desc;
}
@Override
public String toString () {
return desc;
}
}
JComboBox alignCombo;
JCheckBox useGPUBox;
JComboBox sortCombo;
public BillboardBatchPanel (FlameMain particleEditor3D, BillboardParticleBatch renderer) {
super(particleEditor3D, "Billboard Batch", "Renderer used to draw billboards particles.");
initializeComponents(renderer);
setValue(renderer);
}
private void initializeComponents (BillboardParticleBatch renderer) {
//Align
alignCombo = new JComboBox();
alignCombo.setModel(new DefaultComboBoxModel(AlignModeWrapper.values()));
alignCombo.setSelectedItem(getAlignModeWrapper(renderer.getAlignMode()));
alignCombo.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
AlignModeWrapper align = (AlignModeWrapper)alignCombo.getSelectedItem();
editor.getBillboardBatch().setAlignMode(align.mode);
}
});
//Cpu/Gpu
useGPUBox = new JCheckBox();
useGPUBox.setSelected(renderer.isUseGPU());
useGPUBox.addChangeListener(new ChangeListener() {
public void stateChanged (ChangeEvent event) {
editor.getBillboardBatch().setUseGpu(useGPUBox.isSelected());
}
});
//Sort
sortCombo = new JComboBox();
sortCombo.setModel(new DefaultComboBoxModel(SortMode.values()));
sortCombo.setSelectedItem(getSortMode(renderer.getSorter()));
sortCombo.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
SortMode mode = (SortMode)sortCombo.getSelectedItem();
editor.getBillboardBatch().setSorter(mode.sorter);
}
});
int i =0;
contentPanel.add(new JLabel("Align"), new GridBagConstraints(0, i, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
contentPanel.add(alignCombo, new GridBagConstraints(1, i++, 1, 1, 1, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
contentPanel.add(new JLabel("Use GPU"), new GridBagConstraints(0, i, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
contentPanel.add(useGPUBox, new GridBagConstraints(1, i++, 1, 1, 1, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
contentPanel.add(new JLabel("Sort"), new GridBagConstraints(0, i, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
contentPanel.add(sortCombo, new GridBagConstraints(1, i, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE,
new Insets(6, 0, 0, 0), 0, 0));
}
private Object getSortMode (ParticleSorter sorter) {
Class type = sorter.getClass();
for(SortMode wrapper : SortMode.values()){
if(wrapper.sorter.getClass() == type)
return wrapper;
}
return null;
}
private Object getAlignModeWrapper (AlignMode alignMode) {
for(AlignModeWrapper wrapper : AlignModeWrapper.values()){
if(wrapper.mode == alignMode)
return wrapper;
}
return null;
}
}