Skip to content

Commit

Permalink
Ships are flying with wheels
Browse files Browse the repository at this point in the history
  • Loading branch information
ewoudje committed Jul 29, 2024
1 parent dbe0957 commit 70e3769
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.valkyrienskies.mod.compat.flywheel

import dev.engine_room.flywheel.api.instance.Instance
import dev.engine_room.flywheel.api.instance.Instancer
import dev.engine_room.flywheel.api.model.Model
import dev.engine_room.flywheel.api.task.Plan
Expand All @@ -15,7 +14,10 @@ import dev.engine_room.flywheel.lib.task.MapContextPlan
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap
import net.minecraft.core.SectionPos
import net.minecraft.core.Vec3i
import org.valkyrienskies.mod.compat.flywheel.ShipSectionFlywheelModels.BuildingContext
import org.valkyrienskies.mod.compat.flywheel.model.FlywheelSectionModelBuilder
import org.valkyrienskies.mod.compat.flywheel.model.FlywheelSectionModelBuilder.BuildingContext
import org.valkyrienskies.mod.compat.flywheel.model.MultiBlockModelSectionBuilder
import org.valkyrienskies.mod.compat.flywheel.model.TestModelBuilder

class RenderingShipVisual(val effect: ShipEffect, val ctx: VisualizationContext) : Visual, DynamicVisual {
private val instances = Long2ObjectOpenHashMap<TransformedInstance>()
Expand All @@ -24,7 +26,7 @@ class RenderingShipVisual(val effect: ShipEffect, val ctx: VisualizationContext)
effect.level.getSectionYFromSectionIndex(effect.level.sectionsCount - 1) / 2 - 1,
effect.ship.chunkClaim.zMiddle
)
private val models = ShipSectionFlywheelModels(::newModel)
private val models: FlywheelSectionModelBuilder = MultiBlockModelSectionBuilder()

