update markers (#9506)
* update markers * update markers & minimap rendering
This commit is contained in:
@@ -682,10 +682,11 @@ objective.commandmode.name = Command Mode
|
|||||||
objective.flag.name = Flag
|
objective.flag.name = Flag
|
||||||
|
|
||||||
marker.shapetext.name = Shape Text
|
marker.shapetext.name = Shape Text
|
||||||
marker.minimap.name = Minimap
|
marker.point.name = Point
|
||||||
marker.shape.name = Shape
|
marker.shape.name = Shape
|
||||||
marker.text.name = Text
|
marker.text.name = Text
|
||||||
marker.line.name = Line
|
marker.line.name = Line
|
||||||
|
marker.quad.name = Quad
|
||||||
|
|
||||||
marker.background = Background
|
marker.background = Background
|
||||||
marker.outline = Outline
|
marker.outline = Outline
|
||||||
@@ -2485,3 +2486,6 @@ lenum.flushtext = Flush print buffer's content to marker, if applicable.\nIf fet
|
|||||||
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.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.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.
|
lenum.autoscale = Whether to scale marker corresponding to player's zoom level.
|
||||||
|
lenum.posi = Indexed position, used for line and quad markers with index zero being the first position.
|
||||||
|
lenum.uvi = Texture's position ranging from zero to one, used for quad markers.
|
||||||
|
lenum.colori = Indexed position, used for line and quad markers with index zero being the first color.
|
||||||
|
|||||||
@@ -372,18 +372,20 @@ public class Renderer implements ApplicationListener{
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float scaleFactor = 4f / renderer.getDisplayScale();
|
||||||
|
|
||||||
//draw objective markers
|
//draw objective markers
|
||||||
state.rules.objectives.eachRunning(obj -> {
|
state.rules.objectives.eachRunning(obj -> {
|
||||||
for(var marker : obj.markers){
|
for(var marker : obj.markers){
|
||||||
if(!marker.minimap){
|
if(marker.world){
|
||||||
marker.drawWorld();
|
marker.draw(marker.autoscale ? scaleFactor : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for(var marker : state.markers){
|
for(var marker : state.markers){
|
||||||
if(!marker.isHidden() && !marker.minimap){
|
if(marker.world){
|
||||||
marker.drawWorld();
|
marker.draw(marker.autoscale ? scaleFactor : 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -246,6 +246,38 @@ public class MapObjectivesDialog extends BaseDialog{
|
|||||||
show();
|
show();
|
||||||
}});
|
}});
|
||||||
|
|
||||||
|
setInterpreter(Vertices.class, float[].class, (cont, name, type, field, remover, indexer, get, set) -> cont.table(main -> {
|
||||||
|
float[] data = get.get();
|
||||||
|
|
||||||
|
name(cont, name, remover, indexer);
|
||||||
|
cont.table(t -> {
|
||||||
|
t.left().defaults().left();
|
||||||
|
|
||||||
|
String[] names = {"x", "y", "color", "u", "v"};
|
||||||
|
int stride = 6;
|
||||||
|
int vertices = data.length / stride;
|
||||||
|
|
||||||
|
for(int i = 0; i < vertices; i++){
|
||||||
|
int offset = i * stride;
|
||||||
|
|
||||||
|
t.table(row -> {
|
||||||
|
for(int j = 0; j < names.length; j++){
|
||||||
|
int index = offset + j;
|
||||||
|
|
||||||
|
if("color".equals(names[j])) {
|
||||||
|
getInterpreter(Color.class).build(row, names[j], new TypeInfo(Color.class), null, null, null, () -> new Color().abgr8888(data[index]), value -> data[index] = value.toFloatBits());
|
||||||
|
}else{
|
||||||
|
float scale = j <= 1 ? tilesize : 1;
|
||||||
|
getInterpreter(float.class).build(row, names[j], new TypeInfo(float.class), null, null, null, () -> data[index] / scale, value -> data[index] = value * scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
row.add().pad(4);
|
||||||
|
}
|
||||||
|
}).row();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
|
||||||
// Types that use the default interpreter. It would be nice if all types could use it, but I don't know how to reliably prevent classes like [? extends Content] from using it.
|
// Types that use the default interpreter. It would be nice if all types could use it, but I don't know how to reliably prevent classes like [? extends Content] from using it.
|
||||||
for(var obj : MapObjectives.allObjectiveTypes) setInterpreter(obj.get().getClass(), defaultInterpreter());
|
for(var obj : MapObjectives.allObjectiveTypes) setInterpreter(obj.get().getClass(), defaultInterpreter());
|
||||||
for(var mark : MapObjectives.allMarkerTypes) setInterpreter(mark.get().getClass(), defaultInterpreter());
|
for(var mark : MapObjectives.allMarkerTypes) setInterpreter(mark.get().getClass(), defaultInterpreter());
|
||||||
@@ -290,10 +322,12 @@ public class MapObjectivesDialog extends BaseDialog{
|
|||||||
t.button(Icon.downOpen, Styles.emptyi, () -> indexer.get(false)).fill().padRight(4f);
|
t.button(Icon.downOpen, Styles.emptyi, () -> indexer.get(false)).fill().padRight(4f);
|
||||||
}
|
}
|
||||||
|
|
||||||
t.button(Icon.add, Styles.emptyi, () -> getProvider(type.element.raw).get(type.element, res -> {
|
if(!field.isAnnotationPresent(Immutable.class)) {
|
||||||
arr.add(res);
|
t.button(Icon.add, Styles.emptyi, () -> getProvider(type.element.raw).get(type.element, res -> {
|
||||||
rebuild[0].run();
|
arr.add(res);
|
||||||
})).fill();
|
rebuild[0].run();
|
||||||
|
})).fill();
|
||||||
|
}
|
||||||
}).growX().height(46f).pad(0f, -10f, 0f, -10f).get();
|
}).growX().height(46f).pad(0f, -10f, 0f, -10f).get();
|
||||||
|
|
||||||
main.row().table(Tex.button, t -> rebuild[0] = () -> {
|
main.row().table(Tex.button, t -> rebuild[0] = () -> {
|
||||||
@@ -312,10 +346,10 @@ public class MapObjectivesDialog extends BaseDialog{
|
|||||||
|
|
||||||
getInterpreter((Class<Object>)arr.get(index).getClass()).build(
|
getInterpreter((Class<Object>)arr.get(index).getClass()).build(
|
||||||
t, "", new TypeInfo(arr.get(index).getClass()),
|
t, "", new TypeInfo(arr.get(index).getClass()),
|
||||||
field, () -> {
|
field, field == null || !field.isAnnotationPresent(Immutable.class) ? () -> {
|
||||||
arr.remove(index);
|
arr.remove(index);
|
||||||
rebuild[0].run();
|
rebuild[0].run();
|
||||||
}, field == null || !field.isAnnotationPresent(Unordered.class) ? in -> {
|
} : null, field == null || !field.isAnnotationPresent(Unordered.class) ? in -> {
|
||||||
if(in && index > 0){
|
if(in && index > 0){
|
||||||
arr.swap(index, index - 1);
|
arr.swap(index, index - 1);
|
||||||
rebuild[0].run();
|
rebuild[0].run();
|
||||||
|
|||||||
@@ -61,12 +61,15 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
|
|
||||||
registerMarker(
|
registerMarker(
|
||||||
ShapeTextMarker::new,
|
ShapeTextMarker::new,
|
||||||
MinimapMarker::new,
|
PointMarker::new,
|
||||||
ShapeMarker::new,
|
ShapeMarker::new,
|
||||||
TextMarker::new,
|
TextMarker::new,
|
||||||
LineMarker::new,
|
LineMarker::new,
|
||||||
TextureMarker::new
|
TextureMarker::new,
|
||||||
|
QuadMarker::new
|
||||||
);
|
);
|
||||||
|
|
||||||
|
registerLegacyMarker("Minimap", PointMarker::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SafeVarargs
|
@SafeVarargs
|
||||||
@@ -96,6 +99,15 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void registerLegacyMarker(String name, Prov<? extends ObjectiveMarker> prov) {
|
||||||
|
Class<?> type = prov.get().getClass();
|
||||||
|
|
||||||
|
markerNameToType.put(name, prov);
|
||||||
|
markerNameToType.put(Strings.camelize(name), prov);
|
||||||
|
JsonIO.classTag(Strings.camelize(name), type);
|
||||||
|
JsonIO.classTag(name, type);
|
||||||
|
}
|
||||||
|
|
||||||
/** Adds all given objectives to the executor as root objectives. */
|
/** Adds all given objectives to the executor as root objectives. */
|
||||||
public void add(MapObjective... objectives){
|
public void add(MapObjective... objectives){
|
||||||
for(var objective : objectives) flatten(objective);
|
for(var objective : objectives) flatten(objective);
|
||||||
@@ -617,38 +629,26 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
/** Internal use only! Do not access. */
|
/** Internal use only! Do not access. */
|
||||||
public transient int arrayIndex;
|
public transient int arrayIndex;
|
||||||
|
|
||||||
/** Whether to display marker on minimap instead of world. {@link MinimapMarker} ignores this value. */
|
/** Whether to display marker in the world. */
|
||||||
|
public boolean world = true;
|
||||||
|
/** Whether to display marker on minimap. */
|
||||||
public boolean minimap = false;
|
public boolean minimap = false;
|
||||||
/** Whether to scale marker corresponding to player's zoom level. {@link MinimapMarker} ignores this value. */
|
/** Whether to scale marker corresponding to player's zoom level. */
|
||||||
public boolean autoscale = false;
|
public boolean autoscale = false;
|
||||||
/** Hides the marker, used by world processors. */
|
|
||||||
protected boolean hidden = false;
|
|
||||||
/** On which z-sorting layer is marker drawn. */
|
/** On which z-sorting layer is marker drawn. */
|
||||||
protected float drawLayer = Layer.overlayUI;
|
protected float drawLayer = Layer.overlayUI;
|
||||||
|
|
||||||
/** Draws the marker. Actual marker position and scale are calculated in {@link #drawWorld()} and {@link #drawMinimap(MinimapRenderer)}. */
|
public void draw(float scaleFactor){}
|
||||||
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){}
|
|
||||||
|
|
||||||
/** Whether the marker is hidden */
|
|
||||||
public boolean isHidden(){
|
|
||||||
return hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Control marker with world processor code. Ignores NaN (null) values. */
|
/** Control marker with world processor code. Ignores NaN (null) values. */
|
||||||
public void control(LMarkerControl type, double p1, double p2, double p3){
|
public void control(LMarkerControl type, double p1, double p2, double p3){
|
||||||
if(Double.isNaN(p1)) return;
|
if(Double.isNaN(p1)) return;
|
||||||
|
|
||||||
switch(type){
|
switch(type){
|
||||||
case visibility -> hidden = Mathf.equal((float)p1, 0f);
|
case world -> world = !Mathf.equal((float)p1, 0f);
|
||||||
case drawLayer -> drawLayer = (float)p1;
|
|
||||||
case minimap -> minimap = !Mathf.equal((float)p1, 0f);
|
case minimap -> minimap = !Mathf.equal((float)p1, 0f);
|
||||||
case autoscale -> autoscale = !Mathf.equal((float)p1, 0f);
|
case autoscale -> autoscale = !Mathf.equal((float)p1, 0f);
|
||||||
|
case drawLayer -> drawLayer = (float)p1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -688,19 +688,6 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
/** Position of marker, in world coordinates */
|
/** Position of marker, in world coordinates */
|
||||||
public @TilePos Vec2 pos = new Vec2();
|
public @TilePos Vec2 pos = new Vec2();
|
||||||
|
|
||||||
/** Called in the main renderer. */
|
|
||||||
@Override
|
|
||||||
public void drawWorld(){
|
|
||||||
baseDraw(pos.x, pos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Called in the small and large map. */
|
|
||||||
@Override
|
|
||||||
public void drawMinimap(MinimapRenderer minimap){
|
|
||||||
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
|
|
||||||
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void control(LMarkerControl type, double p1, double p2, double p3){
|
public void control(LMarkerControl type, double p1, double p2, double p3){
|
||||||
super.control(type, p1, p2, p3);
|
super.control(type, p1, p2, p3);
|
||||||
@@ -761,15 +748,15 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
public ShapeTextMarker(){}
|
public ShapeTextMarker(){}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void baseDraw(float x, float y, float scaleFactor){
|
public void draw(float scaleFactor){
|
||||||
//in case some idiot decides to make 9999999 sides and freeze the game
|
//in case some idiot decides to make 9999999 sides and freeze the game
|
||||||
int sides = Math.min(this.sides, 300);
|
int sides = Math.min(this.sides, 300);
|
||||||
|
|
||||||
Draw.z(drawLayer);
|
Draw.z(drawLayer);
|
||||||
Lines.stroke(3f * scaleFactor, Pal.gray);
|
Lines.stroke(3f * scaleFactor, Pal.gray);
|
||||||
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
|
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scaleFactor, rotation);
|
||||||
Lines.stroke(scaleFactor, color);
|
Lines.stroke(scaleFactor, color);
|
||||||
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
|
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scaleFactor, rotation);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
if(fetchedText == null){
|
if(fetchedText == null){
|
||||||
@@ -779,7 +766,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
// font size cannot be 0
|
// font size cannot be 0
|
||||||
if(Mathf.equal(fontSize, 0f)) return;
|
if(Mathf.equal(fontSize, 0f)) return;
|
||||||
|
|
||||||
WorldLabel.drawAt(fetchedText, x, y + radius * scaleFactor + textHeight * scaleFactor, drawLayer, flags, fontSize * scaleFactor);
|
WorldLabel.drawAt(fetchedText, pos.x, pos.y + radius * scaleFactor + textHeight * scaleFactor, drawLayer, flags, fontSize * scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -799,7 +786,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
}
|
}
|
||||||
case radius -> radius = (float)p1;
|
case radius -> radius = (float)p1;
|
||||||
case rotation -> rotation = (float)p1;
|
case rotation -> rotation = (float)p1;
|
||||||
case color -> color.set(Tmp.c1.fromDouble(p1));
|
case color -> color.fromDouble(p1);
|
||||||
case shape -> sides = (int)p1;
|
case shape -> sides = (int)p1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -828,72 +815,50 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Displays a circle on the minimap. */
|
/** Displays a circle in the world. */
|
||||||
public static class MinimapMarker extends ObjectiveMarker{
|
public static class PointMarker extends PosMarker{
|
||||||
public Point2 pos = new Point2();
|
|
||||||
public float radius = 5f, stroke = 11f;
|
public float radius = 5f, stroke = 11f;
|
||||||
public Color color = Color.valueOf("f25555");
|
public Color color = Color.valueOf("f25555");
|
||||||
|
|
||||||
public MinimapMarker(int x, int y){
|
public PointMarker(int x, int y){
|
||||||
this.pos.set(x, y);
|
this.pos.set(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinimapMarker(int x, int y, Color color){
|
public PointMarker(int x, int y, Color color){
|
||||||
this.pos.set(x, y);
|
this.pos.set(x, y);
|
||||||
this.color = color;
|
this.color = color;
|
||||||
minimap = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinimapMarker(int x, int y, float radius, float stroke, Color color){
|
public PointMarker(int x, int y, float radius, float stroke, Color color){
|
||||||
this.pos.set(x, y);
|
this.pos.set(x, y);
|
||||||
this.stroke = stroke;
|
this.stroke = stroke;
|
||||||
this.radius = radius;
|
this.radius = radius;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
minimap = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinimapMarker(){}
|
public PointMarker(){}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void baseDraw(float x, float y, float scaleFactor){
|
public void draw(float scaleFactor){
|
||||||
float rad = radius * tilesize * scaleFactor;
|
float rad = radius * tilesize * scaleFactor;
|
||||||
float fin = Interp.pow2Out.apply((Time.globalTime / 100f) % 1f);
|
float fin = Interp.pow2Out.apply((Time.globalTime / 100f) % 1f);
|
||||||
|
|
||||||
Draw.z(drawLayer);
|
Draw.z(drawLayer);
|
||||||
Lines.stroke(Scl.scl((1f - fin) * stroke + 0.1f), color);
|
Lines.stroke(Scl.scl((1f - fin) * stroke + 0.1f), color);
|
||||||
Lines.circle(x, y, rad * fin);
|
Lines.circle(pos.x, pos.y, rad * fin);
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawWorld(){
|
|
||||||
minimap = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawMinimap(MinimapRenderer minimap){
|
|
||||||
minimap.transform(Tmp.v1.set(pos.x * tilesize, pos.y * tilesize));
|
|
||||||
baseDraw(Tmp.v1.x, Tmp.v1.y, minimap.getScaleFactor(autoscale));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void control(LMarkerControl type, double p1, double p2, double p3){
|
public void control(LMarkerControl type, double p1, double p2, double p3){
|
||||||
super.control(type, p1, p2, p3);
|
super.control(type, p1, p2, p3);
|
||||||
|
|
||||||
if(!Double.isNaN(p1)){
|
if(!Double.isNaN(p1)){
|
||||||
switch(type){
|
switch(type){
|
||||||
case pos -> pos.x = (int)p1;
|
|
||||||
case radius -> radius = (float)p1;
|
case radius -> radius = (float)p1;
|
||||||
case stroke -> stroke = (float)p1;
|
case stroke -> stroke = (float)p1;
|
||||||
case color -> color.set(Tmp.c1.fromDouble(p1));
|
case color -> color.fromDouble(p1);
|
||||||
case minimap -> minimap = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!Double.isNaN(p2)){
|
|
||||||
if(type == LMarkerControl.pos){
|
|
||||||
pos.y = (int)p2;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -919,7 +884,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
public ShapeMarker(){}
|
public ShapeMarker(){}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void baseDraw(float x, float y, float scaleFactor){
|
public void draw(float scaleFactor){
|
||||||
//in case some idiot decides to make 9999999 sides and freeze the game
|
//in case some idiot decides to make 9999999 sides and freeze the game
|
||||||
int sides = Math.min(this.sides, 200);
|
int sides = Math.min(this.sides, 200);
|
||||||
|
|
||||||
@@ -927,14 +892,14 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
if(!fill){
|
if(!fill){
|
||||||
if(outline){
|
if(outline){
|
||||||
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
|
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
|
||||||
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
|
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scaleFactor, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
Lines.stroke(stroke * scaleFactor, color);
|
Lines.stroke(stroke * scaleFactor, color);
|
||||||
Lines.poly(x, y, sides, (radius + 1f) * scaleFactor, rotation);
|
Lines.poly(pos.x, pos.y, sides, (radius + 1f) * scaleFactor, rotation);
|
||||||
}else{
|
}else{
|
||||||
Draw.color(color);
|
Draw.color(color);
|
||||||
Fill.poly(x, y, sides, radius * scaleFactor, rotation);
|
Fill.poly(pos.x, pos.y, sides, radius * scaleFactor, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
@@ -949,7 +914,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
case radius -> radius = (float)p1;
|
case radius -> radius = (float)p1;
|
||||||
case stroke -> stroke = (float)p1;
|
case stroke -> stroke = (float)p1;
|
||||||
case rotation -> rotation = (float)p1;
|
case rotation -> rotation = (float)p1;
|
||||||
case color -> color.set(Tmp.c1.fromDouble(p1));
|
case color -> color.fromDouble(p1);
|
||||||
case shape -> sides = (int)p1;
|
case shape -> sides = (int)p1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -991,7 +956,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
public TextMarker(){}
|
public TextMarker(){}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void baseDraw(float x, float y, float scaleFactor){
|
public void draw(float scaleFactor){
|
||||||
// font size cannot be 0
|
// font size cannot be 0
|
||||||
if(Mathf.equal(fontSize, 0f)) return;
|
if(Mathf.equal(fontSize, 0f)) return;
|
||||||
|
|
||||||
@@ -999,7 +964,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
fetchedText = fetchText(text);
|
fetchedText = fetchText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldLabel.drawAt(fetchedText, x, y, drawLayer, flags, fontSize * scaleFactor);
|
WorldLabel.drawAt(fetchedText, pos.x, pos.y, drawLayer, flags, fontSize * scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1048,7 +1013,8 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
public @TilePos Vec2 endPos = new Vec2();
|
public @TilePos Vec2 endPos = new Vec2();
|
||||||
public float stroke = 1f;
|
public float stroke = 1f;
|
||||||
public boolean outline = true;
|
public boolean outline = true;
|
||||||
public Color color = Color.valueOf("ffd37f");
|
public Color color1 = Color.valueOf("ffd37f");
|
||||||
|
public Color color2 = Color.valueOf("ffd37f");
|
||||||
|
|
||||||
public LineMarker(float x1, float y1, float x2, float y2, float stroke){
|
public LineMarker(float x1, float y1, float x2, float y2, float stroke){
|
||||||
this.stroke = stroke;
|
this.stroke = stroke;
|
||||||
@@ -1063,27 +1029,16 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
|
|
||||||
public LineMarker(){}
|
public LineMarker(){}
|
||||||
|
|
||||||
public void baseLineDraw(float x1, float y1, float x2, float y2, float scaleFactor){
|
@Override
|
||||||
|
public void draw(float scaleFactor){
|
||||||
Draw.z(drawLayer);
|
Draw.z(drawLayer);
|
||||||
if(outline){
|
if(outline){
|
||||||
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
|
Lines.stroke((stroke + 2f) * scaleFactor, Pal.gray);
|
||||||
Lines.line(x1, y1, x2, y2);
|
Lines.line(pos.x, pos.y, endPos.x, endPos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
Lines.stroke(stroke * scaleFactor, color);
|
Lines.stroke(stroke * scaleFactor, Color.white);
|
||||||
Lines.line(x1, y1, x2, y2);
|
Lines.line(pos.x, pos.y, color1, endPos.x, endPos.y, color2);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawWorld(){
|
|
||||||
baseLineDraw(pos.x, pos.y, endPos.x, endPos.y, autoscale ? 4f / renderer.getDisplayScale() : 1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawMinimap(MinimapRenderer minimap){
|
|
||||||
minimap.transform(Tmp.v1.set(pos.x + 4f, pos.y + 4f));
|
|
||||||
minimap.transform(Tmp.v2.set(endPos.x + 4f, endPos.y + 4f));
|
|
||||||
baseLineDraw(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, minimap.getScaleFactor(autoscale));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1094,7 +1049,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
switch(type){
|
switch(type){
|
||||||
case endPos -> endPos.x = (float)p1 * tilesize;
|
case endPos -> endPos.x = (float)p1 * tilesize;
|
||||||
case stroke -> stroke = (float)p1;
|
case stroke -> stroke = (float)p1;
|
||||||
case color -> color.set(Tmp.c1.fromDouble(p1));
|
case color -> color1.set(color2.fromDouble(p1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1103,6 +1058,19 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
case endPos -> endPos.y = (float)p2 * tilesize;
|
case endPos -> endPos.y = (float)p2 * tilesize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!Double.isNaN(p1) && !Double.isNaN(p2)){
|
||||||
|
switch (type){
|
||||||
|
case posi -> ((int)p1 == 0 ? pos : (int)p1 == 1 ? endPos : Tmp.v1).x = (float)p2 * tilesize;
|
||||||
|
case colori -> ((int)p1 == 0 ? color1 : (int)p1 == 1 ? color2 : Tmp.c1).fromDouble(p2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Double.isNaN(p1) && !Double.isNaN(p3)){
|
||||||
|
switch(type){
|
||||||
|
case posi -> ((int)p1 == 0 ? pos : (int)p1 == 1 ? endPos : Tmp.v1).y = (float)p3 * tilesize;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1136,7 +1104,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
switch(type){
|
switch(type){
|
||||||
case rotation -> rotation = (float)p1;
|
case rotation -> rotation = (float)p1;
|
||||||
case textureSize -> width = (float)p1 * tilesize;
|
case textureSize -> width = (float)p1 * tilesize;
|
||||||
case color -> color.set(Tmp.c1.fromDouble(p1));
|
case color -> color.fromDouble(p1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1148,7 +1116,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void baseDraw(float x, float y, float scaleFactor){
|
public void draw(float scaleFactor){
|
||||||
if(textureName.isEmpty()) return;
|
if(textureName.isEmpty()) return;
|
||||||
|
|
||||||
if(fetchedRegion == null) setTexture(textureName);
|
if(fetchedRegion == null) setTexture(textureName);
|
||||||
@@ -1159,7 +1127,7 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
|
|
||||||
Draw.z(drawLayer);
|
Draw.z(drawLayer);
|
||||||
Draw.color(color);
|
Draw.color(color);
|
||||||
Draw.rect(fetchedRegion, x, y, width * scaleFactor, height * scaleFactor, rotation);
|
Draw.rect(fetchedRegion, pos.x, pos.y, width * scaleFactor, height * scaleFactor, rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1167,19 +1135,119 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
this.textureName = textureName;
|
this.textureName = textureName;
|
||||||
|
|
||||||
if(fetchedRegion == null) fetchedRegion = new TextureRegion();
|
if(fetchedRegion == null) fetchedRegion = new TextureRegion();
|
||||||
|
lookupRegion(textureName, fetchedRegion);
|
||||||
|
}
|
||||||
|
|
||||||
TextureRegion region = Core.atlas.find(textureName);
|
}
|
||||||
if(region.found()){
|
|
||||||
fetchedRegion.set(region);
|
public static class QuadMarker extends ObjectiveMarker{
|
||||||
}else{
|
public String textureName = "white";
|
||||||
if(Core.assets.isLoaded(textureName, Texture.class)){
|
public @Vertices float[] vertices = new float[24];
|
||||||
fetchedRegion.set(Core.assets.get(textureName, Texture.class));
|
|
||||||
}else{
|
private transient TextureRegion fetchedRegion;
|
||||||
fetchedRegion.set(Core.atlas.find("error"));
|
|
||||||
|
public QuadMarker() {
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
vertices[i * 6 + 2] = Color.white.toFloatBits();
|
||||||
|
vertices[i * 6 + 5] = Color.clearFloatBits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(float scaleFactor){
|
||||||
|
if(fetchedRegion == null) setTexture(textureName);
|
||||||
|
|
||||||
|
Draw.z(drawLayer);
|
||||||
|
Draw.vert(fetchedRegion.texture, vertices, 0, vertices.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void control(LMarkerControl type, double p1, double p2, double p3){
|
||||||
|
super.control(type, p1, p2, p3);
|
||||||
|
|
||||||
|
if(!Double.isNaN(p1)){
|
||||||
|
switch(type){
|
||||||
|
case color -> {
|
||||||
|
float col = Tmp.c1.fromDouble(p1).toFloatBits();
|
||||||
|
for(int i = 0; i < 4; i++) vertices[i * 6 + 2] = col;
|
||||||
|
}
|
||||||
|
case pos -> vertices[0] = (float)p1 * tilesize;
|
||||||
|
case posi -> setPos((int)p1, p2, p3);
|
||||||
|
case uvi -> setUv((int)p1, p2, p3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Double.isNaN(p2)){
|
||||||
|
switch(type){
|
||||||
|
case pos -> vertices[1] = (float)p1 * tilesize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Double.isNaN(p1) && !Double.isNaN(p2)){
|
||||||
|
switch(type){
|
||||||
|
case colori -> setColor((int)p1, p2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTexture(String textureName){
|
||||||
|
this.textureName = textureName;
|
||||||
|
|
||||||
|
boolean firstUpdate = fetchedRegion == null;
|
||||||
|
|
||||||
|
if(fetchedRegion == null) fetchedRegion = new TextureRegion();
|
||||||
|
Tmp.tr1.set(fetchedRegion);
|
||||||
|
|
||||||
|
lookupRegion(textureName, fetchedRegion);
|
||||||
|
|
||||||
|
if(firstUpdate) {
|
||||||
|
// possibly from the editor, we need to clamp the values
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
vertices[i * 6 + 3] = Mathf.map(Mathf.clamp(vertices[i * 6 + 3]), fetchedRegion.u, fetchedRegion.u2);
|
||||||
|
vertices[i * 6 + 4] = Mathf.map(1 - Mathf.clamp(vertices[i * 6 + 4]), fetchedRegion.v, fetchedRegion.v2);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for(int i = 0; i < 4; i++){
|
||||||
|
vertices[i * 6 + 3] = Mathf.map(vertices[i * 6 + 3], Tmp.tr1.u, Tmp.tr1.u2, fetchedRegion.u, fetchedRegion.u2);
|
||||||
|
vertices[i * 6 + 4] = Mathf.map(vertices[i * 6 + 4], Tmp.tr1.v, Tmp.tr1.v2, fetchedRegion.v, fetchedRegion.v2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPos(int i, double x, double y){
|
||||||
|
if(i >= 0 && i < 4){
|
||||||
|
if(!Double.isNaN(x)) vertices[i * 6] = (float)x * tilesize;
|
||||||
|
if(!Double.isNaN(y)) vertices[i * 6 + 1] = (float)y * tilesize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setColor(int i, double c){
|
||||||
|
if(i >= 0 && i < 4){
|
||||||
|
vertices[i * 6 + 2] = Tmp.c1.fromDouble(c).toFloatBits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setUv(int i, double u, double v){
|
||||||
|
if(i >= 0 && i < 4){
|
||||||
|
if(!Double.isNaN(u)) vertices[i * 6 + 3] = Mathf.map(Mathf.clamp((float)u), fetchedRegion.u, fetchedRegion.u2);
|
||||||
|
if(!Double.isNaN(v)) vertices[i * 6 + 4] = Mathf.map(1 - Mathf.clamp((float)v), fetchedRegion.v, fetchedRegion.v2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void lookupRegion(String name, TextureRegion out){
|
||||||
|
TextureRegion region = Core.atlas.find(name);
|
||||||
|
if(region.found()){
|
||||||
|
out.set(region);
|
||||||
|
}else{
|
||||||
|
if(Core.assets.isLoaded(name, Texture.class)){
|
||||||
|
out.set(Core.assets.get(name, Texture.class));
|
||||||
|
}else{
|
||||||
|
out.set(Core.atlas.find("error"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** For arrays or {@link Seq}s; does not create element rearrangement buttons. */
|
/** For arrays or {@link Seq}s; does not create element rearrangement buttons. */
|
||||||
@@ -1187,6 +1255,16 @@ public class MapObjectives implements Iterable<MapObjective>, Eachable<MapObject
|
|||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
public @interface Unordered{}
|
public @interface Unordered{}
|
||||||
|
|
||||||
|
/** For arrays or {@link Seq}s; does not add the new and delete buttons */
|
||||||
|
@Target(FIELD)
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface Immutable{}
|
||||||
|
|
||||||
|
/** For {@code float[]}; treats it as an array of vertices. */
|
||||||
|
@Target(FIELD)
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
public @interface Vertices{}
|
||||||
|
|
||||||
/** For {@code byte}; treats it as a world label flag. */
|
/** For {@code byte}; treats it as a world label flag. */
|
||||||
@Target(FIELD)
|
@Target(FIELD)
|
||||||
@Retention(RUNTIME)
|
@Retention(RUNTIME)
|
||||||
|
|||||||
@@ -146,16 +146,27 @@ public class MinimapRenderer{
|
|||||||
|
|
||||||
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
rect.set((dx - sz) * tilesize, (dy - sz) * tilesize, sz * 2 * tilesize, sz * 2 * tilesize);
|
||||||
|
|
||||||
|
Tmp.m2.set(Draw.trans());
|
||||||
|
|
||||||
|
var trans = Tmp.m1.idt();
|
||||||
|
trans.translate(lastX, lastY);
|
||||||
|
if(!worldSpace){
|
||||||
|
trans.scl(Tmp.v1.set(lastW / rect.width, lastH / rect.height));
|
||||||
|
trans.translate(-rect.x, -rect.y);
|
||||||
|
}else{
|
||||||
|
trans.scl(Tmp.v1.set(lastW / world.unitWidth(), lastH / world.unitHeight()));
|
||||||
|
}
|
||||||
|
trans.translate(tilesize / 2f, tilesize / 2f);
|
||||||
|
Draw.trans(trans);
|
||||||
|
|
||||||
for(Unit unit : units){
|
for(Unit unit : units){
|
||||||
if(unit.inFogTo(player.team()) || !unit.type.drawMinimap) continue;
|
if(unit.inFogTo(player.team()) || !unit.type.drawMinimap) continue;
|
||||||
|
|
||||||
float rx = !fullView ? (unit.x - rect.x) / rect.width * w : unit.x / (world.width() * tilesize) * w;
|
float scale = Scl.scl(1f) * tilesize * 3;
|
||||||
float ry = !fullView ? (unit.y - rect.y) / rect.width * h : unit.y / (world.height() * tilesize) * h;
|
var region = unit.icon();
|
||||||
|
|
||||||
Draw.mixcol(unit.team.color, 1f);
|
Draw.mixcol(unit.team.color, 1f);
|
||||||
float scale = Scl.scl(1f) / 2f * scaling * 32f;
|
Draw.rect(region, unit.x, unit.y, scale, scale * (float)region.height / region.width, unit.rotation() - 90);
|
||||||
var region = unit.icon();
|
|
||||||
Draw.rect(region, x + rx, y + ry, scale, scale * (float)region.height / region.width, unit.rotation() - 90);
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,15 +197,14 @@ public class MinimapRenderer{
|
|||||||
//crisp pixels
|
//crisp pixels
|
||||||
dynamicTex.setFilter(TextureFilter.nearest);
|
dynamicTex.setFilter(TextureFilter.nearest);
|
||||||
|
|
||||||
if(worldSpace){
|
|
||||||
region.set(0f, 0f, 1f, 1f);
|
|
||||||
}
|
|
||||||
|
|
||||||
Tmp.tr1.set(dynamicTex);
|
Tmp.tr1.set(dynamicTex);
|
||||||
Tmp.tr1.set(region.u, 1f - region.v, region.u2, 1f - region.v2);
|
Tmp.tr1.set(0f, 0f, 1f, 1f);
|
||||||
|
|
||||||
|
float wf = world.width() * tilesize;
|
||||||
|
float hf = world.height() * tilesize;
|
||||||
|
|
||||||
Draw.color(state.rules.dynamicColor, 0.5f);
|
Draw.color(state.rules.dynamicColor, 0.5f);
|
||||||
Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h);
|
Draw.rect(Tmp.tr1, wf / 2, hf / 2, wf, hf);
|
||||||
|
|
||||||
if(state.rules.staticFog){
|
if(state.rules.staticFog){
|
||||||
staticTex.setFilter(TextureFilter.nearest);
|
staticTex.setFilter(TextureFilter.nearest);
|
||||||
@@ -202,7 +212,7 @@ public class MinimapRenderer{
|
|||||||
Tmp.tr1.texture = staticTex;
|
Tmp.tr1.texture = staticTex;
|
||||||
//must be black to fit with borders
|
//must be black to fit with borders
|
||||||
Draw.color(0f, 0f, 0f, 1f);
|
Draw.color(0f, 0f, 0f, 1f);
|
||||||
Draw.rect(Tmp.tr1, x + w/2f, y + h/2f, w, h);
|
Draw.rect(Tmp.tr1, wf / 2, hf / 2, wf, hf);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.color();
|
Draw.color();
|
||||||
@@ -211,23 +221,21 @@ public class MinimapRenderer{
|
|||||||
|
|
||||||
//TODO might be useful in the standard minimap too
|
//TODO might be useful in the standard minimap too
|
||||||
if(fullView){
|
if(fullView){
|
||||||
drawSpawns(x, y, w, h, scaling);
|
drawSpawns();
|
||||||
|
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
//draw bounds for camera - not drawn on mobile because you can't shift it by tapping anyway
|
//draw bounds for camera - not drawn on mobile because you can't shift it by tapping anyway
|
||||||
Rect r = Core.camera.bounds(Tmp.r1);
|
Rect r = Core.camera.bounds(Tmp.r1);
|
||||||
Vec2 bot = transform(Tmp.v1.set(r.x, r.y));
|
|
||||||
Vec2 top = transform(Tmp.v2.set(r.x + r.width, r.y + r.height));
|
|
||||||
Lines.stroke(Scl.scl(3f));
|
Lines.stroke(Scl.scl(3f));
|
||||||
Draw.color(Pal.accent);
|
Draw.color(Pal.accent);
|
||||||
Lines.rect(bot.x,bot.y, top.x - bot.x, top.y - bot.y);
|
Lines.rect(r.x, r.y, r.width, r.height);
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LongSeq indicators = control.indicators.list();
|
LongSeq indicators = control.indicators.list();
|
||||||
float fin = ((Time.globalTime / 30f) % 1f);
|
float fin = ((Time.globalTime / 30f) % 1f);
|
||||||
float rad = scale(fin * 5f + tilesize - 2f);
|
float rad = fin * 5f + tilesize - 2f;
|
||||||
Lines.stroke(Scl.scl((1f - fin) * 4f + 0.5f));
|
Lines.stroke(Scl.scl((1f - fin) * 4f + 0.5f));
|
||||||
|
|
||||||
for(int i = 0; i < indicators.size; i++){
|
for(int i = 0; i < indicators.size; i++){
|
||||||
@@ -244,31 +252,32 @@ public class MinimapRenderer{
|
|||||||
offset = build.block.offset / tilesize;
|
offset = build.block.offset / tilesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec2 v = transform(Tmp.v1.set((ix + 0.5f + offset) * tilesize, (iy + 0.5f + offset) * tilesize));
|
|
||||||
|
|
||||||
Draw.color(Color.orange, Color.scarlet, Mathf.clamp(time / 70f));
|
Draw.color(Color.orange, Color.scarlet, Mathf.clamp(time / 70f));
|
||||||
|
|
||||||
Lines.square(v.x, v.y, rad);
|
Lines.square((ix + 0.5f + offset) * tilesize, (iy + 0.5f + offset) * tilesize, rad);
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
|
|
||||||
|
//TODO autoscale markers
|
||||||
state.rules.objectives.eachRunning(obj -> {
|
state.rules.objectives.eachRunning(obj -> {
|
||||||
for(var marker : obj.markers){
|
for(var marker : obj.markers){
|
||||||
if(marker.minimap){
|
if(marker.minimap){
|
||||||
marker.drawMinimap(this);
|
marker.draw(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for(var marker : state.markers){
|
for(var marker : state.markers){
|
||||||
if(!marker.isHidden() && marker.minimap){
|
if(marker.minimap){
|
||||||
marker.drawMinimap(this);
|
marker.draw(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Draw.trans(Tmp.m2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void drawSpawns(float x, float y, float w, float h, float scaling){
|
public void drawSpawns(){
|
||||||
if(!state.rules.showSpawns || !state.hasSpawns() || !state.rules.waves) return;
|
if(!state.rules.showSpawns || !state.hasSpawns() || !state.rules.waves) return;
|
||||||
|
|
||||||
TextureRegion icon = Icon.units.getRegion();
|
TextureRegion icon = Icon.units.getRegion();
|
||||||
@@ -277,44 +286,21 @@ public class MinimapRenderer{
|
|||||||
|
|
||||||
Draw.color(state.rules.waveTeam.color, Tmp.c2.set(state.rules.waveTeam.color).value(1.2f), Mathf.absin(Time.time, 16f, 1f));
|
Draw.color(state.rules.waveTeam.color, Tmp.c2.set(state.rules.waveTeam.color).value(1.2f), Mathf.absin(Time.time, 16f, 1f));
|
||||||
|
|
||||||
float rad = scale(state.rules.dropZoneRadius);
|
float rad = state.rules.dropZoneRadius;
|
||||||
float curve = Mathf.curve(Time.time % 240f, 120f, 240f);
|
float curve = Mathf.curve(Time.time % 240f, 120f, 240f);
|
||||||
|
|
||||||
for(Tile tile : spawner.getSpawns()){
|
for(Tile tile : spawner.getSpawns()){
|
||||||
float tx = ((tile.x + 0.5f) / world.width()) * w;
|
float tx = tile.worldx();
|
||||||
float ty = ((tile.y + 0.5f) / world.height()) * h;
|
float ty = tile.worldy();
|
||||||
|
|
||||||
Draw.rect(icon, x + tx, y + ty, icon.width, icon.height);
|
Draw.rect(icon, tx, ty, icon.width, icon.height);
|
||||||
Lines.circle(x + tx, y + ty, rad);
|
Lines.circle(tx, ty, rad);
|
||||||
if(curve > 0f) Lines.circle(x + tx, y + ty, rad * Interp.pow3Out.apply(curve));
|
if(curve > 0f) Lines.circle(tx, ty, rad * Interp.pow3Out.apply(curve));
|
||||||
}
|
}
|
||||||
|
|
||||||
Draw.reset();
|
Draw.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO horrible code, everywhere.
|
|
||||||
public Vec2 transform(Vec2 position){
|
|
||||||
if(!worldSpace){
|
|
||||||
position.sub(rect.x, rect.y).scl(lastW / rect.width, lastH / rect.height);
|
|
||||||
}else{
|
|
||||||
position.scl(lastW / world.unitWidth(), lastH / world.unitHeight());
|
|
||||||
}
|
|
||||||
|
|
||||||
return position.add(lastX, lastY);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float scale(float radius){
|
|
||||||
return worldSpace ? (radius / (baseSize / 2f)) * 5f * lastScl : lastW / rect.width * radius;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getScaleFactor(boolean zoomAutoScale){
|
|
||||||
if(!zoomAutoScale){
|
|
||||||
return worldSpace ? (1 / (baseSize / 2f)) * 5f * lastScl : lastW / rect.width;
|
|
||||||
}else{
|
|
||||||
return worldSpace ? (1 / (baseSize / 2f)) * 5f : lastW / 256f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public @Nullable TextureRegion getRegion(){
|
public @Nullable TextureRegion getRegion(){
|
||||||
if(texture == null) return null;
|
if(texture == null) return null;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package mindustry.logic;
|
|||||||
|
|
||||||
public enum LMarkerControl{
|
public enum LMarkerControl{
|
||||||
remove,
|
remove,
|
||||||
visibility("true/false"),
|
world("true/false"),
|
||||||
minimap("true/false"),
|
minimap("true/false"),
|
||||||
autoscale("true/false"),
|
autoscale("true/false"),
|
||||||
pos("x", "y"),
|
pos("x", "y"),
|
||||||
@@ -18,7 +18,10 @@ public enum LMarkerControl{
|
|||||||
textHeight("height"),
|
textHeight("height"),
|
||||||
labelFlags("background", "outline"),
|
labelFlags("background", "outline"),
|
||||||
texture("printFlush", "name"),
|
texture("printFlush", "name"),
|
||||||
textureSize("width", "height");
|
textureSize("width", "height"),
|
||||||
|
posi("index", "x", "y"),
|
||||||
|
uvi("index", "x", "y"),
|
||||||
|
colori("index", "color");
|
||||||
|
|
||||||
public final String[] params;
|
public final String[] params;
|
||||||
|
|
||||||
|
|||||||
@@ -1999,11 +1999,14 @@ public class LStatements{
|
|||||||
table.table(t -> {
|
table.table(t -> {
|
||||||
t.setColor(table.color);
|
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);
|
String value = i == 0 ? p1 : i == 1 ? p2 : p3;
|
||||||
|
Cons<String> setter = i == 0 ? v -> p1 = v : i == 1 ? v -> p2 = v : v -> p3 = v;
|
||||||
|
|
||||||
if(type == LMarkerControl.color){
|
fields(t, type.params[i], value, setter).width(100f);
|
||||||
col(t, p1, res -> {
|
|
||||||
p1 = "%" + res.toString().substring(0, res.a >= 1f ? 6 : 8);
|
if(type == LMarkerControl.color || (type == LMarkerControl.colori && i == 1)){
|
||||||
|
col(t, value, res -> {
|
||||||
|
setter.get("%" + res.toString().substring(0, res.a >= 1f ? 6 : 8));
|
||||||
build(table);
|
build(table);
|
||||||
});
|
});
|
||||||
}else if(type == LMarkerControl.drawLayer){
|
}else if(type == LMarkerControl.drawLayer){
|
||||||
@@ -2013,10 +2016,10 @@ public class LStatements{
|
|||||||
o.row();
|
o.row();
|
||||||
o.table(s -> {
|
o.table(s -> {
|
||||||
s.left();
|
s.left();
|
||||||
for(var layer : Layer.class.getFields()){
|
for(var field : Layer.class.getFields()){
|
||||||
float value = Reflect.get(Layer.class, layer.getName());
|
float layer = Reflect.get(field);
|
||||||
s.button(layer.getName() + " = " + value, Styles.logicTogglet, () -> {
|
s.button(field.getName() + " = " + layer, Styles.logicTogglet, () -> {
|
||||||
p1 = Float.toString(value);
|
p1 = Float.toString(layer);
|
||||||
rebuild(table);
|
rebuild(table);
|
||||||
hide.run();
|
hide.run();
|
||||||
}).size(240f, 40f).row();
|
}).size(240f, 40f).row();
|
||||||
|
|||||||
Reference in New Issue
Block a user