support for Nylium blocks

This commit is contained in:
octarine-noise
2021-07-12 21:47:06 +02:00
parent 54e245bcd4
commit 145e07363c
3 changed files with 40 additions and 15 deletions

View File

@@ -47,17 +47,17 @@ object StandardGrassDiscovery : ParametrizedModelDiscovery() {
} }
data class StandardGrassKey( data class StandardGrassKey(
val grassLocation: ResourceLocation, val sprite: ResourceLocation,
val overrideColor: Color? val overrideColor: Color?
) : HalfBakedWrapperKey() { ) : HalfBakedWrapperKey() {
val tintIndex: Int get() = if (overrideColor == null) 0 else -1 val tintIndex: Int get() = if (overrideColor == null) 0 else -1
override fun bake(ctx: ModelBakingContext, wrapped: SpecialRenderModel): SpecialRenderModel { override fun bake(ctx: ModelBakingContext, wrapped: SpecialRenderModel): SpecialRenderModel {
val grassSpriteColor = Atlas.BLOCKS[grassLocation].averageColor.let { hsb -> val grassColor = Atlas.BLOCKS[sprite].averageColor.let { hsb ->
logColorOverride(BetterFoliageMod.detailLogger(this), Config.shortGrass.saturationThreshold, hsb) logColorOverride(BetterFoliageMod.detailLogger(this), Config.shortGrass.saturationThreshold, hsb)
hsb.colorOverride(Config.shortGrass.saturationThreshold) hsb.colorOverride(Config.shortGrass.saturationThreshold)
} }
return StandardGrassModel(wrapped, this.copy(overrideColor = grassSpriteColor)) return StandardGrassModel(wrapped, this.copy(overrideColor = grassColor))
} }
} }
@@ -136,7 +136,7 @@ class StandardGrassModel(
tuftModelSet(grassTuftShapes, null) { idx -> grassTuftSprites[randomI()] }.buildTufts() tuftModelSet(grassTuftShapes, null) { idx -> grassTuftSprites[randomI()] }.buildTufts()
} }
val grassFullBlockMeshes = BetterFoliage.modelManager.lazyMap { key: StandardGrassKey -> val grassFullBlockMeshes = BetterFoliage.modelManager.lazyMap { key: StandardGrassKey ->
Array(64) { fullCubeTextured(key.grassLocation, key.tintIndex) } Array(64) { fullCubeTextured(key.sprite, key.tintIndex) }
} }
val snowFullBlockMeshes by BetterFoliage.modelManager.lazy { val snowFullBlockMeshes by BetterFoliage.modelManager.lazy {
Array(64) { fullCubeTextured(ResourceLocation("block/snow"), -1) } Array(64) { fullCubeTextured(ResourceLocation("block/snow"), -1) }

View File

@@ -21,8 +21,12 @@ import mods.betterfoliage.resource.discovery.ModelBakingContext
import mods.betterfoliage.resource.discovery.ModelDiscoveryContext import mods.betterfoliage.resource.discovery.ModelDiscoveryContext
import mods.betterfoliage.resource.discovery.ParametrizedModelDiscovery import mods.betterfoliage.resource.discovery.ParametrizedModelDiscovery
import mods.betterfoliage.util.Atlas import mods.betterfoliage.util.Atlas
import mods.betterfoliage.util.averageColor
import mods.betterfoliage.util.colorOverride
import mods.betterfoliage.util.idxOrNull import mods.betterfoliage.util.idxOrNull
import mods.betterfoliage.util.lazy import mods.betterfoliage.util.lazy
import mods.betterfoliage.util.lazyMap
import mods.betterfoliage.util.logColorOverride
import mods.betterfoliage.util.randomI import mods.betterfoliage.util.randomI
import net.minecraft.client.renderer.RenderType import net.minecraft.client.renderer.RenderType
import net.minecraft.util.Direction import net.minecraft.util.Direction
@@ -31,13 +35,23 @@ import java.util.Random
object StandardMyceliumDiscovery : ParametrizedModelDiscovery() { object StandardMyceliumDiscovery : ParametrizedModelDiscovery() {
override fun processModel(ctx: ModelDiscoveryContext, params: Map<String, String>) { override fun processModel(ctx: ModelDiscoveryContext, params: Map<String, String>) {
ctx.addReplacement(StandardMyceliumKey) val textureMycelium = params.texture("texture-mycelium") ?: return
ctx.addReplacement(StandardMyceliumKey(textureMycelium, null))
ctx.blockState.block.extendLayers() ctx.blockState.block.extendLayers()
} }
} }
object StandardMyceliumKey : HalfBakedWrapperKey() { data class StandardMyceliumKey(
override fun bake(ctx: ModelBakingContext, wrapped: SpecialRenderModel) = StandardMyceliumModel(wrapped) val sprite: ResourceLocation,
val overrideColor: Color?
) : HalfBakedWrapperKey() {
override fun bake(ctx: ModelBakingContext, wrapped: SpecialRenderModel): SpecialRenderModel {
val myceliumColor = Atlas.BLOCKS[sprite].averageColor.let { hsb ->
logColorOverride(BetterFoliageMod.detailLogger(this), Config.shortGrass.saturationThreshold, hsb)
hsb.colorOverride(Config.shortGrass.saturationThreshold)
}
return StandardMyceliumModel(wrapped, copy(overrideColor = myceliumColor))
}
} }
class MyceliumRenderData( class MyceliumRenderData(
@@ -47,15 +61,17 @@ class MyceliumRenderData(
} }
class StandardMyceliumModel( class StandardMyceliumModel(
wrapped: SpecialRenderModel wrapped: SpecialRenderModel,
key: StandardMyceliumKey
) : HalfBakedSpecialWrapper(wrapped) { ) : HalfBakedSpecialWrapper(wrapped) {
val tuftModels by myceliumTuftModels.delegate(key)
val tuftLighting = LightingPreferredFace(Direction.UP) val tuftLighting = LightingPreferredFace(Direction.UP)
override fun prepare(ctx: BlockCtx, random: Random): Any { override fun prepare(ctx: BlockCtx, random: Random): Any {
if (!Config.enabled) return Unit if (!Config.enabled) return Unit
return MyceliumRenderData( return MyceliumRenderData(
random.idxOrNull(myceliumTuftModels) { random.idxOrNull(tuftModels) {
Config.shortGrass.enabled(random) && Config.shortGrass.enabled(random) &&
Config.shortGrass.myceliumEnabled && Config.shortGrass.myceliumEnabled &&
ctx.state(Direction.UP).isAir(ctx.world, ctx.pos) ctx.state(Direction.UP).isAir(ctx.world, ctx.pos)
@@ -67,7 +83,7 @@ class StandardMyceliumModel(
super.renderLayer(ctx, data, layer) super.renderLayer(ctx, data, layer)
if (data is MyceliumRenderData && data.tuftIndex != null && layer == Layers.tufts) { if (data is MyceliumRenderData && data.tuftIndex != null && layer == Layers.tufts) {
ctx.vertexLighter = tuftLighting ctx.vertexLighter = tuftLighting
ctx.renderQuads(myceliumTuftModels[data.tuftIndex]) ctx.renderQuads(tuftModels[data.tuftIndex])
} }
} }
@@ -75,9 +91,11 @@ class StandardMyceliumModel(
val myceliumTuftSprites by SpriteSetDelegate(Atlas.BLOCKS) { idx -> val myceliumTuftSprites by SpriteSetDelegate(Atlas.BLOCKS) { idx ->
ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_mycel_$idx") ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_mycel_$idx")
} }
val myceliumTuftModels by BetterFoliage.modelManager.lazy { val myceliumTuftShapes by BetterFoliage.modelManager.lazy {
val shapes = Config.shortGrass.let { tuftShapeSet(it.size, it.heightMin, it.heightMax, it.hOffset) } Config.shortGrass.let { tuftShapeSet(it.size, it.heightMin, it.heightMax, it.hOffset) }
tuftModelSet(shapes, Color.white) { idx -> myceliumTuftSprites[randomI()] }.buildTufts() }
val myceliumTuftModels = BetterFoliage.modelManager.lazyMap { key: StandardMyceliumKey ->
tuftModelSet(myceliumTuftShapes, key.overrideColor) { idx -> myceliumTuftSprites[randomI()] }.buildTufts()
} }
} }
} }

View File

@@ -17,6 +17,14 @@ model.extends("minecraft:block/grass_block", "minecraft:block/cube_bottom_top")
setParam("texture-grass", model.texture("top")) setParam("texture-grass", model.texture("top"))
end end
// Mycelium & Nylium
match block.name.matches("minecraft:mycelium", "minecraft:crimson_nylium", "minecraft:warped_nylium") setParam("type", "mycelium") end
match isParam("type", "mycelium")
model.extends("minecraft:block/cube_bottom_top")
setParam("texture-mycelium", model.texture("top"))
end
// Dirt // Dirt
match block.name.matches("minecraft:dirt") setParam("type", "dirt") end match block.name.matches("minecraft:dirt") setParam("type", "dirt") end
@@ -38,10 +46,9 @@ end
// Sand & Dirt // Sand & Dirt
match block.name.matches("minecraft:sand", "minecraft:red_sand") setParam("type", "sand") end match block.name.matches("minecraft:sand", "minecraft:red_sand") setParam("type", "sand") end
// Cactus, Lilypad, Mycelium, Netherrack // Cactus, Lilypad, Netherrack
match block.name.matches("minecraft:cactus") setParam("type", "cactus") end match block.name.matches("minecraft:cactus") setParam("type", "cactus") end
match block.name.matches("minecraft:lilypad") setParam("type", "lilypad") end match block.name.matches("minecraft:lilypad") setParam("type", "lilypad") end
match block.name.matches("minecraft:mycelium") setParam("type", "mycelium") end
match block.name.matches("minecraft:netherrack") setParam("type", "netherrack") end match block.name.matches("minecraft:netherrack") setParam("type", "netherrack") end
// Crops // Crops