<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Carbon_Goggles</id>
	<title>Carbon Goggles - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Carbon_Goggles"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;action=history"/>
	<updated>2026-04-10T17:28:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=1195215&amp;oldid=prev</id>
		<title>ObviousAltIsObvious Resident: &lt;lsl&gt; tag to &lt;source&gt;</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=1195215&amp;oldid=prev"/>
		<updated>2015-01-25T17:56:24Z</updated>

		<summary type="html">&lt;p&gt;&amp;lt;lsl&amp;gt; tag to &amp;lt;source&amp;gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:56, 25 January 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{LSL Header}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{LSL Header}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;lsl&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source lang=&quot;lsl2&quot;&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Carbon Goggles 0.7&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Carbon Goggles 0.7&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l613&quot;&gt;Line 613:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 613:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;lsl&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;source&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{LSLC|Library}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{LSLC|Library}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>ObviousAltIsObvious Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322313&amp;oldid=prev</id>
		<title>Babbage Linden at 07:36, 17 April 2009</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322313&amp;oldid=prev"/>
		<updated>2009-04-17T07:36:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:36, 17 April 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l614&quot;&gt;Line 614:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 614:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/lsl&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/lsl&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{LSLC|Library}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Babbage Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322303&amp;oldid=prev</id>
		<title>Babbage Linden at 07:34, 17 April 2009</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322303&amp;oldid=prev"/>
		<updated>2009-04-17T07:34:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:34, 17 April 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{LSL Header}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;lsl&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Carbon Goggles 0.7&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// Carbon Goggles 0.7&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;//&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l611&quot;&gt;Line 611:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 613:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/lsl&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Babbage Linden</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322273&amp;oldid=prev</id>
		<title>Babbage Linden: New page: // Carbon Goggles 0.7 // // An Augmented Virtual Reality HUD for Second Life  // by Babbage Linden // // Available under the Creative Commons Attribution-ShareAlike 2.5 license // http://c...</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Carbon_Goggles&amp;diff=322273&amp;oldid=prev"/>
		<updated>2009-04-17T07:32:48Z</updated>

		<summary type="html">&lt;p&gt;New page: // Carbon Goggles 0.7 // // An Augmented Virtual Reality HUD for Second Life  // by Babbage Linden // // Available under the Creative Commons Attribution-ShareAlike 2.5 license // http://c...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// Carbon Goggles 0.7&lt;br /&gt;
