Skip to content

Commit eae7078

Browse files
committed
Add test render
1 parent d5621bc commit eae7078

File tree

5 files changed

+290
-0
lines changed

5 files changed

+290
-0
lines changed

.github/workflows/development.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,33 @@ jobs:
2929
with:
3030
name: ChunkyClPlugin
3131
path: build/libs/chunky-opencl.jar
32+
33+
render:
34+
runs-on: ubuntu-latest
35+
36+
steps:
37+
- uses: actions/checkout@v4
38+
39+
- name: Setup OpenCL
40+
run: |
41+
sudo apt-get update -y
42+
sudo apt-get install -y ocl-icd-opencl-dev pocl
43+
44+
- name: Set up JDK 17
45+
uses: actions/setup-java@v4
46+
with:
47+
distribution: 'temurin'
48+
java-version: '17'
49+
java-package: jdk
50+
51+
- name: Grant execute permission for gradlew
52+
run: chmod +x gradlew
53+
54+
- name: Render with Gradle
55+
run: ./gradlew test
56+
57+
- name: Upload the renders
58+
uses: actions/upload-artifact@v4
59+
with:
60+
name: Test Renders
61+
path: build/test-results/*.png

build.gradle

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ dependencies {
2323
provided 'org.apache.commons:commons-math3:3.2'
2424
provided 'it.unimi.dsi:fastutil:8.4.4'
2525
bundled 'org.jocl:jocl:2.0.2'
26+
27+
testImplementation platform('org.junit:junit-bom:5.13.4')
28+
testImplementation 'org.junit.jupiter:junit-jupiter'
29+
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
2630
}
2731

2832
javafx {
@@ -42,4 +46,9 @@ jar {
4246
}
4347
}
4448

49+
test {
50+
useJUnitPlatform()
51+
dependsOn 'cleanTest'
52+
}
53+
4554
defaultTasks 'jar'
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package dev.thatredox.chunkynative.opencl;
2+
3+
import org.junit.jupiter.api.Test;
4+
import se.llbit.chunky.main.Chunky;
5+
import se.llbit.chunky.main.ChunkyOptions;
6+
import se.llbit.chunky.renderer.DefaultRenderManager;
7+
import se.llbit.chunky.renderer.RenderContext;
8+
import se.llbit.chunky.renderer.SceneProvider;
9+
import se.llbit.chunky.renderer.SnapshotControl;
10+
import se.llbit.chunky.renderer.scene.Scene;
11+
import se.llbit.util.TaskTracker;
12+
13+
import javax.imageio.ImageIO;
14+
import java.awt.image.BufferedImage;
15+
import java.io.File;
16+
import java.io.IOException;
17+
import java.lang.reflect.Field;
18+
19+
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
21+
class CornellBoxRenderTest {
22+
@Test
23+
void render() throws IOException, InterruptedException, NoSuchFieldException, IllegalAccessException {
24+
// Initialize Chunky
25+
Chunky.loadDefaultTextures();
26+
Chunky chunky = new Chunky(ChunkyOptions.getDefaults());
27+
Field chunkyHeadless = chunky.getClass().getDeclaredField("headless");
28+
chunkyHeadless.setAccessible(true);
29+
chunkyHeadless.set(chunky, true);
30+
new ChunkyCl().attach(chunky);
31+
32+
// Load the test scene
33+
chunky.getSceneManager().loadScene(new File("src/test/resources/Cornell Box/"), "Cornell Box");
34+
Scene scene = chunky.getSceneManager().getScene();
35+
36+
// Do the rendering
37+
DefaultRenderManager renderer = new DefaultRenderManager(chunky.getRenderContext(), true);
38+
renderer.setSceneProvider((SceneProvider) chunky.getSceneManager());
39+
renderer.setRenderTask(TaskTracker.Task.NONE);
40+
41+
scene.haltRender();
42+
scene.startHeadlessRender();
43+
44+
renderer.start();
45+
renderer.join();
46+
renderer.shutdown();
47+
48+
renderer.bufferedScene.saveFrame(new File("build/test-results/test_render.png"), TaskTracker.NONE);
49+
}
50+
51+
@Test
52+
void preview_render() throws IOException, InterruptedException, NoSuchFieldException, IllegalAccessException {
53+
// Initialize Chunky
54+
Chunky.loadDefaultTextures();
55+
Chunky chunky = new Chunky(ChunkyOptions.getDefaults());
56+
Field chunkyHeadless = chunky.getClass().getDeclaredField("headless");
57+
chunkyHeadless.setAccessible(true);
58+
chunkyHeadless.set(chunky, true);
59+
new ChunkyCl().attach(chunky);
60+
61+
// Load the test scene
62+
chunky.getSceneManager().loadScene(new File("src/test/resources/Cornell Box/"), "Cornell Box");
63+
Scene scene = chunky.getSceneManager().getScene();
64+
65+
// Do the rendering
66+
DefaultRenderManager renderer = new DefaultRenderManager(chunky.getRenderContext(), true);
67+
renderer.setSceneProvider((SceneProvider) chunky.getSceneManager());
68+
renderer.setRenderTask(TaskTracker.Task.NONE);
69+
70+
scene.setBufferFinalization(true);
71+
scene.haltRender();
72+
73+
renderer.start();
74+
renderer.join();
75+
renderer.shutdown();
76+
77+
renderer.withBufferedImage(bitmap -> {
78+
BufferedImage im = new BufferedImage(bitmap.width, bitmap.height, BufferedImage.TYPE_INT_ARGB);
79+
im.setRGB(0, 0, bitmap.width, bitmap.height, bitmap.data, 0, bitmap.width);
80+
try {
81+
ImageIO.write(im, "png", new File("build/test-results/test_preview.png"));
82+
} catch (IOException e) {
83+
throw new RuntimeException(e);
84+
}
85+
});
86+
}
87+
}
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
{
2+
"sdfVersion": 9,
3+
"name": "Cornell Box",
4+
"width": 960,
5+
"height": 540,
6+
"fullWidth": 0,
7+
"fullHeight": 0,
8+
"cropX": 0,
9+
"cropY": 0,
10+
"yClipMin": -64,
11+
"yClipMax": 320,
12+
"yMin": -64,
13+
"yMax": 320,
14+
"exposure": 4.0,
15+
"postprocess": "GAMMA",
16+
"outputMode": "PNG",
17+
"renderTime": 3803,
18+
"spp": 0,
19+
"sppTarget": 16,
20+
"branchCount": 10,
21+
"rayDepth": 25,
22+
"pathTrace": true,
23+
"dumpFrequency": 500,
24+
"saveSnapshots": false,
25+
"emittersEnabled": false,
26+
"emitterIntensity": 13.0,
27+
"fancierTranslucency": true,
28+
"transmissivityCap": 1.0,
29+
"sunSamplingStrategy": "FAST",
30+
"waterShadingStrategy": "TILED_NORMALMAP",
31+
"waterOpacity": 0.42,
32+
"waterVisibility": 9.0,
33+
"useCustomWaterColor": false,
34+
"fog": {
35+
"mode": "NONE",
36+
"uniformDensity": 0.0,
37+
"skyFogDensity": 1.0,
38+
"layers": [],
39+
"color": {
40+
"red": 0.42814502293337064,
41+
"green": 0.5858024691358026,
42+
"blue": 1.0
43+
},
44+
"fastFog": true
45+
},
46+
"biomeColorsEnabled": true,
47+
"transparentSky": false,
48+
"waterWorldEnabled": false,
49+
"waterWorldHeight": 63.0,
50+
"waterWorldHeightOffsetEnabled": true,
51+
"waterWorldClipEnabled": true,
52+
"hideUnknownBlocks": false,
53+
"world": {
54+
"path": "/home/redox/.minecraft/saves/Cornell Box",
55+
"dimension": 0
56+
},
57+
"camera": {
58+
"name": "camera 1",
59+
"lockCamera": false,
60+
"position": {
61+
"x": 8.501,
62+
"y": -57.6,
63+
"z": 11.9
64+
},
65+
"orientation": {
66+
"roll": 0.0,
67+
"pitch": -1.4835298641951802,
68+
"yaw": -1.5708137800874167
69+
},
70+
"projectionMode": "PINHOLE",
71+
"fov": 90.0,
72+
"dof": "Infinity",
73+
"focalOffset": 2.0,
74+
"shift": {
75+
"x": 0.0,
76+
"y": 0.0
77+
},
78+
"apertureShape": "CIRCLE"
79+
},
80+
"sun": {
81+
"altitude": 1.0471975511965976,
82+
"azimuth": 1.2566370614359172,
83+
"intensity": 1.25,
84+
"luminosity": 100.0,
85+
"apparentBrightness": 1.25,
86+
"radius": 0.03,
87+
"modifySunTexture": false,
88+
"color": {
89+
"red": 1.0,
90+
"green": 1.0,
91+
"blue": 1.0
92+
},
93+
"apparentColor": {
94+
"red": 1.0,
95+
"green": 1.0,
96+
"blue": 1.0
97+
},
98+
"importanceSampling": {
99+
"chance": 0.1,
100+
"radius": 1.2
101+
},
102+
"drawTexture": true
103+
},
104+
"sky": {
105+
"skyYaw": 0.0,
106+
"skyPitch": 0.0,
107+
"skyRoll": 0.0,
108+
"skyMirrored": true,
109+
"skyExposure": 1.0,
110+
"skyLight": 1.0,
111+
"apparentSkyLight": 1.0,
112+
"mode": "SIMULATED",
113+
"horizonOffset": 0.0,
114+
"cloudsEnabled": false,
115+
"cloudSize": 12.0,
116+
"cloudOffset": {
117+
"x": 0.0,
118+
"y": 128.0,
119+
"z": 0.0
120+
},
121+
"gradient": [
122+
{
123+
"rgb": "0BABC7",
124+
"pos": 0.0
125+
},
126+
{
127+
"rgb": "75AAFF",
128+
"pos": 1.0
129+
}
130+
],
131+
"color": {
132+
"red": 0.0,
133+
"green": 0.0,
134+
"blue": 0.0
135+
},
136+
"simulatedSky": "Preetham",
137+
"skyCacheResolution": 128
138+
},
139+
"cameraPresets": {},
140+
"materials": {},
141+
"chunkList": [
142+
[
143+
0,
144+
0
145+
]
146+
],
147+
"octreeImplementation": "PACKED",
148+
"emitterSamplingStrategy": "NONE",
149+
"preventNormalEmitterWithSampling": true,
150+
"animationTime": 0.0,
151+
"renderer": "ChunkyClRenderer",
152+
"previewRenderer": "ChunkyClPreviewRenderer",
153+
"renderActors": true,
154+
"entityLoadingPreferences": {
155+
"se.llbit.chunky.entity.PlayerEntity": false,
156+
"se.llbit.chunky.entity.Book": true,
157+
"se.llbit.chunky.entity.ArmorStand": true,
158+
"se.llbit.chunky.entity.PaintingEntity": true,
159+
"se.llbit.chunky.entity.BeaconBeam": true,
160+
"other": true
161+
},
162+
"bvhImplementation": "SAH_MA",
163+
"additionalData": {}
164+
}
449 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)