Jump to content

[1.14.4] Displaying vanilla items on ground perspective.


mooviies

Recommended Posts

I'm trying to take the existing models of the items in minecraft and display them on the ground. It's pretty easy using a custom model but it would take a lot of time to do it for every items.

There's not a lot of documentation on 1.14 as of now and the best I could find seems to be from 1.12? Event the description in 1.13 doc doesn't seem to be up to date.

 

I also want to use baked model and not a TER which isn't the best for the performance. Especially since the models wouldn't change after the initialisation of the game.

I did a lot of digging in forge's code to try understanding what's exactly happening. I managed to use the ModelBakeEvent to add a custom IBakedModel.

I override the getQuads method and return a model that I got from the ModelManager. For now I'm just trying to do it with flint.

 

Since the only model present in the registry is the inventory variant of flint, I get the inventory model. Which is not made to be displayed in the world.

The result is a vertical flint with a black baground in the world.

 

I'm really lost as to what to do next. I probably need to apply some transforms to show it properly, but I don't know where or how to apply them and can't seem to find out. I've came across PerspectiveMapWrapper but I don't know what to pass to give it the OnGround perspective. There's a lot of deprecated methods and I'm not sure what I should use.

 

Here's some relevant parts of my code.

 

My IBakedModel

public class MBlockItemBakedModel implements IBakedModel {
    @Override
    public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getQuads(state, side, rand);
    }

    @Override
    public boolean isAmbientOcclusion() {
        return true;
    }

    @Override
    public boolean isGui3d() {
        return false;
    }

    @Override
    public boolean isBuiltInRenderer() {
        return false;
    }

    @Override
    public TextureAtlasSprite getParticleTexture() {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getParticleTexture();
    }

    @Override
    public ItemOverrideList getOverrides() {
        return Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel(new ModelResourceLocation("minecraft:flint", "inventory")).getOverrides();
    }
}

 

The onBakeEvent

@SubscribeEvent
public static void onBakeEvent(ModelBakeEvent event)
{
  Map<ResourceLocation, IBakedModel> modelRegistry = event.getModelRegistry();
  modelRegistry.put(new ModelResourceLocation(SCResourcesLocations.BLOCK_ITEM, ""), new MBlockItemBakedModel());
}

 

Thanks for any input!

Edited by mooviies
removed test code
Link to comment
Share on other sites

10 minutes ago, mooviies said:

Map<ResourceLocation, IBakedModel> modelTest = new HashMap<>();  for(ResourceLocation r : modelRegistry.keySet()) { if(r.toString().contains("flint")) modelTest.put(r, modelRegistry.get(r)); }

What is this even supposed to do?...

 

10 minutes ago, mooviies said:

SCResourcesLocations.BLOCK_ITEM

What is this?

11 minutes ago, mooviies said:

Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes().getModelManager().getModel

Why are you using this? Flint isn't a Block. Use what ItemRenderer uses.(Take a look at it's class).

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Quote

What is this even supposed to do?...

That was some test code to look at what was in the registry. I forgot to remove it from my example. It does nothing. I removed it with an edit just after my post. You probably saw it before the edit.

 

Quote

What is this?

It's just a constant to a resource location

public static final ResourceLocation BLOCK_ITEM = new ResourceLocation(MyMod.MOD_ID, "sc_block_item");

 

Quote

Why are you using this? Flint isn't a Block. Use what ItemRenderer uses.(Take a look at it's class).

I just want to get the ModelManager which is the same for blocks and items as per the forge wiki.

Quote

The ModelManager may be acquired, without reflection or access tranformation, through Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager() or Minecraft.getMinecraft().getBlockRenderDispatcher().getBlockModelShapes().getModelManager(). Contrary to their names, these are equivalent.

 

Edited by mooviies
Link to comment
Share on other sites

@Animefan8888 thanks for the suggestion to look at ItemRenderer. This looks like to be what I'm searching for.

 

Already, the way to get the item's model looks less hacky. However it still does the same thing. I tried to do the same thing as in the renderItem method but it still does the same thing as my previous code.

 

I'm still investigating the class, if anyone as any input let me know :)

 

Here's my modified code

public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, @Nonnull IModelData extraData) {
  IBakedModel ibakedmodel = Minecraft.getInstance().getItemRenderer().getModelWithOverrides(new ItemStack(Items.FLINT));
  return ForgeHooksClient.handleCameraTransforms(ibakedmodel, ItemCameraTransforms.TransformType.GROUND, false).getQuads(state, side, rand);
}

 

and also, something I didn't include in my first post. The result of the rendering.

 

2019-09-15_11.35.45.png

Link to comment
Share on other sites

Well, your block is telling the game that it is a block that completely fills its space and is opaque. This is default behavior. As such the game culled all the faces on its neighbors.

Edited by Draco18s

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

The background isn't really the problem. Just didn't set a block with the right configs for my test. What I really need to know is how to apply a transform to an IBakedModel if it's possible at all. It looks like I need to use the handleperspective method but my override is never called for some reason.

 

I'd want the item to be flat on the ground. So I'd need to apply a 90degree rotation.

 

EDIT:

 

I added an example of what I want. Right now I can do that using a custom model. However, I want to do the same thing using the item's model (So I don't have to create a model for all the items). I also don't want to use a TER since it's not good if I have a lot of those in the world.

2019-09-15_11.58.49.png

2019-09-15_17.02.05.png

Edited by mooviies
Link to comment
Share on other sites

From what I think I understand. handlePerspective is only called when a model is rendered as an item and not when a block is rendered. So maybe, with a block there's no way to transform a model unless you use a TileEntityRenderer? I was really hoping to find a way around using a TER for that if possible at all. There must be a way since Minecraft is able to create IBakedModels with rotations when reading blockstate config files. I guess I'll start digging into the IBakedModels generation from the blockstates.

 

EDIT

Looks like I need to look into IUnbakedModel and create the model from there, a bit like forge does with its bucket.

Edited by mooviies
Link to comment
Share on other sites

From what I've gathered I need to make an IUnbakedModel which represents the model. However I don't seem to find how to register it in 1.14. 

 

I've hooked onto the ModelRegistryEvent which seems to be the right one. I use it to register a ICustomModelLoader.

@SubscribeEvent
public static void onModelsRegistry(ModelRegistryEvent event)
{
  ModelLoaderRegistry.registerLoader(new MBlockItemModelLoader());
}

 

and I've created a dummy IUnbakedModel that just returns my current IBakedModel. I just want to get the same result that I have for now but using an IUnbakedModel.

For now I my ICustomModelLoader only returns my model. I've added in the accepts method that it accepts the resource location for my block. I've put breakpoints into both methods and none of the them are ever called so it must not have been registered correctly. 

 

public class MBlockItemModelLoader implements ICustomModelLoader {
    @Override
    public void onResourceManagerReload(IResourceManager resourceManager) {
    }

    @Override
    public boolean accepts(ResourceLocation modelLocation) {
        return modelLocation == SCResourcesLocations.BLOCK_ITEM; // Breakpoint here
    }

    @Override
    public IUnbakedModel loadModel(ResourceLocation modelLocation) throws Exception {
        return new MBlockItemModel();  // Breakpoint here
    }
}

 

How do I register it in 1.14? Or is there actually a whole other system I'm missing? I'm still trying to reverse engineer all of that but there's not really any vanilla block that does that. They seem to all use blockstates and json models. If you are aware of any mod that does that kind of stuff and has its source code available, I'd love to get a link to look into it :) 

Edited by mooviies
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.