private fun newModel(pos: SectionPos, model: Model?) {
if (model == null) {
Expand Down Expand Up @@ -61,7 +63,7 @@ class RenderingShipVisual(val effect: ShipEffect, val ctx: VisualizationContext)

override fun planFrame(): Plan<Context> =
IfElsePlan.on<Context>(effect::areSectionsDirty)
.ifTrue(MapContextPlan.map { c: Context -> makeBuildingContext() }.to(models.createBuildingPlan()))
.ifTrue(MapContextPlan.map { c: Context -> makeBuildingContext() }.to(models.createBuildingPlan(::newModel)))
.plan()

private fun makeBuildingContext() =
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.valkyrienskies.mod.compat.flywheel.model

import dev.engine_room.flywheel.api.model.Model
import dev.engine_room.flywheel.api.task.Plan

import it.unimi.dsi.fastutil.longs.LongSet
import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.core.SectionPos

interface FlywheelSectionModelBuilder {
fun createBuildingPlan(newModel: (SectionPos, Model?) -> Unit): Plan<BuildingContext>

data class BuildingContext(
val level: ClientLevel,
val updates: LongSet
)
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
package org.valkyrienskies.mod.compat.flywheel
package org.valkyrienskies.mod.compat.flywheel.model

import dev.engine_room.flywheel.api.instance.Instance
import dev.engine_room.flywheel.api.model.Model
import dev.engine_room.flywheel.api.task.Plan
import dev.engine_room.flywheel.lib.model.baked.MultiBlockModelBuilder
import dev.engine_room.flywheel.lib.task.ForEachPlan
import it.unimi.dsi.fastutil.longs.Long2ObjectMap
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap

import it.unimi.dsi.fastutil.longs.LongSet
import net.minecraft.client.multiplayer.ClientLevel
import net.minecraft.core.BlockPos
import net.minecraft.core.BlockPos.MutableBlockPos
Expand All @@ -21,25 +16,28 @@ import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.lighting.LevelLightEngine
import net.minecraft.world.level.material.FluidState
import org.valkyrienskies.mod.compat.flywheel.model.FlywheelSectionModelBuilder.BuildingContext
import java.util.NoSuchElementException

class ShipSectionFlywheelModels(val newModel: (SectionPos, Model?) -> Unit) {
fun createBuildingPlan(): Plan<BuildingContext> =
class MultiBlockModelSectionBuilder : FlywheelSectionModelBuilder {
override fun createBuildingPlan(newModel: (SectionPos, Model?) -> Unit): Plan<BuildingContext> =
ForEachPlan.of(
{x: BuildingContext -> x.updates.map(SectionPos::of)},
::buildChunk
buildChunk(newModel)
)

fun buildChunk(pos: SectionPos, ctx: BuildingContext) = newModel(pos, run {
val chunk = ctx.level.getChunk(pos.x, pos.z);
val section = chunk.getSection(ctx.level.getSectionIndexFromSectionY(pos.y))
fun buildChunk(newModel: (SectionPos, Model?) -> Unit) = { pos: SectionPos, ctx: BuildingContext ->
newModel(pos, run {
val chunk = ctx.level.getChunk(pos.x, pos.z);
val section = chunk.getSection(ctx.level.getSectionIndexFromSectionY(pos.y))

if (section.hasOnlyAir()) return@run null
if (section.hasOnlyAir()) return@run null

MultiBlockModelBuilder.create(wrapLevel(ctx.level, pos.origin()), AllSectionPositions).apply {
enableFluidRendering()
}.build()
})
MultiBlockModelBuilder.create(wrapLevel(ctx.level, pos.origin()), AllSectionPositions).apply {
enableFluidRendering()
}.build()
})
}

private fun wrapLevel(lvl: ClientLevel, origin: Vec3i) = object : BlockAndTintGetter {
override fun getHeight(): Int = lvl.height
Expand All @@ -53,8 +51,7 @@ class ShipSectionFlywheelModels(val newModel: (SectionPos, Model?) -> Unit) {
override fun getFluidState(blockPos: BlockPos): FluidState =
lvl.getFluidState(blockPos.offset(origin))

override fun getShade(direction: Direction, bl: Boolean): Float =
lvl.getShade(direction, bl)
override fun getShade(direction: Direction, bl: Boolean): Float = 1f

override fun getLightEngine(): LevelLightEngine =
lvl.lightEngine
Expand All @@ -63,11 +60,6 @@ class ShipSectionFlywheelModels(val newModel: (SectionPos, Model?) -> Unit) {
lvl.getBlockTint(blockPos.offset(origin), colorResolver)
}

data class BuildingContext(
val level: ClientLevel,
val updates: LongSet
)

private object AllSectionPositions : Iterable<BlockPos> {
override fun iterator(): Iterator<BlockPos> = MyIterator()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.valkyrienskies.mod.compat.flywheel.model

import dev.engine_room.flywheel.api.model.Model
import dev.engine_room.flywheel.api.task.Plan
import dev.engine_room.flywheel.lib.model.Models
import dev.engine_room.flywheel.lib.task.ForEachPlan
import net.minecraft.core.SectionPos
import net.minecraft.world.level.block.Blocks
import org.valkyrienskies.mod.compat.flywheel.model.FlywheelSectionModelBuilder.BuildingContext

class TestModelBuilder : FlywheelSectionModelBuilder {
override fun createBuildingPlan(newModel: (SectionPos, Model?) -> Unit): Plan<BuildingContext> =
ForEachPlan.of(
{x: BuildingContext -> x.updates.map(SectionPos::of)},
buildChunk(newModel)
)

fun buildChunk(newModel: (SectionPos, Model?) -> Unit) = { pos: SectionPos, ctx: BuildingContext ->
newModel(pos, run {
Models.block(Blocks.DIRT.defaultBlockState())
})
}
}
2 changes: 1 addition & 1 deletion forge/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ cloth_config_version = 11.1.106
#Compat
# https://github.com/Creators-of-Create/Create/wiki/Depending-on-Create
create_version = 0.5.1.e-22
flywheel_version = 1.0.0-beta-105
flywheel_version = 1.0.0-beta-106
registrate_version = MC1.20-1.3.3
cc_tweaked_version = 1.109.0
#Extra
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ forge_version=1.20.1-47.2.0
create_fabric_version=0.5.1-f-build.1335+mc1.20.1

# https://github.com/Fabricators-of-Create/Create/blob/mc1.19/fabric/dev/gradle.properties
flywheel_version_fabric=1.0.0-beta-105
flywheel_version_fabric=1.0.0-beta-106

# https://modrinth.com/mod/create-big-cannons/versions
createbigcannons_version= 0.5.2.a
Expand Down

0 comments on commit 70e3769

Please sign in to comment.