Skip to content

Commit 6c89994

Browse files
author
Maximilian Stiede
committed
move RenderConfig options from ChunkyOptions into separate class (long term goal is to reduce the amount of context which is pushed around for rendering with the RenderManager/RenderContext)
TODO later: split SceneIOProvider from RenderContext
1 parent 7ced041 commit 6c89994

File tree

12 files changed

+126
-64
lines changed

12 files changed

+126
-64
lines changed

chunky/src/java/se/llbit/chunky/main/Chunky.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public static void main(final String[] args) {
217217
if (cmdline.mode == CommandLineOptions.Mode.CLI_OPERATION) {
218218
exitCode = cmdline.exitCode;
219219
} else {
220-
commonThreads = new ForkJoinPool(PersistentSettings.getNumThreads());
220+
commonThreads = new ForkJoinPool(PersistentSettings.getRenderThreadCount());
221221

222222
Chunky chunky = new Chunky(cmdline.options);
223223
chunky.headless = cmdline.mode == Mode.HEADLESS_RENDER || cmdline.mode == Mode.CREATE_SNAPSHOT;
@@ -341,7 +341,7 @@ public void update() {
341341
*/
342342
public static ForkJoinPool getCommonThreads() {
343343
if (commonThreads == null) {
344-
commonThreads = new ForkJoinPool(PersistentSettings.getNumThreads());
344+
commonThreads = new ForkJoinPool(PersistentSettings.getRenderThreadCount());
345345
}
346346
return commonThreads;
347347
}

chunky/src/java/se/llbit/chunky/main/ChunkyOptions.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,14 @@
1717
package se.llbit.chunky.main;
1818

1919
import se.llbit.chunky.PersistentSettings;
20-
import se.llbit.chunky.renderer.RenderConstants;
20+
import se.llbit.chunky.renderer.RenderOptions;
21+
import se.llbit.chunky.renderer.ModifiableRenderOptions;
2122
import se.llbit.chunky.renderer.scene.Scene;
2223

2324
import java.io.File;
2425
import java.util.ArrayList;
2526
import java.util.List;
27+
import java.util.function.Consumer;
2628

2729
/**
2830
* Various options for Chunky, set via the configuration file and/or command-line flags.
@@ -37,12 +39,10 @@ public class ChunkyOptions {
3739
public String imageOutputFile = "";
3840

3941
private List<File> resourcePacks = new ArrayList<>();
40-
public int renderThreads = -1;
4142
public File worldDir = null;
4243
public int target = -1;
4344

44-
public int tileWidth = RenderConstants.TILE_WIDTH_DEFAULT;
45-
public int sppPerPass = RenderConstants.SPP_PER_PASS_DEFAULT;
45+
protected ModifiableRenderOptions renderOptions = new ModifiableRenderOptions();
4646

4747
/** Ignore scene loading errors when starting a headless render. */
4848
public boolean force = false;
@@ -56,7 +56,7 @@ private ChunkyOptions() {
5656
public static ChunkyOptions getDefaults() {
5757
ChunkyOptions defaults = new ChunkyOptions();
5858
defaults.sceneDir = PersistentSettings.getSceneDirectory();
59-
defaults.renderThreads = PersistentSettings.getNumThreads();
59+
defaults.renderOptions.setRenderThreadCount(PersistentSettings.getRenderThreadCount());
6060
return defaults;
6161
}
6262

@@ -65,11 +65,19 @@ public static ChunkyOptions getDefaults() {
6565
clone.sceneDir = sceneDir;
6666
clone.sceneName = sceneName;
6767
clone.resourcePacks = new ArrayList<>(resourcePacks);
68-
clone.renderThreads = renderThreads;
68+
clone.renderOptions.copyState(renderOptions);
6969
clone.worldDir = worldDir;
7070
return clone;
7171
}
7272

73+
public RenderOptions getRenderOptions() {
74+
return renderOptions;
75+
}
76+
77+
public synchronized void changeRenderConfig(Consumer<ModifiableRenderOptions> callback) {
78+
callback.accept(renderOptions);
79+
}
80+
7381
public List<File> getResourcePacks() {
7482
return resourcePacks;
7583
}

chunky/src/java/se/llbit/chunky/main/CommandLineOptions.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,13 +294,16 @@ public CommandLineOptions(String[] args) {
294294
arguments -> options.target = Math.max(1, Integer.parseInt(arguments.get(0))));
295295

296296
registerOption("-threads", new Range(1),
297-
arguments -> options.renderThreads = Math.max(1, Integer.parseInt(arguments.get(0))));
297+
arguments -> options.changeRenderConfig(config ->
298+
config.setRenderThreadCount(Math.max(1, Integer.parseInt(arguments.get(0))))));
298299

299300
registerOption("-tile-width", new Range(1),
300-
arguments -> options.tileWidth = Math.max(1, Integer.parseInt(arguments.get(0))));
301+
arguments -> options.changeRenderConfig(config ->
302+
config.setTileWidth(Math.max(1, Integer.parseInt(arguments.get(0))))));
301303

302304
registerOption("-spp-per-pass", new Range(1),
303-
arguments -> options.sppPerPass = Math.max(1, Integer.parseInt(arguments.get(0))));
305+
arguments -> options.changeRenderConfig(config ->
306+
config.setSppPerPass(Math.max(1, Integer.parseInt(arguments.get(0))))));
304307

305308
registerOption("-version", new Range(0), arguments -> {
306309
mode = Mode.CLI_OPERATION;

chunky/src/java/se/llbit/chunky/map/WorldMapLoader.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ public WorldMapLoader(ChunkyFxController controller, MapView mapView) {
6161
mapView.addViewListener(this);
6262

6363
// Start worker threads.
64-
RegionParser[] regionParsers = new RegionParser[Integer.parseInt(System.getProperty("chunky.mapLoaderThreads", String.valueOf(PersistentSettings.getNumThreads())))];
64+
RegionParser[] regionParsers = new RegionParser[Integer.parseInt(
65+
System.getProperty("chunky.mapLoaderThreads", String.valueOf(PersistentSettings.getMapLoadingThreadCount()))
66+
)];
6567
for (int i = 0; i < regionParsers.length; ++i) {
6668
regionParsers[i] = new RegionParser(this, regionQueue, mapView);
6769
regionParsers[i].start();

chunky/src/java/se/llbit/chunky/renderer/DefaultRenderManager.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ public DefaultRenderManager(RenderContext context, boolean headless) {
186186
this.bufferedScene = context.getChunky().getSceneFactory().newScene();
187187

188188
// Create a new pool. Set the seed to the current time in milliseconds.
189-
this.pool = context.renderPoolFactory.create(context.numRenderThreads(), System.currentTimeMillis());
189+
this.pool = context.renderPoolFactory.create(
190+
context.getRenderOptions().getRenderThreadCount(), System.currentTimeMillis()
191+
);
190192
this.setCPULoad(PersistentSettings.getCPULoad());
191193

192194
// Initialize callbacks here since java will complain `bufferedScene` is not initialized yet.
@@ -289,16 +291,16 @@ public void run() {
289291
getPreviewRenderer().sceneReset(this, reason, resetCount);
290292

291293
// Select the correct renderer
292-
Renderer render = mode == RenderMode.PREVIEW ? getPreviewRenderer() : getRenderer();
294+
Renderer renderer = mode == RenderMode.PREVIEW ? getPreviewRenderer() : getRenderer();
293295

294296
frameStart = System.currentTimeMillis();
295297
if (mode == RenderMode.PREVIEW) {
296298
// Bail early if the preview is not visible
297299
if (finalizeAllFrames) {
298300
// Preview with no CPU limit
299301
pool.setCpuLoad(100);
300-
render.setPostRender(previewCallback);
301-
render.render(this);
302+
renderer.setPostRender(previewCallback);
303+
startRender(renderer);
302304
pool.setCpuLoad(cpuLoad);
303305
}
304306
} else {
@@ -309,8 +311,8 @@ public void run() {
309311
updateRenderState(scene);
310312
});
311313
} else if (mode != RenderMode.PAUSED) {
312-
render.setPostRender(renderCallback);
313-
render.render(this);
314+
renderer.setPostRender(renderCallback);
315+
startRender(renderer);
314316
}
315317
}
316318

@@ -323,6 +325,10 @@ public void run() {
323325
}
324326
}
325327

328+
protected void startRender(Renderer renderer) throws InterruptedException {
329+
renderer.render(this);
330+
}
331+
326332
/**
327333
* Redraw the GUI screen. This should be run after postprocessing.
328334
*/
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package se.llbit.chunky.renderer;
2+
3+
public class ModifiableRenderOptions implements RenderOptions {
4+
protected int renderThreadCount = -1;
5+
protected int tileWidth = TILE_WIDTH_DEFAULT;
6+
protected int sppPerPass = SPP_PER_PASS_DEFAULT;
7+
8+
public void copyState(RenderOptions other) {
9+
renderThreadCount = other.getRenderThreadCount();
10+
tileWidth = other.getTileWidth();
11+
sppPerPass = other.getSppPerPass();
12+
}
13+
14+
@Override
15+
public int getRenderThreadCount() {
16+
return renderThreadCount;
17+
}
18+
19+
public void setRenderThreadCount(int renderThreadCount) {
20+
this.renderThreadCount = renderThreadCount;
21+
}
22+
23+
@Override
24+
public int getTileWidth() {
25+
return tileWidth;
26+
}
27+
28+
public void setTileWidth(int tileWidth) {
29+
this.tileWidth = tileWidth;
30+
}
31+
32+
@Override
33+
public int getSppPerPass() {
34+
return sppPerPass;
35+
}
36+
37+
public void setSppPerPass(int sppPerPass) {
38+
this.sppPerPass = sppPerPass;
39+
}
40+
}

chunky/src/java/se/llbit/chunky/renderer/PathTracingRenderer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void render(DefaultRenderManager manager) throws InterruptedException {
6060
int cropX = scene.getCropX();
6161
int cropY = scene.getCropY();
6262

63-
int sppPerPass = manager.context.sppPerPass();
63+
int sppPerPass = manager.context.getRenderOptions().getSppPerPass();
6464
Camera cam = scene.camera();
6565
double halfWidth = fullWidth / (2.0 * fullHeight);
6666
double invHeight = 1.0 / fullHeight;

chunky/src/java/se/llbit/chunky/renderer/RenderContext.java

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,8 @@ public File getSceneDirectory() {
6464
return sceneDirectory;
6565
}
6666

67-
/**
68-
* @return The preferred number of rendering threads.
69-
*/
70-
public int numRenderThreads() {
71-
return config.renderThreads;
67+
public RenderOptions getRenderOptions() {
68+
return config.getRenderOptions();
7269
}
7370

7471
/**
@@ -84,18 +81,4 @@ public File getSceneFile(String fileName) {
8481
}
8582
return new File(sceneDirectory, fileName);
8683
}
87-
88-
/**
89-
* @return The tile width.
90-
*/
91-
public int tileWidth() {
92-
return config.tileWidth;
93-
}
94-
95-
/**
96-
* @return The samples per pixel per pass
97-
*/
98-
public int sppPerPass() {
99-
return config.sppPerPass;
100-
}
10184
}

chunky/src/java/se/llbit/chunky/renderer/TileBasedRenderer.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void setPostRender(BooleanSupplier callback) {
6565
* The second argument is the current pixel (x, y).
6666
*/
6767
protected void submitTiles(DefaultRenderManager manager, BiConsumer<WorkerState, IntIntPair> perPixel) {
68-
initTiles(manager);
68+
initTiles(manager.bufferedScene, manager.context.getRenderOptions());
6969

7070
cachedTiles.forEach(tile ->
7171
manager.pool.submit(worker -> {
@@ -86,11 +86,10 @@ protected void submitTiles(DefaultRenderManager manager, BiConsumer<WorkerState,
8686
);
8787
}
8888

89-
private void initTiles(DefaultRenderManager manager) {
90-
Scene bufferedScene = manager.bufferedScene;
91-
int width = bufferedScene.width;
92-
int height = bufferedScene.height;
93-
int tileWidth = manager.context.tileWidth();
89+
private void initTiles(Scene scene, RenderOptions renderOptions) {
90+
int width = scene.width;
91+
int height = scene.height;
92+
int tileWidth = renderOptions.getTileWidth();
9493

9594
if (prevWidth != width || prevHeight != height) {
9695
prevWidth = width;
@@ -99,8 +98,10 @@ private void initTiles(DefaultRenderManager manager) {
9998

10099
for (int i = 0; i < width; i += tileWidth) {
101100
for (int j = 0; j < height; j += tileWidth) {
102-
cachedTiles.add(new RenderTile(i, FastMath.min(i + tileWidth, width),
103-
j, FastMath.min(j + tileWidth, height)));
101+
cachedTiles.add(new RenderTile(
102+
i, FastMath.min(i + tileWidth, width),
103+
j, FastMath.min(j + tileWidth, height)
104+
));
104105
}
105106
}
106107
}

chunky/src/java/se/llbit/chunky/ui/render/tabs/AdvancedTab.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public PictureExportFormat fromString(String string) {
158158
renderThreads.setRange(1, 20);
159159
renderThreads.clampMin();
160160
renderThreads.onValueChange(value -> {
161-
PersistentSettings.setNumRenderThreads(value);
161+
PersistentSettings.setRenderThreadCount(value);
162162
renderControls.showPopup("This change takes effect after restarting Chunky.", renderThreads);
163163
});
164164

@@ -281,7 +281,7 @@ public boolean shutdownAfterCompletedRender() {
281281
public void update(Scene scene) {
282282
outputMode.getSelectionModel().select(scene.getOutputMode());
283283
fastFog.setSelected(scene.fog.fastFog());
284-
renderThreads.set(PersistentSettings.getNumThreads());
284+
renderThreads.set(PersistentSettings.getRenderThreadCount());
285285
cpuLoad.set(PersistentSettings.getCPULoad());
286286
rayDepth.set(scene.getRayDepth());
287287
octreeImplementation.getSelectionModel().select(scene.getOctreeImplementation());

0 commit comments

Comments
 (0)