Markers draw code refactor, minor text marker control changes

This commit is contained in:
ApsZoldat 2023-12-12 22:40:33 +03:00
parent 4802076bf8
commit 5830259e41
6 changed files with 81 additions and 154 deletions

View File

@ -2480,7 +2480,7 @@ lenum.getblock = Fetch a building, floor and type at coordinates.\nUnit must be
lenum.within = Check if unit is near a position.
lenum.boost = Start/stop boosting.
lenum.text = Set marker text, if applicable to marker's type.\nIf printFlush is set to true, consumes text buffer content as text argument.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle.
lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fetch is set to true, tries to fetch properties from map locale bundle or game's bundle.
lenum.texture = Texture name straight from game's texture atlas (using kebab-case naming style).\nIf printFlush is set to true, consumes text buffer content as text argument.
lenum.texturesize = Size of texture in tiles. Zero value scales marker width to original texture's size.
lenum.autoscale = Whether to scale marker corresponding to player's zoom level.

View File

@ -637,8 +637,9 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
protected boolean hidden = false;
/** On which z-sorting layer is marker drawn. */
protected float drawLayer = Layer.overlayUI;
/** Called in the main renderer */
/** Draws the marker. Actual marker position and scale are calculated in {@link #drawWorld()} and {@link #drawMinimap(MinimapRenderer)}. */
public void baseDraw(float x, float y, float scaleFactor){}
/** Called in the main renderer. */
public void drawWorld(){}
/** Called in the small and large map. */
public void drawMinimap(MinimapRenderer minimap){}
@ -734,19 +735,15 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public ShapeTextMarker(){}
@Override
public void drawWorld(){
if(hidden || minimap) return;
public void baseDraw(float x, float y, float scaleFactor){
//in case some idiot decides to make 9999999 sides and freeze the game
int sides = Math.min(this.sides, 200);
float scl = autoscale ? 4f / renderer.getDisplayScale() : 1f;
Draw.z(drawLayer);
Lines.stroke(3f * scl, Pal.gray);
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scl, rotation);
Lines.stroke(scl, color);
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scl, rotation);
Lines.stroke(3f * scaleFactor, Pal.gray);
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
Lines.stroke(scaleFactor, color);
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
Draw.reset();
if(fetchedText == null){
@ -756,35 +753,18 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
// font size cannot be 0
if(Mathf.equal(fontSize, 0f)) return;
WorldLabel.drawAt(fetchedText, pos.x, pos.y + radius * scl + textHeight * scl, drawLayer, flags, fontSize * scl);
WorldLabel.drawAt(fetchedText, x, y + radius * scaleFactor + textHeight * scaleFactor, drawLayer, flags, fontSize * scaleFactor);
}
@Override
public void drawWorld(){
baseDraw(pos.x, pos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
}
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden || !this.minimap) return;
//in case some idiot decides to make 9999999 sides and freeze the game
int sides = Math.min(this.sides, 200);
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
float rad = minimap.scale(radius, autoscale);
Draw.z(drawLayer);
Lines.stroke(minimap.scale(3f, autoscale), Pal.gray);
Lines.poly(Tmp.v1.x, Tmp.v1.y, sides, rad + 1f, rotation);
Lines.stroke(minimap.scale(1f, autoscale), color);
Lines.poly(Tmp.v1.x, Tmp.v1.y, sides, rad + 1f, rotation);
Draw.reset();
if(fetchedText == null){
fetchedText = fetchText(text);
}
// font size cannot be 0
if(Mathf.equal(fontSize, 0f)) return;
WorldLabel.drawAt(fetchedText, Tmp.v1.x, Tmp.v1.y + rad + minimap.scale(textHeight, autoscale), drawLayer, flags, minimap.scale(fontSize, autoscale));
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
}
@Override
@ -861,6 +841,18 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public MinimapMarker(){}
@Override
public void baseDraw(float x, float y, float scaleFactor){
float rad = radius * tilesize * scaleFactor;
float fin = Interp.pow2Out.apply((Time.globalTime / 100f) % 1f);
Draw.z(drawLayer);
Lines.stroke(Scl.scl((1f - fin) * stroke + 0.1f), color);
Lines.circle(x, y, rad * fin);
Draw.reset();
}
@Override
public void drawWorld(){
minimap = true;
@ -868,18 +860,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden) return;
minimap.transform(Tmp.v1.set(pos.x * tilesize, pos.y * tilesize));
float rad = minimap.scale(radius * tilesize, autoscale);
float fin = Interp.pow2Out.apply((Time.globalTime / 100f) % 1f);
Draw.z(drawLayer);
Lines.stroke(Scl.scl((1f - fin) * stroke + 0.1f), color);
Lines.circle(Tmp.v1.x, Tmp.v1.y, rad * fin);
Draw.reset();
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
}
@Override
@ -926,57 +908,36 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public ShapeMarker(){}
@Override
public void drawWorld(){
if(hidden || minimap) return;
public void baseDraw(float x, float y, float scaleFactor){
//in case some idiot decides to make 9999999 sides and freeze the game
int sides = Math.min(this.sides, 200);
float scl = autoscale ? 4f / renderer.getDisplayScale() : 1f;
Draw.z(drawLayer);
if(!fill){
if(outline){
Lines.stroke((stroke + 2f) * scl, Pal.gray);
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scl, rotation);
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
}
Lines.stroke(stroke * scl, color);
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scl, rotation);
Lines.stroke(stroke * scaleFactor, color);
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
}else{
Draw.color(color);
Fill.poly(pos.x, pos.y, sides, radius * scl, rotation);
Fill.poly(x, y, sides, radius * scaleFactor, rotation);
}
Draw.reset();
}
@Override
public void drawWorld(){
baseDraw(pos.x, pos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
}
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden || !this.minimap) return;
//in case some idiot decides to make 9999999 sides and freeze the game
int sides = Math.min(this.sides, 200);
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
float rad = minimap.scale(radius, autoscale);
Draw.z(drawLayer);
if(!fill){
if(outline){
Lines.stroke(minimap.scale(stroke + 2f, autoscale), Pal.gray);
Lines.poly(Tmp.v1.x, Tmp.v1.y, sides, minimap.scale(radius + 1f, autoscale), rotation);
}
Lines.stroke(stroke, color);
Lines.poly(Tmp.v1.x, Tmp.v1.y, sides, minimap.scale(radius + 1f, autoscale), rotation);
}else{
Draw.color(color);
Fill.poly(Tmp.v1.x, Tmp.v1.y, sides, minimap.scale(radius, autoscale), rotation);
}
Draw.reset();
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
}
@Override
@ -1035,35 +996,26 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public TextMarker(){}
@Override
public void drawWorld(){
public void baseDraw(float x, float y, float scaleFactor){
// font size cannot be 0
if(hidden || Mathf.equal(fontSize, 0f) || minimap) return;
if(Mathf.equal(fontSize, 0f)) return;
if(fetchedText == null){
fetchedText = fetchText(text);
}
float scl = autoscale ? 4f / renderer.getDisplayScale() : 1f;
WorldLabel.drawAt(fetchedText, x, y, drawLayer, flags, fontSize * scaleFactor);
}
WorldLabel.drawAt(fetchedText, pos.x, pos.y, drawLayer, flags, fontSize * scl);
@Override
public void drawWorld(){
baseDraw(pos.x, pos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
}
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden || !this.minimap) return;
float size = minimap.scale(fontSize, autoscale);
// font size cannot be 0
if(Mathf.equal(fontSize, 0f)) return;
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
if(fetchedText == null){
fetchedText = fetchText(text);
}
WorldLabel.drawAt(fetchedText, Tmp.v1.x, Tmp.v1.y, drawLayer, flags, size);
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
}
@Override
@ -1129,37 +1081,27 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
public LineMarker(){}
@Override
public void drawWorld(){
if(hidden || minimap) return;
float scl = autoscale ? 4f / renderer.getDisplayScale() : 1f;
public void baseLineDraw(float x1, float y1, float x2, float y2, float scaleFactor){
Draw.z(drawLayer);
if(outline){
Lines.stroke((stroke + 2f) * scl, Pal.gray);
Lines.line(pos1.x, pos1.y, pos2.x, pos2.y);
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
Lines.line(x1, y1, x2, y2);
}
Lines.stroke(stroke * scl, color);
Lines.line(pos1.x, pos1.y, pos2.x, pos2.y);
Lines.stroke(stroke * scaleFactor, color);
Lines.line(x1, y1, x2, y2);
}
@Override
public void drawWorld(){
baseLineDraw(pos1.x, pos1.y, pos1.x, pos2.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
}
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden || !this.minimap) return;
minimap.transform(Tmp.v1.set(pos1.x + 4f, pos1.y + 4f));
minimap.transform(Tmp.v2.set(pos2.x + 4f, pos2.y + 4f));
Draw.z(drawLayer);
if(outline){
Lines.stroke(minimap.scale(stroke + 2f, autoscale), Pal.gray);
Lines.line(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
}
Lines.stroke(minimap.scale(stroke, autoscale), color);
Lines.line(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y);
baseLineDraw(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, minimap.getScaleFactor(autoscale));
}
@Override
@ -1222,8 +1164,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
}
@Override
public void drawWorld(){
if(hidden || textureName.isEmpty() || minimap) return;
public void baseDraw(float x, float y, float scaleFactor){
if(textureName.isEmpty()) return;
if(fetchedRegion == null) fetchedRegion = Core.atlas.find(textureName);
@ -1231,38 +1173,25 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
if(Mathf.equal(width, 0f)) width = fetchedRegion.width * fetchedRegion.scl() * Draw.xscl;
if(Mathf.equal(height, 0f)) height = fetchedRegion.height * fetchedRegion.scl() * Draw.yscl;
float scl = autoscale ? 4f / renderer.getDisplayScale() : 1f;
Draw.z(drawLayer);
if(fetchedRegion.found()){
Draw.color(color);
Draw.rect(fetchedRegion, pos.x, pos.y, width * scl, height * scl, rotation);
Draw.rect(fetchedRegion, x, y, width * scaleFactor, height * scaleFactor, rotation);
}else{
Draw.color(Color.white);
Draw.rect("error", pos.x, pos.y, width * scl, height * scl, rotation);
Draw.rect("error", x, y, width * scaleFactor, height * scaleFactor, rotation);
}
}
@Override
public void drawWorld(){
baseDraw(pos.x, pos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
}
@Override
public void drawMinimap(MinimapRenderer minimap){
if(hidden || textureName.isEmpty() || !this.minimap) return;
if(fetchedRegion == null) fetchedRegion = Core.atlas.find(textureName);
// Zero width/height scales marker to original texture's size
if(Mathf.equal(width, 0f)) width = fetchedRegion.width * fetchedRegion.scl() * Draw.xscl;
if(Mathf.equal(height, 0f)) height = fetchedRegion.height * fetchedRegion.scl() * Draw.yscl;
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
Draw.z(drawLayer);
if(fetchedRegion.found()){
Draw.color(color);
Draw.rect(fetchedRegion, Tmp.v1.x, Tmp.v1.y, minimap.scale(width, autoscale), minimap.scale(height, autoscale), rotation);
}else{
Draw.color(Color.white);
Draw.rect("error", Tmp.v1.x, Tmp.v1.y, minimap.scale(width, autoscale), minimap.scale(height, autoscale), rotation);
}
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
}
@Override

View File

@ -302,13 +302,14 @@ public class MinimapRenderer{
}
public float scale(float radius){
return scale(radius, false);
return worldSpace ? (radius / (baseSize / 2f)) * 5f * lastScl : lastW / rect.width * radius;
}
public float scale(float radius, boolean zoomAutoScale){
public float getScaleFactor(boolean zoomAutoScale){
if(!zoomAutoScale){
return worldSpace ? (radius / (baseSize / 2f)) * 5f * lastScl : lastW / rect.width * radius;
return worldSpace ? (1 / (baseSize / 2f)) * 5f * lastScl : lastW / rect.width;
}else{
return worldSpace ? (radius / (baseSize / 2f)) * 5f : lastW / 256f * radius;
return worldSpace ? (1 / (baseSize / 2f)) * 5f : lastW / 256f;
}
}

View File

@ -1987,13 +1987,9 @@ public class LExecutor{
var marker = state.markers.get(exec.numi(id));
if(marker == null) return;
if(type == LMarkerControl.text){
if(exec.bool(p1)){
marker.setText(exec.textBuffer.toString(), exec.bool(p3));
exec.textBuffer.setLength(0);
}else{
marker.setText((exec.obj(p2) != null ? exec.obj(p2).toString() : "null"), exec.bool(p3));
}
if(type == LMarkerControl.flushText){
marker.setText(exec.textBuffer.toString(), exec.bool(p1));
exec.textBuffer.setLength(0);
}else if(type == LMarkerControl.texture){
if(exec.bool(p1)){
marker.setTexture(exec.textBuffer.toString());
@ -2058,7 +2054,7 @@ public class LExecutor{
public static void updateMarkerText(int id, LMarkerControl type, boolean fetch, String text){
var marker = state.markers.get(id);
if(marker != null){
if(type == LMarkerControl.text){
if(type == LMarkerControl.flushText){
marker.setText(text, fetch);
}
}

View File

@ -13,7 +13,7 @@ public enum LMarkerControl{
stroke("stroke"),
rotation("rotation"),
shape("sides", "fill", "outline"),
text("printFlush", "text", "fetch"),
flushText("fetch"),
fontSize("size"),
textHeight("height"),
labelFlags("background", "outline"),

View File

@ -2000,6 +2000,7 @@ public class LStatements{
t.setColor(table.color);
fields(t, type.params[i], i == 0 ? p1 : i == 1 ? p2 : p3, i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : v -> p3 = v).width(100f);
if(type == LMarkerControl.color){
col(t, p1, res -> {
p1 = "%" + res.toString().substring(0, res.a >= 1f ? 6 : 8);