109 lines
3.1 KiB
Java
109 lines
3.1 KiB
Java
package electrosphere.renderer.ui.imgui;
|
|
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
import imgui.ImVec2;
|
|
import imgui.extension.implot.ImPlot;
|
|
import imgui.extension.implot.flag.ImPlotAxisFlags;
|
|
|
|
/**
|
|
* A line plot of a given set of data
|
|
*/
|
|
public class ImGuiLinePlot implements ImGuiElement {
|
|
|
|
//the title of the plot
|
|
String plotTitle;
|
|
|
|
//the data sets to draw
|
|
List<ImGuiLinePlotDataset> dataSets = new LinkedList<ImGuiLinePlotDataset>();
|
|
|
|
/**
|
|
* Creates an im gui line plot
|
|
*/
|
|
public ImGuiLinePlot(String plotTitle){
|
|
this.plotTitle = plotTitle;
|
|
}
|
|
|
|
@Override
|
|
public void draw() {
|
|
if(ImPlot.beginPlot(plotTitle,"","",new ImVec2(-1,-1),0,ImPlotAxisFlags.AutoFit,ImPlotAxisFlags.AutoFit)){
|
|
for(ImGuiLinePlotDataset dataSet : dataSets){
|
|
double[] xs = dataSet.xData.stream().mapToDouble(Double::doubleValue).toArray();//(Double[])dataSet.xData.toArray(new Double[dataSet.xData.size()]);
|
|
double[] ys = dataSet.yData.stream().mapToDouble(Double::doubleValue).toArray();//(Double[])dataSet.yData.toArray(new Double[dataSet.yData.size()]);
|
|
ImPlot.plotLine(dataSet.label, xs, ys, xs.length, 0);
|
|
}
|
|
ImPlot.endPlot();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds a dataset to the line plot
|
|
* @param dataset The dataset
|
|
*/
|
|
public void addDataset(ImGuiLinePlotDataset dataset){
|
|
this.dataSets.add(dataset);
|
|
}
|
|
|
|
/**
|
|
* A single set of data to be plotted in this graph
|
|
*/
|
|
public static class ImGuiLinePlotDataset {
|
|
|
|
//x data
|
|
List<Double> xData = new LinkedList<Double>();
|
|
|
|
//y data
|
|
List<Double> yData = new LinkedList<Double>();
|
|
|
|
//the label of the line
|
|
String label;
|
|
|
|
//the max number of points
|
|
int limit;
|
|
|
|
/**
|
|
* Creates a dataset object
|
|
* @param x the x data
|
|
* @param y the y data
|
|
* @param label the label for the data
|
|
* @param limit the maximum number of objects to keep in the dataset
|
|
*/
|
|
public ImGuiLinePlotDataset(String label, int limit){
|
|
this.label = label;
|
|
this.limit = limit;
|
|
}
|
|
|
|
/**
|
|
* Adds data to the data set. If the amount of data is greater than the limit, it will remove the oldest datapoint
|
|
* @param x the x value
|
|
* @param y the y value
|
|
*/
|
|
public void addPoint(double x, double y){
|
|
xData.add(x);
|
|
yData.add(y);
|
|
while(xData.size() > limit){
|
|
xData.remove(0);
|
|
}
|
|
while(yData.size() > limit){
|
|
yData.remove(0);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds data to the data set. If the amount of data is greater than the limit, it will remove the oldest datapoint.
|
|
* Does not clear the x axis so can constantly receive data and update without axis freaking out.
|
|
* @param y the y value
|
|
*/
|
|
public void addPoint(double y){
|
|
yData.add(y);
|
|
while(yData.size() > limit){
|
|
yData.remove(0);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
}
|