﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Extensions%3A2.6%2FPy%2FAPI_Changes</id>
	<title>Extensions:2.6/Py/API Changes - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Extensions%3A2.6%2FPy%2FAPI_Changes"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Extensions:2.6/Py/API_Changes&amp;action=history"/>
	<updated>2026-06-02T04:06:06Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Extensions:2.6/Py/API_Changes&amp;diff=140889&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Extensions:2.6/Py/API_Changes&amp;diff=140889&amp;oldid=prev"/>
		<updated>2018-06-28T20:53:38Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 20:53時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Extensions:2.6/Py/API_Changes&amp;diff=140888&amp;oldid=prev</id>
		<title>2013年10月10日 (木) 13:00にwiki&gt;Phonyboneによる</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Extensions:2.6/Py/API_Changes&amp;diff=140888&amp;oldid=prev"/>
		<updated>2013-10-10T13:00:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= API Changes =&lt;br /&gt;
&lt;br /&gt;
This page shall give addon developers advice on '''how to update''' their scripts to make them work again '''after major changes to the Blender Python API'''.&lt;br /&gt;
&lt;br /&gt;
If your specific problem isn't covered here, feel free to inform the community about it in the [http://blenderartists.org/forum/showthread.php?283531-Recent-API-changes forum].&lt;br /&gt;
&lt;br /&gt;
You may also have a look at the auto-generated [http://www.blender.org/documentation/blender_python_api_{{Blender/Version/Current|use=apiurl}}_release/change_log.html API change log] for minor things that changed - but keep in mind that it may be incomplete!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2.66 ==&lt;br /&gt;
==== Template List ({{Commit|53355}}) ====&lt;br /&gt;
&lt;br /&gt;
UI's &amp;lt;code&amp;gt;template_list()&amp;lt;/code&amp;gt; was refactored to be much more flexible and give real control over items' drawing. A new RNA type was introduced for this, &amp;lt;code&amp;gt;bpy.types.UIList&amp;lt;/code&amp;gt;, making lists independent from Panels. This UIList has a &amp;lt;code&amp;gt;draw_item()&amp;lt;/code&amp;gt; callback which allows to customize items' drawing from python, that all addons can now use.&lt;br /&gt;
&lt;br /&gt;
If your addon uses the old API for a simple list, it's easy to update:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# OLD&lt;br /&gt;
template_list(bpy.context.scene, &amp;quot;your_collection&amp;quot;, bpy.context.scene, &amp;quot;your_collection_idx&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# NEW&lt;br /&gt;
template_list('UI_UL_list', 'your_collection_id', bpy.context.scene, &amp;quot;your_collection&amp;quot;, bpy.context.scene, &amp;quot;your_collection_idx&amp;quot;)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For simple lists, it isn't necessary to derive a custom class from UIList type. Instead, simply put 'UI_UL_list' (for a default drawing method for the list items) as first argument and a list ID string as second. Chose something unique for the ID, preferably a brief description of what your list contains. If another script used the default 'UI_UL_list' and the same ID (maybe a blank string), Blender would not be able to distinguish between both lists!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For in-depth explanation, e.g. how to create custom draw_item callbacks, see the API docs: [http://www.blender.org/documentation/blender_python_api_2_66_release/bpy.types.UIList.html UIList], [http://www.blender.org/documentation/blender_python_api_2_66_release/bpy.types.UILayout.html#bpy.types.UILayout.template_list UILayout.template_list].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Region Draw Callbacks ({{Commit|53207}}) ====&lt;br /&gt;
Region drawing callbacks were changed to work much closer to how blender manages them internally. The change was necessary to fix bug {{BugReport|30740}}.&lt;br /&gt;
&lt;br /&gt;
To update old code, you need to replace the &amp;lt;code&amp;gt;Region.callback_add()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Region.callback_remove()&amp;lt;/code&amp;gt; calls. The new way of adding/removing a draw callback is to call a Space type's &amp;lt;code&amp;gt;draw_handler_add()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;draw_handler_remove()&amp;lt;/code&amp;gt; functions. A common Space type is the 3D View, &amp;lt;code&amp;gt;bpy.types.SpaceView3D&amp;lt;/code&amp;gt;. For a list of Space types, see ''subclasses'' in [http://www.blender.org/documentation/blender_python_api_{{Blender/Version/Current|use=apiurl}}_release/bpy.types.Space.html API docs - bpy.types.Space].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The deprecated &amp;lt;code&amp;gt;callback_add()&amp;lt;/code&amp;gt; expected 3 arguments, whereas &amp;lt;code&amp;gt;draw_handler_add()&amp;lt;/code&amp;gt; requires 4. You now need to specify the Space's region type (string) as 3rd parameter. It is also required on callback removal:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# OLD&lt;br /&gt;
self._handle = context.region.callback_add(draw_callback_px, (self, context), 'POST_PIXEL')&lt;br /&gt;
context.region.callback_remove(self._handle)&lt;br /&gt;
&lt;br /&gt;
# NEW&lt;br /&gt;
CLASSNAME._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (self, context), 'WINDOW', 'POST_PIXEL')&lt;br /&gt;
bpy.types.SpaceView3D.draw_handler_remove(CLASSNAME._handle, 'WINDOW')&lt;br /&gt;
# To store the handle, the class should be used rather than the class instance (you may use self.__class__),&lt;br /&gt;
# so we can access the variable from outside, e.g. to remove the drawback on unregister()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below you find a comparison of the old and the new API usage:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class ScreencastKeysStatus(bpy.types.Operator):&lt;br /&gt;
    bl_idname = &amp;quot;view3d.screencast_keys&amp;quot;&lt;br /&gt;
    bl_label = &amp;quot;Screencast Keys&amp;quot;&lt;br /&gt;
    bl_description = &amp;quot;Display keys pressed in the 3D View&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    _handle = None&lt;br /&gt;
    _timer = None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def modal(self, context, event):&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
        if not context.window_manager.screencast_keys_keys:&lt;br /&gt;
            # stop script&lt;br /&gt;
            context.window_manager.event_timer_remove(self._timer)&lt;br /&gt;
            context.region.callback_remove(self._handle)&lt;br /&gt;
            return {'CANCELLED'}&lt;br /&gt;
&lt;br /&gt;
        return {'PASS_THROUGH'}&lt;br /&gt;
&lt;br /&gt;
    def cancel(self, context):&lt;br /&gt;
        if context.window_manager.screencast_keys_keys:&lt;br /&gt;
            context.window_manager.event_timer_remove(self._timer)&lt;br /&gt;
            context.region.callback_remove(self._handle)&lt;br /&gt;
            context.window_manager.screencast_keys_keys = False&lt;br /&gt;
        return {'CANCELLED'}&lt;br /&gt;
&lt;br /&gt;
    def invoke(self, context, event):&lt;br /&gt;
        # ...&lt;br /&gt;
                self._handle = context.region.callback_add(draw_callback_px,&lt;br /&gt;
                    (self, context), 'POST_PIXEL')&lt;br /&gt;
                self._timer = context.window_manager.event_timer_add(0.075,&lt;br /&gt;
                    context.window)&lt;br /&gt;
&lt;br /&gt;
# ...&lt;br /&gt;
def unregister():&lt;br /&gt;
&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;class ScreencastKeysStatus(bpy.types.Operator):&lt;br /&gt;
    bl_idname = &amp;quot;view3d.screencast_keys&amp;quot;&lt;br /&gt;
    bl_label = &amp;quot;Screencast Keys&amp;quot;&lt;br /&gt;
    bl_description = &amp;quot;Display keys pressed in the 3D View&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    _handle = None&lt;br /&gt;
    _timer = None&lt;br /&gt;
&lt;br /&gt;
    @staticmethod&lt;br /&gt;
    def handle_add(self, context):&lt;br /&gt;
        ScreencastKeysStatus._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (self, context), 'WINDOW', 'POST_PIXEL')&lt;br /&gt;
        ScreencastKeysStatus._timer = context.window_manager.event_timer_add(0.075, context.window)&lt;br /&gt;
