Patch #21011: Tweaks to Sky/Atmosphere presets
[blender.git] / release / scripts / op / presets.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21 import bpy
22 import os
23
24
25 class AddPresetBase(bpy.types.Operator):
26     '''Base preset class, only for subclassing
27     subclasses must define
28      - preset_values
29      - preset_subdir '''
30     bl_idname = "render.preset_add"
31     bl_label = "Add Render Preset"
32
33     name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
34
35     def _as_filename(self, name): # could reuse for other presets
36         for char in " !@#$%^&*(){}:\";'[]<>,./?":
37             name = name.replace('.', '_')
38         return name.lower()
39
40     def execute(self, context):
41
42         if not self.properties.name:
43             return {'FINISHED'}
44
45         filename = self._as_filename(self.properties.name) + ".py"
46
47         target_path = bpy.utils.preset_paths(self.preset_subdir)[0] # we need some way to tell the user and system preset path
48
49         file_preset = open(os.path.join(target_path, filename), 'w')
50
51         for rna_path in self.preset_values:
52             value = eval(rna_path)
53             if type(value) == str:
54                 value = "'%s'" % value
55
56             file_preset.write("%s = %s\n" % (rna_path, value))
57
58         file_preset.close()
59
60         return {'FINISHED'}
61
62     def invoke(self, context, event):
63         wm = context.manager
64         #crashes, TODO - fix
65         #return wm.invoke_props_popup(self, event)
66
67         wm.invoke_props_popup(self, event)
68         return {'RUNNING_MODAL'}
69
70
71 class AddPresetRender(AddPresetBase):
72     '''Add a Render Preset.'''
73     bl_idname = "render.preset_add"
74     bl_label = "Add Render Preset"
75     name = AddPresetBase.name
76
77     preset_values = [
78         "bpy.context.scene.render_data.resolution_x",
79         "bpy.context.scene.render_data.resolution_y",
80         "bpy.context.scene.render_data.pixel_aspect_x",
81         "bpy.context.scene.render_data.pixel_aspect_y",
82         "bpy.context.scene.render_data.fps",
83         "bpy.context.scene.render_data.fps_base",
84         "bpy.context.scene.render_data.resolution_percentage",
85     ]
86
87     preset_subdir = "render"
88
89
90 class AddPresetSSS(AddPresetBase):
91     '''Add a Subsurface Scattering Preset.'''
92     bl_idname = "material.sss_preset_add"
93     bl_label = "Add SSS Preset"
94     name = AddPresetBase.name
95
96     preset_values = [
97         "bpy.context.material.subsurface_scattering.back",
98         "bpy.context.material.subsurface_scattering.color[0]",
99         "bpy.context.material.subsurface_scattering.color[1]",
100         "bpy.context.material.subsurface_scattering.color[2]",
101         "bpy.context.material.subsurface_scattering.color_factor",
102         "bpy.context.material.subsurface_scattering.error_tolerance",
103         "bpy.context.material.subsurface_scattering.front",
104         "bpy.context.material.subsurface_scattering.ior",
105         "bpy.context.material.subsurface_scattering.radius[0]",
106         "bpy.context.material.subsurface_scattering.radius[1]",
107         "bpy.context.material.subsurface_scattering.radius[2]",
108         "bpy.context.material.subsurface_scattering.scale",
109         "bpy.context.material.subsurface_scattering.texture_factor",
110     ]
111
112     preset_subdir = "sss"
113
114
115 class AddPresetCloth(AddPresetBase):
116     '''Add a Cloth Preset.'''
117     bl_idname = "cloth.preset_add"
118     bl_label = "Add Cloth Preset"
119     name = AddPresetBase.name
120
121     preset_values = [
122         "bpy.context.cloth.settings.quality",
123         "bpy.context.cloth.settings.mass",
124         "bpy.context.cloth.settings.structural_stiffness",
125         "bpy.context.cloth.settings.bending_stiffness",
126         "bpy.context.cloth.settings.spring_damping",
127         "bpy.context.cloth.settings.air_damping",
128     ]
129
130     preset_subdir = "cloth"
131
132
133 class AddPresetSunSky(AddPresetBase):
134     '''Add a Sky & Atmosphere Preset.'''
135     bl_idname = "lamp.sunsky_preset_add"
136     bl_label = "Add Sunsky Preset"
137     name = AddPresetBase.name
138
139     preset_values = [
140         "bpy.context.object.data.sky.atmosphere_turbidity",
141         "bpy.context.object.data.sky.sky_blend_type",
142         "bpy.context.object.data.sky.sky_blend",
143         "bpy.context.object.data.sky.horizon_brightness",
144         "bpy.context.object.data.sky.spread",
145         "bpy.context.object.data.sky.sky_color_space",
146         "bpy.context.object.data.sky.sky_exposure",
147         "bpy.context.object.data.sky.sun_brightness",
148         "bpy.context.object.data.sky.sun_size",
149         "bpy.context.object.data.sky.backscattered_light",
150         "bpy.context.object.data.sky.sun_intensity",
151         "bpy.context.object.data.sky.atmosphere_inscattering",
152         "bpy.context.object.data.sky.atmosphere_extinction",
153     ]
154
155     preset_subdir = "sunsky"
156
157
158 bpy.types.register(AddPresetRender)
159 bpy.types.register(AddPresetSSS)
160 bpy.types.register(AddPresetCloth)
161 bpy.types.register(AddPresetSunSky)