Skip to content

Commit

Permalink
feat: make it possible to specify predicate order explicitly when mer…
Browse files Browse the repository at this point in the history
…ging model overrides
  • Loading branch information
vberlier committed Jan 13, 2024
1 parent ab14000 commit 4eb346d
Show file tree
Hide file tree
Showing 6 changed files with 189 additions and 10 deletions.
51 changes: 41 additions & 10 deletions beet/contrib/model_merging.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,71 @@


__all__ = [
"ModelMergingOptions",
"ModelOverridesMergePolicy",
"model_merging",
"merge_model_overrides",
]


from copy import deepcopy
from typing import Dict, List, Tuple, Union
from dataclasses import dataclass
from typing import Dict, Sequence, Tuple, Union

from beet import Context, Model, ResourcePack
from beet import Context, Model, PluginOptions, ResourcePack
from beet.core.utils import JsonDict


class ModelMergingOptions(PluginOptions):
predicate_order: Sequence[str] = ()


def beet_default(ctx: Context):
ctx.require(model_merging)


def model_merging(ctx: Union[Context, ResourcePack]):
pack = ctx.assets if isinstance(ctx, Context) else ctx
pack.merge_policy.extend_namespace(Model, merge_model_overrides)
def model_merging(
arg: Union[Context, ResourcePack],
*,
predicate_order: Sequence[str] = (),
):
if isinstance(arg, Context):
pack = arg.assets
opts = arg.validate("model_merging", ModelMergingOptions)
if not predicate_order:
predicate_order = opts.predicate_order
else:
pack = arg

pack.merge_policy.extend_namespace(
Model, ModelOverridesMergePolicy(predicate_order)
)


@dataclass
class ModelOverridesMergePolicy:
predicate_order: Sequence[str] = ()

def __call__(
self,
pack: ResourcePack,
path: str,
current: Model,
conflict: Model,
) -> bool:
return merge_model_overrides(current, conflict, self.predicate_order)


def merge_model_overrides(
pack: ResourcePack,
path: str,
current: Model,
conflict: Model,
current: Model, conflict: Model, predicate_order: Sequence[str] = ()
) -> bool:
merged = deepcopy(conflict.data)

overrides = current.data.get("overrides", [])
other_overrides = merged.pop("overrides", [])
concatenated_overrides = overrides + other_overrides

predicate_cases: List[str] = []
predicate_cases = list(predicate_order)
for override in concatenated_overrides:
for predicate in override.get("predicate", {}):
if predicate not in predicate_cases:
Expand Down
14 changes: 14 additions & 0 deletions examples/load_merge_overrides/beet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@ require:
- beet.contrib.model_merging
resource_pack:
load:
- assets/minecraft/models/item/elytra.json: elytra1.json
- assets/minecraft/models/item/elytra.json: elytra2.json
- assets/minecraft/models/item/furnace.json: furnace1.json
- assets/minecraft/models/item/furnace.json: furnace2.json
- assets/minecraft/models/item/furnace.json: furnace3.json
pipeline:
- require:
- beet.contrib.model_merging
resource_pack:
load:
- assets/minecraft/models/item/elytra_custom_predicate_order.json: elytra1.json
- assets/minecraft/models/item/elytra_custom_predicate_order.json: elytra2.json
meta:
model_merging:
predicate_order:
- custom_model_data
- broken
27 changes: 27 additions & 0 deletions examples/load_merge_overrides/elytra1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"parent": "item/generated",
"textures": {
"layer0": "item/elytra"
},
"overrides": [
{
"predicate": {
"broken": 1
},
"model": "minecraft:item/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420113
},
"model": "gm4_metallurgy:shamir/moneo/elytra"
},
{
"predicate": {
"custom_model_data": 3420113,
"broken": 1
},
"model": "gm4_metallurgy:shamir/moneo/broken_elytra"
}
]
}
27 changes: 27 additions & 0 deletions examples/load_merge_overrides/elytra2.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"parent": "item/generated",
"textures": {
"layer0": "item/elytra"
},
"overrides": [
{
"predicate": {
"broken": 1
},
"model": "minecraft:item/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420124
},
"model": "gm4_animi_shamir:shamir/animi/elytra"
},
{
"predicate": {
"custom_model_data": 3420124,
"broken": 1
},
"model": "gm4_animi_shamir:shamir/animi/broken_elytra"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"parent": "item/generated",
"textures": {
"layer0": "item/elytra"
},
"overrides": [
{
"predicate": {
"custom_model_data": 3420113
},
"model": "gm4_metallurgy:shamir/moneo/elytra"
},
{
"predicate": {
"custom_model_data": 3420124
},
"model": "gm4_animi_shamir:shamir/animi/elytra"
},
{
"predicate": {
"broken": 1
},
"model": "minecraft:item/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420113,
"broken": 1
},
"model": "gm4_metallurgy:shamir/moneo/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420124,
"broken": 1
},
"model": "gm4_animi_shamir:shamir/animi/broken_elytra"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"parent": "item/generated",
"textures": {
"layer0": "item/elytra"
},
"overrides": [
{
"predicate": {
"broken": 1
},
"model": "minecraft:item/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420113
},
"model": "gm4_metallurgy:shamir/moneo/elytra"
},
{
"predicate": {
"custom_model_data": 3420113,
"broken": 1
},
"model": "gm4_metallurgy:shamir/moneo/broken_elytra"
},
{
"predicate": {
"custom_model_data": 3420124
},
"model": "gm4_animi_shamir:shamir/animi/elytra"
},
{
"predicate": {
"custom_model_data": 3420124,
"broken": 1
},
"model": "gm4_animi_shamir:shamir/animi/broken_elytra"
}
]
}

0 comments on commit 4eb346d

Please sign in to comment.