&lt;br /&gt;
    @staticmethod&lt;br /&gt;
    def handle_remove(context):&lt;br /&gt;
        if ScreencastKeysStatus._handle is not None:&lt;br /&gt;
            context.window_manager.event_timer_remove(ScreencastKeysStatus._timer)&lt;br /&gt;
            bpy.types.SpaceView3D.draw_handler_remove(ScreencastKeysStatus._handle, 'WINDOW')&lt;br /&gt;
        ScreencastKeysStatus._handle = None&lt;br /&gt;
        ScreencastKeysStatus._timer = None&lt;br /&gt;
&lt;br /&gt;
    def modal(self, context, event):&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
        if not context.window_manager.screencast_keys_keys:&lt;br /&gt;
            # stop script&lt;br /&gt;
&lt;br /&gt;
            ScreencastKeysStatus.handle_remove(context)&lt;br /&gt;
            return {'CANCELLED'}&lt;br /&gt;
&lt;br /&gt;
        return {'PASS_THROUGH'}&lt;br /&gt;
&lt;br /&gt;
    def cancel(self, context):&lt;br /&gt;
        if context.window_manager.screencast_keys_keys:&lt;br /&gt;
&lt;br /&gt;
            ScreencastKeysStatus.handle_remove(context)&lt;br /&gt;
            context.window_manager.screencast_keys_keys = False&lt;br /&gt;
        return {'CANCELLED'}&lt;br /&gt;
&lt;br /&gt;
    def invoke(self, context, event):&lt;br /&gt;
        # ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                ScreencastKeysStatus.handle_add(self, context)&lt;br /&gt;
&lt;br /&gt;
# ...&lt;br /&gt;
def unregister():&lt;br /&gt;
    ScreencastKeysStatus.handle_remove(bpy.context)&lt;br /&gt;
# ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Clr}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: If you don't use an event timer, remove the argument &amp;quot;context&amp;quot; from &amp;lt;code&amp;gt;handle_remove()&amp;lt;/code&amp;gt;, in staticmethod definition and in the call inside &amp;lt;code&amp;gt;unregister()&amp;lt;/code&amp;gt;. Or omit the static methods and call the draw_handler_* functions directly, as seen in the [http://projects.blender.org/scm/viewvc.php/*checkout*/trunk/blender/release/scripts/templates/operator_modal_draw.py?root=bf-blender&amp;amp;revision=53207&amp;amp;content-type=text%2Fplain&amp;amp;pathrev=53207 Operator Modal Draw template].&lt;br /&gt;
&lt;br /&gt;
==== Restricted Context ====&lt;br /&gt;
&lt;br /&gt;
To avoid errors on accessing blend-file data while addons &amp;lt;code&amp;gt;register()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;unregister()&amp;lt;/code&amp;gt;, Blender now restricts access to '''bpy.context''' and '''bpy.data'''.&lt;br /&gt;
&lt;br /&gt;
This is done because there is no assurance that the data loaded when the addon is registered will be active or even exist when the user accesses operators the addon defines.&lt;br /&gt;
&lt;br /&gt;
If you see an exception like this, then the addon needs to be updated to access the context during execution rather then on registration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
AttributeError: '_RestrictContext' object has no attribute 'scene'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bad code example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def register():&lt;br /&gt;
    bpy.types.Scene.my_prop = bpy.props.StringProperty()&lt;br /&gt;
    bpy.context.scene.my_prop = &amp;quot;foobar&amp;quot; # can't access bpy.context here!&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Such initialization needs to be done when an operator runs the first time. It's also possible to provide a special init operator, shown as button in a panel.&lt;br /&gt;
&lt;br /&gt;
Init operator example:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import bpy&lt;br /&gt;
&lt;br /&gt;
class HelloWorldPanel(bpy.types.Panel):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Creates a Panel in the Object properties window&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    bl_label = &amp;quot;Hello World Panel&amp;quot;&lt;br /&gt;
    bl_idname = &amp;quot;OBJECT_PT_hello&amp;quot;&lt;br /&gt;
    bl_space_type = 'PROPERTIES'&lt;br /&gt;
    bl_region_type = 'WINDOW'&lt;br /&gt;
    bl_context = &amp;quot;scene&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def draw(self, context):&lt;br /&gt;
        layout = self.layout&lt;br /&gt;
