From c3bf0f1de2325a562b2b3e620476904d8a654cb0 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Tue, 10 Oct 2023 22:25:08 +0200 Subject: [PATCH] fix fallback rgb reading, fix tests That fixes weird looking grass (and a couple of other textures) in resource packs and 1.20.2 --- .../world/chunk/manager/ChunkManagerTest.kt | 3 +- .../rendering/models/baked/BakedFaceTest.kt | 5 +- .../models/baked/BakedModelTestUtil.kt | 2 +- .../rendering/textures/TextureReadingTest.kt | 63 ++++++++++++++++++ .../resources/texture_reading/gray_gray.png | Bin 0 -> 298 bytes .../resources/texture_reading/gray_rgb.png | Bin 0 -> 560 bytes .../minosoft/data/registries/biomes/Biome.kt | 2 +- .../gui/rendering/textures/TextureUtil.kt | 31 +++++---- .../tint/tints/GrassTintCalculator.kt | 2 +- 9 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt create mode 100644 src/integration-test/resources/texture_reading/gray_gray.png create mode 100644 src/integration-test/resources/texture_reading/gray_rgb.png diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/world/chunk/manager/ChunkManagerTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/world/chunk/manager/ChunkManagerTest.kt index 23a9ab3da..09bf742a6 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/world/chunk/manager/ChunkManagerTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/world/chunk/manager/ChunkManagerTest.kt @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.world.chunk.manager import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.minosoft.data.registries.biomes.Biome -import de.bixilon.minosoft.data.registries.biomes.BiomePrecipitation import de.bixilon.minosoft.data.registries.blocks.types.stone.StoneTest0 import de.bixilon.minosoft.data.registries.identified.Namespaces.minosoft import de.bixilon.minosoft.data.world.biome.accessor.NoiseBiomeAccessor @@ -438,7 +437,7 @@ class ChunkManagerTest { fun noiseBiomeCache() { val manager = create() - val biome = Biome(minosoft("test"), 0.0f, 0.0f, null, null, null, null, BiomePrecipitation.NONE) + val biome = Biome(minosoft("test"), 0.0f, 0.0f, null, null, null, null, null) manager.world.cacheBiomeAccessor = NoiseBiomeAccessor(manager.world.connection, 0L) val source = SpatialBiomeArray(Array(1024) { biome }) val matrix = manager.createMatrix(source) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedFaceTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedFaceTest.kt index 32cb4c7be..d7e0f745e 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedFaceTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedFaceTest.kt @@ -18,6 +18,7 @@ import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.gui.rendering.chunk.mesh.ChunkMesh import de.bixilon.minosoft.gui.rendering.chunk.mesh.SingleChunkMesh import de.bixilon.minosoft.gui.rendering.models.block.state.baked.BakedFace +import de.bixilon.minosoft.gui.rendering.models.block.state.baked.Shades import de.bixilon.minosoft.gui.rendering.system.base.MeshUtil.buffer import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.PrimitiveTypes import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture @@ -56,7 +57,7 @@ class BakedFaceTest { } fun mixed() { - val face = BakedFace(floatArrayOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f, 11f), floatArrayOf(-1f, -2f, -3f, -4f, -5f, -6f, -7f, -8f), 1.0f, -1, null, texture()) + val face = BakedFace(floatArrayOf(0f, 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f, 11f), floatArrayOf(-1f, -2f, -3f, -4f, -5f, -6f, -7f, -8f), Shades.UP, -1, null, texture()) val mesh = mesh() @@ -78,7 +79,7 @@ class BakedFaceTest { } fun blockSouth() { - val face = BakedFace(floatArrayOf(0f, 0f, 0f, 0f, 1f, 0f, 0f, 1f, 1f, 0f, 0f, 1f), floatArrayOf(0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f), 1.0f, -1, null, texture()) + val face = BakedFace(floatArrayOf(0f, 0f, 0f, 0f, 1f, 0f, 0f, 1f, 1f, 0f, 0f, 1f), floatArrayOf(0f, 0f, 0f, 1f, 1f, 1f, 1f, 0f), Shades.UP, -1, null, texture()) val mesh = mesh() diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt index 29985352a..872a329ae 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/baked/BakedModelTestUtil.kt @@ -63,7 +63,7 @@ object BakedModelTestUtil { vertices?.let { assertMatches(face.positions, it, "Vertices mismatch") } uv?.let { if (!face.uv.contentEquals(it)) throw AssertionError("UV mismatch, expected [${uv[0]}|${uv[1]}], but got [${face.uv[0]}|${face.uv[1]}]") } // printing the first element is fine, it is always clockwise - shade?.let { Assert.assertEquals(face.shade, it, "Shade mismatch") } + shade?.let { Assert.assertEquals(face.shade.shade, it, "Shade mismatch") } texture?.toResourceLocation()?.texture()?.let { Assert.assertEquals(face.texture, it, "Texture mismatch") } } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt new file mode 100644 index 000000000..3a938259c --- /dev/null +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/textures/TextureReadingTest.kt @@ -0,0 +1,63 @@ +/* + * Minosoft + * Copyright (C) 2020-2023 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. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.textures + +import de.bixilon.kotlinglm.vec2.Vec2i +import de.bixilon.minosoft.gui.rendering.system.base.texture.data.TextureData +import org.testng.Assert.assertEquals +import org.testng.annotations.Test +import java.io.ByteArrayInputStream +import java.io.InputStream + +@Test(groups = ["texture", "assets"]) +class TextureReadingTest { + private val GRAY_GRAY = TextureReadingTest::class.java.getResourceAsStream("/texture_reading/gray_gray.png")!!.readAllBytes() + private val GRAY_RGB = TextureReadingTest::class.java.getResourceAsStream("/texture_reading/gray_rgb.png")!!.readAllBytes() + + private val READ_1 = TextureUtil::class.java.getDeclaredMethod("readTexture1", InputStream::class.java).apply { isAccessible = true } + private val READ_2 = TextureUtil::class.java.getDeclaredMethod("readTexture2", InputStream::class.java).apply { isAccessible = true } + + private fun TextureData.assertGray() { + assertEquals(size, Vec2i(16, 16)) + + assertEquals(buffer.get(0), 0x94.toByte()) + assertEquals(buffer.get(1), 0x94.toByte()) + assertEquals(buffer.get(2), 0x94.toByte()) + assertEquals(buffer.get(3), 0xFF.toByte()) + assertEquals(buffer.get(4), 0xC3.toByte()) + assertEquals(buffer.get(128), 0xA3.toByte()) + assertEquals(buffer.get(256), 0xA2.toByte()) + } + + fun `read rgb 1`() { + val texture = READ_1.invoke(TextureUtil, ByteArrayInputStream(GRAY_RGB)) as TextureData + texture.assertGray() + } + + fun `read rgb 2`() { + val texture = READ_2.invoke(TextureUtil, ByteArrayInputStream(GRAY_RGB)) as TextureData + texture.assertGray() + } + + @Test(enabled = false) + fun `read gray 1`() { + val texture = READ_1.invoke(TextureUtil, ByteArrayInputStream(GRAY_GRAY)) as TextureData + texture.assertGray() + } + + fun `read gray 2`() { + val texture = READ_2.invoke(TextureUtil, ByteArrayInputStream(GRAY_GRAY)) as TextureData + texture.assertGray() + } +} diff --git a/src/integration-test/resources/texture_reading/gray_gray.png b/src/integration-test/resources/texture_reading/gray_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..6abb3a1e5717f8e70b51b2fd1697f0ca0a26152a GIT binary patch literal 298 zcmV+_0oDGAP)qaf-yv!w1BOp-xVu_%#E6wz2TeZr0~(K0Z*W@_DoEqc_tIX+5$}SD zA;=3^8*?CDo5o~BGO)&dB`xkq?rkScq41Q5W|93(BdVP1jRe%LxRRmeBHFwp?E|XI wYdhUzp(Y9LPVNTm197ftEQ0@CXN9DA1M~QkaPr(;zyJUM07*qoM6N<$f`AcwSpWb4 literal 0 HcmV?d00001 diff --git a/src/integration-test/resources/texture_reading/gray_rgb.png b/src/integration-test/resources/texture_reading/gray_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa7e458f702c46fe6eb7d58efdd091cca089530 GIT binary patch literal 560 zcmV-00?+-4P)nJC=}8J zv-|z7b5;sF3}>C>1NIICKE7TrnZl0ogeHsw8QL_1h<1j;1Rw`G(-?#g41*1YAbr1I z3xz_`jW;x6;(rg&30)#gsQADch=huFo?#Y=M1+ohGJw&JJyQf74p=Lc(Hahib;dh) znn)!~VMU*#k(iQ5kSJmZ=j495TuKTx$Ylda;GMwfzd#XMJ&L4_kkE+J1c?hnG16N( yEF4rx9#hfG{@H>z05dwG5;T%S-EWC!Q4gw0000