forked from bartvdbraak/blender
08cea96ab0
This assumptions are now made: - Internally float buffers are always linear alpha-premul colors - Readers should worry about delivering float buffers with that assumptions. - There's an input image setting to say whether it's stored with straight/premul alpha on the disk. - Byte buffers are now assumed have straight alpha, readers should deliver straight alpha. Some implementation details: - Removed scene's color unpremultiply setting, which was very much confusing and was wrong for default settings. Now all renderers assumes to deliver premultiplied alpha. - IMB_buffer_byte_from_float will now linearize alpha when converting from buffer. - Sequencer's effects were changed to assume bytes have got straight alpha. Most of effects will work with bytes still, however for glow it was more tricky to avoid data loss, so there's a commented out glow implementation which converts byte buffer to floats first, operates on floats and returns bytes back. It's slower and not sure if it should actually be used -- who're using glow on alpha anyway? - Sequencer modifiers should also be working nice with straight bytes now. - GLSL preview will predivide float textures to make nice shading, shading with byte textures worked nice (GLSL was assuming straight alpha). - Blender Internal will set alpha=1 to the whole sky. The same happens in Cycles and there's no way to avoid this -- sky is neither straight nor premul and doesn't fit color pipeline well. - Straight alpha mode for render result was also eliminated. - Conversion to correct alpha need to be done before linearizing float buffer. - TIFF will now load and save files with proper alpha mode setting in file meta data header. - Remove Use Alpha from texture mapping and replaced with image datablock setting. Behaves much more predictable and clear from code point of view and solves possible regressions when non-premultiplied images were used as textures with ignoring alpha channel.
280 lines
8.4 KiB
Python
280 lines
8.4 KiB
Python
# ##### BEGIN GPL LICENSE BLOCK #####
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# ##### END GPL LICENSE BLOCK #####
|
|
|
|
# <pep8 compliant>
|
|
import bpy
|
|
from bpy.types import Panel, UIList
|
|
from rna_prop_ui import PropertyPanel
|
|
|
|
|
|
class SCENE_UL_keying_set_paths(UIList):
|
|
def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
|
|
# assert(isinstance(item, bpy.types.KeyingSetPath)
|
|
kspath = item
|
|
icon = layout.enum_item_icon(kspath, "id_type", kspath.id_type)
|
|
if self.layout_type in {'DEFAULT', 'COMPACT'}:
|
|
layout.label(kspath.data_path, icon_value=icon)
|
|
elif self.layout_type in {'GRID'}:
|
|
layout.alignment = 'CENTER'
|
|
layout.label("", icon_value=icon)
|
|
|
|
|
|
class SceneButtonsPanel():
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "scene"
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
rd = context.scene.render
|
|
return context.scene and (rd.engine in cls.COMPAT_ENGINES)
|
|
|
|
|
|
class SCENE_PT_scene(SceneButtonsPanel, Panel):
|
|
bl_label = "Scene"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
|
|
layout.prop(scene, "camera")
|
|
layout.prop(scene, "background_set", text="Background")
|
|
layout.prop(scene, "active_clip", text="Active Clip")
|
|
|
|
|
|
class SCENE_PT_audio(SceneButtonsPanel, Panel):
|
|
bl_label = "Audio"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
rd = context.scene.render
|
|
ffmpeg = rd.ffmpeg
|
|
|
|
layout.prop(scene, "audio_volume")
|
|
layout.operator("sound.bake_animation")
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.label("Listener:")
|
|
col.prop(scene, "audio_distance_model", text="")
|
|
col.prop(scene, "audio_doppler_speed", text="Speed")
|
|
col.prop(scene, "audio_doppler_factor", text="Doppler")
|
|
|
|
col = split.column()
|
|
col.label("Format:")
|
|
col.prop(ffmpeg, "audio_channels", text="")
|
|
col.prop(ffmpeg, "audio_mixrate", text="Rate")
|
|
|
|
layout.operator("sound.mixdown")
|
|
|
|
|
|
class SCENE_PT_unit(SceneButtonsPanel, Panel):
|
|
bl_label = "Units"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
unit = context.scene.unit_settings
|
|
|
|
col = layout.column()
|
|
col.row().prop(unit, "system", expand=True)
|
|
col.row().prop(unit, "system_rotation", expand=True)
|
|
|
|
row = layout.row()
|
|
row.active = (unit.system != 'NONE')
|
|
row.prop(unit, "scale_length", text="Scale")
|
|
row.prop(unit, "use_separate")
|
|
|
|
|
|
class SCENE_PT_keying_sets(SceneButtonsPanel, Panel):
|
|
bl_label = "Keying Sets"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
row = layout.row()
|
|
|
|
col = row.column()
|
|
col.template_list("UI_UL_list", "", scene, "keying_sets", scene.keying_sets, "active_index", rows=2)
|
|
|
|
col = row.column(align=True)
|
|
col.operator("anim.keying_set_add", icon='ZOOMIN', text="")
|
|
col.operator("anim.keying_set_remove", icon='ZOOMOUT', text="")
|
|
|
|
ks = scene.keying_sets.active
|
|
if ks and ks.is_path_absolute:
|
|
row = layout.row()
|
|
|
|
col = row.column()
|
|
col.prop(ks, "bl_label")
|
|
col.prop(ks, "bl_description")
|
|
|
|
subcol = col.column()
|
|
subcol.operator_context = 'INVOKE_DEFAULT'
|
|
subcol.operator("anim.keying_set_export", text="Export to File").filepath = "keyingset.py"
|
|
|
|
col = row.column(align=True)
|
|
col.label(text="Keyframing Settings:")
|
|
col.prop(ks, "bl_options")
|
|
|
|
|
|
class SCENE_PT_keying_set_paths(SceneButtonsPanel, Panel):
|
|
bl_label = "Active Keying Set"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
|
|
@classmethod
|
|
def poll(cls, context):
|
|
ks = context.scene.keying_sets.active
|
|
return (ks and ks.is_path_absolute)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
ks = scene.keying_sets.active
|
|
|
|
row = layout.row()
|
|
row.label(text="Paths:")
|
|
|
|
row = layout.row()
|
|
|
|
col = row.column()
|
|
col.template_list("SCENE_UL_keying_set_paths", "", ks, "paths", ks.paths, "active_index", rows=2)
|
|
|
|
col = row.column(align=True)
|
|
col.operator("anim.keying_set_path_add", icon='ZOOMIN', text="")
|
|
col.operator("anim.keying_set_path_remove", icon='ZOOMOUT', text="")
|
|
|
|
ksp = ks.paths.active
|
|
if ksp:
|
|
col = layout.column()
|
|
col.label(text="Target:")
|
|
col.template_any_ID(ksp, "id", "id_type")
|
|
col.template_path_builder(ksp, "data_path", ksp.id)
|
|
|
|
row = col.row(align=True)
|
|
row.label(text="Array Target:")
|
|
row.prop(ksp, "use_entire_array", text="All Items")
|
|
if ksp.use_entire_array:
|
|
row.label(text=" ") # padding
|
|
else:
|
|
row.prop(ksp, "array_index", text="Index")
|
|
|
|
layout.separator()
|
|
|
|
row = layout.row()
|
|
col = row.column()
|
|
col.label(text="F-Curve Grouping:")
|
|
col.prop(ksp, "group_method", text="")
|
|
if ksp.group_method == 'NAMED':
|
|
col.prop(ksp, "group")
|
|
|
|
col = row.column(align=True)
|
|
col.label(text="Keyframing Settings:")
|
|
col.prop(ksp, "bl_options")
|
|
|
|
|
|
class SCENE_PT_physics(SceneButtonsPanel, Panel):
|
|
bl_label = "Gravity"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
|
|
def draw_header(self, context):
|
|
self.layout.prop(context.scene, "use_gravity", text="")
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
|
|
layout.active = scene.use_gravity
|
|
|
|
layout.prop(scene, "gravity", text="")
|
|
|
|
|
|
class SCENE_PT_simplify(SceneButtonsPanel, Panel):
|
|
bl_label = "Simplify"
|
|
COMPAT_ENGINES = {'BLENDER_RENDER'}
|
|
|
|
def draw_header(self, context):
|
|
rd = context.scene.render
|
|
self.layout.prop(rd, "use_simplify", text="")
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
rd = context.scene.render
|
|
|
|
layout.active = rd.use_simplify
|
|
|
|
split = layout.split()
|
|
|
|
col = split.column()
|
|
col.prop(rd, "simplify_subdivision", text="Subdivision")
|
|
col.prop(rd, "simplify_child_particles", text="Child Particles")
|
|
|
|
col.prop(rd, "use_simplify_triangulate")
|
|
|
|
col = split.column()
|
|
col.prop(rd, "simplify_shadow_samples", text="Shadow Samples")
|
|
col.prop(rd, "simplify_ao_sss", text="AO and SSS")
|
|
|
|
|
|
class SCENE_PT_color_management(Panel):
|
|
bl_label = "Color Management"
|
|
bl_space_type = 'PROPERTIES'
|
|
bl_region_type = 'WINDOW'
|
|
bl_context = "scene"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
|
|
scene = context.scene
|
|
rd = scene.render
|
|
|
|
col = layout.column()
|
|
col.label(text="Display:")
|
|
col.prop(scene.display_settings, "display_device")
|
|
|
|
col = layout.column()
|
|
col.separator()
|
|
col.label(text="Render:")
|
|
col.template_colormanaged_view_settings(scene, "view_settings")
|
|
|
|
col = layout.column()
|
|
col.separator()
|
|
col.label(text="Sequencer:")
|
|
col.prop(scene.sequencer_colorspace_settings, "name")
|
|
|
|
|
|
class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, Panel):
|
|
COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
|
|
_context_path = "scene"
|
|
_property_type = bpy.types.Scene
|
|
|
|
if __name__ == "__main__": # only for live edit.
|
|
bpy.utils.register_module(__name__)
|