diff --git a/presets/pov/lamp/01_(5400K)_Direct_Sun.py b/presets/pov/lamp/01_(5400K)_Direct_Sun.py new file mode 100644 index 0000000000000000000000000000000000000000..7f53ce06d3d189d2324af2efb199f91da5b178f9 --- /dev/null +++ b/presets/pov/lamp/01_(5400K)_Direct_Sun.py @@ -0,0 +1,10 @@ +#Since the dawn of time + +import bpy +bpy.context.object.data.type = 'SUN' +lampdata = bpy.context.object.data + +lampdata.color = (1.0, 1.0, 0.9843137264251709) +lampdata.energy = 1.2 #100 000lux +#lampdata.distance = 0.001 +#lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/02_(5400K)_High_Noon_Sun.py b/presets/pov/lamp/02_(5400K)_High_Noon_Sun.py new file mode 100644 index 0000000000000000000000000000000000000000..6d3083a6e6a91b1ec99b542d6fb0bb771c374770 --- /dev/null +++ b/presets/pov/lamp/02_(5400K)_High_Noon_Sun.py @@ -0,0 +1,17 @@ +#Since the dawn of time + +import bpy +bpy.context.object.rotation_euler = (0,0,0)#And loc HIGH +bpy.context.object.location = (0,0,700000000) +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.shape = 'SQUARE' +lampdata.size = 30000000#0.02 +#lampdata.size_y = 0.02 +lampdata.shadow_ray_samples_x = 2 +#lampdata.shadow_ray_samples_y = 3 +lampdata.color = (1.0, 1.0, 1.0) +lampdata.energy = 1.094316#91193 #lux +lampdata.distance =695699968 + diff --git a/presets/pov/lamp/03_(6000K)_Daylight_Window.py b/presets/pov/lamp/03_(6000K)_Daylight_Window.py new file mode 100644 index 0000000000000000000000000000000000000000..a9781f579d6e24d00f027f9c20ccd55b45b87bc6 --- /dev/null +++ b/presets/pov/lamp/03_(6000K)_Daylight_Window.py @@ -0,0 +1,13 @@ +#Since the dawn of time + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 1.2 +lampdata.size_y = 2.10 +lampdata.shadow_ray_samples_x = 2 +lampdata.shadow_ray_samples_y = 3 +lampdata.color = (1.0, 1.0, 1.0) +lampdata.energy = 1.094316#91193 #lux +lampdata.distance = 1.0 diff --git a/presets/pov/lamp/04_(6000K)_2500W_HMI_(Halogen_Metal_Iodide).py b/presets/pov/lamp/04_(6000K)_2500W_HMI_(Halogen_Metal_Iodide).py new file mode 100644 index 0000000000000000000000000000000000000000..0bfa95d84a1560f01d1ee671d11012a52c4fccf5 --- /dev/null +++ b/presets/pov/lamp/04_(6000K)_2500W_HMI_(Halogen_Metal_Iodide).py @@ -0,0 +1,14 @@ +#After 1969 +#made specifically for film and entertainment applications + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.spot_size = 0.872665 +lampdata.spot_blend = 0.9 +lampdata.color = (0.99, 0.9882352948188782, 0.998) +lampdata.energy = 223.81796 #240000lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 0.001 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/05_(4000K)_100W_Metal_Halide.py b/presets/pov/lamp/05_(4000K)_100W_Metal_Halide.py new file mode 100644 index 0000000000000000000000000000000000000000..e91d3f9a49d8eb4ad30f3b71094d022586a59f31 --- /dev/null +++ b/presets/pov/lamp/05_(4000K)_100W_Metal_Halide.py @@ -0,0 +1,14 @@ +#After 1962 +#Common uses: outdoor lighting where good color rendering is needed, television/film lighting, sports fields, car headlights, flood lights, heavy flashlights, green house applications + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.spot_size = 0.6 +lampdata.spot_blend = 0.9 +lampdata.color = (0.9490196108818054, 0.9882352948188782, 1.0) +lampdata.energy = 20.98293#9000lm/21.446(=lux)*0.004*6.25(distance) *2 for distance is the point of half strength +lampdata.distance = 0.025 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/06_(3200K)_100W_Quartz_Halogen.py b/presets/pov/lamp/06_(3200K)_100W_Quartz_Halogen.py new file mode 100644 index 0000000000000000000000000000000000000000..b58edf17d44f8e78b8ea0df26d1c2eda9c8853a7 --- /dev/null +++ b/presets/pov/lamp/06_(3200K)_100W_Quartz_Halogen.py @@ -0,0 +1,16 @@ +#since 1960, no longer manufactured since 2016 +#8mm projectors +#used in many automobiles headlamps ; outdoor lighting systems ; watercraft ; desktop lamps (smaller power). +#theatrical and studio (film and television) fixtures, including Ellipsoidal reflector spotlights, Source Four, and Fresnels; PAR Cans + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.spot_size = 1.9 +lampdata.spot_blend = 0.9 +lampdata.color = (1.0, 0.9450980424880981, 0.8784313797950745) +lampdata.energy = 12.43433#5000/21.446 #lumen values/20 or lux when available used as a basis +lampdata.distance = 0.015#energy calculated for length 0.075 but width gives better result +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/lamp/07_(2850K)_100w_Tungsten.py b/presets/pov/lamp/07_(2850K)_100w_Tungsten.py new file mode 100644 index 0000000000000000000000000000000000000000..72675de3baec0865f6348e1e862d0cf1d57966a8 --- /dev/null +++ b/presets/pov/lamp/07_(2850K)_100w_Tungsten.py @@ -0,0 +1,10 @@ +#1908 - today + +import bpy +bpy.context.object.data.type = 'POINT' +lampdata = bpy.context.object.data + +lampdata.color = (1.0, 0.8392156958580017, 0.6666666865348816) +lampdata.energy = 7.46060#3.7303#1000/21.446/(lampdistance/candledistance) #lumen values/21.446 or lux when available used as a basis +lampdata.distance = 0.05 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/08_(2600K)_40w_Tungsten.py b/presets/pov/lamp/08_(2600K)_40w_Tungsten.py new file mode 100644 index 0000000000000000000000000000000000000000..88ef46a0d42101a5220a2b645b624e7edce7ed28 --- /dev/null +++ b/presets/pov/lamp/08_(2600K)_40w_Tungsten.py @@ -0,0 +1,10 @@ +#since 1908 + +import bpy +bpy.context.object.data.type = 'POINT' +lampdata = bpy.context.object.data + +lampdata.color = (1.0, 0.8196078431372549, 0.6980392156862745) +lampdata.energy = 2.98424#400/21.446 #lumen values/21.446 or lux when available used as a basis +lampdata.distance = 0.05 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/09_(5000K)_75W_Full_Spectrum_Fluorescent_T12.py b/presets/pov/lamp/09_(5000K)_75W_Full_Spectrum_Fluorescent_T12.py new file mode 100644 index 0000000000000000000000000000000000000000..b0a23eda43c755418b89cf0ebe94d69a40861457 --- /dev/null +++ b/presets/pov/lamp/09_(5000K)_75W_Full_Spectrum_Fluorescent_T12.py @@ -0,0 +1,14 @@ +#Available since 1979 (Triphosphor lamps) + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.038 +lampdata.size_y = 2.40284 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (1.0, 0.95686274766922, 0.9490200281143188) +lampdata.energy = 4.45304#4775lm/21.446(=lux)*0.004(distance) *2 for distance is the point of half strength 6200lm? +lampdata.distance = 1.0 #dist values multiplied by 10 for area lights for same power as bulb/spot/... +#lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/10_(4300K)_40W_Vintage_Fluorescent_T12.py b/presets/pov/lamp/10_(4300K)_40W_Vintage_Fluorescent_T12.py new file mode 100644 index 0000000000000000000000000000000000000000..d03ce6fd98044b07ecaa49b2170bd7458541390e --- /dev/null +++ b/presets/pov/lamp/10_(4300K)_40W_Vintage_Fluorescent_T12.py @@ -0,0 +1,14 @@ +#since 1939 , T12 no longer manufactured since T8 propagated + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.038 +lampdata.size_y = 1.2192 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (0.901, 1.0, 0.979) +lampdata.energy = 2.14492#2300lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 #dist values multiplied by 10 for area lights for same power as bulb/spot/... +#lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/11_(5000K)_18W_Standard_Fluorescent_T8.py b/presets/pov/lamp/11_(5000K)_18W_Standard_Fluorescent_T8.py new file mode 100644 index 0000000000000000000000000000000000000000..6fef17639598fdd25ba5c625d7b8e538a4b52715 --- /dev/null +++ b/presets/pov/lamp/11_(5000K)_18W_Standard_Fluorescent_T8.py @@ -0,0 +1,13 @@ +#since 1973 + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.026 +lampdata.size_y = 0.59 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (0.95686274766922, 1.0, 0.9803921580314636) +lampdata.energy = 1.25898#1350lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 #dist values multiplied by 10 for area lights for same power as bulb/spot/... diff --git a/presets/pov/lamp/12_(4200K)_18W_Cool_White_Fluorescent_T8.py b/presets/pov/lamp/12_(4200K)_18W_Cool_White_Fluorescent_T8.py new file mode 100644 index 0000000000000000000000000000000000000000..83f8dd4e6afa2f5332e4554e02ad804056de02d6 --- /dev/null +++ b/presets/pov/lamp/12_(4200K)_18W_Cool_White_Fluorescent_T8.py @@ -0,0 +1,15 @@ +#Available since 1979 +#more common than the warm white + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.026 +lampdata.size_y = 0.59 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (0.8313725590705872, 0.9215686321258545, 1.0) +lampdata.energy = 1.25898#1350lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 #dist values multiplied by 10 for area lights for same power as bulb/spot/... +#lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/13_(3000K)_18W_Warm_Fluorescent_T8.py b/presets/pov/lamp/13_(3000K)_18W_Warm_Fluorescent_T8.py new file mode 100644 index 0000000000000000000000000000000000000000..e1cee557d965cf7a6642d4fb5df627baec210982 --- /dev/null +++ b/presets/pov/lamp/13_(3000K)_18W_Warm_Fluorescent_T8.py @@ -0,0 +1,14 @@ +#Available since 1979 +#developed to get closer to tungsten atmospher in interiors + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.026 +lampdata.size_y = 0.59 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (1.0, 0.95686274766922, 0.8980392217636108) +lampdata.energy = 1.25898#1350lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 #dist values multiplied by 10 for area lights for same power as bulb/spot/... diff --git a/presets/pov/lamp/14_(6500K)_54W_Grow_Light_Fluorescent_T5-HO.py b/presets/pov/lamp/14_(6500K)_54W_Grow_Light_Fluorescent_T5-HO.py new file mode 100644 index 0000000000000000000000000000000000000000..55f84ab817947b2000ae656b4ffbf34c925b27cd --- /dev/null +++ b/presets/pov/lamp/14_(6500K)_54W_Grow_Light_Fluorescent_T5-HO.py @@ -0,0 +1,13 @@ +#Available since 1995 + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.016 +lampdata.size_y = 1.149 +lampdata.shadow_ray_samples_x = 1 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (1.0, 0.83, 0.986274528503418) +lampdata.energy = 4.66287 #0.93257#4.66287#5000lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 0.1 #dist values multiplied by 10 for area lights for same power as bulb/spot/... diff --git a/presets/pov/lamp/15_(3200K)_40W_Induction_ Fluorescent.py b/presets/pov/lamp/15_(3200K)_40W_Induction_ Fluorescent.py new file mode 100644 index 0000000000000000000000000000000000000000..1d0851e5be950f12ddc083450b32f6a373baec90 --- /dev/null +++ b/presets/pov/lamp/15_(3200K)_40W_Induction_ Fluorescent.py @@ -0,0 +1,14 @@ +#since the 1990's, +#Often circular or rectangular closed loop electrodeless fluorescent lamps + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +#lampdata.use_halo = True +lampdata.spot_size = 3.14 +lampdata.spot_blend = 0.9 +lampdata.color = (1.0, 0.9450980424880981, 0.8784313797950745) +lampdata.energy = 2.61121#2800/21.446 #lumen values/20 or lux when available used as a basis +lampdata.distance = 0.15#energy calculated for length 0.075 but width gives better result +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/lamp/16_(2100K)_150W_High_Pressure_Sodium.py b/presets/pov/lamp/16_(2100K)_150W_High_Pressure_Sodium.py new file mode 100644 index 0000000000000000000000000000000000000000..9ddb32cb43f078f8b439729386c414d12ef215c2 --- /dev/null +++ b/presets/pov/lamp/16_(2100K)_150W_High_Pressure_Sodium.py @@ -0,0 +1,13 @@ +#Starting from 1964 + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.color = (1.0, 0.772549033164978, 0.5607843399047852) +lampdata.energy = 4.47636#12000lm/21.446(=lux)*0.004(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 +lampdata.spot_size = 1.9 +lampdata.spot_blend = 0.9 +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/lamp/17_(1700K)_135W_Low_Pressure_Sodium.py b/presets/pov/lamp/17_(1700K)_135W_Low_Pressure_Sodium.py new file mode 100644 index 0000000000000000000000000000000000000000..d5e4267845a3bff8fd103a304724d962df24ed5d --- /dev/null +++ b/presets/pov/lamp/17_(1700K)_135W_Low_Pressure_Sodium.py @@ -0,0 +1,11 @@ +#(1700K) 135W Low Pressure Sodium Vapor Starting from 1932 +#Mostly used for Outdoor city lighting, security lighting, long tunnel lighting + +import bpy +bpy.context.object.data.type = 'POINT' +lampdata = bpy.context.object.data + +lampdata.color = (1.0, 0.5764706134796143, 0.16078431904315948) +lampdata.energy = 8.43048#22600lm/21.446(=lux)*0.004(distance) *2 for distance is the point of half strength +lampdata.distance = 1.0 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/18_(6800K)_175W_Mercury_Vapor.py b/presets/pov/lamp/18_(6800K)_175W_Mercury_Vapor.py new file mode 100644 index 0000000000000000000000000000000000000000..e1a5143c32a19a3c82731fa2b6c3995cbbd9b2e7 --- /dev/null +++ b/presets/pov/lamp/18_(6800K)_175W_Mercury_Vapor.py @@ -0,0 +1,13 @@ +#Starting from 1901 + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.spot_size = 1.25 +lampdata.spot_blend = 0.9 +lampdata.color = (0.8470588326454163, 0.9686274528503418, 1.0) +lampdata.energy = 17.25263#7400lm/21.446(=lux)*0.004*6.25(distance) *2 for distance is the point of half strength +lampdata.distance = 0.025 +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/lamp/19_(5200K)_700W_Carbon_Arc.py b/presets/pov/lamp/19_(5200K)_700W_Carbon_Arc.py new file mode 100644 index 0000000000000000000000000000000000000000..139dc8bb38c35efc65f84494642b98544d4edf0b --- /dev/null +++ b/presets/pov/lamp/19_(5200K)_700W_Carbon_Arc.py @@ -0,0 +1,18 @@ +#Starting from 1876 (first type of commercial lamps developed with electricity) +#Carbon arc lamps were being phased out after the 1910s. +#For general lighting the lamp was replaced by the 1920s and 30s in most cities. +#The lamp continued to be used for spot lights, film production lighting and film projector lamps. +#Most of the remaining carbon arc lamps ceased production by the 1980s + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +#lampdata.use_halo = True +lampdata.show_cone = True +lampdata.spot_size = 1.5 +lampdata.spot_blend = 0.3 +lampdata.color = (1.0, 0.9803921580314636, 0.95686274766922) +lampdata.energy = 51.29162#55000lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 0.01 +lampdata.falloff_type = 'INVERSE_SQUARE' \ No newline at end of file diff --git a/presets/pov/lamp/20_(6500K)_15W_LED_Spot.py b/presets/pov/lamp/20_(6500K)_15W_LED_Spot.py new file mode 100644 index 0000000000000000000000000000000000000000..1b70b9f10b14547301e6a76d0915ddee337cffc3 --- /dev/null +++ b/presets/pov/lamp/20_(6500K)_15W_LED_Spot.py @@ -0,0 +1,12 @@ +#since 2008 + +import bpy +bpy.context.object.data.type = 'SPOT' +lampdata = bpy.context.object.data + +lampdata.show_cone = True +lampdata.spot_size = 1.39626 #80 degrees in radian +lampdata.spot_blend = 0.5 +lampdata.color = (1.0, 0.9372549057006836, 0.9686274528503418) +lampdata.energy = 1.39886#1500lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.18 #dist values multiplied by 10 for area lights for same power as bulb/spot/... diff --git a/presets/pov/lamp/21_(2700K)_7W_OLED_Panel.py b/presets/pov/lamp/21_(2700K)_7W_OLED_Panel.py new file mode 100644 index 0000000000000000000000000000000000000000..8f2ebb8fedcf591dc045093a2b0690805ae3927b --- /dev/null +++ b/presets/pov/lamp/21_(2700K)_7W_OLED_Panel.py @@ -0,0 +1,14 @@ +#since 2025 +#inspired by OSRAM Early Future / IKEA Vitsand / OTI Lumionics Aerelight + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.033 +lampdata.size_y = 0.133 +lampdata.shadow_ray_samples_x = 2 +lampdata.shadow_ray_samples_y = 2 +lampdata.color = (1.0, 0.8292156958580017, 0.6966666865348816) +lampdata.energy = 0.83932#900lm/21.446(=lux)*0.004*2.5(distance) *2 for distance is the point of half strength +lampdata.distance = 1.18 #dist values multiplied by 10 for area lights for same power as bulb/spot/... diff --git a/presets/pov/lamp/22_(30000K)_40W_Black_Light_Fluorescent.py b/presets/pov/lamp/22_(30000K)_40W_Black_Light_Fluorescent.py new file mode 100644 index 0000000000000000000000000000000000000000..ef6b4725403891510a7256417fb5239d27557c5e --- /dev/null +++ b/presets/pov/lamp/22_(30000K)_40W_Black_Light_Fluorescent.py @@ -0,0 +1,12 @@ +#Starting from 1939 (World War II Byler's tubes) + +import bpy +bpy.context.object.data.type = 'AREA' +lampdata = bpy.context.object.data + +lampdata.size = 0.038 +lampdata.size_y = 1.2192 +lampdata.color = (0.6549019813537598, 0.0, 1.0) +lampdata.energy = 1.86515#100/21.446 #lumen values/21.446 or lux when available used as a basis +lampdata.distance = 0.4 #dist values multiplied by 10 for area lights for same power as bulb/spot/... + diff --git a/presets/pov/lamp/23_(30000K)_40W_Black_Light_Bulb.py b/presets/pov/lamp/23_(30000K)_40W_Black_Light_Bulb.py new file mode 100644 index 0000000000000000000000000000000000000000..baad8234c444c61898407af4daf9abbf1058b0de --- /dev/null +++ b/presets/pov/lamp/23_(30000K)_40W_Black_Light_Bulb.py @@ -0,0 +1,10 @@ +#Starting from 1918 (World War I Wood's glass) + +import bpy +bpy.context.object.data.type = 'POINT' +lampdata = bpy.context.object.data + +lampdata.color = (0.6549019813537598, 0.0, 1.0) +lampdata.energy = 1.86515#100/21.446 #lumen values/21.446 or lux when available used as a basis +lampdata.distance = 0.01 +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/lamp/24_(1850K)_Candle.py b/presets/pov/lamp/24_(1850K)_Candle.py new file mode 100644 index 0000000000000000000000000000000000000000..5d7ac61d75fad2aca11cf148440b06c05dbe29c0 --- /dev/null +++ b/presets/pov/lamp/24_(1850K)_Candle.py @@ -0,0 +1,24 @@ +#Starting from 1825 (stearin) + +import bpy +bpy.context.object.data.type = 'POINT' +lampdata = bpy.context.object.data + +lampdata.color = (1.0, 0.7176470756530762, 0.2980392277240753) +#lampdata.color = (1.0, 0.5764706134796143, 0.16078431904315948) +#http://terpconnect.umd.edu/~pbs/2011-Sunderland-et-al-PCI.pdf +#https://blog.1000bulbs.com/home/whats-the-difference-between-candela-lux-and-lumens +#Environment Typical Lux +#Hospital Theatre 1,000 +#Supermarket, Workshop, Sports Hall 750 +#Office, Show Rooms, Laboratories, Kitchens 500 +#Warehouse Loading Bays 300 to 400 +#School Classroom, University Lecture Hall 250 +#Lobbies, Public Corridors, Stairwells 200 +#Warehouse Aisles 100 to 200 +#Homes, Theatres 150 +#Family Living Room 50 +#Sunset & Sunrise 400 lux +lampdata.energy = 2.0 #two times lux value +lampdata.distance = 0.004 +lampdata.falloff_type = 'INVERSE_SQUARE' diff --git a/presets/pov/radiosity/01_Debug.py b/presets/pov/radiosity/01_Debug.py new file mode 100644 index 0000000000000000000000000000000000000000..420dbd7eeb8919b2505d339f31a0b2a93dca97a0 --- /dev/null +++ b/presets/pov/radiosity/01_Debug.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 10 +scene.pov.radio_error_bound = 0.3 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.8 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 1 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/02_Fast.py b/presets/pov/radiosity/02_Fast.py new file mode 100644 index 0000000000000000000000000000000000000000..08864c83e11da13c73651e0ec54c49742a376876 --- /dev/null +++ b/presets/pov/radiosity/02_Fast.py @@ -0,0 +1,19 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 80 +scene.pov.radio_error_bound = 0.4 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.9 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.025 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 5 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.02 diff --git a/presets/pov/radiosity/03_Normal.py b/presets/pov/radiosity/03_Normal.py new file mode 100644 index 0000000000000000000000000000000000000000..b66a1b2ac2f10a0dde9ed84fa38aaef654e8a723 --- /dev/null +++ b/presets/pov/radiosity/03_Normal.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 200 +scene.pov.radio_error_bound = 0.3 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.75 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.017 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 7 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/04_Two_Bounces.py b/presets/pov/radiosity/04_Two_Bounces.py new file mode 100644 index 0000000000000000000000000000000000000000..2072247adf5a053a422afb1c05d17002eb9a3515 --- /dev/null +++ b/presets/pov/radiosity/04_Two_Bounces.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 200 +scene.pov.radio_error_bound = 0.3 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.75 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.017 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 7 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 2 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/05_Final.py b/presets/pov/radiosity/05_Final.py new file mode 100644 index 0000000000000000000000000000000000000000..52a9d5c3595d2318e46fb13e65ee8bce6687e36e --- /dev/null +++ b/presets/pov/radiosity/05_Final.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 800 +scene.pov.radio_error_bound = 0.2 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.7 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.01 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 9 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/06_Outdoor_Low_Quality.py b/presets/pov/radiosity/06_Outdoor_Low_Quality.py new file mode 100644 index 0000000000000000000000000000000000000000..53553264bbb5f903a48304c50539b7653bbdaea5 --- /dev/null +++ b/presets/pov/radiosity/06_Outdoor_Low_Quality.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 80 +scene.pov.radio_error_bound = 0.6 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.8 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 4 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/07_Outdoor_High_Quality.py b/presets/pov/radiosity/07_Outdoor_High_Quality.py new file mode 100644 index 0000000000000000000000000000000000000000..8b06dabef67aef5e239364d6fcb6345fc2c9d6d2 --- /dev/null +++ b/presets/pov/radiosity/07_Outdoor_High_Quality.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 500 +scene.pov.radio_error_bound = 0.1 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.5 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 7 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.004 diff --git a/presets/pov/radiosity/08_Outdoor_(Sun)Light.py b/presets/pov/radiosity/08_Outdoor_(Sun)Light.py new file mode 100644 index 0000000000000000000000000000000000000000..94448c1f70245d3429fbd299bdb63d18b0b6282d --- /dev/null +++ b/presets/pov/radiosity/08_Outdoor_(Sun)Light.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 50 +scene.pov.radio_error_bound = 0.8 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.9 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 4 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 1 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/09_Indoor_Low_Quality.py b/presets/pov/radiosity/09_Indoor_Low_Quality.py new file mode 100644 index 0000000000000000000000000000000000000000..e5fa7bb611ad5f456bc2e3d73435b44ce8a68642 --- /dev/null +++ b/presets/pov/radiosity/09_Indoor_Low_Quality.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 80 +scene.pov.radio_error_bound = 0.7 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.8 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 5 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 2 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.01 diff --git a/presets/pov/radiosity/10_Indoor_High_Quality.py b/presets/pov/radiosity/10_Indoor_High_Quality.py new file mode 100644 index 0000000000000000000000000000000000000000..5a752f6c05842108945e08bb579511195add4925 --- /dev/null +++ b/presets/pov/radiosity/10_Indoor_High_Quality.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.pov.radio_display_advanced = True +scene.pov.radio_adc_bailout = 0.005 +scene.pov.radio_always_sample = False +scene.pov.radio_brightness = 1.0 +scene.pov.radio_count = 400 +scene.pov.radio_error_bound = 0.15 +scene.pov.radio_gray_threshold = 0.0 +scene.pov.radio_low_error_factor = 0.5 +scene.pov.radio_media = False +scene.pov.radio_subsurface = False +scene.pov.radio_minimum_reuse = 0.015 +scene.pov.radio_maximum_reuse = 0.2 +scene.pov.radio_nearest_count = 8 +scene.pov.radio_normal = False +scene.pov.radio_recursion_limit = 3 +scene.pov.radio_pretrace_start = 0.08 +scene.pov.radio_pretrace_end = 0.004 diff --git a/presets/pov/world/1_Clear_Blue_Sky.py b/presets/pov/world/1_Clear_Blue_Sky.py new file mode 100644 index 0000000000000000000000000000000000000000..0dcd5e05f92137eb61ce6b9a407e07eb2a4ab0bd --- /dev/null +++ b/presets/pov/world/1_Clear_Blue_Sky.py @@ -0,0 +1,36 @@ +import bpy +scene = bpy.context.scene + +scene.world.use_sky_blend = True +#below multiplied by two for a better proportion Clear vs Overcast sky +#since Clear sky is 19807 lux vs 2000 for overcast (sun is min 32000 max 100000) +#http://www.pssurvival.com/PS/Lighting/Typical_LUX_Intensities_for_Day_and_Night-2017.pdf +#https://en.wikipedia.org/wiki/Daylight +#https://www.engineeringtoolbox.com/light-level-rooms-d_708.html +#https://www.cactus2000.de/fr/unit/masslux.shtml +#https://blendergrid.com/news/cycles-physically-correct-brightness +#researched result blue is + #Hue: 0.6 + #Saturation: 0.533 + #Lightness: 0.7 +#put scattering scale at 0.0002 and scattering color rgb <0.2061, 0.3933, 1.0> +#with very small value like round rgb 0.00002 0.00002 0.00008 +#Sky color at zenith, sun 90° elevation = hsl <0.6, 0.533, 0.698> +#Ground color = rgb <0.996, 0.965, 0.855> = hsl <0.128, 0.141, 0.996> +#Ground Brighness = 0.996 + +scene.world.horizon_color = (0.047, 0.034, 0.025) #24000 or 22000 lux roughly equals (sun+sky)/5 +scene.world.zenith_color = (0.006, 0.013, 0.033) #19807 lux roughly equals hign noon Sun / 5 +scene.world.ambient_color = (0.0, 0.0, 0.0) +scene.world.mist_settings.use_mist = False +scene.world.mist_settings.intensity = 0.0 +scene.world.mist_settings.depth = 25.0 +scene.world.mist_settings.start = 5.0 +scene.pov.media_enable = True +scene.pov.media_scattering_type = '4' +scene.pov.media_samples = 35 +scene.pov.media_diffusion_scale = (0.00002) +scene.pov.media_diffusion_color = (0.000001, 0.000002, 0.000005) +scene.pov.media_absorption_scale = (0.00002) +scene.pov.media_absorption_color = (0.0000006067, 0.0000007939, 0.0)#up to 0.00007 +scene.pov.media_eccentricity = 0.0 diff --git a/presets/pov/world/2_Partly_Hazy_Sky.py b/presets/pov/world/2_Partly_Hazy_Sky.py new file mode 100644 index 0000000000000000000000000000000000000000..2f6b628d8ec42fe567b8a818e6ed4992204c9f42 --- /dev/null +++ b/presets/pov/world/2_Partly_Hazy_Sky.py @@ -0,0 +1,36 @@ +import bpy +scene = bpy.context.scene + +scene.world.use_sky_blend = True +#below multiplied by two for a better proportion Clear vs Overcast sky +#since Clear sky is 19807 lux vs 2000 for overcast (sun is min 32000 max 100000) +#http://www.pssurvival.com/PS/Lighting/Typical_LUX_Intensities_for_Day_and_Night-2017.pdf +#https://en.wikipedia.org/wiki/Daylight +#https://www.engineeringtoolbox.com/light-level-rooms-d_708.html +#https://www.cactus2000.de/fr/unit/masslux.shtml +#https://blendergrid.com/news/cycles-physically-correct-brightness +#researched result blue is + #Hue: 0.6 + #Saturation: 0.533 + #Lightness: 0.7 +#put scattering scale at 0.0002 and scattering color rgb <0.2061, 0.3933, 1.0> +#with very small value like round rgb 0.00002 0.00002 0.00008 +#Sky color at zenith, sun 90° elevation = hsl <0.6, 0.533, 0.698> +#Ground color = rgb <0.996, 0.965, 0.855> = hsl <0.128, 0.141, 0.996> +#Ground Brighness = 0.996 + +scene.world.horizon_color = (0.380, 0.262, 0.183) #24000 or 22000 lux roughly equals (sun+sky)/5 + urban light pollution +scene.world.zenith_color = (0.006, 0.013, 0.033) #19807 lux roughly equals hign noon Sun / 5 +scene.world.ambient_color = (0.0, 0.0, 0.0) +scene.world.mist_settings.use_mist = False +scene.world.mist_settings.intensity = 0.0 +scene.world.mist_settings.depth = 25.0 +scene.world.mist_settings.start = 5.0 +scene.pov.media_enable = True +scene.pov.media_scattering_type = '4' +scene.pov.media_samples = 35 +scene.pov.media_diffusion_scale = (0.00002) +scene.pov.media_diffusion_color = (0.000001, 0.000002, 0.000005) +scene.pov.media_absorption_scale = (0.00002) +scene.pov.media_absorption_color = (0.0000006067, 0.0000007939, 0.0)#up to 0.00007 +scene.pov.media_eccentricity = 0.0 diff --git a/presets/pov/world/3_Overcast_Sky.py b/presets/pov/world/3_Overcast_Sky.py new file mode 100644 index 0000000000000000000000000000000000000000..013a5d40ce74d32e92810896643cc231ed69506c --- /dev/null +++ b/presets/pov/world/3_Overcast_Sky.py @@ -0,0 +1,20 @@ +import bpy +scene = bpy.context.scene + +scene.world.use_sky_blend = True +scene.world.horizon_color = (0.477, 0.536, 0.604) +#below divided by ten for a better proportion Clear vs Overcast sky +#since Clear sky is 20000 lux vs 2000 up to 10000 for overcast +scene.world.zenith_color = (0.034, 0.043, 0.047) +scene.world.ambient_color = (0.0, 0.0, 0.0) +scene.world.mist_settings.use_mist = False +scene.world.mist_settings.intensity = 0.0 +scene.world.mist_settings.depth = 25.0 +scene.world.mist_settings.start = 5.0 +scene.pov.media_enable = False +scene.pov.media_scattering_type = '1' +scene.pov.media_samples = 35 +scene.pov.media_diffusion_scale = (1.0) +scene.pov.media_diffusion_color = (0.58, 0.66, 0.75) +scene.pov.media_absorption_color = (0.0, 0.0, 0.0) +scene.pov.media_eccentricity = 0.0 diff --git a/presets/pov/world/4_Cartoony_Sky.py b/presets/pov/world/4_Cartoony_Sky.py new file mode 100644 index 0000000000000000000000000000000000000000..e3c552c0b534ee7c406ab35adcfd7fef72b01cc3 --- /dev/null +++ b/presets/pov/world/4_Cartoony_Sky.py @@ -0,0 +1,19 @@ +import bpy +scene = bpy.context.scene + +scene.world.use_sky_blend = True +#below multiplied by two for a better proportion Clear vs Overcast sky +#since Clear sky is 20000 lux vs 2000 for overcast +scene.world.horizon_color = (0.350*2, 0.611*2, 1.0*2) +scene.world.zenith_color = (0.05000000074505806*2, 0.125*2, 0.5*2) +scene.world.ambient_color = (0.0, 0.0, 0.0) +scene.world.mist_settings.use_mist = False +scene.world.mist_settings.intensity = 0.0 +scene.world.mist_settings.depth = 25.0 +scene.world.mist_settings.start = 5.0 +scene.pov.media_enable = False +scene.pov.media_scattering_type = '4' +scene.pov.media_samples = 35 +scene.pov.media_diffusion_color = (0.20000000298023224, 0.4000000059604645, 1.0) +scene.pov.media_absorption_color = (0.0, 0.0, 0.0) +scene.pov.media_eccentricity = 0.0 \ No newline at end of file diff --git a/presets/pov/world/5_Under_Water.py b/presets/pov/world/5_Under_Water.py new file mode 100644 index 0000000000000000000000000000000000000000..e6659016755b08a679153c3de89ccf859dcc569e --- /dev/null +++ b/presets/pov/world/5_Under_Water.py @@ -0,0 +1,19 @@ +import bpy +scene = bpy.context.scene + +scene.world.use_sky_blend = True +#below multiplied by two for a better proportion Clear vs Overcast sky +#since Clear sky is 20000 lux vs 2000 for overcast +scene.world.horizon_color = (0.0, 0.0, 0.0) +scene.world.zenith_color = (0.250980406999588, 0.6117647290229797, 1.0) +scene.world.ambient_color = (0.0, 0.0, 0.0) +scene.world.mist_settings.use_mist = False +scene.world.mist_settings.intensity = 0.0 +scene.world.mist_settings.depth = 25.0 +scene.world.mist_settings.start = 5.0 +scene.pov.media_enable = True +scene.pov.media_scattering_type = '5' +scene.pov.media_samples = 35 +scene.pov.media_diffusion_color = (0.000034, 0.000034, 0.000017) +scene.pov.media_absorption_color = (0.00000455, 0.00000165, 0.00000031) +scene.pov.media_eccentricity = 0.7 \ No newline at end of file diff --git a/render_povray/__init__.py b/render_povray/__init__.py index cfb45f5a9c06cdc2e6d90efe80c755a30319e87c..90d80f13ea2e060ab9e867627f212daf316c1ff6 100644 --- a/render_povray/__init__.py +++ b/render_povray/__init__.py @@ -19,14 +19,13 @@ # <pep8 compliant> bl_info = { - "name": "POVRAY-3.7", + "name": "POV-3.7", "author": "Campbell Barton, Silvio Falcinelli, Maurice Raybaud, " "Constantin Rahn, Bastien Montagne, Leonid Desyatkov", - "version": (0, 0, 9), - "blender": (2, 75, 0), + "version": (0, 1, 0), + "blender": (2, 79, 0), "location": "Render > Engine > POV-Ray 3.7", "description": "Basic POV-Ray 3.7 integration for blender", - "warning": "this script is RC", "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" "Scripts/Render/POV-Ray", "category": "Render", @@ -44,6 +43,7 @@ else: #import addon_utils # To use some other addons import nodeitems_utils #for Nodes from nodeitems_utils import NodeCategory, NodeItem #for Nodes + from bl_operators.presets import AddPresetBase from bpy.types import ( AddonPreferences, PropertyGroup, @@ -73,6 +73,11 @@ def string_strip_hyphen(name): # Scene POV properties. ############################################################################### class RenderPovSettingsScene(PropertyGroup): + #Linux SDL-window enable + sdl_window_enable = BoolProperty( + name="Enable SDL window", + description="Enable the SDL window in Linux OS", + default=True) # File Options text_block = StringProperty( name="Text Scene Name", @@ -121,7 +126,7 @@ class RenderPovSettingsScene(PropertyGroup): radio_enable = BoolProperty( name="Enable Radiosity", description="Enable POV-Rays radiosity calculation", - default=False) + default=True) radio_display_advanced = BoolProperty( name="Advanced Options", @@ -132,19 +137,88 @@ class RenderPovSettingsScene(PropertyGroup): name="Enable Media", description="Enable POV-Rays atmospheric media", default=False) + media_samples = IntProperty( name="Samples", description="Number of samples taken from camera to first object " "encountered along ray path for media calculation", min=1, max=100, default=35) - - media_color = FloatVectorProperty( - name="Media Color", description="The atmospheric media color", + + media_scattering_type = EnumProperty( + name="Scattering Type", + description="Scattering model", + items=(('1', "1 Isotropic", "The simplest form of scattering because" + " it is independent of direction."), + ('2', "2 Mie haze ", "For relatively small particles such as " + "minuscule water droplets of fog, cloud " + "particles, and particles responsible " + "for the polluted sky. In this model the" + " scattering is extremely directional in" + " the forward direction i.e. the amount " + "of scattered light is largest when the " + "incident light is anti-parallel to the " + "viewing direction (the light goes " + "directly to the viewer). It is smallest" + " when the incident light is parallel to" + " the viewing direction. "), + ('3', "3 Mie murky", "Like haze but much more directional"), + ('4', "4 Rayleigh", "For extremely small particles such as " + "molecules of the air. The amount of " + "scattered light depends on the incident" + " light angle. It is largest when the " + "incident light is parallel or " + "anti-parallel to the viewing direction " + "and smallest when the incident light is " + "perpendicular to viewing direction."), + ('5', "5 Henyey-Greenstein", "The default eccentricity value " + "of zero defines isotropic " + "scattering while positive " + "values lead to scattering in " + "the direction of the light and " + "negative values lead to " + "scattering in the opposite " + "direction of the light. Larger " + "values of e (or smaller values " + "in the negative case) increase " + "the directional property of the" + " scattering.")), + default='1') + + media_diffusion_scale = FloatProperty( + name="Scale", description="Scale factor of Media Diffusion Color", + precision=12, step=0.00000001, min=0.000000001, max=1.0, + default=(1.0)) + + media_diffusion_color = FloatVectorProperty( + name="Media Diffusion Color", description="The atmospheric media color", precision=4, step=0.01, min=0, soft_max=1, default=(0.001, 0.001, 0.001), options={'ANIMATABLE'}, subtype='COLOR') + media_absorption_scale = FloatProperty( + name="Scale", description="Scale factor of Media Absorption Color. " + "use 1/depth of media volume in meters", + precision=12, step=0.000001, min=0.000000001, max=1.0, + default=(0.00002)) + + media_absorption_color = FloatVectorProperty( + name="Media Absorption Color", description="The atmospheric media absorption color", + precision=4, step=0.01, min=0, soft_max=1, + default=(0.0, 0.0, 0.0), + options={'ANIMATABLE'}, + subtype='COLOR') + + media_eccentricity = FloatProperty( + name="Media Eccenticity Factor", description="Positive values lead" + " to scattering in the direction of the light and negative " + "values lead to scattering in the opposite direction of the " + "light. Larger values of e (or smaller values in the negative" + " case) increase the directional property of the scattering.", + precision=2, step=0.01, min=-1.0, max=1.0, + default=(0.0), + options={'ANIMATABLE'}) + baking_enable = BoolProperty( name="Enable Baking", description="Enable POV-Rays texture baking", @@ -377,7 +451,7 @@ class RenderPovSettingsScene(PropertyGroup): description="", maxlen=1024, subtype="FILE_PATH") - + #########RADIOSITY######## radio_adc_bailout = FloatProperty( name="ADC Bailout", description="The adc_bailout for radiosity rays. Use " @@ -422,7 +496,7 @@ class RenderPovSettingsScene(PropertyGroup): radio_media = BoolProperty( name="Media", description="Radiosity estimation can be affected by media", - default=False) + default=True) radio_subsurface = BoolProperty( name="Subsurface", description="Radiosity estimation can be affected by Subsurface Light Transport", @@ -468,7 +542,6 @@ class RenderPovSettingsScene(PropertyGroup): "in the mosaic preview last pass", min=0.000925, max=1.00, soft_min=0.01, soft_max=1.00, default=0.04, precision=3) - ############################################################################### # Material POV properties. ############################################################################### @@ -2199,20 +2272,14 @@ class PovrayPreferences(AddonPreferences): - - - - - - - - - def register(): bpy.utils.register_module(__name__) bpy.types.INFO_MT_add.prepend(ui.menu_func_add) bpy.types.INFO_MT_file_import.append(ui.menu_func_import) bpy.types.TEXT_MT_templates.append(ui.menu_func_templates) + bpy.types.RENDER_PT_povray_radiosity.prepend(ui.rad_panel_func) + bpy.types.LAMP_PT_POV_lamp.prepend(ui.lamp_panel_func) + bpy.types.WORLD_PT_world.prepend(ui.world_panel_func) # was used for parametric objects but made the other addon unreachable on # unregister for other tools to use created a user action call instead #addon_utils.enable("add_mesh_extra_objects", default_set=False, persistent=True) @@ -2244,6 +2311,9 @@ def unregister(): #bpy.types.TEXTURE_PT_context_texture.remove(TEXTURE_PT_povray_type) #addon_utils.disable("add_mesh_extra_objects", default_set=False) + bpy.types.WORLD_PT_world.remove(ui.world_panel_func) + bpy.types.LAMP_PT_POV_lamp.remove(ui.lamp_panel_func) + bpy.types.RENDER_PT_povray_radiosity.remove(ui.rad_panel_func) bpy.types.TEXT_MT_templates.remove(ui.menu_func_templates) bpy.types.INFO_MT_file_import.remove(ui.menu_func_import) bpy.types.INFO_MT_add.remove(ui.menu_func_add) diff --git a/render_povray/render.py b/render_povray/render.py index d36957807d073dff8f120180e5b83b3bb5801455..7e1f0499bf8dc576ed0aa5a922ed87a77b6d5315 100644 --- a/render_povray/render.py +++ b/render_povray/render.py @@ -186,13 +186,17 @@ def safety(name, Level): ##############end safety string name material ##############################EndSF########################### +csg_list = [] + def is_renderable(scene, ob): - return (ob.is_visible(scene) and not ob.hide_render) + return (ob.is_visible(scene) and not ob.hide_render and ob not in csg_list) def renderable_objects(scene): return [ob for ob in bpy.data.objects if is_renderable(scene, ob)] +def no_renderable_objects(scene): + return [ob for ob in csg_list] tabLevel = 0 unpacked_images=[] @@ -628,7 +632,7 @@ def write_pov(filename, scene=None, info_callback=None): tabWrite("fade_distance %.6f\n" % (lamp.distance / 2.0)) # Area lights have no falloff type, so always use blenders lamp quad equivalent # for those? - tabWrite("fade_power %d\n" % 0) + tabWrite("fade_power %d\n" % 2) size_x = lamp.size samples_x = lamp.shadow_ray_samples_x if lamp.shape == 'SQUARE': @@ -1793,7 +1797,7 @@ def write_pov(filename, scene=None, info_callback=None): # objectNames = {} DEF_OBJ_NAME = "Default" - def exportMeshes(scene, sel): + def exportMeshes(scene, sel, csg): # obmatslist = [] # def hasUniqueMaterial(): # # Grab materials attached to object instances ... @@ -2416,7 +2420,7 @@ def write_pov(filename, scene=None, info_callback=None): tabWrite("#declare %s = plane{ <0,0,1>,1\n"%povdataname) povMatName = "Default_texture" if ob.active_material: - #povMatName = string_strip_hyphen(bpy.path.clean_name(ob.active_material.name)) + #povMatName = string_strip_hyphen(bpy.path.clean_name(ob.active_material.name)) try: material = ob.active_material writeObjectMaterial(material, ob) @@ -3277,39 +3281,70 @@ def write_pov(filename, scene=None, info_callback=None): bpy.data.meshes.remove(me) - duplidata_ref = [] - for ob in sel: - #matrix = global_matrix * ob.matrix_world - if ob.is_duplicator: - tabWrite("\n//--DupliObjects in %s--\n\n"% ob.name) - ob.dupli_list_create(scene) - dup = "" - if ob.is_modified(scene, 'RENDER'): - #modified object always unique so using object name rather than data name - dup = "#declare OB%s = union{\n" %(string_strip_hyphen(bpy.path.clean_name(ob.name))) + if csg: + duplidata_ref = [] + for ob in sel: + #matrix = global_matrix * ob.matrix_world + if ob.is_duplicator: + tabWrite("\n//--DupliObjects in %s--\n\n"% ob.name) + ob.dupli_list_create(scene) + dup = "" + if ob.is_modified(scene, 'RENDER'): + #modified object always unique so using object name rather than data name + dup = "#declare OB%s = union{\n" %(string_strip_hyphen(bpy.path.clean_name(ob.name))) + else: + dup = "#declare DATA%s = union{\n" %(string_strip_hyphen(bpy.path.clean_name(ob.name))) + for eachduplicate in ob.dupli_list: + duplidataname = "OB"+string_strip_hyphen(bpy.path.clean_name(bpy.data.objects[eachduplicate.object.name].data.name)) + dup += ("\tobject {\n\t\tDATA%s\n\t\t%s\t}\n" %(string_strip_hyphen(bpy.path.clean_name(bpy.data.objects[eachduplicate.object.name].data.name)), MatrixAsPovString(ob.matrix_world.inverted() * eachduplicate.matrix))) + #add object to a list so that it is not rendered for some dupli_types + if ob.dupli_type not in {'GROUP'} and duplidataname not in duplidata_ref: + duplidata_ref.append(duplidataname) #older key [string_strip_hyphen(bpy.path.clean_name("OB"+ob.name))] + dup += "}\n" + ob.dupli_list_clear() + tabWrite(dup) else: - dup = "#declare DATA%s = union{\n" %(string_strip_hyphen(bpy.path.clean_name(ob.name))) - for eachduplicate in ob.dupli_list: - duplidataname = "OB"+string_strip_hyphen(bpy.path.clean_name(bpy.data.objects[eachduplicate.object.name].data.name)) - dup += ("\tobject {\n\t\tDATA%s\n\t\t%s\t}\n" %(string_strip_hyphen(bpy.path.clean_name(bpy.data.objects[eachduplicate.object.name].data.name)), MatrixAsPovString(ob.matrix_world.inverted() * eachduplicate.matrix))) - #add object to a list so that it is not rendered for some dupli_types - if ob.dupli_type not in {'GROUP'} and duplidataname not in duplidata_ref: - duplidata_ref.append(duplidataname) #older key [string_strip_hyphen(bpy.path.clean_name("OB"+ob.name))] - dup += "}\n" - ob.dupli_list_clear() - tabWrite(dup) - else: - continue - print(duplidata_ref) - for data_name, inst in data_ref.items(): - for ob_name, matrix_str in inst: - if ob_name not in duplidata_ref: #.items() for a dictionary - tabWrite("\n//----Blender Object Name:%s----\n" % ob_name) - tabWrite("object { \n") - tabWrite("%s\n" % data_name) - tabWrite("%s\n" % matrix_str) - tabWrite("}\n") - + continue + print(duplidata_ref) + for data_name, inst in data_ref.items(): + for ob_name, matrix_str in inst: + if ob_name not in duplidata_ref: #.items() for a dictionary + tabWrite("\n//----Blender Object Name:%s----\n" % ob_name) + if ob.pov.object_as == '': + tabWrite("object { \n") + tabWrite("%s\n" % data_name) + tabWrite("%s\n" % matrix_str) + tabWrite("}\n") + else: + no_boolean = True + for mod in ob.modifiers: + if mod.type == 'BOOLEAN': + operation = None + no_boolean = False + if mod.operation == 'INTERSECT': + operation = 'intersection' + else: + operation = mod.operation.lower() + mod_ob_name = string_strip_hyphen(bpy.path.clean_name(mod.object.name)) + mod_matrix = global_matrix * mod.object.matrix_world + mod_ob_matrix = MatrixAsPovString(mod_matrix) + tabWrite("%s { \n"%operation) + tabWrite("object { \n") + tabWrite("%s\n" % data_name) + tabWrite("%s\n" % matrix_str) + tabWrite("}\n") + tabWrite("object { \n") + tabWrite("%s\n" % ('DATA'+ mod_ob_name)) + tabWrite("%s\n" % mod_ob_matrix) + tabWrite("}\n") + tabWrite("}\n") + break + if no_boolean: + tabWrite("object { \n") + tabWrite("%s\n" % data_name) + tabWrite("%s\n" % matrix_str) + tabWrite("}\n") + def exportWorld(world): render = scene.render camera = scene.camera @@ -3444,18 +3479,33 @@ def write_pov(filename, scene=None, info_callback=None): if mist.use_mist: tabWrite("fog {\n") - tabWrite("distance %.6f\n" % mist.depth) + if mist.falloff=='LINEAR': + tabWrite("distance %.6f\n" % ((mist.start+mist.depth)*0.368)) + elif mist.falloff=='QUADRATIC': # n**2 or squrt(n)? + tabWrite("distance %.6f\n" % ((mist.start+mist.depth)**2*0.368)) + elif mist.falloff=='INVERSE_QUADRATIC': # n**2 or squrt(n)? + tabWrite("distance %.6f\n" % ((mist.start+mist.depth)**2*0.368)) tabWrite("color rgbt<%.3g, %.3g, %.3g, %.3g>\n" % \ (*world.horizon_color, 1.0 - mist.intensity)) - #tabWrite("fog_offset %.6f\n" % mist.start) - #tabWrite("fog_alt 5\n") + #tabWrite("fog_offset %.6f\n" % mist.start) #create a pov property to prepend + #tabWrite("fog_alt %.6f\n" % mist.height) #XXX right? #tabWrite("turbulence 0.2\n") #tabWrite("turb_depth 0.3\n") - tabWrite("fog_type 1\n") + tabWrite("fog_type 1\n") #type2 for height tabWrite("}\n") if scene.pov.media_enable: tabWrite("media {\n") - tabWrite("scattering { 1, rgb <%.4g, %.4g, %.4g>}\n" % scene.pov.media_color[:]) + tabWrite("scattering { %d, rgb %.12f*<%.4g, %.4g, %.4g>\n" % \ + (int(scene.pov.media_scattering_type), + (scene.pov.media_diffusion_scale), + *(scene.pov.media_diffusion_color[:]))) + if scene.pov.media_scattering_type == '5': + tabWrite("eccentricity %.3g\n" % scene.pov.media_eccentricity) + tabWrite("}\n") + tabWrite("absorption %.12f*<%.4g, %.4g, %.4g>\n" % \ + (scene.pov.media_absorption_scale, + *(scene.pov.media_absorption_color[:]))) + tabWrite("\n") tabWrite("samples %.d\n" % scene.pov.media_samples) tabWrite("}\n") @@ -3559,7 +3609,7 @@ def write_pov(filename, scene=None, info_callback=None): file.write(txt.as_string()) file.write("\n") - sel = renderable_objects(scene) + #sel = renderable_objects(scene) #removed for booleans if comments: file.write("//----------------------------------------------\n" \ "//--Exported with POV-Ray exporter for Blender--\n" \ @@ -3602,6 +3652,20 @@ def write_pov(filename, scene=None, info_callback=None): if comments: file.write("\n//--Lamps--\n\n") + for ob in bpy.data.objects: + if ob.type == 'MESH': + for mod in ob.modifiers: + if mod.type == 'BOOLEAN': + if mod.object not in csg_list: + csg_list.append(mod.object) + if csg_list != []: + csg = False + sel = no_renderable_objects(scene) + exportMeshes(scene, sel, csg) + + csg = True + sel = renderable_objects(scene) + exportLamps([L for L in sel if (L.type == 'LAMP' and L.pov.object_as != 'RAINBOW')]) if comments: @@ -3655,7 +3719,7 @@ def write_pov(filename, scene=None, info_callback=None): if comments: file.write("//--Mesh objects--\n") - exportMeshes(scene, sel) + exportMeshes(scene, sel, csg) #What follow used to happen here: #exportCamera() @@ -3745,7 +3809,7 @@ def write_pov_ini(scene, filename_ini, filename_log, filename_pov, filename_imag class PovrayRender(bpy.types.RenderEngine): bl_idname = 'POVRAY_RENDER' - bl_label = "POV-Ray 3.7" + bl_label = "Persitence Of Vision" DELAY = 0.5 @staticmethod @@ -4000,7 +4064,14 @@ class PovrayRender(bpy.types.RenderEngine): # Start Rendering! try: - _process = subprocess.Popen([pov_binary, self._temp_file_ini] + extra_args, + if sys.platform[:3] != "win" and scene.pov.sdl_window_enable: #segfault on linux == False !!! + env = {'POV_DISPLAY_SCALED': 'off'} + env.update(os.environ) + self._process = subprocess.Popen([pov_binary, self._temp_file_ini], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=env) + else: + self._process = subprocess.Popen([pov_binary, self._temp_file_ini] + extra_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) except OSError: # TODO, report api @@ -4397,4 +4468,4 @@ class RunPovTextRender(Operator): #empty text name property engain scene.pov.text_block = "" - return {'FINISHED'} \ No newline at end of file + return {'FINISHED'} \ No newline at end of file diff --git a/render_povray/shading.py b/render_povray/shading.py index 5a37170753f5cdff742815929de858debd9941cd..03a63a9d299c7b784feb74dd8616d6846598f90c 100644 --- a/render_povray/shading.py +++ b/render_povray/shading.py @@ -245,13 +245,11 @@ def writeMaterial(using_uberpov, DEF_MAT_NAME, scene, tabWrite, safety, comments for t in material.texture_slots: if t and t.use and t.texture is not None: if (t.texture.type == 'IMAGE' and t.texture.image) or t.texture.type != 'IMAGE': - validPath=True - else: - validPath=False - if(t and t.use and validPath and - (t.use_map_specular or t.use_map_raymir or t.use_map_normal or t.use_map_alpha)): - special_texture_found = True - continue # Some texture found + #validPath + if(t and t.use and + (t.use_map_specular or t.use_map_raymir or t.use_map_normal or t.use_map_alpha)): + special_texture_found = True + continue # Some texture found if special_texture_found or colored_specular_found: # Level=1 Means No specular nor Mirror reflection @@ -1087,7 +1085,6 @@ def writeTextureInfluence(mater, materialNames, LocalMaterialNames, path_image, else: if texturesDif and texturesDif.startswith("PAT_"): tabWrite("pigment{%s %s}\n" %(texturesDif, mappingDif)) - print('XXXMEEEERDE!') else: tabWrite("pigment {\n") tabWrite("uv_mapping image_map {\n") diff --git a/render_povray/ui.py b/render_povray/ui.py index 3d8a8870ff8fe64c5d857154eb63fa5f0baaca92..58c693983729b45f1c6a66b85ae6554957c057c1 100644 --- a/render_povray/ui.py +++ b/render_povray/ui.py @@ -22,6 +22,7 @@ import bpy import sys #really import here and in render.py? import os #really import here and in render.py? from os.path import isfile +from bl_operators.presets import AddPresetBase # Use some of the existing buttons. from bl_ui import properties_render @@ -41,6 +42,61 @@ properties_world.WORLD_PT_world.COMPAT_ENGINES.add('POVRAY_RENDER') properties_world.WORLD_PT_mist.COMPAT_ENGINES.add('POVRAY_RENDER') del properties_world +class POV_WORLD_MT_presets(bpy.types.Menu): + bl_label = "World Presets" + preset_subdir = "pov/world" + preset_operator = "script.execute_preset" + draw = bpy.types.Menu.draw_preset + + +class AddPresetWorld(AddPresetBase, bpy.types.Operator): + '''Add a World Preset''' + bl_idname = "object.world_preset_add" + bl_label = "Add World Preset" + preset_menu = "POV_WORLD_MT_presets" + + # variable used for all preset values + preset_defines = [ + "scene = bpy.context.scene" + ] + + # properties to store in the preset + preset_values = [ + "scene.world.use_sky_blend", + "scene.world.horizon_color", + "scene.world.zenith_color", + "scene.world.ambient_color", + "scene.world.mist_settings.use_mist", + "scene.world.mist_settings.intensity", + "scene.world.mist_settings.depth", + "scene.world.mist_settings.start", + "scene.pov.media_enable", + "scene.pov.media_scattering_type", + "scene.pov.media_samples", + "scene.pov.media_diffusion_scale", + "scene.pov.media_diffusion_color", + "scene.pov.media_absorption_scale", + "scene.pov.media_absorption_color", + "scene.pov.media_eccentricity", + ] + + # where to store the preset + preset_subdir = "pov/world" + +# Draw into an existing panel +def world_panel_func(self, context): + layout = self.layout + + row = layout.row(align=True) + row.menu(POV_WORLD_MT_presets.__name__, text=POV_WORLD_MT_presets.bl_label) + row.operator(AddPresetWorld.bl_idname, text="", icon='ZOOMIN') + row.operator(AddPresetWorld.bl_idname, text="", icon='ZOOMOUT').remove_active = True + + +classes = ( + POV_WORLD_MT_presets, + AddPresetWorld, + ) # Example of wrapping every class 'as is' from bl_ui import properties_texture @@ -453,6 +509,52 @@ class LAMP_PT_POV_lamp(PovLampButtonsPanel, bpy.types.Panel): draw = properties_data_lamp.DATA_PT_lamp.draw +class POV_LAMP_MT_presets(bpy.types.Menu): + bl_label = "Lamp Presets" + preset_subdir = "pov/lamp" + preset_operator = "script.execute_preset" + draw = bpy.types.Menu.draw_preset + + +class AddPresetLamp(AddPresetBase, bpy.types.Operator): + '''Add a Lamp Preset''' + bl_idname = "object.lamp_preset_add" + bl_label = "Add Lamp Preset" + preset_menu = "POV_LAMP_MT_presets" + + # variable used for all preset values + preset_defines = [ + "lampdata = bpy.context.object.data" + ] + + # properties to store in the preset + preset_values = [ + "lampdata.type", + "lampdata.color", + ] + + # where to store the preset + preset_subdir = "pov/lamp" + + + + + +# Draw into an existing panel +def lamp_panel_func(self, context): + layout = self.layout + + row = layout.row(align=True) + row.menu(POV_LAMP_MT_presets.__name__, text=POV_LAMP_MT_presets.bl_label) + row.operator(AddPresetLamp.bl_idname, text="", icon='ZOOMIN') + row.operator(AddPresetLamp.bl_idname, text="", icon='ZOOMOUT').remove_active = True + + +classes = ( + POV_LAMP_MT_presets, + AddPresetLamp, + ) + class LAMP_PT_POV_sunsky(PovLampButtonsPanel, bpy.types.Panel): bl_label = properties_data_lamp.DATA_PT_sunsky.bl_label @@ -609,7 +711,10 @@ class RENDER_PT_povray_render_settings(RenderButtonsPanel, bpy.types.Panel): scene = context.scene #layout.active = (scene.pov.max_trace_level != 0) - + + if sys.platform[:3] != "win": + layout.prop(scene.pov, "sdl_window_enable", text="POV-Ray SDL Window") + col = layout.column() col.label(text="Global Settings:") @@ -787,7 +892,71 @@ class RENDER_PT_povray_radiosity(RenderButtonsPanel, bpy.types.Panel): col.prop(scene.pov, "radio_subsurface") - + + + +class POV_RADIOSITY_MT_presets(bpy.types.Menu): + bl_label = "Radiosity Presets" + preset_subdir = "pov/radiosity" + preset_operator = "script.execute_preset" + draw = bpy.types.Menu.draw_preset + + +class AddPresetRadiosity(AddPresetBase, bpy.types.Operator): + '''Add a Radiosity Preset''' + bl_idname = "scene.radiosity_preset_add" + bl_label = "Add Radiosity Preset" + preset_menu = "POV_RADIOSITY_MT_presets" + + # variable used for all preset values + preset_defines = [ + "scene = bpy.context.scene" + ] + + # properties to store in the preset + preset_values = [ + "scene.pov.radio_display_advanced", + "scene.pov.radio_adc_bailout", + "scene.pov.radio_always_sample", + "scene.pov.radio_brightness", + "scene.pov.radio_count", + "scene.pov.radio_error_bound", + "scene.pov.radio_gray_threshold", + "scene.pov.radio_low_error_factor", + "scene.pov.radio_media", + "scene.pov.radio_subsurface", + "scene.pov.radio_minimum_reuse", + "scene.pov.radio_maximum_reuse", + "scene.pov.radio_nearest_count", + "scene.pov.radio_normal", + "scene.pov.radio_recursion_limit", + "scene.pov.radio_pretrace_start", + "scene.pov.radio_pretrace_end", + ] + + # where to store the preset + preset_subdir = "pov/radiosity" + + + + + +# Draw into an existing panel +def rad_panel_func(self, context): + layout = self.layout + + row = layout.row(align=True) + row.menu(POV_RADIOSITY_MT_presets.__name__, text=POV_RADIOSITY_MT_presets.bl_label) + row.operator(AddPresetRadiosity.bl_idname, text="", icon='ZOOMIN') + row.operator(AddPresetRadiosity.bl_idname, text="", icon='ZOOMOUT').remove_active = True + + +classes = ( + POV_RADIOSITY_MT_presets, + AddPresetRadiosity, + ) + + class RENDER_PT_povray_media(WorldButtonsPanel, bpy.types.Panel): bl_label = "Atmosphere Media" COMPAT_ENGINES = {'POVRAY_RENDER'} @@ -804,10 +973,22 @@ class RENDER_PT_povray_media(WorldButtonsPanel, bpy.types.Panel): layout.active = scene.pov.media_enable - row = layout.row() - row.prop(scene.pov, "media_samples", text="Samples") - row.prop(scene.pov, "media_color", text="") - + col = layout.column() + col.prop(scene.pov, "media_scattering_type", text="") + col = layout.column() + col.prop(scene.pov, "media_samples", text="Samples") + split = layout.split() + col = split.column(align=True) + col.label(text="Scattering:") + col.prop(scene.pov, "media_diffusion_scale") + col.prop(scene.pov, "media_diffusion_color", text="") + col = split.column(align=True) + col.label(text="Absorption:") + col.prop(scene.pov, "media_absorption_scale") + col.prop(scene.pov, "media_absorption_color", text="") + if scene.pov.media_scattering_type == '5': + col = layout.column() + col.prop(scene.pov, "media_eccentricity", text="Eccentricity") ##class RENDER_PT_povray_baking(RenderButtonsPanel, bpy.types.Panel): ## bl_label = "Baking" ## COMPAT_ENGINES = {'POVRAY_RENDER'} @@ -824,7 +1005,7 @@ class RENDER_PT_povray_media(WorldButtonsPanel, bpy.types.Panel): ## rd = scene.render ## ## layout.active = scene.pov.baking_enable -'''XXX WIP preparing for CSG + class MODIFIERS_PT_povray_modifiers(ModifierButtonsPanel, bpy.types.Panel): bl_label = "POV-Ray" COMPAT_ENGINES = {'POVRAY_RENDER'} @@ -853,7 +1034,7 @@ class MODIFIERS_PT_povray_modifiers(ModifierButtonsPanel, bpy.types.Panel): col = layout.column() # Inside Vector for CSG col.prop(ob.pov, "inside_vector") -''' + class MATERIAL_PT_povray_activate_node(MaterialButtonsPanel, bpy.types.Panel): bl_label = "Activate Node Settings"