From 83c3337f38c10ea711898e84720432020565a545 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Mon, 31 Mar 2025 15:23:45 +0200 Subject: [PATCH] jackson: fix color serializing Not perfect, but pretty much the only way --- .../config/profile/delegate/SimpleDelegate.kt | 6 +----- .../profile/delegate/types/ColorDelegate.kt | 8 ++++---- .../profiles/gui/hud/crosshair/CrosshairC.kt | 2 +- .../data/text/formatting/color/Color.kt | 3 +++ .../data/text/formatting/color/RGBAColor.kt | 3 ++- .../data/text/formatting/color/RGBColor.kt | 3 ++- .../chunk/outline/BlockOutlineRenderer.kt | 4 ++-- .../hud/elements/other/CrosshairHUDElement.kt | 4 ++-- .../minosoft/util/json/RGBColorSerializer.kt | 18 +++++++++--------- 9 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt index 2d24a7e47..4f5e11617 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/SimpleDelegate.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2025 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -23,10 +23,6 @@ open class SimpleDelegate( private val verify: ((T) -> Unit)? = null, ) : DataObserver(default), AbstractProfileDelegate { - init { - - } - override fun set(value: T): T { validate(value) return super.set(value) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/ColorDelegate.kt b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/ColorDelegate.kt index c384f9e4c..1d42e5a50 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/ColorDelegate.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/delegate/types/ColorDelegate.kt @@ -15,12 +15,12 @@ package de.bixilon.minosoft.config.profile.delegate.types import de.bixilon.minosoft.config.profile.delegate.SimpleDelegate import de.bixilon.minosoft.config.profile.profiles.Profile -import de.bixilon.minosoft.data.text.formatting.color.RGBAColor +import de.bixilon.minosoft.data.text.formatting.color.Color open class ColorDelegate( override val profile: Profile, - default: RGBAColor, -) : SimpleDelegate(profile, default) { + default: Color, +) : SimpleDelegate(profile, default) { - override fun validate(value: RGBAColor) = Unit + override fun validate(value: Color) = Unit } diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/crosshair/CrosshairC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/crosshair/CrosshairC.kt index e18bfe10f..1ce49db7a 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/crosshair/CrosshairC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/gui/hud/crosshair/CrosshairC.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2023 Moritz Zwerger + * Copyright (C) 2020-2025 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * diff --git a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/Color.kt b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/Color.kt index baea5582c..147b41c84 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/Color.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/Color.kt @@ -29,6 +29,9 @@ interface Color { val rgb: Int + fun rgb() = RGBColor(red, green, blue) + fun rgba() = RGBAColor(red, green, blue) + companion object { const val BITS = 8 diff --git a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBAColor.kt b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBAColor.kt index d1f5f8ad7..91b1baff7 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBAColor.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBAColor.kt @@ -66,7 +66,8 @@ value class RGBAColor(val argb: Int) : Color, TextFormattable { inline fun with(red: Int = this.red, green: Int = this.green, blue: Int = this.blue, alpha: Int = this.alpha) = RGBAColor(red, green, blue, alpha) inline fun with(red: Float = this.redf, green: Float = this.greenf, blue: Float = this.bluef, alpha: Float = this.alphaf) = RGBAColor(red, green, blue, alpha) - fun rgb() = RGBColor(red, green, blue) + override inline fun rgb() = RGBColor(red, green, blue) + override inline fun rgba() = this fun mix(other: RGBAColor) = RGBAColor((red + other.red) / 2, (green + other.green) / 2, (blue + other.blue) / 2, (alpha + other.alpha) / 2) diff --git a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBColor.kt b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBColor.kt index 9db431504..4011ca089 100644 --- a/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBColor.kt +++ b/src/main/java/de/bixilon/minosoft/data/text/formatting/color/RGBColor.kt @@ -58,7 +58,8 @@ value class RGBColor(override val rgb: Int) : Color, TextFormattable { inline fun with(red: Float = this.redf, green: Float = this.greenf, blue: Float = this.bluef) = RGBColor(red, green, blue) inline fun with(red: Float = this.redf, green: Float = this.greenf, blue: Float = this.bluef, alpha: Float) = RGBAColor(red, green, blue, alpha) - fun rgba() = RGBAColor(red, green, blue, MAX) + override inline fun rgb() = this + override inline fun rgba() = RGBAColor(red, green, blue, MAX) fun mix(other: RGBColor) = RGBColor((red + other.red) / 2, (green + other.green) / 2, (blue + other.blue) / 2) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt index b1762fa57..e3da351bd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt @@ -137,11 +137,11 @@ class BlockOutlineRenderer( } - target.state.block.getOutlineShape(session, target.blockPosition, target.state)?.let { mesh.drawVoxelShape(it, blockOffset, RenderConstants.DEFAULT_LINE_WIDTH, profile.outlineColor) } + target.state.block.getOutlineShape(session, target.blockPosition, target.state)?.let { mesh.drawVoxelShape(it, blockOffset, RenderConstants.DEFAULT_LINE_WIDTH, profile.outlineColor.rgba()) } if (target.state.block is CollidableBlock && profile.collisions) { // TODO: block entity - target.state.block.getCollisionShape(session, EntityCollisionContext(session.player), target.blockPosition, target.state, null)?.let { mesh.drawVoxelShape(it, blockOffset, RenderConstants.DEFAULT_LINE_WIDTH, profile.collisionColor, 0.005f) } + target.state.block.getCollisionShape(session, EntityCollisionContext(session.player), target.blockPosition, target.state, null)?.let { mesh.drawVoxelShape(it, blockOffset, RenderConstants.DEFAULT_LINE_WIDTH, profile.collisionColor.rgba(), 0.005f) } } this.nextMesh = mesh diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt index ea6d4b756..caab2939d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/CrosshairHUDElement.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2024 Moritz Zwerger + * Copyright (C) 2020-2025 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -93,7 +93,7 @@ class CrosshairHUDElement(guiRenderer: GUIRenderer) : CustomHUDElement(guiRender val mesh = GUIMesh(context, guiRenderer.halfSize, BufferedArrayFloatList(42)) val start = (guiRenderer.scaledSize - CROSSHAIR_SIZE) / 2 - mesh.addQuad(start, start + CROSSHAIR_SIZE, crosshairAtlasElement, crosshairProfile.color, null) + mesh.addQuad(start, start + CROSSHAIR_SIZE, crosshairAtlasElement, crosshairProfile.color.rgba(), null) // ToDo: Attack indicator diff --git a/src/main/java/de/bixilon/minosoft/util/json/RGBColorSerializer.kt b/src/main/java/de/bixilon/minosoft/util/json/RGBColorSerializer.kt index 4ff1f8c7d..1f085528a 100644 --- a/src/main/java/de/bixilon/minosoft/util/json/RGBColorSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/util/json/RGBColorSerializer.kt @@ -21,28 +21,28 @@ import com.fasterxml.jackson.databind.SerializerProvider import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.ser.std.StdSerializer -import de.bixilon.minosoft.data.text.formatting.color.RGBColor +import de.bixilon.minosoft.data.text.formatting.color.Color import de.bixilon.minosoft.data.text.formatting.color.RGBColor.Companion.rgb object RGBColorSerializer : SimpleModule() { init { - addDeserializer(RGBColor::class.java, Deserializer) - addSerializer(RGBColor::class.java, Serializer) + addDeserializer(Color::class.java, Deserializer) + addSerializer(Color::class.java, Serializer) } - object Deserializer : StdDeserializer(RGBColor::class.java) { + object Deserializer : StdDeserializer(Color::class.java) { override fun deserialize(parser: JsonParser, context: DeserializationContext?) = when (parser.currentToken) { - JsonToken.VALUE_NUMBER_INT -> RGBColor(parser.valueAsInt) + JsonToken.VALUE_NUMBER_INT -> parser.valueAsInt.rgb() JsonToken.VALUE_STRING -> parser.valueAsString.rgb() - else -> TODO("Can not parse color!") - } + else -> TODO("Can not parse color!") + } } - object Serializer : StdSerializer(RGBColor::class.java) { + object Serializer : StdSerializer(Color::class.java) { - override fun serialize(value: RGBColor?, generator: JsonGenerator, provider: SerializerProvider?) { + override fun serialize(value: Color?, generator: JsonGenerator, provider: SerializerProvider?) { generator.writeString(value?.toString()) } }