From 6fe5663f795017e37cc12d919ca9f59fbe885dbe Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 6 Feb 2020 13:20:03 -0500 Subject: [PATCH] Autogenerated render layer groups --- annotations/build.gradle | 3 +- .../mindustry/annotations/Annotations.java | 6 +- .../mindustry/annotations/BaseProcessor.java | 3 +- .../annotations/impl/EntityProcess.java | 55 +++++++++++++++---- core/src/mindustry/core/Renderer.java | 24 ++++---- .../mindustry/entities/def/AllEntities.java | 8 --- .../entities/def/DrawShadowComp.java | 16 +++++- .../mindustry/entities/def/FlyingComp.java | 4 ++ core/src/mindustry/entities/def/UnitComp.java | 12 +++- core/src/mindustry/graphics/Pixelator.java | 4 +- core/src/mindustry/graphics/RenderLayer.java | 12 ---- 11 files changed, 91 insertions(+), 56 deletions(-) delete mode 100644 core/src/mindustry/graphics/RenderLayer.java diff --git a/annotations/build.gradle b/annotations/build.gradle index d894ed0abf..d87bfffb22 100644 --- a/annotations/build.gradle +++ b/annotations/build.gradle @@ -2,5 +2,4 @@ apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = ["src/main/java/"] -sourceSets.main.resources.srcDirs = ["src/main/resources/"] - +sourceSets.main.resources.srcDirs = ["src/main/resources/"] \ No newline at end of file diff --git a/annotations/src/main/java/mindustry/annotations/Annotations.java b/annotations/src/main/java/mindustry/annotations/Annotations.java index f880f25377..65c3942f76 100644 --- a/annotations/src/main/java/mindustry/annotations/Annotations.java +++ b/annotations/src/main/java/mindustry/annotations/Annotations.java @@ -5,14 +5,14 @@ import java.lang.annotation.*; public class Annotations{ //region entity interfaces - /** Indicates that a component field is read-only. */ + /** Indicates that a component field is read-only. @Target({ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface Render{ RenderLayer value(); - } + }*/ - public enum RenderLayer{ + public enum DrawLayer{ floor, groundShadows, ground, diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 4b46cecdb7..a1662e4e15 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -3,7 +3,6 @@ package mindustry.annotations; import arc.files.*; import arc.struct.Array; import arc.util.*; -import arc.util.Log.*; import com.squareup.javapoet.*; import com.sun.source.util.*; import mindustry.annotations.util.*; @@ -154,7 +153,7 @@ public abstract class BaseProcessor extends AbstractProcessor{ messager = env.getMessager(); if(System.getProperty("debug") == null){ - Log.setLogLevel(LogLevel.err); + //Log.setLogLevel(LogLevel.err); } } diff --git a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java index b2a810d75e..ab4d9ad1fe 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/EntityProcess.java @@ -60,7 +60,8 @@ public class EntityProcess extends BaseProcessor{ //parse groups for(Smethod group : allGroups){ GroupDef an = group.annotation(GroupDef.class); - groupDefs.add(new GroupDefinition(group.name(), types(an, GroupDef::value), an)); + Array types = types(an, GroupDef::value); + groupDefs.add(new GroupDefinition(group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping())); } //create component interfaces @@ -70,7 +71,8 @@ public class EntityProcess extends BaseProcessor{ //implement extra interfaces these components may have, e.g. position for(Stype extraInterface : component.interfaces().select(i -> !isCompInterface(i))){ - inter.addSuperinterface(extraInterface.mirror()); + //javapoet completely chokes on this if I add `addSuperInterface` or create the type name with TypeName.get + inter.superinterfaces.add(tname(extraInterface.fullName())); } //implement super interfaces @@ -135,18 +137,36 @@ public class EntityProcess extends BaseProcessor{ Log.info(""); } + //generate special render layer interfaces + for(DrawLayer layer : DrawLayer.values()){ + //create the DrawLayer interface that entities need to implement + String name = "DrawLayer" + Strings.capitalize(layer.name()) + "c"; + TypeSpec.Builder inter = TypeSpec.interfaceBuilder(name) + .addSuperinterface(tname(packageName + ".Entityc")) + .addModifiers(Modifier.PUBLIC).addAnnotation(EntityInterface.class); + inter.addMethod(MethodSpec.methodBuilder("draw" + Strings.capitalize(layer.name())).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).build()); + write(inter); + + //create group definition with no components directly + GroupDefinition def = new GroupDefinition(layer.name(), ClassName.bestGuess(packageName + "." + name), Array.with(), false, false); + //add manual inclusions of entities to be added to this group + def.manualInclusions.addAll(allDefs.select(s -> allComponents(s).contains(comp -> comp.interfaces().contains(in -> in.name().equals(name))))); + + groupDefs.add(def); + } + //look at each definition for(Stype type : allDefs){ boolean isFinal = type.annotation(EntityDef.class).isFinal(); if(!type.name().endsWith("Def")){ err("All entity def names must end with 'Def'", type.e); } - String name = type.name().replace("Def", "Entity"); //TODO remove extra underscore + String name = type.name().replace("Def", "Entity"); TypeSpec.Builder builder = TypeSpec.classBuilder(name).addModifiers(Modifier.PUBLIC); if(isFinal) builder.addModifiers(Modifier.FINAL); Array components = allComponents(type); - Array groups = groupDefs.select(g -> !g.components.contains(s -> !components.contains(s))); + Array groups = groupDefs.select(g -> (!g.components.isEmpty() && !g.components.contains(s -> !components.contains(s))) || g.manualInclusions.contains(type)); ObjectMap> methods = new ObjectMap<>(); //add all components @@ -268,31 +288,40 @@ public class EntityProcess extends BaseProcessor{ TypeSpec.Builder groupsBuilder = TypeSpec.classBuilder("Groups").addModifiers(Modifier.PUBLIC); MethodSpec.Builder groupInit = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC); for(GroupDefinition group : groupDefs){ - Stype ctype = group.components.first(); + //Stype ctype = group.components.first(); //class names for interface/group - ClassName itype = ClassName.bestGuess("mindustry.gen." + interfaceName(ctype)); + ClassName itype = group.baseType; ClassName groupc = ClassName.bestGuess("mindustry.entities.EntityGroup"); //add field... groupsBuilder.addField(ParameterizedTypeName.get( ClassName.bestGuess("mindustry.entities.EntityGroup"), itype), group.name, Modifier.PUBLIC, Modifier.STATIC); - groupInit.addStatement("$L = new $T<>($L.class, $L, $L)", group.name, groupc, itype, group.def.spatial(), group.def.mapping()); + groupInit.addStatement("$L = new $T<>($L.class, $L, $L)", group.name, groupc, itype, group.spatial, group.mapping); } //write the groups groupsBuilder.addMethod(groupInit.build()); + //add method for resizing all necessary groups MethodSpec.Builder groupResize = MethodSpec.methodBuilder("resize") .addParameter(TypeName.FLOAT, "x").addParameter(TypeName.FLOAT, "y").addParameter(TypeName.FLOAT, "w").addParameter(TypeName.FLOAT, "h") .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + //method resize for(GroupDefinition group : groupDefs){ - if(group.def.spatial()){ + if(group.spatial){ groupResize.addStatement("$L.resize(x, y, w, h)", group.name); } } + for(DrawLayer layer : DrawLayer.values()){ + MethodSpec.Builder groupDraw = MethodSpec.methodBuilder("draw" + Strings.capitalize(layer.name())) + .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + groupDraw.addStatement("$L.draw($L::$L)", layer.name(), "DrawLayer" + Strings.capitalize(layer.name()) + "c", "draw" + Strings.capitalize(layer.name())); + groupsBuilder.addMethod(groupDraw.build()); + } + groupsBuilder.addMethod(groupResize.build()); write(groupsBuilder); @@ -520,13 +549,17 @@ public class EntityProcess extends BaseProcessor{ class GroupDefinition{ final String name; + final ClassName baseType; final Array components; - final GroupDef def; + final boolean spatial, mapping; + final ObjectSet manualInclusions = new ObjectSet<>(); - public GroupDefinition(String name, Array components, GroupDef def){ + public GroupDefinition(String name, ClassName bestType, Array components, boolean spatial, boolean mapping){ + this.baseType = bestType; this.components = components; this.name = name; - this.def = def; + this.spatial = spatial; + this.mapping = mapping; } @Override diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 3160b04ff3..0597c870d8 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -187,7 +187,7 @@ public class Renderer implements ApplicationListener{ blocks.floor.drawFloor(); - render(RenderLayer.floor); + Groups.drawFloor(); blocks.processBlocks(); blocks.drawShadows(); @@ -208,25 +208,25 @@ public class Renderer implements ApplicationListener{ blocks.drawBlocks(Layer.overlay); - render(RenderLayer.groundShadows); - render(RenderLayer.ground); + Groups.drawGroundShadows(); + Groups.drawGround(); blocks.drawBlocks(Layer.turret); - render(RenderLayer.flyingShadows); + Groups.drawFlyingShadows(); blocks.drawBlocks(Layer.power); blocks.drawBlocks(Layer.lights); - render(RenderLayer.flying); + Groups.drawFlying(); Draw.flush(); if(bloom != null && !pixelator.enabled()){ bloom.capture(); } - render(RenderLayer.bullets); - render(RenderLayer.effects); + Groups.drawBullets(); + Groups.drawEffects(); Draw.flush(); if(bloom != null && !pixelator.enabled()){ @@ -240,9 +240,9 @@ public class Renderer implements ApplicationListener{ overlays.drawTop(); - render(RenderLayer.names); - //TODO should use (draw) - Groups.player.each(p -> !p.dead(), Playerc::drawName); + if(!pixelator.enabled()){ + Groups.drawNames(); + } if(state.rules.lighting){ lights.draw(); @@ -254,10 +254,6 @@ public class Renderer implements ApplicationListener{ Draw.flush(); } - private void render(RenderLayer layer){ - - } - private void drawLanding(){ if(landTime > 0 && player.closestCore() != null){ float fract = landTime / Fx.coreLand.lifetime; diff --git a/core/src/mindustry/entities/def/AllEntities.java b/core/src/mindustry/entities/def/AllEntities.java index 764360adfb..06b6d8036b 100644 --- a/core/src/mindustry/entities/def/AllEntities.java +++ b/core/src/mindustry/entities/def/AllEntities.java @@ -22,9 +22,6 @@ class AllEntities{ @EntityDef({UnitComp.class}) class GenericUnitDef{} - @EntityDef({BuilderComp.class}) - class GenericBuilderDef{} - @GroupDef(EntityComp.class) void all(){ @@ -45,11 +42,6 @@ class AllEntities{ } - @GroupDef(DrawComp.class) - void drawer(){ - - } - @GroupDef(SyncComp.class) void sync(){ diff --git a/core/src/mindustry/entities/def/DrawShadowComp.java b/core/src/mindustry/entities/def/DrawShadowComp.java index 67cffe3a56..9f0638ff4f 100644 --- a/core/src/mindustry/entities/def/DrawShadowComp.java +++ b/core/src/mindustry/entities/def/DrawShadowComp.java @@ -6,13 +6,27 @@ import mindustry.annotations.Annotations.*; import mindustry.gen.*; @Component -abstract class DrawShadowComp implements Drawc, Rotc, Flyingc{ +abstract class DrawShadowComp implements Drawc, Rotc, Flyingc, DrawLayerFlyingShadowsc, DrawLayerGroundShadowsc{ static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f); transient float x, y, rotation; abstract TextureRegion getShadowRegion(); + @Override + public void drawFlyingShadows(){ + if(isFlying()){ + drawShadow(); + } + } + + @Override + public void drawGroundShadows(){ + if(isGrounded()){ + drawShadow(); + } + } + void drawShadow(){ if(!isGrounded()){ Draw.color(shadowColor); diff --git a/core/src/mindustry/entities/def/FlyingComp.java b/core/src/mindustry/entities/def/FlyingComp.java index 81d5a3b99b..f5783b245e 100644 --- a/core/src/mindustry/entities/def/FlyingComp.java +++ b/core/src/mindustry/entities/def/FlyingComp.java @@ -21,6 +21,10 @@ abstract class FlyingComp implements Posc, Velc, Healthc{ return elevation < 0.001f; } + boolean isFlying(){ + return elevation >= 0.001f; + } + @Override public void update(){ Floor floor = floorOn(); diff --git a/core/src/mindustry/entities/def/UnitComp.java b/core/src/mindustry/entities/def/UnitComp.java index dbaa5cf9be..77e7826450 100644 --- a/core/src/mindustry/entities/def/UnitComp.java +++ b/core/src/mindustry/entities/def/UnitComp.java @@ -19,10 +19,20 @@ import mindustry.world.blocks.*; import static mindustry.Vars.*; @Component -abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitboxc, Rotc, Massc, Unitc, Weaponsc{ +abstract class UnitComp implements Healthc, Velc, Statusc, Teamc, Itemsc, Hitboxc, Rotc, Massc, Unitc, Weaponsc, DrawShadowc{ private UnitController controller; private UnitDef type; + @Override + public TextureRegion getShadowRegion(){ + return type.region; + } + + @Override + public float clipSize(){ + return type.region.getWidth() * 2f; + } + @Override public int itemCapacity(){ return type.itemCapacity; diff --git a/core/src/mindustry/graphics/Pixelator.java b/core/src/mindustry/graphics/Pixelator.java index bb2b461f92..405a1f43e1 100644 --- a/core/src/mindustry/graphics/Pixelator.java +++ b/core/src/mindustry/graphics/Pixelator.java @@ -6,6 +6,7 @@ import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; import arc.util.*; +import mindustry.gen.*; import static arc.Core.*; import static mindustry.Vars.renderer; @@ -52,8 +53,7 @@ public class Pixelator implements Disposable{ Draw.rect(Draw.wrap(buffer.getTexture()), Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); Draw.blend(); - //TODO implement drawing functions, maybe - //Groups.player.draw(p -> !p.isDead(), Playerc::drawName); + Groups.drawNames(); Core.camera.position.set(px, py); Core.settings.put("animatedwater", hadWater); diff --git a/core/src/mindustry/graphics/RenderLayer.java b/core/src/mindustry/graphics/RenderLayer.java deleted file mode 100644 index baa43e5794..0000000000 --- a/core/src/mindustry/graphics/RenderLayer.java +++ /dev/null @@ -1,12 +0,0 @@ -package mindustry.graphics; - -public enum RenderLayer{ - floor, - groundShadows, - ground, - flyingShadows, - flying, - bullets, - effects, - names, -}