﻿<?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=%E5%88%A9%E7%94%A8%E8%80%85%3ASobotka%2FMinimal_Node_Code</id>
	<title>利用者:Sobotka/Minimal Node Code - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASobotka%2FMinimal_Node_Code"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sobotka/Minimal_Node_Code&amp;action=history"/>
	<updated>2026-04-29T02:14:42Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sobotka/Minimal_Node_Code&amp;diff=133341&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sobotka/Minimal_Node_Code&amp;diff=133341&amp;oldid=prev"/>
		<updated>2018-06-28T20:45:01Z</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:45時点における版&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=%E5%88%A9%E7%94%A8%E8%80%85:Sobotka/Minimal_Node_Code&amp;diff=133340&amp;oldid=prev</id>
		<title>2017年9月2日 (土) 20:04にwiki&gt;LazyDodoによる</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sobotka/Minimal_Node_Code&amp;diff=133340&amp;oldid=prev"/>
		<updated>2017-09-02T20:04:04Z</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;= New Compositor HelloWorld Example =&lt;br /&gt;
Sit back, buckle up, and get ready to edit a hundred files before you see your new HelloWorld node!&lt;br /&gt;
&lt;br /&gt;
'''TODO: Must touch COM_Converter.cpp in order to register the node too. *sigh*.'''&lt;br /&gt;
&lt;br /&gt;
== Register the Unique Node ID Value in source/blender/blenkernel/BKE_node.h ==&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
 #define CMP_NODE_COLOR_MATTE 259&lt;br /&gt;
 #define CMP_NODE_COLORBALANCE 260&lt;br /&gt;
 #define CMP_NODE_HUECORRECT 261&lt;br /&gt;
 #define CMP_NODE_HELLOWORLD 262 /* Add a Unique ID for our new node. */&lt;br /&gt;
 &lt;br /&gt;
 #define CMP_NODE_GLARE		301&lt;br /&gt;
 #define CMP_NODE_TONEMAP	302&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Register the new node in source/blender/blenkernel/intern/node.c ==&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
	register_node_type_cmp_bokehblur(ttype);&lt;br /&gt;
	register_node_type_cmp_switch(ttype);&lt;br /&gt;
