diff --git a/patches/minecraft/net/minecraft/client/renderer/model/SimpleBakedModel.java.patch b/patches/minecraft/net/minecraft/client/renderer/model/SimpleBakedModel.java.patch index 17a0355d7..685bb5182 100644 --- a/patches/minecraft/net/minecraft/client/renderer/model/SimpleBakedModel.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/model/SimpleBakedModel.java.patch @@ -5,7 +5,7 @@ private final ItemCameraTransforms field_177651_f; + public Builder(net.minecraftforge.client.model.IModelConfiguration model, ItemOverrideList overrides) { -+ this(model.useSmoothLighting(), model.isShadedInGui(), true/*TODO: Forge*/, model.getCameraTransforms(), overrides); ++ this(model.useSmoothLighting(), model.isShadedInGui(), model.isSideLit(), model.getCameraTransforms(), overrides); + } + public Builder(BlockModel p_i230060_1_, ItemOverrideList p_i230060_2_, boolean p_i230060_3_) { diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch index 965514c91..34f45af06 100644 --- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch @@ -17,14 +17,13 @@ p_195667_3_[i].func_227788_a_(i, this.field_110975_c >> i, this.field_110974_d >> i, p_195667_1_ >> i, p_195667_2_ >> i, this.field_229226_c_.field_229245_b_ >> i, this.field_229226_c_.field_229246_c_ >> i, this.field_195670_c.length > 1, false); } -@@ -341,4 +342,10 @@ +@@ -341,4 +342,9 @@ } } -+ ++ + // Forge Start -+ + public int getPixelRGBA(int frameIndex, int x, int y) { -+ return this.field_195670_c[frameIndex].func_195709_a(x + this.field_195671_d[frameIndex] * func_94211_a(), y + this.field_195672_e[frameIndex] * func_94216_b()); ++ return this.field_195670_c[0].func_195709_a(x + this.field_195671_d[frameIndex] * func_94211_a(), y + this.field_195672_e[frameIndex] * func_94216_b()); + } } diff --git a/src/main/java/net/minecraftforge/client/event/RenderNameplateEvent.java b/src/main/java/net/minecraftforge/client/event/RenderNameplateEvent.java index c88d5fea9..87b771e5a 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderNameplateEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderNameplateEvent.java @@ -1,3 +1,22 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2019. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + package net.minecraftforge.client.event; import com.mojang.blaze3d.matrix.MatrixStack; diff --git a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java index 3d4be23ad..0b88c6c9e 100644 --- a/src/main/java/net/minecraftforge/client/model/BakedItemModel.java +++ b/src/main/java/net/minecraftforge/client/model/BakedItemModel.java @@ -43,13 +43,15 @@ public class BakedItemModel implements IBakedModel protected final ImmutableMap transforms; protected final ItemOverrideList overrides; protected final IBakedModel guiModel; + protected final boolean isSideLit; - public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, boolean untransformed) + public BakedItemModel(ImmutableList quads, TextureAtlasSprite particle, ImmutableMap transforms, ItemOverrideList overrides, boolean untransformed, boolean isSideLit) { this.quads = quads; this.particle = particle; this.transforms = transforms; this.overrides = overrides; + this.isSideLit = isSideLit; this.guiModel = untransformed && hasGuiIdentity(transforms) ? new BakedGuiItemModel<>(this) : null; } @@ -61,7 +63,7 @@ public class BakedItemModel implements IBakedModel @Override public boolean isAmbientOcclusion() { return true; } @Override public boolean isGui3d() { return false; } - @Override public boolean func_230044_c_() { return false; } + @Override public boolean func_230044_c_() { return isSideLit; } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getParticleTexture() { return particle; } @Override public ItemOverrideList getOverrides() { return overrides; } diff --git a/src/main/java/net/minecraftforge/client/model/BlockModelConfiguration.java b/src/main/java/net/minecraftforge/client/model/BlockModelConfiguration.java index 723471bd1..82a680420 100644 --- a/src/main/java/net/minecraftforge/client/model/BlockModelConfiguration.java +++ b/src/main/java/net/minecraftforge/client/model/BlockModelConfiguration.java @@ -106,7 +106,13 @@ public class BlockModelConfiguration implements IModelConfiguration @Override public boolean isShadedInGui() { - return owner.func_230176_c_() == BlockModel.GuiLight.SIDE; + return true; + } + + @Override + public boolean isSideLit() + { + return owner.func_230176_c_().func_230178_a_(); } @Override diff --git a/src/main/java/net/minecraftforge/client/model/DummyAtlasSprite.java b/src/main/java/net/minecraftforge/client/model/DummyAtlasSprite.java deleted file mode 100644 index ca22eca79..000000000 --- a/src/main/java/net/minecraftforge/client/model/DummyAtlasSprite.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Minecraft Forge - * Copyright (c) 2016-2019. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation version 2.1 - * of the License. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package net.minecraftforge.client.model; - -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.util.ResourceLocation; - -import java.util.function.Function; - -/** - * For use when loading a custom model for use in entity/tileentity renderers, or other situations in which the main atlas is not wanted. - */ -/* -public class DummyAtlasSprite extends TextureAtlasSprite -{ - public static final TextureAtlasSprite INSTANCE = new DummyAtlasSprite(); - public static final Function GETTER = t -> INSTANCE; - - private DummyAtlasSprite() - { - super(new ResourceLocation("forge", "dummy"), 1, 1); - // Set the min/max coords to 0..1 range, to use the full texture. - func_217789_a(0, 0, 1, 1); - } -} -*/ \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/client/model/DynamicBucketModel.java b/src/main/java/net/minecraftforge/client/model/DynamicBucketModel.java index c0c104831..d801c243d 100644 --- a/src/main/java/net/minecraftforge/client/model/DynamicBucketModel.java +++ b/src/main/java/net/minecraftforge/client/model/DynamicBucketModel.java @@ -32,7 +32,6 @@ import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.texture.MissingTextureSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.LivingEntity; import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluids; @@ -185,7 +184,7 @@ public final class DynamicBucketModel implements IModelGeometry cache; // contains all the baked models since they'll never change private final IModelTransform originalTransform; + private final boolean isSideLit; BakedModel(ModelBakery bakery, IModelConfiguration owner, DynamicBucketModel parent, @@ -305,13 +305,14 @@ public final class DynamicBucketModel implements IModelGeometry transforms, Map cache, boolean untransformed, - IModelTransform originalTransform) + IModelTransform originalTransform, boolean isSideLit) { - super(quads, particle, transforms, new ContainedFluidOverrideHandler(bakery), untransformed); + super(quads, particle, transforms, new ContainedFluidOverrideHandler(bakery), untransformed, isSideLit); this.owner = owner; this.parent = parent; this.cache = cache; this.originalTransform = originalTransform; + this.isSideLit = isSideLit; } } diff --git a/src/main/java/net/minecraftforge/client/model/FancyMissingModel.java b/src/main/java/net/minecraftforge/client/model/FancyMissingModel.java index ab2f5843a..225202a17 100644 --- a/src/main/java/net/minecraftforge/client/model/FancyMissingModel.java +++ b/src/main/java/net/minecraftforge/client/model/FancyMissingModel.java @@ -178,7 +178,7 @@ final class FancyMissingModel implements IUnbakedModel public boolean isGui3d() { return false; } @Override - public boolean func_230044_c_() { return false; } // TODO: Forge: Auto-generated method stub + public boolean func_230044_c_() { return false; } @Override public boolean isBuiltInRenderer() { return false; } diff --git a/src/main/java/net/minecraftforge/client/model/FluidModel.java b/src/main/java/net/minecraftforge/client/model/FluidModel.java index ade96b813..c2c340830 100644 --- a/src/main/java/net/minecraftforge/client/model/FluidModel.java +++ b/src/main/java/net/minecraftforge/client/model/FluidModel.java @@ -442,7 +442,6 @@ public final class FluidModel implements IModelGeometry @Override public boolean func_230044_c_() { - // TODO: Forge: Auto-generated method stub return false; } diff --git a/src/main/java/net/minecraftforge/client/model/IModelConfiguration.java b/src/main/java/net/minecraftforge/client/model/IModelConfiguration.java index 1b3899a7b..b70435504 100644 --- a/src/main/java/net/minecraftforge/client/model/IModelConfiguration.java +++ b/src/main/java/net/minecraftforge/client/model/IModelConfiguration.java @@ -62,6 +62,11 @@ public interface IModelConfiguration { */ boolean isShadedInGui(); + /** + * @return True if the item is lit from the side + */ + boolean isSideLit(); + /** * @return True if the item requires per-vertex lighting. */ diff --git a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java index 80d58d8de..7e410f48c 100644 --- a/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/ItemLayerModel.java @@ -26,7 +26,6 @@ import net.minecraft.client.renderer.TransformationMatrix; import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; @@ -91,7 +90,7 @@ public final class ItemLayerModel implements IModelGeometry owner.isTexturePresent("particle") ? owner.resolveTexture("particle") : textures.get(0) ); ImmutableMap map = PerspectiveMapWrapper.getTransforms(modelTransform); - return new BakedItemModel(quads, particle, map, overrides, transform.isIdentity()); + return new BakedItemModel(quads, particle, map, overrides, transform.isIdentity(), owner.isSideLit()); } public static ImmutableList getQuadsForSprites(List textures, TransformationMatrix transform, Function spriteGetter) diff --git a/src/main/java/net/minecraftforge/client/model/ModelLoaderRegistry.java b/src/main/java/net/minecraftforge/client/model/ModelLoaderRegistry.java index cb122d8af..52afb38da 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelLoaderRegistry.java +++ b/src/main/java/net/minecraftforge/client/model/ModelLoaderRegistry.java @@ -47,35 +47,50 @@ import java.util.*; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * Central hub for custom model loaders. */ public class ModelLoaderRegistry { + public static final String WHITE_TEXTURE = "forge:white"; + private static final Map> loaders = Maps.newHashMap(); + private static volatile boolean registryFrozen = false; // Forge built-in loaders public static void init() { - registerLoader(new ResourceLocation("forge:obj"), OBJLoader.INSTANCE); - registerLoader(new ResourceLocation("forge:bucket"), DynamicBucketModel.Loader.INSTANCE); - registerLoader(new ResourceLocation("forge:composite"), CompositeModel.Loader.INSTANCE); - registerLoader(new ResourceLocation("minecraft:elements"), VanillaProxy.Loader.INSTANCE); - registerLoader(new ResourceLocation("forge:multi-layer"), MultiLayerModel.Loader.INSTANCE); + registerLoader(new ResourceLocation("minecraft","elements"), VanillaProxy.Loader.INSTANCE); + registerLoader(new ResourceLocation("forge","obj"), OBJLoader.INSTANCE); + registerLoader(new ResourceLocation("forge","bucket"), DynamicBucketModel.Loader.INSTANCE); + registerLoader(new ResourceLocation("forge","composite"), CompositeModel.Loader.INSTANCE); + registerLoader(new ResourceLocation("forge","multi-layer"), MultiLayerModel.Loader.INSTANCE); // TODO: Implement as new model loaders //registerLoader(new ResourceLocation("forge:b3d"), new ModelLoaderAdapter(B3DLoader.INSTANCE)); //registerLoader(new ResourceLocation("forge:fluid"), new ModelLoaderAdapter(ModelFluid.FluidLoader.INSTANCE)); } + public static void initComplete() + { + registryFrozen = true; + } + /** * Makes system aware of your loader. */ public static void registerLoader(ResourceLocation id, IModelLoader loader) { - loaders.put(id, loader); - ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).addReloadListener(loader); + if (registryFrozen) + throw new IllegalStateException("Can not register model loaders after models have started loading. Please use FMLClientSetupEvent or ModelRegistryEvent to register your loaders."); + + synchronized(loaders) + { + loaders.put(id, loader); + ((IReloadableResourceManager) Minecraft.getInstance().getResourceManager()).addReloadListener(loader); + } } public static IModelGeometry getModel(ResourceLocation loaderId, JsonDeserializationContext deserializationContext, JsonObject data) @@ -83,7 +98,10 @@ public class ModelLoaderRegistry try { if (!loaders.containsKey(loaderId)) - throw new IllegalStateException(String.format("Model loader '%s' not found.", loaderId)); + { + throw new IllegalStateException(String.format("Model loader '%s' not found. Registered loaders: %s", loaderId, + loaders.keySet().stream().map(ResourceLocation::toString).collect(Collectors.joining(", ")))); + } IModelLoader loader = loaders.get(loaderId); @@ -106,12 +124,26 @@ public class ModelLoaderRegistry return getModel(loader, deserializationContext, object); } - private static final Pattern FILESYSTEM_PATH_TO_RESLOC = Pattern.compile("(?:.*[\\\\/]assets[\\\\/](?[a-z_-]+)[\\\\/]textures[\\\\/])?(?[a-z_\\\\/-]+)\\.png"); + /* Explanation: + * This takes anything that looks like a valid resourcepack texture location, and tries to extract a resourcelocation out of it. + * 1. it will ignore anything up to and including an /assets/ folder, + * 2. it will take the next path component as a namespace, + * 3. it will match but skip the /textures/ part of the path, + * 4. it will take the rest of the path up to but excluding the .png extension as the resource path + * It's a best-effort situation, to allow model files exported by modelling software to be used without post-processing. + * Example: + * C:\Something\Or Other\src\main\resources\assets\mymodid\textures\item\my_thing.png + * ........................................--------_______----------_____________---- + * + * Result after replacing '\' to '/': mymodid:item/my_thing + */ + private static final Pattern FILESYSTEM_PATH_TO_RESLOC = + Pattern.compile("(?:.*[\\\\/]assets[\\\\/](?[a-z_-]+)[\\\\/]textures[\\\\/])?(?[a-z_\\\\/-]+)\\.png"); public static Material resolveTexture(@Nullable String tex, IModelConfiguration owner) { if (tex == null) - return blockMaterial("forge:white"); + return blockMaterial(WHITE_TEXTURE); if (tex.startsWith("#")) return owner.resolveTexture(tex); diff --git a/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java b/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java index 40ce492d5..3cd7f572e 100644 --- a/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java +++ b/src/main/java/net/minecraftforge/client/model/MultiLayerModel.java @@ -93,7 +93,7 @@ public final class MultiLayerModel implements IModelGeometry return new MultiLayerBakedModel( owner.useSmoothLighting(), owner.isShadedInGui(), - spriteGetter.apply(owner.resolveTexture("particle")), overrides, + owner.isSideLit(), spriteGetter.apply(owner.resolveTexture("particle")), overrides, buildModels(models, modelTransform, bakery, spriteGetter, modelLocation), missing.func_225613_a_(bakery, spriteGetter, modelTransform, modelLocation), PerspectiveMapWrapper.getTransforms(new ModelTransformComposition(owner.getCombinedTransform(), modelTransform))); @@ -105,14 +105,16 @@ public final class MultiLayerModel implements IModelGeometry private final ImmutableMap cameraTransforms; protected final boolean ambientOcclusion; protected final boolean gui3d; + protected final boolean isSideLit; protected final TextureAtlasSprite particle; protected final ItemOverrideList overrides; private final IBakedModel missing; public MultiLayerBakedModel( - boolean ambientOcclusion, boolean isGui3d, TextureAtlasSprite particle, ItemOverrideList overrides, + boolean ambientOcclusion, boolean isGui3d, boolean isSideLit, TextureAtlasSprite particle, ItemOverrideList overrides, ImmutableMap models, IBakedModel missing, ImmutableMap cameraTransforms) { + this.isSideLit = isSideLit; this.models = models; this.cameraTransforms = cameraTransforms; this.missing = missing; @@ -167,8 +169,7 @@ public final class MultiLayerModel implements IModelGeometry @Override public boolean func_230044_c_() { - // TODO: Forge: Auto-generated method stub - return false; + return isSideLit; } @Override diff --git a/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java b/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java index 5881cc146..83e5fb61a 100644 --- a/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java +++ b/src/main/java/net/minecraftforge/client/model/b3d/B3DLoader.java @@ -44,7 +44,6 @@ import net.minecraft.client.renderer.Vector3f; import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.texture.AtlasTexture; import net.minecraft.client.renderer.texture.MissingTextureSprite; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraftforge.client.model.*; import net.minecraftforge.common.model.*; @@ -151,9 +150,9 @@ public enum B3DLoader implements ISelectiveResourceReloadListener if(model == null) throw new ModelLoadingException("Error loading model previously: " + file); if(!(model.getRoot().getKind() instanceof Mesh)) { - return new ModelWrapper(modelLocation, model, ImmutableSet.of(), true, true, 1); + return new ModelWrapper(modelLocation, model, ImmutableSet.of(), true, true, true, 1); } - return new ModelWrapper(modelLocation, model, ImmutableSet.of(model.getRoot().getName()), true, true, 1); + return new ModelWrapper(modelLocation, model, ImmutableSet.of(model.getRoot().getName()), true, true, true, 1); } public static final class B3DState implements IModelTransform @@ -406,18 +405,20 @@ public enum B3DLoader implements ISelectiveResourceReloadListener private final ImmutableMap textures; private final boolean smooth; private final boolean gui3d; + private final boolean isSideLit; private final int defaultKey; - public ModelWrapper(ResourceLocation modelLocation, B3DModel model, ImmutableSet meshes, boolean smooth, boolean gui3d, int defaultKey) + public ModelWrapper(ResourceLocation modelLocation, B3DModel model, ImmutableSet meshes, boolean smooth, boolean gui3d, boolean isSideLit, int defaultKey) { - this(modelLocation, model, meshes, smooth, gui3d, defaultKey, buildTextures(model.getTextures())); + this(modelLocation, model, meshes, smooth, gui3d, isSideLit, defaultKey, buildTextures(model.getTextures())); } - public ModelWrapper(ResourceLocation modelLocation, B3DModel model, ImmutableSet meshes, boolean smooth, boolean gui3d, int defaultKey, ImmutableMap textures) + public ModelWrapper(ResourceLocation modelLocation, B3DModel model, ImmutableSet meshes, boolean smooth, boolean gui3d, boolean isSideLit, int defaultKey, ImmutableMap textures) { this.modelLocation = modelLocation; this.model = model; this.meshes = meshes; + this.isSideLit = isSideLit; this.textures = textures; this.smooth = smooth; this.gui3d = gui3d; @@ -477,7 +478,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener } } builder.put("missingno", missing); - return new BakedWrapper(model.getRoot(), modelTransform, smooth, gui3d, meshes, builder.build()); + return new BakedWrapper(model.getRoot(), modelTransform, smooth, gui3d, isSideLit, meshes, builder.build()); } public ModelWrapper retexture(ImmutableMap textures) @@ -501,7 +502,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener builder.put(e); } } - return new ModelWrapper(modelLocation, model, meshes, smooth, gui3d, defaultKey, builder.build()); + return new ModelWrapper(modelLocation, model, meshes, smooth, gui3d, isSideLit, defaultKey, builder.build()); } public ModelWrapper process(ImmutableMap data) @@ -514,7 +515,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener JsonElement e = new JsonParser().parse(data.get("mesh")); if(e.isJsonPrimitive() && e.getAsJsonPrimitive().isString()) { - return new ModelWrapper(modelLocation, model, ImmutableSet.of(e.getAsString()), smooth, gui3d, defaultKey, textures); + return new ModelWrapper(modelLocation, model, ImmutableSet.of(e.getAsString()), smooth, gui3d, isSideLit, defaultKey, textures); } else if (e.isJsonArray()) { @@ -554,7 +555,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener return this; } } - return hasChanged ? new ModelWrapper(modelLocation, model, newMeshes, smooth, gui3d, newDefaultKey, textures) : this; + return hasChanged ? new ModelWrapper(modelLocation, model, newMeshes, smooth, gui3d, isSideLit, newDefaultKey, textures) : this; } @Override @@ -578,7 +579,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener { return this; } - return new ModelWrapper(modelLocation, model, meshes, value, gui3d, defaultKey, textures); + return new ModelWrapper(modelLocation, model, meshes, value, gui3d, isSideLit, defaultKey, textures); } public ModelWrapper gui3d(boolean value) @@ -587,7 +588,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener { return this; } - return new ModelWrapper(modelLocation, model, meshes, smooth, value, defaultKey, textures); + return new ModelWrapper(modelLocation, model, meshes, smooth, value, isSideLit, defaultKey, textures); } } @@ -597,15 +598,16 @@ public enum B3DLoader implements ISelectiveResourceReloadListener private final IModelTransform state; private final boolean smooth; private final boolean gui3d; + private final boolean isSideLit; private final ImmutableSet meshes; private final ImmutableMap textures; private final LoadingCache cache; private ImmutableList quads; - public BakedWrapper(final Node node, final IModelTransform state, final boolean smooth, final boolean gui3d, final ImmutableSet meshes, final ImmutableMap textures) + public BakedWrapper(final Node node, final IModelTransform state, final boolean smooth, final boolean gui3d, boolean isSideLit, final ImmutableSet meshes, final ImmutableMap textures) { - this(node, state, smooth, gui3d, meshes, textures, CacheBuilder.newBuilder() + this(node, state, smooth, gui3d, isSideLit, meshes, textures, CacheBuilder.newBuilder() .maximumSize(128) .expireAfterAccess(2, TimeUnit.MINUTES) .build(new CacheLoader() @@ -625,12 +627,13 @@ public enum B3DLoader implements ISelectiveResourceReloadListener })); } - public BakedWrapper(Node node, IModelTransform state, boolean smooth, boolean gui3d, ImmutableSet meshes, ImmutableMap textures, LoadingCache cache) + public BakedWrapper(Node node, IModelTransform state, boolean smooth, boolean gui3d, boolean isSideLit, ImmutableSet meshes, ImmutableMap textures, LoadingCache cache) { this.node = node; this.state = state; this.smooth = smooth; this.gui3d = gui3d; + this.isSideLit = isSideLit; this.meshes = meshes; this.textures = textures; this.cache = cache; @@ -797,8 +800,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener @Override public boolean func_230044_c_() { - // TODO: Forge: Auto-generated method stub - return false; + return isSideLit; } @Override diff --git a/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java b/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java index 9679143bf..4bc518035 100644 --- a/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java +++ b/src/main/java/net/minecraftforge/fml/client/ClientModLoader.java @@ -125,6 +125,7 @@ public class ClientModLoader private static void postSidedRunnable(Consumer> perModContainerEventProcessor) { RenderingRegistry.loadEntityRenderers(mc.getRenderManager()); + ModelLoaderRegistry.initComplete(); } private static void preSidedRunnable(Consumer> perModContainerEventProcessor) { diff --git a/src/test/java/net/minecraftforge/debug/client/model/NewModelLoaderTest.java b/src/test/java/net/minecraftforge/debug/client/model/NewModelLoaderTest.java index 71d567d8b..95a17a2ef 100644 --- a/src/test/java/net/minecraftforge/debug/client/model/NewModelLoaderTest.java +++ b/src/test/java/net/minecraftforge/debug/client/model/NewModelLoaderTest.java @@ -19,32 +19,37 @@ package net.minecraftforge.debug.client.model; +import com.google.common.collect.ImmutableList; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Pair; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.FourWayBlock; import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.ItemCameraTransforms; -import net.minecraft.client.renderer.texture.AtlasTexture; +import net.minecraft.client.renderer.model.IModelTransform; +import net.minecraft.client.renderer.model.IUnbakedModel; +import net.minecraft.client.renderer.model.ModelBakery; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.entity.Entity; import net.minecraft.inventory.EquipmentSlotType; import net.minecraft.item.*; +import net.minecraft.resources.IResourceManager; import net.minecraft.state.StateContainer; import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.model.ModelLoader; -import net.minecraftforge.client.model.obj.OBJLoader; -import net.minecraftforge.client.model.obj.OBJModel; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.NonNullLazy; +import net.minecraftforge.client.model.IModelBuilder; +import net.minecraftforge.client.model.IModelConfiguration; +import net.minecraftforge.client.model.IModelLoader; +import net.minecraftforge.client.model.ModelLoaderRegistry; +import net.minecraftforge.client.model.geometry.ISimpleModelGeometry; +import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.common.Mod; @@ -54,6 +59,10 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.function.Function; @Mod(NewModelLoaderTest.MODID) public class NewModelLoaderTest @@ -105,11 +114,89 @@ public class NewModelLoaderTest new Item(new Item.Properties().group(ItemGroup.MISC)) ); + public static RegistryObject custom_loader = ITEMS.register("custom_loader", () -> + new Item(new Item.Properties().group(ItemGroup.MISC)) + ); + public NewModelLoaderTest() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); BLOCKS.register(modEventBus); ITEMS.register(modEventBus); + + modEventBus.addListener(this::clientSetup); + } + + public void clientSetup(FMLClientSetupEvent event) + { + ModelLoaderRegistry.registerLoader(new ResourceLocation(MODID, "custom_loader"), new TestLoader()); + } + + static class TestLoader implements IModelLoader + { + @Override + public void onResourceManagerReload(IResourceManager resourceManager) + { + } + + @Override + public TestModel read(JsonDeserializationContext deserializationContext, JsonObject modelContents) + { + return new TestModel(); + } + } + + static class TestModel implements ISimpleModelGeometry + { + @Override + public void addQuads(IModelConfiguration owner, IModelBuilder modelBuilder, ModelBakery bakery, Function spriteGetter, IModelTransform modelTransform, ResourceLocation modelLocation) + { + TextureAtlasSprite texture = spriteGetter.apply(owner.resolveTexture("particle")); + + BakedQuadBuilder builder = new BakedQuadBuilder(); + + builder.setTexture(texture); + builder.setQuadOrientation(Direction.UP); + + putVertex(builder, 0,1,0.5f, texture.getInterpolatedU(0), texture.getInterpolatedV(0), 1, 1, 1); + putVertex(builder, 0,0,0.5f, texture.getInterpolatedU(0), texture.getInterpolatedV(16), 1, 1, 1); + putVertex(builder, 1,0,0.5f, texture.getInterpolatedU(16), texture.getInterpolatedV(16), 1, 1, 1); + putVertex(builder, 1,1,0.5f, texture.getInterpolatedU(16), texture.getInterpolatedV(0), 1, 1, 1); + + modelBuilder.addGeneralQuad(builder.build()); + } + + private void putVertex(BakedQuadBuilder builder, int x, float y, float z, float u, float v, float red, float green, float blue) + { + ImmutableList elements = DefaultVertexFormats.BLOCK.func_227894_c_(); + for(int i=0;i getTextures(IModelConfiguration owner, Function modelGetter, Set> missingTextureErrors) + { + return Collections.singleton(owner.resolveTexture("particle")); + } } } diff --git a/src/test/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java b/src/test/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java index 40b19d844..36db58c0a 100644 --- a/src/test/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java +++ b/src/test/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java @@ -1,3 +1,22 @@ +/* + * Minecraft Forge + * Copyright (c) 2016-2019. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1 + * of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + package net.minecraftforge.debug.client.rendering; import net.minecraft.entity.passive.CowEntity; diff --git a/src/test/resources/assets/new_model_loader_test/models/item/custom_loader.json b/src/test/resources/assets/new_model_loader_test/models/item/custom_loader.json new file mode 100644 index 000000000..065fa0ab6 --- /dev/null +++ b/src/test/resources/assets/new_model_loader_test/models/item/custom_loader.json @@ -0,0 +1,7 @@ +{ + "parent": "forge:item/default", + "loader": "new_model_loader_test:custom_loader", + "textures": { + "particle": "item/quartz" + } +}