Logic-related color functions

This commit is contained in:
Anuken 2022-02-10 11:00:27 -05:00
parent 04c2bbc24d
commit a80e1d86a1
10 changed files with 100 additions and 19 deletions

View File

@ -1704,6 +1704,11 @@ lst.unitbind = Bind to the next unit of a type, and store it in [accent]@unit[].
lst.unitcontrol = Control the currently bound unit.
lst.unitradar = Locate units around the currently bound unit.
lst.unitlocate = Locate a specific type of position/building anywhere on the map.\nRequires a bound unit.
lst.getblock = Get tile data at any location.
lst.setblock = Set tile data at any location.
lst.spawnunit = Spawn unit at a location.
lst.packcolor = Pack [0, 1] RGBA components into a single number for drawing or rule-setting.
lst.setrule = Set a game rule.
logic.nounitbuild = [red]Unit building logic is not allowed here.
@ -1723,6 +1728,7 @@ lacess.speed = Top speed of a unit, in tiles/sec.
graphicstype.clear = Fill the display with a color.
graphicstype.color = Set color for next drawing operations.
graphicstype.col = Equivalent to color, but packed.\nPacked colors are written as hex codes with a [accent]%[] prefix.\nExample: [accent]%ff0000[] would be red.
graphicstype.stroke = Set line width.
graphicstype.line = Draw line segment.
graphicstype.rect = Fill a rectangle.

View File

