import sys import os import bpy # 1. Resolve path to include workspace root so pr3tz can be imported dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if dir_path not in sys.path: sys.path.append(dir_path) import pr3tz # 2. Register pr3tz addon try: if "pr3tz" in sys.modules: import importlib importlib.reload(pr3tz) else: import pr3tz pr3tz.register() print("[Pr3tz] Registered successfully!") except Exception as e: print(f"[Pr3tz] Failed to register: {e}") sys.exit(1) # 3. Configure the scene (camera, lights, timeline, etc.) pr3tz.setup_scene() # 4. Clear existing playlist scene = bpy.context.scene scene.knot_list.clear() # 5. Add a simple spinning knot configuration item = scene.knot_list.add() item.name = "Render Example Knot" item.shape_type = 'TORUS_KNOT' item.torus_p = 2 item.torus_q = 5 item.torus_R = 2.0 item.torus_r = 0.8 item.geo_bDepth = 0.06 item.spin_phase_rate = 0.02 item.material_mode = 'PRESET' item.shader_id = 'NEON_GLOW' item.preset_color = (0.0, 0.5, 1.0) # Neon blue item.preset_emission_strength = 2.0 pr3tz.materials.prewarm_materials_and_blends(scene) # 6. Configure rendering for a super-fast headless export scene.render.engine = 'CYCLES' scene.cycles.samples = 4 # Very low samples for quick testing scene.cycles.use_denoising = False # Render size (small for fast test rendering) scene.render.resolution_x = 480 scene.render.resolution_y = 270 scene.render.resolution_percentage = 100 # Setup Output directory output_dir = os.path.join(dir_path, "renders") if not os.path.exists(output_dir): os.makedirs(output_dir) # Set base filename scene.render.filepath = os.path.join(output_dir, "frame_") scene.render.image_settings.file_format = 'PNG' scene.render.image_settings.color_mode = 'RGBA' # 7. Render a short range (10 frames) start_frame = 1 end_frame = 10 print(f"\nHeadless Render Started. Rendering frames {start_frame} to {end_frame}...") for f in range(start_frame, end_frame + 1): print(f"Rendering frame {f}/{end_frame}...") scene.frame_set(f) # Triggers knot_frame_handler automatically # We construct the filepath for this frame manually to save it scene.render.filepath = os.path.join(output_dir, f"frame_{f:04d}.png") # Execute render bpy.ops.render.render(write_still=True) print(f"\nRendering complete! Output frames saved to: {output_dir}") print("\n=====================================================================") print("Example 7: Headless Render Script Completed!") print("=====================================================================") print("You can run this script from your terminal headlessly using:") print(" blender -b -P examples/07_headless_render.py") print("=====================================================================\n")