From 7fb36aaaf6d5052a384ddcd935c58b529e35a67a Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 2 Dec 2021 00:17:20 +0100 Subject: [PATCH] particles config, profiles improvements --- .../config/profile/GlobalProfileManager.kt | 2 + .../config/profile/ProfileCollection.kt | 11 ++++ .../minosoft/config/profile/ProfileManager.kt | 12 +++- .../profile/profiles/eros/ErosProfile.kt | 2 +- .../profiles/eros/ErosProfileManager.kt | 18 ++---- .../profiles/particle/ParticleProfile.kt | 30 ++++++++++ .../particle/ParticleProfileManager.kt | 55 +++++++++++++++++++ .../particle/ParticleProfileSelectEvent.kt | 7 +++ .../gui/eros/dialog/UpdateServerDialog.kt | 5 +- .../rendering/particle/ParticleRenderer.kt | 54 +++++++++++++++--- .../network/connection/play/PlayConnection.kt | 2 + 11 files changed, 169 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/ProfileCollection.kt create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfile.kt create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt create mode 100644 src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileSelectEvent.kt diff --git a/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt index d6a238800..31fb2a1b2 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/GlobalProfileManager.kt @@ -3,6 +3,7 @@ package de.bixilon.minosoft.config.profile import com.fasterxml.jackson.databind.type.MapType import de.bixilon.minosoft.config.profile.profiles.Profile import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager +import de.bixilon.minosoft.config.profile.profiles.particle.ParticleProfileManager import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.eros.crash.ErosCrashReport.Companion.crash import de.bixilon.minosoft.terminal.RunConfiguration @@ -20,6 +21,7 @@ import java.io.File object GlobalProfileManager { val DEFAULT_MANAGERS: List> = listOf( ErosProfileManager, + ParticleProfileManager, ) private val SELECTED_PROFILES_TYPE: MapType = Jackson.MAPPER.typeFactory.constructMapType(HashMap::class.java, ResourceLocation::class.java, String::class.java) val CLASS_MAPPING: Map, ProfileManager<*>> diff --git a/src/main/java/de/bixilon/minosoft/config/profile/ProfileCollection.kt b/src/main/java/de/bixilon/minosoft/config/profile/ProfileCollection.kt new file mode 100644 index 000000000..6dfbeaf9a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/ProfileCollection.kt @@ -0,0 +1,11 @@ +package de.bixilon.minosoft.config.profile + +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfile +import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager +import de.bixilon.minosoft.config.profile.profiles.particle.ParticleProfile +import de.bixilon.minosoft.config.profile.profiles.particle.ParticleProfileManager + +data class ProfileCollection( + val eros: ErosProfile = ErosProfileManager.selected, + val particle: ParticleProfile = ParticleProfileManager.selected, +) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt index 696ab45cc..96ed7a907 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/ProfileManager.kt @@ -46,8 +46,11 @@ interface ProfileManager { fun delegate(value: V, checkEquals: Boolean = true): ProfileDelegate - fun selectDefault() - fun createDefaultProfile(): T + fun selectDefault() { + selected = profiles[DEFAULT_PROFILE_NAME] ?: createDefaultProfile() + } + + fun createDefaultProfile(name: String = DEFAULT_PROFILE_NAME): T fun initDefaultProfile() { val profile = createDefaultProfile() @@ -55,7 +58,10 @@ interface ProfileManager { save(profile) } - fun serialize(profile: T): Map + + fun serialize(profile: T): Map { + return Jackson.MAPPER.convertValue(profile, Jackson.JSON_MAP_TYPE) + } fun save(profile: T) { if (saveLock.isLocked) { diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt index afcb9211d..1278f4075 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfile.kt @@ -11,10 +11,10 @@ class ErosProfile( ) : Profile { override var initializing: Boolean = true private set + override var saved: Boolean = true override val version: Int = latestVersion override val description by delegate(description ?: "") - override var saved: Boolean = true val general: GeneralC = GeneralC() val server: ServerC = ServerC() diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt index 2a44ba3d3..bdd2aa993 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/eros/ErosProfileManager.kt @@ -27,15 +27,11 @@ object ErosProfileManager : ProfileManager { GlobalEventMaster.fireEvent(ErosProfileSelectEvent(value)) } - override fun selectDefault() { - selected = profiles[ProfileManager.DEFAULT_PROFILE_NAME] ?: createDefaultProfile() - } - - override fun createDefaultProfile(): ErosProfile { - currentLoadingPath = ProfileManager.DEFAULT_PROFILE_NAME + override fun createDefaultProfile(name: String): ErosProfile { + currentLoadingPath = name val profile = ErosProfile("Default eros profile") currentLoadingPath = null - profiles[ProfileManager.DEFAULT_PROFILE_NAME] = profile + profiles[name] = profile return profile } @@ -43,9 +39,9 @@ object ErosProfileManager : ProfileManager { override fun load(name: String, data: MutableMap?): ErosProfile { currentLoadingPath = name val profile: ErosProfile = if (data == null) { - ErosProfile() + return createDefaultProfile(name) } else { - Jackson.MAPPER.convertValue(data, ErosProfile::class.java) + Jackson.MAPPER.convertValue(data, profileClass) } profile.saved = true profiles[name] = profile @@ -53,10 +49,6 @@ object ErosProfileManager : ProfileManager { return profile } - override fun serialize(profile: ErosProfile): Map { - return Jackson.MAPPER.convertValue(profile, Jackson.JSON_MAP_TYPE) - } - override fun delegate(value: V, checkEquals: Boolean): ProfileDelegate { return ProfileDelegate(value, checkEquals, this, currentLoadingPath ?: throw IllegalAccessException("Delegate can only be created while loading or creating profiles!")) } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfile.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfile.kt new file mode 100644 index 000000000..e0026925e --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfile.kt @@ -0,0 +1,30 @@ +package de.bixilon.minosoft.config.profile.profiles.particle + +import de.bixilon.minosoft.config.profile.profiles.Profile +import de.bixilon.minosoft.config.profile.profiles.particle.ParticleProfileManager.delegate +import de.bixilon.minosoft.config.profile.profiles.particle.ParticleProfileManager.latestVersion +import de.bixilon.minosoft.gui.rendering.RenderConstants + +class ParticleProfile( + description: String? = null, +) : Profile { + override var initializing: Boolean = true + private set + override var saved: Boolean = true + override val version: Int = latestVersion + override val description by delegate(description ?: "") + + + var enabled by delegate(true) + + var maxAmount by delegate(RenderConstants.MAXIMUM_PARTICLE_AMOUNT) + + + override fun toString(): String { + return ParticleProfileManager.getName(this) + } + + init { + initializing = false + } +} diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt new file mode 100644 index 000000000..927af89ba --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileManager.kt @@ -0,0 +1,55 @@ +package de.bixilon.minosoft.config.profile.profiles.particle + +import com.google.common.collect.HashBiMap +import de.bixilon.minosoft.config.profile.GlobalProfileManager +import de.bixilon.minosoft.config.profile.ProfileManager +import de.bixilon.minosoft.config.profile.util.ProfileDelegate +import de.bixilon.minosoft.modding.event.master.GlobalEventMaster +import de.bixilon.minosoft.util.KUtil.toResourceLocation +import de.bixilon.minosoft.util.KUtil.unsafeCast +import de.bixilon.minosoft.util.json.jackson.Jackson +import java.util.concurrent.locks.ReentrantLock + +object ParticleProfileManager : ProfileManager { + override val namespace = "minosoft:particle".toResourceLocation() + override val latestVersion = 1 + override val saveLock = ReentrantLock() + override val profileClass = ParticleProfile::class.java + + + private var currentLoadingPath: String? = null + override val profiles: HashBiMap = HashBiMap.create() + + override var selected: ParticleProfile = null.unsafeCast() + set(value) { + field = value + GlobalProfileManager.selectProfile(this, value) + GlobalEventMaster.fireEvent(ParticleProfileSelectEvent(value)) + } + + override fun createDefaultProfile(name: String): ParticleProfile { + currentLoadingPath = name + val profile = ParticleProfile("Default particle profile") + currentLoadingPath = null + profiles[name] = profile + + return profile + } + + override fun load(name: String, data: MutableMap?): ParticleProfile { + currentLoadingPath = name + val profile: ParticleProfile = if (data == null) { + return createDefaultProfile(name) + } else { + Jackson.MAPPER.convertValue(data, profileClass) + } + profile.saved = true + profiles[name] = profile + currentLoadingPath = null + return profile + } + + override fun delegate(value: V, checkEquals: Boolean): ProfileDelegate { + return ProfileDelegate(value, checkEquals, this, currentLoadingPath ?: throw IllegalAccessException("Delegate can only be created while loading or creating profiles!")) + } +} diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileSelectEvent.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileSelectEvent.kt new file mode 100644 index 000000000..472920605 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/particle/ParticleProfileSelectEvent.kt @@ -0,0 +1,7 @@ +package de.bixilon.minosoft.config.profile.profiles.particle + +import de.bixilon.minosoft.modding.event.events.Event + +class ParticleProfileSelectEvent( + val profile: ParticleProfile, +) : Event diff --git a/src/main/java/de/bixilon/minosoft/gui/eros/dialog/UpdateServerDialog.kt b/src/main/java/de/bixilon/minosoft/gui/eros/dialog/UpdateServerDialog.kt index fe7d59cc0..1ec394234 100644 --- a/src/main/java/de/bixilon/minosoft/gui/eros/dialog/UpdateServerDialog.kt +++ b/src/main/java/de/bixilon/minosoft/gui/eros/dialog/UpdateServerDialog.kt @@ -16,7 +16,6 @@ package de.bixilon.minosoft.gui.eros.dialog import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.config.profile.change.listener.SimpleProfileChangeListener.Companion.listenFX import de.bixilon.minosoft.config.profile.profiles.eros.ErosProfileManager -import de.bixilon.minosoft.config.profile.profiles.eros.server.modify.ModifyC import de.bixilon.minosoft.config.server.Server import de.bixilon.minosoft.data.registries.versions.Version import de.bixilon.minosoft.data.registries.versions.VersionTypes @@ -111,8 +110,8 @@ class UpdateServerDialog( val modifyConfig = ErosProfileManager.selected.server.modify - ModifyC::showReleases.listenFX(this) { showReleasesFX.isSelected = it } - ModifyC::showSnapshots.listenFX(this) { showSnapshotsFX.isSelected = it } + modifyConfig::showReleases.listenFX(this) { showReleasesFX.isSelected = it } + modifyConfig::showSnapshots.listenFX(this) { showSnapshotsFX.isSelected = it } showReleasesFX.apply { isSelected = modifyConfig.showReleases diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index e39fab6ad..668cfb4b5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -14,11 +14,13 @@ package de.bixilon.minosoft.gui.rendering.particle import de.bixilon.minosoft.Minosoft +import de.bixilon.minosoft.config.profile.change.listener.SimpleProfileChangeListener.Companion.listen import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.* import de.bixilon.minosoft.gui.rendering.modding.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem +import de.bixilon.minosoft.gui.rendering.system.base.phases.SkipAll import de.bixilon.minosoft.gui.rendering.system.base.phases.TranslucentDrawable import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable import de.bixilon.minosoft.gui.rendering.system.base.shader.Shader @@ -30,9 +32,6 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil import de.bixilon.minosoft.util.ReadWriteLock import de.bixilon.minosoft.util.collections.floats.DirectArrayFloatList -import de.bixilon.minosoft.util.logging.Log -import de.bixilon.minosoft.util.logging.LogLevels -import de.bixilon.minosoft.util.logging.LogMessageType import de.bixilon.minosoft.util.task.time.TimeWorker import de.bixilon.minosoft.util.task.time.TimeWorkerTask import glm_.mat4x4.Mat4 @@ -42,8 +41,9 @@ import glm_.vec3.Vec3 class ParticleRenderer( private val connection: PlayConnection, override val renderWindow: RenderWindow, -) : Renderer, TransparentDrawable, TranslucentDrawable { +) : Renderer, TransparentDrawable, TranslucentDrawable, SkipAll { override val renderSystem: RenderSystem = renderWindow.renderSystem + private val profile = connection.profiles.particle private val transparentShader: Shader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "particle")) private val translucentShader: Shader = renderSystem.createShader(ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "particle")) @@ -59,10 +59,47 @@ class ParticleRenderer( private lateinit var particleTask: TimeWorkerTask + override val skipAll: Boolean + get() = !enabled + + + private var enabled = true + set(value) { + if (!value) { + particlesLock.lock() + particles.clear() + particlesLock.unlock() + + particleQueueLock.lock() + particleQueue.clear() + particleQueueLock.unlock() + } + field = value + } + private var maxAmount = RenderConstants.MAXIMUM_PARTICLE_AMOUNT + set(value) { + check(value > 1) { "Can not have negative particle mac amount" } + particlesLock.lock() + while (particles.size > value) { + particles.removeAt(0) + } + val particlesSize = particles.size + particlesLock.unlock() + particleQueueLock.lock() + while (particlesSize + particleQueue.size > value) { + particleQueue.removeAt(0) + } + particleQueueLock.unlock() + field = value + } + val size: Int get() = particles.size override fun init() { + profile::maxAmount.listen(this, true, profile) { maxAmount = minOf(it, RenderConstants.MAXIMUM_PARTICLE_AMOUNT) } + profile::enabled.listen(this, true, profile) { enabled = it } + connection.registerEvent(CallbackEventInvoker.of { renderWindow.queue += { fun applyToShader(shader: Shader) { @@ -104,7 +141,7 @@ class ParticleRenderer( connection.world.particleRenderer = this particleTask = TimeWorkerTask(ProtocolDefinition.TICK_TIME, maxDelayTime = ProtocolDefinition.TICK_TIME / 2) { - if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED) { + if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED || !enabled) { return@TimeWorkerTask } @@ -148,12 +185,11 @@ class ParticleRenderer( } fun add(particle: Particle) { - if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED) { + if (renderWindow.renderingState == RenderingStates.PAUSED || renderWindow.renderingState == RenderingStates.STOPPED || !enabled) { return } - val particleCount = particles.size - if (particleCount >= RenderConstants.MAXIMUM_PARTICLE_AMOUNT) { - Log.log(LogMessageType.RENDERING_GENERAL, LogLevels.WARN) { "Can not add particle: Limit reached (${particleCount} > ${RenderConstants.MAXIMUM_PARTICLE_AMOUNT}" } + val particleCount = particles.size + particleQueue.size + if (particleCount >= maxAmount) { return } val cameraLength = connection.player.position.length() diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt index 8658d9e10..0ab78b0ff 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/PlayConnection.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.protocol.network.connection.play import de.bixilon.minosoft.Minosoft +import de.bixilon.minosoft.config.profile.ProfileCollection import de.bixilon.minosoft.data.ChatTextPositions import de.bixilon.minosoft.data.accounts.Account import de.bixilon.minosoft.data.assets.MultiAssetsManager @@ -66,6 +67,7 @@ class PlayConnection( val address: ServerAddress, val account: Account, val version: Version, + val profiles: ProfileCollection = ProfileCollection(), ) : Connection() { val registries = Registries() val recipes = Recipes()