mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-07-24 21:02:53 +00:00
Update item image exporter to work on 1.20.x
This commit is contained in:
parent
b742745854
commit
ba6da3bc6c
@ -9,7 +9,6 @@ import com.google.common.io.RecursiveDeleteOption;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import com.mojang.brigadier.CommandDispatcher;
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||||
@ -19,8 +18,8 @@ import dan200.computercraft.data.PrettyJsonWriter;
|
|||||||
import dan200.computercraft.gametest.core.TestHooks;
|
import dan200.computercraft.gametest.core.TestHooks;
|
||||||
import dan200.computercraft.shared.platform.RegistryWrappers;
|
import dan200.computercraft.shared.platform.RegistryWrappers;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.GuiGraphics;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
import net.minecraft.world.item.Item;
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.crafting.RecipeType;
|
import net.minecraft.world.item.crafting.RecipeType;
|
||||||
import net.minecraft.world.item.crafting.ShapedRecipe;
|
import net.minecraft.world.item.crafting.ShapedRecipe;
|
||||||
@ -32,9 +31,8 @@ import java.io.UncheckedIOException;
|
|||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides a {@literal /ccexport <path>} command which exports icons and recipes for all ComputerCraft items.
|
* Provides a {@literal /ccexport <path>} command which exports icons and recipes for all ComputerCraft items.
|
||||||
@ -72,12 +70,10 @@ public class Exporter {
|
|||||||
private static void export(Path root, ImageRenderer renderer) throws IOException {
|
private static void export(Path root, ImageRenderer renderer) throws IOException {
|
||||||
var dump = new JsonDump();
|
var dump = new JsonDump();
|
||||||
|
|
||||||
Set<Item> items = new HashSet<>();
|
|
||||||
|
|
||||||
// First find all CC items
|
// First find all CC items
|
||||||
for (var item : RegistryWrappers.ITEMS) {
|
var items = RegistryWrappers.ITEMS.stream()
|
||||||
if (RegistryWrappers.ITEMS.getKey(item).getNamespace().equals(ComputerCraftAPI.MOD_ID)) items.add(item);
|
.filter(x -> RegistryWrappers.ITEMS.getKey(x).getNamespace().equals(ComputerCraftAPI.MOD_ID))
|
||||||
}
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
// Now find all CC recipes.
|
// Now find all CC recipes.
|
||||||
var level = Objects.requireNonNull(Minecraft.getInstance().level);
|
var level = Objects.requireNonNull(Minecraft.getInstance().level);
|
||||||
@ -121,10 +117,6 @@ public class Exporter {
|
|||||||
var itemDir = root.resolve("items");
|
var itemDir = root.resolve("items");
|
||||||
if (Files.exists(itemDir)) MoreFiles.deleteRecursively(itemDir, RecursiveDeleteOption.ALLOW_INSECURE);
|
if (Files.exists(itemDir)) MoreFiles.deleteRecursively(itemDir, RecursiveDeleteOption.ALLOW_INSECURE);
|
||||||
|
|
||||||
renderer.setupState();
|
|
||||||
var transform = new PoseStack();
|
|
||||||
transform.setIdentity();
|
|
||||||
|
|
||||||
for (var item : items) {
|
for (var item : items) {
|
||||||
var stack = new ItemStack(item);
|
var stack = new ItemStack(item);
|
||||||
var location = RegistryWrappers.ITEMS.getKey(item);
|
var location = RegistryWrappers.ITEMS.getKey(item);
|
||||||
@ -132,11 +124,13 @@ public class Exporter {
|
|||||||
dump.itemNames.put(location.toString(), stack.getHoverName().getString());
|
dump.itemNames.put(location.toString(), stack.getHoverName().getString());
|
||||||
renderer.captureRender(itemDir.resolve(location.getNamespace()).resolve(location.getPath() + ".png"),
|
renderer.captureRender(itemDir.resolve(location.getNamespace()).resolve(location.getPath() + ".png"),
|
||||||
() -> {
|
() -> {
|
||||||
// TODO: Minecraft.getInstance().getItemRenderer().ren(transform, stack, 0, 0)
|
|
||||||
|
var graphics = new GuiGraphics(Minecraft.getInstance(), Minecraft.getInstance().renderBuffers().bufferSource());
|
||||||
|
graphics.renderItem(stack, 0, 0);
|
||||||
|
graphics.flush();
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
renderer.clearState();
|
|
||||||
|
|
||||||
try (Writer writer = Files.newBufferedWriter(root.resolve("index.json")); var jsonWriter = new PrettyJsonWriter(writer)) {
|
try (Writer writer = Files.newBufferedWriter(root.resolve("index.json")); var jsonWriter = new PrettyJsonWriter(writer)) {
|
||||||
GSON.toJson(dump, JsonDump.class, jsonWriter);
|
GSON.toJson(dump, JsonDump.class, jsonWriter);
|
||||||
|
@ -5,15 +5,14 @@
|
|||||||
package dan200.computercraft.export;
|
package dan200.computercraft.export;
|
||||||
|
|
||||||
import com.mojang.blaze3d.pipeline.TextureTarget;
|
import com.mojang.blaze3d.pipeline.TextureTarget;
|
||||||
|
import com.mojang.blaze3d.platform.Lighting;
|
||||||
import com.mojang.blaze3d.platform.NativeImage;
|
import com.mojang.blaze3d.platform.NativeImage;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import com.mojang.blaze3d.vertex.VertexSorting;
|
import com.mojang.blaze3d.vertex.VertexSorting;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.FogRenderer;
|
import net.minecraft.client.renderer.FogRenderer;
|
||||||
import org.joml.Matrix4f;
|
import org.joml.Matrix4f;
|
||||||
import org.lwjgl.opengl.GL12;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@ -28,39 +27,43 @@ public class ImageRenderer implements AutoCloseable {
|
|||||||
private final TextureTarget framebuffer = new TextureTarget(WIDTH, HEIGHT, true, Minecraft.ON_OSX);
|
private final TextureTarget framebuffer = new TextureTarget(WIDTH, HEIGHT, true, Minecraft.ON_OSX);
|
||||||
private final NativeImage image = new NativeImage(WIDTH, HEIGHT, Minecraft.ON_OSX);
|
private final NativeImage image = new NativeImage(WIDTH, HEIGHT, Minecraft.ON_OSX);
|
||||||
|
|
||||||
private @Nullable Matrix4f projectionMatrix;
|
|
||||||
|
|
||||||
public ImageRenderer() {
|
public ImageRenderer() {
|
||||||
framebuffer.setClearColor(0, 0, 0, 0);
|
framebuffer.setClearColor(0, 0, 0, 0);
|
||||||
framebuffer.clear(Minecraft.ON_OSX);
|
framebuffer.clear(Minecraft.ON_OSX);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setupState() {
|
public void captureRender(Path output, Runnable render) throws IOException {
|
||||||
projectionMatrix = RenderSystem.getProjectionMatrix();
|
Files.createDirectories(output.getParent());
|
||||||
RenderSystem.setProjectionMatrix(new Matrix4f().identity().ortho(0, 16, 0, 16, 1000, 3000), VertexSorting.DISTANCE_TO_ORIGIN);
|
|
||||||
|
framebuffer.setClearColor(0, 0, 0, 0);
|
||||||
|
framebuffer.clear(Minecraft.ON_OSX);
|
||||||
|
framebuffer.bindWrite(true);
|
||||||
|
|
||||||
|
// Setup rendering state
|
||||||
|
var projectionMatrix = RenderSystem.getProjectionMatrix();
|
||||||
|
RenderSystem.setProjectionMatrix(new Matrix4f().identity().ortho(0, 16, 16, 0, 1000, 3000), VertexSorting.ORTHOGRAPHIC_Z);
|
||||||
|
|
||||||
var transform = RenderSystem.getModelViewStack();
|
var transform = RenderSystem.getModelViewStack();
|
||||||
transform.pushPose();
|
transform.pushPose();
|
||||||
transform.setIdentity();
|
transform.setIdentity();
|
||||||
transform.translate(0.0f, 0.0f, -2000.0f);
|
transform.translate(0.0f, 0.0f, -2000.0f);
|
||||||
|
RenderSystem.applyModelViewMatrix();
|
||||||
|
|
||||||
|
Lighting.setupFor3DItems();
|
||||||
FogRenderer.setupNoFog();
|
FogRenderer.setupNoFog();
|
||||||
}
|
|
||||||
|
|
||||||
public void clearState() {
|
// Render
|
||||||
if (projectionMatrix == null) throw new IllegalStateException("Not currently rendering");
|
render.run();
|
||||||
|
|
||||||
|
// Restore rendering state
|
||||||
RenderSystem.setProjectionMatrix(projectionMatrix, VertexSorting.DISTANCE_TO_ORIGIN);
|
RenderSystem.setProjectionMatrix(projectionMatrix, VertexSorting.DISTANCE_TO_ORIGIN);
|
||||||
RenderSystem.getModelViewStack().popPose();
|
RenderSystem.getModelViewStack().popPose();
|
||||||
}
|
RenderSystem.applyModelViewMatrix();
|
||||||
|
|
||||||
public void captureRender(Path output, Runnable render) throws IOException {
|
|
||||||
Files.createDirectories(output.getParent());
|
|
||||||
|
|
||||||
framebuffer.bindWrite(true);
|
|
||||||
RenderSystem.clear(GL12.GL_COLOR_BUFFER_BIT | GL12.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX);
|
|
||||||
render.run();
|
|
||||||
framebuffer.unbindWrite();
|
framebuffer.unbindWrite();
|
||||||
|
Minecraft.getInstance().getMainRenderTarget().bindWrite(true);
|
||||||
|
|
||||||
|
// And save the image
|
||||||
framebuffer.bindRead();
|
framebuffer.bindRead();
|
||||||
image.downloadTexture(0, false);
|
image.downloadTexture(0, false);
|
||||||
image.flipY();
|
image.flipY();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user