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

Fix 3D icon inclusion in pack.zip, use right head animation identifier

This commit is contained in:
Eclipse
2025-10-19 17:48:58 +00:00
parent 8ccba795e7
commit a69c289947
5 changed files with 39 additions and 19 deletions

View File

@@ -68,11 +68,11 @@ public final class PackManager {
return currentPack.map(pack -> EXPORT_DIRECTORY.resolve(pack.name())); return currentPack.map(pack -> EXPORT_DIRECTORY.resolve(pack.name()));
} }
public boolean finish() { public boolean finish(Runnable onFinish) {
currentPack.map(pack -> { currentPack.map(pack -> {
RainbowIO.safeIO(() -> Files.writeString(getExportPath().orElseThrow().resolve(REPORT_FILE), createPackSummary(pack))); RainbowIO.safeIO(() -> Files.writeString(getExportPath().orElseThrow().resolve(REPORT_FILE), createPackSummary(pack)));
return pack.save(); return pack.save();
}).ifPresent(CompletableFuture::join); }).ifPresent(future -> future.thenRun(onFinish));
boolean wasPresent = currentPack.isPresent(); boolean wasPresent = currentPack.isPresent();
currentPack = Optional.empty(); currentPack = Optional.empty();
return wasPresent; return wasPresent;

View File

@@ -113,11 +113,9 @@ public class PackGeneratorCommand {
.then(ClientCommandManager.literal("finish") .then(ClientCommandManager.literal("finish")
.executes(context -> { .executes(context -> {
Optional<Path> exportPath = packManager.getExportPath(); Optional<Path> exportPath = packManager.getExportPath();
if (packManager.finish()) { Runnable onFinish = () -> context.getSource().sendFeedback(Component.translatable("commands.rainbow.pack_finished_successfully").withStyle(style
// TODO error when exporting fails -> style.withUnderlined(true).withClickEvent(new ClickEvent.OpenFile(exportPath.orElseThrow()))));
context.getSource().sendFeedback(Component.translatable("commands.rainbow.pack_finished_successfully") if (!packManager.finish(onFinish)) {
.withStyle(style -> style.withUnderlined(true).withClickEvent(new ClickEvent.OpenFile(exportPath.orElseThrow()))));
} else {
context.getSource().sendError(NO_PACK_CREATED); context.getSource().sendError(NO_PACK_CREATED);
} }
return 0; return 0;

View File

@@ -28,6 +28,9 @@ import java.nio.file.Path;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class RenderedTextureHolder extends TextureHolder { public class RenderedTextureHolder extends TextureHolder {
private final ItemStack stackToRender; private final ItemStack stackToRender;
@@ -53,18 +56,31 @@ public class RenderedTextureHolder extends TextureHolder {
Objects.requireNonNull(sizeBounds); Objects.requireNonNull(sizeBounds);
OversizedItemRenderState oversizedRenderState = new OversizedItemRenderState(guiItemRenderState, sizeBounds.left(), sizeBounds.top(), sizeBounds.right() + 4, sizeBounds.bottom() + 4); OversizedItemRenderState oversizedRenderState = new OversizedItemRenderState(guiItemRenderState, sizeBounds.left(), sizeBounds.top(), sizeBounds.right() + 4, sizeBounds.bottom() + 4);
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
try (OversizedItemRenderer itemRenderer = new OversizedItemRenderer(Minecraft.getInstance().renderBuffers().bufferSource())) { try (OversizedItemRenderer itemRenderer = new OversizedItemRenderer(Minecraft.getInstance().renderBuffers().bufferSource())) {
//noinspection DataFlowIssue //noinspection DataFlowIssue
((PictureInPictureCopyRenderer) itemRenderer).rainbow$allowTextureCopy(); ((PictureInPictureCopyRenderer) itemRenderer).rainbow$allowTextureCopy();
itemRenderer.prepare(oversizedRenderState, new GuiRenderState(), 4); itemRenderer.prepare(oversizedRenderState, new GuiRenderState(), 4);
writeAsPNG(serializer, path, ((PictureInPictureRendererAccessor) itemRenderer).getTexture()); writeAsPNG(serializer, path, ((PictureInPictureRendererAccessor) itemRenderer).getTexture(), lock, condition);
} }
return CompletableFuture.completedFuture(null);
return CompletableFuture.runAsync(() -> {
lock.lock();
try {
condition.await();
} catch (InterruptedException ignored) {
} finally {
lock.unlock();
}
});
} }
// Simplified TextureUtil#writeAsPNG with some modifications to flip the image and just generate it at full size // Simplified TextureUtil#writeAsPNG with some modifications to flip the image and just generate it at full size
private static void writeAsPNG(PackSerializer serializer, Path path, GpuTexture texture) { private static void writeAsPNG(PackSerializer serializer, Path path, GpuTexture texture, Lock lock, Condition condition) {
RenderSystem.assertOnRenderThread(); RenderSystem.assertOnRenderThread();
int width = texture.getWidth(0); int width = texture.getWidth(0);
int height = texture.getHeight(0); int height = texture.getHeight(0);
int bufferSize = texture.getFormat().pixelSize() * width * height; int bufferSize = texture.getFormat().pixelSize() * width * height;
@@ -83,12 +99,18 @@ public class RenderedTextureHolder extends TextureHolder {
} }
} }
serializer.saveTexture(NativeImageUtil.writeToByteArray(image), path); serializer.saveTexture(NativeImageUtil.writeToByteArray(image), path).join();
lock.lock();
try {
condition.signalAll();
} finally {
lock.unlock();
}
} }
}); });
} } finally {
buffer.close(); buffer.close();
}
}; };
commandEncoder.copyTextureToBuffer(texture, buffer, 0, writer, 0); commandEncoder.copyTextureToBuffer(texture, buffer, 0, writer, 0);
} }

View File

@@ -48,6 +48,6 @@ public class AnimationMapper {
.withAnimation(identifier + ".head", BedrockAnimation.animation() .withAnimation(identifier + ".head", BedrockAnimation.animation()
.withLoopMode(BedrockAnimation.LoopMode.LOOP) .withLoopMode(BedrockAnimation.LoopMode.LOOP)
.withBone(bone, headPosition, headRotation, headScale)) .withBone(bone, headPosition, headRotation, headScale))
.build(), "animation." + identifier + ".hold_first_person", "animation." + identifier + ".hold_third_person", identifier + ".head"); .build(), "animation." + identifier + ".hold_first_person", "animation." + identifier + ".hold_third_person", "animation." + identifier + ".head");
} }
} }

View File

@@ -134,17 +134,17 @@ public class BedrockPack {
futures.add(item.save(serializer, paths.attachables(), paths.geometry(), paths.animation(), textureSaver)); futures.add(item.save(serializer, paths.attachables(), paths.geometry(), paths.animation(), textureSaver));
} }
if (paths.zipOutput().isPresent()) {
RainbowIO.safeIO(() -> CodecUtil.tryZipDirectory(paths.packRoot(), paths.zipOutput().get()));
}
if (reporter instanceof AutoCloseable closeable) { if (reporter instanceof AutoCloseable closeable) {
try { try {
closeable.close(); closeable.close();
} catch (Exception ignored) {} } catch (Exception ignored) {}
} }
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); CompletableFuture<?> packSerializingFinished = CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
if (paths.zipOutput().isPresent()) {
return packSerializingFinished.thenAcceptAsync(object -> RainbowIO.safeIO(() -> CodecUtil.tryZipDirectory(paths.packRoot(), paths.zipOutput().get())));
}
return packSerializingFinished;
} }
public int getMappings() { public int getMappings() {