User Tools

Site Tools


tutorial:datagen_model

This is an old revision of the document!


Model Generation

We know that almost every item needs a corresponding item baked model (or item model for short), and an item models definition since 1.21.4. Each block needs a block baked model (or block model for short) and a block states definition, and a corresponding item baked model or item models definition. A simble block requires so much complicated JSON files! Obviously, it's too hard to build each file manually. Therefore, we use data generator to generate models for blocks and items.

In data generator, models and definitions are generated together. Usually, when generation a model, a model id is returned, which will be used in the block states definition or item models definition. We will go into that from simple ones to details.

:!: Note: In the tutorials created previously, there may be some JSON files already created in the resources folder. When the data generator generates a JSON file with a same filename, the file will conflict with our manually-created JSONs. Therefore, before running data generators, please delete them.
:!: Note: Since 1.21.4, data generation are divided into client and server. In vanilla, classes related to models will be annotated @Environment(EnvType.CLIENT) which will be available only in client environment. If you find errors due to server environments when you run data generator, please refer to datagen_setup, and modify the fabricApi block in the build.gradle to enable client environment, and regenerate IDE's run configs.

Preparation

First, create a class that extends FabricModelProvider and register it in the datagen entrypoint:

TutorialModelGenerator.java
public static class TutorialModelGenerator extends FabricModelProvider {
  public TutorialModelGenerator(FabricDataOutput output) {
    super(output);
  }
 
 
  @Override
  public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {
    // ...
  }
 
 
  @Override
  public void generateItemModels(ItemModelGenerator itemModelGenerator) {
    // ...
  }
}
ExampleModDataGenerator.java
public class ExampleModDataGenerator implements DataGeneratorEntrypoint {
  @Override
  public void onInitializeDataGenerator(FabricDataGenerator generator) {
    // ...
 
    pack.addProvider(TutorialModelGenerator::new);
  }
}

Simple block model

We have already created an example block in the blocks tutorial. We just use several short codes to create block states definition and block model:

TutorialModelGenerator.java
  @Override
  public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {
    blockStateModelGenerator.registerSimpleCubeAll(TutorialBlocks.EXAMPLE_BLOCK);
  }

The line of code creates a simplest block model, which is a full block, in which all sides use the texture identical to its id: tutorial:block/example_block. Note that the texture is a picture and is usually not generated with data generator. It will also create a simplest block states definition which directly uses its block model.

You can also write like this (the following code is also in the generateBlockStateModels method), which allows you to specify a different block model type. The returned value in the first line is the model id, which will be used when generating block states definitions:

    final Identifier exampleBlockModelId = TexturedModel.CUBE_ALL.upload(TutorialBlocks.EXAMPLE_BLOCK, blockStateModelGenerator.modelCollector);
    blockStateModelGenerator.registerParentedItemModel(TutorialBlocks.EXAMPLE_BLOCK, exampleBlockModelId);

To specify a different texture, you can create a block model manually (for example, all six faces using the mangrove log's top texture):

    final Identifier exampleBlockModelId = Models.CUBE_ALL.upload(TutorialBlocks.EXAMPLE_BLOCK, TextureMap.all(Identifier.ofVanilla("block/mangrove_log_top")), blockStateModelGenerator.modelCollector);
    blockStateModelGenerator.registerParentedItemModel(TutorialBlocks.EXAMPLE_BLOCK, exampleBlockModelId);

Adding Item Models

The ItemModelGenerator contains miscellaneous methods to create item models.

In this example, we will override the item model generated from the SIMPLE_BLOCK block model in the previous example. We will generate an item model from SIMPLE_BLOCK_ITEM

public static Block SIMPLE_BLOCK = Registry.register(Registries.BLOCK, new Identifier("tutorial", "simple_block"), new Block(...));
public static BlockItem SIMPLE_BLOCK_ITEM = Registry.register(Registries.ITEM, ..., new BlockItem(SIMPLE_BLOCK, ...));
// ...
 
@Override
public void generateItemModels(ItemModelGenerator itemModelGenerator) {
	itemModelGenerator.register(SIMPLE_BLOCK_ITEM, Models.GENERATED);
}

FIXME This is not done yet!!

Addin Data Generation For a Directional Block

QUICK WARNING: This is very complicated as heck!!!

In this, example, we will generate directional blockstates for our MACHINE_BLOCK

Firstly, we add the block itself and register it!

// In the Tutorial class (or your mod initializer class)
public static final Block MACHINE_BLOCK = new Block(FabricBlockSettings.copy(Blocks.BLAST_FURNACE));
 
@Override
public void onInitialize() {
    Registry.register(Registries.BLOCK, new Identifier("tutorial", "machine"), MACHINE_BLOCK);
}

Now that we have successfully registered our block, let's get to the good stuff!

private static class MyModelGenerator extends FabricModelProvider {
	private MyModelGenerator(FabricDataOutput generator) {
		super(generator);
	}
 
	@Override
	public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {
		// ...
                blockStateModelGenerator.blockStateCollector.accept(MultipartBlockStateSupplier.create(Tutorial.MACHINE_BLOCK)
                          .with(When.create().set(Properties.HORIZONTAL_FACING, Direction.NORTH),
                          BlockStateVariant.create().put(VariantSettings.X, VariantSettings.Rotation.X)));
	}
 
	@Override
	public void generateItemModels(ItemModelGenerator itemModelGenerator) {
		// ...
	}
}
tutorial/datagen_model.1744894976.txt.gz · Last modified: 2025/04/17 13:02 by solidblock