{
	"connections": [
		{
			"from": "gen_inputs",
			"from_port": 0,
			"to": "buffer",
			"to_port": 0
		},
		{
			"from": "buffer",
			"from_port": 0,
			"to": "switch",
			"to_port": 1
		},
		{
			"from": "gen_inputs",
			"from_port": 0,
			"to": "switch",
			"to_port": 0
		},
		{
			"from": "edge_detect_1",
			"from_port": 0,
			"to": "gen_outputs",
			"to_port": 0
		},
		{
			"from": "switch",
			"from_port": 0,
			"to": "edge_detect_1",
			"to_port": 0
		}
	],
	"label": "Normal Map",
	"longdesc": "Generates a normal map from a height map",
	"name": "normal_map",
	"node_position": {
		"x": 0,
		"y": 0
	},
	"nodes": [
		{
			"name": "buffer",
			"node_position": {
				"x": -695.663818,
				"y": 34.60614
			},
			"parameters": {
				"lod": 0,
				"size": 10
			},
			"seed": -32011,
			"type": "buffer"
		},
		{
			"name": "gen_parameters",
			"node_position": {
				"x": -731.910156,
				"y": -131.916687
			},
			"parameters": {
				"param0": 10,
				"param1": 1,
				"param2": 0,
				"param4": 1
			},
			"seed": 56582,
			"type": "remote",
			"widgets": [
				{
					"label": "",
					"linked_widgets": [
						{
							"node": "edge_detect_1",
							"widget": "format"
						}
					],
					"longdesc": "The format of the generated normal map\nIn most cases this should be set to default",
					"name": "param2",
					"shortdesc": "Format",
					"type": "linked_control"
				},
				{
					"label": "",
					"linked_widgets": [
						{
							"node": "buffer",
							"widget": "size"
						},
						{
							"node": "edge_detect_1",
							"widget": "size"
						}
					],
					"longdesc": "The resolution of the generated normal map",
					"name": "param0",
					"shortdesc": "Resolution",
					"type": "linked_control"
				},
				{
					"label": "",
					"linked_widgets": [
						{
							"node": "edge_detect_1",
							"widget": "amount"
						}
					],
					"longdesc": "The strength of the normal map filter",
					"name": "param1",
					"shortdesc": "Strength",
					"type": "linked_control"
				},
				{
					"configurations": {
						"False": [
							{
								"node": "switch",
								"value": 0,
								"widget": "source"
							}
						],
						"True": [
							{
								"node": "switch",
								"value": 1,
								"widget": "source"
							}
						]
					},
					"label": "Buffer",
					"linked_widgets": [
						{
							"node": "switch",
							"widget": "source"
						}
					],
					"longdesc": "When set, a buffer is used to sample the input before the normal map filter",
					"name": "param4",
					"shortdesc": "Buffer",
					"type": "config_control"
				}
			]
		},
		{
			"name": "gen_outputs",
			"node_position": {
				"x": -445.663818,
				"y": 75.047363
			},
			"parameters": {

			},
			"ports": [
				{
					"group_size": 0,
					"longdesc": "Shows the generated normal map",
					"name": "Normal",
					"shortdesc": "Output",
					"type": "rgb"
				}
			],
			"seed": -6314,
			"type": "ios"
		},
		{
			"name": "gen_inputs",
			"node_position": {
				"x": -1094.910156,
				"y": 74.047363
			},
			"parameters": {

			},
			"ports": [
				{
					"group_size": 0,
					"longdesc": "The input height map",
					"name": "Bump",
					"shortdesc": "Input",
					"type": "f"
				}
			],
			"seed": 12483,
			"seed_locked": true,
			"type": "ios"
		},
		{
			"name": "switch",
			"node_position": {
				"x": -673.5,
				"y": 113.297363
			},
			"parameters": {
				"choices": 2,
				"outputs": 1,
				"source": 1
			},
			"seed": -53264,
			"type": "switch"
		},
		{
			"name": "edge_detect_1",
			"node_position": {
				"x": -676.092529,
				"y": 193.868774
			},
			"parameters": {
				"amount": 1,
				"format": 0,
				"size": 10
			},
			"seed": -11547,
			"shader_model": {
				"code": "",
				"global": [
					"vec3 process_normal_default(vec3 v, float multiplier) {",
					"\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, -1.0))+vec3(0.5);",
					"}",
					"",
					"vec3 process_normal_opengl(vec3 v, float multiplier) {",
					"\treturn 0.5*normalize(v.xyz*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);",
					"}",
					"",
					"vec3 process_normal_directx(vec3 v, float multiplier) {",
					"\treturn 0.5*normalize(v.xyz*vec3(1.0, -1.0, 1.0)*multiplier+vec3(0.0, 0.0, 1.0))+vec3(0.5);",
					"}",
					""
				],
				"inputs": [
					{
						"default": "0.0",
						"function": true,
						"label": "",
						"name": "in",
						"type": "f"
					}
				],
				"instance": [
					"vec3 $(name)_fct(vec2 uv) {",
					"\tvec3 e = vec3(1.0/$size, -1.0/$size, 0);",
					"\tvec2 rv = vec2(1.0, -1.0)*$in(uv+e.xy);",
					"\trv += vec2(-1.0, 1.0)*$in(uv-e.xy);",
					"\trv += vec2(1.0, 1.0)*$in(uv+e.xx);",
					"\trv += vec2(-1.0, -1.0)*$in(uv-e.xx);",
					"\trv += vec2(2.0, 0.0)*$in(uv+e.xz);",
					"\trv += vec2(-2.0, 0.0)*$in(uv-e.xz);",
					"\trv += vec2(0.0, 2.0)*$in(uv+e.zx);",
					"\trv += vec2(0.0, -2.0)*$in(uv-e.zx);",
					"\treturn vec3(rv, 0.0);",
					"}"
				],
				"name": "Normal map",
				"outputs": [
					{
						"rgb": "process_normal_$format($(name)_fct($uv), $amount*$size/128.0)",
						"type": "rgb"
					}
				],
				"parameters": [
					{
						"default": 0,
						"label": "",
						"name": "format",
						"type": "enum",
						"values": [
							{
								"name": "Default",
								"value": "default"
							},
							{
								"name": "OpenGL",
								"value": "opengl"
							},
							{
								"name": "DirectX",
								"value": "directx"
							}
						]
					},
					{
						"default": 9,
						"first": 4,
						"label": "",
						"last": 12,
						"name": "size",
						"type": "size"
					},
					{
						"control": "None",
						"default": 0.5,
						"label": "",
						"max": 2,
						"min": 0,
						"name": "amount",
						"step": 0.01,
						"type": "float"
					}
				]
			},
			"type": "shader"
		}
	],
	"parameters": {
		"param0": 10,
		"param1": 1,
		"param2": 0,
		"param4": 1
	},
	"seed_int": 0,
	"shortdesc": "Normal map",
	"type": "graph"
}