SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/gui/components/window/debug/PieProfilerWindowComponent....

307 lines
10 KiB
Java

package speiger.src.coreengine.rendering.gui.components.window.debug;
import java.text.DecimalFormat;
import java.util.List;
import java.util.function.Supplier;
import org.lwjgl.glfw.GLFW;
import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.collections.objects.utils.ObjectLists;
import speiger.src.coreengine.math.MathUtils;
import speiger.src.coreengine.math.misc.ColorUtils;
import speiger.src.coreengine.math.vector.floats.Vec2f;
import speiger.src.coreengine.rendering.gui.GuiManager;
import speiger.src.coreengine.rendering.gui.base.IKeyComponent;
import speiger.src.coreengine.rendering.gui.components.ButtonComponent;
import speiger.src.coreengine.rendering.gui.components.PieComponent;
import speiger.src.coreengine.rendering.gui.components.PieComponent.IPieIndex;
import speiger.src.coreengine.rendering.gui.components.PieComponent.PieIndex;
import speiger.src.coreengine.rendering.gui.components.TextComponent;
import speiger.src.coreengine.rendering.gui.components.WindowComponent;
import speiger.src.coreengine.rendering.gui.helper.Align;
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrains;
import speiger.src.coreengine.rendering.gui.helper.constrains.Constrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.DynamicConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.ParentConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.PixelConstrain;
import speiger.src.coreengine.rendering.gui.helper.constrains.RelativeConstrain;
import speiger.src.coreengine.rendering.input.Keyboard;
import speiger.src.coreengine.utils.profiler.IProfiler;
import speiger.src.coreengine.utils.profiler.IProfiler.IProfilerEntry;
import speiger.src.coreengine.utils.profiler.IProfiler.ProfilerData;
public class PieProfilerWindowComponent extends WindowComponent
implements Supplier<List<IPieIndex>>, IKeyComponent
{
public static final DecimalFormat PERCENT_FORMAT = new DecimalFormat("##0.00");
PieComponent pie = new PieComponent(127, this);
ButtonComponent[] buttons = new ButtonComponent[3];
TextComponent[] extraFeatures = new TextComponent[3];
List<TextComponent[]> entries = new ObjectArrayList<TextComponent[]>();
int textInUse = 0;
IProfiler profiler;
IProfilerEntry currentEntry;
String entryName;
List<ProfilerData> lastValues = null;
public PieProfilerWindowComponent(float x, float y, float width, float height, String name)
{
super(x, y, width, height, DEFAULT_FLAGS, name);
}
@Override
public boolean canMoveIntoForground()
{
return true;
}
@Override
public void init()
{
super.init();
addChild(pie.setAutoUpdate(true).set(0F, 5F).addChangeListener(minimizedListener), new Constrains(null, null, new ParentConstrain(), new DynamicConstrain(this::calculatePieHeight)));
buttons[0] = createButton(0, "Client");
buttons[1] = createButton(1, "GPU");
buttons[2] = createButton(2, "Server");
extraFeatures[0] = new TextComponent(0F, 0F, 18F, 5.5F).setTextScale(0.3F).setText("[0] Back").align(Align.LEFT_TOP, Align.CENTER);
extraFeatures[0].addChangeListener(T -> T.setVisible(!isMinimized() && currentEntry != null && currentEntry.getParent() != null));
addChild(extraFeatures[0], new Constrains(null, new DynamicConstrain(() -> pie.getBox().getBaseHeight() + (-5.5F)), new PixelConstrain(38).setInverted(), null));
extraFeatures[1] = new TextComponent(0F, 0F, 0F, 7F).setTextScale(0.4F).setText("Client Thread");
addChild(extraFeatures[1].addChangeListener(minimizedListener), new Constrains(null, new PixelConstrain(8F), new ParentConstrain(), null));
extraFeatures[2] = new TextComponent(0F, 0F, 0F, 6F).setTextScale(0.33F).setText("Client");
addChild(extraFeatures[2].addChangeListener(minimizedListener), new Constrains(null, new PixelConstrain(15F), new ParentConstrain(), null));
}
@Override
public void onClosed()
{
super.onClosed();
if(profiler != null)
{
profiler.disable();
profiler = null;
}
}
public PieProfilerWindowComponent setProfiler(IProfiler profiler, String root)
{
if(this.profiler != null)
{
buttons[getProfilerIndex(this.profiler)].setEnabled(true);
this.profiler.disable();
}
this.profiler = profiler;
if(profiler != null)
{
profiler.enable();
setCurrentEntry(root);
buttons[getProfilerIndex(this.profiler)].setEnabled(false);
extraFeatures[1].setText(profiler.getName());
}
return this;
}
public PieProfilerWindowComponent setCurrentEntry(String name)
{
entryName = name;
currentEntry = profiler.getEntry(name);
lastValues = null;
extraFeatures[2].setText(currentEntry == null ? "Unknown" : currentEntry.getName());
return this;
}
@Override
protected boolean updateSelf(int mouseX, int mouseY, float particalTicks)
{
for(int i = 0,m=entries.size();i<m;i++)
{
TextComponent[] comp = entries.get(i);
float brightness = comp[0].isTopHovered(mouseX, mouseY) || comp[1].isTopHovered(mouseX, mouseY) || comp[2].isTopHovered(mouseX, mouseY) ? 0.7F : 1F;
comp[0].setBrightness(brightness);
comp[1].setBrightness(brightness);
comp[2].setBrightness(brightness);
}
extraFeatures[0].setBrightness(extraFeatures[0].isHovered(mouseX, mouseY) ? 0.7F : 1F);
return super.updateSelf(mouseX, mouseY, particalTicks);
}
@Override
protected boolean fixedUpdateSelf()
{
if(profiler == null)
{
return true;
}
if(currentEntry == null)
{
setCurrentEntry(entryName);
return true;
}
if(currentEntry.getNanoTime() == 0L || (Keyboard.isAltDown() && lastValues != null) || (lastValues != null && getGlobalClock() % 2 != 0))
{
return true;
}
while(entries.size() < currentEntry.getChildCount() + 1)
{
entries.add(new TextComponent[] {createComponent(0), createComponent(1), createComponent(2) });
}
boolean lastEmpty = lastValues == null;
lastValues = currentEntry.getData();
int last = textInUse;
textInUse = lastValues.size();
for(int i = 0;i < textInUse;i++)
{
ProfilerData data = lastValues.get(i);
TextComponent[] info = entries.get(i);
int color = data.getColor();
info[0].setMassChanging(TextComponent.class).textColor(color).setText("[" + (i + 1) + "] " + data.getName()).finishMassChanging();
info[1].setMassChanging(TextComponent.class).textColor(color).setText(PERCENT_FORMAT.format(data.getEffect()) + "%").finishMassChanging();
info[2].setMassChanging(TextComponent.class).textColor(color).setText(PERCENT_FORMAT.format(data.getTotalEffect()) + "%").finishMassChanging();
}
if(last != textInUse)
{
resize(0F, (textInUse - last) * 5.5F);
}
else if(lastEmpty)
{
onChanged(true);
}
return true;
}
@Override
public boolean onClick(int button, int mouseX, int mouseY)
{
if(currentEntry != null && currentEntry.getParent() != null && extraFeatures[0].isHovered(mouseX, mouseY))
{
setCurrentEntry(currentEntry.getParent().getPathName());
}
if(lastValues != null)
{
for(int i = 0;i<textInUse;i++)
{
TextComponent[] comp = entries.get(i);
if(comp[0].isHovered(mouseX, mouseY) || comp[1].isHovered(mouseX, mouseY) || comp[2].isHovered(mouseX, mouseY))
{
String s = comp[0].getText();
s = s.substring(s.indexOf("] ")+2);
if(!s.equalsIgnoreCase("Nameless"))
{
setCurrentEntry(currentEntry.getPathName() + "/" + s);
return true;
}
return false;
}
}
}
return super.onClick(button, mouseX, mouseY);
}
@Override
public boolean isAcceptingInput()
{
return isEnabled() && isVisible() && !isMinimized() && currentEntry != null && hasFocus();
}
@Override
public boolean onKeyPressed(int key)
{
if(key == GLFW.GLFW_KEY_0 && currentEntry != null && currentEntry.getParent() != null)
{
setCurrentEntry(currentEntry.getParent().getPathName());
return true;
}
else if(key >= GLFW.GLFW_KEY_1 && key <= GLFW.GLFW_KEY_9)
{
key -= GLFW.GLFW_KEY_1;
if(key < textInUse)
{
String s = entries.get(key)[0].getText();
s = s.substring(s.indexOf("] ")+2);
if(!s.equalsIgnoreCase("Nameless"))
{
setCurrentEntry(currentEntry.getPathName() + "/" + s);
return true;
}
}
return false;
}
return false;
}
@Override
public Vec2f getMinimumBounds()
{
return Vec2f.of(80F, 80F + (textInUse * 5.5F));
}
@Override
public List<IPieIndex> get()
{
if(lastValues != null)
{
List<IPieIndex> entries = new ObjectArrayList<IPieIndex>();
for(int i = 0, m = lastValues.size();i < m;i++)
{
entries.add(new PieIndex(MathUtils.floor(lastValues.get(i).getEffect() * 1.28D), lastValues.get(i).getColor()));
}
return entries;
}
return ObjectLists.singleton(new PieIndex(pie.getMaxSteps(), ColorUtils.LIGHT_BLUE));
}
protected float calculatePieHeight()
{
return getBox().getBaseHeight() - ((textInUse * 5.5F) + 9F);
}
public IProfiler getProfiler(int index)
{
GuiManager manager = getGui().getUIManager();
switch(index)
{
case 1:
return manager.getGPUProfiler();
case 2:
return manager.getServerProfiler();
default:
return manager.getCPUProfiler();
}
}
public int getProfilerIndex(IProfiler prof)
{
GuiManager manager = getGui().getUIManager();
return manager.getGPUProfiler() == prof ? 1 : manager.getServerProfiler() == prof ? 2 : 0;
}
public static String getRoot(int index)
{
return index < 2 ? "Client" : "Server";
}
protected TextComponent createComponent(int column)
{
final int index = entries.size();
String text = column == 0 ? "[" + (entries.size() + 1) + "] Unknown" : PERCENT_FORMAT.format(0D) + "%";
TextComponent comp = new TextComponent(0F, 0F, 18F, 5.5F).setTextScale(0.3F).setText(text).align(column == 0 ? Align.LEFT_TOP : Align.RIGHT_BOTTOM, Align.CENTER);
comp.addChangeListener(T -> T.setVisible(!isMinimized() && index < textInUse));
Constrain xPos = column == 0 ? null : (column == 1 ? new PixelConstrain(38F).setInverted() : new PixelConstrain(19F).setInverted());
addChild(comp, new Constrains(xPos, new DynamicConstrain(() -> pie.getBox().getBaseHeight() + (index * 5.5F)), column == 0 ? new PixelConstrain(38).setInverted() : null, null));
return comp;
}
protected ButtonComponent createButton(int index, String name)
{
ButtonComponent button = new ButtonComponent(name, ColorUtils.GRAY);
button.getText().setTextScale(0.3F);
button.addChangeListener(minimizedListener).addUserActionListener(T -> setProfiler(getProfiler(index), getRoot(index)));
addChild(button, new Constrains(new RelativeConstrain(index * 0.3333F), new PixelConstrain(8F).setInverted(), new RelativeConstrain(0.3333F), new PixelConstrain(7F)));
return button;
}
}