From 72f2f0fe24cac0e792320e21603d26066a7ab8b8 Mon Sep 17 00:00:00 2001 From: Karl Lattimer Date: Sun, 10 Sep 2023 07:41:54 +0100 Subject: [PATCH] Added PBR material support --- pywavefront/material.py | 114 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/pywavefront/material.py b/pywavefront/material.py index 28e5db6..c23f557 100644 --- a/pywavefront/material.py +++ b/pywavefront/material.py @@ -54,6 +54,14 @@ def __init__(self, name, is_default=False, has_faces=False): self.ambient = [.2, .2, .2, 1.] self.specular = [0., 0., 0., 1.] self.emissive = [0., 0., 0., 1.] + self.roughness = 0. + self.metallic = 0. + self.sheen = 0. + self.clearcoat_thickness = 0. + self.clearcoat_roughness = 0. + self.anisotropy = 0. + self.anisotropy_rotation = 0. + self.transparency = 1.0 self.shininess = 0. self.optical_density = 1.0 @@ -77,6 +85,11 @@ def __init__(self, name, is_default=False, has_faces=False): self.texture_specular_highlight = None self.texture_alpha = None self.texture_bump = None + self.texture_roughness = None + self.texture_metallic = None + self.texture_sheen = None + self.texture_emissive = None + self.texture_normal = None self.is_default = is_default @@ -132,6 +145,27 @@ def set_specular(self, values=None): def set_emissive(self, values=None): self.emissive = self.pad_light(values or []) + def set_roughness(self, value): + self.roughness = value + + def set_metallic(self, value): + self.metallic = value + + def set_sheen(self, value): + self.metallic = value + + def set_clearcoat_thickness(self, value): + self.clearcoat_thickness = value + + def set_clearcoat_roughness(self, value): + self.clearcoat_roughness = value + + def set_anisotropy(self, value): + self.anisotropy = value + + def set_anisotropy_rotation(self, value): + self.anisotropy_rotation = value + def set_texture(self, name, search_path): self.texture = self.texture_cls(name, search_path) @@ -150,6 +184,21 @@ def set_texture_alpha(self, name, search_path): def set_texture_bump(self, name, search_path): self.texture_bump = self.texture_cls(name, search_path) + def set_texture_roughness(self, name, search_path): + self.texture_roughness = self.texture_cls(name, search_path) + + def set_texture_metallic(self, name, search_path): + self.texture_metallic = self.texture_cls(name, search_path) + + def set_texture_sheen(self, name, search_path): + self.texture_sheen = self.texture_cls(name, search_path) + + def set_texture_emissive(self, name, search_path): + self.texture_emissive = self.texture_cls(name, search_path) + + def set_texture_normal(self, name, search_path): + self.texture_normal = self.texture_cls(name, search_path) + def unset_texture(self): self.texture = None @@ -209,6 +258,41 @@ def parse_Tr(self): """Transparency (alternative)""" self.this_material.set_alpha(1.0 - float(self.values[1])) + @auto_consume + def parse_Pr(self): + """PBR: Roughness""" + self.this_material.set_roughness(self.values[1]) + + @auto_consume + def parse_Pm(self): + """PBR: Metallic""" + self.this_material.set_metallic(self.values[1]) + + @auto_consume + def parse_Ps(self): + """PBR: Sheen""" + self.this_material.set_sheen(self.values[1]) + + @auto_consume + def parse_Pc(self): + """PBR: Clearcoat""" + self.this_material.set_clearcoat_thickness(self.values[1]) + + @auto_consume + def parse_Pcr(self): + """PBR: Clearcoat Roughness""" + self.this_material.set_clearcoat_roughness(self.values[1]) + + @auto_consume + def parse_aniso(self): + """PBR: Anisotropy""" + self.this_material.set_anisotropy(self.values[1]) + + @auto_consume + def parse_anisor(self): + """PBR: Anisotropy rotation""" + self.this_material.set_anisotropy_rotation(self.values[1]) + @auto_consume def parse_map_Kd(self): """Diffuse map""" @@ -253,6 +337,36 @@ def parse_map_Bump(self): """Bump map (variant)""" self.parse_bump() + @auto_consume + def parse_map_Pr(self): + """PBR: Roughness map""" + name = self.line[self.line.find(' ') + 1:].strip() + self.this_material.set_texture_roughness(name, self.dir) + + @auto_consume + def parse_map_Pm(self): + """PBR: Metallic map""" + name = self.line[self.line.find(' ') + 1:].strip() + self.this_material.set_texture_metallic(name, self.dir) + + @auto_consume + def parse_map_Ps(self): + """PBR: Sheen map""" + name = self.line[self.line.find(' ') + 1:].strip() + self.this_material.set_texture_sheen(name, self.dir) + + @auto_consume + def parse_map_Ke(self): + """PBR: Emissive map""" + name = self.line[self.line.find(' ') + 1:].strip() + self.this_material.set_texture_emissive(name, self.dir) + + @auto_consume + def parse_map_norm(self): + """PBR: Normal map""" + name = self.line[self.line.find(' ') + 1:].strip() + self.this_material.set_texture_normal(name, self.dir) + @auto_consume def parse_Ni(self): self.this_material.optical_density = float(self.values[1])