Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow markers to be used as light sources #9733

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 41 additions & 17 deletions core/src/mindustry/core/Renderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import arc.*;
import arc.assets.loaders.TextureLoader.*;
import arc.files.*;
import arc.func.*;
import arc.graphics.*;
import arc.graphics.Texture.*;
import arc.graphics.g2d.*;
Expand All @@ -14,6 +15,7 @@
import arc.util.*;
import mindustry.*;
import mindustry.game.EventType.*;
import mindustry.game.MapObjectives.*;
import mindustry.gen.*;
import mindustry.graphics.*;
import mindustry.graphics.g3d.*;
Expand Down Expand Up @@ -322,6 +324,27 @@ public void draw(){
}
}

//draw objective markers
float scaleFactor = 4f / renderer.getDisplayScale();
drawMarkers(scaleFactor, marker -> marker.world);
lights.add(() -> {
state.rules.objectives.eachRunning(obj -> {
for(var marker : obj.markers){
if(marker.light){
marker.drawLight(marker.autoscale ? scaleFactor : 1);
}
}
});

for(var marker : state.markers){
if(marker.light){
marker.drawLight(marker.autoscale ? scaleFactor : 1);
}
}

Draw.reset();
});

if(state.rules.lighting && drawLight){
Draw.draw(Layer.light, lights::draw);
}
Expand Down Expand Up @@ -353,23 +376,6 @@ public void draw(){
});
}

float scaleFactor = 4f / renderer.getDisplayScale();

//draw objective markers
state.rules.objectives.eachRunning(obj -> {
for(var marker : obj.markers){
if(marker.world){
marker.draw(marker.autoscale ? scaleFactor : 1);
}
}
});

for(var marker : state.markers){
if(marker.world){
marker.draw(marker.autoscale ? scaleFactor : 1);
}
}

Draw.reset();

Draw.draw(Layer.overlayUI, overlays::drawTop);
Expand Down Expand Up @@ -467,6 +473,24 @@ protected void drawBackground(){
}
}

public void drawMarkers(float scaleFactor, Boolf<ObjectiveMarker> filter) {
state.rules.objectives.eachRunning(obj -> {
for(var marker : obj.markers){
if(filter.get(marker)){
marker.draw(marker.autoscale ? scaleFactor : 1);
}
}
});

for(var marker : state.markers){
if(filter.get(marker)){
marker.draw(marker.autoscale ? scaleFactor : 1);
}
}

Draw.reset();
}

public void scaleCamera(float amount){
targetscale *= (amount / 4) + 1;
clampScale();
Expand Down
21 changes: 18 additions & 3 deletions core/src/mindustry/game/MapObjectives.java
Original file line number Diff line number Diff line change
Expand Up @@ -618,20 +618,27 @@ public static abstract class ObjectiveMarker{
public boolean world = true;
/** Whether to display marker on minimap. */
public boolean minimap = false;
/** Whether the marker should act as a light source. */
public boolean light = false;
/** Whether to scale marker corresponding to player's zoom level. */
public boolean autoscale = false;
/** On which z-sorting layer is marker drawn. */
protected float drawLayer = Layer.overlayUI;

public void draw(float scaleFactor){}

public void drawLight(float scaleFactor){
draw(scaleFactor);
}

/** Control marker with world processor code. Ignores NaN (null) values. */
public void control(LMarkerControl type, double p1, double p2, double p3){
if(Double.isNaN(p1)) return;

switch(type){
case world -> world = !Mathf.equal((float)p1, 0f);
case minimap -> minimap = !Mathf.equal((float)p1, 0f);
case light -> light = !Mathf.equal((float)p1, 0f);
case autoscale -> autoscale = !Mathf.equal((float)p1, 0f);
case drawLayer -> drawLayer = (float)p1;
}
Expand Down Expand Up @@ -831,8 +838,13 @@ public void draw(float scaleFactor){
Draw.z(drawLayer);
Lines.stroke(Scl.scl((1f - fin) * stroke + 0.1f), color);
Lines.circle(pos.x, pos.y, rad * fin);
}

Draw.reset();
@Override
public void drawLight(float scaleFactor){
float rad = radius * tilesize * scaleFactor;

renderer.lights.add(pos.x, pos.y, radius, color, color.a);
}

@Override
Expand Down Expand Up @@ -890,8 +902,6 @@ public void draw(float scaleFactor){
Fill.arc(pos.x, pos.y, radius * scaleFactor, (startAngle - endAngle) / 360f, rotation + endAngle, sides);
}
}

Draw.reset();
}

@Override
Expand Down Expand Up @@ -1032,6 +1042,11 @@ public void draw(float scaleFactor){
Lines.line(pos.x, pos.y, color1, endPos.x, endPos.y, color2);
}

@Override
public void drawLight(float scaleFactor){
renderer.lights.line(pos.x, pos.y, endPos.x, endPos.y, stroke, color1, color1.a);
}

@Override
public void control(LMarkerControl type, double p1, double p2, double p3){
super.control(type, p1, p2, p3);
Expand Down
14 changes: 1 addition & 13 deletions core/src/mindustry/graphics/MinimapRenderer.java
Original file line number Diff line number Diff line change
Expand Up @@ -260,19 +260,7 @@ public void drawEntities(float x, float y, float w, float h, float scaling, bool
Draw.reset();

//TODO autoscale markers
state.rules.objectives.eachRunning(obj -> {
for(var marker : obj.markers){
if(marker.minimap){
marker.draw(1);
}
}
});

for(var marker : state.markers){
if(marker.minimap){
marker.draw(1);
}
}
renderer.drawMarkers(1, marker -> marker.minimap);

Draw.trans(Tmp.m2);
}
Expand Down
1 change: 1 addition & 0 deletions core/src/mindustry/logic/LMarkerControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public enum LMarkerControl{
remove,
world("true/false"),
minimap("true/false"),
light("true/false"),
autoscale("true/false"),
pos("x", "y"),
endPos("x", "y"),
Expand Down
Loading