From 069bd625a87e8723aaf5b8efe16c231141a86ad9 Mon Sep 17 00:00:00 2001 From: ethan Date: Tue, 17 Dec 2024 13:12:53 -0500 Subject: [PATCH] Make distance based material application an optional User Pref --- preferences.py | 46 ++++++++++++++++++++++++++++------------------ utils/render.py | 40 +++++++++++++++++----------------------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/preferences.py b/preferences.py index af73617..50663ed 100644 --- a/preferences.py +++ b/preferences.py @@ -56,7 +56,7 @@ class GRABDOC_MT_presets(Menu): class GRABDOC_PT_presets(PresetPanel, Panel): - bl_label = 'GrabDoc Presets' + bl_label = 'Bake Presets' preset_subdir = 'grab_doc' preset_operator = 'script.execute_preset' preset_add_operator = 'grab_doc.preset_add' @@ -136,28 +136,38 @@ class GRABDOC_AP_preferences(AddonPreferences): bl_idname = __package__ marmo_executable: StringProperty( - name="", description="Path to Marmoset Toolbag 3 or 4 executable", - default="", - subtype="FILE_PATH" + name="Marmoset EXE Path", default="", subtype="FILE_PATH" ) + render_within_frustrum: BoolProperty( + name="Render Within Frustrum", + description="""Only render objects within the camera viewing frustrum. -class GRABDOC_property_group(PropertyGroup): - MAP_TYPES = ( - ('none', "None", ""), - ('normals', "Normals", ""), - ('curvature', "Curvature", ""), - ('occlusion', "Ambient Occlusion", ""), - ('height', "Height", ""), - ('id', "Material ID", ""), - ('alpha', "Alpha", ""), - ('color', "Base Color", ""), - ('emissive', "Emissive", ""), - ('roughness', "Roughness", ""), - ('metallic', "Metallic", "") +Improves render speed but it may apply materials incorrectly (void objects).""", + default=False ) + def draw(self, _context): + layout = self.layout + col = layout.column() + col.prop(self, 'marmo_executable') + col.prop(self, 'render_within_frustrum') + + +class GRABDOC_property_group(PropertyGroup): + MAP_TYPES = (('none', "None", ""), + ('normals', "Normals", ""), + ('curvature', "Curvature", ""), + ('occlusion', "Ambient Occlusion", ""), + ('height', "Height", ""), + ('id', "Material ID", ""), + ('alpha', "Alpha", ""), + ('color', "Base Color", ""), + ('emissive', "Emissive", ""), + ('roughness', "Roughness", ""), + ('metallic', "Metallic", "")) + def update_export_name(self, _context: Context): if not self.export_name: self.export_name = "untitled" @@ -188,7 +198,7 @@ def update_scale(self, context: Context): map_range = height_ng.nodes.get('Map Range') map_range.inputs[1].default_value = \ - - self.height[0].distance + gd_camera_ob_z + -self.height[0].distance + gd_camera_ob_z map_range.inputs[2].default_value = gd_camera_ob_z map_range_alpha = \ diff --git a/utils/render.py b/utils/render.py index 0620ff9..db98668 100644 --- a/utils/render.py +++ b/utils/render.py @@ -7,7 +7,7 @@ from ..constants import Global -def is_valid_gd_object( +def is_object_gd_valid( ob: Object, has_prefix: bool=False, render_visible: bool=True, @@ -37,29 +37,18 @@ def in_viewing_frustrum(vector: Vector) -> bool: within the cameras viewing frustrum""" bg_plane = bpy.data.objects[Global.BG_PLANE_NAME] viewing_frustrum = ( - Vector - ( - ( - bg_plane.dimensions.x * -1.25 + bg_plane.location[0], + Vector((bg_plane.dimensions.x * -1.25 + bg_plane.location[0], bg_plane.dimensions.y * -1.25 + bg_plane.location[1], - -100 - ) - ), - Vector( - ( - bg_plane.dimensions.x * 1.25 + bg_plane.location[0], + -100)), + Vector((bg_plane.dimensions.x * 1.25 + bg_plane.location[0], bg_plane.dimensions.y * 1.25 + bg_plane.location[1], - 100 - ) - ) + 100)) ) for i in range(0, 3): - if ( - vector[i] < viewing_frustrum[0][i] \ - and vector[i] < viewing_frustrum[1][i] \ - or vector[i] > viewing_frustrum[0][i] \ - and vector[i] > viewing_frustrum[1][i] - ): + if (vector[i] < viewing_frustrum[0][i] \ + and vector[i] < viewing_frustrum[1][i] \ + or vector[i] > viewing_frustrum[0][i] \ + and vector[i] > viewing_frustrum[1][i]): return False return True @@ -73,7 +62,7 @@ def get_rendered_objects() -> set | None: if coll.gd_bake_collection is False: continue objects.update( - [ob for ob in coll.all_objects if is_valid_gd_object(ob)] + [ob for ob in coll.all_objects if is_object_gd_valid(ob)] ) # TODO: Old method; profile it #for ob in coll.all_objects: @@ -81,10 +70,15 @@ def get_rendered_objects() -> set | None: # rendered_obs.add(ob.name) return objects + package = __package__.rsplit(".", maxsplit=1)[0] + preferences = bpy.context.preferences.addons[package].preferences for ob in bpy.context.view_layer.objects: - if not is_valid_gd_object(ob): + if not is_object_gd_valid(ob): continue - + if not preferences.render_within_frustrum: + objects.add(ob) + continue + # Distance based filter; preference locked local_bbox_center = .125 * sum( (Vector(ob) for ob in ob.bound_box), Vector() )