2 # Copyright 2011-2013 Blender Foundation
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
20 from bpy.props import (BoolProperty,
32 ('CPU', "CPU", "Use CPU for rendering"),
33 ('GPU', "GPU Compute", "Use GPU compute device for rendering, configured in the system tab in the user preferences"),
36 if _cycles.with_network:
37 enum_devices += (('NETWORK', "Networked Device", "Use networked device for rendering"),)
40 ('SUPPORTED', "Supported", "Only use finished and supported features"),
41 ('EXPERIMENTAL', "Experimental", "Use experimental and incomplete features that might be broken or change in the future", 'ERROR', 1),
44 enum_displacement_methods = (
45 ('BUMP', "Bump", "Bump mapping to simulate the appearance of displacement"),
46 ('TRUE', "True", "Use true displacement only, requires fine subdivision"),
47 ('BOTH', "Both", "Combination of displacement and bump mapping"),
51 ('DYNAMIC_BVH', "Dynamic BVH", "Objects can be individually updated, at the cost of slower render time"),
52 ('STATIC_BVH', "Static BVH", "Any object modification requires a complete BVH rebuild, but renders faster"),
56 ('BOX', "Box", "Box filter"),
57 ('GAUSSIAN', "Gaussian", "Gaussian filter"),
58 ('BLACKMAN_HARRIS', "Blackman-Harris", "Blackman-Harris filter"),
61 enum_aperture_types = (
62 ('RADIUS', "Radius", "Directly change the size of the aperture"),
63 ('FSTOP', "F-stop", "Change the size of the aperture by f-stop"),
66 enum_panorama_types = (
67 ('EQUIRECTANGULAR', "Equirectangular", "Render the scene with a spherical camera, also known as Lat Long panorama"),
68 ('FISHEYE_EQUIDISTANT', "Fisheye Equidistant", "Ideal for fulldomes, ignore the sensor dimensions"),
69 ('FISHEYE_EQUISOLID', "Fisheye Equisolid",
70 "Similar to most fisheye modern lens, takes sensor dimensions into consideration"),
71 ('MIRRORBALL', "Mirror Ball", "Uses the mirror ball mapping"),
74 enum_curve_primitives = (
75 ('TRIANGLES', "Triangles", "Create triangle geometry around strands"),
76 ('LINE_SEGMENTS', "Line Segments", "Use line segment primitives"),
77 ('CURVE_SEGMENTS', "Curve Segments", "Use segmented cardinal curve primitives"),
80 enum_triangle_curves = (
81 ('CAMERA_TRIANGLES', "Planes", "Create individual triangles forming planes that face camera"),
82 ('TESSELLATED_TRIANGLES', "Tessellated", "Create mesh surrounding each strand"),
86 ('RIBBONS', "Ribbons", "Ignore thickness of each strand"),
87 ('THICK', "Thick", "Use thickness of strand when rendering"),
91 ('CENTER', "Center", "Render from center to the edges"),
92 ('RIGHT_TO_LEFT', "Right to Left", "Render from right to left"),
93 ('LEFT_TO_RIGHT', "Left to Right", "Render from left to right"),
94 ('TOP_TO_BOTTOM', "Top to Bottom", "Render from top to bottom"),
95 ('BOTTOM_TO_TOP', "Bottom to Top", "Render from bottom to top"),
96 ('HILBERT_SPIRAL', "Hilbert Spiral", "Render in a Hilbert Spiral"),
99 enum_use_layer_samples = (
100 ('USE', "Use", "Per render layer number of samples override scene samples"),
101 ('BOUNDED', "Bounded", "Bound per render layer number of samples by global samples"),
102 ('IGNORE', "Ignore", "Ignore per render layer number of samples"),
105 enum_sampling_pattern = (
106 ('SOBOL', "Sobol", "Use Sobol random sampling pattern"),
107 ('CORRELATED_MUTI_JITTER', "Correlated Multi-Jitter", "Use Correlated Multi-Jitter random sampling pattern"),
111 ('BRANCHED_PATH', "Branched Path Tracing", "Path tracing integrator that branches on the first bounce, giving more control over the number of light and material samples"),
112 ('PATH', "Path Tracing", "Pure path tracing integrator"),
115 enum_volume_sampling = (
116 ('DISTANCE', "Distance", "Use distance sampling, best for dense volumes with lights far away"),
117 ('EQUIANGULAR', "Equiangular", "Use equiangular sampling, best for volumes with low density with light inside or near the volume"),
118 ('MULTIPLE_IMPORTANCE', "Multiple Importance", "Combine distance and equi-angular sampling for volumes where neither method is ideal"),
121 enum_volume_interpolation = (
122 ('LINEAR', "Linear", "Good smoothness and speed"),
123 ('CUBIC', "Cubic", "Smoothed high quality interpolation, but slower")
127 ('CPU', "CPU", "CPU", 0),
128 ('CUDA', "CUDA", "CUDA", 1),
129 ('OPENCL', "OpenCL", "OpenCL", 2)
132 enum_texture_limit = (
133 ('OFF', "No Limit", "No texture size limit", 0),
134 ('128', "128", "Limit texture size to 128 pixels", 1),
135 ('256', "256", "Limit texture size to 256 pixels", 2),
136 ('512', "512", "Limit texture size to 512 pixels", 3),
137 ('1024', "1024", "Limit texture size to 1024 pixels", 4),
138 ('2048', "2048", "Limit texture size to 2048 pixels", 5),
139 ('4096', "4096", "Limit texture size to 4096 pixels", 6),
140 ('8192', "8192", "Limit texture size to 8192 pixels", 7),
143 class CyclesRenderSettings(bpy.types.PropertyGroup):
146 bpy.types.Scene.cycles = PointerProperty(
147 name="Cycles Render Settings",
148 description="Cycles render settings",
151 cls.device = EnumProperty(
153 description="Device to use for rendering",
157 cls.feature_set = EnumProperty(
159 description="Feature set to use for rendering",
160 items=enum_feature_set,
163 cls.shading_system = BoolProperty(
164 name="Open Shading Language",
165 description="Use Open Shading Language (CPU rendering only)",
168 cls.progressive = EnumProperty(
170 description="Method to sample lights and materials",
171 items=enum_integrator,
175 cls.use_square_samples = BoolProperty(
176 name="Square Samples",
177 description="Square sampling values for easier artist control",
181 cls.samples = IntProperty(
183 description="Number of samples to render for each pixel",
184 min=1, max=2147483647,
187 cls.preview_samples = IntProperty(
188 name="Preview Samples",
189 description="Number of samples to render in the viewport, unlimited if 0",
190 min=0, max=2147483647,
193 cls.preview_pause = BoolProperty(
194 name="Pause Preview",
195 description="Pause all viewport preview renders",
198 cls.aa_samples = IntProperty(
200 description="Number of antialiasing samples to render for each pixel",
204 cls.preview_aa_samples = IntProperty(
206 description="Number of antialiasing samples to render in the viewport, unlimited if 0",
210 cls.diffuse_samples = IntProperty(
211 name="Diffuse Samples",
212 description="Number of diffuse bounce samples to render for each AA sample",
216 cls.glossy_samples = IntProperty(
217 name="Glossy Samples",
218 description="Number of glossy bounce samples to render for each AA sample",
222 cls.transmission_samples = IntProperty(
223 name="Transmission Samples",
224 description="Number of transmission bounce samples to render for each AA sample",
228 cls.ao_samples = IntProperty(
229 name="Ambient Occlusion Samples",
230 description="Number of ambient occlusion samples to render for each AA sample",
234 cls.mesh_light_samples = IntProperty(
235 name="Mesh Light Samples",
236 description="Number of mesh emission light samples to render for each AA sample",
241 cls.subsurface_samples = IntProperty(
242 name="Subsurface Samples",
243 description="Number of subsurface scattering samples to render for each AA sample",
248 cls.volume_samples = IntProperty(
249 name="Volume Samples",
250 description="Number of volume scattering samples to render for each AA sample",
255 cls.sampling_pattern = EnumProperty(
256 name="Sampling Pattern",
257 description="Random sampling pattern used by the integrator",
258 items=enum_sampling_pattern,
262 cls.use_layer_samples = EnumProperty(
263 name="Layer Samples",
264 description="How to use per render layer sample settings",
265 items=enum_use_layer_samples,
269 cls.sample_all_lights_direct = BoolProperty(
270 name="Sample All Direct Lights",
271 description="Sample all lights (for direct samples), rather than randomly picking one",
275 cls.sample_all_lights_indirect = BoolProperty(
276 name="Sample All Indirect Lights",
277 description="Sample all lights (for indirect samples), rather than randomly picking one",
280 cls.light_sampling_threshold = FloatProperty(
281 name="Light Sampling Threshold",
282 description="Probabilistically terminate light samples when the light contribution is below this threshold (more noise but faster rendering). "
283 "Zero disables the test and never ignores lights",
288 cls.caustics_reflective = BoolProperty(
289 name="Reflective Caustics",
290 description="Use reflective caustics, resulting in a brighter image (more noise but added realism)",
294 cls.caustics_refractive = BoolProperty(
295 name="Refractive Caustics",
296 description="Use refractive caustics, resulting in a brighter image (more noise but added realism)",
300 cls.blur_glossy = FloatProperty(
301 name="Filter Glossy",
302 description="Adaptively blur glossy shaders after blurry bounces, "
303 "to reduce noise at the cost of accuracy",
308 cls.min_bounces = IntProperty(
310 description="Minimum number of bounces, setting this lower "
311 "than the maximum enables probabilistic path "
312 "termination (faster but noisier)",
316 cls.max_bounces = IntProperty(
318 description="Total maximum number of bounces",
323 cls.diffuse_bounces = IntProperty(
324 name="Diffuse Bounces",
325 description="Maximum number of diffuse reflection bounces, bounded by total maximum",
329 cls.glossy_bounces = IntProperty(
330 name="Glossy Bounces",
331 description="Maximum number of glossy reflection bounces, bounded by total maximum",
335 cls.transmission_bounces = IntProperty(
336 name="Transmission Bounces",
337 description="Maximum number of transmission bounces, bounded by total maximum",
341 cls.volume_bounces = IntProperty(
342 name="Volume Bounces",
343 description="Maximum number of volumetric scattering events",
348 cls.transparent_min_bounces = IntProperty(
349 name="Transparent Min Bounces",
350 description="Minimum number of transparent bounces, setting "
351 "this lower than the maximum enables "
352 "probabilistic path termination (faster but "
357 cls.transparent_max_bounces = IntProperty(
358 name="Transparent Max Bounces",
359 description="Maximum number of transparent bounces",
363 cls.use_transparent_shadows = BoolProperty(
364 name="Transparent Shadows",
365 description="Use transparency of surfaces for rendering shadows",
369 cls.volume_step_size = FloatProperty(
371 description="Distance between volume shader samples when rendering the volume "
372 "(lower values give more accurate and detailed results, but also increased render time)",
374 min=0.0000001, max=100000.0, soft_min=0.01, soft_max=1.0, precision=4
377 cls.volume_max_steps = IntProperty(
379 description="Maximum number of steps through the volume before giving up, "
380 "to avoid extremely long render times with big objects or small step sizes",
385 cls.dicing_rate = FloatProperty(
387 description="Size of a micropolygon in pixels",
388 min=0.1, max=1000.0, soft_min=0.5,
392 cls.preview_dicing_rate = FloatProperty(
393 name="Preview Dicing Rate",
394 description="Size of a micropolygon in pixels during preview render",
395 min=0.1, max=1000.0, soft_min=0.5,
400 cls.max_subdivisions = IntProperty(
401 name="Max Subdivisions",
402 description="Stop subdividing when this level is reached even if the dice rate would produce finer tessellation",
407 cls.film_exposure = FloatProperty(
409 description="Image brightness scale",
413 cls.film_transparent = BoolProperty(
415 description="World background is transparent with premultiplied alpha",
419 # Really annoyingly, we have to keep it around for a few releases,
420 # otherwise forward compatibility breaks in really bad manner: CRASH!
422 # TODO(sergey): Remove this during 2.8x series of Blender.
423 cls.filter_type = EnumProperty(
425 description="Pixel filter type",
426 items=enum_filter_types,
427 default='BLACKMAN_HARRIS',
430 cls.pixel_filter_type = EnumProperty(
432 description="Pixel filter type",
433 items=enum_filter_types,
434 default='BLACKMAN_HARRIS',
437 cls.filter_width = FloatProperty(
439 description="Pixel filter width",
444 cls.seed = IntProperty(
446 description="Seed value for integrator to get different noise patterns",
447 min=0, max=2147483647,
451 cls.use_animated_seed = BoolProperty(
452 name="Use Animated Seed",
453 description="Use different seed values (and hence noise patterns) at different frames",
457 cls.sample_clamp_direct = FloatProperty(
459 description="If non-zero, the maximum value for a direct sample, "
460 "higher values will be scaled down to avoid too "
461 "much noise and slow convergence at the cost of accuracy",
466 cls.sample_clamp_indirect = FloatProperty(
467 name="Clamp Indirect",
468 description="If non-zero, the maximum value for an indirect sample, "
469 "higher values will be scaled down to avoid too "
470 "much noise and slow convergence at the cost of accuracy",
475 cls.debug_tile_size = IntProperty(
482 cls.preview_start_resolution = IntProperty(
483 name="Start Resolution",
484 description="Resolution to start rendering preview at, "
485 "progressively increasing it to the full viewport size",
490 cls.debug_reset_timeout = FloatProperty(
491 name="Reset timeout",
496 cls.debug_cancel_timeout = FloatProperty(
497 name="Cancel timeout",
502 cls.debug_text_timeout = FloatProperty(
509 cls.debug_bvh_type = EnumProperty(
510 name="Viewport BVH Type",
511 description="Choose between faster updates, or faster render",
512 items=enum_bvh_types,
513 default='DYNAMIC_BVH',
515 cls.debug_use_spatial_splits = BoolProperty(
516 name="Use Spatial Splits",
517 description="Use BVH spatial splits: longer builder time, faster render",
520 cls.debug_use_hair_bvh = BoolProperty(
522 description="Use special type BVH optimized for hair (uses more ram but renders faster)",
525 cls.debug_bvh_time_steps = IntProperty(
526 name="BVH Time Steps",
527 description="Split BVH primitives by this number of time steps to speed up render time in cost of memory",
531 cls.tile_order = EnumProperty(
533 description="Tile order for rendering",
534 items=enum_tile_order,
535 default='HILBERT_SPIRAL',
536 options=set(), # Not animatable!
538 cls.use_progressive_refine = BoolProperty(
539 name="Progressive Refine",
540 description="Instead of rendering each tile until it is finished, "
541 "refine the whole image progressively "
542 "(this renders somewhat slower, "
543 "but time can be saved by manually stopping the render when the noise is low enough)",
547 cls.bake_type = EnumProperty(
550 description="Type of pass to bake",
552 ('COMBINED', "Combined", ""),
553 ('AO', "Ambient Occlusion", ""),
554 ('SHADOW', "Shadow", ""),
555 ('NORMAL', "Normal", ""),
557 ('EMIT', "Emit", ""),
558 ('ENVIRONMENT', "Environment", ""),
559 ('DIFFUSE', "Diffuse", ""),
560 ('GLOSSY', "Glossy", ""),
561 ('TRANSMISSION', "Transmission", ""),
562 ('SUBSURFACE', "Subsurface", ""),
566 cls.use_camera_cull = BoolProperty(
567 name="Use Camera Cull",
568 description="Allow objects to be culled based on the camera frustum",
572 cls.camera_cull_margin = FloatProperty(
573 name="Camera Cull Margin",
574 description="Margin for the camera space culling",
579 cls.use_distance_cull = BoolProperty(
580 name="Use Distance Cull",
581 description="Allow objects to be culled based on the distance from camera",
585 cls.distance_cull_margin = FloatProperty(
586 name="Cull Distance",
587 description="Cull objects which are further away from camera than this distance",
592 cls.motion_blur_position = EnumProperty(
593 name="Motion Blur Position",
595 description="Offset for the shutter's time interval, allows to change the motion blur trails",
597 ('START', "Start on Frame", "The shutter opens at the current frame"),
598 ('CENTER', "Center on Frame", "The shutter is open during the current frame"),
599 ('END', "End on Frame", "The shutter closes at the current frame"),
603 cls.rolling_shutter_type = EnumProperty(
606 description="Type of rolling shutter effect matching CMOS-based cameras",
608 ('NONE', "None", "No rolling shutter effect used"),
609 ('TOP', "Top-Bottom", "Sensor is being scanned from top to bottom")
610 # TODO(seergey): Are there real cameras with different scanning direction?
614 cls.rolling_shutter_duration = FloatProperty(
615 name="Rolling Shutter Duration",
616 description="Scanline \"exposure\" time for the rolling shutter effect",
621 cls.texture_limit = EnumProperty(
622 name="Viewport Texture Limit",
624 description="Limit texture size used by viewport rendering",
625 items=enum_texture_limit
628 cls.texture_limit_render = EnumProperty(
629 name="Render Texture Limit",
631 description="Limit texture size used by final rendering",
632 items=enum_texture_limit
635 cls.ao_bounces = IntProperty(
638 description="Approximate indirect light with background tinted ambient occlusion at the specified bounce, 0 disables this feature",
642 cls.ao_bounces_render = IntProperty(
643 name="AO Bounces Render",
645 description="Approximate indirect light with background tinted ambient occlusion at the specified bounce, 0 disables this feature",
649 # Various fine-tuning debug flags
651 def devices_update_callback(self, context):
653 scene = context.scene.as_pointer()
654 return _cycles.debug_flags_update(scene)
656 cls.debug_use_cpu_avx2 = BoolProperty(name="AVX2", default=True)
657 cls.debug_use_cpu_avx = BoolProperty(name="AVX", default=True)
658 cls.debug_use_cpu_sse41 = BoolProperty(name="SSE41", default=True)
659 cls.debug_use_cpu_sse3 = BoolProperty(name="SSE3", default=True)
660 cls.debug_use_cpu_sse2 = BoolProperty(name="SSE2", default=True)
661 cls.debug_use_qbvh = BoolProperty(name="QBVH", default=True)
662 cls.debug_use_cpu_split_kernel = BoolProperty(name="Split Kernel", default=False)
664 cls.debug_use_cuda_adaptive_compile = BoolProperty(name="Adaptive Compile", default=False)
665 cls.debug_use_cuda_split_kernel = BoolProperty(name="Split Kernel", default=False)
667 cls.debug_opencl_kernel_type = EnumProperty(
668 name="OpenCL Kernel Type",
671 ('DEFAULT', "Default", ""),
672 ('MEGA', "Mega", ""),
673 ('SPLIT', "Split", ""),
675 update=devices_update_callback
678 cls.debug_opencl_device_type = EnumProperty(
679 name="OpenCL Device Type",
682 ('NONE', "None", ""),
684 ('DEFAULT', "Default", ""),
687 ('ACCELERATOR', "Accelerator", ""),
689 update=devices_update_callback
692 cls.debug_opencl_kernel_single_program = BoolProperty(name="Single Program", default=True, update=devices_update_callback);
694 cls.debug_use_opencl_debug = BoolProperty(name="Debug OpenCL", default=False)
698 del bpy.types.Scene.cycles
701 class CyclesCameraSettings(bpy.types.PropertyGroup):
706 bpy.types.Camera.cycles = PointerProperty(
707 name="Cycles Camera Settings",
708 description="Cycles camera settings",
712 cls.aperture_type = EnumProperty(
713 name="Aperture Type",
714 description="Use f-stop number or aperture radius",
715 items=enum_aperture_types,
718 cls.aperture_fstop = FloatProperty(
719 name="Aperture f-stop",
720 description="F-stop ratio (lower numbers give more defocus, higher numbers give a sharper image)",
721 min=0.0, soft_min=0.1, soft_max=64.0,
726 cls.aperture_size = FloatProperty(
727 name="Aperture Size",
728 description="Radius of the aperture for depth of field (higher values give more defocus)",
729 min=0.0, soft_max=10.0,
735 cls.aperture_blades = IntProperty(
736 name="Aperture Blades",
737 description="Number of blades in aperture for polygonal bokeh (at least 3)",
741 cls.aperture_rotation = FloatProperty(
742 name="Aperture Rotation",
743 description="Rotation of blades in aperture",
744 soft_min=-math.pi, soft_max=math.pi,
748 cls.aperture_ratio = FloatProperty(
749 name="Aperture Ratio",
750 description="Distortion to simulate anamorphic lens bokeh",
751 min=0.01, soft_min=1.0, soft_max=2.0,
755 cls.panorama_type = EnumProperty(
756 name="Panorama Type",
757 description="Distortion to use for the calculation",
758 items=enum_panorama_types,
759 default='FISHEYE_EQUISOLID',
761 cls.fisheye_fov = FloatProperty(
762 name="Field of View",
763 description="Field of view for the fisheye lens",
764 min=0.1745, soft_max=2.0 * math.pi, max=10.0 * math.pi,
768 cls.fisheye_lens = FloatProperty(
770 description="Lens focal length (mm)",
771 min=0.01, soft_max=15.0, max=100.0,
774 cls.latitude_min = FloatProperty(
776 description="Minimum latitude (vertical angle) for the equirectangular lens",
777 min=-0.5 * math.pi, max=0.5 * math.pi,
779 default=-0.5 * math.pi,
781 cls.latitude_max = FloatProperty(
783 description="Maximum latitude (vertical angle) for the equirectangular lens",
784 min=-0.5 * math.pi, max=0.5 * math.pi,
786 default=0.5 * math.pi,
788 cls.longitude_min = FloatProperty(
789 name="Min Longitude",
790 description="Minimum longitude (horizontal angle) for the equirectangular lens",
791 min=-math.pi, max=math.pi,
795 cls.longitude_max = FloatProperty(
796 name="Max Longitude",
797 description="Maximum longitude (horizontal angle) for the equirectangular lens",
798 min=-math.pi, max=math.pi,
805 del bpy.types.Camera.cycles
808 class CyclesMaterialSettings(bpy.types.PropertyGroup):
811 bpy.types.Material.cycles = PointerProperty(
812 name="Cycles Material Settings",
813 description="Cycles material settings",
816 cls.sample_as_light = BoolProperty(
817 name="Multiple Importance Sample",
818 description="Use multiple importance sampling for this material, "
819 "disabling may reduce overall noise for large "
820 "objects that emit little light compared to other light sources",
823 cls.use_transparent_shadow = BoolProperty(
824 name="Transparent Shadows",
825 description="Use transparent shadows for this material if it contains a Transparent BSDF, "
826 "disabling will render faster but not give accurate shadows",
829 cls.homogeneous_volume = BoolProperty(
830 name="Homogeneous Volume",
831 description="When using volume rendering, assume volume has the same density everywhere "
832 "(not using any textures), for faster rendering",
835 cls.volume_sampling = EnumProperty(
836 name="Volume Sampling",
837 description="Sampling method to use for volumes",
838 items=enum_volume_sampling,
839 default='MULTIPLE_IMPORTANCE',
842 cls.volume_interpolation = EnumProperty(
843 name="Volume Interpolation",
844 description="Interpolation method to use for smoke/fire volumes",
845 items=enum_volume_interpolation,
849 cls.displacement_method = EnumProperty(
850 name="Displacement Method",
851 description="Method to use for the displacement",
852 items=enum_displacement_methods,
858 del bpy.types.Material.cycles
861 class CyclesLampSettings(bpy.types.PropertyGroup):
864 bpy.types.Lamp.cycles = PointerProperty(
865 name="Cycles Lamp Settings",
866 description="Cycles lamp settings",
869 cls.cast_shadow = BoolProperty(
871 description="Lamp casts shadows",
874 cls.samples = IntProperty(
876 description="Number of light samples to render for each AA sample",
880 cls.max_bounces = IntProperty(
882 description="Maximum number of bounces the light will contribute to the render",
886 cls.use_multiple_importance_sampling = BoolProperty(
887 name="Multiple Importance Sample",
888 description="Use multiple importance sampling for the lamp, "
889 "reduces noise for area lamps and sharp glossy materials",
892 cls.is_portal = BoolProperty(
894 description="Use this area lamp to guide sampling of the background, "
895 "note that this will make the lamp invisible",
901 del bpy.types.Lamp.cycles
904 class CyclesWorldSettings(bpy.types.PropertyGroup):
907 bpy.types.World.cycles = PointerProperty(
908 name="Cycles World Settings",
909 description="Cycles world settings",
912 cls.sample_as_light = BoolProperty(
913 name="Multiple Importance Sample",
914 description="Use multiple importance sampling for the environment, "
915 "enabling for non-solid colors is recommended",
918 cls.sample_map_resolution = IntProperty(
919 name="Map Resolution",
920 description="Importance map size is resolution x resolution; "
921 "higher values potentially produce less noise, at the cost of memory and speed",
925 cls.samples = IntProperty(
927 description="Number of light samples to render for each AA sample",
931 cls.max_bounces = IntProperty(
933 description="Maximum number of bounces the background light will contribute to the render",
937 cls.homogeneous_volume = BoolProperty(
938 name="Homogeneous Volume",
939 description="When using volume rendering, assume volume has the same density everywhere"
940 "(not using any textures), for faster rendering",
943 cls.volume_sampling = EnumProperty(
944 name="Volume Sampling",
945 description="Sampling method to use for volumes",
946 items=enum_volume_sampling,
947 default='EQUIANGULAR',
950 cls.volume_interpolation = EnumProperty(
951 name="Volume Interpolation",
952 description="Interpolation method to use for volumes",
953 items=enum_volume_interpolation,
959 del bpy.types.World.cycles
962 class CyclesVisibilitySettings(bpy.types.PropertyGroup):
965 bpy.types.Object.cycles_visibility = PointerProperty(
966 name="Cycles Visibility Settings",
967 description="Cycles visibility settings",
971 bpy.types.World.cycles_visibility = PointerProperty(
972 name="Cycles Visibility Settings",
973 description="Cycles visibility settings",
977 cls.camera = BoolProperty(
979 description="Object visibility for camera rays",
982 cls.diffuse = BoolProperty(
984 description="Object visibility for diffuse reflection rays",
987 cls.glossy = BoolProperty(
989 description="Object visibility for glossy reflection rays",
992 cls.transmission = BoolProperty(
994 description="Object visibility for transmission rays",
997 cls.shadow = BoolProperty(
999 description="Object visibility for shadow rays",
1002 cls.scatter = BoolProperty(
1003 name="Volume Scatter",
1004 description="Object visibility for volume scatter rays",
1009 def unregister(cls):
1010 del bpy.types.Object.cycles_visibility
1011 del bpy.types.World.cycles_visibility
1014 class CyclesMeshSettings(bpy.types.PropertyGroup):
1017 bpy.types.Mesh.cycles = PointerProperty(
1018 name="Cycles Mesh Settings",
1019 description="Cycles mesh settings",
1022 bpy.types.Curve.cycles = PointerProperty(
1023 name="Cycles Mesh Settings",
1024 description="Cycles mesh settings",
1027 bpy.types.MetaBall.cycles = PointerProperty(
1028 name="Cycles Mesh Settings",
1029 description="Cycles mesh settings",
1034 def unregister(cls):
1035 del bpy.types.Mesh.cycles
1036 del bpy.types.Curve.cycles
1037 del bpy.types.MetaBall.cycles
1040 class CyclesObjectSettings(bpy.types.PropertyGroup):
1043 bpy.types.Object.cycles = PointerProperty(
1044 name="Cycles Object Settings",
1045 description="Cycles object settings",
1049 cls.use_motion_blur = BoolProperty(
1050 name="Use Motion Blur",
1051 description="Use motion blur for this object",
1055 cls.use_deform_motion = BoolProperty(
1056 name="Use Deformation Motion",
1057 description="Use deformation motion blur for this object",
1061 cls.motion_steps = IntProperty(
1062 name="Motion Steps",
1063 description="Control accuracy of deformation motion blur, more steps gives more memory usage (actual number of steps is 2^(steps - 1))",
1068 cls.use_camera_cull = BoolProperty(
1069 name="Use Camera Cull",
1070 description="Allow this object and its duplicators to be culled by camera space culling",
1074 cls.use_distance_cull = BoolProperty(
1075 name="Use Distance Cull",
1076 description="Allow this object and its duplicators to be culled by distance from camera",
1080 cls.use_adaptive_subdivision = BoolProperty(
1081 name="Use Adaptive Subdivision",
1082 description="Use adaptive render time subdivision",
1086 cls.dicing_rate = FloatProperty(
1087 name="Dicing Scale",
1088 description="Multiplier for scene dicing rate (located in the Geometry Panel)",
1089 min=0.1, max=1000.0, soft_min=0.5,
1093 cls.is_shadow_catcher = BoolProperty(
1094 name="Shadow Catcher",
1095 description="Only render shadows on this object, for compositing renders into real footage",
1100 def unregister(cls):
1101 del bpy.types.Object.cycles
1104 class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
1107 bpy.types.Scene.cycles_curves = PointerProperty(
1108 name="Cycles Hair Rendering Settings",
1109 description="Cycles hair rendering settings",
1112 cls.primitive = EnumProperty(
1114 description="Type of primitive used for hair rendering",
1115 items=enum_curve_primitives,
1116 default='LINE_SEGMENTS',
1118 cls.shape = EnumProperty(
1120 description="Form of hair",
1121 items=enum_curve_shape,
1124 cls.cull_backfacing = BoolProperty(
1125 name="Cull back-faces",
1126 description="Do not test the back-face of each strand",
1129 cls.use_curves = BoolProperty(
1130 name="Use Cycles Hair Rendering",
1131 description="Activate Cycles hair rendering for particle system",
1134 cls.resolution = IntProperty(
1136 description="Resolution of generated mesh",
1140 cls.minimum_width = FloatProperty(
1141 name="Minimal width",
1142 description="Minimal pixel width for strands (0 - deactivated)",
1146 cls.maximum_width = FloatProperty(
1147 name="Maximal width",
1148 description="Maximum extension that strand radius can be increased by",
1152 cls.subdivisions = IntProperty(
1153 name="Subdivisions",
1154 description="Number of subdivisions used in Cardinal curve intersection (power of 2)",
1160 def unregister(cls):
1161 del bpy.types.Scene.cycles_curves
1163 class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
1166 bpy.types.SceneRenderLayer.cycles = PointerProperty(
1167 name="Cycles SceneRenderLayer Settings",
1168 description="Cycles SceneRenderLayer Settings",
1171 cls.pass_debug_bvh_traversed_nodes = BoolProperty(
1172 name="Debug BVH Traversed Nodes",
1173 description="Store Debug BVH Traversed Nodes pass",
1176 cls.pass_debug_bvh_traversed_instances = BoolProperty(
1177 name="Debug BVH Traversed Instances",
1178 description="Store Debug BVH Traversed Instances pass",
1181 cls.pass_debug_bvh_intersections = BoolProperty(
1182 name="Debug BVH Intersections",
1183 description="Store Debug BVH Intersections",
1186 cls.pass_debug_ray_bounces = BoolProperty(
1187 name="Debug Ray Bounces",
1188 description="Store Debug Ray Bounces pass",
1192 cls.use_denoising = BoolProperty(
1193 name="Use Denoising",
1194 description="Denoise the rendered image",
1197 cls.denoising_diffuse_direct = BoolProperty(
1198 name="Diffuse Direct",
1199 description="Denoise the direct diffuse lighting",
1202 cls.denoising_diffuse_indirect = BoolProperty(
1203 name="Diffuse Indirect",
1204 description="Denoise the indirect diffuse lighting",
1207 cls.denoising_glossy_direct = BoolProperty(
1208 name="Glossy Direct",
1209 description="Denoise the direct glossy lighting",
1212 cls.denoising_glossy_indirect = BoolProperty(
1213 name="Glossy Indirect",
1214 description="Denoise the indirect glossy lighting",
1217 cls.denoising_transmission_direct = BoolProperty(
1218 name="Transmission Direct",
1219 description="Denoise the direct transmission lighting",
1222 cls.denoising_transmission_indirect = BoolProperty(
1223 name="Transmission Indirect",
1224 description="Denoise the indirect transmission lighting",
1227 cls.denoising_subsurface_direct = BoolProperty(
1228 name="Subsurface Direct",
1229 description="Denoise the direct subsurface lighting",
1232 cls.denoising_subsurface_indirect = BoolProperty(
1233 name="Subsurface Indirect",
1234 description="Denoise the indirect subsurface lighting",
1237 cls.denoising_strength = FloatProperty(
1238 name="Denoising Strength",
1239 description="Controls neighbor pixel weighting for the denoising filter (lower values preserve more detail, but aren't as smooth)",
1243 cls.denoising_feature_strength = FloatProperty(
1244 name="Denoising Feature Strength",
1245 description="Controls removal of noisy image feature passes (lower values preserve more detail, but aren't as smooth)",
1249 cls.denoising_radius = IntProperty(
1250 name="Denoising Radius",
1251 description="Size of the image area that's used to denoise a pixel (higher values are smoother, but might lose detail and are slower)",
1255 cls.denoising_relative_pca = BoolProperty(
1256 name="Relative filter",
1257 description="When removing that don't carry information, use a relative threshold instead of an absolute one (can help to reduce artifacts, but might cause detail loss around edges)",
1260 cls.denoising_store_passes = BoolProperty(
1261 name="Store denoising passes",
1262 description="Store the denoising feature passes and the noisy image",
1267 def unregister(cls):
1268 del bpy.types.SceneRenderLayer.cycles
1271 class CyclesCurveSettings(bpy.types.PropertyGroup):
1274 bpy.types.ParticleSettings.cycles = PointerProperty(
1275 name="Cycles Hair Settings",
1276 description="Cycles hair settings",
1279 cls.radius_scale = FloatProperty(
1280 name="Radius Scaling",
1281 description="Multiplier of width properties",
1282 min=0.0, max=1000.0,
1285 cls.root_width = FloatProperty(
1287 description="Strand's width at root",
1288 min=0.0, max=1000.0,
1291 cls.tip_width = FloatProperty(
1292 name="Tip Multiplier",
1293 description="Strand's width at tip",
1294 min=0.0, max=1000.0,
1297 cls.shape = FloatProperty(
1298 name="Strand Shape",
1299 description="Strand shape parameter",
1303 cls.use_closetip = BoolProperty(
1305 description="Set tip radius to zero",
1310 def unregister(cls):
1311 del bpy.types.ParticleSettings.cycles
1314 class CyclesDeviceSettings(bpy.types.PropertyGroup):
1317 cls.id = StringProperty(name="ID")
1318 cls.name = StringProperty(name="Name")
1319 cls.use = BoolProperty(name="Use", default=True)
1320 cls.type = EnumProperty(name="Type", items=enum_device_type, default='CUDA')
1323 class CyclesPreferences(bpy.types.AddonPreferences):
1324 bl_idname = __package__
1326 def get_device_types(self, context):
1328 has_cuda, has_opencl = _cycles.get_device_types()
1329 list = [('NONE', "None", "Don't use compute device", 0)]
1331 list.append(('CUDA', "CUDA", "Use CUDA for GPU acceleration", 1))
1333 list.append(('OPENCL', "OpenCL", "Use OpenCL for GPU acceleration", 2))
1336 compute_device_type = EnumProperty(
1337 name="Compute Device Type",
1338 description="Device to use for computation (rendering with Cycles)",
1339 items=get_device_types,
1342 devices = bpy.props.CollectionProperty(type=CyclesDeviceSettings)
1344 def get_devices(self):
1346 # Layout of the device tuples: (Name, Type, Persistent ID)
1347 device_list = _cycles.available_devices()
1351 for device in device_list:
1352 if not device[1] in {'CUDA', 'OPENCL'}:
1356 # Try to find existing Device entry
1357 for dev in self.devices:
1358 if dev.id == device[2] and dev.type == device[1]:
1361 # Create new entry if no existing one was found
1363 entry = self.devices.add()
1364 entry.id = device[2]
1365 entry.name = device[0]
1366 entry.type = device[1]
1368 # Sort entries into lists
1369 if entry.type == 'CUDA':
1370 cuda_devices.append(entry)
1371 elif entry.type == 'OPENCL':
1372 opencl_devices.append(entry)
1373 return cuda_devices, opencl_devices
1376 def get_num_gpu_devices(self):
1378 device_list = _cycles.available_devices()
1380 for device in device_list:
1381 if device[1] != self.compute_device_type:
1383 for dev in self.devices:
1384 if dev.use and dev.id == device[2]:
1389 def has_active_device(self):
1390 return self.get_num_gpu_devices() > 0
1393 def draw_impl(self, layout, context):
1394 layout.label(text="Cycles Compute Device:")
1395 layout.row().prop(self, "compute_device_type", expand=True)
1397 cuda_devices, opencl_devices = self.get_devices()
1400 if self.compute_device_type == 'CUDA' and cuda_devices:
1402 for device in cuda_devices:
1403 box.prop(device, "use", text=device.name)
1405 if self.compute_device_type == 'OPENCL' and opencl_devices:
1407 for device in opencl_devices:
1408 box.prop(device, "use", text=device.name)
1411 def draw(self, context):
1412 self.draw_impl(self.layout, context)
1416 bpy.utils.register_class(CyclesRenderSettings)
1417 bpy.utils.register_class(CyclesCameraSettings)
1418 bpy.utils.register_class(CyclesMaterialSettings)
1419 bpy.utils.register_class(CyclesLampSettings)
1420 bpy.utils.register_class(CyclesWorldSettings)
1421 bpy.utils.register_class(CyclesVisibilitySettings)
1422 bpy.utils.register_class(CyclesMeshSettings)
1423 bpy.utils.register_class(CyclesObjectSettings)
1424 bpy.utils.register_class(CyclesCurveRenderSettings)
1425 bpy.utils.register_class(CyclesCurveSettings)
1426 bpy.utils.register_class(CyclesDeviceSettings)
1427 bpy.utils.register_class(CyclesPreferences)
1428 bpy.utils.register_class(CyclesRenderLayerSettings)
1432 bpy.utils.unregister_class(CyclesRenderSettings)
1433 bpy.utils.unregister_class(CyclesCameraSettings)
1434 bpy.utils.unregister_class(CyclesMaterialSettings)
1435 bpy.utils.unregister_class(CyclesLampSettings)
1436 bpy.utils.unregister_class(CyclesWorldSettings)
1437 bpy.utils.unregister_class(CyclesMeshSettings)
1438 bpy.utils.unregister_class(CyclesObjectSettings)
1439 bpy.utils.unregister_class(CyclesVisibilitySettings)
1440 bpy.utils.unregister_class(CyclesCurveRenderSettings)
1441 bpy.utils.unregister_class(CyclesCurveSettings)
1442 bpy.utils.unregister_class(CyclesDeviceSettings)
1443 bpy.utils.unregister_class(CyclesPreferences)
1444 bpy.utils.unregister_class(CyclesRenderLayerSettings)