Compare commits

...

6 Commits

Author SHA1 Message Date
octarine-noise
49d4f8aa31 remove some Fabric aliases 2021-04-30 12:28:34 +02:00
octarine-noise
9566ae8341 fix round log x-ray bug 2021-04-29 11:49:31 +02:00
octarine-noise
dac7fa0b42 fix Optifine Shaders integration
use the low-level call on SVertexBuilder to set apparent block ID for the current draw
2021-04-26 17:07:31 +02:00
octarine-noise
c668713051 fix IModelData being swallowed by renderer 2021-04-26 13:39:09 +02:00
octarine-noise
8a82f3772f fix version information in legacy metadata 2021-04-26 13:38:38 +02:00
octarine-noise
3b728cffcd update Forge version 2021-04-26 13:38:12 +02:00
30 changed files with 116 additions and 133 deletions

View File

@@ -56,4 +56,5 @@ tasks.getByName<Jar>("jar") {
} }
exclude("net") exclude("net")
filesMatching("META-INF/mods.toml") { expand(project.properties) } filesMatching("META-INF/mods.toml") { expand(project.properties) }
filesMatching("mcmod.info") { expand(project.properties) }
} }

View File

@@ -4,10 +4,10 @@ org.gradle.daemon=false
group = com.github.octarine-noise group = com.github.octarine-noise
jarName = BetterFoliage-Forge jarName = BetterFoliage-Forge
version = 2.5.0 version = 2.5.1
mcVersion = 1.14.4 mcVersion = 1.14.4
forgeVersion = 28.1.109 forgeVersion = 28.2.0
mappingsChannel = snapshot mappingsChannel = snapshot
mappingsVersion = 20190719-1.14.3 mappingsVersion = 20190719-1.14.3

View File

