<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>copyright</key>
	<string>(c) 2003-2010 by Apple, Inc., all rights reserved.</string>
	<key>description</key>
	<string>This patch computes normals given vertices and optionally indices by averaging the 3 immediately connected neighboring triangle normals</string>
	<key>frameworkVersion</key>
	<string>162</string>
	<key>inputParameters</key>
	<dict>
		<key>X_Count</key>
		<integer>0</integer>
		<key>Y_Count</key>
		<integer>0</integer>
	</dict>
	<key>name</key>
	<string>Grid Normals Generator</string>
	<key>portAttributes</key>
	<dict>
		<key>X_Count</key>
		<dict>
			<key>name</key>
			<string>size (X)</string>
		</dict>
		<key>Y_Count</key>
		<dict>
			<key>name</key>
			<string>size (Y)</string>
		</dict>
	</dict>
	<key>rootPatch</key>
	<dict>
		<key>class</key>
		<string>QCPatch</string>
		<key>state</key>
		<dict>
			<key>nodes</key>
			<array>
				<dict>
					<key>class</key>
					<string>QCOpenCL</string>
					<key>key</key>
					<string>OpenCL_1</string>
					<key>state</key>
					<dict>
						<key>automaticOutputDimensions</key>
						<integer>1</integer>
						<key>automaticThreadDimensions</key>
						<integer>1</integer>
						<key>customPixelFormat</key>
						<integer>0</integer>
						<key>deviceIndex</key>
						<integer>0</integer>
						<key>sampleString</key>
						<string>Unknown msec</string>
						<key>selectedKernel</key>
						<integer>0</integer>
						<key>settingsVisible</key>
						<integer>0</integer>
						<key>sourceCode</key>
						<string>__kernel void normalGenerator(__global const float4 *vertices, uint2 size, __global float4 *normals)
{
	size_t  	tid = get_global_id(0), 
			count = get_global_size(0), 
			x = tid % size.x,
			y = tid / size.x;
	float4	normal, vertex[5];
	int		weight[5];
	
	vertex[0] = vertices[tid];
	vertex[1] = vertices[(x &lt; size.x - 1) ? tid + 1 : tid];
	vertex[2] = vertices[(y &gt; 0) ? tid - size.x : tid];
	vertex[3] = vertices[(x &gt; 0) ? tid - 1 : tid];
	vertex[4] = vertices[(y &lt; size.y - 1) ? tid + size.x : tid];

	//We compute the average of the normals of the 4 adjacent triangles to the vertex
	normal = (float4)(0., 0., 0., 0.);
	normal += cross(vertex[1] - vertex[0], vertex[2] - vertex[0]);
	normal += cross(vertex[2] - vertex[0], vertex[3] - vertex[0]);
	normal += cross(vertex[3] - vertex[0], vertex[4] - vertex[0]);
	normal += cross(vertex[4] - vertex[0], vertex[1] - vertex[0]);
	normal = fast_normalize(normal);

	normals[tid] = normal;
}</string>
						<key>useBestDevice</key>
						<integer>1</integer>
						<key>useLocalKernel</key>
						<integer>1</integer>
						<key>userInfo</key>
						<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpApKEhIQITlNTdHJpbmcBlYQBKwRuYW1lhpKEl5gRIm5vcm1hbEdlbmVyYXRvciKGkoSXmAhwb3NpdGlvboaShISEB05TVmFsdWUAlYQBKoSEDHtDR1BvaW50PWRkfZuBKAKBwQCGhg==</data>
						<key>version</key>
						<integer>1</integer>
					</dict>
				</dict>
			</array>
			<key>publishedInputPorts</key>
			<array>
				<dict>
					<key>key</key>
					<string>Vertices</string>
					<key>node</key>
					<string>OpenCL_1</string>
					<key>port</key>
					<string>vertices</string>
					<key>state</key>
					<dict>
						<key>userInfo</key>
						<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpAZKEhIQITlNTdHJpbmcBlYQBKwRuYW1lhpKEl5gIVmVydGljZXOGhg==</data>
					</dict>
				</dict>
				<dict>
					<key>key</key>
					<string>X_Count</string>
					<key>node</key>
					<string>OpenCL_1</string>
					<key>port</key>
					<string>size_X</string>
					<key>state</key>
					<dict>
						<key>userInfo</key>
						<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpAZKEhIQITlNTdHJpbmcBlYQBKwRuYW1lhpKEl5gHWCBDb3VudIaG</data>
					</dict>
				</dict>
				<dict>
					<key>key</key>
					<string>Y_Count</string>
					<key>node</key>
					<string>OpenCL_1</string>
					<key>port</key>
					<string>size_Y</string>
					<key>state</key>
					<dict>
						<key>userInfo</key>
						<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpAZKEhIQITlNTdHJpbmcBlYQBKwRuYW1lhpKEl5gHWSBDb3VudIaG</data>
					</dict>
				</dict>
			</array>
			<key>publishedOutputPorts</key>
			<array>
				<dict>
					<key>key</key>
					<string>Normals</string>
					<key>node</key>
					<string>OpenCL_1</string>
					<key>port</key>
					<string>normals</string>
					<key>state</key>
					<dict>
						<key>userInfo</key>
						<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpAZKEhIQITlNTdHJpbmcBlYQBKwRuYW1lhpKEl5gHTm9ybWFsc4aG</data>
					</dict>
				</dict>
			</array>
			<key>userInfo</key>
			<data>BAtzdHJlYW10eXBlZIHoA4QBQISEhBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCEhAhOU09iamVjdACFhAFpA5KEhIQITlNTdHJpbmcBlYQBKwhwb3NpdGlvboaShISEB05TVmFsdWUAlYQBKoSEDHtDR1BvaW50PWRkfZsAAYaShJeYCXNjcm9sbGluZ4aShJmampuDAAAAAABEgkCBSAGGkoSXmAp6b29tRmFjdG9yhpKEhIQITlNOdW1iZXIAmZqEhAFmnQGGhg==</data>
		</dict>
	</dict>
</dict>
</plist>
