mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 04:15:14 -04:00
parse builder ("multipart") block models
This commit is contained in:
parent
20d0083973
commit
b545d930f4
@ -13,11 +13,13 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.models.block.state
|
package de.bixilon.minosoft.gui.rendering.models.block.state
|
||||||
|
|
||||||
|
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||||
|
import de.bixilon.kutil.cast.CollectionCast.asAnyList
|
||||||
import de.bixilon.kutil.json.JsonObject
|
import de.bixilon.kutil.json.JsonObject
|
||||||
import de.bixilon.kutil.json.JsonUtil.toJsonObject
|
import de.bixilon.kutil.json.JsonUtil.toJsonObject
|
||||||
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply
|
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.state.condition.ConditionBlockModel
|
import de.bixilon.minosoft.gui.rendering.models.block.state.builder.BuilderBlockModel
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.state.variant.VariantBlockModel
|
import de.bixilon.minosoft.gui.rendering.models.block.state.variant.VariantBlockModel
|
||||||
import de.bixilon.minosoft.gui.rendering.models.loader.BlockLoader
|
import de.bixilon.minosoft.gui.rendering.models.loader.BlockLoader
|
||||||
|
|
||||||
@ -29,7 +31,7 @@ interface DirectBlockModel {
|
|||||||
|
|
||||||
fun deserialize(loader: BlockLoader, data: JsonObject): DirectBlockModel? {
|
fun deserialize(loader: BlockLoader, data: JsonObject): DirectBlockModel? {
|
||||||
data["variants"]?.toJsonObject()?.let { return VariantBlockModel.deserialize(loader, it) }
|
data["variants"]?.toJsonObject()?.let { return VariantBlockModel.deserialize(loader, it) }
|
||||||
data["multipart"]?.toJsonObject()?.let { return ConditionBlockModel.deserialize(loader, it) }
|
data["multipart"]?.asAnyList()?.let { return BuilderBlockModel.deserialize(loader, it.unsafeCast()) }
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
@ -11,25 +11,17 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.models.block.state.condition
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder
|
||||||
|
|
||||||
import de.bixilon.kutil.json.JsonObject
|
|
||||||
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.state.DirectBlockModel
|
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply
|
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply
|
||||||
import de.bixilon.minosoft.gui.rendering.models.loader.BlockLoader
|
import de.bixilon.minosoft.gui.rendering.models.block.state.render.BlockRender
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.TextureManager
|
||||||
|
|
||||||
@Deprecated("TODO")
|
class BuilderApply(
|
||||||
class ConditionBlockModel : DirectBlockModel {
|
val applies: List<BlockStateApply>
|
||||||
|
) : BlockStateApply {
|
||||||
|
|
||||||
override fun choose(state: BlockState): BlockStateApply? {
|
override fun bake(textures: TextureManager): BlockRender? {
|
||||||
TODO("Not yet implemented")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
fun deserialize(loader: BlockLoader, data: JsonObject): ConditionBlockModel? {
|
|
||||||
TODO()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder
|
||||||
|
|
||||||
|
import de.bixilon.kutil.json.JsonObject
|
||||||
|
import de.bixilon.kutil.json.JsonUtil.asJsonObject
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.block.state.DirectBlockModel
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition.AndCondition
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition.BuilderCondition
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition.PrimitiveCondition
|
||||||
|
import de.bixilon.minosoft.gui.rendering.models.loader.BlockLoader
|
||||||
|
|
||||||
|
class BuilderBlockModel(
|
||||||
|
val parts: List<Apply>,
|
||||||
|
) : DirectBlockModel {
|
||||||
|
|
||||||
|
override fun choose(state: BlockState): BlockStateApply? {
|
||||||
|
val applies: MutableList<BlockStateApply> = mutableListOf()
|
||||||
|
|
||||||
|
val properties = if (state is PropertyBlockState) state.properties else emptyMap()
|
||||||
|
for ((condition, apply) in parts) {
|
||||||
|
if (!condition.matches(properties)) continue
|
||||||
|
|
||||||
|
applies += apply
|
||||||
|
}
|
||||||
|
|
||||||
|
if (applies.isEmpty()) return null
|
||||||
|
|
||||||
|
return BuilderApply(applies)
|
||||||
|
}
|
||||||
|
|
||||||
|
data class Apply(
|
||||||
|
val condition: BuilderCondition,
|
||||||
|
val apply: BlockStateApply,
|
||||||
|
)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun deserialize(loader: BlockLoader, data: List<JsonObject>): BuilderBlockModel? {
|
||||||
|
val parts: MutableList<Apply> = mutableListOf()
|
||||||
|
|
||||||
|
for (entry in data) {
|
||||||
|
val apply = entry["apply"]?.let { BlockStateApply.deserialize(loader, it) } ?: continue
|
||||||
|
|
||||||
|
val condition = entry["when"]?.asJsonObject()?.let { AndCondition.deserialize(it) } ?: PrimitiveCondition.TRUE
|
||||||
|
|
||||||
|
parts += Apply(condition, apply)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parts.isEmpty()) return null
|
||||||
|
|
||||||
|
return BuilderBlockModel(parts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition
|
||||||
|
|
||||||
|
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||||
|
import de.bixilon.kutil.json.JsonObject
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
|
||||||
|
class AndCondition(
|
||||||
|
val conditions: Set<BuilderCondition>,
|
||||||
|
) : BuilderCondition {
|
||||||
|
|
||||||
|
override fun matches(properties: Map<BlockProperties, Any>): Boolean {
|
||||||
|
for (condition in conditions) {
|
||||||
|
if (!condition.matches(properties)) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
fun deserialize(data: JsonObject): BuilderCondition? {
|
||||||
|
if (data.isEmpty()) return null
|
||||||
|
val property = PropertyCondition.deserialize(data)
|
||||||
|
val or = data[OrCondition.KEY]?.let { OrCondition.deserialize(it.unsafeCast()) } ?: return property
|
||||||
|
|
||||||
|
if (property == null) return or
|
||||||
|
|
||||||
|
return AndCondition(mutableSetOf(property, or))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
|
||||||
|
interface BuilderCondition {
|
||||||
|
|
||||||
|
fun matches(properties: Map<BlockProperties, Any>): Boolean
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition
|
||||||
|
|
||||||
|
import de.bixilon.kutil.json.JsonObject
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
|
||||||
|
class OrCondition(
|
||||||
|
val conditions: Set<BuilderCondition>,
|
||||||
|
) : BuilderCondition {
|
||||||
|
|
||||||
|
override fun matches(properties: Map<BlockProperties, Any>): Boolean {
|
||||||
|
for (condition in conditions) {
|
||||||
|
if (condition.matches(properties)) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val KEY = "OR"
|
||||||
|
|
||||||
|
fun deserialize(data: List<JsonObject>): OrCondition? {
|
||||||
|
TODO()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition
|
||||||
|
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
|
||||||
|
class PrimitiveCondition private constructor(val matches: Boolean) : BuilderCondition {
|
||||||
|
|
||||||
|
override fun matches(properties: Map<BlockProperties, Any>) = matches
|
||||||
|
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val TRUE = PrimitiveCondition(true)
|
||||||
|
val FALSE = PrimitiveCondition(false)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition
|
||||||
|
|
||||||
|
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||||
|
import de.bixilon.kutil.json.JsonObject
|
||||||
|
import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties
|
||||||
|
|
||||||
|
class PropertyCondition(
|
||||||
|
val conditions: Map<BlockProperties, Any>,
|
||||||
|
) : BuilderCondition {
|
||||||
|
|
||||||
|
override fun matches(properties: Map<BlockProperties, Any>): Boolean {
|
||||||
|
for ((property, value) in this.conditions) {
|
||||||
|
val target = properties[property] ?: return false
|
||||||
|
if (value is Set<*>) {
|
||||||
|
if (target !in value) return false
|
||||||
|
} else {
|
||||||
|
if (value != target) return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private fun deserializeOr(property: String, list: List<String>): Pair<BlockProperties, Any> {
|
||||||
|
if (list.size == 1) {
|
||||||
|
return BlockProperties.parseProperty(property, list.first())
|
||||||
|
}
|
||||||
|
|
||||||
|
val values: MutableSet<Any> = mutableSetOf()
|
||||||
|
var blockProperty: BlockProperties? = null
|
||||||
|
|
||||||
|
for (entry in list) {
|
||||||
|
val (entryProperty, entryValue) = BlockProperties.parseProperty(property, entry)
|
||||||
|
if (blockProperty == null) {
|
||||||
|
blockProperty = entryProperty
|
||||||
|
}
|
||||||
|
values += entryValue
|
||||||
|
}
|
||||||
|
if (blockProperty == null) {
|
||||||
|
throw IllegalStateException("List is empty!")
|
||||||
|
}
|
||||||
|
|
||||||
|
return Pair(blockProperty, values)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deserialize(data: JsonObject): PropertyCondition? {
|
||||||
|
val properties: MutableMap<BlockProperties, Any> = mutableMapOf()
|
||||||
|
|
||||||
|
for ((key, value) in data) {
|
||||||
|
if (key == OrCondition.KEY) continue
|
||||||
|
|
||||||
|
if (value is List<*>) {
|
||||||
|
val (property, values) = deserializeOr(key, value.unsafeCast())
|
||||||
|
properties[property] = values
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
val split = value.toString().split('|')
|
||||||
|
val (property, values) = deserializeOr(key, split)
|
||||||
|
properties[property] = values
|
||||||
|
}
|
||||||
|
|
||||||
|
if (properties.isEmpty()) return null
|
||||||
|
|
||||||
|
return PropertyCondition(properties)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user