&lt;br /&gt;
        # If Scene.my_prop wasn't created in register() or removed, draw a note&lt;br /&gt;
        if not hasattr(context.scene, &amp;quot;my_prop&amp;quot;):&lt;br /&gt;
            layout.label(&amp;quot;Scene does not have a property 'my_prop'&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # If it has no longer the default property value, draw a label with icon&lt;br /&gt;
        elif context.scene.my_prop != 'default value':&lt;br /&gt;
            layout.label(&amp;quot;my_prop = &amp;quot; + context.scene.my_prop, icon=&amp;quot;FILE_TICK&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # It has the default property value, draw a label with no icon&lt;br /&gt;
        else:&lt;br /&gt;
            layout.label(&amp;quot;my_prop = &amp;quot; + context.scene.my_prop)&lt;br /&gt;
&lt;br /&gt;
        layout.operator(InitMyPropOperator.bl_idname, text=InitMyPropOperator.bl_label)&lt;br /&gt;
&lt;br /&gt;
class InitMyPropOperator(bpy.types.Operator):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Tooltip&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    bl_idname = &amp;quot;scene.init_my_prop&amp;quot;&lt;br /&gt;
    bl_label = &amp;quot;Init my_prop&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    @classmethod&lt;br /&gt;
    def poll(cls, context):&lt;br /&gt;
        return context.active_object is not None&lt;br /&gt;
&lt;br /&gt;
    def execute(self, context):&lt;br /&gt;
        if context.scene.my_prop != &amp;quot;initialized&amp;quot;:&lt;br /&gt;
            context.scene.my_prop = &amp;quot;initialized&amp;quot;&lt;br /&gt;
            self.__class__.bl_label = &amp;quot;Change my_prop&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            context.scene.my_prop = &amp;quot;foobar&amp;quot;&lt;br /&gt;
            self.__class__.bl_label = self.bl_label&lt;br /&gt;
        return {'FINISHED'}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def register():&lt;br /&gt;
    bpy.utils.register_module(__name__)&lt;br /&gt;
    bpy.types.Scene.my_prop = bpy.props.StringProperty(default=&amp;quot;default value&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
def unregister():&lt;br /&gt;
    bpy.utils.unregister_module(__name__)&lt;br /&gt;
    del bpy.types.Scene.my_prop&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    register()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also see: [http://lists.blender.org/pipermail/bf-python/2012-December/005987.html mailing list thread]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 2.67 ==&lt;br /&gt;
&lt;br /&gt;
==== Node Identifiers ====&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; enum property of nodes is no longer the primary way of identifying node types. Instead nodes now have a &amp;lt;code&amp;gt;bl_idname&amp;lt;/code&amp;gt; property (like other registerable types such as operators, menus, etc.). Also see: [http://wiki.blender.org/index.php/User:Phonybone/Python_Nodes/API_changes Python Nodes - API Changes]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;bl_idname&amp;lt;/code&amp;gt; must be passed to the &amp;lt;code&amp;gt;nodetree.nodes.new&amp;lt;/code&amp;gt; method in particular for identifying the node type. The old &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; property still exists, but should be avoided as much as possible. Scripters are encouraged to convert their use of explicit identifiers to the new system. The full list of which enum type maps to which bl_idname can be found below (most names are pretty obvious though). A quick way of getting the correct identifier is typing &amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;node.bl_idname&amp;lt;/source&amp;gt; in the Blender console.&lt;br /&gt;
&lt;br /&gt;
=====Shader Nodes=====&lt;br /&gt;
&lt;br /&gt;
{| {{Css/prettytable|75%|talign=left}}&lt;br /&gt;
| '''type''' || '''bl_idname'''&lt;br /&gt;
|-&lt;br /&gt;
| ADD_SHADER || ShaderNodeAddShader&lt;br /&gt;
|-&lt;br /&gt;
| AMBIENT_OCCLUSION || ShaderNodeAmbientOcclusion&lt;br /&gt;
|-&lt;br /&gt;
| ATTRIBUTE || ShaderNodeAttribute&lt;br /&gt;
|-&lt;br /&gt;
| BACKGROUND || ShaderNodeBackground&lt;br /&gt;
|-&lt;br /&gt;
| BRIGHTCONTRAST || ShaderNodeBrightContrast&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_ANISOTROPIC || ShaderNodeBsdfAnisotropic&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_DIFFUSE || ShaderNodeBsdfDiffuse&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_GLASS || ShaderNodeBsdfGlass&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_GLOSSY || ShaderNodeBsdfGlossy&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_REFRACTION || ShaderNodeBsdfRefraction&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_TRANSLUCENT || ShaderNodeBsdfTranslucent&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_TRANSPARENT || ShaderNodeBsdfTransparent&lt;br /&gt;
|-&lt;br /&gt;
| BSDF_VELVET || ShaderNodeBsdfVelvet&lt;br /&gt;
|-&lt;br /&gt;
| BUMP || ShaderNodeBump&lt;br /&gt;
|-&lt;br /&gt;
| CAMERA || ShaderNodeCameraData&lt;br /&gt;
|-&lt;br /&gt;
| COMBRGB || ShaderNodeCombineRGB&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_RGB || ShaderNodeRGBCurve&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_VEC || ShaderNodeVectorCurve&lt;br /&gt;
|-&lt;br /&gt;
| EMISSION || ShaderNodeEmission&lt;br /&gt;
|-&lt;br /&gt;
| FRESNEL || ShaderNodeFresnel&lt;br /&gt;
|-&lt;br /&gt;
| GAMMA || ShaderNodeGamma&lt;br /&gt;
|-&lt;br /&gt;
| GEOMETRY || ShaderNodeGeometry&lt;br /&gt;
|-&lt;br /&gt;
| GROUP || ShaderNodeGroup&lt;br /&gt;
|-&lt;br /&gt;
| HAIR_INFO || ShaderNodeHairInfo&lt;br /&gt;
|-&lt;br /&gt;
| HOLDOUT || ShaderNodeHoldout&lt;br /&gt;
|-&lt;br /&gt;
| HUE_SAT || ShaderNodeHueSaturation&lt;br /&gt;
|-&lt;br /&gt;
| INVERT || ShaderNodeInvert&lt;br /&gt;
|-&lt;br /&gt;
| LAYER_WEIGHT || ShaderNodeLayerWeight&lt;br /&gt;
|-&lt;br /&gt;
| LIGHT_FALLOFF || ShaderNodeLightFalloff&lt;br /&gt;
|-&lt;br /&gt;
| LIGHT_PATH || ShaderNodeLightPath&lt;br /&gt;
|-&lt;br /&gt;
| MAPPING || ShaderNodeMapping&lt;br /&gt;
|-&lt;br /&gt;
| MATERIAL || ShaderNodeMaterial&lt;br /&gt;
|-&lt;br /&gt;
| MATERIAL_EXT || ShaderNodeExtendedMaterial&lt;br /&gt;
|-&lt;br /&gt;
| MATH || ShaderNodeMath&lt;br /&gt;
|-&lt;br /&gt;
| MIX_RGB || ShaderNodeMixRGB&lt;br /&gt;
|-&lt;br /&gt;
| MIX_SHADER || ShaderNodeMixShader&lt;br /&gt;
|-&lt;br /&gt;
| NEW_GEOMETRY || ShaderNodeNewGeometry&lt;br /&gt;
|-&lt;br /&gt;
| NORMAL || ShaderNodeNormal&lt;br /&gt;
|-&lt;br /&gt;
| NORMAL_MAP || ShaderNodeNormalMap&lt;br /&gt;
|-&lt;br /&gt;
| OBJECT_INFO || ShaderNodeObjectInfo&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT || ShaderNodeOutput&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_LAMP || ShaderNodeOutputLamp&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_MATERIAL || ShaderNodeOutputMaterial&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_WORLD || ShaderNodeOutputWorld&lt;br /&gt;
|-&lt;br /&gt;
| PARTICLE_INFO || ShaderNodeParticleInfo&lt;br /&gt;
|-&lt;br /&gt;
| RGB || ShaderNodeRGB&lt;br /&gt;
|-&lt;br /&gt;
| RGBTOBW || ShaderNodeRGBToBW&lt;br /&gt;
|-&lt;br /&gt;
| SCRIPT || ShaderNodeScript&lt;br /&gt;
|-&lt;br /&gt;
| SEPRGB || ShaderNodeSeparateRGB&lt;br /&gt;
|-&lt;br /&gt;
| SQUEEZE || ShaderNodeSqueeze&lt;br /&gt;
|-&lt;br /&gt;
| SUBSURFACE_SCATTERING || ShaderNodeSubsurfaceScattering&lt;br /&gt;
|-&lt;br /&gt;
| TANGENT || ShaderNodeTangent&lt;br /&gt;
|-&lt;br /&gt;
| TEXTURE || ShaderNodeTexture&lt;br /&gt;
|-&lt;br /&gt;
| TEX_BRICK || ShaderNodeTexBrick&lt;br /&gt;
|-&lt;br /&gt;
| TEX_CHECKER || ShaderNodeTexChecker&lt;br /&gt;
|-&lt;br /&gt;
| TEX_COORD || ShaderNodeTexCoord&lt;br /&gt;
|-&lt;br /&gt;
| TEX_ENVIRONMENT || ShaderNodeTexEnvironment&lt;br /&gt;
|-&lt;br /&gt;
| TEX_GRADIENT || ShaderNodeTexGradient&lt;br /&gt;
|-&lt;br /&gt;
| TEX_IMAGE || ShaderNodeTexImage&lt;br /&gt;
|-&lt;br /&gt;
| TEX_MAGIC || ShaderNodeTexMagic&lt;br /&gt;
|-&lt;br /&gt;
| TEX_MUSGRAVE || ShaderNodeTexMusgrave&lt;br /&gt;
|-&lt;br /&gt;
| TEX_NOISE || ShaderNodeTexNoise&lt;br /&gt;
|-&lt;br /&gt;
| TEX_SKY || ShaderNodeTexSky&lt;br /&gt;
|-&lt;br /&gt;
| TEX_VORONOI || ShaderNodeTexVoronoi&lt;br /&gt;
|-&lt;br /&gt;
| TEX_WAVE || ShaderNodeTexWave&lt;br /&gt;
|-&lt;br /&gt;
| VALTORGB || ShaderNodeValToRGB&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || ShaderNodeValue&lt;br /&gt;
|-&lt;br /&gt;
| VECT_MATH || ShaderNodeVectorMath&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Compositor Nodes=====&lt;br /&gt;
&lt;br /&gt;
{| {{Css/prettytable|75%|talign=left}}&lt;br /&gt;
| '''type''' || '''bl_idname'''&lt;br /&gt;
|-&lt;br /&gt;
| ALPHAOVER || CompositorNodeAlphaOver&lt;br /&gt;
|-&lt;br /&gt;
| BILATERALBLUR || CompositorNodeBilateralblur&lt;br /&gt;
|-&lt;br /&gt;
| BLUR || CompositorNodeBlur&lt;br /&gt;
|-&lt;br /&gt;
| BOKEHBLUR || CompositorNodeBokehBlur&lt;br /&gt;
|-&lt;br /&gt;
| BOKEHIMAGE || CompositorNodeBokehImage&lt;br /&gt;
|-&lt;br /&gt;
| BOXMASK || CompositorNodeBoxMask&lt;br /&gt;
|-&lt;br /&gt;
| BRIGHTCONTRAST || CompositorNodeBrightContrast&lt;br /&gt;
|-&lt;br /&gt;
| CHANNEL_MATTE || CompositorNodeChannelMatte&lt;br /&gt;
|-&lt;br /&gt;
| CHROMA_MATTE || CompositorNodeChromaMatte&lt;br /&gt;
|-&lt;br /&gt;
| COLORBALANCE || CompositorNodeColorBalance&lt;br /&gt;
|-&lt;br /&gt;
| COLORCORRECTION || CompositorNodeColorCorrection&lt;br /&gt;
|-&lt;br /&gt;
| COLOR_MATTE || CompositorNodeColorMatte&lt;br /&gt;
|-&lt;br /&gt;
| COLOR_SPILL || CompositorNodeColorSpill&lt;br /&gt;
|-&lt;br /&gt;
| COMBHSVA || CompositorNodeCombHSVA&lt;br /&gt;
|-&lt;br /&gt;
| COMBRGBA || CompositorNodeCombRGBA&lt;br /&gt;
|-&lt;br /&gt;
| COMBYCCA || CompositorNodeCombYCCA&lt;br /&gt;
|-&lt;br /&gt;
| COMBYUVA || CompositorNodeCombYUVA&lt;br /&gt;
|-&lt;br /&gt;
| COMPOSITE || CompositorNodeComposite&lt;br /&gt;
|-&lt;br /&gt;
| CROP || CompositorNodeCrop&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_RGB || CompositorNodeCurveRGB&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_VEC || CompositorNodeCurveVec&lt;br /&gt;
|-&lt;br /&gt;
| DBLUR || CompositorNodeDBlur&lt;br /&gt;
|-&lt;br /&gt;
| DEFOCUS || CompositorNodeDefocus&lt;br /&gt;
|-&lt;br /&gt;
| DESPECKLE || CompositorNodeDespeckle&lt;br /&gt;
|-&lt;br /&gt;
| DIFF_MATTE || CompositorNodeDiffMatte&lt;br /&gt;
|-&lt;br /&gt;
| DILATEERODE || CompositorNodeDilateErode&lt;br /&gt;
|-&lt;br /&gt;
| DISPLACE || CompositorNodeDisplace&lt;br /&gt;
|-&lt;br /&gt;
| DISTANCE_MATTE || CompositorNodeDistanceMatte&lt;br /&gt;
|-&lt;br /&gt;
| DOUBLEEDGEMASK || CompositorNodeDoubleEdgeMask&lt;br /&gt;
|-&lt;br /&gt;
| ELLIPSEMASK || CompositorNodeEllipseMask&lt;br /&gt;
|-&lt;br /&gt;
| FILTER || CompositorNodeFilter&lt;br /&gt;
|-&lt;br /&gt;
| FLIP || CompositorNodeFlip&lt;br /&gt;
|-&lt;br /&gt;
| GAMMA || CompositorNodeGamma&lt;br /&gt;
|-&lt;br /&gt;
| GLARE || CompositorNodeGlare&lt;br /&gt;
|-&lt;br /&gt;
| GROUP || CompositorNodeGroup&lt;br /&gt;
|-&lt;br /&gt;
| HUECORRECT || CompositorNodeHueCorrect&lt;br /&gt;
|-&lt;br /&gt;
| HUE_SAT || CompositorNodeHueSat&lt;br /&gt;
|-&lt;br /&gt;
| ID_MASK || CompositorNodeIDMask&lt;br /&gt;
|-&lt;br /&gt;
| IMAGE || CompositorNodeImage&lt;br /&gt;
|-&lt;br /&gt;
| INPAINT || CompositorNodeInpaint&lt;br /&gt;
|-&lt;br /&gt;
| INVERT || CompositorNodeInvert&lt;br /&gt;
|-&lt;br /&gt;
| KEYING || CompositorNodeKeying&lt;br /&gt;
|-&lt;br /&gt;
| KEYINGSCREEN || CompositorNodeKeyingScreen&lt;br /&gt;
|-&lt;br /&gt;
| LENSDIST || CompositorNodeLensdist&lt;br /&gt;
|-&lt;br /&gt;
| LEVELS || CompositorNodeLevels&lt;br /&gt;
|-&lt;br /&gt;
| LUMA_MATTE || CompositorNodeLumaMatte&lt;br /&gt;
|-&lt;br /&gt;
| MAP_RANGE || CompositorNodeMapRange&lt;br /&gt;
|-&lt;br /&gt;
| MAP_UV || CompositorNodeMapUV&lt;br /&gt;
|-&lt;br /&gt;
| MAP_VALUE || CompositorNodeMapValue&lt;br /&gt;
|-&lt;br /&gt;
| MASK || CompositorNodeMask&lt;br /&gt;
|-&lt;br /&gt;
| MATH || CompositorNodeMath&lt;br /&gt;
|-&lt;br /&gt;
| MIX_RGB || CompositorNodeMixRGB&lt;br /&gt;
|-&lt;br /&gt;
| MOVIECLIP || CompositorNodeMovieClip&lt;br /&gt;
|-&lt;br /&gt;
| MOVIEDISTORTION || CompositorNodeMovieDistortion&lt;br /&gt;
|-&lt;br /&gt;
| NORMAL || CompositorNodeNormal&lt;br /&gt;
|-&lt;br /&gt;
| NORMALIZE || CompositorNodeNormalize&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT_FILE || CompositorNodeOutputFile&lt;br /&gt;
|-&lt;br /&gt;
| PIXELATE || CompositorNodePixelate&lt;br /&gt;
|-&lt;br /&gt;
| PREMULKEY || CompositorNodePremulKey&lt;br /&gt;
|-&lt;br /&gt;
| RGB || CompositorNodeRGB&lt;br /&gt;
|-&lt;br /&gt;
| RGBTOBW || CompositorNodeRGBToBW&lt;br /&gt;
|-&lt;br /&gt;
| ROTATE || CompositorNodeRotate&lt;br /&gt;
|-&lt;br /&gt;
| SCALE || CompositorNodeScale&lt;br /&gt;
|-&lt;br /&gt;
| SEPHSVA || CompositorNodeSepHSVA&lt;br /&gt;
|-&lt;br /&gt;
| SEPRGBA || CompositorNodeSepRGBA&lt;br /&gt;
|-&lt;br /&gt;
| SEPYCCA || CompositorNodeSepYCCA&lt;br /&gt;
|-&lt;br /&gt;
| SEPYUVA || CompositorNodeSepYUVA&lt;br /&gt;
|-&lt;br /&gt;
| SETALPHA || CompositorNodeSetAlpha&lt;br /&gt;
|-&lt;br /&gt;
| SPLITVIEWER || CompositorNodeSplitViewer&lt;br /&gt;
|-&lt;br /&gt;
| STABILIZE2D || CompositorNodeStabilize&lt;br /&gt;
|-&lt;br /&gt;
| SWITCH || CompositorNodeSwitch&lt;br /&gt;
|-&lt;br /&gt;
| TEXTURE || CompositorNodeTexture&lt;br /&gt;
|-&lt;br /&gt;
| TIME || CompositorNodeTime&lt;br /&gt;
|-&lt;br /&gt;
| TONEMAP || CompositorNodeTonemap&lt;br /&gt;
|-&lt;br /&gt;
| TRACKPOS || CompositorNodeTrackPos&lt;br /&gt;
|-&lt;br /&gt;
| TRANSFORM || CompositorNodeTransform&lt;br /&gt;
|-&lt;br /&gt;
| TRANSLATE || CompositorNodeTranslate&lt;br /&gt;
|-&lt;br /&gt;
| VALTORGB || CompositorNodeValToRGB&lt;br /&gt;
|-&lt;br /&gt;
| VALUE || CompositorNodeValue&lt;br /&gt;
|-&lt;br /&gt;
| VECBLUR || CompositorNodeVecBlur&lt;br /&gt;
|-&lt;br /&gt;
| VIEWER || CompositorNodeViewer&lt;br /&gt;
|-&lt;br /&gt;
| ZCOMBINE || CompositorNodeZcombine&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Texture Nodes=====&lt;br /&gt;
&lt;br /&gt;
{| {{Css/prettytable|75%|talign=left}}&lt;br /&gt;
| '''type''' || '''bl_idname'''&lt;br /&gt;
|-&lt;br /&gt;
| AT || TextureNodeAt&lt;br /&gt;
|-&lt;br /&gt;
| BRICKS || TextureNodeBricks&lt;br /&gt;
|-&lt;br /&gt;
| CHECKER || TextureNodeChecker&lt;br /&gt;
|-&lt;br /&gt;
| COMPOSE || TextureNodeCompose&lt;br /&gt;
|-&lt;br /&gt;
| COORD || TextureNodeCoordinates&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_RGB || TextureNodeCurveRGB&lt;br /&gt;
|-&lt;br /&gt;
| CURVE_TIME || TextureNodeCurveTime&lt;br /&gt;
|-&lt;br /&gt;
| DECOMPOSE || TextureNodeDecompose&lt;br /&gt;
|-&lt;br /&gt;
| DISTANCE || TextureNodeDistance&lt;br /&gt;
|-&lt;br /&gt;
| GROUP || TextureNodeGroup&lt;br /&gt;
|-&lt;br /&gt;
| HUE_SAT || TextureNodeHueSaturation&lt;br /&gt;
|-&lt;br /&gt;
| IMAGE || TextureNodeImage&lt;br /&gt;
|-&lt;br /&gt;
| INVERT || TextureNodeInvert&lt;br /&gt;
|-&lt;br /&gt;
| MATH || TextureNodeMath&lt;br /&gt;
|-&lt;br /&gt;
| MIX_RGB || TextureNodeMixRGB&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT || TextureNodeOutput&lt;br /&gt;
|-&lt;br /&gt;
| RGBTOBW || TextureNodeRGBToBW&lt;br /&gt;
|-&lt;br /&gt;
| ROTATE || TextureNodeRotate&lt;br /&gt;
|-&lt;br /&gt;
| SCALE || TextureNodeScale&lt;br /&gt;
|-&lt;br /&gt;
| TEXTURE || TextureNodeTexture&lt;br /&gt;
|-&lt;br /&gt;
| TEX_BLEND || TextureNodeTexBlend&lt;br /&gt;
|-&lt;br /&gt;
| TEX_CLOUDS || TextureNodeTexClouds&lt;br /&gt;
|-&lt;br /&gt;
| TEX_DISTNOISE || TextureNodeTexDistNoise&lt;br /&gt;
|-&lt;br /&gt;
| TEX_MAGIC || TextureNodeTexMagic&lt;br /&gt;
|-&lt;br /&gt;
| TEX_MARBLE || TextureNodeTexMarble&lt;br /&gt;
|-&lt;br /&gt;
| TEX_MUSGRAVE || TextureNodeTexMusgrave&lt;br /&gt;
|-&lt;br /&gt;
| TEX_NOISE || TextureNodeTexNoise&lt;br /&gt;
|-&lt;br /&gt;
| TEX_STUCCI || TextureNodeTexStucci&lt;br /&gt;
|-&lt;br /&gt;
| TEX_VORONOI || TextureNodeTexVoronoi&lt;br /&gt;
|-&lt;br /&gt;
| TEX_WOOD || TextureNodeTexWood&lt;br /&gt;
|-&lt;br /&gt;
| TRANSLATE || TextureNodeTranslate&lt;br /&gt;
|-&lt;br /&gt;
| VALTONOR || TextureNodeValToNor&lt;br /&gt;
|-&lt;br /&gt;
| VALTORGB || TextureNodeValToRGB&lt;br /&gt;
|-&lt;br /&gt;
| VIEWER || TextureNodeViewer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The tables above were generated with a python script. This may need to be rerun in case nodes are added and missing in these lists:&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
import bpy&lt;br /&gt;
&lt;br /&gt;
trees = [&lt;br /&gt;
    ('ShaderNodeTree', 'ShaderNode', 'Shader Nodes'),&lt;br /&gt;
    ('CompositorNodeTree', 'CompositorNode', 'Compositor Nodes'),&lt;br /&gt;
    ('TextureNodeTree', 'TextureNode', 'Texture Nodes'),&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
for tree_idname, node_idname, type_category in trees:&lt;br /&gt;
    treetype = getattr(bpy.types, tree_idname)&lt;br /&gt;
    nodetype = getattr(bpy.types, node_idname)&lt;br /&gt;
#    print(treetype, nodetype)&lt;br /&gt;
    if not treetype or not nodetype:&lt;br /&gt;
        continue&lt;br /&gt;
    tree = bpy.data.node_groups.new(&amp;quot;test&amp;quot;, tree_idname)&lt;br /&gt;
&lt;br /&gt;
    node_map = {}&lt;br /&gt;
&lt;br /&gt;
    for c in nodetype.__subclasses__():&lt;br /&gt;
#        print(c)&lt;br /&gt;
        if hasattr(c, &amp;quot;bl_rna&amp;quot;):&lt;br /&gt;
            try:&lt;br /&gt;
                node = tree.nodes.new(c.bl_rna.identifier)&lt;br /&gt;
                node_map[node.type] = node.bl_idname&lt;br /&gt;
#                print(&amp;quot;%s -&amp;gt; %s&amp;quot; % (node.type, c.bl_rna.identifier))&lt;br /&gt;
                shader_tree.nodes.remove(node)&lt;br /&gt;
            except:&lt;br /&gt;
                pass&lt;br /&gt;
&lt;br /&gt;
    sorted_node_map = sorted(node_map.items(), key=lambda item: item[0])&lt;br /&gt;
    table = &amp;quot;{| {{Css/prettytable|75%%|talign=left}}\n| '''type''' || '''bl_idname'''\n|-\n%s|}&amp;quot; \&lt;br /&gt;
            % &amp;quot;|-\n&amp;quot;.join(&amp;quot;| %s || %s\n&amp;quot; % (key, value) for key, value in sorted_node_map)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\n\n=====%s=====\n&amp;quot; % type_category)&lt;br /&gt;
    print(table)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2.70 ==&lt;br /&gt;
==== Node Socket {{Format/Literal|in_out}} ({{Commit|60660}}) ====&lt;br /&gt;
This was an enum property with 2 modes 'IN' and 'OUT'. Now there is a boolean property {{Format/Literal|is_output}} instead that can be used in the same way:&lt;br /&gt;
&lt;br /&gt;
'''old:'''&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
socket.in_out == 'IN'  # is it an input socket?&lt;br /&gt;
socket.in_out == 'OUT' # is it an output socket?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''new:'''&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
not socket.is_output   # is it an input socket?&lt;br /&gt;
socket.is_output       # is it an output socket?&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Python Node Output Drawing ({{Commit|60661}}) ====&lt;br /&gt;
Node output sockets now use the same button drawing function as input sockets, instead of always displaying just the label.&lt;br /&gt;
This means pynodes scripters have to make a small adjustment in order to draw sockets in the established way, i.e. only showing labels for outputs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
     def draw(self, context, layout, node, text):&lt;br /&gt;
-        if self.is_linked:&lt;br /&gt;
+        if self.is_output or self.is_linked:&lt;br /&gt;
             layout.label(text)&lt;br /&gt;
         else:&lt;br /&gt;
             # draw full property buttons here&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Phonybone</name></author>
		
	</entry>
</feed>