diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt index eaf9505b..7c60b88f 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt @@ -161,9 +161,9 @@ class Starbound : ISBFileLocator { registerTypeAdapter(spriteRegistry) registerTypeAdapterFactory(InventoryIcon.Factory(pathStack, spriteRegistry)) - registerTypeAdapterFactory(IArmorItemDefinition.Frames.Factory(pathStack, this@Starbound::atlasRegistry)) + registerTypeAdapterFactory(IArmorItemDefinition.Frames.Factory) registerTypeAdapterFactory(DirectAssetReferenceFactory(pathStack)) - registerTypeAdapter(ImageReference.Adapter(pathStack, this@Starbound::atlasRegistry)) + registerTypeAdapterFactory(ImageReference.Adapter(this@Starbound::atlasRegistry)) registerTypeAdapterFactory(AssetReferenceFactory(pathStack, this@Starbound)) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/SpriteAnimator.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/SpriteAnimator.kt index 0630517d..daf763f2 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/SpriteAnimator.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/SpriteAnimator.kt @@ -40,7 +40,7 @@ class SpriteAnimator( animationLoops: Boolean = true, firstFrame: Int = 0, lastFrame: Int = image.config.spriteList.size - 1 - ) : this(state.loadNamedTextureSafe(image.image), image.config, animationCycle, animationLoops, firstFrame, lastFrame) + ) : this(state.loadNamedTextureSafe(image.image.fullPath), image.config, animationCycle, animationLoops, firstFrame, lastFrame) val sprite get() = sprites[frame] } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/TileRenderer.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/TileRenderer.kt index d5ae910b..41c4d2e3 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/TileRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/client/render/TileRenderer.kt @@ -185,7 +185,7 @@ private class ModifierEqualityTester(val definition: MaterialModifier) : Equalit class TileRenderer(val renderers: TileRenderers, val def: IRenderableTile) { val state get() = renderers.state - val texture = state.loadNamedTexture(def.renderParameters.texture.image).also { + val texture = state.loadNamedTexture(def.renderParameters.texture.image.fullPath).also { it.textureMagFilter = GL_NEAREST } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/animation/AnimationDefinition.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/animation/AnimationDefinition.kt index c1d09930..8e578468 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/animation/AnimationDefinition.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/animation/AnimationDefinition.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.kstarbound.defs.animation import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableMap +import ru.dbotthepony.kstarbound.defs.image.ImageReference import ru.dbotthepony.kstarbound.defs.image.SpriteReference import ru.dbotthepony.kstarbound.defs.particle.ParticleEmitter import ru.dbotthepony.kstarbound.io.json.builder.JsonFactory @@ -10,7 +11,13 @@ import ru.dbotthepony.kvector.vector.ndouble.Vector2d @JsonFactory data class AnimationDefinition( + val frames: ImageReference? = null, val animatedParts: AnimatedParts? = null, + val variants: Int? = null, + val frameNumber: Int? = null, + val animationCycle: Double? = null, + val offset: Vector2d? = null, + val sounds: ImmutableMap, CustomSound>> = ImmutableMap.of(), val transformationGroups: ImmutableMap = ImmutableMap.of(), val particleEmitters: ImmutableMap = ImmutableMap.of(), diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/image/ImageReference.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/image/ImageReference.kt index 12fe3f96..7ea6b608 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/image/ImageReference.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/image/ImageReference.kt @@ -1,10 +1,14 @@ package ru.dbotthepony.kstarbound.defs.image +import com.google.gson.Gson import com.google.gson.JsonSyntaxException import com.google.gson.TypeAdapter +import com.google.gson.TypeAdapterFactory +import com.google.gson.reflect.TypeToken import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter +import ru.dbotthepony.kstarbound.defs.DirectAssetReference import ru.dbotthepony.kstarbound.util.PathStack /** @@ -13,31 +17,34 @@ import ru.dbotthepony.kstarbound.util.PathStack * @see [AtlasConfiguration.Companion.get] */ data class ImageReference( - val image: String, + val image: DirectAssetReference, val config: AtlasConfiguration, ) { - class Adapter(private val remapper: PathStack, private val atlasRegistry: () -> AtlasConfiguration.Registry) : TypeAdapter() { - override fun write(out: JsonWriter, value: ImageReference?) { - if (value == null) - out.nullValue() - else - out.value(value.image) - } + class Adapter(private val atlasRegistry: () -> AtlasConfiguration.Registry) : TypeAdapterFactory { + override fun create(gson: Gson, type: TypeToken): TypeAdapter? { + if (type.rawType == ImageReference::class.java) { + return object : TypeAdapter() { + private val assets = gson.getAdapter(DirectAssetReference::class.java) - override fun read(`in`: JsonReader): ImageReference? { - if (`in`.peek() == JsonToken.NULL) - return null + override fun write(out: JsonWriter, value: ImageReference?) { + out.value(value?.image?.fullPath) + } - if (`in`.peek() == JsonToken.STRING) { - val image = remapper.remap(`in`.nextString()) + override fun read(`in`: JsonReader): ImageReference? { + if (`in`.peek() == JsonToken.NULL) + return null - if (image.contains(':')) - throw JsonSyntaxException("Expected atlas/image reference, but got sprite reference: $image") + val image = assets.read(`in`) - return ImageReference(image, atlasRegistry.invoke().get(image)) + if (image.path.contains(':')) + throw JsonSyntaxException("Expected atlas/image reference, but got sprite reference: $image") + + return ImageReference(image, atlasRegistry.invoke().get(image.fullPath)) + } + } as TypeAdapter } - throw JsonSyntaxException("Expected atlas/image reference, but got: ${`in`.peek()} near ${`in`.path}") + return null } } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IArmorItemDefinition.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IArmorItemDefinition.kt index 35e0c0d0..58476d9e 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IArmorItemDefinition.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/IArmorItemDefinition.kt @@ -41,7 +41,7 @@ interface IArmorItemDefinition : ILeveledItemDefinition, IScriptableItemDefiniti override val backSleeve: ImageReference? = null, override val frontSleeve: ImageReference? = null, ) : IFrames { - class Factory(private val remapper: PathStack, private val atlasRegistry: () -> AtlasConfiguration.Registry) : TypeAdapterFactory { + object Factory : TypeAdapterFactory { override fun create(gson: Gson, type: TypeToken): TypeAdapter? { if (type.rawType == Frames::class.java) { return object : TypeAdapter() { @@ -52,23 +52,19 @@ interface IArmorItemDefinition : ILeveledItemDefinition, IScriptableItemDefiniti Frames::frontSleeve, ).build(gson) + private val frames = gson.getAdapter(ImageReference::class.java) + override fun write(out: JsonWriter, value: Frames?) { - if (value == null) - out.nullValue() - else - adapter.write(out, value) + adapter.write(out, value) } override fun read(`in`: JsonReader): Frames? { if (`in`.peek() == JsonToken.NULL) return null - - if (`in`.peek() == JsonToken.STRING) { - val path = remapper.remap(`in`.nextString()) - return Frames(ImageReference(path, atlasRegistry.invoke().get(path)), null, null) - } - - return adapter.read(`in`) + else if (`in`.peek() == JsonToken.STRING) + return Frames(frames.read(`in`), null, null) + else + return adapter.read(`in`) } } as TypeAdapter } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/InternedJsonElementAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/InternedJsonElementAdapter.kt index 362c006e..651ac75e 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/InternedJsonElementAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/InternedJsonElementAdapter.kt @@ -14,9 +14,6 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter class InternedJsonElementAdapter(val stringInterner: Interner) : TypeAdapter() { - private val _true = JsonPrimitive(true) - private val _false = JsonPrimitive(false) - override fun write(out: JsonWriter, value: JsonElement?) { return TypeAdapters.JSON_ELEMENT.write(out, value) } @@ -44,6 +41,11 @@ class InternedJsonElementAdapter(val stringInterner: Interner) : TypeAda else -> throw IllegalArgumentException(p.toString()) } } + + companion object { + private val _true = JsonPrimitive(true) + private val _false = JsonPrimitive(false) + } } class InternedStringAdapter(val stringInterner: Interner) : TypeAdapter() {