@ -52,7 +52,7 @@ public enum LAccess{
shoot("x", "y", "shoot"),
shootp(true, "unit", "shoot"),
config(true, "to"),
color("r", "g", "b");
color("to");
public final String[] params;
public final boolean isObj;

View File

@ -111,6 +111,7 @@ public class LAssembler{
g = Strings.parseInt(symbol, 16, 0, 3, 5),
b = Strings.parseInt(symbol, 16, 0, 5, 7),
a = symbol.length() == 9 ? Strings.parseInt(symbol, 16, 0, 7, 9) : 255;
return Color.toDoubleBits(r, g, b, a);
}

View File

@ -1,5 +1,6 @@
package mindustry.logic;
import arc.graphics.*;
import arc.math.*;
import arc.math.geom.*;
import arc.struct.*;
@ -880,7 +881,7 @@ public class LExecutor{
@Override
public void run(LExecutor exec){
//graphics on headless servers are useless.
if(Vars.headless) return;
if(Vars.headless || exec.graphicsBuffer.size >= maxGraphicsBuffer) return;
int num1 = exec.numi(p1);
@ -888,12 +889,27 @@ public class LExecutor{
num1 = exec.obj(p1) instanceof UnlockableContent u ? u.iconId : 0;
}
//add graphics calls, cap graphics buffer size
if(exec.graphicsBuffer.size < maxGraphicsBuffer){
//explicitly unpack colorPack, it's pre-processed here
if(type == LogicDisplay.commandColorPack){
double packed = exec.num(x);
int value = (int)(Double.doubleToRawLongBits(packed)),
r = ((value & 0xff000000) >>> 24),
g = ((value & 0x00ff0000) >>> 16),
b = ((value & 0x0000ff00) >>> 8),
a = ((value & 0x000000ff));
exec.graphicsBuffer.add(DisplayCmd.get(LogicDisplay.commandColor, pack(r), pack(g), pack(b), pack(a), 0, 0));
}else{
//add graphics calls, cap graphics buffer size
exec.graphicsBuffer.add(DisplayCmd.get(type, packSign(exec.numi(x)), packSign(exec.numi(y)), packSign(num1), packSign(exec.numi(p2)), packSign(exec.numi(p3)), packSign(exec.numi(p4))));
}
}
static int pack(int value){
return value & 0b0111111111;
}
static int packSign(int value){
return (Math.abs(value) & 0b0111111111) | (value < 0 ? 0b1000000000 : 0);
}
@ -1061,7 +1077,7 @@ public class LExecutor{
}
}
//TODO lookup color instruction and inverse lookup
//TODO inverse lookup
public static class LookupI implements LInstruction{
public int dest;
public int from;
@ -1082,6 +1098,26 @@ public class LExecutor{
}
}
public static class PackColorI implements LInstruction{
public int result, r, g, b, a;
public PackColorI(int result, int r, int g, int b, int a){
this.result = result;
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
public PackColorI(){
}
@Override
public void run(LExecutor exec){
exec.setnum(result, Color.toDoubleBits(Mathf.clamp(exec.numf(r)), Mathf.clamp(exec.numf(g)), Mathf.clamp(exec.numf(b)), Mathf.clamp(exec.numf(a))));
}
}
//endregion
//region privileged / world instructions
@ -1203,6 +1239,7 @@ public class LExecutor{
public void run(LExecutor exec){
switch(rule){
case waveTimer -> state.rules.waveTimer = exec.bool(value);
case currentWaveTime -> state.wavetime = exec.numf(value) * 60f;
case waves -> state.rules.waves = exec.bool(value);
case attackMode -> state.rules.attackMode = exec.bool(value);
case waveSpacing -> state.rules.waveSpacing = exec.numf(value) * 60f;

View File

@ -180,6 +180,9 @@ public class LStatements{
row(s);
fields(s, "a", p2, v -> p2 = v);
}
case col -> {
fields(s, "color", x, v -> x = v).width(144f);
}
case stroke -> {
s.add().width(4);
fields(s, x, v -> x = v);
@ -722,6 +725,35 @@ public class LStatements{
}
}
@RegisterStatement("packcolor")
public static class PackColorStatement extends LStatement{
public String result = "result", r = "1", g = "0", b = "0", a = "1";
@Override
public void build(Table table){
fields(table, result, str -> result = str);
table.add(" = pack ");
row(table);
fields(table, r, str -> r = str);
fields(table, g, str -> g = str);
fields(table, b, str -> b = str);
fields(table, a, str -> a = str);
}
@Override
public Color color(){
return Pal.logicOperations;
}
@Override
public LInstruction build(LAssembler builder){
return new PackColorI(builder.var(result), builder.var(r), builder.var(g), builder.var(b), builder.var(a));
}
}
@RegisterStatement("end")
public static class EndStatement extends LStatement{
@Override
@ -1217,7 +1249,7 @@ public class LStatements{
table.button(b -> {
b.label(() -> rule.name()).growX().wrap().labelAlign(Align.center);
b.clicked(() -> showSelect(b, LogicRule.all, rule, o -> rule = o, 2, c -> c.width(150f)));
}, Styles.logict, () -> {}).size(150f, 40f).pad(4f).color(table.color);
}, Styles.logict, () -> {}).size(160f, 40f).pad(4f).color(table.color);
table.add(" = ");

View File

@ -166,8 +166,8 @@ public class LogicDialog extends BaseDialog{
t.button(example.name(), style, () -> {
canvas.add(prov.get());
dialog.hide();
}).size(140f, 50f).self(c -> tooltip(c, "lst." + example.name()));
if(++i % 2 == 0) t.row();
}).size(130f, 50f).self(c -> tooltip(c, "lst." + example.name()));
if(++i % 3 == 0) t.row();
}
});
dialog.addCloseButton();

View File

@ -1,6 +1,7 @@
package mindustry.logic;
public enum LogicRule{
currentWaveTime,
waveTimer,
waves,
waveSpacing,

View File

@ -17,14 +17,16 @@ public class LogicDisplay extends Block{
public static final byte
commandClear = 0,
commandColor = 1,
commandStroke = 2,
commandLine = 3,
commandRect = 4,
commandLineRect = 5,
commandPoly = 6,
commandLinePoly = 7,
commandTriangle = 8,
commandImage = 9;
//virtual command, unpacked in instruction
commandColorPack = 2,
commandStroke = 3,
commandLine = 4,
commandRect = 5,
commandLineRect = 6,
commandPoly = 7,
commandLinePoly = 8,
commandTriangle = 9,
commandImage = 10;
public int maxSides = 25;
@ -125,6 +127,8 @@ public class LogicDisplay extends Block{
public enum GraphicsType{
clear,
color,
//virtual
col,
stroke,
line,
rect,
@ -132,7 +136,7 @@ public class LogicDisplay extends Block{
poly,
linePoly,
triangle,
image;
image,;
public static final GraphicsType[] all = values();
}

View File

@ -63,7 +63,7 @@ public class LightBlock extends Block{
@Override
public void control(LAccess type, double p1, double p2, double p3, double p4){
if(type == LAccess.color){
color = Color.rgba8888(Mathf.clamp((float)p1), Mathf.clamp((float)p2), Mathf.clamp((float)p3), 1f);
color = Tmp.c1.fromDouble(p1).rgba8888();
}
super.control(type, p1, p2, p3, p4);

View File

@ -24,4 +24,4 @@ android.useAndroidX=true
#used for slow jitpack builds; TODO see if this actually works
org.gradle.internal.http.socketTimeout=100000
org.gradle.internal.http.connectionTimeout=100000
archash=a1e1841832
archash=f95111f269