diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 1f11c19..358b006 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -54,16 +54,16 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - + - name: Setup Node uses: actions/setup-node@v3 with: node-version: 18 cache: yarn - + - name: Install dependencies run: yarn install - + - name: Test run: yarn test diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae5f3ed..c916629 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,15 +50,15 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - + - name: Setup Node uses: actions/setup-node@v3 with: node-version: 18 cache: yarn - + - name: Install dependencies run: yarn install - + - name: Test - run: yarn test \ No newline at end of file + run: yarn test diff --git a/.idea/wgpu-app.iml b/.idea/wgpu-app.iml index fbeeac9..fe9adab 100644 --- a/.idea/wgpu-app.iml +++ b/.idea/wgpu-app.iml @@ -2,6 +2,7 @@ + diff --git a/Cargo.lock b/Cargo.lock index 5aac266..fe2326c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -492,6 +492,9 @@ name = "glam" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" +dependencies = [ + "serde", +] [[package]] name = "glow" @@ -1079,6 +1082,37 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.196" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.196" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -1305,9 +1339,12 @@ dependencies = [ "flume", "glam", "image", + "js-sys", "log", "pollster", "rand", + "serde", + "serde-wasm-bindgen", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", diff --git a/scripts/cover.scene.js b/scripts/cover.scene.js new file mode 100644 index 0000000..a73a140 --- /dev/null +++ b/scripts/cover.scene.js @@ -0,0 +1,166 @@ +import fs from 'fs'; + +function random_color() { + return [ + Math.random() * Math.random(), + Math.random() * Math.random(), + Math.random() * Math.random() + ]; +} + +function random_color_satu() { + return [ + (Math.random() / 2) + 0.5, + (Math.random() / 2) + 0.5, + (Math.random() / 2) + 0.5 + ]; +} + +function rgbToHex(color) { + return "#" + (1 << 24 | color[0] << 16 | color[1] << 8 | color[2]).toString(16).slice(1); + } + +function make_sphere(name, id, mid, center, radius) { + return { + name: name, + id: id, + material_id: mid, + type: { + type: 'd_sphere', + position: center, + radius: radius + } + }; +} + +function make_mat_diffuse(name, mid, color) { + return { + name: name, + id: mid, + type: { + type: 'd_mat_diffuse', + color: color + } + }; +} + +function make_mat_metal(name, mid, color, roughness) { + return { + name: name, + id: mid, + type: { + type: 'd_mat_metal', + color: color, + roughness: roughness + } + }; +} + +function make_mat_dielectric(name, mid, ior) { + return { + name: name, + id: mid, + type: { + type: 'd_mat_dielectric', + ior: ior + } + }; +} + +function vec3f_subtract(a, b) { + return [a[0] - b[0], a[1] - b[1], a[2] - b [2]]; +} + +function vec3f_length(a) { + return Math.sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2])); +} + +const scene = { + objects: [], + materials: [], + camera: { + look_from: [13, 2, 3], + look_at: [0, 0, 0], + v_up: [0, 1, 0], + v_fov: 20, + dof_angle: 0.6, + dof_distance: 10 + }, + render_settings: { + width: 1920, + height: 1080, + samples: 64, + bounces: 12, + tile_size: { + type: 'd_tile_size', + size: 256 + } + } +}; + +let mat_id = 0; +let obj_id = 0; + +mat_id++; +obj_id++; + +scene.materials.push(make_mat_diffuse(`Mat ${mat_id}`, mat_id, rgbToHex([0.5, 0.5, 0.5].map(x => x * 255)))); +scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, [0, -1000, 0], 1000)); + +for (let x = -11; x < 11; x++) { + for (let y = -11; y < 11; y++) { + const choose_mat = Math.random(); + + const position = [ + x + (0.9 * Math.random()), + 0.2, + y + (0.9 * Math.random()) + ]; + + if (vec3f_length(vec3f_subtract(position, [4, 0.2, 0.0])) > 0.9) { + mat_id++; + obj_id++; + + if (choose_mat < 0.8) { + const color = rgbToHex(random_color().map(x => x * 255)); + scene.materials.push(make_mat_diffuse(`Mat ${mat_id}`, mat_id, color)); + scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, position, 0.2)); + } else if (choose_mat < 0.95) { + const color = rgbToHex(random_color_satu().map(x => x * 255)); + scene.materials.push(make_mat_metal(`Mat ${mat_id}`, mat_id, color, Math.random() * 0.5)); + scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, position, 0.2)); + } else { + scene.materials.push(make_mat_dielectric(`Mat ${mat_id}`, mat_id, 1.5)); + scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, position, 0.2)); + } + } + } +} + +mat_id++; +obj_id++; + +scene.materials.push(make_mat_dielectric(`Mat ${mat_id}`, mat_id, 1.5)); +scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, [0, 1, 0], 1.0)); + +mat_id++; +obj_id++; + +scene.materials.push(make_mat_diffuse(`Mat ${mat_id}`, mat_id, rgbToHex([0.4, 0.2, 0.1].map(x => x * 255)))); +scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, [-4, 1, 0], 1.0)); + +mat_id++; +obj_id++; + +scene.materials.push(make_mat_metal(`Mat ${mat_id}`, mat_id, rgbToHex([0.7, 0.6, 0.5].map(x => x * 255)), 0)); +scene.objects.push(make_sphere(`Obj ${obj_id}`, obj_id, mat_id, [4, 1, 0], 1.0)); + +const path = './src/data/demo_02.scene.json'; + +fs.writeFile(path, JSON.stringify(scene, null, 4), err => { + if (err) { + console.error('Error writing JSON to file:', err); + } else { + console.log('JSON data has been written to', path); + } +}); \ No newline at end of file diff --git a/src/data/demo_01.scene.json b/src/data/demo_01.scene.json index 8d2aadd..2a55045 100644 --- a/src/data/demo_01.scene.json +++ b/src/data/demo_01.scene.json @@ -6,11 +6,7 @@ "material_id": 1, "type": { "type": "d_sphere", - "position": { - "x": 0, - "y": -100.5, - "z": -1 - }, + "position": [0, -100.5, -1], "radius": 100 } }, @@ -20,11 +16,7 @@ "material_id": 4, "type": { "type": "d_sphere", - "position": { - "x": -1, - "y": 0, - "z": -1 - }, + "position": [-1, 0, -1], "radius": 0.5 } }, @@ -34,11 +26,7 @@ "material_id": 4, "type": { "type": "d_sphere", - "position": { - "x": -1, - "y": 0, - "z": -1 - }, + "position": [-1, 0, -1], "radius": -0.4 } }, @@ -48,11 +36,7 @@ "material_id": 2, "type": { "type": "d_sphere", - "position": { - "x": 0, - "y": 0, - "z": -1 - }, + "position": [0, 0, -1], "radius": 0.5 } }, @@ -62,11 +46,7 @@ "material_id": 3, "type": { "type": "d_sphere", - "position": { - "x": 1, - "y": 0, - "z": -1 - }, + "position": [1, 0, -1], "radius": 0.5 } } @@ -107,21 +87,9 @@ } ], "camera": { - "look_from": { - "x": -2, - "y": 2, - "z": 1 - }, - "look_at": { - "x": 0, - "y": 0, - "z": -1 - }, - "v_up": { - "x": 0, - "y": 1, - "z": 0 - }, + "look_from": [-2, 2, 1], + "look_at": [0, 0, -1], + "v_up": [0, 1, 0], "v_fov": 20, "dof_angle": 0.6, "dof_distance": 3.4 diff --git a/src/data/demo_02.scene.json b/src/data/demo_02.scene.json new file mode 100644 index 0000000..0cd6d4f --- /dev/null +++ b/src/data/demo_02.scene.json @@ -0,0 +1,10764 @@ +{ + "objects": [ + { + "name": "Obj 1", + "id": 1, + "material_id": 1, + "type": { + "type": "d_sphere", + "position": [ + 0, + -1000, + 0 + ], + "radius": 1000 + } + }, + { + "name": "Obj 2", + "id": 2, + "material_id": 2, + "type": { + "type": "d_sphere", + "position": [ + -10.972752649569532, + 0.2, + -10.578686277658003 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 3", + "id": 3, + "material_id": 3, + "type": { + "type": "d_sphere", + "position": [ + -10.23424077485482, + 0.2, + -9.602358619199753 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 4", + "id": 4, + "material_id": 4, + "type": { + "type": "d_sphere", + "position": [ + -10.595006872695256, + 0.2, + -8.709349741425395 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 5", + "id": 5, + "material_id": 5, + "type": { + "type": "d_sphere", + "position": [ + -10.846897832495632, + 0.2, + -7.645408640598951 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 6", + "id": 6, + "material_id": 6, + "type": { + "type": "d_sphere", + "position": [ + -10.280384878551622, + 0.2, + -6.825798900155848 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 7", + "id": 7, + "material_id": 7, + "type": { + "type": "d_sphere", + "position": [ + -10.954719866139696, + 0.2, + -5.901932991067769 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 8", + "id": 8, + "material_id": 8, + "type": { + "type": "d_sphere", + "position": [ + -10.454093797233705, + 0.2, + -4.965271124753067 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 9", + "id": 9, + "material_id": 9, + "type": { + "type": "d_sphere", + "position": [ + -10.830233014721973, + 0.2, + -3.2986568597139994 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 10", + "id": 10, + "material_id": 10, + "type": { + "type": "d_sphere", + "position": [ + -10.730144024254695, + 0.2, + -2.351583516919158 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 11", + "id": 11, + "material_id": 11, + "type": { + "type": "d_sphere", + "position": [ + -10.857531355697853, + 0.2, + -1.404067965807674 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 12", + "id": 12, + "material_id": 12, + "type": { + "type": "d_sphere", + "position": [ + -10.333306688579741, + 0.2, + -0.33425056838324574 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 13", + "id": 13, + "material_id": 13, + "type": { + "type": "d_sphere", + "position": [ + -10.639119557736745, + 0.2, + 0.5077179867860829 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 14", + "id": 14, + "material_id": 14, + "type": { + "type": "d_sphere", + "position": [ + -10.984193952070342, + 0.2, + 1.7353107660023137 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 15", + "id": 15, + "material_id": 15, + "type": { + "type": "d_sphere", + "position": [ + -10.245436180267694, + 0.2, + 2.342144330410714 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 16", + "id": 16, + "material_id": 16, + "type": { + "type": "d_sphere", + "position": [ + -10.186487701691009, + 0.2, + 3.2217404116120245 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 17", + "id": 17, + "material_id": 17, + "type": { + "type": "d_sphere", + "position": [ + -10.817459129439781, + 0.2, + 4.53844409520825 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 18", + "id": 18, + "material_id": 18, + "type": { + "type": "d_sphere", + "position": [ + -10.767776068379185, + 0.2, + 5.774137942842539 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 19", + "id": 19, + "material_id": 19, + "type": { + "type": "d_sphere", + "position": [ + -10.93678197158283, + 0.2, + 6.8745428592308375 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 20", + "id": 20, + "material_id": 20, + "type": { + "type": "d_sphere", + "position": [ + -10.508898184030931, + 0.2, + 7.304121162178029 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 21", + "id": 21, + "material_id": 21, + "type": { + "type": "d_sphere", + "position": [ + -10.340273696364868, + 0.2, + 8.388718672039436 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 22", + "id": 22, + "material_id": 22, + "type": { + "type": "d_sphere", + "position": [ + -10.937849006390287, + 0.2, + 9.157675807326138 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 23", + "id": 23, + "material_id": 23, + "type": { + "type": "d_sphere", + "position": [ + -10.311276707409476, + 0.2, + 10.797371219764106 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 24", + "id": 24, + "material_id": 24, + "type": { + "type": "d_sphere", + "position": [ + -9.555241633585144, + 0.2, + -10.862732352932438 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 25", + "id": 25, + "material_id": 25, + "type": { + "type": "d_sphere", + "position": [ + -9.508016476321634, + 0.2, + -9.998022987674174 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 26", + "id": 26, + "material_id": 26, + "type": { + "type": "d_sphere", + "position": [ + -9.359674473284509, + 0.2, + -8.369471972477944 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 27", + "id": 27, + "material_id": 27, + "type": { + "type": "d_sphere", + "position": [ + -9.111787386847652, + 0.2, + -7.85558009117662 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 28", + "id": 28, + "material_id": 28, + "type": { + "type": "d_sphere", + "position": [ + -9.499347770803816, + 0.2, + -6.643172387778252 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 29", + "id": 29, + "material_id": 29, + "type": { + "type": "d_sphere", + "position": [ + -9.523069224857922, + 0.2, + -5.746711744109336 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 30", + "id": 30, + "material_id": 30, + "type": { + "type": "d_sphere", + "position": [ + -9.76973016018492, + 0.2, + -4.955925765280577 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 31", + "id": 31, + "material_id": 31, + "type": { + "type": "d_sphere", + "position": [ + -9.46905998220801, + 0.2, + -3.556386117438306 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 32", + "id": 32, + "material_id": 32, + "type": { + "type": "d_sphere", + "position": [ + -9.516427242357686, + 0.2, + -2.4547725487989895 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 33", + "id": 33, + "material_id": 33, + "type": { + "type": "d_sphere", + "position": [ + -9.40203604813461, + 0.2, + -1.1576188119679345 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 34", + "id": 34, + "material_id": 34, + "type": { + "type": "d_sphere", + "position": [ + -9.738953503919767, + 0.2, + -0.62280129003819 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 35", + "id": 35, + "material_id": 35, + "type": { + "type": "d_sphere", + "position": [ + -9.861283406163981, + 0.2, + 0.6936636685557148 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 36", + "id": 36, + "material_id": 36, + "type": { + "type": "d_sphere", + "position": [ + -9.368279040448598, + 0.2, + 1.7184358792866448 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 37", + "id": 37, + "material_id": 37, + "type": { + "type": "d_sphere", + "position": [ + -9.786156133908927, + 0.2, + 2.8834060051850106 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 38", + "id": 38, + "material_id": 38, + "type": { + "type": "d_sphere", + "position": [ + -9.127248400267941, + 0.2, + 3.8985219771662236 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 39", + "id": 39, + "material_id": 39, + "type": { + "type": "d_sphere", + "position": [ + -9.79651268359453, + 0.2, + 4.021255524317587 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 40", + "id": 40, + "material_id": 40, + "type": { + "type": "d_sphere", + "position": [ + -9.405297140399844, + 0.2, + 5.771162635253689 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 41", + "id": 41, + "material_id": 41, + "type": { + "type": "d_sphere", + "position": [ + -9.748818215661085, + 0.2, + 6.591957154262974 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 42", + "id": 42, + "material_id": 42, + "type": { + "type": "d_sphere", + "position": [ + -9.897629748341963, + 0.2, + 7.630008428192056 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 43", + "id": 43, + "material_id": 43, + "type": { + "type": "d_sphere", + "position": [ + -9.912770883968436, + 0.2, + 8.542616895958812 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 44", + "id": 44, + "material_id": 44, + "type": { + "type": "d_sphere", + "position": [ + -9.320819207425883, + 0.2, + 9.764763131156082 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 45", + "id": 45, + "material_id": 45, + "type": { + "type": "d_sphere", + "position": [ + -9.156387746922636, + 0.2, + 10.141682959670518 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 46", + "id": 46, + "material_id": 46, + "type": { + "type": "d_sphere", + "position": [ + -8.985161236722668, + 0.2, + -10.777769937517887 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 47", + "id": 47, + "material_id": 47, + "type": { + "type": "d_sphere", + "position": [ + -8.766512569410489, + 0.2, + -9.24125864883669 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 48", + "id": 48, + "material_id": 48, + "type": { + "type": "d_sphere", + "position": [ + -8.309698323786368, + 0.2, + -8.287450137237593 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 49", + "id": 49, + "material_id": 49, + "type": { + "type": "d_sphere", + "position": [ + -8.131536157386881, + 0.2, + -7.411827331425235 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 50", + "id": 50, + "material_id": 50, + "type": { + "type": "d_sphere", + "position": [ + -8.53161285852417, + 0.2, + -6.7154572432645425 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 51", + "id": 51, + "material_id": 51, + "type": { + "type": "d_sphere", + "position": [ + -8.548476546813932, + 0.2, + -5.777405452426169 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 52", + "id": 52, + "material_id": 52, + "type": { + "type": "d_sphere", + "position": [ + -8.62653994054052, + 0.2, + -4.406622933904216 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 53", + "id": 53, + "material_id": 53, + "type": { + "type": "d_sphere", + "position": [ + -8.214703331805639, + 0.2, + -3.244144484411775 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 54", + "id": 54, + "material_id": 54, + "type": { + "type": "d_sphere", + "position": [ + -8.340148665930347, + 0.2, + -2.1992899164215274 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 55", + "id": 55, + "material_id": 55, + "type": { + "type": "d_sphere", + "position": [ + -8.531806044636326, + 0.2, + -1.3385525586353642 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 56", + "id": 56, + "material_id": 56, + "type": { + "type": "d_sphere", + "position": [ + -8.228341944120269, + 0.2, + -0.5610684771562204 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 57", + "id": 57, + "material_id": 57, + "type": { + "type": "d_sphere", + "position": [ + -8.444975193902454, + 0.2, + 0.37184866141951756 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 58", + "id": 58, + "material_id": 58, + "type": { + "type": "d_sphere", + "position": [ + -8.33354029269862, + 0.2, + 1.155690028926766 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 59", + "id": 59, + "material_id": 59, + "type": { + "type": "d_sphere", + "position": [ + -8.921709661323492, + 0.2, + 2.3116411665785863 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 60", + "id": 60, + "material_id": 60, + "type": { + "type": "d_sphere", + "position": [ + -8.802758307999989, + 0.2, + 3.2848286311040353 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 61", + "id": 61, + "material_id": 61, + "type": { + "type": "d_sphere", + "position": [ + -8.590099575871811, + 0.2, + 4.840194988784921 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 62", + "id": 62, + "material_id": 62, + "type": { + "type": "d_sphere", + "position": [ + -8.967487206295594, + 0.2, + 5.5942872012454234 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 63", + "id": 63, + "material_id": 63, + "type": { + "type": "d_sphere", + "position": [ + -8.333345879929434, + 0.2, + 6.637547653425619 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 64", + "id": 64, + "material_id": 64, + "type": { + "type": "d_sphere", + "position": [ + -8.417541790560566, + 0.2, + 7.003997659611006 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 65", + "id": 65, + "material_id": 65, + "type": { + "type": "d_sphere", + "position": [ + -8.39954144735202, + 0.2, + 8.119412280717675 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 66", + "id": 66, + "material_id": 66, + "type": { + "type": "d_sphere", + "position": [ + -8.962533471747115, + 0.2, + 9.354775118373873 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 67", + "id": 67, + "material_id": 67, + "type": { + "type": "d_sphere", + "position": [ + -8.41030528954847, + 0.2, + 10.420102953909312 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 68", + "id": 68, + "material_id": 68, + "type": { + "type": "d_sphere", + "position": [ + -7.2206858373414535, + 0.2, + -10.832138855325468 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 69", + "id": 69, + "material_id": 69, + "type": { + "type": "d_sphere", + "position": [ + -7.133837518781359, + 0.2, + -9.172628657435915 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 70", + "id": 70, + "material_id": 70, + "type": { + "type": "d_sphere", + "position": [ + -7.11976266697586, + 0.2, + -8.772154509547205 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 71", + "id": 71, + "material_id": 71, + "type": { + "type": "d_sphere", + "position": [ + -7.103321279389742, + 0.2, + -7.175529934373825 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 72", + "id": 72, + "material_id": 72, + "type": { + "type": "d_sphere", + "position": [ + -7.2316540961738776, + 0.2, + -6.184329453135506 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 73", + "id": 73, + "material_id": 73, + "type": { + "type": "d_sphere", + "position": [ + -7.595221281512742, + 0.2, + -5.588297893103058 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 74", + "id": 74, + "material_id": 74, + "type": { + "type": "d_sphere", + "position": [ + -7.877012454405803, + 0.2, + -4.823188250517898 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 75", + "id": 75, + "material_id": 75, + "type": { + "type": "d_sphere", + "position": [ + -7.792648629686229, + 0.2, + -3.5058620265915676 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 76", + "id": 76, + "material_id": 76, + "type": { + "type": "d_sphere", + "position": [ + -7.508148110818183, + 0.2, + -2.98199911265273 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 77", + "id": 77, + "material_id": 77, + "type": { + "type": "d_sphere", + "position": [ + -7.57094762252361, + 0.2, + -1.8891861242363042 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 78", + "id": 78, + "material_id": 78, + "type": { + "type": "d_sphere", + "position": [ + -7.375304711989902, + 0.2, + -0.5494707672866561 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 79", + "id": 79, + "material_id": 79, + "type": { + "type": "d_sphere", + "position": [ + -7.508786498125808, + 0.2, + 0.5239798009332901 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 80", + "id": 80, + "material_id": 80, + "type": { + "type": "d_sphere", + "position": [ + -7.5914735417780514, + 0.2, + 1.667127743149751 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 81", + "id": 81, + "material_id": 81, + "type": { + "type": "d_sphere", + "position": [ + -7.659955711680733, + 0.2, + 2.1972167108034424 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 82", + "id": 82, + "material_id": 82, + "type": { + "type": "d_sphere", + "position": [ + -7.603740175377206, + 0.2, + 3.220462307108582 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 83", + "id": 83, + "material_id": 83, + "type": { + "type": "d_sphere", + "position": [ + -7.687184824164577, + 0.2, + 4.0916622235870985 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 84", + "id": 84, + "material_id": 84, + "type": { + "type": "d_sphere", + "position": [ + -7.4472950536721765, + 0.2, + 5.187152995289162 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 85", + "id": 85, + "material_id": 85, + "type": { + "type": "d_sphere", + "position": [ + -7.136690882253899, + 0.2, + 6.169901905596887 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 86", + "id": 86, + "material_id": 86, + "type": { + "type": "d_sphere", + "position": [ + -7.92923237495557, + 0.2, + 7.213810844023021 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 87", + "id": 87, + "material_id": 87, + "type": { + "type": "d_sphere", + "position": [ + -7.907318636975799, + 0.2, + 8.36834695032992 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 88", + "id": 88, + "material_id": 88, + "type": { + "type": "d_sphere", + "position": [ + -7.435100814273607, + 0.2, + 9.14035302375046 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 89", + "id": 89, + "material_id": 89, + "type": { + "type": "d_sphere", + "position": [ + -7.305798291234113, + 0.2, + 10.62447323149198 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 90", + "id": 90, + "material_id": 90, + "type": { + "type": "d_sphere", + "position": [ + -6.596110736081122, + 0.2, + -10.44887881235098 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 91", + "id": 91, + "material_id": 91, + "type": { + "type": "d_sphere", + "position": [ + -6.836899258545357, + 0.2, + -9.10000098918191 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 92", + "id": 92, + "material_id": 92, + "type": { + "type": "d_sphere", + "position": [ + -6.282589686019293, + 0.2, + -8.827800829813672 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 93", + "id": 93, + "material_id": 93, + "type": { + "type": "d_sphere", + "position": [ + -6.278001157516978, + 0.2, + -7.170442567253237 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 94", + "id": 94, + "material_id": 94, + "type": { + "type": "d_sphere", + "position": [ + -6.2429101574584145, + 0.2, + -6.315130231876272 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 95", + "id": 95, + "material_id": 95, + "type": { + "type": "d_sphere", + "position": [ + -6.491917595093782, + 0.2, + -5.667386999815522 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 96", + "id": 96, + "material_id": 96, + "type": { + "type": "d_sphere", + "position": [ + -6.943477580617201, + 0.2, + -4.565801185673377 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 97", + "id": 97, + "material_id": 97, + "type": { + "type": "d_sphere", + "position": [ + -6.460315380203202, + 0.2, + -3.7909833583787367 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 98", + "id": 98, + "material_id": 98, + "type": { + "type": "d_sphere", + "position": [ + -6.487930857145484, + 0.2, + -2.4240423978700214 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 99", + "id": 99, + "material_id": 99, + "type": { + "type": "d_sphere", + "position": [ + -6.990632873741715, + 0.2, + -1.738038647844694 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 100", + "id": 100, + "material_id": 100, + "type": { + "type": "d_sphere", + "position": [ + -6.900395074654359, + 0.2, + -0.9811131074443797 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 101", + "id": 101, + "material_id": 101, + "type": { + "type": "d_sphere", + "position": [ + -6.766414781180526, + 0.2, + 0.5086724426177903 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 102", + "id": 102, + "material_id": 102, + "type": { + "type": "d_sphere", + "position": [ + -6.572886337304357, + 0.2, + 1.5478144531031237 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 103", + "id": 103, + "material_id": 103, + "type": { + "type": "d_sphere", + "position": [ + -6.374495987785659, + 0.2, + 2.7973591037263663 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 104", + "id": 104, + "material_id": 104, + "type": { + "type": "d_sphere", + "position": [ + -6.942781455279057, + 0.2, + 3.4592968858064705 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 105", + "id": 105, + "material_id": 105, + "type": { + "type": "d_sphere", + "position": [ + -6.48396848603462, + 0.2, + 4.311522841085107 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 106", + "id": 106, + "material_id": 106, + "type": { + "type": "d_sphere", + "position": [ + -6.125460164859678, + 0.2, + 5.390028903330849 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 107", + "id": 107, + "material_id": 107, + "type": { + "type": "d_sphere", + "position": [ + -6.3241531151957355, + 0.2, + 6.42711746396999 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 108", + "id": 108, + "material_id": 108, + "type": { + "type": "d_sphere", + "position": [ + -6.86633417515217, + 0.2, + 7.499185838367461 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 109", + "id": 109, + "material_id": 109, + "type": { + "type": "d_sphere", + "position": [ + -6.10250675658248, + 0.2, + 8.300244877675269 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 110", + "id": 110, + "material_id": 110, + "type": { + "type": "d_sphere", + "position": [ + -6.739123558671127, + 0.2, + 9.179738402351763 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 111", + "id": 111, + "material_id": 111, + "type": { + "type": "d_sphere", + "position": [ + -6.618459172683492, + 0.2, + 10.665349668373475 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 112", + "id": 112, + "material_id": 112, + "type": { + "type": "d_sphere", + "position": [ + -5.8180239705592305, + 0.2, + -10.129575555489719 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 113", + "id": 113, + "material_id": 113, + "type": { + "type": "d_sphere", + "position": [ + -5.961798169743227, + 0.2, + -9.686443763147796 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 114", + "id": 114, + "material_id": 114, + "type": { + "type": "d_sphere", + "position": [ + -5.620019927548251, + 0.2, + -8.601533275402623 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 115", + "id": 115, + "material_id": 115, + "type": { + "type": "d_sphere", + "position": [ + -5.754085978879813, + 0.2, + -7.302569398154634 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 116", + "id": 116, + "material_id": 116, + "type": { + "type": "d_sphere", + "position": [ + -5.231412191395042, + 0.2, + -6.679852632988054 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 117", + "id": 117, + "material_id": 117, + "type": { + "type": "d_sphere", + "position": [ + -5.359197237523592, + 0.2, + -5.907016301074442 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 118", + "id": 118, + "material_id": 118, + "type": { + "type": "d_sphere", + "position": [ + -5.801207991365115, + 0.2, + -4.378431456215445 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 119", + "id": 119, + "material_id": 119, + "type": { + "type": "d_sphere", + "position": [ + -5.628533285192602, + 0.2, + -3.292205209970545 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 120", + "id": 120, + "material_id": 120, + "type": { + "type": "d_sphere", + "position": [ + -5.825798279881693, + 0.2, + -2.488706562233248 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 121", + "id": 121, + "material_id": 121, + "type": { + "type": "d_sphere", + "position": [ + -5.30774704831285, + 0.2, + -1.1490872028187447 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 122", + "id": 122, + "material_id": 122, + "type": { + "type": "d_sphere", + "position": [ + -5.256742241729505, + 0.2, + -0.23642984697849656 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 123", + "id": 123, + "material_id": 123, + "type": { + "type": "d_sphere", + "position": [ + -5.841771073264762, + 0.2, + 0.889751821319218 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 124", + "id": 124, + "material_id": 124, + "type": { + "type": "d_sphere", + "position": [ + -5.780113079146535, + 0.2, + 1.3879413519657202 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 125", + "id": 125, + "material_id": 125, + "type": { + "type": "d_sphere", + "position": [ + -5.130918825104054, + 0.2, + 2.484736852017645 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 126", + "id": 126, + "material_id": 126, + "type": { + "type": "d_sphere", + "position": [ + -5.184487504499165, + 0.2, + 3.432957553817708 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 127", + "id": 127, + "material_id": 127, + "type": { + "type": "d_sphere", + "position": [ + -5.583272516567371, + 0.2, + 4.277649516864799 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 128", + "id": 128, + "material_id": 128, + "type": { + "type": "d_sphere", + "position": [ + -5.592986970774721, + 0.2, + 5.412782779848385 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 129", + "id": 129, + "material_id": 129, + "type": { + "type": "d_sphere", + "position": [ + -5.101010588605186, + 0.2, + 6.754906619989821 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 130", + "id": 130, + "material_id": 130, + "type": { + "type": "d_sphere", + "position": [ + -5.614268698517556, + 0.2, + 7.8104181735730345 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 131", + "id": 131, + "material_id": 131, + "type": { + "type": "d_sphere", + "position": [ + -5.239762932025814, + 0.2, + 8.355786782055045 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 132", + "id": 132, + "material_id": 132, + "type": { + "type": "d_sphere", + "position": [ + -5.608333108058245, + 0.2, + 9.0847259069523 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 133", + "id": 133, + "material_id": 133, + "type": { + "type": "d_sphere", + "position": [ + -5.40010510784933, + 0.2, + 10.020867289610345 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 134", + "id": 134, + "material_id": 134, + "type": { + "type": "d_sphere", + "position": [ + -4.755116280117265, + 0.2, + -10.446776379235661 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 135", + "id": 135, + "material_id": 135, + "type": { + "type": "d_sphere", + "position": [ + -4.756126335591614, + 0.2, + -9.982981068605278 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 136", + "id": 136, + "material_id": 136, + "type": { + "type": "d_sphere", + "position": [ + -4.569692369783411, + 0.2, + -8.363014585276453 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 137", + "id": 137, + "material_id": 137, + "type": { + "type": "d_sphere", + "position": [ + -4.850511894022717, + 0.2, + -7.7382115180935225 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 138", + "id": 138, + "material_id": 138, + "type": { + "type": "d_sphere", + "position": [ + -4.784312782260173, + 0.2, + -6.366847671486824 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 139", + "id": 139, + "material_id": 139, + "type": { + "type": "d_sphere", + "position": [ + -4.147064167742737, + 0.2, + -5.3964907994019296 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 140", + "id": 140, + "material_id": 140, + "type": { + "type": "d_sphere", + "position": [ + -4.801898175410039, + 0.2, + -4.708678088948877 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 141", + "id": 141, + "material_id": 141, + "type": { + "type": "d_sphere", + "position": [ + -4.882465617900687, + 0.2, + -3.9604992701897315 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 142", + "id": 142, + "material_id": 142, + "type": { + "type": "d_sphere", + "position": [ + -4.224701398039737, + 0.2, + -2.2205298769621518 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 143", + "id": 143, + "material_id": 143, + "type": { + "type": "d_sphere", + "position": [ + -4.404975225573671, + 0.2, + -1.2683575955202557 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 144", + "id": 144, + "material_id": 144, + "type": { + "type": "d_sphere", + "position": [ + -4.296292160453995, + 0.2, + -0.5433498207235183 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 145", + "id": 145, + "material_id": 145, + "type": { + "type": "d_sphere", + "position": [ + -4.432206133128296, + 0.2, + 0.13015043994285688 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 146", + "id": 146, + "material_id": 146, + "type": { + "type": "d_sphere", + "position": [ + -4.662411283977998, + 0.2, + 1.8500302079126105 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 147", + "id": 147, + "material_id": 147, + "type": { + "type": "d_sphere", + "position": [ + -4.841927241631377, + 0.2, + 2.712743919006404 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 148", + "id": 148, + "material_id": 148, + "type": { + "type": "d_sphere", + "position": [ + -4.696726470686517, + 0.2, + 3.6026287890073014 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 149", + "id": 149, + "material_id": 149, + "type": { + "type": "d_sphere", + "position": [ + -4.712038513268422, + 0.2, + 4.249176693168566 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 150", + "id": 150, + "material_id": 150, + "type": { + "type": "d_sphere", + "position": [ + -4.2695950087587295, + 0.2, + 5.64978674930182 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 151", + "id": 151, + "material_id": 151, + "type": { + "type": "d_sphere", + "position": [ + -4.4770476383955256, + 0.2, + 6.596034546313754 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 152", + "id": 152, + "material_id": 152, + "type": { + "type": "d_sphere", + "position": [ + -4.492731410714851, + 0.2, + 7.6497857969872385 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 153", + "id": 153, + "material_id": 153, + "type": { + "type": "d_sphere", + "position": [ + -4.668925012521138, + 0.2, + 8.812344006130122 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 154", + "id": 154, + "material_id": 154, + "type": { + "type": "d_sphere", + "position": [ + -4.432757099072362, + 0.2, + 9.75396099330406 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 155", + "id": 155, + "material_id": 155, + "type": { + "type": "d_sphere", + "position": [ + -4.436723700162218, + 0.2, + 10.305173645481691 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 156", + "id": 156, + "material_id": 156, + "type": { + "type": "d_sphere", + "position": [ + -3.884311031685891, + 0.2, + -10.943006011391613 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 157", + "id": 157, + "material_id": 157, + "type": { + "type": "d_sphere", + "position": [ + -3.772033046958973, + 0.2, + -9.883460850559599 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 158", + "id": 158, + "material_id": 158, + "type": { + "type": "d_sphere", + "position": [ + -3.3003481151081644, + 0.2, + -8.433786565166958 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 159", + "id": 159, + "material_id": 159, + "type": { + "type": "d_sphere", + "position": [ + -3.2141395608059713, + 0.2, + -7.731885436575586 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 160", + "id": 160, + "material_id": 160, + "type": { + "type": "d_sphere", + "position": [ + -3.553169764054314, + 0.2, + -6.933992448565578 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 161", + "id": 161, + "material_id": 161, + "type": { + "type": "d_sphere", + "position": [ + -3.6031548127041164, + 0.2, + -5.9851383075836555 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 162", + "id": 162, + "material_id": 162, + "type": { + "type": "d_sphere", + "position": [ + -3.9412767838970293, + 0.2, + -4.4112292526511565 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 163", + "id": 163, + "material_id": 163, + "type": { + "type": "d_sphere", + "position": [ + -3.7657894885737955, + 0.2, + -3.5295900861485108 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 164", + "id": 164, + "material_id": 164, + "type": { + "type": "d_sphere", + "position": [ + -3.472142109882011, + 0.2, + -2.5178361998208545 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 165", + "id": 165, + "material_id": 165, + "type": { + "type": "d_sphere", + "position": [ + -3.681502437323917, + 0.2, + -1.6254956983484745 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 166", + "id": 166, + "material_id": 166, + "type": { + "type": "d_sphere", + "position": [ + -3.640871813891531, + 0.2, + -0.7102653229600275 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 167", + "id": 167, + "material_id": 167, + "type": { + "type": "d_sphere", + "position": [ + -3.501761737734709, + 0.2, + 0.4906414629902404 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 168", + "id": 168, + "material_id": 168, + "type": { + "type": "d_sphere", + "position": [ + -3.735101041676855, + 0.2, + 1.5309998820870323 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 169", + "id": 169, + "material_id": 169, + "type": { + "type": "d_sphere", + "position": [ + -3.630526803884494, + 0.2, + 2.2674239717252225 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 170", + "id": 170, + "material_id": 170, + "type": { + "type": "d_sphere", + "position": [ + -3.5689106544306917, + 0.2, + 3.650561110539433 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 171", + "id": 171, + "material_id": 171, + "type": { + "type": "d_sphere", + "position": [ + -3.7721512558354036, + 0.2, + 4.058012327289173 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 172", + "id": 172, + "material_id": 172, + "type": { + "type": "d_sphere", + "position": [ + -3.6021978533116976, + 0.2, + 5.4026116313386785 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 173", + "id": 173, + "material_id": 173, + "type": { + "type": "d_sphere", + "position": [ + -3.776137183298011, + 0.2, + 6.68362165631763 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 174", + "id": 174, + "material_id": 174, + "type": { + "type": "d_sphere", + "position": [ + -3.272563390519627, + 0.2, + 7.339777719078343 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 175", + "id": 175, + "material_id": 175, + "type": { + "type": "d_sphere", + "position": [ + -3.5577187929599505, + 0.2, + 8.048607736957006 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 176", + "id": 176, + "material_id": 176, + "type": { + "type": "d_sphere", + "position": [ + -3.541864760468898, + 0.2, + 9.058296047482045 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 177", + "id": 177, + "material_id": 177, + "type": { + "type": "d_sphere", + "position": [ + -3.8308695523966527, + 0.2, + 10.548560592180378 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 178", + "id": 178, + "material_id": 178, + "type": { + "type": "d_sphere", + "position": [ + -2.7049126719488337, + 0.2, + -10.85151551962504 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 179", + "id": 179, + "material_id": 179, + "type": { + "type": "d_sphere", + "position": [ + -2.4580611184963086, + 0.2, + -9.90614766618512 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 180", + "id": 180, + "material_id": 180, + "type": { + "type": "d_sphere", + "position": [ + -2.835804334019718, + 0.2, + -8.979718109297849 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 181", + "id": 181, + "material_id": 181, + "type": { + "type": "d_sphere", + "position": [ + -2.2400986766869866, + 0.2, + -7.8778366051228526 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 182", + "id": 182, + "material_id": 182, + "type": { + "type": "d_sphere", + "position": [ + -2.1378710448060554, + 0.2, + -6.712565340357809 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 183", + "id": 183, + "material_id": 183, + "type": { + "type": "d_sphere", + "position": [ + -2.7751653653059556, + 0.2, + -5.999930630396629 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 184", + "id": 184, + "material_id": 184, + "type": { + "type": "d_sphere", + "position": [ + -2.7119524740386103, + 0.2, + -4.122926809707133 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 185", + "id": 185, + "material_id": 185, + "type": { + "type": "d_sphere", + "position": [ + -2.6876960079881353, + 0.2, + -3.7065472606848053 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 186", + "id": 186, + "material_id": 186, + "type": { + "type": "d_sphere", + "position": [ + -2.1386456872679345, + 0.2, + -2.5505877963129695 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 187", + "id": 187, + "material_id": 187, + "type": { + "type": "d_sphere", + "position": [ + -2.303647582993495, + 0.2, + -1.6251566893243825 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 188", + "id": 188, + "material_id": 188, + "type": { + "type": "d_sphere", + "position": [ + -2.471360185700676, + 0.2, + -0.7642705998160161 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 189", + "id": 189, + "material_id": 189, + "type": { + "type": "d_sphere", + "position": [ + -2.7688828935525063, + 0.2, + 0.16779999144214855 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 190", + "id": 190, + "material_id": 190, + "type": { + "type": "d_sphere", + "position": [ + -2.2688999863286257, + 0.2, + 1.3865180779131145 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 191", + "id": 191, + "material_id": 191, + "type": { + "type": "d_sphere", + "position": [ + -2.4778552941581187, + 0.2, + 2.4227859706820984 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 192", + "id": 192, + "material_id": 192, + "type": { + "type": "d_sphere", + "position": [ + -2.748115703988819, + 0.2, + 3.108985769666689 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 193", + "id": 193, + "material_id": 193, + "type": { + "type": "d_sphere", + "position": [ + -2.6474978943748733, + 0.2, + 4.8958572716156175 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 194", + "id": 194, + "material_id": 194, + "type": { + "type": "d_sphere", + "position": [ + -2.5489654837679447, + 0.2, + 5.888325186875275 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 195", + "id": 195, + "material_id": 195, + "type": { + "type": "d_sphere", + "position": [ + -2.474574302640102, + 0.2, + 6.34314183459967 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 196", + "id": 196, + "material_id": 196, + "type": { + "type": "d_sphere", + "position": [ + -2.5214699482147402, + 0.2, + 7.488833068114799 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 197", + "id": 197, + "material_id": 197, + "type": { + "type": "d_sphere", + "position": [ + -2.4412686353393065, + 0.2, + 8.664644777123742 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 198", + "id": 198, + "material_id": 198, + "type": { + "type": "d_sphere", + "position": [ + -2.485761102041243, + 0.2, + 9.184996500744067 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 199", + "id": 199, + "material_id": 199, + "type": { + "type": "d_sphere", + "position": [ + -2.624365008112755, + 0.2, + 10.012238365315248 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 200", + "id": 200, + "material_id": 200, + "type": { + "type": "d_sphere", + "position": [ + -1.4569331024711307, + 0.2, + -10.172441120878199 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 201", + "id": 201, + "material_id": 201, + "type": { + "type": "d_sphere", + "position": [ + -1.5309340809669834, + 0.2, + -9.994018664644182 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 202", + "id": 202, + "material_id": 202, + "type": { + "type": "d_sphere", + "position": [ + -1.9529611078348503, + 0.2, + -8.951399066202193 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 203", + "id": 203, + "material_id": 203, + "type": { + "type": "d_sphere", + "position": [ + -1.3363828833981266, + 0.2, + -7.439797420045874 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 204", + "id": 204, + "material_id": 204, + "type": { + "type": "d_sphere", + "position": [ + -1.8950393688865776, + 0.2, + -6.2198517507571 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 205", + "id": 205, + "material_id": 205, + "type": { + "type": "d_sphere", + "position": [ + -1.4215983349153196, + 0.2, + -5.4900302019461185 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 206", + "id": 206, + "material_id": 206, + "type": { + "type": "d_sphere", + "position": [ + -1.764419951789038, + 0.2, + -4.230877223147284 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 207", + "id": 207, + "material_id": 207, + "type": { + "type": "d_sphere", + "position": [ + -1.7331626257056927, + 0.2, + -3.8321273874395003 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 208", + "id": 208, + "material_id": 208, + "type": { + "type": "d_sphere", + "position": [ + -1.1416745678124358, + 0.2, + -2.1832286436926482 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 209", + "id": 209, + "material_id": 209, + "type": { + "type": "d_sphere", + "position": [ + -1.4930617178403036, + 0.2, + -1.4614022147637162 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 210", + "id": 210, + "material_id": 210, + "type": { + "type": "d_sphere", + "position": [ + -1.9078316141899911, + 0.2, + -0.8331369624773136 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 211", + "id": 211, + "material_id": 211, + "type": { + "type": "d_sphere", + "position": [ + -1.7054083002298885, + 0.2, + 0.027578553523691898 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 212", + "id": 212, + "material_id": 212, + "type": { + "type": "d_sphere", + "position": [ + -1.620566616752881, + 0.2, + 1.6487648837493183 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 213", + "id": 213, + "material_id": 213, + "type": { + "type": "d_sphere", + "position": [ + -1.4824937560980058, + 0.2, + 2.2285538344291 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 214", + "id": 214, + "material_id": 214, + "type": { + "type": "d_sphere", + "position": [ + -1.1634674878505673, + 0.2, + 3.881294968864735 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 215", + "id": 215, + "material_id": 215, + "type": { + "type": "d_sphere", + "position": [ + -1.5238805217405675, + 0.2, + 4.124427124813452 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 216", + "id": 216, + "material_id": 216, + "type": { + "type": "d_sphere", + "position": [ + -1.2852131484698057, + 0.2, + 5.209124984623418 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 217", + "id": 217, + "material_id": 217, + "type": { + "type": "d_sphere", + "position": [ + -1.2904599239868724, + 0.2, + 6.3517203586092785 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 218", + "id": 218, + "material_id": 218, + "type": { + "type": "d_sphere", + "position": [ + -1.8083689485804215, + 0.2, + 7.7492801754545955 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 219", + "id": 219, + "material_id": 219, + "type": { + "type": "d_sphere", + "position": [ + -1.1514174498372518, + 0.2, + 8.870059019613393 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 220", + "id": 220, + "material_id": 220, + "type": { + "type": "d_sphere", + "position": [ + -1.376904761507617, + 0.2, + 9.18436239133337 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 221", + "id": 221, + "material_id": 221, + "type": { + "type": "d_sphere", + "position": [ + -1.236464888487384, + 0.2, + 10.841450526641946 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 222", + "id": 222, + "material_id": 222, + "type": { + "type": "d_sphere", + "position": [ + -0.8392851154113028, + 0.2, + -10.659198713503354 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 223", + "id": 223, + "material_id": 223, + "type": { + "type": "d_sphere", + "position": [ + -0.2495486422141967, + 0.2, + -9.122719271789476 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 224", + "id": 224, + "material_id": 224, + "type": { + "type": "d_sphere", + "position": [ + -0.8489873650443942, + 0.2, + -8.822000138585928 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 225", + "id": 225, + "material_id": 225, + "type": { + "type": "d_sphere", + "position": [ + -0.2753702726009001, + 0.2, + -7.828534777844524 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 226", + "id": 226, + "material_id": 226, + "type": { + "type": "d_sphere", + "position": [ + -0.8087860111992459, + 0.2, + -6.321281783503016 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 227", + "id": 227, + "material_id": 227, + "type": { + "type": "d_sphere", + "position": [ + -0.8751398778810622, + 0.2, + -5.859302064295491 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 228", + "id": 228, + "material_id": 228, + "type": { + "type": "d_sphere", + "position": [ + -0.9193762080259372, + 0.2, + -4.124905250943214 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 229", + "id": 229, + "material_id": 229, + "type": { + "type": "d_sphere", + "position": [ + -0.37202860505629054, + 0.2, + -3.54700591589973 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 230", + "id": 230, + "material_id": 230, + "type": { + "type": "d_sphere", + "position": [ + -0.5899331292067953, + 0.2, + -2.1456706672277077 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 231", + "id": 231, + "material_id": 231, + "type": { + "type": "d_sphere", + "position": [ + -0.5238787294762721, + 0.2, + -1.3483316980503153 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 232", + "id": 232, + "material_id": 232, + "type": { + "type": "d_sphere", + "position": [ + -0.48780793913670917, + 0.2, + -0.6378406861023538 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 233", + "id": 233, + "material_id": 233, + "type": { + "type": "d_sphere", + "position": [ + -0.18875100555315838, + 0.2, + 0.7892565724637077 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 234", + "id": 234, + "material_id": 234, + "type": { + "type": "d_sphere", + "position": [ + -0.9837665433360016, + 0.2, + 1.4703795771152783 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 235", + "id": 235, + "material_id": 235, + "type": { + "type": "d_sphere", + "position": [ + -0.7060466078142964, + 0.2, + 2.0515196414452768 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 236", + "id": 236, + "material_id": 236, + "type": { + "type": "d_sphere", + "position": [ + -0.517928211984308, + 0.2, + 3.6843099635467667 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 237", + "id": 237, + "material_id": 237, + "type": { + "type": "d_sphere", + "position": [ + -0.29961505546399636, + 0.2, + 4.775130098293879 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 238", + "id": 238, + "material_id": 238, + "type": { + "type": "d_sphere", + "position": [ + -0.3579075066006302, + 0.2, + 5.113798154679237 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 239", + "id": 239, + "material_id": 239, + "type": { + "type": "d_sphere", + "position": [ + -0.2923620853757497, + 0.2, + 6.006547998088146 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 240", + "id": 240, + "material_id": 240, + "type": { + "type": "d_sphere", + "position": [ + -0.31400103356215114, + 0.2, + 7.482304027153655 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 241", + "id": 241, + "material_id": 241, + "type": { + "type": "d_sphere", + "position": [ + -0.9217333491327242, + 0.2, + 8.177528371109814 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 242", + "id": 242, + "material_id": 242, + "type": { + "type": "d_sphere", + "position": [ + -0.3424655073100269, + 0.2, + 9.235274524557168 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 243", + "id": 243, + "material_id": 243, + "type": { + "type": "d_sphere", + "position": [ + -0.18205406195822793, + 0.2, + 10.853757628079553 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 244", + "id": 244, + "material_id": 244, + "type": { + "type": "d_sphere", + "position": [ + 0.03305234169233473, + 0.2, + -10.604508074949374 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 245", + "id": 245, + "material_id": 245, + "type": { + "type": "d_sphere", + "position": [ + 0.86629781894329, + 0.2, + -9.217289816109338 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 246", + "id": 246, + "material_id": 246, + "type": { + "type": "d_sphere", + "position": [ + 0.37104957819263173, + 0.2, + -8.870578164619925 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 247", + "id": 247, + "material_id": 247, + "type": { + "type": "d_sphere", + "position": [ + 0.49256805770938517, + 0.2, + -7.697810690282594 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 248", + "id": 248, + "material_id": 248, + "type": { + "type": "d_sphere", + "position": [ + 0.5326674195366689, + 0.2, + -6.910950870279502 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 249", + "id": 249, + "material_id": 249, + "type": { + "type": "d_sphere", + "position": [ + 0.4388192036958757, + 0.2, + -5.844160789772854 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 250", + "id": 250, + "material_id": 250, + "type": { + "type": "d_sphere", + "position": [ + 0.7374092106064477, + 0.2, + -4.364534561952617 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 251", + "id": 251, + "material_id": 251, + "type": { + "type": "d_sphere", + "position": [ + 0.6596308153731586, + 0.2, + -3.1146388987604787 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 252", + "id": 252, + "material_id": 252, + "type": { + "type": "d_sphere", + "position": [ + 0.24230267815292547, + 0.2, + -2.1245561146869703 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 253", + "id": 253, + "material_id": 253, + "type": { + "type": "d_sphere", + "position": [ + 0.09072760079294484, + 0.2, + -1.6850722991391351 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 254", + "id": 254, + "material_id": 254, + "type": { + "type": "d_sphere", + "position": [ + 0.7619564804190883, + 0.2, + -0.5974821586408565 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 255", + "id": 255, + "material_id": 255, + "type": { + "type": "d_sphere", + "position": [ + 0.03356047832235456, + 0.2, + 0.841816547432779 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 256", + "id": 256, + "material_id": 256, + "type": { + "type": "d_sphere", + "position": [ + 0.8751530159369855, + 0.2, + 1.7174126191211005 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 257", + "id": 257, + "material_id": 257, + "type": { + "type": "d_sphere", + "position": [ + 0.6069007922475131, + 0.2, + 2.8055533916848385 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 258", + "id": 258, + "material_id": 258, + "type": { + "type": "d_sphere", + "position": [ + 0.1660931310218929, + 0.2, + 3.27159857916415 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 259", + "id": 259, + "material_id": 259, + "type": { + "type": "d_sphere", + "position": [ + 0.78187284889672, + 0.2, + 4.267698255895451 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 260", + "id": 260, + "material_id": 260, + "type": { + "type": "d_sphere", + "position": [ + 0.7490183592484053, + 0.2, + 5.883811450931788 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 261", + "id": 261, + "material_id": 261, + "type": { + "type": "d_sphere", + "position": [ + 0.017273256725994914, + 0.2, + 6.785489970578778 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 262", + "id": 262, + "material_id": 262, + "type": { + "type": "d_sphere", + "position": [ + 0.060376118924143185, + 0.2, + 7.885335240394435 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 263", + "id": 263, + "material_id": 263, + "type": { + "type": "d_sphere", + "position": [ + 0.8672820528366549, + 0.2, + 8.255347584027625 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 264", + "id": 264, + "material_id": 264, + "type": { + "type": "d_sphere", + "position": [ + 0.13544599334435223, + 0.2, + 9.071433647544131 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 265", + "id": 265, + "material_id": 265, + "type": { + "type": "d_sphere", + "position": [ + 0.7952862234128465, + 0.2, + 10.166999319233236 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 266", + "id": 266, + "material_id": 266, + "type": { + "type": "d_sphere", + "position": [ + 1.7612225363659633, + 0.2, + -10.708322909992786 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 267", + "id": 267, + "material_id": 267, + "type": { + "type": "d_sphere", + "position": [ + 1.5439865885553847, + 0.2, + -9.715903749083573 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 268", + "id": 268, + "material_id": 268, + "type": { + "type": "d_sphere", + "position": [ + 1.8915955428815248, + 0.2, + -8.384923972052984 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 269", + "id": 269, + "material_id": 269, + "type": { + "type": "d_sphere", + "position": [ + 1.2303298171296722, + 0.2, + -7.392633470407888 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 270", + "id": 270, + "material_id": 270, + "type": { + "type": "d_sphere", + "position": [ + 1.5519667929019942, + 0.2, + -6.416250468624917 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 271", + "id": 271, + "material_id": 271, + "type": { + "type": "d_sphere", + "position": [ + 1.0602450246844286, + 0.2, + -5.876585923978838 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 272", + "id": 272, + "material_id": 272, + "type": { + "type": "d_sphere", + "position": [ + 1.0042590854848465, + 0.2, + -4.507579252302898 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 273", + "id": 273, + "material_id": 273, + "type": { + "type": "d_sphere", + "position": [ + 1.573730618944766, + 0.2, + -3.332114464734082 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 274", + "id": 274, + "material_id": 274, + "type": { + "type": "d_sphere", + "position": [ + 1.6282045379552323, + 0.2, + -2.612198992157516 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 275", + "id": 275, + "material_id": 275, + "type": { + "type": "d_sphere", + "position": [ + 1.7991942567413441, + 0.2, + -1.27655266409554 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 276", + "id": 276, + "material_id": 276, + "type": { + "type": "d_sphere", + "position": [ + 1.3311093257008813, + 0.2, + -0.9113436778484599 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 277", + "id": 277, + "material_id": 277, + "type": { + "type": "d_sphere", + "position": [ + 1.721297047259136, + 0.2, + 0.22325178526122477 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 278", + "id": 278, + "material_id": 278, + "type": { + "type": "d_sphere", + "position": [ + 1.1111229707315613, + 0.2, + 1.3657816424642268 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 279", + "id": 279, + "material_id": 279, + "type": { + "type": "d_sphere", + "position": [ + 1.0907709718786502, + 0.2, + 2.041731854076414 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 280", + "id": 280, + "material_id": 280, + "type": { + "type": "d_sphere", + "position": [ + 1.8595174821242089, + 0.2, + 3.555001161527429 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 281", + "id": 281, + "material_id": 281, + "type": { + "type": "d_sphere", + "position": [ + 1.326476393481375, + 0.2, + 4.801302837771956 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 282", + "id": 282, + "material_id": 282, + "type": { + "type": "d_sphere", + "position": [ + 1.7163316276985403, + 0.2, + 5.467929891054914 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 283", + "id": 283, + "material_id": 283, + "type": { + "type": "d_sphere", + "position": [ + 1.7424100004238263, + 0.2, + 6.560025033720137 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 284", + "id": 284, + "material_id": 284, + "type": { + "type": "d_sphere", + "position": [ + 1.6217916886811974, + 0.2, + 7.165913992130073 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 285", + "id": 285, + "material_id": 285, + "type": { + "type": "d_sphere", + "position": [ + 1.6591834204783804, + 0.2, + 8.549397264565856 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 286", + "id": 286, + "material_id": 286, + "type": { + "type": "d_sphere", + "position": [ + 1.343247988312401, + 0.2, + 9.326186877161973 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 287", + "id": 287, + "material_id": 287, + "type": { + "type": "d_sphere", + "position": [ + 1.6503876612993251, + 0.2, + 10.411162815265982 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 288", + "id": 288, + "material_id": 288, + "type": { + "type": "d_sphere", + "position": [ + 2.5247899407210985, + 0.2, + -10.628386501941437 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 289", + "id": 289, + "material_id": 289, + "type": { + "type": "d_sphere", + "position": [ + 2.4609702619043503, + 0.2, + -9.514715461111189 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 290", + "id": 290, + "material_id": 290, + "type": { + "type": "d_sphere", + "position": [ + 2.814154188616828, + 0.2, + -8.196543816891836 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 291", + "id": 291, + "material_id": 291, + "type": { + "type": "d_sphere", + "position": [ + 2.0032628675336226, + 0.2, + -7.585412243226585 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 292", + "id": 292, + "material_id": 292, + "type": { + "type": "d_sphere", + "position": [ + 2.633609583507414, + 0.2, + -6.605181714587014 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 293", + "id": 293, + "material_id": 293, + "type": { + "type": "d_sphere", + "position": [ + 2.585883466747801, + 0.2, + -5.403289760026363 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 294", + "id": 294, + "material_id": 294, + "type": { + "type": "d_sphere", + "position": [ + 2.440328931887872, + 0.2, + -4.610168482979737 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 295", + "id": 295, + "material_id": 295, + "type": { + "type": "d_sphere", + "position": [ + 2.538354111926645, + 0.2, + -3.7985660778218135 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 296", + "id": 296, + "material_id": 296, + "type": { + "type": "d_sphere", + "position": [ + 2.335466184735725, + 0.2, + -2.5830253406827883 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 297", + "id": 297, + "material_id": 297, + "type": { + "type": "d_sphere", + "position": [ + 2.8106190340687807, + 0.2, + -1.315818270747745 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 298", + "id": 298, + "material_id": 298, + "type": { + "type": "d_sphere", + "position": [ + 2.5845495790622808, + 0.2, + -0.9873557866027011 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 299", + "id": 299, + "material_id": 299, + "type": { + "type": "d_sphere", + "position": [ + 2.5359346365462834, + 0.2, + 0.785482159949519 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 300", + "id": 300, + "material_id": 300, + "type": { + "type": "d_sphere", + "position": [ + 2.178613582324249, + 0.2, + 1.717539083273698 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 301", + "id": 301, + "material_id": 301, + "type": { + "type": "d_sphere", + "position": [ + 2.0107436310469033, + 0.2, + 2.068411974300641 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 302", + "id": 302, + "material_id": 302, + "type": { + "type": "d_sphere", + "position": [ + 2.7119623694754424, + 0.2, + 3.7360776295922165 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 303", + "id": 303, + "material_id": 303, + "type": { + "type": "d_sphere", + "position": [ + 2.2198552999908583, + 0.2, + 4.174335966184215 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 304", + "id": 304, + "material_id": 304, + "type": { + "type": "d_sphere", + "position": [ + 2.656016786566093, + 0.2, + 5.435864320137165 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 305", + "id": 305, + "material_id": 305, + "type": { + "type": "d_sphere", + "position": [ + 2.5330817629101183, + 0.2, + 6.69073884252534 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 306", + "id": 306, + "material_id": 306, + "type": { + "type": "d_sphere", + "position": [ + 2.1426361684938557, + 0.2, + 7.674847332638342 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 307", + "id": 307, + "material_id": 307, + "type": { + "type": "d_sphere", + "position": [ + 2.570200297915397, + 0.2, + 8.517471069235258 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 308", + "id": 308, + "material_id": 308, + "type": { + "type": "d_sphere", + "position": [ + 2.053853645188605, + 0.2, + 9.511775047512872 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 309", + "id": 309, + "material_id": 309, + "type": { + "type": "d_sphere", + "position": [ + 2.185406203292484, + 0.2, + 10.63815193039758 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 310", + "id": 310, + "material_id": 310, + "type": { + "type": "d_sphere", + "position": [ + 3.874792168512279, + 0.2, + -10.760125350930224 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 311", + "id": 311, + "material_id": 311, + "type": { + "type": "d_sphere", + "position": [ + 3.5047212652453776, + 0.2, + -9.838207784334971 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 312", + "id": 312, + "material_id": 312, + "type": { + "type": "d_sphere", + "position": [ + 3.1261232529692684, + 0.2, + -8.770988621539345 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 313", + "id": 313, + "material_id": 313, + "type": { + "type": "d_sphere", + "position": [ + 3.6175325359883024, + 0.2, + -7.763501916181625 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 314", + "id": 314, + "material_id": 314, + "type": { + "type": "d_sphere", + "position": [ + 3.6203391034858536, + 0.2, + -6.622831638439543 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 315", + "id": 315, + "material_id": 315, + "type": { + "type": "d_sphere", + "position": [ + 3.534560149112504, + 0.2, + -5.616484927211684 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 316", + "id": 316, + "material_id": 316, + "type": { + "type": "d_sphere", + "position": [ + 3.6145825702950645, + 0.2, + -4.655968904498549 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 317", + "id": 317, + "material_id": 317, + "type": { + "type": "d_sphere", + "position": [ + 3.4494075353131026, + 0.2, + -3.1263689788872 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 318", + "id": 318, + "material_id": 318, + "type": { + "type": "d_sphere", + "position": [ + 3.562129257233502, + 0.2, + -2.4448331286087734 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 319", + "id": 319, + "material_id": 319, + "type": { + "type": "d_sphere", + "position": [ + 3.3142898584368097, + 0.2, + -1.2912411244210968 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 320", + "id": 320, + "material_id": 320, + "type": { + "type": "d_sphere", + "position": [ + 3.2849769660848036, + 0.2, + 1.4468403772675562 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 321", + "id": 321, + "material_id": 321, + "type": { + "type": "d_sphere", + "position": [ + 3.3666509997827894, + 0.2, + 2.284388210637209 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 322", + "id": 322, + "material_id": 322, + "type": { + "type": "d_sphere", + "position": [ + 3.529115912394926, + 0.2, + 3.327449857043765 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 323", + "id": 323, + "material_id": 323, + "type": { + "type": "d_sphere", + "position": [ + 3.7620739137868853, + 0.2, + 4.803773104722589 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 324", + "id": 324, + "material_id": 324, + "type": { + "type": "d_sphere", + "position": [ + 3.008742210302489, + 0.2, + 5.074291855747233 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 325", + "id": 325, + "material_id": 325, + "type": { + "type": "d_sphere", + "position": [ + 3.191145856744426, + 0.2, + 6.468337270091538 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 326", + "id": 326, + "material_id": 326, + "type": { + "type": "d_sphere", + "position": [ + 3.192005404631069, + 0.2, + 7.601615646041861 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 327", + "id": 327, + "material_id": 327, + "type": { + "type": "d_sphere", + "position": [ + 3.5475882717840834, + 0.2, + 8.272047417402677 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 328", + "id": 328, + "material_id": 328, + "type": { + "type": "d_sphere", + "position": [ + 3.3763689549495246, + 0.2, + 9.7913383524233 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 329", + "id": 329, + "material_id": 329, + "type": { + "type": "d_sphere", + "position": [ + 3.035356247774858, + 0.2, + 10.002777897249103 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 330", + "id": 330, + "material_id": 330, + "type": { + "type": "d_sphere", + "position": [ + 4.301534212875588, + 0.2, + -10.482145643297242 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 331", + "id": 331, + "material_id": 331, + "type": { + "type": "d_sphere", + "position": [ + 4.121634739133204, + 0.2, + -9.81430526726939 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 332", + "id": 332, + "material_id": 332, + "type": { + "type": "d_sphere", + "position": [ + 4.025336137391822, + 0.2, + -8.837353304359876 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 333", + "id": 333, + "material_id": 333, + "type": { + "type": "d_sphere", + "position": [ + 4.737926133325508, + 0.2, + -7.325244158975828 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 334", + "id": 334, + "material_id": 334, + "type": { + "type": "d_sphere", + "position": [ + 4.791440778112264, + 0.2, + -6.4414020065514626 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 335", + "id": 335, + "material_id": 335, + "type": { + "type": "d_sphere", + "position": [ + 4.588412214790516, + 0.2, + -5.503547651311884 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 336", + "id": 336, + "material_id": 336, + "type": { + "type": "d_sphere", + "position": [ + 4.278695237909668, + 0.2, + -4.845323084033851 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 337", + "id": 337, + "material_id": 337, + "type": { + "type": "d_sphere", + "position": [ + 4.427758273063949, + 0.2, + -3.8045123682345943 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 338", + "id": 338, + "material_id": 338, + "type": { + "type": "d_sphere", + "position": [ + 4.5476266826432035, + 0.2, + -2.65824793395706 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 339", + "id": 339, + "material_id": 339, + "type": { + "type": "d_sphere", + "position": [ + 4.765459625660067, + 0.2, + -1.1111302414214772 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 340", + "id": 340, + "material_id": 340, + "type": { + "type": "d_sphere", + "position": [ + 4.34240731171259, + 0.2, + 1.4051342709830301 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 341", + "id": 341, + "material_id": 341, + "type": { + "type": "d_sphere", + "position": [ + 4.255629491401877, + 0.2, + 2.13015688631835 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 342", + "id": 342, + "material_id": 342, + "type": { + "type": "d_sphere", + "position": [ + 4.874984402178088, + 0.2, + 3.571445576127301 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 343", + "id": 343, + "material_id": 343, + "type": { + "type": "d_sphere", + "position": [ + 4.674826859949425, + 0.2, + 4.530910215151491 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 344", + "id": 344, + "material_id": 344, + "type": { + "type": "d_sphere", + "position": [ + 4.716963220755959, + 0.2, + 5.102600621487103 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 345", + "id": 345, + "material_id": 345, + "type": { + "type": "d_sphere", + "position": [ + 4.817232546061927, + 0.2, + 6.047365041103435 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 346", + "id": 346, + "material_id": 346, + "type": { + "type": "d_sphere", + "position": [ + 4.780786713377166, + 0.2, + 7.624433000771517 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 347", + "id": 347, + "material_id": 347, + "type": { + "type": "d_sphere", + "position": [ + 4.127436155226758, + 0.2, + 8.127533116284809 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 348", + "id": 348, + "material_id": 348, + "type": { + "type": "d_sphere", + "position": [ + 4.228798412526754, + 0.2, + 9.736300171774648 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 349", + "id": 349, + "material_id": 349, + "type": { + "type": "d_sphere", + "position": [ + 4.336588332474195, + 0.2, + 10.014765022037048 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 350", + "id": 350, + "material_id": 350, + "type": { + "type": "d_sphere", + "position": [ + 5.429553678563897, + 0.2, + -10.363921226100341 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 351", + "id": 351, + "material_id": 351, + "type": { + "type": "d_sphere", + "position": [ + 5.540488819392844, + 0.2, + -9.487402130884742 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 352", + "id": 352, + "material_id": 352, + "type": { + "type": "d_sphere", + "position": [ + 5.483001797882245, + 0.2, + -8.383228920629655 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 353", + "id": 353, + "material_id": 353, + "type": { + "type": "d_sphere", + "position": [ + 5.080267568954547, + 0.2, + -7.55508430547232 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 354", + "id": 354, + "material_id": 354, + "type": { + "type": "d_sphere", + "position": [ + 5.19700614124485, + 0.2, + -6.680145830694824 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 355", + "id": 355, + "material_id": 355, + "type": { + "type": "d_sphere", + "position": [ + 5.605049409534667, + 0.2, + -5.768506865916047 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 356", + "id": 356, + "material_id": 356, + "type": { + "type": "d_sphere", + "position": [ + 5.512099697903418, + 0.2, + -4.386942046922977 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 357", + "id": 357, + "material_id": 357, + "type": { + "type": "d_sphere", + "position": [ + 5.836432227272662, + 0.2, + -3.741296705707012 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 358", + "id": 358, + "material_id": 358, + "type": { + "type": "d_sphere", + "position": [ + 5.687174359514784, + 0.2, + -2.1957778022978314 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 359", + "id": 359, + "material_id": 359, + "type": { + "type": "d_sphere", + "position": [ + 5.492198739606124, + 0.2, + -1.1919442999756442 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 360", + "id": 360, + "material_id": 360, + "type": { + "type": "d_sphere", + "position": [ + 5.555463615484086, + 0.2, + -0.766781334759808 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 361", + "id": 361, + "material_id": 361, + "type": { + "type": "d_sphere", + "position": [ + 5.276114316835024, + 0.2, + 0.34830891760059596 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 362", + "id": 362, + "material_id": 362, + "type": { + "type": "d_sphere", + "position": [ + 5.454337303716708, + 0.2, + 1.8329072047684314 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 363", + "id": 363, + "material_id": 363, + "type": { + "type": "d_sphere", + "position": [ + 5.666684476283207, + 0.2, + 2.6515887589296585 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 364", + "id": 364, + "material_id": 364, + "type": { + "type": "d_sphere", + "position": [ + 5.368062909609512, + 0.2, + 3.727090904453886 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 365", + "id": 365, + "material_id": 365, + "type": { + "type": "d_sphere", + "position": [ + 5.710971648022128, + 0.2, + 4.273448524188979 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 366", + "id": 366, + "material_id": 366, + "type": { + "type": "d_sphere", + "position": [ + 5.1429176959833365, + 0.2, + 5.19403916210484 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 367", + "id": 367, + "material_id": 367, + "type": { + "type": "d_sphere", + "position": [ + 5.881339217633151, + 0.2, + 6.880618993702006 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 368", + "id": 368, + "material_id": 368, + "type": { + "type": "d_sphere", + "position": [ + 5.187574968890599, + 0.2, + 7.034285163160706 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 369", + "id": 369, + "material_id": 369, + "type": { + "type": "d_sphere", + "position": [ + 5.4331011287923365, + 0.2, + 8.708771947496434 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 370", + "id": 370, + "material_id": 370, + "type": { + "type": "d_sphere", + "position": [ + 5.003514777153418, + 0.2, + 9.66726421563028 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 371", + "id": 371, + "material_id": 371, + "type": { + "type": "d_sphere", + "position": [ + 5.87254763037192, + 0.2, + 10.568811694865195 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 372", + "id": 372, + "material_id": 372, + "type": { + "type": "d_sphere", + "position": [ + 6.21330548820604, + 0.2, + -10.20482796383052 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 373", + "id": 373, + "material_id": 373, + "type": { + "type": "d_sphere", + "position": [ + 6.5526702351354364, + 0.2, + -9.587253353260355 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 374", + "id": 374, + "material_id": 374, + "type": { + "type": "d_sphere", + "position": [ + 6.458841054547851, + 0.2, + -8.980556928108724 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 375", + "id": 375, + "material_id": 375, + "type": { + "type": "d_sphere", + "position": [ + 6.103041810119823, + 0.2, + -7.766108382609028 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 376", + "id": 376, + "material_id": 376, + "type": { + "type": "d_sphere", + "position": [ + 6.590459767867825, + 0.2, + -6.126025141570775 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 377", + "id": 377, + "material_id": 377, + "type": { + "type": "d_sphere", + "position": [ + 6.580173801444538, + 0.2, + -5.763707839569209 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 378", + "id": 378, + "material_id": 378, + "type": { + "type": "d_sphere", + "position": [ + 6.367033174060968, + 0.2, + -4.20618335460367 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 379", + "id": 379, + "material_id": 379, + "type": { + "type": "d_sphere", + "position": [ + 6.88089605182255, + 0.2, + -3.8203918375706047 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 380", + "id": 380, + "material_id": 380, + "type": { + "type": "d_sphere", + "position": [ + 6.460655792898851, + 0.2, + -2.630765866516275 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 381", + "id": 381, + "material_id": 381, + "type": { + "type": "d_sphere", + "position": [ + 6.465882533220932, + 0.2, + -1.6322405679529863 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 382", + "id": 382, + "material_id": 382, + "type": { + "type": "d_sphere", + "position": [ + 6.129260616834832, + 0.2, + -0.4799871454022544 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 383", + "id": 383, + "material_id": 383, + "type": { + "type": "d_sphere", + "position": [ + 6.815800099360489, + 0.2, + 0.530896662448077 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 384", + "id": 384, + "material_id": 384, + "type": { + "type": "d_sphere", + "position": [ + 6.676448543857889, + 0.2, + 1.3061654319471494 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 385", + "id": 385, + "material_id": 385, + "type": { + "type": "d_sphere", + "position": [ + 6.298556556566719, + 0.2, + 2.724855254486276 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 386", + "id": 386, + "material_id": 386, + "type": { + "type": "d_sphere", + "position": [ + 6.57711175749672, + 0.2, + 3.703921196861482 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 387", + "id": 387, + "material_id": 387, + "type": { + "type": "d_sphere", + "position": [ + 6.375675743076825, + 0.2, + 4.357479917941397 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 388", + "id": 388, + "material_id": 388, + "type": { + "type": "d_sphere", + "position": [ + 6.889096475184586, + 0.2, + 5.432369483146054 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 389", + "id": 389, + "material_id": 389, + "type": { + "type": "d_sphere", + "position": [ + 6.258613998364169, + 0.2, + 6.572121944817411 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 390", + "id": 390, + "material_id": 390, + "type": { + "type": "d_sphere", + "position": [ + 6.220438197608702, + 0.2, + 7.0806072276466585 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 391", + "id": 391, + "material_id": 391, + "type": { + "type": "d_sphere", + "position": [ + 6.221068380600341, + 0.2, + 8.67374484016797 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 392", + "id": 392, + "material_id": 392, + "type": { + "type": "d_sphere", + "position": [ + 6.888096061092618, + 0.2, + 9.546563732438303 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 393", + "id": 393, + "material_id": 393, + "type": { + "type": "d_sphere", + "position": [ + 6.583392912004865, + 0.2, + 10.238057832909993 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 394", + "id": 394, + "material_id": 394, + "type": { + "type": "d_sphere", + "position": [ + 7.172105157269992, + 0.2, + -10.583048428140943 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 395", + "id": 395, + "material_id": 395, + "type": { + "type": "d_sphere", + "position": [ + 7.550275123971372, + 0.2, + -9.661297182578373 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 396", + "id": 396, + "material_id": 396, + "type": { + "type": "d_sphere", + "position": [ + 7.099021189275607, + 0.2, + -8.35980754233037 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 397", + "id": 397, + "material_id": 397, + "type": { + "type": "d_sphere", + "position": [ + 7.189253469719582, + 0.2, + -7.2926755582689475 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 398", + "id": 398, + "material_id": 398, + "type": { + "type": "d_sphere", + "position": [ + 7.774016537020148, + 0.2, + -6.6197049060023 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 399", + "id": 399, + "material_id": 399, + "type": { + "type": "d_sphere", + "position": [ + 7.712675478648239, + 0.2, + -5.859538118535269 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 400", + "id": 400, + "material_id": 400, + "type": { + "type": "d_sphere", + "position": [ + 7.635689419265671, + 0.2, + -4.956927949263023 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 401", + "id": 401, + "material_id": 401, + "type": { + "type": "d_sphere", + "position": [ + 7.417224140785832, + 0.2, + -3.4931284610227067 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 402", + "id": 402, + "material_id": 402, + "type": { + "type": "d_sphere", + "position": [ + 7.749522467385555, + 0.2, + -2.6575490389150476 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 403", + "id": 403, + "material_id": 403, + "type": { + "type": "d_sphere", + "position": [ + 7.655685568371955, + 0.2, + -1.271408405528207 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 404", + "id": 404, + "material_id": 404, + "type": { + "type": "d_sphere", + "position": [ + 7.060300548442065, + 0.2, + -0.6453596973203035 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 405", + "id": 405, + "material_id": 405, + "type": { + "type": "d_sphere", + "position": [ + 7.223390308753143, + 0.2, + 0.3444416031198276 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 406", + "id": 406, + "material_id": 406, + "type": { + "type": "d_sphere", + "position": [ + 7.306807223584452, + 0.2, + 1.0281960847055827 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 407", + "id": 407, + "material_id": 407, + "type": { + "type": "d_sphere", + "position": [ + 7.637884209039795, + 0.2, + 2.493460508305264 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 408", + "id": 408, + "material_id": 408, + "type": { + "type": "d_sphere", + "position": [ + 7.124125295784739, + 0.2, + 3.633369464870455 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 409", + "id": 409, + "material_id": 409, + "type": { + "type": "d_sphere", + "position": [ + 7.8432136037094535, + 0.2, + 4.375962995467817 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 410", + "id": 410, + "material_id": 410, + "type": { + "type": "d_sphere", + "position": [ + 7.151160130229814, + 0.2, + 5.640270857556137 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 411", + "id": 411, + "material_id": 411, + "type": { + "type": "d_sphere", + "position": [ + 7.679620940685931, + 0.2, + 6.67418888953631 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 412", + "id": 412, + "material_id": 412, + "type": { + "type": "d_sphere", + "position": [ + 7.390878078514149, + 0.2, + 7.532136526639186 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 413", + "id": 413, + "material_id": 413, + "type": { + "type": "d_sphere", + "position": [ + 7.760437985222076, + 0.2, + 8.33885081574091 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 414", + "id": 414, + "material_id": 414, + "type": { + "type": "d_sphere", + "position": [ + 7.3487013033144795, + 0.2, + 9.724821560715524 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 415", + "id": 415, + "material_id": 415, + "type": { + "type": "d_sphere", + "position": [ + 7.649214583576075, + 0.2, + 10.1636567320009 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 416", + "id": 416, + "material_id": 416, + "type": { + "type": "d_sphere", + "position": [ + 8.399452944102206, + 0.2, + -10.152715532057737 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 417", + "id": 417, + "material_id": 417, + "type": { + "type": "d_sphere", + "position": [ + 8.42560694809261, + 0.2, + -9.195453692304602 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 418", + "id": 418, + "material_id": 418, + "type": { + "type": "d_sphere", + "position": [ + 8.496960318079218, + 0.2, + -8.942523023421963 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 419", + "id": 419, + "material_id": 419, + "type": { + "type": "d_sphere", + "position": [ + 8.635538712514705, + 0.2, + -7.297517768228023 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 420", + "id": 420, + "material_id": 420, + "type": { + "type": "d_sphere", + "position": [ + 8.838287943129743, + 0.2, + -6.169604575236204 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 421", + "id": 421, + "material_id": 421, + "type": { + "type": "d_sphere", + "position": [ + 8.839533088483341, + 0.2, + -5.802371820252407 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 422", + "id": 422, + "material_id": 422, + "type": { + "type": "d_sphere", + "position": [ + 8.411498808984586, + 0.2, + -4.256667827692779 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 423", + "id": 423, + "material_id": 423, + "type": { + "type": "d_sphere", + "position": [ + 8.838446116729173, + 0.2, + -3.6471181300436624 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 424", + "id": 424, + "material_id": 424, + "type": { + "type": "d_sphere", + "position": [ + 8.005142097940887, + 0.2, + -2.4358363862476664 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 425", + "id": 425, + "material_id": 425, + "type": { + "type": "d_sphere", + "position": [ + 8.45600319433729, + 0.2, + -1.1250323437388379 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 426", + "id": 426, + "material_id": 426, + "type": { + "type": "d_sphere", + "position": [ + 8.826483150706206, + 0.2, + -0.802944953994692 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 427", + "id": 427, + "material_id": 427, + "type": { + "type": "d_sphere", + "position": [ + 8.737633736097159, + 0.2, + 0.6811594526132648 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 428", + "id": 428, + "material_id": 428, + "type": { + "type": "d_sphere", + "position": [ + 8.414655285389196, + 0.2, + 1.2916821497530049 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 429", + "id": 429, + "material_id": 429, + "type": { + "type": "d_sphere", + "position": [ + 8.382357736780245, + 0.2, + 2.4931634338662154 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 430", + "id": 430, + "material_id": 430, + "type": { + "type": "d_sphere", + "position": [ + 8.607740853105222, + 0.2, + 3.5388307766722154 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 431", + "id": 431, + "material_id": 431, + "type": { + "type": "d_sphere", + "position": [ + 8.811510710737997, + 0.2, + 4.656969296047646 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 432", + "id": 432, + "material_id": 432, + "type": { + "type": "d_sphere", + "position": [ + 8.65868110731809, + 0.2, + 5.263207969077092 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 433", + "id": 433, + "material_id": 433, + "type": { + "type": "d_sphere", + "position": [ + 8.269459192211508, + 0.2, + 6.063893866988318 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 434", + "id": 434, + "material_id": 434, + "type": { + "type": "d_sphere", + "position": [ + 8.333977478626382, + 0.2, + 7.188756097701521 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 435", + "id": 435, + "material_id": 435, + "type": { + "type": "d_sphere", + "position": [ + 8.044820009894526, + 0.2, + 8.447704928634012 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 436", + "id": 436, + "material_id": 436, + "type": { + "type": "d_sphere", + "position": [ + 8.226267673120981, + 0.2, + 9.731665025114097 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 437", + "id": 437, + "material_id": 437, + "type": { + "type": "d_sphere", + "position": [ + 8.499640805345999, + 0.2, + 10.294863158348784 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 438", + "id": 438, + "material_id": 438, + "type": { + "type": "d_sphere", + "position": [ + 9.630884282784097, + 0.2, + -10.8686190542474 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 439", + "id": 439, + "material_id": 439, + "type": { + "type": "d_sphere", + "position": [ + 9.602507788897665, + 0.2, + -9.842797036442262 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 440", + "id": 440, + "material_id": 440, + "type": { + "type": "d_sphere", + "position": [ + 9.501389903934564, + 0.2, + -8.56557406898232 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 441", + "id": 441, + "material_id": 441, + "type": { + "type": "d_sphere", + "position": [ + 9.396800214141445, + 0.2, + -7.947857455109689 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 442", + "id": 442, + "material_id": 442, + "type": { + "type": "d_sphere", + "position": [ + 9.701508967121582, + 0.2, + -6.30823383230031 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 443", + "id": 443, + "material_id": 443, + "type": { + "type": "d_sphere", + "position": [ + 9.765762504541692, + 0.2, + -5.6222560712468646 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 444", + "id": 444, + "material_id": 444, + "type": { + "type": "d_sphere", + "position": [ + 9.14124779005697, + 0.2, + -4.913076146263214 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 445", + "id": 445, + "material_id": 445, + "type": { + "type": "d_sphere", + "position": [ + 9.053356790903152, + 0.2, + -3.599364637027439 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 446", + "id": 446, + "material_id": 446, + "type": { + "type": "d_sphere", + "position": [ + 9.784515747354417, + 0.2, + -2.8500402918276793 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 447", + "id": 447, + "material_id": 447, + "type": { + "type": "d_sphere", + "position": [ + 9.67258950271244, + 0.2, + -1.6188330988564068 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 448", + "id": 448, + "material_id": 448, + "type": { + "type": "d_sphere", + "position": [ + 9.11203971748613, + 0.2, + -0.9328434402261289 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 449", + "id": 449, + "material_id": 449, + "type": { + "type": "d_sphere", + "position": [ + 9.27288134050334, + 0.2, + 0.6416171170406367 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 450", + "id": 450, + "material_id": 450, + "type": { + "type": "d_sphere", + "position": [ + 9.583368927777975, + 0.2, + 1.4407853223929963 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 451", + "id": 451, + "material_id": 451, + "type": { + "type": "d_sphere", + "position": [ + 9.889081409695757, + 0.2, + 2.520319540119631 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 452", + "id": 452, + "material_id": 452, + "type": { + "type": "d_sphere", + "position": [ + 9.459374607314034, + 0.2, + 3.0942567016591482 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 453", + "id": 453, + "material_id": 453, + "type": { + "type": "d_sphere", + "position": [ + 9.45828756569646, + 0.2, + 4.571946804136549 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 454", + "id": 454, + "material_id": 454, + "type": { + "type": "d_sphere", + "position": [ + 9.725155334551078, + 0.2, + 5.5918204954055515 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 455", + "id": 455, + "material_id": 455, + "type": { + "type": "d_sphere", + "position": [ + 9.200524613167964, + 0.2, + 6.491325979276479 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 456", + "id": 456, + "material_id": 456, + "type": { + "type": "d_sphere", + "position": [ + 9.080260434298236, + 0.2, + 7.042181197452917 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 457", + "id": 457, + "material_id": 457, + "type": { + "type": "d_sphere", + "position": [ + 9.778773247057178, + 0.2, + 8.82539013860793 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 458", + "id": 458, + "material_id": 458, + "type": { + "type": "d_sphere", + "position": [ + 9.307141860972886, + 0.2, + 9.462148930061627 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 459", + "id": 459, + "material_id": 459, + "type": { + "type": "d_sphere", + "position": [ + 9.269789150897623, + 0.2, + 10.676718667602174 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 460", + "id": 460, + "material_id": 460, + "type": { + "type": "d_sphere", + "position": [ + 10.611645486417698, + 0.2, + -10.76985563313981 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 461", + "id": 461, + "material_id": 461, + "type": { + "type": "d_sphere", + "position": [ + 10.287114154148068, + 0.2, + -9.675720838272273 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 462", + "id": 462, + "material_id": 462, + "type": { + "type": "d_sphere", + "position": [ + 10.144739052824615, + 0.2, + -8.750325990370243 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 463", + "id": 463, + "material_id": 463, + "type": { + "type": "d_sphere", + "position": [ + 10.385394932935577, + 0.2, + -7.851711641517634 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 464", + "id": 464, + "material_id": 464, + "type": { + "type": "d_sphere", + "position": [ + 10.845996947833346, + 0.2, + -6.198833212089429 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 465", + "id": 465, + "material_id": 465, + "type": { + "type": "d_sphere", + "position": [ + 10.78601812929927, + 0.2, + -5.435086079318526 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 466", + "id": 466, + "material_id": 466, + "type": { + "type": "d_sphere", + "position": [ + 10.521082987799943, + 0.2, + -4.855870509350716 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 467", + "id": 467, + "material_id": 467, + "type": { + "type": "d_sphere", + "position": [ + 10.239884536403569, + 0.2, + -3.33758589843466 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 468", + "id": 468, + "material_id": 468, + "type": { + "type": "d_sphere", + "position": [ + 10.137791385986516, + 0.2, + -2.671233150044624 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 469", + "id": 469, + "material_id": 469, + "type": { + "type": "d_sphere", + "position": [ + 10.775895353701372, + 0.2, + -1.1059918780136546 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 470", + "id": 470, + "material_id": 470, + "type": { + "type": "d_sphere", + "position": [ + 10.737893197923894, + 0.2, + -0.3212290959471571 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 471", + "id": 471, + "material_id": 471, + "type": { + "type": "d_sphere", + "position": [ + 10.329767674340422, + 0.2, + 0.5595341953747729 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 472", + "id": 472, + "material_id": 472, + "type": { + "type": "d_sphere", + "position": [ + 10.879534164610362, + 0.2, + 1.8862220573332666 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 473", + "id": 473, + "material_id": 473, + "type": { + "type": "d_sphere", + "position": [ + 10.59305487719168, + 0.2, + 2.803689029963464 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 474", + "id": 474, + "material_id": 474, + "type": { + "type": "d_sphere", + "position": [ + 10.304171867971066, + 0.2, + 3.705793090215712 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 475", + "id": 475, + "material_id": 475, + "type": { + "type": "d_sphere", + "position": [ + 10.837716527602963, + 0.2, + 4.471263128497936 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 476", + "id": 476, + "material_id": 476, + "type": { + "type": "d_sphere", + "position": [ + 10.70109688946682, + 0.2, + 5.517363531983897 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 477", + "id": 477, + "material_id": 477, + "type": { + "type": "d_sphere", + "position": [ + 10.169448239159875, + 0.2, + 6.757351036845992 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 478", + "id": 478, + "material_id": 478, + "type": { + "type": "d_sphere", + "position": [ + 10.866968987829274, + 0.2, + 7.7199446497396975 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 479", + "id": 479, + "material_id": 479, + "type": { + "type": "d_sphere", + "position": [ + 10.63128554672854, + 0.2, + 8.72999408724149 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 480", + "id": 480, + "material_id": 480, + "type": { + "type": "d_sphere", + "position": [ + 10.085591909164703, + 0.2, + 9.852054735663796 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 481", + "id": 481, + "material_id": 481, + "type": { + "type": "d_sphere", + "position": [ + 10.138580896565985, + 0.2, + 10.560415299778356 + ], + "radius": 0.2 + } + }, + { + "name": "Obj 482", + "id": 482, + "material_id": 482, + "type": { + "type": "d_sphere", + "position": [ + 0, + 1, + 0 + ], + "radius": 1 + } + }, + { + "name": "Obj 483", + "id": 483, + "material_id": 483, + "type": { + "type": "d_sphere", + "position": [ + -4, + 1, + 0 + ], + "radius": 1 + } + }, + { + "name": "Obj 484", + "id": 484, + "material_id": 484, + "type": { + "type": "d_sphere", + "position": [ + 4, + 1, + 0 + ], + "radius": 1 + } + } + ], + "materials": [ + { + "name": "Mat 1", + "id": 1, + "type": { + "type": "d_mat_diffuse", + "color": "#7f7f7f" + } + }, + { + "name": "Mat 2", + "id": 2, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 3", + "id": 3, + "type": { + "type": "d_mat_metal", + "color": "#caefcb", + "roughness": 0.05220600297319977 + } + }, + { + "name": "Mat 4", + "id": 4, + "type": { + "type": "d_mat_metal", + "color": "#def28d", + "roughness": 0.3779676695138857 + } + }, + { + "name": "Mat 5", + "id": 5, + "type": { + "type": "d_mat_diffuse", + "color": "#035ab8" + } + }, + { + "name": "Mat 6", + "id": 6, + "type": { + "type": "d_mat_diffuse", + "color": "#264f9f" + } + }, + { + "name": "Mat 7", + "id": 7, + "type": { + "type": "d_mat_metal", + "color": "#8bbc80", + "roughness": 0.008725613265345156 + } + }, + { + "name": "Mat 8", + "id": 8, + "type": { + "type": "d_mat_diffuse", + "color": "#050f66" + } + }, + { + "name": "Mat 9", + "id": 9, + "type": { + "type": "d_mat_diffuse", + "color": "#263893" + } + }, + { + "name": "Mat 10", + "id": 10, + "type": { + "type": "d_mat_diffuse", + "color": "#a60169" + } + }, + { + "name": "Mat 11", + "id": 11, + "type": { + "type": "d_mat_diffuse", + "color": "#8f2ba7" + } + }, + { + "name": "Mat 12", + "id": 12, + "type": { + "type": "d_mat_diffuse", + "color": "#220bb0" + } + }, + { + "name": "Mat 13", + "id": 13, + "type": { + "type": "d_mat_diffuse", + "color": "#4914b3" + } + }, + { + "name": "Mat 14", + "id": 14, + "type": { + "type": "d_mat_diffuse", + "color": "#246150" + } + }, + { + "name": "Mat 15", + "id": 15, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 16", + "id": 16, + "type": { + "type": "d_mat_diffuse", + "color": "#450501" + } + }, + { + "name": "Mat 17", + "id": 17, + "type": { + "type": "d_mat_diffuse", + "color": "#824f04" + } + }, + { + "name": "Mat 18", + "id": 18, + "type": { + "type": "d_mat_diffuse", + "color": "#717f01" + } + }, + { + "name": "Mat 19", + "id": 19, + "type": { + "type": "d_mat_diffuse", + "color": "#72030c" + } + }, + { + "name": "Mat 20", + "id": 20, + "type": { + "type": "d_mat_diffuse", + "color": "#5e0600" + } + }, + { + "name": "Mat 21", + "id": 21, + "type": { + "type": "d_mat_diffuse", + "color": "#0b7215" + } + }, + { + "name": "Mat 22", + "id": 22, + "type": { + "type": "d_mat_diffuse", + "color": "#800067" + } + }, + { + "name": "Mat 23", + "id": 23, + "type": { + "type": "d_mat_diffuse", + "color": "#3c4b79" + } + }, + { + "name": "Mat 24", + "id": 24, + "type": { + "type": "d_mat_diffuse", + "color": "#1802ad" + } + }, + { + "name": "Mat 25", + "id": 25, + "type": { + "type": "d_mat_diffuse", + "color": "#4619ab" + } + }, + { + "name": "Mat 26", + "id": 26, + "type": { + "type": "d_mat_diffuse", + "color": "#0a2e20" + } + }, + { + "name": "Mat 27", + "id": 27, + "type": { + "type": "d_mat_diffuse", + "color": "#0d10e8" + } + }, + { + "name": "Mat 28", + "id": 28, + "type": { + "type": "d_mat_diffuse", + "color": "#6169e3" + } + }, + { + "name": "Mat 29", + "id": 29, + "type": { + "type": "d_mat_diffuse", + "color": "#7d1faf" + } + }, + { + "name": "Mat 30", + "id": 30, + "type": { + "type": "d_mat_metal", + "color": "#d19cb1", + "roughness": 0.39328119711744824 + } + }, + { + "name": "Mat 31", + "id": 31, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 32", + "id": 32, + "type": { + "type": "d_mat_diffuse", + "color": "#2d3147" + } + }, + { + "name": "Mat 33", + "id": 33, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 34", + "id": 34, + "type": { + "type": "d_mat_metal", + "color": "#c3abd7", + "roughness": 0.20138034240400504 + } + }, + { + "name": "Mat 35", + "id": 35, + "type": { + "type": "d_mat_diffuse", + "color": "#0c0a18" + } + }, + { + "name": "Mat 36", + "id": 36, + "type": { + "type": "d_mat_diffuse", + "color": "#69081d" + } + }, + { + "name": "Mat 37", + "id": 37, + "type": { + "type": "d_mat_diffuse", + "color": "#780405" + } + }, + { + "name": "Mat 38", + "id": 38, + "type": { + "type": "d_mat_metal", + "color": "#d5b9fc", + "roughness": 0.3105819266290032 + } + }, + { + "name": "Mat 39", + "id": 39, + "type": { + "type": "d_mat_metal", + "color": "#cac684", + "roughness": 0.019654426416363946 + } + }, + { + "name": "Mat 40", + "id": 40, + "type": { + "type": "d_mat_diffuse", + "color": "#813401" + } + }, + { + "name": "Mat 41", + "id": 41, + "type": { + "type": "d_mat_diffuse", + "color": "#2d8727" + } + }, + { + "name": "Mat 42", + "id": 42, + "type": { + "type": "d_mat_diffuse", + "color": "#305950" + } + }, + { + "name": "Mat 43", + "id": 43, + "type": { + "type": "d_mat_diffuse", + "color": "#d83d04" + } + }, + { + "name": "Mat 44", + "id": 44, + "type": { + "type": "d_mat_diffuse", + "color": "#230cc8" + } + }, + { + "name": "Mat 45", + "id": 45, + "type": { + "type": "d_mat_diffuse", + "color": "#307232" + } + }, + { + "name": "Mat 46", + "id": 46, + "type": { + "type": "d_mat_diffuse", + "color": "#5a004a" + } + }, + { + "name": "Mat 47", + "id": 47, + "type": { + "type": "d_mat_diffuse", + "color": "#0b1e14" + } + }, + { + "name": "Mat 48", + "id": 48, + "type": { + "type": "d_mat_diffuse", + "color": "#091109" + } + }, + { + "name": "Mat 49", + "id": 49, + "type": { + "type": "d_mat_metal", + "color": "#f2cf8a", + "roughness": 0.22647230459073509 + } + }, + { + "name": "Mat 50", + "id": 50, + "type": { + "type": "d_mat_diffuse", + "color": "#0e9207" + } + }, + { + "name": "Mat 51", + "id": 51, + "type": { + "type": "d_mat_diffuse", + "color": "#8e303b" + } + }, + { + "name": "Mat 52", + "id": 52, + "type": { + "type": "d_mat_metal", + "color": "#a5adb3", + "roughness": 0.32114628340798634 + } + }, + { + "name": "Mat 53", + "id": 53, + "type": { + "type": "d_mat_diffuse", + "color": "#401e08" + } + }, + { + "name": "Mat 54", + "id": 54, + "type": { + "type": "d_mat_diffuse", + "color": "#2e9829" + } + }, + { + "name": "Mat 55", + "id": 55, + "type": { + "type": "d_mat_diffuse", + "color": "#4f2321" + } + }, + { + "name": "Mat 56", + "id": 56, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 57", + "id": 57, + "type": { + "type": "d_mat_diffuse", + "color": "#81206d" + } + }, + { + "name": "Mat 58", + "id": 58, + "type": { + "type": "d_mat_diffuse", + "color": "#552487" + } + }, + { + "name": "Mat 59", + "id": 59, + "type": { + "type": "d_mat_diffuse", + "color": "#640a06" + } + }, + { + "name": "Mat 60", + "id": 60, + "type": { + "type": "d_mat_diffuse", + "color": "#4b3344" + } + }, + { + "name": "Mat 61", + "id": 61, + "type": { + "type": "d_mat_diffuse", + "color": "#0b0268" + } + }, + { + "name": "Mat 62", + "id": 62, + "type": { + "type": "d_mat_diffuse", + "color": "#01bf79" + } + }, + { + "name": "Mat 63", + "id": 63, + "type": { + "type": "d_mat_metal", + "color": "#e6d4ae", + "roughness": 0.056515330798307506 + } + }, + { + "name": "Mat 64", + "id": 64, + "type": { + "type": "d_mat_diffuse", + "color": "#a30c03" + } + }, + { + "name": "Mat 65", + "id": 65, + "type": { + "type": "d_mat_diffuse", + "color": "#213596" + } + }, + { + "name": "Mat 66", + "id": 66, + "type": { + "type": "d_mat_diffuse", + "color": "#376d10" + } + }, + { + "name": "Mat 67", + "id": 67, + "type": { + "type": "d_mat_diffuse", + "color": "#6d0301" + } + }, + { + "name": "Mat 68", + "id": 68, + "type": { + "type": "d_mat_diffuse", + "color": "#a02928" + } + }, + { + "name": "Mat 69", + "id": 69, + "type": { + "type": "d_mat_diffuse", + "color": "#055f24" + } + }, + { + "name": "Mat 70", + "id": 70, + "type": { + "type": "d_mat_diffuse", + "color": "#05090e" + } + }, + { + "name": "Mat 71", + "id": 71, + "type": { + "type": "d_mat_metal", + "color": "#faa6bb", + "roughness": 0.27588059499172213 + } + }, + { + "name": "Mat 72", + "id": 72, + "type": { + "type": "d_mat_diffuse", + "color": "#052f97" + } + }, + { + "name": "Mat 73", + "id": 73, + "type": { + "type": "d_mat_diffuse", + "color": "#0421b2" + } + }, + { + "name": "Mat 74", + "id": 74, + "type": { + "type": "d_mat_metal", + "color": "#a9d4de", + "roughness": 0.4670339214635112 + } + }, + { + "name": "Mat 75", + "id": 75, + "type": { + "type": "d_mat_diffuse", + "color": "#59780d" + } + }, + { + "name": "Mat 76", + "id": 76, + "type": { + "type": "d_mat_metal", + "color": "#84aefb", + "roughness": 0.09549150410418517 + } + }, + { + "name": "Mat 77", + "id": 77, + "type": { + "type": "d_mat_diffuse", + "color": "#0c050e" + } + }, + { + "name": "Mat 78", + "id": 78, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 79", + "id": 79, + "type": { + "type": "d_mat_diffuse", + "color": "#164623" + } + }, + { + "name": "Mat 80", + "id": 80, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 81", + "id": 81, + "type": { + "type": "d_mat_diffuse", + "color": "#03d56c" + } + }, + { + "name": "Mat 82", + "id": 82, + "type": { + "type": "d_mat_metal", + "color": "#c7b6b5", + "roughness": 0.003054739136104434 + } + }, + { + "name": "Mat 83", + "id": 83, + "type": { + "type": "d_mat_diffuse", + "color": "#144a06" + } + }, + { + "name": "Mat 84", + "id": 84, + "type": { + "type": "d_mat_metal", + "color": "#e188cc", + "roughness": 0.26815909168381913 + } + }, + { + "name": "Mat 85", + "id": 85, + "type": { + "type": "d_mat_diffuse", + "color": "#1d0339" + } + }, + { + "name": "Mat 86", + "id": 86, + "type": { + "type": "d_mat_diffuse", + "color": "#4a1f41" + } + }, + { + "name": "Mat 87", + "id": 87, + "type": { + "type": "d_mat_diffuse", + "color": "#68042b" + } + }, + { + "name": "Mat 88", + "id": 88, + "type": { + "type": "d_mat_metal", + "color": "#c198ad", + "roughness": 0.1057623243564314 + } + }, + { + "name": "Mat 89", + "id": 89, + "type": { + "type": "d_mat_diffuse", + "color": "#2a0680" + } + }, + { + "name": "Mat 90", + "id": 90, + "type": { + "type": "d_mat_diffuse", + "color": "#062c05" + } + }, + { + "name": "Mat 91", + "id": 91, + "type": { + "type": "d_mat_diffuse", + "color": "#8c2d4f" + } + }, + { + "name": "Mat 92", + "id": 92, + "type": { + "type": "d_mat_diffuse", + "color": "#5ab771" + } + }, + { + "name": "Mat 93", + "id": 93, + "type": { + "type": "d_mat_diffuse", + "color": "#7d0645" + } + }, + { + "name": "Mat 94", + "id": 94, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 95", + "id": 95, + "type": { + "type": "d_mat_diffuse", + "color": "#1f1f01" + } + }, + { + "name": "Mat 96", + "id": 96, + "type": { + "type": "d_mat_diffuse", + "color": "#06ac17" + } + }, + { + "name": "Mat 97", + "id": 97, + "type": { + "type": "d_mat_metal", + "color": "#ebfe95", + "roughness": 0.009921779517996221 + } + }, + { + "name": "Mat 98", + "id": 98, + "type": { + "type": "d_mat_diffuse", + "color": "#43ab23" + } + }, + { + "name": "Mat 99", + "id": 99, + "type": { + "type": "d_mat_diffuse", + "color": "#5a1295" + } + }, + { + "name": "Mat 100", + "id": 100, + "type": { + "type": "d_mat_diffuse", + "color": "#010054" + } + }, + { + "name": "Mat 101", + "id": 101, + "type": { + "type": "d_mat_diffuse", + "color": "#021e46" + } + }, + { + "name": "Mat 102", + "id": 102, + "type": { + "type": "d_mat_diffuse", + "color": "#100c75" + } + }, + { + "name": "Mat 103", + "id": 103, + "type": { + "type": "d_mat_metal", + "color": "#84e7f7", + "roughness": 0.37211712882953785 + } + }, + { + "name": "Mat 104", + "id": 104, + "type": { + "type": "d_mat_metal", + "color": "#85e386", + "roughness": 0.18267551696344764 + } + }, + { + "name": "Mat 105", + "id": 105, + "type": { + "type": "d_mat_diffuse", + "color": "#bd043e" + } + }, + { + "name": "Mat 106", + "id": 106, + "type": { + "type": "d_mat_diffuse", + "color": "#376a75" + } + }, + { + "name": "Mat 107", + "id": 107, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 108", + "id": 108, + "type": { + "type": "d_mat_diffuse", + "color": "#544d00" + } + }, + { + "name": "Mat 109", + "id": 109, + "type": { + "type": "d_mat_diffuse", + "color": "#14bc15" + } + }, + { + "name": "Mat 110", + "id": 110, + "type": { + "type": "d_mat_diffuse", + "color": "#3d911b" + } + }, + { + "name": "Mat 111", + "id": 111, + "type": { + "type": "d_mat_diffuse", + "color": "#47024e" + } + }, + { + "name": "Mat 112", + "id": 112, + "type": { + "type": "d_mat_diffuse", + "color": "#704a31" + } + }, + { + "name": "Mat 113", + "id": 113, + "type": { + "type": "d_mat_diffuse", + "color": "#3eae24" + } + }, + { + "name": "Mat 114", + "id": 114, + "type": { + "type": "d_mat_diffuse", + "color": "#1b8135" + } + }, + { + "name": "Mat 115", + "id": 115, + "type": { + "type": "d_mat_metal", + "color": "#c7a1e1", + "roughness": 0.24684846250777848 + } + }, + { + "name": "Mat 116", + "id": 116, + "type": { + "type": "d_mat_diffuse", + "color": "#412b0e" + } + }, + { + "name": "Mat 117", + "id": 117, + "type": { + "type": "d_mat_diffuse", + "color": "#3a335f" + } + }, + { + "name": "Mat 118", + "id": 118, + "type": { + "type": "d_mat_diffuse", + "color": "#251a03" + } + }, + { + "name": "Mat 119", + "id": 119, + "type": { + "type": "d_mat_diffuse", + "color": "#161102" + } + }, + { + "name": "Mat 120", + "id": 120, + "type": { + "type": "d_mat_diffuse", + "color": "#1c239f" + } + }, + { + "name": "Mat 121", + "id": 121, + "type": { + "type": "d_mat_diffuse", + "color": "#162a04" + } + }, + { + "name": "Mat 122", + "id": 122, + "type": { + "type": "d_mat_diffuse", + "color": "#60125e" + } + }, + { + "name": "Mat 123", + "id": 123, + "type": { + "type": "d_mat_metal", + "color": "#c7bbe0", + "roughness": 0.3483720431995513 + } + }, + { + "name": "Mat 124", + "id": 124, + "type": { + "type": "d_mat_diffuse", + "color": "#381ec4" + } + }, + { + "name": "Mat 125", + "id": 125, + "type": { + "type": "d_mat_diffuse", + "color": "#1c1b14" + } + }, + { + "name": "Mat 126", + "id": 126, + "type": { + "type": "d_mat_diffuse", + "color": "#073c0c" + } + }, + { + "name": "Mat 127", + "id": 127, + "type": { + "type": "d_mat_diffuse", + "color": "#521527" + } + }, + { + "name": "Mat 128", + "id": 128, + "type": { + "type": "d_mat_diffuse", + "color": "#4955b9" + } + }, + { + "name": "Mat 129", + "id": 129, + "type": { + "type": "d_mat_diffuse", + "color": "#0aae5f" + } + }, + { + "name": "Mat 130", + "id": 130, + "type": { + "type": "d_mat_diffuse", + "color": "#313007" + } + }, + { + "name": "Mat 131", + "id": 131, + "type": { + "type": "d_mat_diffuse", + "color": "#270c18" + } + }, + { + "name": "Mat 132", + "id": 132, + "type": { + "type": "d_mat_diffuse", + "color": "#31510a" + } + }, + { + "name": "Mat 133", + "id": 133, + "type": { + "type": "d_mat_diffuse", + "color": "#3408af" + } + }, + { + "name": "Mat 134", + "id": 134, + "type": { + "type": "d_mat_diffuse", + "color": "#200f40" + } + }, + { + "name": "Mat 135", + "id": 135, + "type": { + "type": "d_mat_diffuse", + "color": "#181c09" + } + }, + { + "name": "Mat 136", + "id": 136, + "type": { + "type": "d_mat_diffuse", + "color": "#098428" + } + }, + { + "name": "Mat 137", + "id": 137, + "type": { + "type": "d_mat_metal", + "color": "#cdaadb", + "roughness": 0.14364472974074427 + } + }, + { + "name": "Mat 138", + "id": 138, + "type": { + "type": "d_mat_metal", + "color": "#effa95", + "roughness": 0.48085565356763527 + } + }, + { + "name": "Mat 139", + "id": 139, + "type": { + "type": "d_mat_diffuse", + "color": "#11024c" + } + }, + { + "name": "Mat 140", + "id": 140, + "type": { + "type": "d_mat_diffuse", + "color": "#a81e71" + } + }, + { + "name": "Mat 141", + "id": 141, + "type": { + "type": "d_mat_diffuse", + "color": "#29051f" + } + }, + { + "name": "Mat 142", + "id": 142, + "type": { + "type": "d_mat_diffuse", + "color": "#620c60" + } + }, + { + "name": "Mat 143", + "id": 143, + "type": { + "type": "d_mat_diffuse", + "color": "#0400bd" + } + }, + { + "name": "Mat 144", + "id": 144, + "type": { + "type": "d_mat_diffuse", + "color": "#166733" + } + }, + { + "name": "Mat 145", + "id": 145, + "type": { + "type": "d_mat_diffuse", + "color": "#782da1" + } + }, + { + "name": "Mat 146", + "id": 146, + "type": { + "type": "d_mat_diffuse", + "color": "#38210d" + } + }, + { + "name": "Mat 147", + "id": 147, + "type": { + "type": "d_mat_diffuse", + "color": "#1ab808" + } + }, + { + "name": "Mat 148", + "id": 148, + "type": { + "type": "d_mat_diffuse", + "color": "#d8362a" + } + }, + { + "name": "Mat 149", + "id": 149, + "type": { + "type": "d_mat_diffuse", + "color": "#b68122" + } + }, + { + "name": "Mat 150", + "id": 150, + "type": { + "type": "d_mat_diffuse", + "color": "#093a22" + } + }, + { + "name": "Mat 151", + "id": 151, + "type": { + "type": "d_mat_diffuse", + "color": "#175f1e" + } + }, + { + "name": "Mat 152", + "id": 152, + "type": { + "type": "d_mat_diffuse", + "color": "#260a01" + } + }, + { + "name": "Mat 153", + "id": 153, + "type": { + "type": "d_mat_diffuse", + "color": "#216e03" + } + }, + { + "name": "Mat 154", + "id": 154, + "type": { + "type": "d_mat_diffuse", + "color": "#b91a49" + } + }, + { + "name": "Mat 155", + "id": 155, + "type": { + "type": "d_mat_diffuse", + "color": "#037800" + } + }, + { + "name": "Mat 156", + "id": 156, + "type": { + "type": "d_mat_diffuse", + "color": "#1101b6" + } + }, + { + "name": "Mat 157", + "id": 157, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 158", + "id": 158, + "type": { + "type": "d_mat_metal", + "color": "#bdd891", + "roughness": 0.36076034224440723 + } + }, + { + "name": "Mat 159", + "id": 159, + "type": { + "type": "d_mat_diffuse", + "color": "#2f232d" + } + }, + { + "name": "Mat 160", + "id": 160, + "type": { + "type": "d_mat_diffuse", + "color": "#2d0318" + } + }, + { + "name": "Mat 161", + "id": 161, + "type": { + "type": "d_mat_diffuse", + "color": "#6b385c" + } + }, + { + "name": "Mat 162", + "id": 162, + "type": { + "type": "d_mat_diffuse", + "color": "#a23f91" + } + }, + { + "name": "Mat 163", + "id": 163, + "type": { + "type": "d_mat_metal", + "color": "#e7a7a8", + "roughness": 0.47588580427253235 + } + }, + { + "name": "Mat 164", + "id": 164, + "type": { + "type": "d_mat_diffuse", + "color": "#0a5600" + } + }, + { + "name": "Mat 165", + "id": 165, + "type": { + "type": "d_mat_diffuse", + "color": "#2e0156" + } + }, + { + "name": "Mat 166", + "id": 166, + "type": { + "type": "d_mat_metal", + "color": "#f9cdde", + "roughness": 0.18491586953026584 + } + }, + { + "name": "Mat 167", + "id": 167, + "type": { + "type": "d_mat_metal", + "color": "#e382fe", + "roughness": 0.10771672750519978 + } + }, + { + "name": "Mat 168", + "id": 168, + "type": { + "type": "d_mat_diffuse", + "color": "#004e5c" + } + }, + { + "name": "Mat 169", + "id": 169, + "type": { + "type": "d_mat_diffuse", + "color": "#317050" + } + }, + { + "name": "Mat 170", + "id": 170, + "type": { + "type": "d_mat_diffuse", + "color": "#072506" + } + }, + { + "name": "Mat 171", + "id": 171, + "type": { + "type": "d_mat_diffuse", + "color": "#0302a6" + } + }, + { + "name": "Mat 172", + "id": 172, + "type": { + "type": "d_mat_diffuse", + "color": "#ce0f83" + } + }, + { + "name": "Mat 173", + "id": 173, + "type": { + "type": "d_mat_diffuse", + "color": "#05ca10" + } + }, + { + "name": "Mat 174", + "id": 174, + "type": { + "type": "d_mat_diffuse", + "color": "#080b48" + } + }, + { + "name": "Mat 175", + "id": 175, + "type": { + "type": "d_mat_diffuse", + "color": "#0d0069" + } + }, + { + "name": "Mat 176", + "id": 176, + "type": { + "type": "d_mat_diffuse", + "color": "#ad7cac" + } + }, + { + "name": "Mat 177", + "id": 177, + "type": { + "type": "d_mat_metal", + "color": "#d6fde1", + "roughness": 0.3717620089185151 + } + }, + { + "name": "Mat 178", + "id": 178, + "type": { + "type": "d_mat_metal", + "color": "#a6b9a5", + "roughness": 0.12820645983027534 + } + }, + { + "name": "Mat 179", + "id": 179, + "type": { + "type": "d_mat_diffuse", + "color": "#375e10" + } + }, + { + "name": "Mat 180", + "id": 180, + "type": { + "type": "d_mat_diffuse", + "color": "#1a1f3a" + } + }, + { + "name": "Mat 181", + "id": 181, + "type": { + "type": "d_mat_diffuse", + "color": "#2d1103" + } + }, + { + "name": "Mat 182", + "id": 182, + "type": { + "type": "d_mat_diffuse", + "color": "#22263b" + } + }, + { + "name": "Mat 183", + "id": 183, + "type": { + "type": "d_mat_diffuse", + "color": "#b1bbc7" + } + }, + { + "name": "Mat 184", + "id": 184, + "type": { + "type": "d_mat_diffuse", + "color": "#1a1394" + } + }, + { + "name": "Mat 185", + "id": 185, + "type": { + "type": "d_mat_metal", + "color": "#b88c9d", + "roughness": 0.13473334195081588 + } + }, + { + "name": "Mat 186", + "id": 186, + "type": { + "type": "d_mat_metal", + "color": "#cab39a", + "roughness": 0.2403643222684656 + } + }, + { + "name": "Mat 187", + "id": 187, + "type": { + "type": "d_mat_diffuse", + "color": "#6a6f16" + } + }, + { + "name": "Mat 188", + "id": 188, + "type": { + "type": "d_mat_diffuse", + "color": "#69a4e2" + } + }, + { + "name": "Mat 189", + "id": 189, + "type": { + "type": "d_mat_diffuse", + "color": "#66057f" + } + }, + { + "name": "Mat 190", + "id": 190, + "type": { + "type": "d_mat_diffuse", + "color": "#0f0f1d" + } + }, + { + "name": "Mat 191", + "id": 191, + "type": { + "type": "d_mat_diffuse", + "color": "#6d010a" + } + }, + { + "name": "Mat 192", + "id": 192, + "type": { + "type": "d_mat_diffuse", + "color": "#691116" + } + }, + { + "name": "Mat 193", + "id": 193, + "type": { + "type": "d_mat_diffuse", + "color": "#48063b" + } + }, + { + "name": "Mat 194", + "id": 194, + "type": { + "type": "d_mat_diffuse", + "color": "#240004" + } + }, + { + "name": "Mat 195", + "id": 195, + "type": { + "type": "d_mat_diffuse", + "color": "#9c4f93" + } + }, + { + "name": "Mat 196", + "id": 196, + "type": { + "type": "d_mat_diffuse", + "color": "#490e0e" + } + }, + { + "name": "Mat 197", + "id": 197, + "type": { + "type": "d_mat_diffuse", + "color": "#061316" + } + }, + { + "name": "Mat 198", + "id": 198, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 199", + "id": 199, + "type": { + "type": "d_mat_diffuse", + "color": "#1e4252" + } + }, + { + "name": "Mat 200", + "id": 200, + "type": { + "type": "d_mat_diffuse", + "color": "#02335c" + } + }, + { + "name": "Mat 201", + "id": 201, + "type": { + "type": "d_mat_diffuse", + "color": "#1b0553" + } + }, + { + "name": "Mat 202", + "id": 202, + "type": { + "type": "d_mat_diffuse", + "color": "#278312" + } + }, + { + "name": "Mat 203", + "id": 203, + "type": { + "type": "d_mat_diffuse", + "color": "#085065" + } + }, + { + "name": "Mat 204", + "id": 204, + "type": { + "type": "d_mat_diffuse", + "color": "#13225e" + } + }, + { + "name": "Mat 205", + "id": 205, + "type": { + "type": "d_mat_diffuse", + "color": "#56461d" + } + }, + { + "name": "Mat 206", + "id": 206, + "type": { + "type": "d_mat_diffuse", + "color": "#070969" + } + }, + { + "name": "Mat 207", + "id": 207, + "type": { + "type": "d_mat_diffuse", + "color": "#5e2038" + } + }, + { + "name": "Mat 208", + "id": 208, + "type": { + "type": "d_mat_diffuse", + "color": "#1e86c8" + } + }, + { + "name": "Mat 209", + "id": 209, + "type": { + "type": "d_mat_diffuse", + "color": "#b52b69" + } + }, + { + "name": "Mat 210", + "id": 210, + "type": { + "type": "d_mat_diffuse", + "color": "#3d2805" + } + }, + { + "name": "Mat 211", + "id": 211, + "type": { + "type": "d_mat_metal", + "color": "#b4e1c2", + "roughness": 0.09961005679281376 + } + }, + { + "name": "Mat 212", + "id": 212, + "type": { + "type": "d_mat_diffuse", + "color": "#8b106e" + } + }, + { + "name": "Mat 213", + "id": 213, + "type": { + "type": "d_mat_metal", + "color": "#fdb6ab", + "roughness": 0.3139140367204615 + } + }, + { + "name": "Mat 214", + "id": 214, + "type": { + "type": "d_mat_diffuse", + "color": "#6c4681" + } + }, + { + "name": "Mat 215", + "id": 215, + "type": { + "type": "d_mat_diffuse", + "color": "#411724" + } + }, + { + "name": "Mat 216", + "id": 216, + "type": { + "type": "d_mat_metal", + "color": "#c598b3", + "roughness": 0.4585120499441724 + } + }, + { + "name": "Mat 217", + "id": 217, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 218", + "id": 218, + "type": { + "type": "d_mat_diffuse", + "color": "#3e1b2f" + } + }, + { + "name": "Mat 219", + "id": 219, + "type": { + "type": "d_mat_metal", + "color": "#9daade", + "roughness": 0.34829278925620777 + } + }, + { + "name": "Mat 220", + "id": 220, + "type": { + "type": "d_mat_diffuse", + "color": "#3b56a6" + } + }, + { + "name": "Mat 221", + "id": 221, + "type": { + "type": "d_mat_diffuse", + "color": "#214d0c" + } + }, + { + "name": "Mat 222", + "id": 222, + "type": { + "type": "d_mat_diffuse", + "color": "#241e2f" + } + }, + { + "name": "Mat 223", + "id": 223, + "type": { + "type": "d_mat_diffuse", + "color": "#0583bd" + } + }, + { + "name": "Mat 224", + "id": 224, + "type": { + "type": "d_mat_metal", + "color": "#88d3cd", + "roughness": 0.03695166874920419 + } + }, + { + "name": "Mat 225", + "id": 225, + "type": { + "type": "d_mat_diffuse", + "color": "#027702" + } + }, + { + "name": "Mat 226", + "id": 226, + "type": { + "type": "d_mat_diffuse", + "color": "#0f0819" + } + }, + { + "name": "Mat 227", + "id": 227, + "type": { + "type": "d_mat_diffuse", + "color": "#001120" + } + }, + { + "name": "Mat 228", + "id": 228, + "type": { + "type": "d_mat_metal", + "color": "#a99dc9", + "roughness": 0.3814551486954151 + } + }, + { + "name": "Mat 229", + "id": 229, + "type": { + "type": "d_mat_metal", + "color": "#f6b7e5", + "roughness": 0.10642782109677273 + } + }, + { + "name": "Mat 230", + "id": 230, + "type": { + "type": "d_mat_diffuse", + "color": "#497517" + } + }, + { + "name": "Mat 231", + "id": 231, + "type": { + "type": "d_mat_metal", + "color": "#cfaceb", + "roughness": 0.18726765299008052 + } + }, + { + "name": "Mat 232", + "id": 232, + "type": { + "type": "d_mat_diffuse", + "color": "#123b2a" + } + }, + { + "name": "Mat 233", + "id": 233, + "type": { + "type": "d_mat_diffuse", + "color": "#b9700c" + } + }, + { + "name": "Mat 234", + "id": 234, + "type": { + "type": "d_mat_metal", + "color": "#a5fecb", + "roughness": 0.4377343373980076 + } + }, + { + "name": "Mat 235", + "id": 235, + "type": { + "type": "d_mat_diffuse", + "color": "#774145" + } + }, + { + "name": "Mat 236", + "id": 236, + "type": { + "type": "d_mat_diffuse", + "color": "#05b301" + } + }, + { + "name": "Mat 237", + "id": 237, + "type": { + "type": "d_mat_diffuse", + "color": "#223336" + } + }, + { + "name": "Mat 238", + "id": 238, + "type": { + "type": "d_mat_diffuse", + "color": "#010033" + } + }, + { + "name": "Mat 239", + "id": 239, + "type": { + "type": "d_mat_diffuse", + "color": "#5f0506" + } + }, + { + "name": "Mat 240", + "id": 240, + "type": { + "type": "d_mat_diffuse", + "color": "#092a36" + } + }, + { + "name": "Mat 241", + "id": 241, + "type": { + "type": "d_mat_diffuse", + "color": "#272c5d" + } + }, + { + "name": "Mat 242", + "id": 242, + "type": { + "type": "d_mat_diffuse", + "color": "#224022" + } + }, + { + "name": "Mat 243", + "id": 243, + "type": { + "type": "d_mat_diffuse", + "color": "#510f98" + } + }, + { + "name": "Mat 244", + "id": 244, + "type": { + "type": "d_mat_diffuse", + "color": "#2bab20" + } + }, + { + "name": "Mat 245", + "id": 245, + "type": { + "type": "d_mat_diffuse", + "color": "#5f1348" + } + }, + { + "name": "Mat 246", + "id": 246, + "type": { + "type": "d_mat_diffuse", + "color": "#051467" + } + }, + { + "name": "Mat 247", + "id": 247, + "type": { + "type": "d_mat_diffuse", + "color": "#43b10c" + } + }, + { + "name": "Mat 248", + "id": 248, + "type": { + "type": "d_mat_diffuse", + "color": "#430565" + } + }, + { + "name": "Mat 249", + "id": 249, + "type": { + "type": "d_mat_metal", + "color": "#be8dee", + "roughness": 0.2987395742267428 + } + }, + { + "name": "Mat 250", + "id": 250, + "type": { + "type": "d_mat_diffuse", + "color": "#45525b" + } + }, + { + "name": "Mat 251", + "id": 251, + "type": { + "type": "d_mat_metal", + "color": "#f3cb8c", + "roughness": 0.10001872422754543 + } + }, + { + "name": "Mat 252", + "id": 252, + "type": { + "type": "d_mat_metal", + "color": "#f484c1", + "roughness": 0.09798745718922919 + } + }, + { + "name": "Mat 253", + "id": 253, + "type": { + "type": "d_mat_diffuse", + "color": "#01541c" + } + }, + { + "name": "Mat 254", + "id": 254, + "type": { + "type": "d_mat_diffuse", + "color": "#3a1b41" + } + }, + { + "name": "Mat 255", + "id": 255, + "type": { + "type": "d_mat_diffuse", + "color": "#0a03c0" + } + }, + { + "name": "Mat 256", + "id": 256, + "type": { + "type": "d_mat_diffuse", + "color": "#957729" + } + }, + { + "name": "Mat 257", + "id": 257, + "type": { + "type": "d_mat_diffuse", + "color": "#0c2c5c" + } + }, + { + "name": "Mat 258", + "id": 258, + "type": { + "type": "d_mat_diffuse", + "color": "#353df4" + } + }, + { + "name": "Mat 259", + "id": 259, + "type": { + "type": "d_mat_diffuse", + "color": "#07031e" + } + }, + { + "name": "Mat 260", + "id": 260, + "type": { + "type": "d_mat_metal", + "color": "#82e0ea", + "roughness": 0.30933085273007155 + } + }, + { + "name": "Mat 261", + "id": 261, + "type": { + "type": "d_mat_metal", + "color": "#d0bea2", + "roughness": 0.133678278972568 + } + }, + { + "name": "Mat 262", + "id": 262, + "type": { + "type": "d_mat_diffuse", + "color": "#91c00f" + } + }, + { + "name": "Mat 263", + "id": 263, + "type": { + "type": "d_mat_diffuse", + "color": "#4a76c0" + } + }, + { + "name": "Mat 264", + "id": 264, + "type": { + "type": "d_mat_metal", + "color": "#ba86b2", + "roughness": 0.27296178876671895 + } + }, + { + "name": "Mat 265", + "id": 265, + "type": { + "type": "d_mat_diffuse", + "color": "#264c08" + } + }, + { + "name": "Mat 266", + "id": 266, + "type": { + "type": "d_mat_diffuse", + "color": "#002e6b" + } + }, + { + "name": "Mat 267", + "id": 267, + "type": { + "type": "d_mat_diffuse", + "color": "#2b2e12" + } + }, + { + "name": "Mat 268", + "id": 268, + "type": { + "type": "d_mat_diffuse", + "color": "#077816" + } + }, + { + "name": "Mat 269", + "id": 269, + "type": { + "type": "d_mat_diffuse", + "color": "#59022e" + } + }, + { + "name": "Mat 270", + "id": 270, + "type": { + "type": "d_mat_diffuse", + "color": "#1a022e" + } + }, + { + "name": "Mat 271", + "id": 271, + "type": { + "type": "d_mat_diffuse", + "color": "#641803" + } + }, + { + "name": "Mat 272", + "id": 272, + "type": { + "type": "d_mat_diffuse", + "color": "#056d18" + } + }, + { + "name": "Mat 273", + "id": 273, + "type": { + "type": "d_mat_diffuse", + "color": "#275b34" + } + }, + { + "name": "Mat 274", + "id": 274, + "type": { + "type": "d_mat_diffuse", + "color": "#01123f" + } + }, + { + "name": "Mat 275", + "id": 275, + "type": { + "type": "d_mat_diffuse", + "color": "#91130c" + } + }, + { + "name": "Mat 276", + "id": 276, + "type": { + "type": "d_mat_diffuse", + "color": "#040c58" + } + }, + { + "name": "Mat 277", + "id": 277, + "type": { + "type": "d_mat_diffuse", + "color": "#84892a" + } + }, + { + "name": "Mat 278", + "id": 278, + "type": { + "type": "d_mat_diffuse", + "color": "#721d27" + } + }, + { + "name": "Mat 279", + "id": 279, + "type": { + "type": "d_mat_diffuse", + "color": "#053b0c" + } + }, + { + "name": "Mat 280", + "id": 280, + "type": { + "type": "d_mat_diffuse", + "color": "#019a7f" + } + }, + { + "name": "Mat 281", + "id": 281, + "type": { + "type": "d_mat_diffuse", + "color": "#893339" + } + }, + { + "name": "Mat 282", + "id": 282, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 283", + "id": 283, + "type": { + "type": "d_mat_metal", + "color": "#d6b19c", + "roughness": 0.33087366626499115 + } + }, + { + "name": "Mat 284", + "id": 284, + "type": { + "type": "d_mat_diffuse", + "color": "#03752b" + } + }, + { + "name": "Mat 285", + "id": 285, + "type": { + "type": "d_mat_diffuse", + "color": "#111f21" + } + }, + { + "name": "Mat 286", + "id": 286, + "type": { + "type": "d_mat_diffuse", + "color": "#0e001a" + } + }, + { + "name": "Mat 287", + "id": 287, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 288", + "id": 288, + "type": { + "type": "d_mat_diffuse", + "color": "#162c6a" + } + }, + { + "name": "Mat 289", + "id": 289, + "type": { + "type": "d_mat_diffuse", + "color": "#060044" + } + }, + { + "name": "Mat 290", + "id": 290, + "type": { + "type": "d_mat_diffuse", + "color": "#5905a9" + } + }, + { + "name": "Mat 291", + "id": 291, + "type": { + "type": "d_mat_diffuse", + "color": "#021924" + } + }, + { + "name": "Mat 292", + "id": 292, + "type": { + "type": "d_mat_metal", + "color": "#ceaac8", + "roughness": 0.28397091246082684 + } + }, + { + "name": "Mat 293", + "id": 293, + "type": { + "type": "d_mat_diffuse", + "color": "#8e9137" + } + }, + { + "name": "Mat 294", + "id": 294, + "type": { + "type": "d_mat_diffuse", + "color": "#0f7007" + } + }, + { + "name": "Mat 295", + "id": 295, + "type": { + "type": "d_mat_diffuse", + "color": "#261245" + } + }, + { + "name": "Mat 296", + "id": 296, + "type": { + "type": "d_mat_diffuse", + "color": "#6b3b25" + } + }, + { + "name": "Mat 297", + "id": 297, + "type": { + "type": "d_mat_metal", + "color": "#c3fda4", + "roughness": 0.2016183028952896 + } + }, + { + "name": "Mat 298", + "id": 298, + "type": { + "type": "d_mat_diffuse", + "color": "#6d6e2d" + } + }, + { + "name": "Mat 299", + "id": 299, + "type": { + "type": "d_mat_diffuse", + "color": "#a64b41" + } + }, + { + "name": "Mat 300", + "id": 300, + "type": { + "type": "d_mat_diffuse", + "color": "#031603" + } + }, + { + "name": "Mat 301", + "id": 301, + "type": { + "type": "d_mat_diffuse", + "color": "#470917" + } + }, + { + "name": "Mat 302", + "id": 302, + "type": { + "type": "d_mat_metal", + "color": "#baf5bb", + "roughness": 0.0633874970416296 + } + }, + { + "name": "Mat 303", + "id": 303, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 304", + "id": 304, + "type": { + "type": "d_mat_diffuse", + "color": "#29000e" + } + }, + { + "name": "Mat 305", + "id": 305, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 306", + "id": 306, + "type": { + "type": "d_mat_diffuse", + "color": "#b18f65" + } + }, + { + "name": "Mat 307", + "id": 307, + "type": { + "type": "d_mat_diffuse", + "color": "#395b0d" + } + }, + { + "name": "Mat 308", + "id": 308, + "type": { + "type": "d_mat_diffuse", + "color": "#633569" + } + }, + { + "name": "Mat 309", + "id": 309, + "type": { + "type": "d_mat_diffuse", + "color": "#160975" + } + }, + { + "name": "Mat 310", + "id": 310, + "type": { + "type": "d_mat_diffuse", + "color": "#93114d" + } + }, + { + "name": "Mat 311", + "id": 311, + "type": { + "type": "d_mat_diffuse", + "color": "#0c0700" + } + }, + { + "name": "Mat 312", + "id": 312, + "type": { + "type": "d_mat_diffuse", + "color": "#0c2e7a" + } + }, + { + "name": "Mat 313", + "id": 313, + "type": { + "type": "d_mat_diffuse", + "color": "#410f01" + } + }, + { + "name": "Mat 314", + "id": 314, + "type": { + "type": "d_mat_diffuse", + "color": "#05182f" + } + }, + { + "name": "Mat 315", + "id": 315, + "type": { + "type": "d_mat_diffuse", + "color": "#0b0e81" + } + }, + { + "name": "Mat 316", + "id": 316, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 317", + "id": 317, + "type": { + "type": "d_mat_diffuse", + "color": "#31547b" + } + }, + { + "name": "Mat 318", + "id": 318, + "type": { + "type": "d_mat_diffuse", + "color": "#18053e" + } + }, + { + "name": "Mat 319", + "id": 319, + "type": { + "type": "d_mat_diffuse", + "color": "#883e35" + } + }, + { + "name": "Mat 320", + "id": 320, + "type": { + "type": "d_mat_diffuse", + "color": "#bbbb07" + } + }, + { + "name": "Mat 321", + "id": 321, + "type": { + "type": "d_mat_diffuse", + "color": "#a5383e" + } + }, + { + "name": "Mat 322", + "id": 322, + "type": { + "type": "d_mat_diffuse", + "color": "#4d0803" + } + }, + { + "name": "Mat 323", + "id": 323, + "type": { + "type": "d_mat_diffuse", + "color": "#211a07" + } + }, + { + "name": "Mat 324", + "id": 324, + "type": { + "type": "d_mat_diffuse", + "color": "#2bd8aa" + } + }, + { + "name": "Mat 325", + "id": 325, + "type": { + "type": "d_mat_diffuse", + "color": "#25176f" + } + }, + { + "name": "Mat 326", + "id": 326, + "type": { + "type": "d_mat_diffuse", + "color": "#00202d" + } + }, + { + "name": "Mat 327", + "id": 327, + "type": { + "type": "d_mat_diffuse", + "color": "#49d903" + } + }, + { + "name": "Mat 328", + "id": 328, + "type": { + "type": "d_mat_diffuse", + "color": "#1f76cc" + } + }, + { + "name": "Mat 329", + "id": 329, + "type": { + "type": "d_mat_metal", + "color": "#e9c5eb", + "roughness": 0.22610394455047778 + } + }, + { + "name": "Mat 330", + "id": 330, + "type": { + "type": "d_mat_diffuse", + "color": "#894020" + } + }, + { + "name": "Mat 331", + "id": 331, + "type": { + "type": "d_mat_diffuse", + "color": "#0a3683" + } + }, + { + "name": "Mat 332", + "id": 332, + "type": { + "type": "d_mat_diffuse", + "color": "#8d9108" + } + }, + { + "name": "Mat 333", + "id": 333, + "type": { + "type": "d_mat_diffuse", + "color": "#af290c" + } + }, + { + "name": "Mat 334", + "id": 334, + "type": { + "type": "d_mat_metal", + "color": "#fdafae", + "roughness": 0.2826546175407779 + } + }, + { + "name": "Mat 335", + "id": 335, + "type": { + "type": "d_mat_diffuse", + "color": "#125c25" + } + }, + { + "name": "Mat 336", + "id": 336, + "type": { + "type": "d_mat_diffuse", + "color": "#314d07" + } + }, + { + "name": "Mat 337", + "id": 337, + "type": { + "type": "d_mat_diffuse", + "color": "#15576f" + } + }, + { + "name": "Mat 338", + "id": 338, + "type": { + "type": "d_mat_metal", + "color": "#85e3de", + "roughness": 0.2812338455379655 + } + }, + { + "name": "Mat 339", + "id": 339, + "type": { + "type": "d_mat_diffuse", + "color": "#1c2639" + } + }, + { + "name": "Mat 340", + "id": 340, + "type": { + "type": "d_mat_diffuse", + "color": "#0e5510" + } + }, + { + "name": "Mat 341", + "id": 341, + "type": { + "type": "d_mat_diffuse", + "color": "#0b066d" + } + }, + { + "name": "Mat 342", + "id": 342, + "type": { + "type": "d_mat_diffuse", + "color": "#170917" + } + }, + { + "name": "Mat 343", + "id": 343, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 344", + "id": 344, + "type": { + "type": "d_mat_diffuse", + "color": "#032f44" + } + }, + { + "name": "Mat 345", + "id": 345, + "type": { + "type": "d_mat_diffuse", + "color": "#2f2b6c" + } + }, + { + "name": "Mat 346", + "id": 346, + "type": { + "type": "d_mat_diffuse", + "color": "#1c328d" + } + }, + { + "name": "Mat 347", + "id": 347, + "type": { + "type": "d_mat_metal", + "color": "#a5fed5", + "roughness": 0.04498072071534409 + } + }, + { + "name": "Mat 348", + "id": 348, + "type": { + "type": "d_mat_diffuse", + "color": "#9a2a57" + } + }, + { + "name": "Mat 349", + "id": 349, + "type": { + "type": "d_mat_diffuse", + "color": "#55622a" + } + }, + { + "name": "Mat 350", + "id": 350, + "type": { + "type": "d_mat_diffuse", + "color": "#0b5a0e" + } + }, + { + "name": "Mat 351", + "id": 351, + "type": { + "type": "d_mat_diffuse", + "color": "#2a7853" + } + }, + { + "name": "Mat 352", + "id": 352, + "type": { + "type": "d_mat_diffuse", + "color": "#85012c" + } + }, + { + "name": "Mat 353", + "id": 353, + "type": { + "type": "d_mat_diffuse", + "color": "#0d3688" + } + }, + { + "name": "Mat 354", + "id": 354, + "type": { + "type": "d_mat_diffuse", + "color": "#1a5710" + } + }, + { + "name": "Mat 355", + "id": 355, + "type": { + "type": "d_mat_diffuse", + "color": "#e16f6d" + } + }, + { + "name": "Mat 356", + "id": 356, + "type": { + "type": "d_mat_diffuse", + "color": "#48081b" + } + }, + { + "name": "Mat 357", + "id": 357, + "type": { + "type": "d_mat_metal", + "color": "#f2e6dd", + "roughness": 0.266568064124054 + } + }, + { + "name": "Mat 358", + "id": 358, + "type": { + "type": "d_mat_diffuse", + "color": "#022b03" + } + }, + { + "name": "Mat 359", + "id": 359, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 360", + "id": 360, + "type": { + "type": "d_mat_diffuse", + "color": "#049873" + } + }, + { + "name": "Mat 361", + "id": 361, + "type": { + "type": "d_mat_diffuse", + "color": "#3feb36" + } + }, + { + "name": "Mat 362", + "id": 362, + "type": { + "type": "d_mat_diffuse", + "color": "#950d05" + } + }, + { + "name": "Mat 363", + "id": 363, + "type": { + "type": "d_mat_diffuse", + "color": "#5c914a" + } + }, + { + "name": "Mat 364", + "id": 364, + "type": { + "type": "d_mat_metal", + "color": "#9697d0", + "roughness": 0.3653580640826113 + } + }, + { + "name": "Mat 365", + "id": 365, + "type": { + "type": "d_mat_diffuse", + "color": "#39194d" + } + }, + { + "name": "Mat 366", + "id": 366, + "type": { + "type": "d_mat_diffuse", + "color": "#14471a" + } + }, + { + "name": "Mat 367", + "id": 367, + "type": { + "type": "d_mat_metal", + "color": "#bdd996", + "roughness": 0.26073986951564276 + } + }, + { + "name": "Mat 368", + "id": 368, + "type": { + "type": "d_mat_metal", + "color": "#d3cef9", + "roughness": 0.2786083156414041 + } + }, + { + "name": "Mat 369", + "id": 369, + "type": { + "type": "d_mat_metal", + "color": "#bf90c1", + "roughness": 0.4506386074043075 + } + }, + { + "name": "Mat 370", + "id": 370, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 371", + "id": 371, + "type": { + "type": "d_mat_diffuse", + "color": "#590e10" + } + }, + { + "name": "Mat 372", + "id": 372, + "type": { + "type": "d_mat_diffuse", + "color": "#09110e" + } + }, + { + "name": "Mat 373", + "id": 373, + "type": { + "type": "d_mat_diffuse", + "color": "#745407" + } + }, + { + "name": "Mat 374", + "id": 374, + "type": { + "type": "d_mat_diffuse", + "color": "#460d46" + } + }, + { + "name": "Mat 375", + "id": 375, + "type": { + "type": "d_mat_diffuse", + "color": "#0f5b09" + } + }, + { + "name": "Mat 376", + "id": 376, + "type": { + "type": "d_mat_diffuse", + "color": "#04600b" + } + }, + { + "name": "Mat 377", + "id": 377, + "type": { + "type": "d_mat_diffuse", + "color": "#254531" + } + }, + { + "name": "Mat 378", + "id": 378, + "type": { + "type": "d_mat_metal", + "color": "#d6aeb7", + "roughness": 0.04637182673004214 + } + }, + { + "name": "Mat 379", + "id": 379, + "type": { + "type": "d_mat_diffuse", + "color": "#5d11cf" + } + }, + { + "name": "Mat 380", + "id": 380, + "type": { + "type": "d_mat_diffuse", + "color": "#1d000f" + } + }, + { + "name": "Mat 381", + "id": 381, + "type": { + "type": "d_mat_diffuse", + "color": "#0030c4" + } + }, + { + "name": "Mat 382", + "id": 382, + "type": { + "type": "d_mat_diffuse", + "color": "#388315" + } + }, + { + "name": "Mat 383", + "id": 383, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 384", + "id": 384, + "type": { + "type": "d_mat_diffuse", + "color": "#b10228" + } + }, + { + "name": "Mat 385", + "id": 385, + "type": { + "type": "d_mat_diffuse", + "color": "#0c3807" + } + }, + { + "name": "Mat 386", + "id": 386, + "type": { + "type": "d_mat_diffuse", + "color": "#0db064" + } + }, + { + "name": "Mat 387", + "id": 387, + "type": { + "type": "d_mat_diffuse", + "color": "#4e090d" + } + }, + { + "name": "Mat 388", + "id": 388, + "type": { + "type": "d_mat_diffuse", + "color": "#b90121" + } + }, + { + "name": "Mat 389", + "id": 389, + "type": { + "type": "d_mat_metal", + "color": "#9ad8d0", + "roughness": 0.08903391576286401 + } + }, + { + "name": "Mat 390", + "id": 390, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 391", + "id": 391, + "type": { + "type": "d_mat_diffuse", + "color": "#5f4d6a" + } + }, + { + "name": "Mat 392", + "id": 392, + "type": { + "type": "d_mat_diffuse", + "color": "#025074" + } + }, + { + "name": "Mat 393", + "id": 393, + "type": { + "type": "d_mat_diffuse", + "color": "#091d3b" + } + }, + { + "name": "Mat 394", + "id": 394, + "type": { + "type": "d_mat_diffuse", + "color": "#5a3409" + } + }, + { + "name": "Mat 395", + "id": 395, + "type": { + "type": "d_mat_metal", + "color": "#8dd5e0", + "roughness": 0.44956776852841396 + } + }, + { + "name": "Mat 396", + "id": 396, + "type": { + "type": "d_mat_diffuse", + "color": "#545e08" + } + }, + { + "name": "Mat 397", + "id": 397, + "type": { + "type": "d_mat_diffuse", + "color": "#194b22" + } + }, + { + "name": "Mat 398", + "id": 398, + "type": { + "type": "d_mat_diffuse", + "color": "#0b1810" + } + }, + { + "name": "Mat 399", + "id": 399, + "type": { + "type": "d_mat_diffuse", + "color": "#0d2110" + } + }, + { + "name": "Mat 400", + "id": 400, + "type": { + "type": "d_mat_diffuse", + "color": "#0c2006" + } + }, + { + "name": "Mat 401", + "id": 401, + "type": { + "type": "d_mat_metal", + "color": "#dff796", + "roughness": 0.28383453552089044 + } + }, + { + "name": "Mat 402", + "id": 402, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 403", + "id": 403, + "type": { + "type": "d_mat_diffuse", + "color": "#4c0537" + } + }, + { + "name": "Mat 404", + "id": 404, + "type": { + "type": "d_mat_diffuse", + "color": "#5e0f84" + } + }, + { + "name": "Mat 405", + "id": 405, + "type": { + "type": "d_mat_diffuse", + "color": "#33370a" + } + }, + { + "name": "Mat 406", + "id": 406, + "type": { + "type": "d_mat_metal", + "color": "#85bcc6", + "roughness": 0.12585769400663915 + } + }, + { + "name": "Mat 407", + "id": 407, + "type": { + "type": "d_mat_diffuse", + "color": "#5f7133" + } + }, + { + "name": "Mat 408", + "id": 408, + "type": { + "type": "d_mat_metal", + "color": "#bde4b0", + "roughness": 0.055524808621592814 + } + }, + { + "name": "Mat 409", + "id": 409, + "type": { + "type": "d_mat_diffuse", + "color": "#222a9d" + } + }, + { + "name": "Mat 410", + "id": 410, + "type": { + "type": "d_mat_diffuse", + "color": "#30b80a" + } + }, + { + "name": "Mat 411", + "id": 411, + "type": { + "type": "d_mat_diffuse", + "color": "#2c0341" + } + }, + { + "name": "Mat 412", + "id": 412, + "type": { + "type": "d_mat_diffuse", + "color": "#0d7705" + } + }, + { + "name": "Mat 413", + "id": 413, + "type": { + "type": "d_mat_diffuse", + "color": "#332ea9" + } + }, + { + "name": "Mat 414", + "id": 414, + "type": { + "type": "d_mat_diffuse", + "color": "#1e0800" + } + }, + { + "name": "Mat 415", + "id": 415, + "type": { + "type": "d_mat_metal", + "color": "#c4e2c5", + "roughness": 0.05212058545513687 + } + }, + { + "name": "Mat 416", + "id": 416, + "type": { + "type": "d_mat_diffuse", + "color": "#022e1c" + } + }, + { + "name": "Mat 417", + "id": 417, + "type": { + "type": "d_mat_diffuse", + "color": "#29b957" + } + }, + { + "name": "Mat 418", + "id": 418, + "type": { + "type": "d_mat_metal", + "color": "#a0cbe0", + "roughness": 0.04081227250459796 + } + }, + { + "name": "Mat 419", + "id": 419, + "type": { + "type": "d_mat_diffuse", + "color": "#241233" + } + }, + { + "name": "Mat 420", + "id": 420, + "type": { + "type": "d_mat_diffuse", + "color": "#5c124c" + } + }, + { + "name": "Mat 421", + "id": 421, + "type": { + "type": "d_mat_metal", + "color": "#dae5b5", + "roughness": 0.2960048430387844 + } + }, + { + "name": "Mat 422", + "id": 422, + "type": { + "type": "d_mat_diffuse", + "color": "#5f241c" + } + }, + { + "name": "Mat 423", + "id": 423, + "type": { + "type": "d_mat_metal", + "color": "#c6d0b0", + "roughness": 0.22445462307438202 + } + }, + { + "name": "Mat 424", + "id": 424, + "type": { + "type": "d_mat_diffuse", + "color": "#1b031e" + } + }, + { + "name": "Mat 425", + "id": 425, + "type": { + "type": "d_mat_metal", + "color": "#d88899", + "roughness": 0.1607200168370052 + } + }, + { + "name": "Mat 426", + "id": 426, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 427", + "id": 427, + "type": { + "type": "d_mat_diffuse", + "color": "#86ab0d" + } + }, + { + "name": "Mat 428", + "id": 428, + "type": { + "type": "d_mat_diffuse", + "color": "#502e23" + } + }, + { + "name": "Mat 429", + "id": 429, + "type": { + "type": "d_mat_diffuse", + "color": "#510202" + } + }, + { + "name": "Mat 430", + "id": 430, + "type": { + "type": "d_mat_metal", + "color": "#ae8cb7", + "roughness": 0.049292531242822624 + } + }, + { + "name": "Mat 431", + "id": 431, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 432", + "id": 432, + "type": { + "type": "d_mat_metal", + "color": "#9af2b5", + "roughness": 0.32811100357008294 + } + }, + { + "name": "Mat 433", + "id": 433, + "type": { + "type": "d_mat_diffuse", + "color": "#09543b" + } + }, + { + "name": "Mat 434", + "id": 434, + "type": { + "type": "d_mat_diffuse", + "color": "#3d4b5a" + } + }, + { + "name": "Mat 435", + "id": 435, + "type": { + "type": "d_mat_diffuse", + "color": "#e07b0a" + } + }, + { + "name": "Mat 436", + "id": 436, + "type": { + "type": "d_mat_diffuse", + "color": "#4b1b28" + } + }, + { + "name": "Mat 437", + "id": 437, + "type": { + "type": "d_mat_diffuse", + "color": "#30676d" + } + }, + { + "name": "Mat 438", + "id": 438, + "type": { + "type": "d_mat_diffuse", + "color": "#8f5a1a" + } + }, + { + "name": "Mat 439", + "id": 439, + "type": { + "type": "d_mat_diffuse", + "color": "#5c9723" + } + }, + { + "name": "Mat 440", + "id": 440, + "type": { + "type": "d_mat_metal", + "color": "#cbf8c2", + "roughness": 0.3728163713415784 + } + }, + { + "name": "Mat 441", + "id": 441, + "type": { + "type": "d_mat_diffuse", + "color": "#000d7b" + } + }, + { + "name": "Mat 442", + "id": 442, + "type": { + "type": "d_mat_diffuse", + "color": "#b81607" + } + }, + { + "name": "Mat 443", + "id": 443, + "type": { + "type": "d_mat_diffuse", + "color": "#960188" + } + }, + { + "name": "Mat 444", + "id": 444, + "type": { + "type": "d_mat_diffuse", + "color": "#357409" + } + }, + { + "name": "Mat 445", + "id": 445, + "type": { + "type": "d_mat_diffuse", + "color": "#122141" + } + }, + { + "name": "Mat 446", + "id": 446, + "type": { + "type": "d_mat_diffuse", + "color": "#05307c" + } + }, + { + "name": "Mat 447", + "id": 447, + "type": { + "type": "d_mat_metal", + "color": "#b78390", + "roughness": 0.14345237150581935 + } + }, + { + "name": "Mat 448", + "id": 448, + "type": { + "type": "d_mat_diffuse", + "color": "#08c331" + } + }, + { + "name": "Mat 449", + "id": 449, + "type": { + "type": "d_mat_diffuse", + "color": "#601b01" + } + }, + { + "name": "Mat 450", + "id": 450, + "type": { + "type": "d_mat_diffuse", + "color": "#00ab55" + } + }, + { + "name": "Mat 451", + "id": 451, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 452", + "id": 452, + "type": { + "type": "d_mat_diffuse", + "color": "#166603" + } + }, + { + "name": "Mat 453", + "id": 453, + "type": { + "type": "d_mat_diffuse", + "color": "#861114" + } + }, + { + "name": "Mat 454", + "id": 454, + "type": { + "type": "d_mat_diffuse", + "color": "#074f11" + } + }, + { + "name": "Mat 455", + "id": 455, + "type": { + "type": "d_mat_diffuse", + "color": "#491203" + } + }, + { + "name": "Mat 456", + "id": 456, + "type": { + "type": "d_mat_diffuse", + "color": "#099391" + } + }, + { + "name": "Mat 457", + "id": 457, + "type": { + "type": "d_mat_diffuse", + "color": "#0e070d" + } + }, + { + "name": "Mat 458", + "id": 458, + "type": { + "type": "d_mat_metal", + "color": "#b0c89a", + "roughness": 0.3750580193988643 + } + }, + { + "name": "Mat 459", + "id": 459, + "type": { + "type": "d_mat_diffuse", + "color": "#8b0657" + } + }, + { + "name": "Mat 460", + "id": 460, + "type": { + "type": "d_mat_diffuse", + "color": "#252137" + } + }, + { + "name": "Mat 461", + "id": 461, + "type": { + "type": "d_mat_metal", + "color": "#a4a5b3", + "roughness": 0.4830906288370498 + } + }, + { + "name": "Mat 462", + "id": 462, + "type": { + "type": "d_mat_diffuse", + "color": "#a74d93" + } + }, + { + "name": "Mat 463", + "id": 463, + "type": { + "type": "d_mat_metal", + "color": "#b5dccb", + "roughness": 0.1319863427932213 + } + }, + { + "name": "Mat 464", + "id": 464, + "type": { + "type": "d_mat_diffuse", + "color": "#244f00" + } + }, + { + "name": "Mat 465", + "id": 465, + "type": { + "type": "d_mat_diffuse", + "color": "#4b735a" + } + }, + { + "name": "Mat 466", + "id": 466, + "type": { + "type": "d_mat_diffuse", + "color": "#400f0f" + } + }, + { + "name": "Mat 467", + "id": 467, + "type": { + "type": "d_mat_diffuse", + "color": "#32034e" + } + }, + { + "name": "Mat 468", + "id": 468, + "type": { + "type": "d_mat_diffuse", + "color": "#763473" + } + }, + { + "name": "Mat 469", + "id": 469, + "type": { + "type": "d_mat_diffuse", + "color": "#220744" + } + }, + { + "name": "Mat 470", + "id": 470, + "type": { + "type": "d_mat_diffuse", + "color": "#10991e" + } + }, + { + "name": "Mat 471", + "id": 471, + "type": { + "type": "d_mat_diffuse", + "color": "#044b0c" + } + }, + { + "name": "Mat 472", + "id": 472, + "type": { + "type": "d_mat_diffuse", + "color": "#3f0246" + } + }, + { + "name": "Mat 473", + "id": 473, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 474", + "id": 474, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 475", + "id": 475, + "type": { + "type": "d_mat_metal", + "color": "#e18190", + "roughness": 0.28289018241349817 + } + }, + { + "name": "Mat 476", + "id": 476, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 477", + "id": 477, + "type": { + "type": "d_mat_diffuse", + "color": "#5e7a0d" + } + }, + { + "name": "Mat 478", + "id": 478, + "type": { + "type": "d_mat_metal", + "color": "#8bd9a7", + "roughness": 0.014358275646711771 + } + }, + { + "name": "Mat 479", + "id": 479, + "type": { + "type": "d_mat_diffuse", + "color": "#0c0414" + } + }, + { + "name": "Mat 480", + "id": 480, + "type": { + "type": "d_mat_diffuse", + "color": "#358b12" + } + }, + { + "name": "Mat 481", + "id": 481, + "type": { + "type": "d_mat_diffuse", + "color": "#39520d" + } + }, + { + "name": "Mat 482", + "id": 482, + "type": { + "type": "d_mat_dielectric", + "ior": 1.5 + } + }, + { + "name": "Mat 483", + "id": 483, + "type": { + "type": "d_mat_diffuse", + "color": "#663319" + } + }, + { + "name": "Mat 484", + "id": 484, + "type": { + "type": "d_mat_metal", + "color": "#b2997f", + "roughness": 0 + } + } + ], + "camera": { + "look_from": [ + 13, + 2, + 3 + ], + "look_at": [ + 0, + 0, + 0 + ], + "v_up": [ + 0, + 1, + 0 + ], + "v_fov": 20, + "dof_angle": 0.6, + "dof_distance": 10 + }, + "render_settings": { + "width": 1920, + "height": 1080, + "samples": 64, + "bounces": 12, + "tile_size": { + "type": "d_tile_size", + "size": 256 + } + } +} \ No newline at end of file diff --git a/src/data/webray.editor.json b/src/data/webray.editor.json index e1091ec..0db1e8a 100644 --- a/src/data/webray.editor.json +++ b/src/data/webray.editor.json @@ -169,7 +169,7 @@ "label": "Position", "tooltip": "", "type": "vec3f", - "initial": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "initial": [0.0, 0.0, 0.0], "meta": {} }, { @@ -233,7 +233,7 @@ "label": "Look From", "tooltip": "", "type": "vec3f", - "initial": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "initial": [0.0, 0.0, 0.0], "meta": {} }, { @@ -241,7 +241,7 @@ "label": "Look At", "tooltip": "", "type": "vec3f", - "initial": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "initial": [0.0, 0.0, 0.0], "meta": {} }, { @@ -249,7 +249,7 @@ "label": "Camera Up", "tooltip": "", "type": "vec3f", - "initial": { "x": 0.0, "y": 0.0, "z": 0.0 }, + "initial": [0.0, 0.0, 0.0], "meta": {} }, { diff --git a/src/lib/actions/list.ts b/src/lib/actions/list.ts index 4b57c4c..16a5e53 100644 --- a/src/lib/actions/list.ts +++ b/src/lib/actions/list.ts @@ -1,10 +1,9 @@ import scene from '../store/scene.store'; export function a_add_list_item(params: { bind_path: string }) { - scene.add_list_item(params.bind_path); + scene.add_list_item(params.bind_path); } export function a_del_list_item(params: { bind_path: string }) { - scene.del_list_item(params.bind_path); + scene.del_list_item(params.bind_path); } - diff --git a/src/lib/actions/render.ts b/src/lib/actions/render.ts index 8904f8d..cde96c0 100644 --- a/src/lib/actions/render.ts +++ b/src/lib/actions/render.ts @@ -1,5 +1,9 @@ import scene from '$lib/store/scene.store'; +import { render } from '$lib/wasm/webray'; +import { editorStore } from '../store/editor.store'; +import { KernelState } from '../types'; export function a_render() { - console.log(scene.current); + editorStore.update_kernel_state(KernelState.RENDERING) + render(scene.current).then(() => editorStore.update_kernel_state(KernelState.DONE)); } diff --git a/src/lib/components/data/WebrayDataView.svelte b/src/lib/components/data/WebrayDataView.svelte index 69ea2d9..dff4091 100644 --- a/src/lib/components/data/WebrayDataView.svelte +++ b/src/lib/components/data/WebrayDataView.svelte @@ -12,7 +12,7 @@ {#if _data_type.properties.length !== 0}
- + {#each _data_type.properties as property (`${bind_path}:${prop_prefix}:${property.name}`)} {/each} diff --git a/src/lib/components/data/WebrayListDataView.svelte b/src/lib/components/data/WebrayListDataView.svelte index 45cde3d..f8e4c0f 100644 --- a/src/lib/components/data/WebrayListDataView.svelte +++ b/src/lib/components/data/WebrayListDataView.svelte @@ -15,7 +15,10 @@

ID: {item.id}

-
diff --git a/src/lib/components/data/inputs/vec3f.svelte b/src/lib/components/data/inputs/vec3f.svelte index 055d49b..29aef5f 100644 --- a/src/lib/components/data/inputs/vec3f.svelte +++ b/src/lib/components/data/inputs/vec3f.svelte @@ -2,7 +2,7 @@ import type { WebrayProperty } from '../../../editor'; import scene from '$lib/store/scene.store'; import type { vec3f } from '../../../types'; - import { writable_derived } from '../../../store/writable-derived.store'; + import { writable_indexed_derived } from '../../../store/writable-derived.store'; export let property: WebrayProperty; export let prop_prefix: string; @@ -12,9 +12,9 @@ const store = scene.bind(bind_path, prop_path); - const x_val = writable_derived(store, 'x'); - const y_val = writable_derived(store, 'y'); - const z_val = writable_derived(store, 'z'); + const x_val = writable_indexed_derived(store, 0, 'vec3f[0]'); + const y_val = writable_indexed_derived(store, 1, 'vec3f[1]'); + const z_val = writable_indexed_derived(store, 2, 'vec3f[2]'); diff --git a/src/lib/components/window/WebrayWindow.svelte b/src/lib/components/window/WebrayWindow.svelte index 2662a13..15c745b 100644 --- a/src/lib/components/window/WebrayWindow.svelte +++ b/src/lib/components/window/WebrayWindow.svelte @@ -16,6 +16,11 @@
{#if win.data.type === 'list'} - + {/if} diff --git a/src/lib/editor/webray.constants.ts b/src/lib/editor/webray.constants.ts index 2343833..8e279f3 100644 --- a/src/lib/editor/webray.constants.ts +++ b/src/lib/editor/webray.constants.ts @@ -27,4 +27,4 @@ export const ID = { export const BindDataMap = { objects: 'd_obj', materials: 'd_material' -} \ No newline at end of file +}; diff --git a/src/lib/editor/webray.editor.ts b/src/lib/editor/webray.editor.ts index 8df9702..f6a8d3d 100644 --- a/src/lib/editor/webray.editor.ts +++ b/src/lib/editor/webray.editor.ts @@ -55,9 +55,9 @@ export class WebrayEditor { if (c.type === 'data_select') { const nested_obj = WebrayEditor.getDefaultObj(c.initial); nested_obj['type'] = c.initial; - return {...p, [c.name]: nested_obj }; + return { ...p, [c.name]: nested_obj }; } else { - return {...p, [c.name]: c.initial}; + return { ...p, [c.name]: c.initial }; } }, {}); } diff --git a/src/lib/store/editor.store.ts b/src/lib/store/editor.store.ts new file mode 100644 index 0000000..ae25949 --- /dev/null +++ b/src/lib/store/editor.store.ts @@ -0,0 +1,25 @@ +import { writable } from "svelte/store"; +import { KernelState } from "../types"; + +export interface WebrayEditorState { + kernel_state: KernelState; +} + +function createWebrayEditorStore() { + const { subscribe, update } = writable({kernel_state: KernelState.INITIAL}); + + const update_kernel_state = (kernel_state: KernelState) => { + update((state) => { + return { ...state, kernel_state: kernel_state }; + }) + } + + return { + subscribe, + update_kernel_state + }; +} + +const store = createWebrayEditorStore(); + +export const editorStore = store; \ No newline at end of file diff --git a/src/lib/store/scene.store.ts b/src/lib/store/scene.store.ts index 648a37c..490d4d7 100644 --- a/src/lib/store/scene.store.ts +++ b/src/lib/store/scene.store.ts @@ -3,15 +3,17 @@ import { get_prop, set_prop } from '../utils/object.extensions'; import type { WebrayScene } from '../editor/webray.scene'; import { get_id_prop, set_index_prop } from '../utils/array.extensions'; -import _demo_json from '../../data/demo_01.scene.json'; import { tick } from 'svelte'; import { BindDataMap, WebrayEditor } from '../editor'; +import _demo_json from '../../data/demo_01.scene.json'; + export class SceneStore { private store; constructor() { - this.store = writable(_demo_json); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.store = writable(_demo_json as any); } public get current() { @@ -23,7 +25,7 @@ export class SceneStore { const data_type = BindDataMap[bind_path as keyof typeof BindDataMap]; const item = WebrayEditor.getDefaultObj(data_type); - this.store.update(state => { + this.store.update((state) => { const change = { ...state }; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -40,13 +42,16 @@ export class SceneStore { public del_list_item(path: string) { const bind = SceneStore.get_binding_path_with_index(path); - this.store.update(state => { + this.store.update((state) => { const change = { ...state }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const list = change[bind.path as keyof WebrayScene] as any[]; - list.splice(list.findIndex(val => val.id === bind.id), 1); + list.splice( + list.findIndex((val) => val.id === bind.id), + 1 + ); return change; }); @@ -55,7 +60,7 @@ export class SceneStore { public derived(path: string): Readable { const bind_path = SceneStore.get_binding_path(path); - return derived(this.store, state => { + return derived(this.store, (state) => { const data = state[bind_path as keyof WebrayScene] as T; return data; @@ -103,7 +108,7 @@ export class SceneStore { console.error(`bind subscribe failed!, bind path: ${bind_path}, property: ${property}`); console.error(data); } - }) + }); } return prop; @@ -152,7 +157,7 @@ export class SceneStore { // TODO: This is a dirty hacky fix :P // re-check next micro tick as it maybe fixed by re-set validator tick().then(() => { - if (data.find(val => val.id === bind_index) === undefined) { + if (data.find((val) => val.id === bind_index) === undefined) { // console.warn('Item does not exist'); // console.warn(data); return; @@ -212,7 +217,7 @@ export class SceneStore { return parts[2].split('[')[0]; } - public static get_binding_path_with_index(bind_path: string): { path: string, id: number } { + public static get_binding_path_with_index(bind_path: string): { path: string; id: number } { const parts = bind_path.split(':'); return { diff --git a/src/lib/store/writable-derived.store.ts b/src/lib/store/writable-derived.store.ts index b751022..bb83fdd 100644 --- a/src/lib/store/writable-derived.store.ts +++ b/src/lib/store/writable-derived.store.ts @@ -17,7 +17,7 @@ export function writable_derived(store: Writable, property: string, nam console.error(`${name}: bind subscribe failed!, property: ${property}`); console.error(state); } - }) + }); } return prop; // ts sorcery @@ -29,7 +29,7 @@ export function writable_derived(store: Writable, property: string, nam // can use structuredClone if a deep copy is required const change = { ...state }; - set_prop(state, property, value); + set_prop(change, property, value); return change; }); @@ -52,3 +52,54 @@ export function writable_derived(store: Writable, property: string, nam set } as Writable; } + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function writable_indexed_derived(store: Writable, index: number, name = 'store') { + const { subscribe } = derived(store, (state) => { + if (state === undefined) { + return; // item no longer exists + } + + const prop = state[index]; + + if (prop === undefined) { + tick().then(() => { + if (state[index] === undefined) { + console.error(`${name}: bind subscribe failed!, index: ${index}`); + console.error(state); + } + }); + } + + return prop; // ts sorcery + }); + + const update = (value: D) => { + store.update((state) => { + // this is a shallow copy + // can use structuredClone if a deep copy is required + const change = [...state]; + + change[index] = value; + + return change; + }); + }; + + const set = (value: D) => { + // this is a shallow copy + // can use structuredClone if a deep copy is required + const change = [...get(store)]; + + change[index] = value; + + store.set(change); + }; + + return { + name, + subscribe, + update, + set + } as Writable; +} diff --git a/src/lib/types/math.types.ts b/src/lib/types/math.types.ts index da0db6d..99dc995 100644 --- a/src/lib/types/math.types.ts +++ b/src/lib/types/math.types.ts @@ -1,5 +1 @@ -export interface vec3f { - x: number; - y: number; - z: number; -} +export type vec3f = [number, number, number]; diff --git a/src/lib/types/misc.types.ts b/src/lib/types/misc.types.ts index c96a452..3d48797 100644 --- a/src/lib/types/misc.types.ts +++ b/src/lib/types/misc.types.ts @@ -6,3 +6,9 @@ export interface WTileSize { type: string; size: number; } + +export enum KernelState { + INITIAL, + RENDERING, + DONE +} \ No newline at end of file diff --git a/src/lib/utils/array.extensions.ts b/src/lib/utils/array.extensions.ts index 1336b69..d0f10b9 100644 --- a/src/lib/utils/array.extensions.ts +++ b/src/lib/utils/array.extensions.ts @@ -1,7 +1,9 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any export function get_id_prop(arr: any[], id: number, prop: string, separator = '.'): any { - const element = arr.find(item => item.id === id); - return element === undefined ? undefined : prop.split(separator).reduce((value, el) => value[el], element); + const element = arr.find((item) => item.id === id); + return element === undefined + ? undefined + : prop.split(separator).reduce((value, el) => value[el], element); } export function set_index_prop( @@ -14,7 +16,7 @@ export function set_index_prop( separator = '.' ): void { const path = prop.split(separator); - const element = arr.find(item => item.id === id); + const element = arr.find((item) => item.id === id); if (element === undefined) return; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 025b8fb..25bab53 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,17 +1,26 @@ -webray render output +webray render output + +{#if $editorStore.kernel_state === KernelState.RENDERING} +
+ +
+{:else if $editorStore.kernel_state === KernelState.INITIAL} +
+ Press the image icon to render an image +
+{/if} diff --git a/webray/Cargo.toml b/webray/Cargo.toml index 77429f6..2dedbe1 100644 --- a/webray/Cargo.toml +++ b/webray/Cargo.toml @@ -20,13 +20,14 @@ path = "src/main.rs" # winit = { version = "0.29", features = ["rwh_05"]} # raw_window_handle_0.5 is required for compat issues should be fixed in next version of wgpu wgpu = "0.19" rand = "0.8" # RNG -glam = "0.25" # Math lib +glam = { version = "0.25", features = ["serde"]} # Math lib cfg-if = "0.1" # Configuration macros log = "0.4" # log API bytemuck = "1.14" # byte operations encase = { version = "0.7", features = ["glam"]} # gpu memory layout mappimg utility +serde = { version = "1.0", features = ["derive"] } # serialization flume = "0.11" # channels for communication @@ -40,6 +41,8 @@ console_error_panic_hook = "0.1" console_log = "1.0" wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" +serde-wasm-bindgen = "0.4" +js-sys = "0.3" web-sys = { version = "0.3", features = [ "ImageData", "HtmlImageElement", diff --git a/webray/src/core/gpu.rs b/webray/src/core/gpu.rs index ded7def..631e103 100644 --- a/webray/src/core/gpu.rs +++ b/webray/src/core/gpu.rs @@ -31,9 +31,6 @@ impl Gpu { panic!("Aborting due to an error: {}", error); })); - return Gpu { - device, - queue, - }; + return Gpu { device, queue }; } } diff --git a/webray/src/core/mod.rs b/webray/src/core/mod.rs index cdcd93d..8ed4129 100644 --- a/webray/src/core/mod.rs +++ b/webray/src/core/mod.rs @@ -1 +1 @@ -pub mod gpu; \ No newline at end of file +pub mod gpu; diff --git a/webray/src/demo/mod.rs b/webray/src/demo/mod.rs index 9f7594f..b05e9a6 100644 --- a/webray/src/demo/mod.rs +++ b/webray/src/demo/mod.rs @@ -1,18 +1,18 @@ use rand::Rng; use crate::{ - renderer::config::{CameraConfig, Config, RenderConfig, TileSize}, + renderer::config::{CameraConfig, KernelConfig, RenderConfig, TileSize}, scene::{material::Material, shape::Shape, Scene}, utils::color, }; -pub fn create_cover_config() -> Config { +pub fn create_cover_config() -> KernelConfig { let render_config = RenderConfig { width: 1920, height: 1080, samples: 64, bounces: 12, - tile_size: TileSize::Square(256), + tile_size: TileSize::Tile(256), }; let camera_config = CameraConfig { @@ -24,7 +24,7 @@ pub fn create_cover_config() -> Config { dof_distance: 10.0, }; - return Config::new(&render_config, &camera_config); + return KernelConfig::new(&render_config, &camera_config); } pub fn create_cover_scene() -> Scene { @@ -82,68 +82,3 @@ pub fn create_cover_scene() -> Scene { return scene; } - -pub fn create_demo_config() -> Config { - let render_config = RenderConfig { - width: 1920, - height: 1080, - samples: 128, - bounces: 32, - tile_size: TileSize::Full, - }; - - let camera_config = CameraConfig { - look_from: glam::vec3(-2.0, 2.0, 1.0), - look_at: glam::vec3(0.0, 0.0, -1.0), - v_up: glam::vec3(0.0, 1.0, 0.0), - v_fov: 20.0, - dof_angle: 0.6, - dof_distance: 3.4, - }; - - return Config::new(&render_config, &camera_config); -} - -pub fn create_demo_scene() -> Scene { - let mut scene = Scene::new(); - - let diffuse_mat_1 = scene.register_material(Material::Diffuse(glam::vec3(0.6, 0.8, 0.0))); - - let diffuse_mat_2 = scene.register_material(Material::Diffuse(glam::vec3(0.1, 0.2, 0.5))); - - let metal_mat_2 = scene.register_material(Material::Metal(glam::vec3(0.8, 0.6, 0.2), 0.1)); - - let dielectric_mat_1 = scene.register_material(Material::Dielectric(1.5)); - - // left - // 2 spheres and 1 with -ve radius with di-electric mat gives a hollow glass bubble look - scene.register_shape(Shape::Sphere( - glam::vec3(-1.0, 0.0, -1.0), - 0.5, - dielectric_mat_1, - )); - scene.register_shape(Shape::Sphere( - glam::vec3(-1.0, 0.0, -1.0), - -0.4, - dielectric_mat_1, - )); - - // center - scene.register_shape(Shape::Sphere( - glam::vec3(0.0, 0.0, -1.0), - 0.5, - diffuse_mat_2, - )); - - // right - scene.register_shape(Shape::Sphere(glam::vec3(1.0, 0.0, -1.0), 0.5, metal_mat_2)); - - // ground - scene.register_shape(Shape::Sphere( - glam::vec3(0.0, -100.5, -1.0), - 100.0, - diffuse_mat_1, - )); - - return scene; -} diff --git a/webray/src/lib.rs b/webray/src/lib.rs index 78d4c67..181ec57 100644 --- a/webray/src/lib.rs +++ b/webray/src/lib.rs @@ -5,20 +5,20 @@ use wasm_bindgen::prelude::*; use utils::metrics::Metrics; +use scene::types::WScene; mod core; -mod demo; mod output; mod renderer; mod scene; mod utils; #[cfg_attr(target_arch = "wasm32", wasm_bindgen)] -pub fn init() { +pub fn initialize_kernel() { cfg_if::cfg_if! { if #[cfg(target_arch = "wasm32")] { std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - console_log::init().unwrap(); + console_log::init_with_level(log::Level::Warn).unwrap(); } else { env_logger::builder() .filter_level(log::LevelFilter::Info) @@ -30,22 +30,36 @@ pub fn init() { log::info!("WebRay Loaded"); } -#[cfg_attr(target_arch = "wasm32", wasm_bindgen)] -pub fn run() { - cfg_if::cfg_if! { - if #[cfg(target_arch = "wasm32")] { - wasm_bindgen_futures::spawn_local(run_internal()); - } else { - pollster::block_on(run_internal()); - } - } +#[cfg(target_arch = "wasm32")] +#[wasm_bindgen] +pub fn render(value: JsValue) -> js_sys::Promise { + use scene::types::WScene; + + let scene = serde_wasm_bindgen::from_value::(value).unwrap(); + + // not sure if the move is required here + return wasm_bindgen_futures::future_to_promise(async move { + run_internal(scene).await; + return Ok(JsValue::TRUE); + }); } -async fn run_internal() { - let config = demo::create_demo_config(); +#[cfg(not(target_arch = "wasm32"))] +pub fn render() { + pollster::block_on(run_internal()); +} - let scene = demo::create_demo_scene(); +#[cfg(target_arch = "wasm32")] +#[wasm_bindgen] +pub fn parse_scene(value: JsValue) { + use scene::types::WScene; + + let scene = serde_wasm_bindgen::from_value::(value).unwrap(); + + log::info!("{}", scene); +} +async fn run_internal(scene: WScene) { let mut metrics: Option; cfg_if::cfg_if! { @@ -56,12 +70,18 @@ async fn run_internal() { } }; - if let Ok(buffer) = renderer::render(&config, &scene.into(), &mut metrics).await { + if let Ok(buffer) = renderer::render( + &scene.get_kernel_config(), + &scene.get_kernel_scene(), + &mut metrics, + ) + .await + { cfg_if::cfg_if! { if #[cfg(target_arch = "wasm32")] { - output::wasm::output_image(buffer, glam::uvec2(config.kernel.image.width, config.kernel.image.height)); + output::wasm::output_image(buffer, glam::uvec2(scene.render_settings.width, scene.render_settings.height)); } else { - output::native::output_image(buffer, glam::uvec2(config.kernel.image.width, config.kernel.image.height), "render.png"); + output::native::output_image(buffer, glam::uvec2(scene.render_settings.width, scene.render_settings.height), "render.png"); } } diff --git a/webray/src/main.rs b/webray/src/main.rs index d539118..932f2b0 100644 --- a/webray/src/main.rs +++ b/webray/src/main.rs @@ -1,4 +1,11 @@ fn main() { - webray::init(); - webray::run(); -} \ No newline at end of file + webray::initialize_kernel(); + + cfg_if::cfg_if! { + if #[cfg(target_arch = "wasm32")] { + log::error!("Platform not supported"); + } else { + webray::render(); + } + } +} diff --git a/webray/src/output/mod.rs b/webray/src/output/mod.rs index c499020..3a59b69 100644 --- a/webray/src/output/mod.rs +++ b/webray/src/output/mod.rs @@ -1,4 +1,4 @@ +#[cfg(not(target_arch = "wasm32"))] +pub mod native; #[cfg(target_arch = "wasm32")] pub mod wasm; - -pub mod native; \ No newline at end of file diff --git a/webray/src/output/native.rs b/webray/src/output/native.rs index 738a751..5bf1cd2 100644 --- a/webray/src/output/native.rs +++ b/webray/src/output/native.rs @@ -1,4 +1,3 @@ -#[cfg(not(target_arch = "wasm32"))] pub fn output_image(image_data: Vec, dimensions: glam::UVec2, path: &str) { match image::save_buffer( path, @@ -10,4 +9,4 @@ pub fn output_image(image_data: Vec, dimensions: glam::UVec2, path: &str) { Ok(_) => log::info!("Output saved at path: {}", path), Err(e) => log::error!("{:?}", e), } -} \ No newline at end of file +} diff --git a/webray/src/output/wasm.rs b/webray/src/output/wasm.rs index 59302fa..12edd28 100644 --- a/webray/src/output/wasm.rs +++ b/webray/src/output/wasm.rs @@ -39,23 +39,22 @@ pub fn output_image(image_data: Vec, dimensions: glam::UVec2) { context.put_image_data(&image_data, 0.0, 0.0).unwrap(); - let image_element = if let Some(found_image_element) = - document.get_element_by_id("output-image-target") - { - match found_image_element.dyn_into::() { - Ok(e) => e, - Err(e) => { - e.remove(); - create_output_image_element(&document) + let image_element = + if let Some(found_image_element) = document.get_element_by_id("output-image-target") { + match found_image_element.dyn_into::() { + Ok(e) => e, + Err(e) => { + e.remove(); + create_output_image_element(&document) + } } - } - } else { - create_output_image_element(&document) - }; + } else { + create_output_image_element(&document) + }; let data_url = canvas.to_data_url().unwrap(); image_element.set_src(&data_url); - + log::info!("Image displayed"); } diff --git a/webray/src/renderer/bindings.rs b/webray/src/renderer/bindings.rs index 41b17d0..e496c84 100644 --- a/webray/src/renderer/bindings.rs +++ b/webray/src/renderer/bindings.rs @@ -170,18 +170,16 @@ impl KernelBindings { .device .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Some("Execution bind group layout"), - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::COMPUTE, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Uniform, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::COMPUTE, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, }, - ], + count: None, + }], }); } @@ -189,12 +187,10 @@ impl KernelBindings { return gpu.device.create_bind_group(&wgpu::BindGroupDescriptor { label: Some("Execution bind group"), layout: &self.execution_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: buffers.execution_context.as_entire_binding(), - }, - ], + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: buffers.execution_context.as_entire_binding(), + }], }); } } diff --git a/webray/src/renderer/buffers.rs b/webray/src/renderer/buffers.rs index 932a80b..bd18953 100644 --- a/webray/src/renderer/buffers.rs +++ b/webray/src/renderer/buffers.rs @@ -5,7 +5,7 @@ use wgpu::util::DeviceExt; use crate::core::gpu::Gpu; use super::{ - config::{ExecutionContext, KernelConfig}, + config::{ExecutionContext, SystemConfig}, scene::KernelScene, }; @@ -31,11 +31,11 @@ pub struct KernelBuffers { } impl KernelBuffers { - pub fn new(gpu: &Gpu, config: &KernelConfig, scene: &KernelScene) -> Self { + pub fn new(gpu: &Gpu, system_config: &SystemConfig, scene: &KernelScene) -> Self { // &arr and &arr[..] are different, second one is a slice and what we need let result_buffer = gpu.device.create_buffer(&wgpu::BufferDescriptor { label: Some("Result buffer"), - size: config.result_size(), + size: system_config.result_size(), usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::COPY_DST, mapped_at_creation: false, }); @@ -43,8 +43,8 @@ impl KernelBuffers { let render_texture = gpu.device.create_texture(&wgpu::TextureDescriptor { label: Some("Render texture"), size: wgpu::Extent3d { - width: config.image.width, - height: config.image.height, + width: system_config.image.width, + height: system_config.image.height, depth_or_array_layers: 1, }, mip_level_count: 1, @@ -62,7 +62,7 @@ impl KernelBuffers { .device .create_buffer_init(&wgpu::util::BufferInitDescriptor { label: Some("Config uniform buffer"), - contents: &config.as_wgsl_bytes().unwrap()[..], + contents: &system_config.as_wgsl_bytes().unwrap()[..], usage: wgpu::BufferUsages::UNIFORM, }); diff --git a/webray/src/renderer/config.rs b/webray/src/renderer/config.rs index a3b0c37..b60d2cd 100644 --- a/webray/src/renderer/config.rs +++ b/webray/src/renderer/config.rs @@ -1,7 +1,7 @@ #[derive(Debug, Clone, Copy)] pub enum TileSize { Full, - Square(u32), + Tile(u32), } #[derive(Debug)] @@ -51,14 +51,14 @@ pub struct Viewport { } #[derive(Debug, encase::ShaderType)] -pub struct KernelConfig { +pub struct SystemConfig { pub image: Image, pub camera: Camera, pub viewport: Viewport, pixel_zero_loc: glam::Vec3, } -impl KernelConfig { +impl SystemConfig { /// A lot of camera calculations pub fn new(render_config: &RenderConfig, camera_config: &CameraConfig) -> Self { // Determine viewport dimensions. @@ -117,7 +117,7 @@ impl KernelConfig { upper_left, }; - return KernelConfig { + return SystemConfig { image, camera, viewport, @@ -149,28 +149,28 @@ impl ExecutionContext { } } -pub struct SystemConfig { +pub struct ExecutionConfig { pub tile_size: TileSize, } -impl SystemConfig { +impl ExecutionConfig { pub fn new(render_config: &RenderConfig) -> Self { - return SystemConfig { + return ExecutionConfig { tile_size: render_config.tile_size, }; } } -pub struct Config { - pub kernel: KernelConfig, +pub struct KernelConfig { pub system: SystemConfig, + pub execution: ExecutionConfig, } -impl Config { +impl KernelConfig { pub fn new(render_config: &RenderConfig, camera_config: &CameraConfig) -> Self { - return Config { - kernel: KernelConfig::new(render_config, camera_config), - system: SystemConfig::new(render_config), + return KernelConfig { + system: SystemConfig::new(render_config, camera_config), + execution: ExecutionConfig::new(render_config), }; } } diff --git a/webray/src/renderer/kernel.rs b/webray/src/renderer/kernel.rs index 3d5ff1e..bd6ad2f 100644 --- a/webray/src/renderer/kernel.rs +++ b/webray/src/renderer/kernel.rs @@ -3,7 +3,7 @@ use crate::core::gpu::Gpu; use super::{ bindings::KernelBindings, buffers::KernelBuffers, - config::{ExecutionContext, KernelConfig, SystemConfig, TileSize}, + config::{ExecutionConfig, ExecutionContext, SystemConfig, TileSize}, }; pub struct Kernel { @@ -20,42 +20,42 @@ impl Kernel { pub async fn execute( &self, gpu: &Gpu, - kernel_config: &KernelConfig, system_config: &SystemConfig, + execution_config: &ExecutionConfig, bindings: &KernelBindings, buffers: &KernelBuffers, ) -> Result, ()> { let tile_count = Self::count_tiles( - kernel_config.image.width, - kernel_config.image.height, - system_config.tile_size, + system_config.image.width, + system_config.image.height, + execution_config.tile_size, ); log::info!( "Tile count: {}, width: {}, height: {}", tile_count.x * tile_count.y, - kernel_config.image.width, - kernel_config.image.height + system_config.image.width, + system_config.image.height ); - match system_config.tile_size { + match execution_config.tile_size { TileSize::Full => { log::info!( "Rendering full tile, width: {}, height: {}", - kernel_config.image.width, - kernel_config.image.height + system_config.image.width, + system_config.image.height ); self.render_tile( gpu, glam::uvec2(0, 0), - kernel_config.image.width, - kernel_config.image.height, + system_config.image.width, + system_config.image.height, bindings, buffers, ); } - TileSize::Square(size) => { + TileSize::Tile(size) => { let mut id = 1; let total_tile_count = tile_count.x * tile_count.y; @@ -63,8 +63,8 @@ impl Kernel { for y in 0..tile_count.y { let tile_position = glam::uvec2(x, y); - let width = ((x + 1) * size).min(kernel_config.image.width) - (x * size); - let height = ((y + 1) * size).min(kernel_config.image.height) - (y * size); + let width = ((x + 1) * size).min(system_config.image.width) - (x * size); + let height = ((y + 1) * size).min(system_config.image.height) - (y * size); log::info!( "Rendering ({:07.3}%) tile {}: {}, width: {}, height: {}", @@ -75,7 +75,14 @@ impl Kernel { height ); - self.render_tile(gpu, tile_position * size, width, height, bindings, buffers); + self.render_tile( + gpu, + tile_position * size, + width, + height, + bindings, + buffers, + ); id += 1; } @@ -93,7 +100,7 @@ impl Kernel { log::info!("Reading result buffer"); - let result = self.map_result(gpu, kernel_config, buffers).await; + let result = self.map_result(gpu, system_config, buffers).await; return result; } @@ -148,7 +155,7 @@ impl Kernel { async fn map_result( &self, gpu: &Gpu, - kernel_config: &KernelConfig, + kernel_config: &SystemConfig, buffers: &KernelBuffers, ) -> Result, ()> { let mut encoder = gpu @@ -239,7 +246,7 @@ impl Kernel { fn count_tiles(width: u32, height: u32, tile_size: TileSize) -> glam::UVec2 { return match tile_size { TileSize::Full => glam::uvec2(1, 1), - TileSize::Square(size) => glam::uvec2(width.div_ceil(size), height.div_ceil(size)), + TileSize::Tile(size) => glam::uvec2(width.div_ceil(size), height.div_ceil(size)), }; } } diff --git a/webray/src/renderer/material.rs b/webray/src/renderer/material.rs index 90c4e3b..f7786e6 100644 --- a/webray/src/renderer/material.rs +++ b/webray/src/renderer/material.rs @@ -1,15 +1,15 @@ #[derive(Debug, encase::ShaderType)] pub struct KDiffuseMat { - pub albedo: glam::Vec3 + pub albedo: glam::Vec3, } #[derive(Debug, encase::ShaderType)] pub struct KMetalMat { pub albedo: glam::Vec3, - pub roughness: f32 + pub roughness: f32, } #[derive(Debug, encase::ShaderType)] pub struct KDielectricMat { - pub ior: f32 -} \ No newline at end of file + pub ior: f32, +} diff --git a/webray/src/renderer/mod.rs b/webray/src/renderer/mod.rs index 95f72fe..3516a75 100644 --- a/webray/src/renderer/mod.rs +++ b/webray/src/renderer/mod.rs @@ -1,12 +1,10 @@ use crate::{ core::gpu::Gpu, - renderer::{bindings::KernelBindings, buffers::KernelBuffers, kernel::Kernel}, utils::metrics::Metrics, + renderer::{bindings::KernelBindings, buffers::KernelBuffers, kernel::Kernel}, + utils::metrics::Metrics, }; -use self::{ - config::Config, - scene::KernelScene, -}; +use self::{config::KernelConfig, scene::KernelScene}; mod bindings; mod buffers; @@ -17,7 +15,11 @@ pub mod material; pub mod scene; pub mod shapes; -pub async fn render(config: &Config, scene: &KernelScene, metrics: &mut Option) -> Result, ()> { +pub async fn render( + config: &KernelConfig, + scene: &KernelScene, + metrics: &mut Option, +) -> Result, ()> { // dbg!(&config); // dbg!(&scene); @@ -35,7 +37,7 @@ pub async fn render(config: &Config, scene: &KernelScene, metrics: &mut Option, diffuse_mats: Vec, metal_mats: Vec, - dielectric_mats: Vec + dielectric_mats: Vec, } impl KernelScene { @@ -14,7 +17,7 @@ impl KernelScene { spheres: Vec::new(), diffuse_mats: Vec::new(), metal_mats: Vec::new(), - dielectric_mats: Vec::new() + dielectric_mats: Vec::new(), }; } @@ -61,4 +64,4 @@ impl KernelScene { buffer.write(&self.dielectric_mats).unwrap(); return Ok(buffer.into_inner()); } -} \ No newline at end of file +} diff --git a/webray/src/renderer/shapes.rs b/webray/src/renderer/shapes.rs index 00569db..c9e821a 100644 --- a/webray/src/renderer/shapes.rs +++ b/webray/src/renderer/shapes.rs @@ -4,5 +4,5 @@ pub struct KSphere { pub center: glam::Vec3, pub radius: f32, - pub mid: glam::UVec4 -} \ No newline at end of file + pub mid: glam::UVec4, +} diff --git a/webray/src/scene/material.rs b/webray/src/scene/material.rs deleted file mode 100644 index 1a259cd..0000000 --- a/webray/src/scene/material.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub enum Material { - Diffuse(glam::Vec3), - Metal(glam::Vec3, f32), - Dielectric(f32) -} \ No newline at end of file diff --git a/webray/src/scene/mod.rs b/webray/src/scene/mod.rs index 44a66fd..65e8952 100644 --- a/webray/src/scene/mod.rs +++ b/webray/src/scene/mod.rs @@ -1,83 +1,92 @@ use std::collections::HashMap; -use crate::renderer::{ - material::{KDiffuseMat, KMetalMat, KDielectricMat}, - scene::KernelScene, - shapes::KSphere, +use crate::{ + renderer::{ + config::{CameraConfig, KernelConfig, RenderConfig, TileSize}, + material::{KDielectricMat, KDiffuseMat, KMetalMat}, + scene::KernelScene, + shapes::KSphere, + }, + utils::color::hex_to_rgb, }; -use self::{material::Material, shape::Shape}; +use self::types::{WMaterialType, WObjectType, WScene}; -pub mod material; -pub mod shape; +pub mod types; -pub struct Scene { - shapes: Vec, - materials: Vec, -} - -impl Scene { - pub fn new() -> Self { - return Scene { - shapes: Vec::new(), - materials: Vec::new(), - }; - } - - pub fn register_material(&mut self, material: Material) -> usize { - self.materials.push(material); - return self.materials.len() - 1; - } - - pub fn register_shape(&mut self, shape: Shape) -> usize { - self.shapes.push(shape); - return self.shapes.len() - 1; - } -} - -impl Default for Scene { - fn default() -> Self { - return Self::new(); - } -} - -impl From for KernelScene { - fn from(scene: Scene) -> Self { +impl WScene { + pub fn get_kernel_scene(&self) -> KernelScene { let mut kernel_scene = KernelScene::new(); let mut materials: HashMap = HashMap::new(); - for (i, mat) in scene.materials.into_iter().enumerate() { - match mat { - Material::Diffuse(albedo) => { + for mat in self.materials[..].iter() { + match &mat.mat_type { + // because of color have to do a borrow + WMaterialType::Diffuse { color } => { + let albedo = hex_to_rgb(color).unwrap(); let idx = kernel_scene.register_diffuse_material(KDiffuseMat { albedo }); - materials.insert(i, (1, idx)); + materials.insert(mat.id.try_into().unwrap(), (1, idx)); + } + WMaterialType::Metal { color, roughness } => { + let albedo = hex_to_rgb(color).unwrap(); + let idx = kernel_scene.register_metal_material(KMetalMat { + albedo, + roughness: *roughness, + }); + materials.insert(mat.id.try_into().unwrap(), (2, idx)); } - Material::Metal(albedo, roughness) => { - let idx = kernel_scene.register_metal_material(KMetalMat { albedo, roughness }); - materials.insert(i, (2, idx)); + WMaterialType::Dielectric { ior } => { + let idx = + kernel_scene.register_dielectric_material(KDielectricMat { ior: *ior }); + materials.insert(mat.id.try_into().unwrap(), (3, idx)); } - Material::Dielectric(ior) => { - let idx = kernel_scene.register_dielectric_material(KDielectricMat { ior }); - materials.insert(i, (3, idx)); - }, } } - for shape in scene.shapes { - match shape { - Shape::Sphere(center, radius, mat_id) => { - let mat = materials.get(&mat_id).unwrap(); + for obj in self.objects[..].iter() { + match obj.obj_type { + WObjectType::Sphere { position, radius } => { + let mat_res = materials.get(&obj.material_id); - kernel_scene.register_sphere(KSphere { - center, - radius, - mid: glam::uvec4(mat.0, mat.1, 0, 0), - }); + match mat_res { + Some(mat) => { + kernel_scene.register_sphere(KSphere { + center: position, + radius, + mid: glam::uvec4(mat.0, mat.1, 0, 0), + }); + } + None => panic!("Material not found: {}", &obj.material_id), + } } } } return kernel_scene; } + + pub fn get_kernel_config(&self) -> KernelConfig { + let render_config = RenderConfig { + width: self.render_settings.width, + height: self.render_settings.height, + samples: self.render_settings.samples, + bounces: self.render_settings.bounces, + tile_size: match self.render_settings.tile_size { + types::WTileSize::Full => TileSize::Full, + types::WTileSize::Tile { size } => TileSize::Tile(size), + }, + }; + + let camera_config = CameraConfig { + look_from: self.camera.look_from, + look_at: self.camera.look_at, + v_up: self.camera.v_up, + v_fov: self.camera.v_fov, + dof_angle: self.camera.dof_angle, + dof_distance: self.camera.dof_distance, + }; + + return KernelConfig::new(&render_config, &camera_config); + } } diff --git a/webray/src/scene/shape.rs b/webray/src/scene/shape.rs deleted file mode 100644 index 7dd8de7..0000000 --- a/webray/src/scene/shape.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub enum Shape { - Sphere(glam::Vec3, f32, usize) -} \ No newline at end of file diff --git a/webray/src/scene/types.rs b/webray/src/scene/types.rs new file mode 100644 index 0000000..b1d5a38 --- /dev/null +++ b/webray/src/scene/types.rs @@ -0,0 +1,166 @@ +use core::fmt; + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct WScene { + pub objects: Vec, + pub materials: Vec, + pub camera: WCamera, + pub render_settings: WRenderSettings, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct WObject { + pub id: u32, + pub name: String, + pub material_id: usize, + + #[serde(rename = "type")] + pub obj_type: WObjectType, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(tag = "type")] +pub enum WObjectType { + #[serde(rename = "d_sphere")] + Sphere { position: glam::Vec3, radius: f32 }, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct WMaterial { + pub id: u32, + pub name: String, + + #[serde(rename = "type")] + pub mat_type: WMaterialType, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(tag = "type")] +pub enum WMaterialType { + #[serde(rename = "d_mat_diffuse")] + Diffuse { color: String }, + + #[serde(rename = "d_mat_metal")] + Metal { color: String, roughness: f32 }, + + #[serde(rename = "d_mat_dielectric")] + Dielectric { ior: f32 }, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct WCamera { + pub look_from: glam::Vec3, + pub look_at: glam::Vec3, + pub v_up: glam::Vec3, + pub v_fov: f32, + pub dof_angle: f32, + pub dof_distance: f32, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct WRenderSettings { + pub width: u32, + pub height: u32, + pub samples: u32, + pub bounces: u32, + pub tile_size: WTileSize, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[serde(tag = "type")] +pub enum WTileSize { + #[serde(rename = "d_tile_size_full")] + Full, + + #[serde(rename = "d_tile_size")] + Tile { size: u32 }, +} + +impl fmt::Display for WScene { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "Objects:").unwrap(); + + for item in &self.objects { + write!(f, "\n\tObject: {}", item).unwrap(); + } + + write!(f, "\nMaterials:").unwrap(); + + for item in &self.materials { + write!(f, "\n\tMaterial: {}", item).unwrap(); + } + + return write!( + f, + "\nCamera:\n\t{}\nRenderSettings:\n\t{}", + self.camera, self.render_settings + ); + } +} + +impl fmt::Display for WObject { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return write!( + f, + "\n\t\tID: {}\n\t\tname: {}\n\t\tmaterial_id: {}\n\t\ttype: {}", + self.id, self.name, self.material_id, self.obj_type + ); + } +} + +impl fmt::Display for WObjectType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return match self { + WObjectType::Sphere { position, radius } => { + write!(f, "SPHERE(position: {}, radius: {})", position, radius) + } + }; + } +} + +impl fmt::Display for WMaterial { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return write!( + f, + "\n\t\tID: {}\n\t\tname: {}\n\t\ttype: {}", + self.id, self.name, self.mat_type + ); + } +} + +impl fmt::Display for WMaterialType { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return match self { + WMaterialType::Diffuse { color } => write!(f, "DIFFUSE(color: {})", color), + WMaterialType::Metal { color, roughness } => { + write!(f, "METAL(color: {}, roughness: {})", color, roughness) + } + WMaterialType::Dielectric { ior } => write!(f, "DIELECTRIC(ior: {})", ior), + }; + } +} + +impl fmt::Display for WCamera { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return write!(f, "look_from: {}\n\tlook_at: {}\n\tv_up: {}\n\tv_fov: {}\n\tdof_angle: {}\n\tdof_distance: {}", self.look_from, self.look_at, self.v_up, self.v_fov, self.dof_angle, self.dof_distance); + } +} + +impl fmt::Display for WRenderSettings { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return write!( + f, + "width: {}\n\theight: {}\n\tsamples: {}\n\tbounces: {}\n\ttile size: {}", + self.width, self.height, self.samples, self.bounces, self.tile_size + ); + } +} + +impl fmt::Display for WTileSize { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + return match self { + WTileSize::Full => write!(f, "FULL()"), + WTileSize::Tile { size } => write!(f, "TILE(size: {})", size), + }; + } +} diff --git a/webray/src/utils/color.rs b/webray/src/utils/color.rs index 571e83f..868e481 100644 --- a/webray/src/utils/color.rs +++ b/webray/src/utils/color.rs @@ -14,4 +14,36 @@ pub fn random_color_range(rng: &mut ThreadRng, min: f32, max: f32) -> glam::Vec3 let b: f32 = rng.gen_range(min..max); return glam::vec3(r, g, b); -} \ No newline at end of file +} + +pub fn hex_to_rgb(hex: &str) -> Option { + // Check if the hex string starts with '#' and remove it + let hex = if hex.starts_with('#') { &hex[1..] } else { hex }; + + // Ensure that the hex string is of valid length (either 3 or 6) + if hex.len() != 3 && hex.len() != 6 { + return None; + } + + // Parse the hex string into a u32 + let hex_int = u32::from_str_radix(hex, 16).ok()?; + + // Extract the color components + let r = if hex.len() == 3 { + ((hex_int >> 8) & 0xF) as u8 * 17 + } else { + (hex_int >> 16) as u8 + }; + let g = if hex.len() == 3 { + ((hex_int >> 4) & 0xF) as u8 * 17 + } else { + ((hex_int >> 8) & 0xFF) as u8 + }; + let b = if hex.len() == 3 { + (hex_int & 0xF) as u8 * 17 + } else { + (hex_int & 0xFF) as u8 + }; + + return Some(glam::vec3(r.into(), g.into(), b.into()) / 255.0); +} diff --git a/webray/src/utils/metrics.rs b/webray/src/utils/metrics.rs index 0338dca..cec4ae7 100644 --- a/webray/src/utils/metrics.rs +++ b/webray/src/utils/metrics.rs @@ -51,9 +51,15 @@ impl Metrics { pub fn log(&self) { log::info!("===== WebRay Metrics ====="); - log::info!("Device Acquisition: {} secs", self.device_acquisition.as_secs_f64()); + log::info!( + "Device Acquisition: {} secs", + self.device_acquisition.as_secs_f64() + ); log::info!("Scene Upload: {} secs", self.scene_upload.as_secs_f64()); - log::info!("Kernel Initialization: {} secs", self.kernel_initialization.as_secs_f64()); + log::info!( + "Kernel Initialization: {} secs", + self.kernel_initialization.as_secs_f64() + ); log::info!("Rendering: {} secs", self.rendering.as_secs_f64()); log::info!("Output write: {} secs", self.output_write.as_secs_f64()); log::info!("Total: {} secs", self.total.as_secs_f64()); diff --git a/webray/src/utils/mod.rs b/webray/src/utils/mod.rs index 46fef12..acec084 100644 --- a/webray/src/utils/mod.rs +++ b/webray/src/utils/mod.rs @@ -1,2 +1,2 @@ pub mod color; -pub mod metrics; \ No newline at end of file +pub mod metrics;