more poking, deprecate a RetexturingBakedModel method
This commit is contained in:
parent
11e24ef876
commit
a58562c8a0
@ -1,8 +1,9 @@
|
|||||||
Versions before 2.1.2 have been backfilled; I gotta be more on top of changelogs.
|
Versions before 2.1.2 have been backfilled; I gotta be more on top of changelogs.
|
||||||
|
|
||||||
# 2.1.2 (unreleased)
|
# next version (unreleased)
|
||||||
|
|
||||||
* Remove some unused stuff from the jar
|
* Remove some unused stuff from the jar
|
||||||
|
* Code cleanups, hopefully without breaking ABI compat (i don't have an ABI checker in the pipeline tho)
|
||||||
|
|
||||||
road map:
|
road map:
|
||||||
|
|
||||||
|
@ -3,4 +3,4 @@ org.gradle.jvmargs=-Xmx6G
|
|||||||
|
|
||||||
archivesBaseName=templates
|
archivesBaseName=templates
|
||||||
group=io.github.cottonmc
|
group=io.github.cottonmc
|
||||||
version=2.1.2+1.20.1
|
version=2.2.0+1.20.1
|
@ -90,7 +90,7 @@ public class Templates implements ModInitializer {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//For addon devs: Just make your own BlockEntityType instead of trying to add more blocks to this one.
|
//For addon devs: Just make your own BlockEntityType instead of trying to add more blocks to this one.
|
||||||
//You can even reuse the same TemplateEntity class.
|
//You can even re-register the same TemplateEntity class if you like. It's an extensible block entity.
|
||||||
public static final BlockEntityType<TemplateEntity> TEMPLATE_BLOCK_ENTITY = Registry.register(
|
public static final BlockEntityType<TemplateEntity> TEMPLATE_BLOCK_ENTITY = Registry.register(
|
||||||
Registries.BLOCK_ENTITY_TYPE, id("slope"),
|
Registries.BLOCK_ENTITY_TYPE, id("slope"),
|
||||||
FabricBlockEntityTypeBuilder.create(Templates::makeTemplateBlockEntity,
|
FabricBlockEntityTypeBuilder.create(Templates::makeTemplateBlockEntity,
|
||||||
|
@ -36,8 +36,7 @@ public class TemplatesModelProvider implements ModelResourceProvider, ModelVaria
|
|||||||
//Item models don't have that layer of indirection; it always wants to load the hardcoded "item:id#inventory" model.
|
//Item models don't have that layer of indirection; it always wants to load the hardcoded "item:id#inventory" model.
|
||||||
//You *would* be able to create a model json for it and set the "parent" field to the custom model,
|
//You *would* be able to create a model json for it and set the "parent" field to the custom model,
|
||||||
//but json models are never allowed to have non-json models as a parent, and template unbaked models are not json models. Ah well.
|
//but json models are never allowed to have non-json models as a parent, and template unbaked models are not json models. Ah well.
|
||||||
//So, instead, we use a ModelVariantProvider to clunkily redirect the item:id#inventory model to the blockmodel.
|
//So, instead, we use a ModelVariantProvider to redirect attempts to load the item:id#inventory model.
|
||||||
//Not my favorite solution but we'll live.
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable UnbakedModel loadModelVariant(ModelIdentifier modelId, ModelProviderContext context) {
|
public @Nullable UnbakedModel loadModelVariant(ModelIdentifier modelId, ModelProviderContext context) {
|
||||||
Identifier customModelId = itemAssignments.get(modelId);
|
Identifier customModelId = itemAssignments.get(modelId);
|
||||||
@ -61,7 +60,7 @@ public class TemplatesModelProvider implements ModelResourceProvider, ModelVaria
|
|||||||
//while we were waiting for it, so we do another volatile field read (the "double check"):
|
//while we were waiting for it, so we do another volatile field read (the "double check"):
|
||||||
read = appearanceManager;
|
read = appearanceManager;
|
||||||
if(read == null) {
|
if(read == null) {
|
||||||
//If no-one has initialized it still, I guess we should do it
|
//If no-one has initialized it still, I guess it falls to us
|
||||||
read = appearanceManager = new TemplateAppearanceManager(spriteLookup);
|
read = appearanceManager = new TemplateAppearanceManager(spriteLookup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
//Keeping the weight of this block entity down, both in terms of memory consumption and NBT sync traffic,
|
||||||
|
//is pretty important since players might place a lot of them. There were tons and tons of these at Blanketcon.
|
||||||
|
//To that end, most of the state has been crammed into a bitfield.
|
||||||
public class TemplateEntity extends BlockEntity implements ThemeableBlockEntity {
|
public class TemplateEntity extends BlockEntity implements ThemeableBlockEntity {
|
||||||
protected BlockState renderedState = Blocks.AIR.getDefaultState();
|
protected BlockState renderedState = Blocks.AIR.getDefaultState();
|
||||||
protected byte bitfield = DEFAULT_BITFIELD;
|
protected byte bitfield = DEFAULT_BITFIELD;
|
||||||
@ -64,7 +67,6 @@ public class TemplateEntity extends BlockEntity implements ThemeableBlockEntity
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Force a chunk remesh on the client if the displayed blockstate has changed
|
//Force a chunk remesh on the client if the displayed blockstate has changed
|
||||||
//TODO: doors? (need remeshing when the *other* party changes)
|
|
||||||
if(world != null && world.isClient && !Objects.equals(lastRenderedState, renderedState)) {
|
if(world != null && world.isClient && !Objects.equals(lastRenderedState, renderedState)) {
|
||||||
Templates.chunkRerenderProxy.accept(world, pos);
|
Templates.chunkRerenderProxy.accept(world, pos);
|
||||||
}
|
}
|
||||||
|
@ -25,13 +25,13 @@ import java.util.concurrent.ConcurrentMap;
|
|||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public abstract class RetexturingBakedModel extends ForwardingBakedModel {
|
public abstract class RetexturingBakedModel extends ForwardingBakedModel {
|
||||||
@Deprecated(forRemoval = true) //binary-compat from before there was an AO boolean
|
@Deprecated(forRemoval = true) //Kept for ABI compat. From before there was an AO boolean (<2.1.1)
|
||||||
public RetexturingBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, ModelBakeSettings settings, BlockState itemModelState) {
|
public RetexturingBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, ModelBakeSettings settings, BlockState itemModelState) {
|
||||||
this(baseModel, tam, settings, itemModelState, true);
|
this(baseModel, tam, settings, itemModelState, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RetexturingBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, ModelBakeSettings settings, BlockState itemModelState, boolean ao) {
|
public RetexturingBakedModel(BakedModel baseModel, TemplateAppearanceManager tam, ModelBakeSettings settings, BlockState itemModelState, boolean ao) {
|
||||||
this.wrapped = baseModel;
|
this.wrapped = baseModel; //field from the superclass; vanilla getQuads etc will delegate through to this
|
||||||
|
|
||||||
this.tam = tam;
|
this.tam = tam;
|
||||||
this.facePermutation = MeshTransformUtil.facePermutation(settings);
|
this.facePermutation = MeshTransformUtil.facePermutation(settings);
|
||||||
@ -47,7 +47,7 @@ public abstract class RetexturingBakedModel extends ForwardingBakedModel {
|
|||||||
protected final boolean ao;
|
protected final boolean ao;
|
||||||
|
|
||||||
protected record CacheKey(BlockState state, TemplateAppearance appearance) {}
|
protected record CacheKey(BlockState state, TemplateAppearance appearance) {}
|
||||||
private final ConcurrentMap<CacheKey, Mesh> retexturedMeshes = new ConcurrentHashMap<>(); //mutable, append-only cache
|
protected final ConcurrentMap<CacheKey, Mesh> retexturedMeshes = new ConcurrentHashMap<>(); //mutable, append-only cache
|
||||||
|
|
||||||
protected static final Direction[] DIRECTIONS = Direction.values();
|
protected static final Direction[] DIRECTIONS = Direction.values();
|
||||||
protected static final Direction[] DIRECTIONS_AND_NULL = new Direction[DIRECTIONS.length + 1];
|
protected static final Direction[] DIRECTIONS_AND_NULL = new Direction[DIRECTIONS.length + 1];
|
||||||
@ -123,18 +123,20 @@ public abstract class RetexturingBakedModel extends ForwardingBakedModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Mesh createUntintedRetexturedMesh(CacheKey key) {
|
protected Mesh createUntintedRetexturedMesh(CacheKey key) {
|
||||||
return MeshTransformUtil.pretransformMesh(getBaseMesh(key.state), new RetexturingTransformer(key.appearance, 0xFFFFFFFF));
|
return MeshTransformUtil.pretransformMesh(getBaseMesh(key.state), new RetexturingTransformer(key.appearance));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class RetexturingTransformer implements RenderContext.QuadTransform {
|
protected class RetexturingTransformer implements RenderContext.QuadTransform {
|
||||||
//TODO: remove the "tint" parameter, it's been kicked to TintingTransformer
|
protected RetexturingTransformer(TemplateAppearance ta) {
|
||||||
protected RetexturingTransformer(TemplateAppearance ta, int tint) {
|
|
||||||
this.ta = ta;
|
this.ta = ta;
|
||||||
this.tint = tint;
|
}
|
||||||
|
|
||||||
|
@Deprecated(forRemoval = true) //Kept for ABI compat (<2.2). Use TintingTransformer for retinting, it works better anyway
|
||||||
|
protected RetexturingTransformer(TemplateAppearance ta, int ignoredTint) {
|
||||||
|
this(ta);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final TemplateAppearance ta;
|
protected final TemplateAppearance ta;
|
||||||
protected final int tint;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean transform(MutableQuadView quad) {
|
public boolean transform(MutableQuadView quad) {
|
||||||
@ -145,8 +147,6 @@ public abstract class RetexturingBakedModel extends ForwardingBakedModel {
|
|||||||
|
|
||||||
//The quad tag numbers were selected so this magic trick works:
|
//The quad tag numbers were selected so this magic trick works:
|
||||||
Direction dir = facePermutation.get(DIRECTIONS[quad.tag() - 1]);
|
Direction dir = facePermutation.get(DIRECTIONS[quad.tag() - 1]);
|
||||||
if(ta.hasColor(dir)) quad.color(tint, tint, tint, tint);
|
|
||||||
|
|
||||||
quad.spriteBake(ta.getSprite(dir), MutableQuadView.BAKE_NORMALIZED | ta.getBakeFlags(dir) | (uvlock ? MutableQuadView.BAKE_LOCK_UV : 0));
|
quad.spriteBake(ta.getSprite(dir), MutableQuadView.BAKE_NORMALIZED | ta.getBakeFlags(dir) | (uvlock ? MutableQuadView.BAKE_LOCK_UV : 0));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user