More fullbright stuff

This commit is contained in:
raoulvdberge
2020-01-13 23:11:36 +01:00
parent 3a1472faca
commit c2c92f7b1e
3 changed files with 41 additions and 87 deletions

View File

@@ -3,17 +3,13 @@ package com.raoulvdberge.refinedstorage.render.model;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.raoulvdberge.refinedstorage.util.RenderUtils;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.VertexLighterFlat;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.*; import java.util.*;
@@ -26,28 +22,28 @@ public class FullbrightBakedModel extends DelegateBakedModel {
} }
}); });
private Set<ResourceLocation> textures; private final Set<ResourceLocation> textures;
private boolean cacheDisabled = false; private final boolean doCaching;
public FullbrightBakedModel(IBakedModel base, ResourceLocation... textures) { public FullbrightBakedModel(IBakedModel base, boolean doCaching, ResourceLocation... textures) {
super(base); super(base);
this.textures = new HashSet<>(Arrays.asList(textures)); this.textures = new HashSet<>(Arrays.asList(textures));
this.doCaching = doCaching;
} }
public FullbrightBakedModel disableCache() { private boolean canRenderFullbright() {
this.cacheDisabled = true; // return ForgeConfig.CLIENT.forgeLightPipelineEnabled.get();
return true;
return this;
} }
@Override @Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, IModelData data) { public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, IModelData data) {
if (state == null) { if (state == null || !canRenderFullbright()) {
return base.getQuads(state, side, rand, data); return base.getQuads(state, side, rand, data);
} }
if (cacheDisabled) { if (!doCaching) {
return transformQuads(base.getQuads(state, side, rand, data), textures); return transformQuads(base.getQuads(state, side, rand, data), textures);
} }
@@ -61,42 +57,19 @@ public class FullbrightBakedModel extends DelegateBakedModel {
BakedQuad quad = quads.get(i); BakedQuad quad = quads.get(i);
if (textures.contains(quad.getSprite().getName())) { if (textures.contains(quad.getSprite().getName())) {
quads.set(i, transformQuad(quad, 0.007F)); quads.set(i, transformQuad(quad));
} }
} }
return quads; return quads;
} }
private static BakedQuad transformQuad(BakedQuad quad, float light) { private static BakedQuad transformQuad(BakedQuad quad) {
if (RenderUtils.isLightMapDisabled()) { int[] vertexData = quad.getVertexData();
return quad;
}
BakedQuadBuilder builder = new BakedQuadBuilder(quad.getSprite()); vertexData[6] = 0xF000F000;
VertexLighterFlat trans = new VertexLighterFlat(Minecraft.getInstance().getBlockColors()) { return quad;
@Override
protected void updateLightmap(float[] normal, float[] lightmap, float x, float y, float z) {
lightmap[0] = light;
lightmap[1] = light;
}
@Override
public void setQuadTint(int tint) {
// NO OP
}
};
trans.setParent(builder);
builder.setQuadOrientation(quad.getFace());
builder.setTexture(quad.getSprite());
builder.setApplyDiffuseLighting(false);
quad.pipe(trans);
return builder.build();
} }
private class CacheKey { private class CacheKey {

View File

@@ -43,35 +43,38 @@ public class ClientSetup {
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "controller"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "controller"), (base, registry) -> new FullbrightBakedModel(
base, base,
true,
new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_off"), new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_off"),
new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_on"), new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_on"),
new ResourceLocation(RS.ID, "block/controller/cutouts/on") new ResourceLocation(RS.ID, "block/controller/cutouts/on")
)); ));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "creative_controller"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "creative_controller"), (base, registry) -> new FullbrightBakedModel(
base, base,
true,
new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_off"), new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_off"),
new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_on"), new ResourceLocation(RS.ID, "block/controller/cutouts/nearly_on"),
new ResourceLocation(RS.ID, "block/controller/cutouts/on") new ResourceLocation(RS.ID, "block/controller/cutouts/on")
)); ));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "grid"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/grid/cutouts/front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "grid"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/grid/cutouts/front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafting_grid"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/grid/cutouts/crafting_front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafting_grid"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/grid/cutouts/crafting_front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "pattern_grid"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/grid/cutouts/pattern_front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "pattern_grid"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/grid/cutouts/pattern_front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "fluid_grid"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/grid/cutouts/fluid_front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "fluid_grid"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/grid/cutouts/fluid_front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "network_receiver"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/network_receiver/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "network_receiver"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/network_receiver/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "network_transmitter"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/network_transmitter/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "network_transmitter"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/network_transmitter/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "relay"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/relay/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "relay"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/relay/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "detector"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/detector/cutouts/on"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "detector"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/detector/cutouts/on")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "security_manager"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "security_manager"), (base, registry) -> new FullbrightBakedModel(
base, base,
true,
new ResourceLocation(RS.ID, "block/security_manager/cutouts/top_connected"), new ResourceLocation(RS.ID, "block/security_manager/cutouts/top_connected"),
new ResourceLocation(RS.ID, "block/security_manager/cutouts/front_connected"), new ResourceLocation(RS.ID, "block/security_manager/cutouts/front_connected"),
new ResourceLocation(RS.ID, "block/security_manager/cutouts/left_connected"), new ResourceLocation(RS.ID, "block/security_manager/cutouts/left_connected"),
new ResourceLocation(RS.ID, "block/security_manager/cutouts/back_connected"), new ResourceLocation(RS.ID, "block/security_manager/cutouts/back_connected"),
new ResourceLocation(RS.ID, "block/security_manager/cutouts/right_connected") new ResourceLocation(RS.ID, "block/security_manager/cutouts/right_connected")
)); ));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "wireless_transmitter"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/wireless_transmitter/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "wireless_transmitter"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/wireless_transmitter/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "constructor"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/constructor/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "constructor"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/constructor/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "destructor"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/destructor/cutouts/connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "destructor"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/destructor/cutouts/connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_drive"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_drive"), (base, registry) -> new FullbrightBakedModel(
new DiskDriveBakedModel( new DiskDriveBakedModel(
@@ -80,8 +83,10 @@ public class ClientSetup {
registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_near_capacity")), registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_near_capacity")),
registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_full")), registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_full")),
registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_disconnected")) registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_disconnected"))
) ),
).disableCache()); false,
new ResourceLocation(RS.ID, "block/disks/leds")
));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_manipulator"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "disk_manipulator"), (base, registry) -> new FullbrightBakedModel(
new DiskManipulatorBakedModel( new DiskManipulatorBakedModel(
@@ -92,9 +97,10 @@ public class ClientSetup {
registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_full")), registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_full")),
registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_disconnected")) registry.get(new ResourceLocation(RS.ID + ":block/disks/disk_disconnected"))
), ),
false,
new ResourceLocation(RS.ID, "block/disk_manipulator/cutouts/connected"), new ResourceLocation(RS.ID, "block/disk_manipulator/cutouts/connected"),
new ResourceLocation(RS.ID, "block/disks/leds") new ResourceLocation(RS.ID, "block/disks/leds")
).disableCache()); ));
for (String portableGridName : new String[]{"portable_grid", "creative_portable_grid"}) { for (String portableGridName : new String[]{"portable_grid", "creative_portable_grid"}) {
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, portableGridName), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, portableGridName), (base, registry) -> new FullbrightBakedModel(
@@ -106,12 +112,14 @@ public class ClientSetup {
registry.get(new ResourceLocation(RS.ID + ":block/disks/portable_grid_disk_full")), registry.get(new ResourceLocation(RS.ID + ":block/disks/portable_grid_disk_full")),
registry.get(new ResourceLocation(RS.ID + ":block/disks/portable_grid_disk_disconnected")) registry.get(new ResourceLocation(RS.ID + ":block/disks/portable_grid_disk_disconnected"))
), ),
false,
new ResourceLocation(RS.ID + ":block/disks/leds") new ResourceLocation(RS.ID + ":block/disks/leds")
).disableCache()); ));
} }
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafter"), (base, registry) -> new FullbrightBakedModel( bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafter"), (base, registry) -> new FullbrightBakedModel(
base, base,
true,
new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected"), new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected"),
new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_90"), new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_90"),
new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_180"), new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_180"),
@@ -119,8 +127,8 @@ public class ClientSetup {
new ResourceLocation(RS.ID, "block/crafter/cutouts/front_connected") new ResourceLocation(RS.ID, "block/crafter/cutouts/front_connected")
)); ));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafter_manager"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/crafter_manager/cutouts/front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafter_manager"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/crafter_manager/cutouts/front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafting_monitor"), (base, registry) -> new FullbrightBakedModel(base, new ResourceLocation(RS.ID, "block/crafting_monitor/cutouts/front_connected"))); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafting_monitor"), (base, registry) -> new FullbrightBakedModel(base, true, new ResourceLocation(RS.ID, "block/crafting_monitor/cutouts/front_connected")));
bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "pattern"), (base, registry) -> new PatternBakedModel(base)); bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "pattern"), (base, registry) -> new PatternBakedModel(base));
@@ -143,6 +151,7 @@ public class ClientSetup {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onModelBake); FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onModelBake);
API.instance().addPatternRenderHandler(pattern -> Screen.hasShiftDown()); API.instance().addPatternRenderHandler(pattern -> Screen.hasShiftDown());
API.instance().addPatternRenderHandler(pattern -> { API.instance().addPatternRenderHandler(pattern -> {
Container container = Minecraft.getInstance().player.openContainer; Container container = Minecraft.getInstance().player.openContainer;
@@ -156,6 +165,7 @@ public class ClientSetup {
return false; return false;
}); });
API.instance().addPatternRenderHandler(pattern -> { API.instance().addPatternRenderHandler(pattern -> {
Container container = Minecraft.getInstance().player.openContainer; Container container = Minecraft.getInstance().player.openContainer;

View File

@@ -30,8 +30,6 @@ import java.util.List;
import java.util.Set; import java.util.Set;
public final class RenderUtils { public final class RenderUtils {
private static final VertexFormat ITEM_FORMAT_WITH_LIGHTMAP = addTex2sToVertexFormat(DefaultVertexFormats.field_227849_i_); // TODO Is this item?
public static String shorten(String text, int length) { public static String shorten(String text, int length) {
if (text.length() > length) { if (text.length() > length) {
text = text.substring(0, length) + "..."; text = text.substring(0, length) + "...";
@@ -243,33 +241,6 @@ public final class RenderUtils {
return tooltipStrings; return tooltipStrings;
} }
public static boolean isLightMapDisabled() {
// return ForgeConfig.CLIENT.forgeLightPipelineEnabled.get();
return false;
}
public static VertexFormat getFormatWithLightMap(VertexFormat format) {
if (isLightMapDisabled()) {
return format;
}
if (format == DefaultVertexFormats.BLOCK) {
return DefaultVertexFormats.BLOCK;
} else if (format == DefaultVertexFormats.field_227849_i_) { // TODO Is this item?
return ITEM_FORMAT_WITH_LIGHTMAP;
} else if (!format.hasUV(1)) {
return addTex2sToVertexFormat(format);
}
return format;
}
private static VertexFormat addTex2sToVertexFormat(VertexFormat format) {
List<VertexFormatElement> elems = new ArrayList<>(format.func_227894_c_());
elems.add(DefaultVertexFormats.TEX_2S);
return new VertexFormat(ImmutableList.copyOf(elems));
}
public static boolean inBounds(int x, int y, int w, int h, double ox, double oy) { public static boolean inBounds(int x, int y, int w, int h, double ox, double oy) {
return ox >= x && ox <= x + w && oy >= y && oy <= y + h; return ox >= x && ox <= x + w && oy >= y && oy <= y + h;
} }