&lt;br /&gt;
	register_node_type_cmp_mask(ttype);&lt;br /&gt;
	register_node_type_cmp_trackpos(ttype);&lt;br /&gt;
        register_node_type_cmp_helloworld(ttype);&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add the DNA that describes the data in source/blender/makesdna/DNA_node_types.h ==&lt;br /&gt;
{{note|'''WARNING'''|All DNA must be padded. This means that your data must be padded to an alignment that matches the data length. For more information, see [http://wiki.blender.org/index.php/Dev:2.5/Source/Architecture/DefineProperty#DNA the DNA section on the wiki]. If you fail to do so, you will get an odd looking and nondescript error from makesdna.c.}}&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
 	float uspillr, uspillg, uspillb;&lt;br /&gt;
 }NodeColorspill;&lt;br /&gt;
 &lt;br /&gt;
typedef struct NodeHelloWorld {&lt;br /&gt;
	double helloDouble; /* Our Hello World data. */&lt;br /&gt;
} NodeHelloWorld;&lt;br /&gt;
&lt;br /&gt;
 /* TEX_output */&lt;br /&gt;
 typedef struct TexNodeOutput {&lt;br /&gt;
 	char name[32];&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Register the Python RNA in source/blender/makesrna/intern/rna_nodetree.c ==&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 	RNA_def_property_update(prop, NC_NODE|NA_EDITED, &amp;quot;rna_Node_update&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
static void def_cmp_helloworld(StructRNA *srna)&lt;br /&gt;
{&lt;br /&gt;
/* Register elements we want exposed to Python access. */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 static void def_cmp_zcombine(StructRNA *srna)&lt;br /&gt;
 {&lt;br /&gt;
 	PropertyRNA *prop;&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Register the node in Python RNA in /source/blender/nodes/NOD_static_types.h ==&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
DefNode( CompositorNode, CMP_NODE_KEYING,         def_cmp_keying,         &amp;quot;KEYING&amp;quot;,         Keying,           &amp;quot;Keying&amp;quot;,            &amp;quot;&amp;quot;              )&lt;br /&gt;
DefNode( CompositorNode, CMP_NODE_TRACKPOS,       def_cmp_trackpos,       &amp;quot;TRACKPOS&amp;quot;,       TrackPos,         &amp;quot;Track Position&amp;quot;,    &amp;quot;&amp;quot;              )&lt;br /&gt;
DefNode( CompositorNode, CMP_NODE_HELLOWORLD,     def_cmp_helloworld,     &amp;quot;HELLOWORLD&amp;quot;,     HelloWorld,       &amp;quot;Hello World&amp;quot;,       &amp;quot;&amp;quot;              )&lt;br /&gt;
                                                                                                                                                   &lt;br /&gt;
DefNode( TextureNode,    TEX_NODE_OUTPUT,         def_tex_output,         &amp;quot;OUTPUT&amp;quot;,         Output,           &amp;quot;Output&amp;quot;,            &amp;quot;&amp;quot;              )&lt;br /&gt;
DefNode( TextureNode,    TEX_NODE_CHECKER,        0,                      &amp;quot;CHECKER&amp;quot;,        Checker,          &amp;quot;Checker&amp;quot;,           &amp;quot;&amp;quot;              )&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Register the node in source/blender/nodes/NOD_composite.h ==&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
void register_node_type_cmp_bokehblur(struct bNodeTreeType *ttype);&lt;br /&gt;
void register_node_type_cmp_switch(struct bNodeTreeType *ttype);&lt;br /&gt;
&lt;br /&gt;
void register_node_type_cmp_trackpos(struct bNodeTreeType *ttype);&lt;br /&gt;
void register_node_type_cmp_helloworld(struct bNodeTreeType *ttype);&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create a new file that defines node inputs and output in source/blender/nodes/composite/nodes/node_composite_helloworld.c ==&lt;br /&gt;
It should be noted that NODE_CLASS_CONVERTER determines where the node will appear in the Add menu.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;node_composite_util.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* **************** Hello World Tool ******************** */&lt;br /&gt;
&lt;br /&gt;
static bNodeSocketTemplate cmp_node_helloworld_in[]= {&lt;br /&gt;
	{	SOCK_RGBA, 1, N_(&amp;quot;Image&amp;quot;),			1.0f, 1.0f, 1.0f, 1.0f},&lt;br /&gt;
	{	SOCK_FLOAT, 1, N_(&amp;quot;Variable&amp;quot;),	1.0f, 0.0f, 0.0f, 0.0f, 0.001f, 10.0f, PROP_UNSIGNED},&lt;br /&gt;
	{	-1, 0, &amp;quot;&amp;quot;	}&lt;br /&gt;
};&lt;br /&gt;
static bNodeSocketTemplate cmp_node_helloworld_out[]= {&lt;br /&gt;
	{	SOCK_RGBA, 0, N_(&amp;quot;Image&amp;quot;)},&lt;br /&gt;
	{	-1, 0, &amp;quot;&amp;quot;	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void register_node_type_cmp_helloworld(void)&lt;br /&gt;
{&lt;br /&gt;
	static bNodeType ntype;&lt;br /&gt;
&lt;br /&gt;
	node_type_base(&amp;amp;ntype, CMP_NODE_HELLOWORLD, &amp;quot;Hello World&amp;quot;, NODE_CLASS_CONVERTOR, NODE_OPTIONS);&lt;br /&gt;
	node_type_socket_templates(&amp;amp;ntype, cmp_node_helloworld_in, cmp_node_helloworld_out);&lt;br /&gt;
	node_type_size(&amp;amp;ntype, 140, 100, 320);&lt;br /&gt;
&lt;br /&gt;
	nodeRegisterType(&amp;amp;ntype);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make sure it is compiled by adding it to source/blender/nodes/CMakeLists.txt ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]	&lt;br /&gt;
        composite/nodes/node_composite_bokehimage.c&lt;br /&gt;
	composite/nodes/node_composite_boxmask.c&lt;br /&gt;
	composite/nodes/node_composite_ellipsemask.c&lt;br /&gt;
	composite/nodes/node_composite_switch.c&lt;br /&gt;
	composite/nodes/node_composite_colorcorrection.c&lt;br /&gt;
        composite/nodes/node_composite_helloworld.c&lt;br /&gt;
	&lt;br /&gt;
	composite/node_composite_tree.c&lt;br /&gt;
	composite/node_composite_util.c&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create the header file for the node in source/blender/compositor/nodes/COM_HelloWorldNode.h ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _COM_HelloWorldNode_h_&lt;br /&gt;
#define _COM_HelloWorldNode_h_&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;COM_Node.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @brief HelloWorldNode&lt;br /&gt;
 * @ingroup Node&lt;br /&gt;
 */&lt;br /&gt;
class HelloWorldNode : public Node {&lt;br /&gt;
public:&lt;br /&gt;
	HelloWorldNode(bNode *editorNode);&lt;br /&gt;
	void convertToOperations(ExecutionSystem *graph, CompositorContext *context);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create the main node file in source/blender/compositor/nodes/COM_HelloWorldNode.cpp ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;COM_HelloWorldNode.h&amp;quot;&lt;br /&gt;
#include &amp;quot;COM_HelloWorldOperation.h&amp;quot;&lt;br /&gt;
#include &amp;quot;COM_ExecutionSystem.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelloWorldNode::HelloWorldNode(bNode *editorNode) : Node(editorNode)&lt;br /&gt;
{&lt;br /&gt;
	/* pass */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HelloWorldNode::convertToOperations(ExecutionSystem *graph, CompositorContext *context)&lt;br /&gt;
{&lt;br /&gt;
	HelloWorldOperation *operation = new HelloWorldOperation();&lt;br /&gt;
	&lt;br /&gt;
	this-&amp;gt;getInputSocket(0)-&amp;gt;relinkConnections(operation-&amp;gt;getInputSocket(0), 0, graph);&lt;br /&gt;
	this-&amp;gt;getInputSocket(1)-&amp;gt;relinkConnections(operation-&amp;gt;getInputSocket(1), 1, graph);&lt;br /&gt;
	this-&amp;gt;getOutputSocket(0)-&amp;gt;relinkConnections(operation-&amp;gt;getOutputSocket(0));&lt;br /&gt;
	graph-&amp;gt;addOperation(operation);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Write the header file for the operation in source/blender/compositor/operations/COM_HelloWorldOperation.h ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef _COM_HelloWorldOperation_h&lt;br /&gt;
#define _COM_HelloWorldOperation_h&lt;br /&gt;
#include &amp;quot;COM_NodeOperation.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class HelloWorldOperation : public NodeOperation {&lt;br /&gt;
private:&lt;br /&gt;
	/**&lt;br /&gt;
	 * Cached reference to the inputProgram&lt;br /&gt;
	 */&lt;br /&gt;
	SocketReader *m_inputProgram;&lt;br /&gt;
	SocketReader *m_inputHelloWorldProgram;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	HelloWorldOperation();&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * the inner loop of this program&lt;br /&gt;
	 */&lt;br /&gt;
	void executePixel(float output[4], float x, float y, PixelSampler sampler);&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Initialize the execution&lt;br /&gt;
	 */&lt;br /&gt;
	void initExecution();&lt;br /&gt;
	&lt;br /&gt;
	/**&lt;br /&gt;
	 * Deinitialize the execution&lt;br /&gt;
	 */&lt;br /&gt;
	void deinitExecution();&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create the code that does the work in source/blender/compositor/operations/COM_HelloWorldOperation.cpp ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;quot;COM_HelloWorldOperation.h&amp;quot;&lt;br /&gt;
#include &amp;quot;BLI_math.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelloWorldOperation::HelloWorldOperation() : NodeOperation()&lt;br /&gt;
{&lt;br /&gt;
	this-&amp;gt;addInputSocket(COM_DT_COLOR);&lt;br /&gt;
	this-&amp;gt;addInputSocket(COM_DT_VALUE);&lt;br /&gt;
	this-&amp;gt;addOutputSocket(COM_DT_COLOR);&lt;br /&gt;
	this-&amp;gt;m_inputProgram = NULL;&lt;br /&gt;
	this-&amp;gt;m_inputHelloWorldProgram = NULL;&lt;br /&gt;
}&lt;br /&gt;
void HelloWorldOperation::initExecution()&lt;br /&gt;
{&lt;br /&gt;
	this-&amp;gt;m_inputProgram = this-&amp;gt;getInputSocketReader(0);&lt;br /&gt;
	this-&amp;gt;m_inputHelloWorldProgram = this-&amp;gt;getInputSocketReader(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HelloWorldOperation::executePixel(float output[4], float x, float y, PixelSampler sampler)&lt;br /&gt;
{&lt;br /&gt;
	float inputValue[4];&lt;br /&gt;
	float inputHelloWorld[4];&lt;br /&gt;
	&lt;br /&gt;
	this-&amp;gt;m_inputProgram-&amp;gt;read(inputValue, x, y, sampler);&lt;br /&gt;
	this-&amp;gt;m_inputHelloWorldProgram-&amp;gt;read(inputHelloWorld, x, y, sampler);&lt;br /&gt;
	const float helloworld = inputHelloWorld[0];&lt;br /&gt;
	/* check for negative to avoid nan's */&lt;br /&gt;
	output[0] = inputValue[0] &amp;gt; 0.0f ? powf(inputValue[0], helloworld) : inputValue[0];&lt;br /&gt;
	output[1] = inputValue[1] &amp;gt; 0.0f ? powf(inputValue[1], helloworld) : inputValue[1];&lt;br /&gt;
	output[2] = inputValue[2] &amp;gt; 0.0f ? powf(inputValue[2], helloworld) : inputValue[2];&lt;br /&gt;
	&lt;br /&gt;
	output[3] = inputValue[3];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HelloWorldOperation::deinitExecution()&lt;br /&gt;
{&lt;br /&gt;
	this-&amp;gt;m_inputProgram = NULL;&lt;br /&gt;
	this-&amp;gt;m_inputHelloWorldProgram = NULL;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add the node to the converter code listing in source/blender/compositor/intern/COM_Converter.cpp ==&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
#include &amp;quot;COM_ViewerNode.h&amp;quot;&lt;br /&gt;
#include &amp;quot;COM_ZCombineNode.h&amp;quot;&lt;br /&gt;
#include &amp;quot;COM_HelloWorldNode.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Node *Converter::convert(bNode *b_node, bool fast)&lt;br /&gt;
{&lt;br /&gt;
	Node *node;&lt;br /&gt;
[...]&lt;br /&gt;
    case CMP_NODE_TRACKPOS:&lt;br /&gt;
        node = new TrackPositionNode(b_node);&lt;br /&gt;
        break;&lt;br /&gt;
    case CMP_NODE_HELLOWORLD:&lt;br /&gt;
        node = new HelloWorldNode(b_node);&lt;br /&gt;
        break;&lt;br /&gt;
    /* not inplemented yet */&lt;br /&gt;
    default:&lt;br /&gt;
        node = new MuteNode(b_node);&lt;br /&gt;
	break;&lt;br /&gt;
    }&lt;br /&gt;
    return node;&lt;br /&gt;
}&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Make sure it will get compiled via cmake in source/blender/compositor/CMakeLists.txt ==&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;cmake&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
    operations/COM_SetAlphaOperation.cpp&lt;br /&gt;
    operations/COM_SetAlphaOperation.h&lt;br /&gt;
    operations/COM_MapValueOperation.cpp&lt;br /&gt;
    operations/COM_MapValueOperation.h&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    # HelloWorld Nodes&lt;br /&gt;
    nodes/COM_HelloWorldNode.cpp&lt;br /&gt;
    nodes/COM_HelloWorldNode.h&lt;br /&gt;
    operations/COM_HelloWorldOperation.h&lt;br /&gt;
    operations/COM_HelloWorldOperation.cpp&lt;br /&gt;
&lt;br /&gt;
    # Distort operation&lt;br /&gt;
    operations/COM_TranslateOperation.h&lt;br /&gt;
    operations/COM_TranslateOperation.cpp&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== And finally add it to release/scripts/startup/nodeitems_builtins.py so it will show up in the UI ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;SOURCE LANG=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
[...]&lt;br /&gt;
    CompositorNodeCategory(&amp;quot;CMP_CONVERTOR&amp;quot;, &amp;quot;Converter&amp;quot;, items=[&lt;br /&gt;
        NodeItem(&amp;quot;CompositorNodeMath&amp;quot;),&lt;br /&gt;
        NodeItem(&amp;quot;CompositorNodeHelloWorld&amp;quot;),&lt;br /&gt;
[...]&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== OPTIONAL: Write the code that would handle drawing in the node to source/blender/editors/space_node/drawnode.c, set the function and pointer, and set the flag in composite/nodes/nodename.c ==&lt;br /&gt;
This may need to be updated and expanded. There be dragons...&lt;br /&gt;
&amp;lt;SOURCE LANG=cpp&amp;gt;&lt;br /&gt;
void register_node_type_cmp_composite(ListBase *lb)&lt;br /&gt;
{&lt;br /&gt;
	[...]&lt;br /&gt;
&lt;br /&gt;
	node_type_base(&amp;amp;ntype, CMP_NODE_COMPOSITE, &amp;quot;Composite&amp;quot;, NODE_CLASS_OUTPUT, NODE_PREVIEW);&lt;br /&gt;
        // OR NODE_PREVIEW with NODE_OPTIONS!&lt;br /&gt;
&lt;br /&gt;
        [...]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/SOURCE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== New (as of 2.5) bare minimum ===&lt;br /&gt;
[[User:Coenspoor/Minimal_node_tutorial(2.5)]]&lt;/div&gt;</summary>
		<author><name>wiki&gt;LazyDodo</name></author>
		
	</entry>
</feed>