1
0
mirror of https://github.com/GeyserMC/Rainbow.git synced 2025-12-19 14:59:16 +00:00

Fix some stuff

This commit is contained in:
Eclipse
2025-10-14 13:49:24 +00:00
parent 3907c2f087
commit 834b9addce
8 changed files with 33 additions and 20 deletions

View File

@@ -8,3 +8,7 @@ dependencies {
implementation(project(path = ":rainbow", configuration = "namedElements")) implementation(project(path = ":rainbow", configuration = "namedElements"))
include(project(":rainbow")) include(project(":rainbow"))
} }
loom {
accessWidenerPath = file("src/main/resources/rainbow-datagen.accesswidener")
}

View File

@@ -81,6 +81,7 @@ public abstract class RainbowModelProvider extends FabricModelProvider {
@Override @Override
public <T> CompletableFuture<?> saveJson(Codec<T> codec, T object, Path path) { public <T> CompletableFuture<?> saveJson(Codec<T> codec, T object, Path path) {
ResourceLocation location = ResourceLocation.withDefaultNamespace(path.toString()); ResourceLocation location = ResourceLocation.withDefaultNamespace(path.toString());
System.out.println("saving bedrock " + location);
return DataProvider.saveStable(output, registries, codec, object, provider.json(location)); return DataProvider.saveStable(output, registries, codec, object, provider.json(location));
} }

View File

@@ -1,31 +1,26 @@
package org.geysermc.rainbow.datagen.mixin; package org.geysermc.rainbow.datagen.mixin;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.client.data.models.ModelProvider; import net.minecraft.client.data.models.ModelProvider;
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataProvider; import net.minecraft.data.DataProvider;
import org.geysermc.rainbow.datagen.RainbowModelProvider; import org.geysermc.rainbow.datagen.RainbowModelProvider;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.concurrent.CompletableFuture;
@Mixin(ModelProvider.class) @Mixin(ModelProvider.class)
public abstract class ModelProviderMixin implements DataProvider { public abstract class ModelProviderMixin implements DataProvider {
@WrapOperation(method = "run", at = @At(value = "NEW", target = "Lnet/minecraft/client/data/models/ModelProvider$ItemInfoCollector;")) @Inject(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/data/models/BlockModelGenerators;run()V"))
public Object setItemInfosInRainbowModelProvider(Operation<?> original) { public void setItemInfosInRainbowModelProvider(CachedOutput output, CallbackInfoReturnable<CompletableFuture<?>> callbackInfoReturnable,
Object itemInfoCollector = original.call(); @Local ModelProvider.ItemInfoCollector itemInfoCollector, @Local ModelProvider.SimpleModelCollector simpleModelCollector) {
if ((Object) this instanceof RainbowModelProvider rainbowModelProvider) { if ((Object) this instanceof RainbowModelProvider rainbowModelProvider) {
rainbowModelProvider.setItemInfosMap(((ItemInfoCollectorAccessor) itemInfoCollector).getItemInfos()); rainbowModelProvider.setItemInfosMap(((ItemInfoCollectorAccessor) itemInfoCollector).getItemInfos());
}
return itemInfoCollector;
}
@WrapOperation(method = "run", at = @At(value = "NEW", target = "Lnet/minecraft/client/data/models/ModelProvider$SimpleModelCollector;"))
public Object setModelsInRainbowModelProvider(Operation<?> original) {
Object simpleModelCollector = original.call();
if ((Object) this instanceof RainbowModelProvider rainbowModelProvider) {
rainbowModelProvider.setModels(((SimpleModelCollectorAccessor) simpleModelCollector).getModels()); rainbowModelProvider.setModels(((SimpleModelCollectorAccessor) simpleModelCollector).getModels());
} }
return simpleModelCollector;
} }
} }

View File

@@ -14,7 +14,10 @@
}, },
"license": "MIT", "license": "MIT",
"environment": "client", "environment": "client",
"mixins": [], "mixins": [
"rainbow-datagen.mixins.json"
],
"accessWidener": "rainbow-datagen.accesswidener",
"depends": { "depends": {
"fabricloader": ">=${loader_version}", "fabricloader": ">=${loader_version}",
"fabric-api": "*", "fabric-api": "*",

View File

@@ -0,0 +1,3 @@
accessWidener v2 named
accessible class net/minecraft/client/data/models/ModelProvider$ItemInfoCollector
accessible class net/minecraft/client/data/models/ModelProvider$SimpleModelCollector

View File

@@ -24,7 +24,7 @@ public record GeyserRangeDispatchPredicate(Property property, float threshold, f
@Override @Override
public Type type() { public Type type() {
return null; return Type.RANGE_DISPATCH;
} }
public interface Property { public interface Property {

View File

@@ -277,7 +277,7 @@ public class BedrockItemMapper {
String safeIdentifier = base.textureName(); String safeIdentifier = base.textureName();
String bone = "bone"; String bone = "bone";
ResourceLocation geometryTexture = texture; ResourceLocation geometryTexture = texture;
Optional<BedrockGeometryContext> bedrockGeometry = customModel.map(model -> GeometryMapper.mapGeometry(safeIdentifier, bone, model, geometryTexture)); Optional<BedrockGeometryContext> bedrockGeometry = customModel.flatMap(model -> GeometryMapper.mapGeometry(safeIdentifier, bone, model, geometryTexture));
Optional<BedrockAnimationContext> bedrockAnimation = customModel.map(model -> AnimationMapper.mapAnimation(safeIdentifier, bone, model.getTopTransforms())); Optional<BedrockAnimationContext> bedrockAnimation = customModel.map(model -> AnimationMapper.mapAnimation(safeIdentifier, bone, model.getTopTransforms()));
boolean exportTexture = true; boolean exportTexture = true;

View File

@@ -5,6 +5,7 @@ import net.minecraft.client.renderer.block.model.BlockElementFace;
import net.minecraft.client.renderer.block.model.BlockElementRotation; import net.minecraft.client.renderer.block.model.BlockElementRotation;
import net.minecraft.client.renderer.block.model.SimpleUnbakedGeometry; import net.minecraft.client.renderer.block.model.SimpleUnbakedGeometry;
import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.client.resources.model.ResolvedModel;
import net.minecraft.client.resources.model.UnbakedGeometry;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import org.geysermc.rainbow.pack.geometry.BedrockGeometry; import org.geysermc.rainbow.pack.geometry.BedrockGeometry;
@@ -13,11 +14,17 @@ import org.joml.Vector3f;
import org.joml.Vector3fc; import org.joml.Vector3fc;
import java.util.Map; import java.util.Map;
import java.util.Optional;
public class GeometryMapper { public class GeometryMapper {
private static final Vector3fc CENTRE_OFFSET = new Vector3f(8.0F, 0.0F, 8.0F); private static final Vector3fc CENTRE_OFFSET = new Vector3f(8.0F, 0.0F, 8.0F);
public static BedrockGeometryContext mapGeometry(String identifier, String boneName, ResolvedModel model, ResourceLocation texture) { public static Optional<BedrockGeometryContext> mapGeometry(String identifier, String boneName, ResolvedModel model, ResourceLocation texture) {
UnbakedGeometry top = model.getTopGeometry();
if (top == UnbakedGeometry.EMPTY) {
return Optional.empty();
}
BedrockGeometry.Builder builder = BedrockGeometry.builder(identifier); BedrockGeometry.Builder builder = BedrockGeometry.builder(identifier);
// Blockbench seems to always use these values TODO that's wrong // Blockbench seems to always use these values TODO that's wrong
builder.withVisibleBoundsWidth(4.0F); builder.withVisibleBoundsWidth(4.0F);
@@ -33,7 +40,7 @@ public class GeometryMapper {
Vector3f min = new Vector3f(Float.MAX_VALUE); Vector3f min = new Vector3f(Float.MAX_VALUE);
Vector3f max = new Vector3f(Float.MIN_VALUE); Vector3f max = new Vector3f(Float.MIN_VALUE);
SimpleUnbakedGeometry geometry = (SimpleUnbakedGeometry) model.getTopGeometry(); SimpleUnbakedGeometry geometry = (SimpleUnbakedGeometry) top;
for (BlockElement element : geometry.elements()) { for (BlockElement element : geometry.elements()) {
// TODO the origin here is wrong, some models seem to be mirrored weirdly in blockbench // TODO the origin here is wrong, some models seem to be mirrored weirdly in blockbench
BedrockGeometry.Cube cube = mapBlockElement(element).build(); BedrockGeometry.Cube cube = mapBlockElement(element).build();
@@ -48,7 +55,7 @@ public class GeometryMapper {
// Bind to the bone of the current item slot // Bind to the bone of the current item slot
bone.withBinding("q.item_slot_to_bone_name(context.item_slot)"); bone.withBinding("q.item_slot_to_bone_name(context.item_slot)");
return new BedrockGeometryContext(builder.withBone(bone).build(), texture); return Optional.of(new BedrockGeometryContext(builder.withBone(bone).build(), texture));
} }
private static BedrockGeometry.Cube.Builder mapBlockElement(BlockElement element) { private static BedrockGeometry.Cube.Builder mapBlockElement(BlockElement element) {