<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>20papercups :: Michael Marner&#039;s Website &#187; openscenegraph</title>
	<atom:link href="http://www.20papercups.net/tag/openscenegraph/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.20papercups.net</link>
	<description>The (awesome) website of Michael Marner</description>
	<lastBuildDate>Tue, 15 Nov 2011 01:09:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Graphics Applications and Libraries Month at Packt Publishing</title>
		<link>http://www.20papercups.net/random-news/graphics-applications-and-libraries-month-at-packt-publishing/</link>
		<comments>http://www.20papercups.net/random-news/graphics-applications-and-libraries-month-at-packt-publishing/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 23:13:40 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random News]]></category>
		<category><![CDATA[Augmented Reality]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[openscenegraph]]></category>

		<guid isPermaLink="false">http://www.20papercups.net/?p=371</guid>
		<description><![CDATA[Hey guys So a little while ago I said that I was going to review the new Open Scene Graph 3: Beginners Guide book from Packt Publishing. Unfortunately, I still haven&#8217;t had time to do the review. However, I thought I would mention that all through April Packt Publishing are running discounts on all of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.20papercups.net/wp-content/uploads/2011/04/packt_logo.png"><img class="alignleft size-full wp-image-372" title="packt_logo" src="http://www.20papercups.net/wp-content/uploads/2011/04/packt_logo.png" alt="" width="104" height="45" /></a>Hey guys</p>
<p>So a little while ago I said that I was going to review the new <a href="http://link.packtpub.com/NwneHs">Open Scene Graph 3: Beginners Guide</a> book from Packt Publishing. Unfortunately, I <em>still</em> haven&#8217;t had time to do the review. However, I thought I would mention that all through April Packt Publishing are running discounts on all of their Graphics books!</p>
<blockquote><p><span style="color: #000000;"><span style="font-family: Calibri;"><span style="font-size: small;">During April, Packt will be running a series of discounts and promotions on a selection of its Open Source Graphic books wherein readers can avail exclusive discounts of 20% and 30% off the cover price of Graphic print books and eBooks.</span></span></span></p></blockquote>
<p><span style="color: #000000;"><span style="font-family: Calibri;"><span style="font-size: small;">So, I suggest you go check out what they have to offer:</span></span></span></p>
<p><a href="http://www.packtpub.com/article/graphic-open-source" target="_blank">http://www.packtpub.com/article/graphic-open-source</a></p>
<p>Cheers<br />
Michael</p>
<p><small><em>Full Disclosure: I have nothing to do with Packt Publishing. However, they did give me a free e-book version of the OSG3 Beginners Guide for me to review. I feel a little bit guilty that I haven&#8217;t done the review yet. Other than that, I have no affiliation with Packt Publishing, and I didn&#8217;t get anything for posting this. So I haven&#8217;t sold out. In my opinion, someone going out of their way to produce documentation and reference books for Open Source Software is a good thing!</em></small></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.20papercups.net/random-news/graphics-applications-and-libraries-month-at-packt-publishing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSceneGraph 3.0 Beginner&#8217;s Guide &#8211; book review coming soon!</title>
		<link>http://www.20papercups.net/random-news/openscenegraph-3-0-beginners-guide-book-review-coming-soon/</link>
		<comments>http://www.20papercups.net/random-news/openscenegraph-3-0-beginners-guide-book-review-coming-soon/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 02:11:34 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Random News]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[openscenegraph]]></category>

		<guid isPermaLink="false">http://www.20papercups.net/?p=344</guid>
		<description><![CDATA[Hi Everyone The guys over at Packt Publishing have kindly asked me to review a new book on programming with OpenSceneGraph. I haven&#8217;t looked at the book yet, but will get the review done sometime this week. In the mean time, checkout the book: http://link.packtpub.com/NwneHs]]></description>
			<content:encoded><![CDATA[<p><a class="moz-txt-link-freetext" href="http://link.packtpub.com/NwneHs"><a href="http://link.packtpub.com/NwneHs"><img class="alignleft size-medium wp-image-345" title="OpenSceneGraph 3.0 Beginner's Guide" src="http://www.20papercups.net/wp-content/uploads/2011/01/OSG-243x300.jpg" alt="" width="243" height="300" /></a></a></p>
<p>Hi Everyone</p>
<p>The guys over at Packt Publishing have kindly asked  me to review a new book on programming with OpenSceneGraph. I haven&#8217;t  looked at the book yet, but will get the review done sometime this week.  In the mean time, checkout the book:</p>
<p><a href="http://link.packtpub.com/NwneHs">http://link.packtpub.com/NwneHs</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.20papercups.net/random-news/openscenegraph-3-0-beginners-guide-book-review-coming-soon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSceneGraph, Dual Screens &amp; TwinView</title>
		<link>http://www.20papercups.net/programming/openscenegraph-dual-screens-twinview/</link>
		<comments>http://www.20papercups.net/programming/openscenegraph-dual-screens-twinview/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 06:07:24 +0000</pubDate>
		<dc:creator>Michael</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[dual screen]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[openscenegraph]]></category>

		<guid isPermaLink="false">http://www.20papercups.net/?p=145</guid>
		<description><![CDATA[So some of my work at uni involves programming using OpenSceneGraph. Now, anybody who has used OSG before will know that as powerful as it may be, it is seriously lacking in the documentation department. So, this article describes how to do dual screen graphics on Linux using OpenSceneGraph. First we&#8217;ll look at the X [...]]]></description>
			<content:encoded><![CDATA[<p>So some of my work at uni involves programming using <a title="OpenSceneGraph Website" href="http://www.openscenegraph.org" target="_blank">OpenSceneGraph</a>. Now, anybody who has used OSG before will know that as powerful as it may be, it is seriously lacking in the documentation department. So, this article describes how to do dual screen graphics on Linux using OpenSceneGraph. First we&#8217;ll look at the X Screens approach, which is easier but probably not the best solution. Then we&#8217;ll look at a method that works with a single X screen.<span id="more-145"></span></p>
<h3>Multiple X Screens</h3>
<p>The easiest way to do dual screen output is if you have your X server configured so each output is its own X screen. The first thing you need to do is make sure you have enough screens. Finding this out is easy enough:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> getNumScreens<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">WindowingSystemInterface</span><span style="color: #000040;">*</span> wsi <span style="color: #000080;">=</span> osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">getWindowingSystemInterface</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">ScreenIdentifier</span> si<span style="color: #008080;">;</span>
    si.<span style="color: #007788;">readDISPLAY</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> wsi<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getNumScreens<span style="color: #008000;">&#40;</span>si<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>You should do this before attempting to create your screens to make sure the X server is configured correctly. Otherwise OSG will throw an error when you try and create a graphics context for a screen that doesn&#8217;t exist. Setting up the viewers is fairly straight forward:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//Create main scene viewer</span>
&nbsp;
ref_ptr<span style="color: #000080;">&lt;</span>osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">CompositeViewer</span><span style="color: #000080;">&gt;</span> compositeViewer <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">CompositeViewer</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// create first view</span>
osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #000040;">*</span> v0 <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
v0<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setUpViewOnSingleScreen<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// add view to the composite viewer</span>
compositeViewer<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>addView<span style="color: #008000;">&#40;</span>v0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// do the same with the second view</span>
osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #000040;">*</span> v1 <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
v1<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setUpViewOnSingleScreen<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
compositeViewer<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>addView<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>And thats it. You also need to set the scene data for each of your views and a couple of things I&#8217;ve missed, but that is the basic idea. The problem with this method is it creates 2 graphics contexts, which in most cases will cause a performance hit.</p>
<h3>Single X Screen, Single Context</h3>
<p>I looked into this method because I use TwinView on my Linux desktop boxes. Of course, TwinView means that there is only 1 XScreen that spans both monitors. Therefore, the getNumScreens function above will return 1. I have also set up our projector setup to use TwinView, so I don&#8217;t need to have one lot of code for testing on the desktop and then do something completely different when using the projectors. The other benefit of this approach is you only create one graphics context.</p>
<p>First thing we do is get the dimensions of the screen, which will be the combination of both screens.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// get the total resolution of the xscreen</span>
osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">WindowingSystemInterface</span><span style="color: #000040;">*</span> wsi <span style="color: #000080;">=</span> osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">getWindowingSystemInterface</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">unsigned</span> width, height<span style="color: #008080;">;</span>
wsi<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getScreenResolution<span style="color: #008000;">&#40;</span>osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">ScreenIdentifier</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>, width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Once that is done we can create our (single) graphics context.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// create a context that spans the entire x screen</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>x <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>y <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>width <span style="color: #000080;">=</span> width<span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>height <span style="color: #000080;">=</span> height<span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>windowDecoration <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>doubleBuffer <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sharedContext <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
traits<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>overrideRedirect <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
osg<span style="color: #008080;">::</span><span style="color: #007788;">ref_ptr</span><span style="color: #000080;">&lt;</span>osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #000080;">&gt;</span> gc <span style="color: #000080;">=</span> osg<span style="color: #008080;">::</span><span style="color: #007788;">GraphicsContext</span><span style="color: #008080;">::</span><span style="color: #007788;">createGraphicsContext</span><span style="color: #008000;">&#40;</span>traits.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>The important one here is overrideRedirect. Some window managers (I&#8217;m looking at you Gnome) will redirect the position of your graphics context, so it won&#8217;t appear where you want it. The overrideRedirect option is kindof new, it does not exist in the version of OSG shipping with Ubuntu 8.10. Therefore, I am running the latest stable release (2.6) compiled from source.</p>
<p>To get the equivalent of 2 screens to draw on, we create 2 views like before. However, we have to set their viewport manually. Here we just make v0 use the left half of the screen, and v1 use the right half. Easy enough?</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">//first screen</span>
osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #000040;">*</span> v0 <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
osg<span style="color: #008080;">::</span><span style="color: #007788;">ref_ptr</span><span style="color: #000080;">&lt;</span>osg<span style="color: #008080;">::</span><span style="color: #007788;">Camera</span><span style="color: #000080;">&gt;</span> cam <span style="color: #000080;">=</span> v0<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getCamera<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
cam<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setGraphicsContext<span style="color: #008000;">&#40;</span>gc.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
cam<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, width<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span>, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
compositeViewer<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>addView<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">//second screen</span>
osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #000040;">*</span> v1 <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> osgViewer<span style="color: #008080;">::</span><span style="color: #007788;">View</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
osg<span style="color: #008080;">::</span><span style="color: #007788;">ref_ptr</span><span style="color: #000080;">&lt;</span>osg<span style="color: #008080;">::</span><span style="color: #007788;">Camera</span><span style="color: #000080;">&gt;</span> cam2 <span style="color: #000080;">=</span> v1<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>getCamera<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
cam2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setGraphicsContext<span style="color: #008000;">&#40;</span>gc.<span style="color: #007788;">get</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
cam2<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>setViewport<span style="color: #008000;">&#40;</span>width<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">0</span>, width<span style="color: #000040;">/</span><span style="color: #0000dd;">2</span>, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
compositeViewer<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>addView<span style="color: #008000;">&#40;</span>v1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>setViewport sets the viewport of the camera. The first 2 parameters are the position in the context&#8217;s window, the next 2 are the dimensions. So, each view gets width/2 for the width, and the second screen&#8217;s position is offset by half the screen width meaning it starts on the second monitor.</p>
<h2>Conclusion</h2>
<p>And there you have it. Two methods for dual screen using OpenSceneGraph. Looking at the code, it is fairly simple. However, after browsing the doxygen docs for OSG it was not at all obvious to me. Of course, the osg-users mailing list was a big help here. In fact, <a href="http://groups.google.com/group/osg-users/browse_thread/thread/684fb727c4ab6ee2/daaa720956ae17e1" target="_blank">here</a> is the thread from the mailing list</p>
<p>Cheers<br />
Michael</p>
<p><center><script type="text/javascript"><!--
google_ad_client = "pub-9376349336558898";
google_ad_slot = "0815367707";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.20papercups.net/programming/openscenegraph-dual-screens-twinview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

