66import com .mojang .blaze3d .pipeline .TextureTarget ;
77import com .mojang .blaze3d .platform .Lighting ;
88import com .mojang .blaze3d .platform .NativeImage ;
9+ import com .mojang .blaze3d .systems .CommandEncoder ;
910import com .mojang .blaze3d .systems .RenderSystem ;
10- import com .mojang .blaze3d .textures . GpuTexture ;
11+ import com .mojang .blaze3d .vertex . PoseStack ;
1112import net .minecraft .client .Minecraft ;
1213import net .minecraft .client .renderer .Projection ;
1314import net .minecraft .client .renderer .ProjectionMatrixBuffer ;
15+ import net .minecraft .client .renderer .SubmitNodeStorage ;
1416import net .minecraft .client .renderer .item .TrackingItemStackRenderState ;
1517import net .minecraft .client .renderer .texture .OverlayTexture ;
1618import net .minecraft .core .registries .BuiltInRegistries ;
1719import net .minecraft .resources .Identifier ;
1820import net .minecraft .util .LightCoordsUtil ;
1921import net .minecraft .world .item .CreativeModeTabs ;
22+ import net .minecraft .world .item .ItemDisplayContext ;
2023import org .slf4j .Logger ;
2124import org .slf4j .LoggerFactory ;
2225
@@ -76,21 +79,21 @@ private static void exportItem(Minecraft minecraft, ProjectionMatrixBuffer proje
7679 renderTarget = new TextureTarget ("balm_icon_export" , EXPORT_SIZE , EXPORT_SIZE , true );
7780 final var colorTexture = Objects .requireNonNull (renderTarget .getColorTexture (), "color texture missing" );
7881 final var depthTexture = Objects .requireNonNull (renderTarget .getDepthTexture (), "depth texture missing" );
82+ final var offscreenCommandEncoder = RenderSystem .getDevice ().createCommandEncoder ();
7983
8084 final var projection = new Projection ();
8185 projection .setupOrtho (-1000f , 1000f , EXPORT_SIZE , EXPORT_SIZE , true );
8286
83- final var commandEncoder = RenderSystem .getDevice ().createCommandEncoder ();
84- commandEncoder .clearColorAndDepthTextures (colorTexture , 0 , depthTexture , 1.0 );
87+ offscreenCommandEncoder .clearColorAndDepthTextures (colorTexture , 0 , depthTexture , 0.0 );
8588
8689 final var gameRenderer = minecraft .gameRenderer ;
8790 final var trackingState = new TrackingItemStackRenderState ();
88- minecraft .getItemModelResolver ().updateForTopItem (trackingState , itemStack , net .minecraft .world .item .ItemDisplayContext .GUI , minecraft .level , minecraft .player , 0 );
91+ final var submitNodeStorage = new SubmitNodeStorage ();
92+ minecraft .getItemModelResolver ().updateForTopItem (trackingState , itemStack , ItemDisplayContext .GUI , minecraft .level , minecraft .player , 0 );
8993
90- final var poseStack = new com . mojang . blaze3d . vertex . PoseStack ();
94+ final var poseStack = new PoseStack ();
9195 poseStack .translate (EXPORT_SIZE / 2f , EXPORT_SIZE / 2f , 0f );
92- poseStack .scale (ITEM_RENDER_SCALE , ITEM_RENDER_SCALE , -ITEM_RENDER_SCALE );
93- poseStack .scale (1f , -1f , -1f );
96+ poseStack .scale (ITEM_RENDER_SCALE , -ITEM_RENDER_SCALE , ITEM_RENDER_SCALE );
9497
9598 final var previousColorOverride = RenderSystem .outputColorTextureOverride ;
9699 final var previousDepthOverride = RenderSystem .outputDepthTextureOverride ;
@@ -106,9 +109,9 @@ private static void exportItem(Minecraft minecraft, ProjectionMatrixBuffer proje
106109 gameRenderer .lighting ().setupFor (Lighting .Entry .ITEMS_FLAT );
107110 }
108111
109- trackingState .submit (poseStack , gameRenderer . submitNodeStorage () , LightCoordsUtil .FULL_BRIGHT , OverlayTexture .NO_OVERLAY , 0 );
110- gameRenderer .featureRenderDispatcher ().renderAllFeatures ();
111- gameRenderer .renderBuffers ().bufferSource (). uploadAndDraw ();
112+ trackingState .submit (poseStack , submitNodeStorage , LightCoordsUtil .FULL_BRIGHT , OverlayTexture .NO_OVERLAY , 0 );
113+ gameRenderer .featureRenderDispatcher ().renderAllFeatures (submitNodeStorage );
114+ gameRenderer .renderBuffers ().endFrame ();
112115 } finally {
113116 RenderSystem .outputColorTextureOverride = previousColorOverride ;
114117 RenderSystem .outputDepthTextureOverride = previousDepthOverride ;
@@ -122,11 +125,18 @@ private static void exportItem(Minecraft minecraft, ProjectionMatrixBuffer proje
122125 (long ) EXPORT_SIZE * EXPORT_SIZE * pixelSize );
123126
124127 final var targetFile = new File (exportFolder , itemId .getPath () + ".png" );
128+ final var readCommandEncoder = RenderSystem .getDevice ().createCommandEncoder ();
125129 final var bufferToRead = screenshotBuffer ;
126130 final var renderTargetToDestroy = renderTarget ;
127131 renderTarget = null ;
128132 screenshotBuffer = null ;
129- commandEncoder .copyTextureToBuffer (colorTexture , bufferToRead , 0 , () -> writeExportedImage (bufferToRead , renderTargetToDestroy , targetFile ), 0 );
133+ offscreenCommandEncoder .copyTextureToBuffer (
134+ colorTexture ,
135+ bufferToRead ,
136+ 0 ,
137+ () -> writeExportedImage (readCommandEncoder , bufferToRead , renderTargetToDestroy , targetFile ),
138+ 0 );
139+ offscreenCommandEncoder .submit ();
130140 } catch (Exception e ) {
131141 if (screenshotBuffer != null ) {
132142 screenshotBuffer .close ();
@@ -138,9 +148,9 @@ private static void exportItem(Minecraft minecraft, ProjectionMatrixBuffer proje
138148 }
139149 }
140150
141- private static void writeExportedImage (GpuBuffer screenshotBuffer , RenderTarget renderTarget , File targetFile ) {
151+ private static void writeExportedImage (CommandEncoder readCommandEncoder , GpuBuffer screenshotBuffer , RenderTarget renderTarget , File targetFile ) {
142152 try (screenshotBuffer ;
143- final var readView = RenderSystem . getDevice (). createCommandEncoder () .mapBuffer (screenshotBuffer , true , false );
153+ final var readView = readCommandEncoder .mapBuffer (screenshotBuffer , true , false );
144154 final var nativeImage = new NativeImage (EXPORT_SIZE , EXPORT_SIZE , false )) {
145155 final var byteBuffer = readView .data ();
146156 for (int y = 0 ; y < EXPORT_SIZE ; y ++) {
0 commit comments