//&lt;br /&gt;
// An Augmented Virtual Reality HUD for Second Life &lt;br /&gt;
// by Babbage Linden&lt;br /&gt;
//&lt;br /&gt;
// Available under the Creative Commons Attribution-ShareAlike 2.5 license&lt;br /&gt;
// http://creativecommons.org/licenses/by-sa/2.5/&lt;br /&gt;
&lt;br /&gt;
float gSelectionTimeout = 120.0;&lt;br /&gt;
float gScanDelay = 5.0;&lt;br /&gt;
float gRateDelay = 0.0;&lt;br /&gt;
&lt;br /&gt;
integer gAnnotateDialogChannel = 8888;&lt;br /&gt;
integer gAnnotateDialogChannelHandle = 0;&lt;br /&gt;
&lt;br /&gt;
integer gCommandChannel = 5;&lt;br /&gt;
integer gCommandChannelHandle = 0;&lt;br /&gt;
&lt;br /&gt;
integer gConfigDialogChannel = 9999;&lt;br /&gt;
integer gConfigDialogChannelHandle = 0;&lt;br /&gt;
&lt;br /&gt;
float gSensorRange = 10.0;&lt;br /&gt;
integer gMaxOverlays = 8;&lt;br /&gt;
float gRefreshPeriod = 4.0;&lt;br /&gt;
float gFOV;&lt;br /&gt;
list gSkipNames = [&amp;quot;Object&amp;quot;, &amp;quot;Tree&amp;quot;, &amp;quot;&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
list gDetectedNames;&lt;br /&gt;
list gDetectedKeys;&lt;br /&gt;
list gDetectedPositions;&lt;br /&gt;
list gDetectedEmissions;&lt;br /&gt;
&lt;br /&gt;
integer gAnnotate = FALSE;&lt;br /&gt;
string gAnnotationType;&lt;br /&gt;
string gAnnotationUrl = &amp;quot;http://wiki.amee.com/andrew/secondlife/get.php?path=/data&amp;quot;;&lt;br /&gt;
string gAnnotationPath;&lt;br /&gt;
string gAnnotationParams;&lt;br /&gt;
key gAnnotationRequest;&lt;br /&gt;
&lt;br /&gt;
key gEmissionsRequest;&lt;br /&gt;
integer gEmissionsRequestIndex;&lt;br /&gt;
&lt;br /&gt;
// Emission parameters&lt;br /&gt;
integer gDistanceKmPerMonth = 1207; // cars, motorcycles&lt;br /&gt;
integer gJourneysPerYear = 2; // flights&lt;br /&gt;
integer gHoursPerMonth = 90; // tv&lt;br /&gt;
integer gCyclesPerMonth = 12; // washing machine, dryer, dishwasher&lt;br /&gt;
integer gNumberOwned = 1; // entertainment devices, e.g. computers, dvd, freeview box, game console etc. &lt;br /&gt;
&lt;br /&gt;
key gUpdateId;&lt;br /&gt;
string gRegionName;&lt;br /&gt;
vector gCameraPos;&lt;br /&gt;
rotation gCameraRot;&lt;br /&gt;
integer gHidingOverlays;&lt;br /&gt;
integer gSelectedIndex;&lt;br /&gt;
&lt;br /&gt;
key gNotecardId;&lt;br /&gt;
integer gNotecardLine;&lt;br /&gt;
&lt;br /&gt;
string gURL = &amp;quot;http://carbongoggles.org/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
float gLastRateTime;&lt;br /&gt;
float gLastScanTime;&lt;br /&gt;
float gLastSelectedTime;&lt;br /&gt;
&lt;br /&gt;
integer DISPLAY_STRING = 204000;&lt;br /&gt;
integer SET_COLOR = 204007;&lt;br /&gt;
integer SET_POSITION = 204008;&lt;br /&gt;
integer SET_SCALE = 204009;&lt;br /&gt;
integer SET_TEXT_COLOUR = 204010;&lt;br /&gt;
integer SET_ALPHA = 204011;&lt;br /&gt;
integer OVERLAY_LINK_OFFSET = 2;&lt;br /&gt;
integer OVERLAY_COUNT = 8;&lt;br /&gt;
&lt;br /&gt;
key httpRequest(string url, list parameters, string body)&lt;br /&gt;
{&lt;br /&gt;
    //llOwnerSay(&amp;quot;llHTTPRequest &amp;quot; + url + &amp;quot; &amp;quot; + body);&lt;br /&gt;
    return llHTTPRequest(url, parameters, body);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
requestEmissions()&lt;br /&gt;
{&lt;br /&gt;
    if(gEmissionsRequestIndex &amp;lt; llGetListLength(gDetectedEmissions) &amp;amp;&amp;amp; llList2Float(gDetectedEmissions, gEmissionsRequestIndex) &amp;lt; 0.0f)&lt;br /&gt;
    {&lt;br /&gt;
        string url = gURL + &amp;quot;object/&amp;quot; + (string)llList2Key(gDetectedKeys, gEmissionsRequestIndex) + &amp;quot;/emissions?&amp;quot;;&lt;br /&gt;
        url += &amp;quot;distanceKmPerMonth=&amp;quot; + (string) gDistanceKmPerMonth;&lt;br /&gt;
        url += &amp;quot;%26journeysPerYear=&amp;quot; + (string) gJourneysPerYear;&lt;br /&gt;
        url += &amp;quot;%26hoursPerMonth=&amp;quot; + (string) gHoursPerMonth;&lt;br /&gt;
        url += &amp;quot;%26cyclesPerMonth=&amp;quot; + (string) gCyclesPerMonth;&lt;br /&gt;
        url += &amp;quot;%26numberOwned=&amp;quot; + (string) gNumberOwned;&lt;br /&gt;
        //llOwnerSay(url);&lt;br /&gt;
        gEmissionsRequest = httpRequest(url, [HTTP_METHOD, &amp;quot;GET&amp;quot;], &amp;quot;&amp;quot;);  &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rescan()&lt;br /&gt;
{&lt;br /&gt;
    float time = llGetTime();&lt;br /&gt;
    if(time &amp;gt; gLastScanTime + gScanDelay &amp;amp;&amp;amp; gSelectedIndex == -1)&lt;br /&gt;
    {&lt;br /&gt;
        llSensor(&amp;quot;&amp;quot;, NULL_KEY, ACTIVE | PASSIVE, gSensorRange, PI / 2.0);&lt;br /&gt;
        gLastScanTime = time;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hideOverlay(integer index)&lt;br /&gt;
{&lt;br /&gt;
    float offset = 0.5 + ((2 / 16.0) * (float)index);&lt;br /&gt;
    //string s = (string)index;&lt;br /&gt;
    //float offset = 1.1;&lt;br /&gt;
    string s = &amp;quot;&amp;quot;;&lt;br /&gt;
    llMessageLinked(index + OVERLAY_LINK_OFFSET, SET_ALPHA, (string)0.0f, NULL_KEY);&lt;br /&gt;
    llMessageLinked(index + OVERLAY_LINK_OFFSET, DISPLAY_STRING, s, NULL_KEY);&lt;br /&gt;
    llMessageLinked(index + OVERLAY_LINK_OFFSET, SET_SCALE, (string)&amp;lt;0.1,0.1,0.1&amp;gt;, NULL_KEY);&lt;br /&gt;
    llMessageLinked(index + OVERLAY_LINK_OFFSET, SET_POSITION, (string)&amp;lt;0,0,offset&amp;gt;, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
hideOverlays()&lt;br /&gt;
{&lt;br /&gt;
    integer i = 0;&lt;br /&gt;
    while(i &amp;lt; OVERLAY_COUNT)&lt;br /&gt;
    {&lt;br /&gt;
        hideOverlay(i);&lt;br /&gt;
        ++i;&lt;br /&gt;
    }&lt;br /&gt;
    gHidingOverlays = TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
setOverlayColour(vector colour)&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i = 0; i &amp;lt; OVERLAY_COUNT; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(i + OVERLAY_LINK_OFFSET, SET_COLOR, (string)&amp;lt;0.8,0.8,0.8&amp;gt;, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
init(key id)&lt;br /&gt;
{&lt;br /&gt;
    gFOV = 60.0 * DEG_TO_RAD;&lt;br /&gt;
    gLastRateTime = 0.0;&lt;br /&gt;
    gLastScanTime = 0.0;&lt;br /&gt;
    llResetTime();&lt;br /&gt;
    llRequestPermissions(llGetOwner(), PERMISSION_TRACK_CAMERA);&lt;br /&gt;
    gCommandChannelHandle = llListen(gCommandChannel, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
    gAnnotateDialogChannelHandle = llListen(gAnnotateDialogChannel, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
    gConfigDialogChannelHandle = llListen(gConfigDialogChannel, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
    llOwnerSay(&amp;quot;Loading settings&amp;quot;);&lt;br /&gt;
    gNotecardLine = 0;&lt;br /&gt;
    gNotecardId = llGetNotecardLine(&amp;quot;Settings&amp;quot;, gNotecardLine);&lt;br /&gt;
    hideOverlays();&lt;br /&gt;
    gSelectedIndex = -1;&lt;br /&gt;
    setOverlayColour(&amp;lt;0,1,0&amp;gt;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer overlay(integer index)&lt;br /&gt;
{&lt;br /&gt;
    vector cameraPos = llGetCameraPos();&lt;br /&gt;
    rotation cameraRot = llGetCameraRot();&lt;br /&gt;
    integer overlayLinkNum = index + OVERLAY_LINK_OFFSET;&lt;br /&gt;
    float emissions = llList2Float(gDetectedEmissions, index);&lt;br /&gt;
    vector objectPos = llList2Vector(gDetectedPositions, index);&lt;br /&gt;
    &lt;br /&gt;
    if(emissions &amp;gt;= 0.0f || gAnnotate)&lt;br /&gt;
    {&lt;br /&gt;
        // Translate object in to camera space.&lt;br /&gt;
        objectPos = objectPos - cameraPos;&lt;br /&gt;
        &lt;br /&gt;
        // Rotate object in camera space.&lt;br /&gt;
        rotation invCameraRot = &amp;lt;0.0,0.0,0.0,1.0&amp;gt; / cameraRot;&lt;br /&gt;
        objectPos = objectPos * invCameraRot;&lt;br /&gt;
        &lt;br /&gt;
        // Switch axes from Z = up to RHS (X = left, Y = up, Z = forward)&lt;br /&gt;
        objectPos = &amp;lt;-objectPos.y, objectPos.z, objectPos.x&amp;gt;;&lt;br /&gt;
        &lt;br /&gt;
        // Apply perspective distortion.&lt;br /&gt;
        float xHUD = (objectPos.x * (1.0 / llTan(gFOV / 2.0))) / objectPos.z;&lt;br /&gt;
        float yHUD = (objectPos.y * (1.0 / llTan(gFOV / 2.0))) / objectPos.z;&lt;br /&gt;
        &lt;br /&gt;
        // Set front clipping plane to 1m and back clipping plane to infinity.&lt;br /&gt;
        float zHUD = (objectPos.z - 2) / objectPos.z;&lt;br /&gt;
        &lt;br /&gt;
        // Clip object to HUD.&lt;br /&gt;
        if( xHUD &amp;gt; -1.0 &amp;amp;&amp;amp; xHUD &amp;lt; 1.0 &amp;amp;&amp;amp; &lt;br /&gt;
            yHUD &amp;gt; -1.0 &amp;amp;&amp;amp; yHUD &amp;lt; 1.0 &amp;amp;&amp;amp;&lt;br /&gt;
            zHUD &amp;gt; -1.0 &amp;amp;&amp;amp; zHUD &amp;lt; 1.0)&lt;br /&gt;
        {&lt;br /&gt;
            string label = &amp;quot;Click to annotate&amp;quot;;&lt;br /&gt;
            if(llList2Float(gDetectedEmissions, index) &amp;gt;= 0.0f)&lt;br /&gt;
            {&lt;br /&gt;
                label = (string)llList2String(gDetectedNames, index) + &amp;quot;\n&amp;quot;;&lt;br /&gt;
                label += (string)llList2Float(gDetectedEmissions, index) + &amp;quot; kg co2/month&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                emissions = 1.0f;&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            vector posHUD = &amp;lt;0, -xHUD / 2, yHUD / 2&amp;gt; - llGetLocalPos();&lt;br /&gt;
            llMessageLinked(overlayLinkNum, SET_POSITION, (string)posHUD, NULL_KEY);&lt;br /&gt;
            float radius = llPow((3.0f * emissions) / (4.0f * PI), (1.0 / 3.0));&lt;br /&gt;
            float scale = (float)radius / 10.0f;&lt;br /&gt;
            if(scale &amp;gt; 1.0)&lt;br /&gt;
            {&lt;br /&gt;
                scale /= 10.0;&lt;br /&gt;
                llMessageLinked(overlayLinkNum, SET_COLOR, (string)&amp;lt;0.5,0.05,0.05&amp;gt;, NULL_KEY);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(overlayLinkNum, SET_COLOR, (string)&amp;lt;0.8,0.8,0.8&amp;gt;, NULL_KEY);&lt;br /&gt;
            }&lt;br /&gt;
            llMessageLinked(overlayLinkNum, SET_SCALE, (string)&amp;lt;scale,scale,scale&amp;gt;, NULL_KEY);&lt;br /&gt;
            llMessageLinked(overlayLinkNum, DISPLAY_STRING, label, NULL_KEY);&lt;br /&gt;
            llMessageLinked(overlayLinkNum, SET_ALPHA, (string)1.0f, NULL_KEY);&lt;br /&gt;
            return TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    hideOverlay(index);&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer setOption(string option)&lt;br /&gt;
{&lt;br /&gt;
    list pair = llParseString2List(option, [&amp;quot;:&amp;quot;, &amp;quot; &amp;quot;], []);&lt;br /&gt;
    string name = llList2String(pair, 0);&lt;br /&gt;
    name = llToLower(name);&lt;br /&gt;
    if(name == &amp;quot;sensorrange&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gSensorRange = llList2Float(pair, 1);&lt;br /&gt;
    }    &lt;br /&gt;
    else if(name == &amp;quot;refreshperiod&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gRefreshPeriod = llList2Float(pair, 1);&lt;br /&gt;
        llSetTimerEvent(gRefreshPeriod);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;selectiontimeout&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gSelectionTimeout = llList2Float(pair, 1);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;annotate&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gAnnotate = llList2Integer(pair, 1);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;fieldofview&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gFOV = llList2Float(pair, 1) * DEG_TO_RAD;&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;skipnames&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gSkipNames = llCSV2List(llList2String(pair, 1));&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;overlayrgb&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        vector colour;&lt;br /&gt;
        list rgb = llCSV2List(llList2String(pair, 1));&lt;br /&gt;
        colour.x = llList2Float(rgb, 0);&lt;br /&gt;
        colour.y = llList2Float(rgb, 1);&lt;br /&gt;
        colour.z = llList2Float(rgb, 2);&lt;br /&gt;
        setOverlayColour(colour);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;distancekmpermonth&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gDistanceKmPerMonth = llList2Integer(pair, 1);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;journeysperyear&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gJourneysPerYear = llList2Integer(pair, 1);&lt;br /&gt;
    }    &lt;br /&gt;
    else if(name == &amp;quot;hourspermonth&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gHoursPerMonth = llList2Integer(pair, 1);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;cyclespermonth&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gCyclesPerMonth = llList2Integer(pair, 1);&lt;br /&gt;
    }&lt;br /&gt;
    else if(name == &amp;quot;numberowned&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        gNumberOwned = llList2Integer(pair, 1);&lt;br /&gt;
    }            &lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    //llOwnerSay(llList2String(pair, 0) + &amp;quot;:&amp;quot; + llList2String(pair, 1));&lt;br /&gt;
    return TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
annotateObject(integer index, string ameeurl)&lt;br /&gt;
{&lt;br /&gt;
    key id = llList2Key(gDetectedKeys, index);&lt;br /&gt;
    vector position = llList2Vector(gDetectedPositions, index);&lt;br /&gt;
    string body = (string)((integer)position.x);&lt;br /&gt;
    body += &amp;quot;,&amp;quot; + (string)((integer)position.y);&lt;br /&gt;
    body += &amp;quot;,&amp;quot; + (string)((integer)position.z);&lt;br /&gt;
    body += &amp;quot;,&amp;quot; + llEscapeURL(ameeurl);            &lt;br /&gt;
    body += &amp;quot;,&amp;quot; + llList2String(gDetectedNames, index);&lt;br /&gt;
    string url = gURL + &amp;quot;object/&amp;quot; + (string)id;&lt;br /&gt;
    gUpdateId = httpRequest(url, [HTTP_METHOD, &amp;quot;POST&amp;quot;], body);&lt;br /&gt;
    llOwnerSay(&amp;quot;Annotated &amp;quot; + llList2String(gDetectedNames, gSelectedIndex));&lt;br /&gt;
    gSelectedIndex = -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
saySettings()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;To change settings, chat \&amp;quot;/5 Setting:Value\&amp;quot; or change values in Settings notecard then re-attach HUD\nSensorRange:N (scan objects up to N meters away)\nRefreshTime:N (update overlay positions every N seconds)\nShowUnknown:N (augment objects with unknown emissions if N is 1)\nFieldOfView:N (field of view in degrees, must match viewer)\nSkipNames:X,Y,...,Z (ignore objects with names in list X,Y,...,Z)\nOverlayRGB:R,G,B (set overlay colour to &amp;lt;R,G,B&amp;gt;)\nSelectionTimeout:N (time out object selection after N seconds)\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init(llGetOwner());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if(id != NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            init(id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel == gCommandChannel)&lt;br /&gt;
        {&lt;br /&gt;
            list pair = llParseString2List(message, [&amp;quot;&amp;quot;, &amp;quot; &amp;quot;], []);&lt;br /&gt;
            string command = llList2String(pair, 0);&lt;br /&gt;
            command = llToLower(command);&lt;br /&gt;
            if(setOption(message) == TRUE)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else if(command == &amp;quot;annotate&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                annotateObject(gSelectedIndex, llList2String(pair, 1));&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;ERROR: Unrecognised command \&amp;quot;&amp;quot; + message + &amp;quot;\&amp;quot; chat \&amp;quot;/5 Help\&amp;quot; for help&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if(channel == gAnnotateDialogChannel)&lt;br /&gt;
        {&lt;br /&gt;
            if(gAnnotationType == &amp;quot;path&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                gAnnotationPath += &amp;quot;/&amp;quot; + llEscapeURL(message);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(gAnnotationParams == &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    gAnnotationParams = &amp;quot;/drill%3f&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    gAnnotationParams += &amp;quot;%26&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                gAnnotationParams += gAnnotationType;&lt;br /&gt;
                gAnnotationParams += &amp;quot;=&amp;quot;;&lt;br /&gt;
                gAnnotationParams += llEscapeURL(message);&lt;br /&gt;
            }&lt;br /&gt;
            string url = gAnnotationUrl + gAnnotationPath + gAnnotationParams;&lt;br /&gt;
            gAnnotationRequest = httpRequest(url, [], &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(url);&lt;br /&gt;
        }&lt;br /&gt;
        else if(channel == gConfigDialogChannel)&lt;br /&gt;
        {&lt;br /&gt;
            if(message == &amp;quot;Visualise&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Hiding annotation interface...&amp;quot;);&lt;br /&gt;
                gAnnotate = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
            else if(message == &amp;quot;Annotate&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Showing annotation interface...&amp;quot;);&lt;br /&gt;
                gAnnotate = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else if(message == &amp;quot;Web&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Loading web interface...&amp;quot;);&lt;br /&gt;
                llLoadURL(llGetOwner(), &amp;quot;&amp;quot;, gURL);&lt;br /&gt;
            }&lt;br /&gt;
            else if(message == &amp;quot;Settings&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                saySettings();&lt;br /&gt;
            }&lt;br /&gt;
            else if(message == &amp;quot;Off&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Turning off...&amp;quot;);&lt;br /&gt;
                state off;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {   &lt;br /&gt;
        if((gSelectedIndex != -1) &amp;amp;&amp;amp; (gLastSelectedTime + gSelectionTimeout &amp;lt; llGetTime()))&lt;br /&gt;
        {&lt;br /&gt;
            gSelectedIndex = -1;&lt;br /&gt;
            llOwnerSay(&amp;quot;Selection timeout&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
         &lt;br /&gt;
        vector cameraPos = llGetCameraPos();&lt;br /&gt;
        rotation cameraRot = llGetCameraRot();&lt;br /&gt;
        string regionName = llGetRegionName();&lt;br /&gt;
        integer hide = (regionName != gRegionName)&lt;br /&gt;
                        || (llVecDist(cameraPos, gCameraPos) / gRefreshPeriod &amp;gt; 0.1)&lt;br /&gt;
                        || (llAngleBetween(cameraRot, gCameraRot) * RAD_TO_DEG &amp;gt; 10);&lt;br /&gt;
        gRegionName = regionName;&lt;br /&gt;
        gCameraPos = cameraPos;&lt;br /&gt;
        gCameraRot = cameraRot;&lt;br /&gt;
        if(hide == TRUE)&lt;br /&gt;
        {&lt;br /&gt;
            hideOverlays();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        gHidingOverlays = FALSE;&lt;br /&gt;
        &lt;br /&gt;
        integer count = llGetListLength(gDetectedNames);&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        while(i &amp;lt; count)&lt;br /&gt;
        {&lt;br /&gt;
            overlay(i);&lt;br /&gt;
            ++i;&lt;br /&gt;
        }&lt;br /&gt;
        while(i &amp;lt; OVERLAY_COUNT)&lt;br /&gt;
        {&lt;br /&gt;
            hideOverlay(i);&lt;br /&gt;
            ++i;&lt;br /&gt;
        }&lt;br /&gt;
        rescan();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        //llOwnerSay(&amp;quot;sensor&amp;quot;);&lt;br /&gt;
        list oldKeys = gDetectedKeys;&lt;br /&gt;
        list oldEmissions = gDetectedEmissions; &lt;br /&gt;
        gDetectedNames = [];&lt;br /&gt;
        gDetectedKeys = [];&lt;br /&gt;
        gDetectedPositions = [];&lt;br /&gt;
        gDetectedEmissions = [];&lt;br /&gt;
        integer i;&lt;br /&gt;
        for(i = 0; i &amp;lt; num &amp;amp;&amp;amp; i &amp;lt; gMaxOverlays; ++i)&lt;br /&gt;
        {&lt;br /&gt;
            string name = llDetectedName(i);&lt;br /&gt;
            //llOwnerSay(&amp;quot;scanned &amp;quot; + name);&lt;br /&gt;
            integer skip = FALSE;&lt;br /&gt;
            integer skipCount = llGetListLength(gSkipNames);&lt;br /&gt;
            integer skipIndex;&lt;br /&gt;
            for(skipIndex = 0; (skipIndex &amp;lt; skipCount) &amp;amp;&amp;amp; (skip == FALSE); ++skipIndex)&lt;br /&gt;
            {&lt;br /&gt;
                if(name == llList2String(gSkipNames, skipIndex))&lt;br /&gt;
                {&lt;br /&gt;
                    skip = TRUE;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(skip == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                key newKey = llDetectedKey(i);&lt;br /&gt;
                integer oldCount = llGetListLength(oldKeys);&lt;br /&gt;
                integer oldIndex;&lt;br /&gt;
                integer found = FALSE;&lt;br /&gt;
                for(oldIndex = 0; (oldIndex &amp;lt; oldCount) &amp;amp;&amp;amp; (found == FALSE); ++oldIndex)&lt;br /&gt;
                {&lt;br /&gt;
                    key oldKey = llList2Key(oldKeys, oldIndex);&lt;br /&gt;
                    if(oldKey == newKey)&lt;br /&gt;
                    {&lt;br /&gt;
                        gDetectedEmissions += llList2Float(oldEmissions, oldIndex);&lt;br /&gt;
                        found = TRUE;    &lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if(found == FALSE)&lt;br /&gt;
                {&lt;br /&gt;
                    gDetectedEmissions += -1.0f;&lt;br /&gt;
                }&lt;br /&gt;
                gDetectedNames += name;&lt;br /&gt;
                gDetectedKeys += newKey;&lt;br /&gt;
                gDetectedPositions += llDetectedPos(i);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        gRegionName = llGetRegionName();&lt;br /&gt;
        gCameraPos = llGetCameraPos();&lt;br /&gt;
        gEmissionsRequest = NULL_KEY;&lt;br /&gt;
        gEmissionsRequestIndex = 0;&lt;br /&gt;
        gSelectedIndex = -1;&lt;br /&gt;
        requestEmissions();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    http_response(key id, integer status, list meta, string body) &lt;br /&gt;
    {&lt;br /&gt;
        if(id == gEmissionsRequest) &lt;br /&gt;
        {   &lt;br /&gt;
            //llOwnerSay(&amp;quot;request http_response &amp;quot; + (string)status + &amp;quot; length &amp;quot; + (string)llStringLength(body) + &amp;quot; &amp;quot; + body);&lt;br /&gt;
            if(status == 200)&lt;br /&gt;
            {&lt;br /&gt;
                list result = llParseString2List(body, [&amp;quot;,&amp;quot;], []);&lt;br /&gt;
                //llOwnerSay(llList2CSV(result));&lt;br /&gt;
                float emissions = llList2Float(result, 1);&lt;br /&gt;
                //llOwnerSay((string) emissions + &amp;quot; &amp;quot; + (string) gEmissionsRequestIndex + &amp;quot; &amp;quot; + llList2CSV(gDetectedEmissions));&lt;br /&gt;
                gDetectedEmissions = llListReplaceList(gDetectedEmissions, [emissions], gEmissionsRequestIndex, gEmissionsRequestIndex);&lt;br /&gt;
            }&lt;br /&gt;
            overlay(gEmissionsRequestIndex);&lt;br /&gt;
            gEmissionsRequest = NULL_KEY;&lt;br /&gt;
            ++gEmissionsRequestIndex;&lt;br /&gt;
            requestEmissions();&lt;br /&gt;
        }&lt;br /&gt;
        else if(id == gAnnotationRequest)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay((string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            //list result = llParseString2List(body, [&amp;quot; &amp;quot;,&amp;quot;,&amp;quot;,&amp;quot;\n&amp;quot;], []);&lt;br /&gt;
            //llOwnerSay(llList2CSV(result));&lt;br /&gt;
            //string type = llList2String(result, 0);&lt;br /&gt;
            string type = llGetSubString(body, 0, llSubStringIndex(body, &amp;quot;,&amp;quot;) - 1);&lt;br /&gt;
            list result = llParseString2List(body, [type + &amp;quot;,&amp;quot;,&amp;quot;\n&amp;quot;], []);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            //llOwnerSay(llList2CSV(result));&lt;br /&gt;
            if(type == &amp;quot;uid&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                // AMEE data item UID found, build and store AMEE URL.&lt;br /&gt;
                string uid = llList2String(result, 0);&lt;br /&gt;
                string url = gAnnotationUrl + gAnnotationPath + &amp;quot;/&amp;quot; + uid;&lt;br /&gt;
                annotateObject(gSelectedIndex, url);&lt;br /&gt;
                llOwnerSay(&amp;quot;(To annotate another object with the same data, select it, then say \&amp;quot;/5 annotate &amp;quot; + url + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                gAnnotationType = type;&lt;br /&gt;
                list options = [];&lt;br /&gt;
                integer length = llGetListLength(result);&lt;br /&gt;
                integer i;&lt;br /&gt;
                for(i = 0; i &amp;lt; length; i += 1)&lt;br /&gt;
                {&lt;br /&gt;
                    options += llList2String(result, i);&lt;br /&gt;
                }&lt;br /&gt;
                if(type == &amp;quot;path&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    type = &amp;quot;catagory&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                options = llList2List(options, 0, 11); // TODO: Paginate instead of truncating options.&lt;br /&gt;
                //llOwnerSay(llList2CSV(options)); &lt;br /&gt;
                llDialog(llGetOwner(), &amp;quot;Select &amp;quot; + type, options, gAnnotateDialogChannel);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if(status != 200 &amp;amp;&amp;amp; status != 404)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;ERROR:&amp;quot; + (string)status + &amp;quot;:&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
        //llOwnerSay(&amp;quot;http_response &amp;quot; + (string)status + &amp;quot; length &amp;quot; + (string)llStringLength(body) + &amp;quot; &amp;quot; + body);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if(id == gNotecardId)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if(setOption(data) == FALSE)&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(&amp;quot;ERROR: Unknown setting &amp;quot; + data);&lt;br /&gt;
                }&lt;br /&gt;
                ++gNotecardLine;&lt;br /&gt;
                gNotecardId = llGetNotecardLine(&amp;quot;Settings&amp;quot;, gNotecardLine);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Settings loaded\nEmissions data will be overlayed on objects when avatar is stationary\nClick logo for settings&amp;quot;);&lt;br /&gt;
                llSetTimerEvent(gRefreshPeriod);&lt;br /&gt;
                llSensor(&amp;quot;&amp;quot;, NULL_KEY,  ACTIVE | PASSIVE, gSensorRange, PI / 2.0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        integer linkNum = llDetectedLinkNumber(0);&lt;br /&gt;
        //llOwnerSay((string)linkNum);    &lt;br /&gt;
        linkNum -= OVERLAY_LINK_OFFSET;&lt;br /&gt;
        if(linkNum &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            gSelectedIndex = linkNum;&lt;br /&gt;
            gLastSelectedTime = llGetTime();&lt;br /&gt;
            llOwnerSay(&amp;quot;Selected &amp;quot; + llList2String(gDetectedNames, gSelectedIndex) + &amp;quot;(&amp;quot; + llList2String(gDetectedKeys, gSelectedIndex) + &amp;quot;)&amp;quot;);&lt;br /&gt;
            gAnnotationPath = &amp;quot;&amp;quot;;&lt;br /&gt;
            gAnnotationParams = &amp;quot;&amp;quot;;&lt;br /&gt;
            gAnnotationRequest = httpRequest(gAnnotationUrl, [], &amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llDialog(llGetOwner(), &amp;quot;Select Interface&amp;quot;, [&amp;quot;Web&amp;quot;, &amp;quot;Settings&amp;quot;, &amp;quot;Off&amp;quot;, &amp;quot;Visualise&amp;quot;, &amp;quot;Annotate&amp;quot;], gConfigDialogChannel);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state off&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        hideOverlays();&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Turning on...&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Babbage Linden</name></author>
	</entry>
</feed>