| 9 | }"`; |
| 10 | |
| 11 | function createFiles() { |
| 12 | return new Promise((resolve, reject) => { |
| 13 | fs.readFile("./deploy/v2/materials.json", "utf8", (err, data) => { |
| 14 | if (err) { |
| 15 | console.error(err); |
| 16 | reject(err); |
| 17 | return; |
| 18 | } |
| 19 | |
| 20 | // biome-ignore format: legibility |
| 21 | function makeMaterialX ( hit ) { |
| 22 | const baseColor = JSON.stringify(hit.color[0].color) !== JSON.stringify([0.8, 0.8, 0.8]) && !hit.transmission && !hit.subsurfaceRadius ? ` <input name="base_color" type="color3" value="${hit.color[0].color[0].toFixed(3)}, ${hit.color[0].color[1].toFixed(3)}, ${hit.color[0].color[2].toFixed(3)}" />\n` : ""; |
| 23 | const metalness = hit.metalness > 0 ? ` <input name="base_metalness" type="float" value="${hit.metalness.toFixed(1)}" />\n` : ""; |
| 24 | const specularColor = hit.specularColor ? ` <input name="specular_color" type="color3" value="${hit.specularColor[1].color[0].color[0]}, ${hit.specularColor[1].color[0].color[1]}, ${hit.specularColor[1].color[0].color[2]}" />\n` : ""; |
| 25 | const roughness = hit.roughness !== 0.3 ? ` <input name="specular_roughness" type="float" value="${hit.roughness.toFixed(1)}" />\n` : ""; |
| 26 | const specularIor = hit.ior && hit.metalness < 1 && hit.ior !== 1.5 ? ` <input name="specular_ior" type="float" value="${hit.ior.toFixed(2)}" />\n` : ""; |
| 27 | const transmission = hit.transmission ? ` <input name="transmission_weight" type="float" value="${hit.transmission.toFixed(1)}" />\n` : ""; |
| 28 | const transmissionColor = hit.transmission && JSON.stringify(hit.color[0].color) !== JSON.stringify([1, 1, 1]) ? ` <input name="transmission_color" type="color3" value="${hit.color[0].color[0].toFixed(3)}, ${hit.color[0].color[1].toFixed(3)}, ${hit.color[0].color[2].toFixed(3)}" />\n` : ""; |
| 29 | const transmissionDepth = hit.transmissionDepth ? ` <input name="transmission_depth" type="float" value="${hit.transmissionDepth}" />\n` : ""; |
| 30 | const transmissionDispersion = hit.transmissionDispersion ? ` <input name="transmission_dispersion_scale" type="float" value="1.0" />\n` : ""; |
| 31 | const transmissionDispersionAbbeNumber = hit.transmissionDispersion ? ` <input name="transmission_dispersion_abbe_number" type="float" value="${hit.transmissionDispersion}" />\n` : ""; |
| 32 | const subsurface = hit.subsurfaceRadius ? ` <input name="subsurface_weight" type="float" value="1.0" />\n` : ""; |
| 33 | const subsurfaceColor = hit.subsurfaceRadius ? ` <input name="subsurface_color" type="color3" value="${hit.color[0].color[0].toFixed(3)}, ${hit.color[0].color[1].toFixed(3)}, ${hit.color[0].color[2].toFixed(3)}" />\n` : ""; |
| 34 | const subsurfaceRadiusScale = hit.subsurfaceRadius ? ` <input name="subsurface_radius_scale" type="color3" value="${hit.subsurfaceRadius[0]}, ${hit.subsurfaceRadius[1]}, ${hit.subsurfaceRadius[2]}" />\n` : ""; |
| 35 | const thinFilmWeight = hit.thinFilmThickness ? ` <input name="thin_film_weight" type="float" value="1.0" />\n` : ""; |
| 36 | const thinFilmThickness = hit.thinFilmThickness && hit.thinFilmThickness[2] ? ` <input name="thin_film_thickness" type="float" value="${hit.thinFilmThickness[2]/1000}" />\n` : hit.thinFilmThickness && hit.thinFilmThickness[0] ? ` <input name="thin_film_thickness" type="float" value="${hit.thinFilmThickness[0]/1000}" />\n` : ""; |
| 37 | const thinFilmIor = hit.thinFilmIor ? ` <input name="thin_film_ior" type="float" value="${hit.thinFilmIor.toFixed(2)}" />\n` : ""; |
| 38 | const thinWalled = hit.thinFilmThickness && hit.transmission ? ` <input name="geometry_thin_walled" type="boolean" value="true" />\n` : ""; |
| 39 | const xml = |
| 40 | // Commented lines are values that are not used and therefore removed to follow best practices for MaterialX "preset" functionality https://academysoftwarefdn.slack.com/archives/C0230LWBE2X/p1660682953141679?thread_ts=1660168970.997769&cid=C0230LWBE2X |
| 41 | ' <surfacematerial name="'+ hit.name.replace(/ |-|:|\./g, "_").replace(/[\[\]()º]/g, "") +'" type="material">\n' + |
| 42 | ' <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />\n' + |
| 43 | ' </surfacematerial>\n' + |
| 44 | ' <open_pbr_surface name="open_pbr_surface_surfaceshader" type="surfaceshader">\n' + |
| 45 | baseColor + |
| 46 | //' <input name="base_diffuse_roughness" type="float" value="0.0" />\n' + |
| 47 | metalness + |
| 48 | //' <input name="specular_weight" type="float" value="1" />\n' + |
| 49 | specularColor + |
| 50 | roughness + |
| 51 | specularIor + |
| 52 | // ' <input name="specular_roughness_anisotropy" type="float" value="0" />\n' + |
| 53 | transmission + |
| 54 | transmissionColor + |
| 55 | transmissionDepth + |
| 56 | //' <input name="transmission_scatter" type="color3" value="0, 0, 0" />\n' + |
| 57 | //' <input name="transmission_scatter_anisotropy" type="float" value="0" />\n' + |
| 58 | transmissionDispersion + |
| 59 | transmissionDispersionAbbeNumber + |
| 60 | subsurface + |
| 61 | subsurfaceColor + |
| 62 | //' <input name="subsurface_radius" type="float" value="1.0" />\n' + |
| 63 | subsurfaceRadiusScale + |
| 64 | //' <input name="subsurface_scatter_anisotropy" type="float" value="0.0" />\n' + |
| 65 | //' <input name="coat_color" type="color3" value="1, 1, 1" />\n' + |
| 66 | //' <input name="coat_roughness_anisotropy" type="float" value="0.0" />\n' + |
| 67 | //' <input name="coat_ior" type="float" value="1.6" />\n' + |
| 68 | //' <input name="coat_darkening" type="float" value="1.0" />\n' + |