From eb93ffc8d8443098871efbc3497257c04991188f Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Thu, 2 Jul 2020 19:01:04 +0200 Subject: [PATCH] Block Colors Registration, fixing... schtuff. --- .../java/appeng/bootstrap/BlockRendering.java | 3 +- .../client/render/FacingToRotation.java | 6 +- .../client/render/cablebus/CableBusModel.java | 32 ++--- .../client/render/cablebus/QuadRotator.java | 59 ++++++---- .../appeng/core/api/definitions/ApiParts.java | 109 +++++++++++------- 5 files changed, 130 insertions(+), 79 deletions(-) diff --git a/src/main/java/appeng/bootstrap/BlockRendering.java b/src/main/java/appeng/bootstrap/BlockRendering.java index 4632ee01b..5b6a901c8 100644 --- a/src/main/java/appeng/bootstrap/BlockRendering.java +++ b/src/main/java/appeng/bootstrap/BlockRendering.java @@ -22,6 +22,7 @@ import java.util.function.BiFunction; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; import net.minecraft.block.Block; import net.minecraft.client.color.block.BlockColorProvider; import net.minecraft.client.render.RenderLayer; @@ -80,7 +81,7 @@ class BlockRendering implements IBlockRendering { } if (this.blockColor != null) { - factory.addBootstrapComponent(new BlockColorComponent(block, this.blockColor)); + ColorProviderRegistry.BLOCK.register(this.blockColor, block); } if (this.renderType != null) { diff --git a/src/main/java/appeng/client/render/FacingToRotation.java b/src/main/java/appeng/client/render/FacingToRotation.java index 5c4c04150..13a0741f4 100644 --- a/src/main/java/appeng/client/render/FacingToRotation.java +++ b/src/main/java/appeng/client/render/FacingToRotation.java @@ -60,6 +60,7 @@ public enum FacingToRotation implements StringIdentifiable { private final Quaternion xRot; private final Quaternion yRot; private final Quaternion zRot; + private final Quaternion combinedRotation; private final Matrix4f mat; private FacingToRotation(Vector3f rot) { @@ -69,14 +70,15 @@ public enum FacingToRotation implements StringIdentifiable { this.mat.multiply(xRot = Vector3f.POSITIVE_X.getDegreesQuaternion(rot.getX())); this.mat.multiply(yRot = Vector3f.POSITIVE_Y.getDegreesQuaternion(rot.getY())); this.mat.multiply(zRot = Vector3f.POSITIVE_Z.getDegreesQuaternion(rot.getZ())); + this.combinedRotation = new Quaternion(rot.getX(), rot.getY(), rot.getZ(), true); } public boolean isRedundant() { return rot.getX() == 0 && rot.getY() == 0 && rot.getZ() == 0; } - public Vector3f getRot() { - return this.rot; + public Quaternion getRot() { + return this.combinedRotation; } public Matrix4f getMat() { diff --git a/src/main/java/appeng/client/render/cablebus/CableBusModel.java b/src/main/java/appeng/client/render/cablebus/CableBusModel.java index 25b97f609..4d0bc75ba 100644 --- a/src/main/java/appeng/client/render/cablebus/CableBusModel.java +++ b/src/main/java/appeng/client/render/cablebus/CableBusModel.java @@ -18,30 +18,28 @@ package appeng.client.render.cablebus; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; - +import appeng.api.util.AEColor; +import appeng.core.AELog; +import appeng.core.features.registries.PartModels; import com.google.common.collect.ImmutableMap; import com.mojang.datafixers.util.Pair; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.ModelBakeSettings; -import net.minecraft.client.render.model.UnbakedModel; -import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.render.model.ModelLoader; +import net.minecraft.client.render.model.UnbakedModel; import net.minecraft.client.texture.Sprite; +import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.util.Identifier; -import appeng.api.util.AEColor; -import appeng.core.AELog; -import appeng.core.features.registries.PartModels; - import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * The built-in model for the cable bus block. @@ -57,6 +55,7 @@ public class CableBusModel implements UnbakedModel { @Override public Collection getModelDependencies() { + partModels.setInitialized(true); return partModels.getModels(); } @@ -78,7 +77,12 @@ public class CableBusModel implements UnbakedModel { @Override public Collection getTextureDependencies(Function unbakedModelGetter, Set> unresolvedTextureReferences) { - return Collections.unmodifiableList(CableBuilder.getTextures()); + return Stream.concat( + getModelDependencies().stream() + .map(unbakedModelGetter) + .flatMap(ubm -> ubm.getTextureDependencies(unbakedModelGetter, unresolvedTextureReferences).stream()), + CableBuilder.getTextures().stream() + ).collect(Collectors.toList()); } private Map loadPartModels(ModelLoader loader, diff --git a/src/main/java/appeng/client/render/cablebus/QuadRotator.java b/src/main/java/appeng/client/render/cablebus/QuadRotator.java index fc4669198..c5a99f6d7 100644 --- a/src/main/java/appeng/client/render/cablebus/QuadRotator.java +++ b/src/main/java/appeng/client/render/cablebus/QuadRotator.java @@ -24,8 +24,13 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.minecraft.client.util.math.Vector3f; +import net.minecraft.client.util.math.Vector4f; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Matrix3f; import net.minecraft.util.math.Matrix4f; +import net.minecraft.util.math.Quaternion; + +import java.util.EnumMap; /** * Assuming a default-orientation of forward=NORTH and up=UP, this class rotates @@ -33,47 +38,59 @@ import net.minecraft.util.math.Matrix4f; */ @Environment(EnvType.CLIENT) public class QuadRotator implements RenderContext.QuadTransform { -// FIXME private static final ThreadLocal pipelines = ThreadLocal.withInitial(() -> // -// FIXME BakedPipeline.builder()// -// FIXME .addElement("transformer", QuadMatrixTransformer.FACTORY)// -// FIXME .build()); -// FIXME private static final ThreadLocal collectors = ThreadLocal.withInitial(Quad::new); private static final RenderContext.QuadTransform NULL_TRANSFORM = quad -> true; + private static final EnumMap TRANSFORMS + = new EnumMap<>(FacingToRotation.class); + + static { + for (FacingToRotation rotation : FacingToRotation.values()) { + if (rotation.isRedundant()) { + TRANSFORMS.put(rotation, NULL_TRANSFORM); + } else { + TRANSFORMS.put(rotation, new QuadRotator(rotation)); + } + } + } + private final FacingToRotation rotation; + private final Quaternion quaternion; + public QuadRotator(FacingToRotation rotation) { this.rotation = rotation; + this.quaternion = rotation.getRot(); } public static RenderContext.QuadTransform get(Direction newForward, Direction newUp) { if (newForward == Direction.NORTH && newUp == Direction.UP) { return NULL_TRANSFORM; // This is the default orientation } - FacingToRotation rotation = getRotation(newForward, newUp); - if (rotation.isRedundant()) { - return NULL_TRANSFORM; - } - return new QuadRotator(rotation); + return TRANSFORMS.get(getRotation(newForward, newUp)); } @Override public boolean transform(MutableQuadView quad) { - // FIXME: Temporary rotation fix - Matrix4f mat = new Matrix4f(); - mat.addToLastColumn(new Vector3f(-0.5f, -0.5f, -0.5f)); - mat.multiply(rotation.getMat()); - mat.addToLastColumn(new Vector3f(0.5f, 0.5f, 0.5f)); + Vector3f tmp = new Vector3f(); -// FIXME ROTATION pipeline.reset(format); -// FIXME ROTATION collector.reset(format); -// FIXME ROTATION -// FIXME ROTATION transformer.setMatrix(mat); -// FIXME ROTATION pipeline.prepare(collector); -// FIXME ROTATION quad.pipe(pipeline); + for (int i = 0; i < 4; i++) { + // Transform the position (center of rotation is 0.5, 0.5, 0.5) + quad.copyPos(i, tmp); + tmp.add(-0.5f, -0.5f, -0.5f); + tmp.rotate(quaternion); + tmp.add(0.5f, 0.5f, 0.5f); + quad.pos(i, tmp); + // Transform the normal + quad.copyNormal(i, tmp); + tmp.rotate(rotation.getRot()); + quad.normal(i, tmp); + + // Transform the nominal face + quad.nominalFace(rotation.rotate(quad.nominalFace())); + } return true; } diff --git a/src/main/java/appeng/core/api/definitions/ApiParts.java b/src/main/java/appeng/core/api/definitions/ApiParts.java index d09dabc84..3372b24fd 100644 --- a/src/main/java/appeng/core/api/definitions/ApiParts.java +++ b/src/main/java/appeng/core/api/definitions/ApiParts.java @@ -33,15 +33,12 @@ import appeng.core.features.ActivityState; import appeng.core.features.ColoredItemDefinition; import appeng.core.features.ItemStackSrc; import appeng.core.features.registries.PartModels; -import appeng.fluids.parts.*; import appeng.items.parts.ColoredPartItem; import appeng.items.parts.PartItem; import appeng.items.parts.PartItemRendering; import appeng.items.parts.PartModelsHelper; -import appeng.parts.automation.*; import appeng.parts.misc.*; import appeng.parts.networking.*; -import appeng.parts.p2p.*; import appeng.parts.reporting.*; /** @@ -112,44 +109,74 @@ public final class ApiParts implements IParts { this.monitor = createPart("monitor", PanelPart.class, PanelPart::new); this.semiDarkMonitor = createPart("semi_dark_monitor", SemiDarkPanelPart.class, SemiDarkPanelPart::new); this.darkMonitor = createPart("dark_monitor", DarkPanelPart.class, DarkPanelPart::new); - this.storageBus = createPart("storage_bus", StorageBusPart.class, StorageBusPart::new); - this.fluidStorageBus = createPart("fluid_storage_bus", FluidStorageBusPart.class, FluidStorageBusPart::new); - this.importBus = createPart("import_bus", ImportBusPart.class, ImportBusPart::new); - this.fluidImportBus = createPart("fluid_import_bus", FluidImportBusPart.class, FluidImportBusPart::new); - this.exportBus = createPart("export_bus", ExportBusPart.class, ExportBusPart::new); - this.fluidExportBus = createPart("fluid_export_bus", FluidExportBusPart.class, FluidExportBusPart::new); - this.levelEmitter = createPart("level_emitter", LevelEmitterPart.class, LevelEmitterPart::new); - this.fluidLevelEmitter = createPart("fluid_level_emitter", FluidLevelEmitterPart.class, - FluidLevelEmitterPart::new); - this.annihilationPlane = createPart("annihilation_plane", AnnihilationPlanePart.class, - AnnihilationPlanePart::new); - this.identityAnnihilationPlane = createPart("identity_annihilation_plane", IdentityAnnihilationPlanePart.class, - IdentityAnnihilationPlanePart::new); - this.fluidAnnihilationPlane = createPart("fluid_annihilation_plane", FluidAnnihilationPlanePart.class, - FluidAnnihilationPlanePart::new); - this.formationPlane = createPart("formation_plane", FormationPlanePart.class, FormationPlanePart::new); - this.fluidFormationPlane = createPart("fluid_formation_plane", FluidFormationPlanePart.class, - FluidFormationPlanePart::new); - this.patternTerminal = createPart("pattern_terminal", PatternTerminalPart.class, PatternTerminalPart::new); - this.craftingTerminal = createPart("crafting_terminal", CraftingTerminalPart.class, CraftingTerminalPart::new); - this.terminal = createPart("terminal", TerminalPart.class, TerminalPart::new); - this.storageMonitor = createPart("storage_monitor", StorageMonitorPart.class, StorageMonitorPart::new); - this.conversionMonitor = createPart("conversion_monitor", ConversionMonitorPart.class, - ConversionMonitorPart::new); - this.iface = createPart("cable_interface", InterfacePart.class, InterfacePart::new); - this.fluidIface = createPart("cable_fluid_interface", FluidInterfacePart.class, FluidInterfacePart::new); - this.p2PTunnelME = createPart("me_p2p_tunnel", MEP2PTunnelPart.class, MEP2PTunnelPart::new); - this.p2PTunnelRedstone = createPart("redstone_p2p_tunnel", RedstoneP2PTunnelPart.class, - RedstoneP2PTunnelPart::new); - this.p2PTunnelItems = createPart("item_p2p_tunnel", ItemP2PTunnelPart.class, ItemP2PTunnelPart::new); - this.p2PTunnelFluids = createPart("fluid_p2p_tunnel", FluidP2PTunnelPart.class, FluidP2PTunnelPart::new); - this.p2PTunnelEU = null; // FIXME createPart( "ic2_p2p_tunnel", PartType.P2P_TUNNEL_IC2, - // PartP2PIC2Power.class, PartP2PIC2Power::new); - this.p2PTunnelFE = createPart("fe_p2p_tunnel", FEP2PTunnelPart.class, FEP2PTunnelPart::new); - this.p2PTunnelLight = createPart("light_p2p_tunnel", LightP2PTunnelPart.class, LightP2PTunnelPart::new); - this.interfaceTerminal = createPart("interface_terminal", InterfaceTerminalPart.class, - InterfaceTerminalPart::new); - this.fluidTerminal = createPart("fluid_terminal", FluidTerminalPart.class, FluidTerminalPart::new); +// FIXME FABRIC this.storageBus = createPart("storage_bus", StorageBusPart.class, StorageBusPart::new); +// FIXME FABRIC this.fluidStorageBus = createPart("fluid_storage_bus", FluidStorageBusPart.class, FluidStorageBusPart::new); +// FIXME FABRIC this.importBus = createPart("import_bus", ImportBusPart.class, ImportBusPart::new); +// FIXME FABRIC this.fluidImportBus = createPart("fluid_import_bus", FluidImportBusPart.class, FluidImportBusPart::new); +// FIXME FABRIC this.exportBus = createPart("export_bus", ExportBusPart.class, ExportBusPart::new); +// FIXME FABRIC this.fluidExportBus = createPart("fluid_export_bus", FluidExportBusPart.class, FluidExportBusPart::new); +// FIXME FABRIC this.levelEmitter = createPart("level_emitter", LevelEmitterPart.class, LevelEmitterPart::new); +// FIXME FABRIC this.fluidLevelEmitter = createPart("fluid_level_emitter", FluidLevelEmitterPart.class, +// FIXME FABRIC FluidLevelEmitterPart::new); +// FIXME FABRIC this.annihilationPlane = createPart("annihilation_plane", AnnihilationPlanePart.class, +// FIXME FABRIC AnnihilationPlanePart::new); +// FIXME FABRIC this.identityAnnihilationPlane = createPart("identity_annihilation_plane", IdentityAnnihilationPlanePart.class, +// FIXME FABRIC IdentityAnnihilationPlanePart::new); +// FIXME FABRIC this.fluidAnnihilationPlane = createPart("fluid_annihilation_plane", FluidAnnihilationPlanePart.class, +// FIXME FABRIC FluidAnnihilationPlanePart::new); +// FIXME FABRIC this.formationPlane = createPart("formation_plane", FormationPlanePart.class, FormationPlanePart::new); +// FIXME FABRIC this.fluidFormationPlane = createPart("fluid_formation_plane", FluidFormationPlanePart.class, +// FIXME FABRIC FluidFormationPlanePart::new); +// FIXME FABRIC this.patternTerminal = createPart("pattern_terminal", PatternTerminalPart.class, PatternTerminalPart::new); +// FIXME FABRIC this.craftingTerminal = createPart("crafting_terminal", CraftingTerminalPart.class, CraftingTerminalPart::new); +// FIXME FABRIC this.terminal = createPart("terminal", TerminalPart.class, TerminalPart::new); +// FIXME FABRIC this.storageMonitor = createPart("storage_monitor", StorageMonitorPart.class, StorageMonitorPart::new); +// FIXME FABRIC this.conversionMonitor = createPart("conversion_monitor", ConversionMonitorPart.class, +// FIXME FABRIC ConversionMonitorPart::new); +// FIXME FABRIC this.iface = createPart("cable_interface", InterfacePart.class, InterfacePart::new); +// FIXME FABRIC this.fluidIface = createPart("cable_fluid_interface", FluidInterfacePart.class, FluidInterfacePart::new); +// FIXME FABRIC this.p2PTunnelME = createPart("me_p2p_tunnel", MEP2PTunnelPart.class, MEP2PTunnelPart::new); +// FIXME FABRIC this.p2PTunnelRedstone = createPart("redstone_p2p_tunnel", RedstoneP2PTunnelPart.class, +// FIXME FABRIC RedstoneP2PTunnelPart::new); +// FIXME FABRIC this.p2PTunnelItems = createPart("item_p2p_tunnel", ItemP2PTunnelPart.class, ItemP2PTunnelPart::new); +// FIXME FABRIC this.p2PTunnelFluids = createPart("fluid_p2p_tunnel", FluidP2PTunnelPart.class, FluidP2PTunnelPart::new); +// FIXME FABRIC this.p2PTunnelEU = null; // FIXME createPart( "ic2_p2p_tunnel", PartType.P2P_TUNNEL_IC2, +// FIXME FABRIC // PartP2PIC2Power.class, PartP2PIC2Power::new); +// FIXME FABRIC this.p2PTunnelFE = createPart("fe_p2p_tunnel", FEP2PTunnelPart.class, FEP2PTunnelPart::new); +// FIXME FABRIC this.p2PTunnelLight = createPart("light_p2p_tunnel", LightP2PTunnelPart.class, LightP2PTunnelPart::new); +// FIXME FABRIC this.interfaceTerminal = createPart("interface_terminal", InterfaceTerminalPart.class, +// FIXME FABRIC InterfaceTerminalPart::new); +// FIXME FABRIC this.fluidTerminal = createPart("fluid_terminal", FluidTerminalPart.class, FluidTerminalPart::new); + + this.storageBus = null; + this.importBus = null; + this.exportBus = null; + this.iface = null; + this.fluidIface = null; + this.levelEmitter = null; + this.fluidLevelEmitter = null; + this.annihilationPlane = null; + this.identityAnnihilationPlane = null; + this.fluidAnnihilationPlane = null; + this.formationPlane = null; + this.fluidFormationPlane = null; + this.p2PTunnelME = null; + this.p2PTunnelRedstone = null; + this.p2PTunnelItems = null; + this.p2PTunnelFluids = null; + this.p2PTunnelEU = null; + this.p2PTunnelFE = null; + this.p2PTunnelLight = null; + this.interfaceTerminal = null; + this.patternTerminal = null; + this.craftingTerminal = null; + this.terminal = null; + this.storageMonitor = null; + this.conversionMonitor = null; + this.fluidImportBus = null; + this.fluidExportBus = null; + this.fluidTerminal = null; + this.fluidStorageBus = null; this.registry = null; this.partModels = null;