@@ -77,7 +77,7 @@ fun renderWorldBlock(dispatcher: BlockRendererDispatcher,
): Boolean { ): Boolean {
// build context // build context
val blockCtx = CachedBlockCtx(reader, pos) val blockCtx = CachedBlockCtx(reader, pos)
val renderCtx = RenderCtx(dispatcher, buffer, layer, random) val renderCtx = RenderCtx(dispatcher, buffer, layer, random, modelData)
lightingCtx.reset(blockCtx) lightingCtx.reset(blockCtx)
val combinedCtx = CombinedContext(blockCtx, renderCtx, lightingCtx) val combinedCtx = CombinedContext(blockCtx, renderCtx, lightingCtx)

View File

@@ -5,7 +5,6 @@ import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.render.AsyncLogDiscovery import mods.betterfoliage.client.render.AsyncLogDiscovery
import mods.betterfoliage.client.render.column.ColumnTextureInfo import mods.betterfoliage.client.render.column.ColumnTextureInfo
import mods.betterfoliage.client.render.column.SimpleColumnInfo import mods.betterfoliage.client.render.column.SimpleColumnInfo
import mods.betterfoliage.client.resource.Identifier
import mods.betterfoliage.client.texture.LeafInfo import mods.betterfoliage.client.texture.LeafInfo
import mods.betterfoliage.client.texture.defaultRegisterLeaf import mods.betterfoliage.client.texture.defaultRegisterLeaf
import mods.octarinecore.HasLogger import mods.octarinecore.HasLogger
@@ -19,6 +18,7 @@ import net.minecraft.block.BlockState
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
import net.minecraft.client.renderer.model.ModelBakery import net.minecraft.client.renderer.model.ModelBakery
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.world.IBlockReader import net.minecraft.world.IBlockReader
import net.minecraftforge.fml.ModList import net.minecraftforge.fml.ModList
@@ -61,7 +61,7 @@ object ForestryIntegration {
object ForestryLeafDiscovery : HasLogger, AsyncSpriteProvider<ModelBakery>, ModelRenderRegistry<LeafInfo> { object ForestryLeafDiscovery : HasLogger, AsyncSpriteProvider<ModelBakery>, ModelRenderRegistry<LeafInfo> {
override val logger = BetterFoliage.logDetail override val logger = BetterFoliage.logDetail
var idToValue = emptyMap<Identifier, LeafInfo>() var idToValue = emptyMap<ResourceLocation, LeafInfo>()
override fun get(state: BlockState, world: IBlockReader, pos: BlockPos): LeafInfo? { override fun get(state: BlockState, world: IBlockReader, pos: BlockPos): LeafInfo? {
// check variant property (used in decorative leaves) // check variant property (used in decorative leaves)
@@ -82,7 +82,7 @@ object ForestryLeafDiscovery : HasLogger, AsyncSpriteProvider<ModelBakery>, Mode
} }
override fun setup(manager: IResourceManager, bakeryF: CompletableFuture<ModelBakery>, atlasFuture: AtlasFuture): StitchPhases { override fun setup(manager: IResourceManager, bakeryF: CompletableFuture<ModelBakery>, atlasFuture: AtlasFuture): StitchPhases {
val futures = mutableMapOf<Identifier, CompletableFuture<LeafInfo>>() val futures = mutableMapOf<ResourceLocation, CompletableFuture<LeafInfo>>()
return StitchPhases( return StitchPhases(
discovery = bakeryF.thenRunAsync { discovery = bakeryF.thenRunAsync {

View File

@@ -1,10 +1,9 @@
package mods.betterfoliage.client.integration package mods.betterfoliage.client.integration
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.render.LogRegistry
import mods.betterfoliage.client.render.column.ColumnTextureInfo import mods.betterfoliage.client.render.column.ColumnTextureInfo
import mods.betterfoliage.client.render.column.SimpleColumnInfo import mods.betterfoliage.client.render.column.SimpleColumnInfo
import mods.betterfoliage.client.resource.Sprite import mods.octarinecore.Sprite
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.render.Quad import mods.octarinecore.client.render.Quad
import mods.octarinecore.client.render.lighting.QuadIconResolver import mods.octarinecore.client.render.lighting.QuadIconResolver
@@ -17,7 +16,6 @@ import net.minecraft.util.Direction
import net.minecraft.util.Direction.* import net.minecraft.util.Direction.*
import net.minecraft.util.ResourceLocation import net.minecraft.util.ResourceLocation
import net.minecraftforge.fml.ModList import net.minecraftforge.fml.ModList
import org.apache.logging.log4j.Level
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture

View File

@@ -2,8 +2,6 @@ package mods.betterfoliage.client.integration
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.config.BlockConfig import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.texture.GrassRegistry
import mods.betterfoliage.client.texture.LeafRegistry import mods.betterfoliage.client.texture.LeafRegistry
import mods.octarinecore.* import mods.octarinecore.*
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
@@ -13,7 +11,6 @@ import net.minecraft.block.BlockRenderType
import net.minecraft.block.BlockRenderType.MODEL import net.minecraft.block.BlockRenderType.MODEL
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.block.Blocks import net.minecraft.block.Blocks
import net.minecraft.client.renderer.BufferBuilder
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.world.IEnviromentBlockReader import net.minecraft.world.IEnviromentBlockReader
import org.apache.logging.log4j.Level.INFO import org.apache.logging.log4j.Level.INFO
@@ -23,7 +20,7 @@ import org.apache.logging.log4j.Level.INFO
*/ */
object ShadersModIntegration { object ShadersModIntegration {
@JvmStatic val isAvailable = allAvailable(SVertexBuilder, SVertexBuilder.pushState, SVertexBuilder.pushNum, SVertexBuilder.pop) @JvmStatic val isAvailable = allAvailable(SVertexBuilder, SVertexBuilder.pushState, SVertexBuilder.popState, BlockAliases.getAliasBlockId)
val defaultLeaves = Blocks.OAK_LEAVES.defaultState val defaultLeaves = Blocks.OAK_LEAVES.defaultState
val defaultGrass = Blocks.GRASS.defaultState val defaultGrass = Blocks.GRASS.defaultState
@@ -49,10 +46,11 @@ object ShadersModIntegration {
inline fun renderAs(ctx: CombinedContext, state: BlockState, renderType: BlockRenderType, enabled: Boolean = true, func: ()->Unit) { inline fun renderAs(ctx: CombinedContext, state: BlockState, renderType: BlockRenderType, enabled: Boolean = true, func: ()->Unit) {
if (isAvailable && enabled) { if (isAvailable && enabled) {
val buffer = ctx.renderCtx.renderBuffer val buffer = ctx.renderCtx.renderBuffer
val aliasBlockId = BlockAliases.getAliasBlockId.invokeStatic(state)
val sVertexBuilder = buffer[BufferBuilder_sVertexBuilder] val sVertexBuilder = buffer[BufferBuilder_sVertexBuilder]
SVertexBuilder.pushState.invoke(sVertexBuilder, ctx.state, ctx.pos, ctx.world, buffer) SVertexBuilder.pushState.invoke(sVertexBuilder, aliasBlockId)
func() func()
SVertexBuilder.pop.invoke(sVertexBuilder) SVertexBuilder.popState.invoke(sVertexBuilder)
} else { } else {
func() func()
} }

View File

@@ -1,10 +1,7 @@
package mods.betterfoliage.client.render package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.AbstractEntityFX import mods.octarinecore.client.render.AbstractEntityFX
import mods.octarinecore.client.resource.Atlas import mods.octarinecore.client.resource.Atlas
import mods.octarinecore.client.resource.ResourceHandler import mods.octarinecore.client.resource.ResourceHandler
@@ -15,7 +12,6 @@ import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.MathHelper import net.minecraft.util.math.MathHelper
import net.minecraft.world.World import net.minecraft.world.World
import org.apache.logging.log4j.Level.DEBUG
import java.util.* import java.util.*
class EntityRisingSoulFX(world: World, pos: BlockPos) : class EntityRisingSoulFX(world: World, pos: BlockPos) :
@@ -69,5 +65,5 @@ AbstractEntityFX(world, pos.x.toDouble() + 0.5, pos.y.toDouble() + 1.0, pos.z.to
object RisingSoulTextures : ResourceHandler(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus, targetAtlas = Atlas.PARTICLES) { object RisingSoulTextures : ResourceHandler(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus, targetAtlas = Atlas.PARTICLES) {
val headIcons = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "rising_soul_$idx") } val headIcons = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "rising_soul_$idx") }
val trackIcon by sprite(Identifier(BetterFoliageMod.MOD_ID, "soul_track")) val trackIcon by sprite(ResourceLocation(BetterFoliageMod.MOD_ID, "soul_track"))
} }

View File

@@ -5,7 +5,6 @@ import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.render.column.ColumnTextureInfo import mods.betterfoliage.client.render.column.ColumnTextureInfo
import mods.betterfoliage.client.render.column.SimpleColumnInfo import mods.betterfoliage.client.render.column.SimpleColumnInfo
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.* import mods.octarinecore.client.render.*
import mods.octarinecore.client.render.lighting.* import mods.octarinecore.client.render.lighting.*
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.*
@@ -15,7 +14,7 @@ import mods.octarinecore.common.config.SimpleBlockMatcher
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.block.CactusBlock import net.minecraft.block.CactusBlock
import net.minecraft.util.Direction.* import net.minecraft.util.Direction.*
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.ResourceLocation
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
object AsyncCactusDiscovery : ConfigurableModelDiscovery<ColumnTextureInfo>() { object AsyncCactusDiscovery : ConfigurableModelDiscovery<ColumnTextureInfo>() {
@@ -23,7 +22,7 @@ object AsyncCactusDiscovery : ConfigurableModelDiscovery<ColumnTextureInfo>() {
override val matchClasses = SimpleBlockMatcher(CactusBlock::class.java) override val matchClasses = SimpleBlockMatcher(CactusBlock::class.java)
override val modelTextures = listOf(ModelTextureList("block/cactus", "top", "bottom", "side")) override val modelTextures = listOf(ModelTextureList("block/cactus", "top", "bottom", "side"))
override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<ColumnTextureInfo>? { override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<ColumnTextureInfo>? {
val sprites = textures.map { atlas.sprite(Identifier(it)) } val sprites = textures.map { atlas.sprite(ResourceLocation(it)) }
return atlas.mapAfter { return atlas.mapAfter {
SimpleColumnInfo( SimpleColumnInfo(
Axis.Y, Axis.Y,
@@ -44,8 +43,8 @@ class RenderCactus : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.b
val cactusStemRadius = 0.4375 val cactusStemRadius = 0.4375
val cactusArmRotation = listOf(NORTH, SOUTH, EAST, WEST).map { Rotation.rot90[it.ordinal] } val cactusArmRotation = listOf(NORTH, SOUTH, EAST, WEST).map { Rotation.rot90[it.ordinal] }
val iconCross by sprite(Identifier(BetterFoliageMod.MOD_ID, "blocks/better_cactus")) val iconCross by sprite(ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_cactus"))
val iconArm = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_cactus_arm_$idx") } val iconArm = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_cactus_arm_$idx") }
val modelStem = model { val modelStem = model {
horizontalRectangle(x1 = -cactusStemRadius, x2 = cactusStemRadius, z1 = -cactusStemRadius, z2 = cactusStemRadius, y = 0.5) horizontalRectangle(x1 = -cactusStemRadius, x2 = cactusStemRadius, z1 = -cactusStemRadius, z2 = cactusStemRadius, y = 0.5)

View File

@@ -2,11 +2,9 @@ package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.OptifineCustomColors import mods.betterfoliage.client.integration.OptifineCustomColors
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.resource.Identifier
import mods.betterfoliage.client.texture.GeneratedGrass import mods.betterfoliage.client.texture.GeneratedGrass
import mods.betterfoliage.client.texture.GrassRegistry import mods.betterfoliage.client.texture.GrassRegistry
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
@@ -20,8 +18,10 @@ import mods.octarinecore.common.Double3
import mods.octarinecore.common.allDirections import mods.octarinecore.common.allDirections
import mods.octarinecore.random import mods.octarinecore.random
import net.minecraft.tags.BlockTags import net.minecraft.tags.BlockTags
import net.minecraft.util.Direction.* import net.minecraft.util.Direction.Axis
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.Direction.DOWN
import net.minecraft.util.Direction.UP
import net.minecraft.util.ResourceLocation
class RenderGrass : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) { class RenderGrass : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) {
@@ -38,8 +38,8 @@ class RenderGrass : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bu
val noise = simplexNoise() val noise = simplexNoise()
val normalIcons = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_grass_long_$idx") } val normalIcons = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_grass_long_$idx") }
val snowedIcons = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_grass_snowed_$idx") } val snowedIcons = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_grass_snowed_$idx") }
val normalGenIcon by sprite { GeneratedGrass(sprite = "minecraft:blocks/tall_grass_top", isSnowed = false).register(BetterFoliage.asyncPack) } val normalGenIcon by sprite { GeneratedGrass(sprite = "minecraft:blocks/tall_grass_top", isSnowed = false).register(BetterFoliage.asyncPack) }
val snowedGenIcon by sprite { GeneratedGrass(sprite = "minecraft:blocks/tall_grass_top", isSnowed = true).register(BetterFoliage.asyncPack) } val snowedGenIcon by sprite { GeneratedGrass(sprite = "minecraft:blocks/tall_grass_top", isSnowed = true).register(BetterFoliage.asyncPack) }

View File

@@ -4,7 +4,6 @@ import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.OptifineCustomColors import mods.betterfoliage.client.integration.OptifineCustomColors
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.resource.Identifier
import mods.betterfoliage.client.texture.LeafRegistry import mods.betterfoliage.client.texture.LeafRegistry
import mods.octarinecore.PI2 import mods.octarinecore.PI2
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
@@ -18,6 +17,7 @@ import mods.octarinecore.common.allDirections
import mods.octarinecore.common.vec import mods.octarinecore.common.vec
import mods.octarinecore.random import mods.octarinecore.random
import net.minecraft.util.Direction.UP import net.minecraft.util.Direction.UP
import net.minecraft.util.ResourceLocation
import java.lang.Math.cos import java.lang.Math.cos
import java.lang.Math.sin import java.lang.Math.sin
@@ -30,7 +30,7 @@ class RenderLeaves : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.b
.scale(Config.leaves.size) .scale(Config.leaves.size)
.toCross(UP).addAll() .toCross(UP).addAll()
} }
val snowedIcon = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_leaves_snowed_$idx") } val snowedIcon = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_leaves_snowed_$idx") }
val perturbs = vectorSet(64) { idx -> val perturbs = vectorSet(64) { idx ->
val angle = PI2 * idx / 64.0 val angle = PI2 * idx / 64.0

View File

@@ -1,19 +1,16 @@
package mods.betterfoliage.client.render package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.BlockConfig import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.render.RenderDecorator import mods.octarinecore.client.render.RenderDecorator
import mods.octarinecore.client.render.lighting.FlatOffsetNoColor import mods.octarinecore.client.render.lighting.FlatOffsetNoColor
import mods.octarinecore.common.Int3 import mods.octarinecore.common.Int3
import net.minecraft.util.Direction.DOWN import net.minecraft.util.Direction.DOWN
import net.minecraft.util.Direction.UP import net.minecraft.util.Direction.UP
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.ResourceLocation
class RenderLilypad : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) { class RenderLilypad : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) {
@@ -28,8 +25,8 @@ class RenderLilypad : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.
.setFlatShader(FlatOffsetNoColor(Int3.zero)) .setFlatShader(FlatOffsetNoColor(Int3.zero))
.toCross(UP).addAll() .toCross(UP).addAll()
} }
val rootIcon = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_roots_$idx") } val rootIcon = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_roots_$idx") }
val flowerIcon = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_flower_$idx") } val flowerIcon = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_lilypad_flower_$idx") }
val perturbs = vectorSet(64) { modelIdx -> xzDisk(modelIdx) * Config.lilypad.hOffset } val perturbs = vectorSet(64) { modelIdx -> xzDisk(modelIdx) * Config.lilypad.hOffset }
override fun isEligible(ctx: CombinedContext): Boolean = override fun isEligible(ctx: CombinedContext): Boolean =

View File

@@ -9,7 +9,6 @@ import mods.betterfoliage.client.render.column.AbstractRenderColumn
import mods.betterfoliage.client.render.column.ColumnRenderLayer import mods.betterfoliage.client.render.column.ColumnRenderLayer
import mods.betterfoliage.client.render.column.ColumnTextureInfo import mods.betterfoliage.client.render.column.ColumnTextureInfo
import mods.betterfoliage.client.render.column.SimpleColumnInfo import mods.betterfoliage.client.render.column.SimpleColumnInfo
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.*
import mods.octarinecore.common.config.ConfigurableBlockMatcher import mods.octarinecore.common.config.ConfigurableBlockMatcher
@@ -18,6 +17,7 @@ import mods.octarinecore.tryDefault
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.block.LogBlock import net.minecraft.block.LogBlock
import net.minecraft.util.Direction.Axis import net.minecraft.util.Direction.Axis
import net.minecraft.util.ResourceLocation
import org.apache.logging.log4j.Level import org.apache.logging.log4j.Level
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
@@ -57,7 +57,7 @@ object AsyncLogDiscovery : ConfigurableModelDiscovery<ColumnTextureInfo>() {
override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<ColumnTextureInfo> { override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<ColumnTextureInfo> {
val axis = getAxis(state) val axis = getAxis(state)
logger.log(Level.DEBUG, "$logName: axis $axis") logger.log(Level.DEBUG, "$logName: axis $axis")
val spriteList = textures.map { atlas.sprite(Identifier(it)) } val spriteList = textures.map { atlas.sprite(ResourceLocation(it)) }
return atlas.mapAfter { return atlas.mapAfter {
SimpleColumnInfo( SimpleColumnInfo(
axis, axis,

View File

@@ -1,21 +1,18 @@
package mods.betterfoliage.client.render package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.BlockConfig import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.render.RenderDecorator import mods.octarinecore.client.render.RenderDecorator
import mods.octarinecore.client.render.noPost import mods.octarinecore.client.render.noPost
import mods.octarinecore.common.Double3 import mods.octarinecore.common.Double3
import net.minecraft.util.Direction.UP import net.minecraft.util.Direction.UP
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.ResourceLocation
class RenderMycelium : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) { class RenderMycelium : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) {
val myceliumIcon = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_mycel_$idx") } val myceliumIcon = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_mycel_$idx") }
val myceliumModel = modelSet(64) { idx -> RenderGrass.grassTopQuads(Config.shortGrass.heightMin, Config.shortGrass.heightMax)(idx) } val myceliumModel = modelSet(64) { idx -> RenderGrass.grassTopQuads(Config.shortGrass.heightMin, Config.shortGrass.heightMax)(idx) }
override fun isEligible(ctx: CombinedContext): Boolean { override fun isEligible(ctx: CombinedContext): Boolean {

View File

@@ -1,22 +1,22 @@
package mods.betterfoliage.client.render package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.resource.Identifier import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.render.* import mods.octarinecore.client.render.RenderDecorator
import mods.octarinecore.client.render.lighting.* import mods.octarinecore.client.render.lighting.cornerAo
import mods.octarinecore.client.render.lighting.cornerFlat
import mods.octarinecore.client.render.lighting.faceOrientedAuto
import mods.octarinecore.random import mods.octarinecore.random
import net.minecraft.block.Blocks import net.minecraft.block.Blocks
import net.minecraft.util.Direction.Axis import net.minecraft.util.Direction.Axis
import net.minecraft.util.Direction.* import net.minecraft.util.Direction.DOWN
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.Direction.UP
import net.minecraft.util.ResourceLocation
class RenderNetherrack : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) { class RenderNetherrack : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) {
val netherrackIcon = spriteSet { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_netherrack_$idx") } val netherrackIcon = spriteSet { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_netherrack_$idx") }
val netherrackModel = modelSet(64) { modelIdx -> val netherrackModel = modelSet(64) { modelIdx ->
verticalRectangle(x1 = -0.5, z1 = 0.5, x2 = 0.5, z2 = -0.5, yTop = -0.5, verticalRectangle(x1 = -0.5, z1 = 0.5, x2 = 0.5, z2 = -0.5, yTop = -0.5,
yBottom = -0.5 - random(Config.netherrack.heightMin, Config.netherrack.heightMax)) yBottom = -0.5 - random(Config.netherrack.heightMin, Config.netherrack.heightMax))

View File

@@ -2,10 +2,8 @@ package mods.betterfoliage.client.render
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.Client
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.integration.ShadersModIntegration import mods.betterfoliage.client.integration.ShadersModIntegration
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.CombinedContext import mods.octarinecore.client.render.CombinedContext
import mods.octarinecore.client.render.RenderDecorator import mods.octarinecore.client.render.RenderDecorator
import mods.octarinecore.client.render.lighting.FlatOffsetNoColor import mods.octarinecore.client.render.lighting.FlatOffsetNoColor
@@ -14,13 +12,13 @@ import mods.octarinecore.random
import net.minecraft.block.material.Material import net.minecraft.block.material.Material
import net.minecraft.tags.BlockTags import net.minecraft.tags.BlockTags
import net.minecraft.util.Direction.UP import net.minecraft.util.Direction.UP
import org.apache.logging.log4j.Level.DEBUG import net.minecraft.util.ResourceLocation
class RenderReeds : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) { class RenderReeds : RenderDecorator(BetterFoliageMod.MOD_ID, BetterFoliageMod.bus) {
val noise = simplexNoise() val noise = simplexNoise()
val reedIcons = spriteSetTransformed( val reedIcons = spriteSetTransformed(
check = { idx -> Identifier(BetterFoliageMod.MOD_ID, "blocks/better_reed_$idx")}, check = { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "blocks/better_reed_$idx") },
register = { CenteredSprite(it).register(BetterFoliage.asyncPack) } register = { CenteredSprite(it).register(BetterFoliage.asyncPack) }
) )
val reedModels = modelSet(64) { modelIdx -> val reedModels = modelSet(64) { modelIdx ->

View File

@@ -1,5 +1,6 @@
package mods.betterfoliage.client.render.column package mods.betterfoliage.client.render.column
import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.chunk.ChunkOverlayLayer import mods.betterfoliage.client.chunk.ChunkOverlayLayer
import mods.betterfoliage.client.chunk.ChunkOverlayManager import mods.betterfoliage.client.chunk.ChunkOverlayManager
import mods.betterfoliage.client.chunk.dimType import mods.betterfoliage.client.chunk.dimType
@@ -72,7 +73,7 @@ abstract class ColumnRenderLayer : ChunkOverlayLayer<ColumnLayerData> {
} }
override fun calculate(ctx: BlockCtx): ColumnLayerData { override fun calculate(ctx: BlockCtx): ColumnLayerData {
if (allDirections.all { ctx.offset(it).isNormalCube }) return ColumnLayerData.SkipRender if (allDirections.all { dir -> ctx.offset(dir).let { it.isNormalCube && registry[ctx] == null }}) return ColumnLayerData.SkipRender
val columnTextures = registry[ctx] ?: return ColumnLayerData.ResolveError val columnTextures = registry[ctx] ?: return ColumnLayerData.ResolveError
// if log axis is not defined and "Default to vertical" config option is not set, render normally // if log axis is not defined and "Default to vertical" config option is not set, render normally

View File

@@ -1,10 +0,0 @@
package mods.betterfoliage.client.resource
import net.minecraft.client.renderer.model.ModelResourceLocation
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.ResourceLocation
typealias Identifier = ResourceLocation
typealias ModelIdentifier = ModelResourceLocation
typealias Sprite = TextureAtlasSprite

View File

@@ -1,8 +1,8 @@
package mods.betterfoliage.client.texture package mods.betterfoliage.client.texture
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.*
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import java.awt.image.BufferedImage import java.awt.image.BufferedImage
/** /**
@@ -11,8 +11,8 @@ import java.awt.image.BufferedImage
* *
* @param[domain] Resource domain of generator * @param[domain] Resource domain of generator
*/ */
data class GeneratedGrass(val sprite: Identifier, val isSnowed: Boolean, val atlas: Atlas = Atlas.BLOCKS) { data class GeneratedGrass(val sprite: ResourceLocation, val isSnowed: Boolean, val atlas: Atlas = Atlas.BLOCKS) {
constructor(sprite: String, isSnowed: Boolean) : this(Identifier(sprite), isSnowed) constructor(sprite: String, isSnowed: Boolean) : this(ResourceLocation(sprite), isSnowed)
fun register(pack: GeneratedBlockTexturePack) = pack.register(this, this::draw) fun register(pack: GeneratedBlockTexturePack) = pack.register(this, this::draw)

View File

@@ -3,13 +3,16 @@ package mods.betterfoliage.client.texture
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.config.BlockConfig import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.config.Config import mods.betterfoliage.client.config.Config
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.render.lighting.HSB import mods.octarinecore.client.render.lighting.HSB
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.AtlasFuture
import mods.octarinecore.client.resource.ConfigurableModelDiscovery
import mods.octarinecore.client.resource.ModelRenderRegistryRoot
import mods.octarinecore.client.resource.averageColor
import mods.octarinecore.common.config.ConfigurableBlockMatcher import mods.octarinecore.common.config.ConfigurableBlockMatcher
import mods.octarinecore.common.config.ModelTextureList import mods.octarinecore.common.config.ModelTextureList
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.ResourceLocation
import org.apache.logging.log4j.Level import org.apache.logging.log4j.Level
import java.lang.Math.min import java.lang.Math.min
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
@@ -39,7 +42,7 @@ object AsyncGrassDiscovery : ConfigurableModelDiscovery<GrassInfo>() {
override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<GrassInfo> { override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture): CompletableFuture<GrassInfo> {
val textureName = textures[0] val textureName = textures[0]
val spriteF = atlas.sprite(Identifier(textureName)) val spriteF = atlas.sprite(ResourceLocation(textureName))
logger.log(Level.DEBUG, "$logName: texture $textureName") logger.log(Level.DEBUG, "$logName: texture $textureName")
return atlas.mapAfter { return atlas.mapAfter {
val sprite = spriteF.get() val sprite = spriteF.get()

View File

@@ -2,14 +2,13 @@ package mods.betterfoliage.client.texture
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.BetterFoliageMod
import mods.betterfoliage.client.resource.Identifier import mods.octarinecore.Sprite
import mods.betterfoliage.client.resource.Sprite
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.*
import mods.octarinecore.stripStart
import mods.octarinecore.client.resource.Atlas
import mods.octarinecore.common.sinkAsync import mods.octarinecore.common.sinkAsync
import mods.octarinecore.stripStart
import net.minecraft.client.particle.ParticleManager import net.minecraft.client.particle.ParticleManager
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
class FixedSpriteSet(val sprites: List<Sprite>) : SpriteSet { class FixedSpriteSet(val sprites: List<Sprite>) : SpriteSet {
@@ -30,11 +29,11 @@ object LeafParticleRegistry : AsyncSpriteProvider<ParticleManager> {
return StitchPhases( return StitchPhases(
discovery = particleF.sinkAsync { discovery = particleF.sinkAsync {
typeMappings.loadMappings(Identifier(BetterFoliageMod.MOD_ID, "leaf_texture_mappings.cfg")) typeMappings.loadMappings(ResourceLocation(BetterFoliageMod.MOD_ID, "leaf_texture_mappings.cfg"))
(typeMappings.mappings.map { it.type } + "default").distinct().forEach { leafType -> (typeMappings.mappings.map { it.type } + "default").distinct().forEach { leafType ->
val ids = (0 until 16).map { idx -> Identifier(BetterFoliageMod.MOD_ID, "falling_leaf_${leafType}_$idx") } val ids = (0 until 16).map { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "falling_leaf_${leafType}_$idx") }
val wids = ids.map { Atlas.PARTICLES.wrap(it) } val wids = ids.map { Atlas.PARTICLES.wrap(it) }
futures[leafType] = (0 until 16).map { idx -> Identifier(BetterFoliageMod.MOD_ID, "falling_leaf_${leafType}_$idx") } futures[leafType] = (0 until 16).map { idx -> ResourceLocation(BetterFoliageMod.MOD_ID, "falling_leaf_${leafType}_$idx") }
.filter { manager.hasResource(Atlas.PARTICLES.wrap(it)) } .filter { manager.hasResource(Atlas.PARTICLES.wrap(it)) }
.map { atlasFuture.sprite(it) } .map { atlasFuture.sprite(it) }
} }
@@ -57,7 +56,7 @@ object LeafParticleRegistry : AsyncSpriteProvider<ParticleManager> {
class TextureMatcher { class TextureMatcher {
data class Mapping(val domain: String?, val path: String, val type: String) { data class Mapping(val domain: String?, val path: String, val type: String) {
fun matches(iconLocation: Identifier): Boolean { fun matches(iconLocation: ResourceLocation): Boolean {
return (domain == null || domain == iconLocation.namespace) && return (domain == null || domain == iconLocation.namespace) &&
iconLocation.path.stripStart("blocks/").contains(path, ignoreCase = true) iconLocation.path.stripStart("blocks/").contains(path, ignoreCase = true)
} }
@@ -65,10 +64,10 @@ class TextureMatcher {
val mappings: MutableList<Mapping> = mutableListOf() val mappings: MutableList<Mapping> = mutableListOf()
fun getType(resource: Identifier) = mappings.filter { it.matches(resource) }.map { it.type }.firstOrNull() fun getType(resource: ResourceLocation) = mappings.filter { it.matches(resource) }.map { it.type }.firstOrNull()
fun getType(iconName: String) = Identifier(iconName).let { getType(it) } fun getType(iconName: String) = ResourceLocation(iconName).let { getType(it) }
fun loadMappings(mappingLocation: Identifier) { fun loadMappings(mappingLocation: ResourceLocation) {
mappings.clear() mappings.clear()
resourceManager[mappingLocation]?.getLines()?.let { lines -> resourceManager[mappingLocation]?.getLines()?.let { lines ->
lines.filter { !it.startsWith("//") }.filter { !it.isEmpty() }.forEach { line -> lines.filter { !it.startsWith("//") }.filter { !it.isEmpty() }.forEach { line ->

View File

@@ -2,13 +2,13 @@ package mods.betterfoliage.client.texture
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.config.BlockConfig import mods.betterfoliage.client.config.BlockConfig
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.HasLogger import mods.octarinecore.HasLogger
import mods.octarinecore.client.resource.* import mods.octarinecore.client.resource.*
import mods.octarinecore.common.config.ConfigurableBlockMatcher import mods.octarinecore.common.config.ConfigurableBlockMatcher
import mods.octarinecore.common.config.ModelTextureList import mods.octarinecore.common.config.ModelTextureList
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.ResourceLocation
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
const val defaultLeafColor = 0 const val defaultLeafColor = 0
@@ -35,7 +35,8 @@ object AsyncLeafDiscovery : ConfigurableModelDiscovery<LeafInfo>() {
override val matchClasses: ConfigurableBlockMatcher get() = BlockConfig.leafBlocks override val matchClasses: ConfigurableBlockMatcher get() = BlockConfig.leafBlocks
override val modelTextures: List<ModelTextureList> get() = BlockConfig.leafModels.modelList override val modelTextures: List<ModelTextureList> get() = BlockConfig.leafModels.modelList
override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture) = defaultRegisterLeaf(Identifier(textures[0]), atlas) override fun processModel(state: BlockState, textures: List<String>, atlas: AtlasFuture) =
defaultRegisterLeaf(ResourceLocation(textures[0]), atlas)
fun init() { fun init() {
LeafRegistry.registries.add(this) LeafRegistry.registries.add(this)
@@ -43,7 +44,7 @@ object AsyncLeafDiscovery : ConfigurableModelDiscovery<LeafInfo>() {
} }
} }
fun HasLogger.defaultRegisterLeaf(sprite: Identifier, atlas: AtlasFuture): CompletableFuture<LeafInfo> { fun HasLogger.defaultRegisterLeaf(sprite: ResourceLocation, atlas: AtlasFuture): CompletableFuture<LeafInfo> {
val leafType = LeafParticleRegistry.typeMappings.getType(sprite) ?: "default" val leafType = LeafParticleRegistry.typeMappings.getType(sprite) ?: "default"
val generated = GeneratedLeaf(sprite, leafType).register(BetterFoliage.asyncPack) val generated = GeneratedLeaf(sprite, leafType).register(BetterFoliage.asyncPack)
val roundLeaf = atlas.sprite(generated) val roundLeaf = atlas.sprite(generated)

View File

@@ -1,11 +1,10 @@
@file:JvmName("Utils") @file:JvmName("Utils")
package mods.betterfoliage.client.texture package mods.betterfoliage.client.texture
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.client.resource.Atlas
import mods.octarinecore.client.resource.get import mods.octarinecore.client.resource.get
import mods.octarinecore.client.resource.loadImage import mods.octarinecore.client.resource.loadImage
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import java.io.IOException import java.io.IOException
fun blendRGB(rgb1: Int, rgb2: Int, weight1: Int, weight2: Int): Int { fun blendRGB(rgb1: Int, rgb2: Int, weight1: Int, weight2: Int): Int {
@@ -17,4 +16,4 @@ fun blendRGB(rgb1: Int, rgb2: Int, weight1: Int, weight2: Int): Int {
return result return result
} }
fun IResourceManager.loadSprite(id: Identifier) = this.get(id)?.loadImage() ?: throw IOException("Cannot load resource $id") fun IResourceManager.loadSprite(id: ResourceLocation) = this.get(id)?.loadImage() ?: throw IOException("Cannot load resource $id")

View File

@@ -18,6 +18,8 @@ import net.minecraft.world.IBlockReader
import net.minecraft.world.IEnviromentBlockReader import net.minecraft.world.IEnviromentBlockReader
import java.util.* import java.util.*
typealias Sprite = TextureAtlasSprite
// Java // Java
val String = ClassRef<String>("java.lang.String") val String = ClassRef<String>("java.lang.String")
val Map = ClassRef<Map<*, *>>("java.util.Map") val Map = ClassRef<Map<*, *>>("java.util.Map")
@@ -60,9 +62,12 @@ object CustomColors : ClassRef<Any>("net.optifine.CustomColors") {
// Optifine shaders // Optifine shaders
object SVertexBuilder : ClassRef<Any>("net.optifine.shaders.SVertexBuilder") { object SVertexBuilder : ClassRef<Any>("net.optifine.shaders.SVertexBuilder") {
val pushState = MethodRef(this, "pushEntity", void, BlockState, BlockPos, IEnvironmentBlockReader, BufferBuilder) val pushState = MethodRef(this, "pushEntity", void, long)
val pushNum = MethodRef(this, "pushEntity", void, long) val popState = MethodRef(this, "popEntity", void)
val pop = MethodRef(this, "popEntity", void) }
object BlockAliases : ClassRef<Any>("net.optifine.shaders.BlockAliases") {
val getAliasBlockId = MethodRef(this, "getAliasBlockId", int, BlockState)
} }

View File

@@ -13,6 +13,7 @@ import net.minecraft.world.IBlockReader
import net.minecraft.world.IEnviromentBlockReader import net.minecraft.world.IEnviromentBlockReader
import net.minecraft.world.World import net.minecraft.world.World
import net.minecraft.world.biome.Biome import net.minecraft.world.biome.Biome
import net.minecraftforge.client.model.data.IModelData
import java.util.* import java.util.*
/** /**
@@ -64,8 +65,9 @@ data class RenderCtx(
val dispatcher: BlockRendererDispatcher, val dispatcher: BlockRendererDispatcher,
val renderBuffer: BufferBuilder, val renderBuffer: BufferBuilder,
val layer: BlockRenderLayer, val layer: BlockRenderLayer,
val random: Random val random: Random,
val modelData: IModelData
) { ) {
fun render(worldBlock: BlockCtx) = dispatcher.renderBlock(worldBlock.state, worldBlock.pos, worldBlock.world, renderBuffer, random, null) fun render(worldBlock: BlockCtx) = dispatcher.renderBlock(worldBlock.state, worldBlock.pos, worldBlock.world, renderBuffer, random, modelData)
} }

View File

@@ -1,13 +1,13 @@
package mods.octarinecore.client.resource package mods.octarinecore.client.resource
import mods.betterfoliage.client.resource.Identifier import mods.octarinecore.Sprite
import mods.betterfoliage.client.resource.Sprite
import mods.octarinecore.common.map import mods.octarinecore.common.map
import net.minecraft.client.renderer.texture.AtlasTexture import net.minecraft.client.renderer.texture.AtlasTexture
import net.minecraft.client.renderer.texture.MissingTextureSprite import net.minecraft.client.renderer.texture.MissingTextureSprite
import net.minecraft.profiler.IProfiler import net.minecraft.profiler.IProfiler
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import java.util.* import net.minecraft.util.ResourceLocation
import java.util.Collections
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
/** /**
@@ -30,7 +30,7 @@ class AsnycSpriteProviderManager<SOURCE: Any>(val profilerSection: String) {
* Needed in order to keep the actual [AtlasTexture.stitch] call in the original method, in case * Needed in order to keep the actual [AtlasTexture.stitch] call in the original method, in case
* other modders want to modify it too. * other modders want to modify it too.
*/ */
class StitchWrapper(val idList: Iterable<Identifier>, val onComplete: (AtlasTexture.SheetData)->Unit) { class StitchWrapper(val idList: Iterable<ResourceLocation>, val onComplete: (AtlasTexture.SheetData)->Unit) {
fun complete(sheet: AtlasTexture.SheetData) = onComplete(sheet) fun complete(sheet: AtlasTexture.SheetData) = onComplete(sheet)
} }
@@ -38,7 +38,7 @@ class AsnycSpriteProviderManager<SOURCE: Any>(val profilerSection: String) {
var currentPhases: List<StitchPhases> = emptyList() var currentPhases: List<StitchPhases> = emptyList()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun prepare(sourceObj: Any, manager: IResourceManager, idList: Iterable<Identifier>, profiler: IProfiler): Set<Identifier> { fun prepare(sourceObj: Any, manager: IResourceManager, idList: Iterable<ResourceLocation>, profiler: IProfiler): Set<ResourceLocation> {
profiler.startSection(profilerSection) profiler.startSection(profilerSection)
val source = CompletableFuture<SOURCE>() val source = CompletableFuture<SOURCE>()
@@ -65,8 +65,8 @@ class AsnycSpriteProviderManager<SOURCE: Any>(val profilerSection: String) {
* Provides a way for [AsyncSpriteProvider]s to register sprites to receive [CompletableFuture]s. * Provides a way for [AsyncSpriteProvider]s to register sprites to receive [CompletableFuture]s.
* Tracks sprite ids that need to be stitched. * Tracks sprite ids that need to be stitched.
*/ */
class AtlasFuture(initial: Iterable<Identifier>) { class AtlasFuture(initial: Iterable<ResourceLocation>) {
val idSet = Collections.synchronizedSet(mutableSetOf<Identifier>().apply { addAll(initial) }) val idSet = Collections.synchronizedSet(mutableSetOf<ResourceLocation>().apply { addAll(initial) })
protected val sheet = CompletableFuture<AtlasTexture.SheetData>() protected val sheet = CompletableFuture<AtlasTexture.SheetData>()
protected val finished = CompletableFuture<Void>() protected val finished = CompletableFuture<Void>()
@@ -75,8 +75,8 @@ class AtlasFuture(initial: Iterable<Identifier>) {
finished.complete(null) finished.complete(null)
} }
fun sprite(id: String) = sprite(Identifier(id)) fun sprite(id: String) = sprite(ResourceLocation(id))
fun sprite(id: Identifier): CompletableFuture<Sprite> { fun sprite(id: ResourceLocation): CompletableFuture<Sprite> {
idSet.add(id) idSet.add(id)
return sheet.map { sheetData -> sheetData.sprites.find { it.name == id } ?: throw IllegalStateException("Atlas does not contain $id") } return sheet.map { sheetData -> sheetData.sprites.find { it.name == id } ?: throw IllegalStateException("Atlas does not contain $id") }
} }

View File

@@ -1,12 +1,12 @@
package mods.octarinecore.client.resource package mods.octarinecore.client.resource
import mods.betterfoliage.client.resource.Identifier
import mods.betterfoliage.client.texture.loadSprite import mods.betterfoliage.client.texture.loadSprite
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import java.awt.image.BufferedImage import java.awt.image.BufferedImage
import java.lang.Math.max import java.lang.Math.max
data class CenteredSprite(val sprite: Identifier, val atlas: Atlas = Atlas.BLOCKS, val aspectHeight: Int = 1, val aspectWidth: Int = 1) { data class CenteredSprite(val sprite: ResourceLocation, val atlas: Atlas = Atlas.BLOCKS, val aspectHeight: Int = 1, val aspectWidth: Int = 1) {
fun register(pack: GeneratedBlockTexturePack) = pack.register(this, this::draw) fun register(pack: GeneratedBlockTexturePack) = pack.register(this, this::draw)

View File

@@ -1,20 +1,20 @@
package mods.octarinecore.client.resource package mods.octarinecore.client.resource
import com.google.common.base.Joiner import com.google.common.base.Joiner
import mods.betterfoliage.client.resource.ModelIdentifier
import mods.octarinecore.HasLogger import mods.octarinecore.HasLogger
import mods.octarinecore.client.render.BlockCtx import mods.octarinecore.client.render.BlockCtx
import mods.octarinecore.common.Int3 import mods.octarinecore.common.Int3
import mods.octarinecore.common.config.IBlockMatcher import mods.octarinecore.common.config.IBlockMatcher
import mods.octarinecore.common.config.ModelTextureList import mods.octarinecore.common.config.ModelTextureList
import mods.octarinecore.common.plus import mods.octarinecore.common.plus
import mods.octarinecore.findFirst
import mods.octarinecore.common.sinkAsync import mods.octarinecore.common.sinkAsync
import mods.octarinecore.findFirst
import net.minecraft.block.BlockState import net.minecraft.block.BlockState
import net.minecraft.client.renderer.BlockModelShapes import net.minecraft.client.renderer.BlockModelShapes
import net.minecraft.client.renderer.model.BlockModel import net.minecraft.client.renderer.model.BlockModel
import net.minecraft.client.renderer.model.IUnbakedModel import net.minecraft.client.renderer.model.IUnbakedModel
import net.minecraft.client.renderer.model.ModelBakery import net.minecraft.client.renderer.model.ModelBakery
import net.minecraft.client.renderer.model.ModelResourceLocation
import net.minecraft.client.renderer.model.VariantList import net.minecraft.client.renderer.model.VariantList
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation import net.minecraft.util.ResourceLocation
@@ -40,7 +40,7 @@ abstract class ModelRenderRegistryRoot<T> : ModelRenderRegistry<T> {
class ModelDiscoveryContext( class ModelDiscoveryContext(
bakery: ModelBakery, bakery: ModelBakery,
val state: BlockState, val state: BlockState,
val modelId: ModelIdentifier val modelId: ModelResourceLocation
) { ) {
val models = bakery.unwrapVariants(bakery.getUnbakedModel(modelId) to modelId) val models = bakery.unwrapVariants(bakery.getUnbakedModel(modelId) to modelId)
.filter { it.second != bakery.getUnbakedModel(ModelBakery.MODEL_MISSING) } .filter { it.second != bakery.getUnbakedModel(ModelBakery.MODEL_MISSING) }

View File

@@ -1,6 +1,5 @@
package mods.octarinecore.client.resource package mods.octarinecore.client.resource
import mods.betterfoliage.client.resource.Identifier
import mods.octarinecore.HasLogger import mods.octarinecore.HasLogger
import mods.octarinecore.common.completedVoid import mods.octarinecore.common.completedVoid
import mods.octarinecore.common.map import mods.octarinecore.common.map
@@ -9,10 +8,10 @@ import net.minecraft.client.resources.ClientResourcePackInfo
import net.minecraft.resources.* import net.minecraft.resources.*
import net.minecraft.resources.ResourcePackType.CLIENT_RESOURCES import net.minecraft.resources.ResourcePackType.CLIENT_RESOURCES
import net.minecraft.resources.data.IMetadataSectionSerializer import net.minecraft.resources.data.IMetadataSectionSerializer
import net.minecraft.util.ResourceLocation
import net.minecraft.util.text.StringTextComponent import net.minecraft.util.text.StringTextComponent
import org.apache.logging.log4j.Logger import org.apache.logging.log4j.Logger
import java.io.IOException import java.io.IOException
import java.lang.IllegalStateException
import java.util.* import java.util.*
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutionException
@@ -31,18 +30,18 @@ class GeneratedBlockTexturePack(val nameSpace: String, val packName: String, ove
override fun getResourceNamespaces(type: ResourcePackType) = setOf(nameSpace) override fun getResourceNamespaces(type: ResourcePackType) = setOf(nameSpace)
override fun <T : Any?> getMetadata(deserializer: IMetadataSectionSerializer<T>) = null override fun <T : Any?> getMetadata(deserializer: IMetadataSectionSerializer<T>) = null
override fun getRootResourceStream(id: String) = null override fun getRootResourceStream(id: String) = null
override fun getAllResourceLocations(type: ResourcePackType, path: String, maxDepth: Int, filter: Predicate<String>) = emptyList<Identifier>() override fun getAllResourceLocations(type: ResourcePackType, path: String, maxDepth: Int, filter: Predicate<String>) = emptyList<ResourceLocation>()
override fun close() {} override fun close() {}
protected var manager: CompletableFuture<IResourceManager>? = null protected var manager: CompletableFuture<IResourceManager>? = null
val identifiers = Collections.synchronizedMap(mutableMapOf<Any, Identifier>()) val identifiers = Collections.synchronizedMap(mutableMapOf<Any, ResourceLocation>())
val resources = Collections.synchronizedMap(mutableMapOf<Identifier, CompletableFuture<ByteArray>>()) val resources = Collections.synchronizedMap(mutableMapOf<ResourceLocation, CompletableFuture<ByteArray>>())
fun register(key: Any, func: (IResourceManager)->ByteArray): Identifier { fun register(key: Any, func: (IResourceManager)->ByteArray): ResourceLocation {
if (manager == null) throw IllegalStateException("Cannot register resources unless block textures are being reloaded") if (manager == null) throw IllegalStateException("Cannot register resources unless block textures are being reloaded")
identifiers[key]?.let { return it } identifiers[key]?.let { return it }
val id = Identifier(nameSpace, UUID.randomUUID().toString()) val id = ResourceLocation(nameSpace, UUID.randomUUID().toString())
val resource = manager!!.map { func(it) } val resource = manager!!.map { func(it) }
identifiers[key] = id identifiers[key] = id
@@ -51,12 +50,12 @@ class GeneratedBlockTexturePack(val nameSpace: String, val packName: String, ove
return id return id
} }
override fun getResourceStream(type: ResourcePackType, id: Identifier) = override fun getResourceStream(type: ResourcePackType, id: ResourceLocation) =
if (type != CLIENT_RESOURCES) null else if (type != CLIENT_RESOURCES) null else
try { resources[id]!!.get().inputStream() } try { resources[id]!!.get().inputStream() }
catch (e: ExecutionException) { (e.cause as? IOException)?.let { throw it } } // rethrow wrapped IOException if present catch (e: ExecutionException) { (e.cause as? IOException)?.let { throw it } } // rethrow wrapped IOException if present
override fun resourceExists(type: ResourcePackType, id: Identifier) = override fun resourceExists(type: ResourcePackType, id: ResourceLocation) =
type == CLIENT_RESOURCES && resources.containsKey(id) type == CLIENT_RESOURCES && resources.containsKey(id)
override fun setup(manager: IResourceManager, bakeryF: CompletableFuture<ModelBakery>, atlas: AtlasFuture): StitchPhases { override fun setup(manager: IResourceManager, bakeryF: CompletableFuture<ModelBakery>, atlas: AtlasFuture): StitchPhases {

View File

@@ -1,8 +1,7 @@
package mods.octarinecore.client.resource package mods.octarinecore.client.resource
import mods.betterfoliage.BetterFoliage import mods.betterfoliage.BetterFoliage
import mods.betterfoliage.client.resource.Identifier import mods.octarinecore.Sprite
import mods.betterfoliage.client.resource.Sprite
import mods.octarinecore.client.render.Model import mods.octarinecore.client.render.Model
import mods.octarinecore.common.Double3 import mods.octarinecore.common.Double3
import mods.octarinecore.common.Int3 import mods.octarinecore.common.Int3
@@ -11,6 +10,7 @@ import mods.octarinecore.common.sink
import mods.octarinecore.stripEnd import mods.octarinecore.stripEnd
import mods.octarinecore.stripStart import mods.octarinecore.stripStart
import net.minecraft.resources.IResourceManager import net.minecraft.resources.IResourceManager
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.MathHelper import net.minecraft.util.math.MathHelper
import net.minecraft.world.IWorld import net.minecraft.world.IWorld
@@ -20,7 +20,7 @@ import net.minecraftforge.event.world.WorldEvent
import net.minecraftforge.eventbus.api.IEventBus import net.minecraftforge.eventbus.api.IEventBus
import net.minecraftforge.eventbus.api.SubscribeEvent import net.minecraftforge.eventbus.api.SubscribeEvent
import net.minecraftforge.fml.config.ModConfig import net.minecraftforge.fml.config.ModConfig
import java.util.* import java.util.Random
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty import kotlin.reflect.KProperty
@@ -29,8 +29,8 @@ enum class Atlas(val basePath: String) {
BLOCKS("textures"), BLOCKS("textures"),
PARTICLES("textures/particle"); PARTICLES("textures/particle");
fun wrap(resource: Identifier) = Identifier(resource.namespace, "$basePath/${resource.path}.png") fun wrap(resource: ResourceLocation) = ResourceLocation(resource.namespace, "$basePath/${resource.path}.png")
fun unwrap(resource: Identifier) = resource.stripStart("$basePath/").stripEnd(".png") fun unwrap(resource: ResourceLocation) = resource.stripStart("$basePath/").stripEnd(".png")
fun matches(event: TextureStitchEvent) = event.map.basePath == basePath fun matches(event: TextureStitchEvent) = event.map.basePath == basePath
} }
@@ -62,10 +62,10 @@ open class ResourceHandler(
// ============================ // ============================
// Resource declarations // Resource declarations
// ============================ // ============================
fun sprite(id: Identifier) = sprite { id } fun sprite(id: ResourceLocation) = sprite { id }
fun sprite(idFunc: ()->Identifier) = AsyncSpriteDelegate(idFunc).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) } fun sprite(idFunc: ()->ResourceLocation) = AsyncSpriteDelegate(idFunc).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) }
fun spriteSet(idFunc: (Int)->Identifier) = AsyncSpriteSet(targetAtlas, idFunc).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) } fun spriteSet(idFunc: (Int)->ResourceLocation) = AsyncSpriteSet(targetAtlas, idFunc).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) }
fun spriteSetTransformed(check: (Int)->Identifier, register: (Identifier)->Identifier) = fun spriteSetTransformed(check: (Int)->ResourceLocation, register: (ResourceLocation)->ResourceLocation) =
AsyncSpriteSet(targetAtlas, check, register).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) } AsyncSpriteSet(targetAtlas, check, register).apply { BetterFoliage.getSpriteManager(targetAtlas).providers.add(this) }
fun model(init: Model.()->Unit) = ModelHolder(init).apply { resources.add(this) } fun model(init: Model.()->Unit) = ModelHolder(init).apply { resources.add(this) }
fun modelSet(num: Int, init: Model.(Int)->Unit) = ModelSet(num, init).apply { resources.add(this) } fun modelSet(num: Int, init: Model.(Int)->Unit) = ModelSet(num, init).apply { resources.add(this) }
@@ -88,7 +88,7 @@ open class ResourceHandler(
// ============================ // ============================
// Resource container classes // Resource container classes
// ============================ // ============================
class AsyncSpriteDelegate(val idFunc: ()->Identifier) : ReadOnlyProperty<Any, Sprite>, AsyncSpriteProvider<Any> { class AsyncSpriteDelegate(val idFunc: ()->ResourceLocation) : ReadOnlyProperty<Any, Sprite>, AsyncSpriteProvider<Any> {
protected lateinit var value: Sprite protected lateinit var value: Sprite
override fun getValue(thisRef: Any, property: KProperty<*>) = value override fun getValue(thisRef: Any, property: KProperty<*>) = value
@@ -108,7 +108,7 @@ interface SpriteSet {
operator fun get(idx: Int): Sprite operator fun get(idx: Int): Sprite
} }
class AsyncSpriteSet(val targetAtlas: Atlas = Atlas.BLOCKS, val idFunc: (Int)->Identifier, val transform: (Identifier)->Identifier = { it }) : AsyncSpriteProvider<Any> { class AsyncSpriteSet(val targetAtlas: Atlas = Atlas.BLOCKS, val idFunc: (Int)->ResourceLocation, val transform: (ResourceLocation)->ResourceLocation = { it }) : AsyncSpriteProvider<Any> {
var num = 0 var num = 0
protected set protected set
protected var sprites: List<Sprite> = emptyList() protected var sprites: List<Sprite> = emptyList()

View File

@@ -2,7 +2,7 @@
"modid": "betterfoliage", "modid": "betterfoliage",
"name": "Better Foliage", "name": "Better Foliage",
"version": "$version", "version": "$version",
"mcversion": "$mcversion", "mcversion": "$mcVersion",
"description": "Leafier leaves and grassier grass", "description": "Leafier leaves and grassier grass",
"authorList" : ["octarine-noise (code)", "Meringue (textures)"] "authorList" : ["octarine-noise (code)", "Meringue (textures)"]
}] }]