<?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>taichino.com &#187; C/C++</title>
	<atom:link href="http://taichino.com/category/programming/cc/feed" rel="self" type="application/rss+xml" />
	<link>http://taichino.com</link>
	<description>永遠のネバーランド</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:33:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>OSXのdylibを作ってみる</title>
		<link>http://taichino.com/programming/2533</link>
		<comments>http://taichino.com/programming/2533#comments</comments>
		<pubDate>Sat, 07 Jan 2012 05:14:04 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[dylib]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2533</guid>
		<description><![CDATA[OSXで共有ライブラリを触ったことがなかったので、試しにdylibを作ってみました。Linuxだと.soですがOSXだと.dylibのようですね。フォーマットの差異については調べていません。Appleの「Dynamic Library Programming」というドキュメントのさわりだけ参考にしました。 まずdylib側のコードです。ただのHelloWorldですね。 /** * hello.c */ #include &#60;stdio.h&#62; void hello_dylib() { printf(&#34;hello dylib world!\n&#34;); } これをdylibにコンパイルします。-dynamiclibオプションを指定すると直接dylibを生成できます。簡単ですね。一応otoolでできたdylibを確認するとfiletypeがDYLIBになっています。 $ gcc -dynamiclib hello.c -o libhello.dylib $ ls hello.c libhello.dylib $ otool -vh libhello.dylib libhello.dylib: Mach header magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 ALL 0x00 DYLIB 9 1128 NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS できたdylibを実際に使ってみます。dlopen, [...]]]></description>
			<content:encoded><![CDATA[<p>OSXで共有ライブラリを触ったことがなかったので、試しにdylibを作ってみました。Linuxだと.soですがOSXだと.dylibのようですね。フォーマットの差異については調べていません。Appleの「<a href="http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html" title="Dynamic Library Programming" target="_blank">Dynamic Library Programming</a>」というドキュメントのさわりだけ参考にしました。</p>
<p><span id="more-2533"></span></p>
<p>まずdylib側のコードです。ただのHelloWorldですね。</p>
<pre class="brush: cpp; gutter: false; first-line: 1; highlight: []; html-script: false">
/**
 * hello.c
 */
#include &lt;stdio.h&gt;

void hello_dylib() {
    printf(&quot;hello dylib world!\n&quot;);
}
</pre>
<p>これをdylibにコンパイルします。-dynamiclibオプションを指定すると直接dylibを生成できます。簡単ですね。一応otoolでできたdylibを確認するとfiletypeがDYLIBになっています。</p>
<pre class="brush: bash; gutter: false; first-line: 1; highlight: []; html-script: false">
$ gcc -dynamiclib hello.c -o libhello.dylib
$ ls
hello.c libhello.dylib
$ otool -vh libhello.dylib
libhello.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB     9       1128   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS
</pre>
<p>できたdylibを実際に使ってみます。dlopen, dlsymでdylibをロード、関数ポインタを取得して実行しているだけです。</p>
<pre class="brush: cpp; gutter: false; first-line: 1; highlight: []; html-script: false">
/**
 * main.c
 */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;dlfcn.h&gt;

typedef void (*func)();

int main() {
    void* module = dlopen(&quot;libhello.dylib&quot;, RTLD_LAZY);
    if (!module) {
	exit(EXIT_FAILURE);
    }

    func f = dlsym(module, &quot;hello_dylib&quot;);
    if (dlerror()) {
	goto ERR;
    }

    printf(&quot;hello_dylib loaded \n&quot;);
    f();    // 実行

    dlclose(module);
    return 0;

  ERR:
    dlclose(module);
    exit(EXIT_FAILURE);
}
</pre>
<p>ビルドして実行します。</p>
<pre class="brush: bash; gutter: false; first-line: 1; highlight: []; html-script: false">
$ gcc main.c
$ ./a.out
hello_dylib loaded
hello dylib world!
</pre>
<p>上記ドキュメントを眺めると、きちんと使うには色々課題があるようですが、とりあえず雰囲気だけはつかめたので良しとします。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2533/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello OpenGL World</title>
		<link>http://taichino.com/programming/2149</link>
		<comments>http://taichino.com/programming/2149#comments</comments>
		<pubDate>Mon, 30 May 2011 16:43:32 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[opengl]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2149</guid>
		<description><![CDATA[最近読んでいる「C/C++へのLua組み込み実践」はSDLとOpenGLで作った仕組みをLuaから叩こうという内容なのですが、昔触ってたはずのOpenGLを綺麗さっぱり忘れていたので、少しまとめておきます。手元の環境はSnow Leopardです。 最初にOpenGLとGLUとGLUTの関連性についてです。汎用性を優先した結果、OpenGLはプリミティブなAPIしか提供していません。少し触った感じ3D空間上に直線的な図形を書くので精一杯という感じです。曲線やカメラ視点を扱う事すら、複数のAPIを組み合わせて頑張って実現する必要があります。そこでGLU(OpenGL Utility Library)というやや高レベルなAPIを提供してくれている補助ライブラリがあります。たいていの場合、標準で添付されているようで実質的にはOpenGLとGLUをまとめて扱っているケースが多いようです。 さてGLUでやや高レベルなAPIが使用できると言っても実際のアプリケーションを書くには全然APIが足りません。プラットフォームに依存したウィンドウやイベントなどの処理はOpenGL, GLUでは行う事ができないわけです。冒頭の「C/C++へのLua組み込み実践」がわざわざSDLを利用しているのはこの為で、OpenGLでは処理できないプラットフォームに依存した処理をさせています。ウィンドウやらイベントやらを扱えないとなると、Hello Worldなコード書こうにも、OpenGL以外の部分で学習コストが発生して大変です。そこでGLUT(OpenGL Utility Toolkit)があります。大雑把にいうとOpenGL用の簡易ウィンドウシステムなのですが、X WindowやOSX等、大抵のプラットフォームに対応しているので、このライブラリを使えばウィンドウシステムも含めた、完全なアプリケーションとしてクロスプラットフォームなソースコード互換を保てる事になります。手元のSnow Leopardの場合は標準でインストールされていました。 なのでデスクトップ環境で動作するアプリケーションを書くのであれば、GLUTまで含めたライブラリを使用しても互換性にはほぼ影響しないと考えて良さそうです。ただし iPhoneやAndroidで採用されている、モバイル端末用のOpenGLのサブセットなOpenGL ESの場合は現在のところGLUやGLUTは使用できません。OpenGL ESまで含めてのソースコード互換を考慮する場合は、注意する必要があります。蛇足ですが、標準OpenGL, GLU, GLUTが提供しているAPIは、それぞれgl, glu、glutと関数名にプリフィックスがつきます。 前置きが長くなりました。本エントリでは特にOpenGL ESは意識せず、GLU、GLUTを含めてコードを書こうと思います。 とりあえず2次元で四角を書いてみます。コードの雰囲気はつかめるかと思います。要はglBeginとglEndの間で色々書くという事です。点を１つずつ置いていって、その点が何を表すかをGL_LINE_LOOP等で指定します。四角１つ書くにも大変ですね。 #include &#34;glut /glut.h&#34; &#160; void display&#40;void&#41; &#123; glClear&#40;GL_COLOR_BUFFER_BIT&#41;; glColor3d&#40;0.0, 0.0, 0.0&#41;; glBegin&#40;GL_LINE_LOOP&#41;; glVertex2d&#40;-0.5, -0.5&#41;; glVertex2d&#40;-0.5, 0.5&#41;; glVertex2d&#40;0.5, 0.5&#41;; glVertex2d&#40;0.5, -0.5&#41;; glEnd&#40;&#41;; &#160; glFlush&#40;&#41;; &#125; &#160; int main&#40;int argc, char *argv&#91;&#93;&#41; &#123; glutInit&#40;&#38;argc, argv&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>最近読んでいる「<a href="http://www.amazon.co.jp/gp/product/4797361662/ref=as_li_ss_tl?ie=UTF8&#038;tag=taichino-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4797361662">C/C++へのLua組み込み実践</a><img src="http://www.assoc-amazon.jp/e/ir?t=&#038;l=as2&#038;o=9&#038;a=4797361662" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」はSDLとOpenGLで作った仕組みをLuaから叩こうという内容なのですが、昔触ってたはずのOpenGLを綺麗さっぱり忘れていたので、少しまとめておきます。手元の環境はSnow Leopardです。</p>
<p><span id="more-2149"></span></p>
<p>最初にOpenGLとGLUとGLUTの関連性についてです。汎用性を優先した結果、OpenGLはプリミティブなAPIしか提供していません。少し触った感じ3D空間上に直線的な図形を書くので精一杯という感じです。曲線やカメラ視点を扱う事すら、複数のAPIを組み合わせて頑張って実現する必要があります。そこでGLU(OpenGL Utility Library)というやや高レベルなAPIを提供してくれている補助ライブラリがあります。たいていの場合、標準で添付されているようで実質的にはOpenGLとGLUをまとめて扱っているケースが多いようです。</p>
<p>さてGLUでやや高レベルなAPIが使用できると言っても実際のアプリケーションを書くには全然APIが足りません。プラットフォームに依存したウィンドウやイベントなどの処理はOpenGL, GLUでは行う事ができないわけです。冒頭の「C/C++へのLua組み込み実践」がわざわざSDLを利用しているのはこの為で、OpenGLでは処理できないプラットフォームに依存した処理をさせています。ウィンドウやらイベントやらを扱えないとなると、Hello Worldなコード書こうにも、OpenGL以外の部分で学習コストが発生して大変です。そこでGLUT(OpenGL Utility Toolkit)があります。大雑把にいうとOpenGL用の簡易ウィンドウシステムなのですが、X WindowやOSX等、大抵のプラットフォームに対応しているので、このライブラリを使えばウィンドウシステムも含めた、完全なアプリケーションとしてクロスプラットフォームなソースコード互換を保てる事になります。手元のSnow Leopardの場合は標準でインストールされていました。</p>
<p>なのでデスクトップ環境で動作するアプリケーションを書くのであれば、GLUTまで含めたライブラリを使用しても互換性にはほぼ影響しないと考えて良さそうです。ただし iPhoneやAndroidで採用されている、モバイル端末用のOpenGLのサブセットなOpenGL ESの場合は現在のところGLUやGLUTは使用できません。OpenGL ESまで含めてのソースコード互換を考慮する場合は、注意する必要があります。蛇足ですが、標準OpenGL, GLU, GLUTが提供しているAPIは、それぞれgl, glu、glutと関数名にプリフィックスがつきます。</p>
<p>前置きが長くなりました。本エントリでは特にOpenGL ESは意識せず、GLU、GLUTを含めてコードを書こうと思います。</p>
<p>とりあえず2次元で四角を書いてみます。コードの雰囲気はつかめるかと思います。要はglBeginとglEndの間で色々書くという事です。点を１つずつ置いていって、その点が何を表すかをGL_LINE_LOOP等で指定します。四角１つ書くにも大変ですね。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;glut /glut.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> display<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glClear<span style="color: #008000;">&#40;</span>GL_COLOR_BUFFER_BIT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex2d<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">0.5</span>, <span style="color: #000040;">-</span><span style="color:#800080;">0.5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex2d<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">0.5</span>, <span style="color:#800080;">0.5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex2d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.5</span>, <span style="color:#800080;">0.5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex2d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.5</span>, <span style="color: #000040;">-</span><span style="color:#800080;">0.5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glFlush<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glutInit<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>argc, argv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutInitDisplayMode<span style="color: #008000;">&#40;</span>GLUT_RGBA<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutCreateWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;square&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutDisplayFunc<span style="color: #008000;">&#40;</span>display<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutMainLoop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>なおこのコードのコンパイルはosxの場合は以下のように行います。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">g++</span> main.cpp <span style="color: #660033;">-framework</span> GLUT <span style="color: #660033;">-framework</span> OpenGL</pre></div></div>

<p>実行結果です。無事に四角が描画されていますね。</p>
<p><a href="http://taichino.com/wp-content/uploads/2011/05/gl_sample1.png"><img src="http://taichino.com/wp-content/uploads/2011/05/gl_sample1-278x300.png" alt="" title="gl_sample1" width="278" height="300" class="alignnone size-medium wp-image-2153" /></a></p>
<p>さて、2次元の四角では面白く無いという事で、立方体を書いてみます。3次元な処理をする場合は、glMatrixModeにGL_PROJECTIONを指定して射影変換行列の設定をする必要があります。これを容易に行う為に使用するgluPerspectiveの各引数は正数しかとらないのですが、ここに0を指定してしまいハマりました。注意しましょう。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;glut/glut.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">void</span> display<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    glClear<span style="color: #008000;">&#40;</span>GL_COLOR_BUFFER_BIT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    gluLookAt<span style="color: #008000;">&#40;</span><span style="color:#800080;">3.0</span>, <span style="color:#800080;">4.0</span>, <span style="color:#800080;">5.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">static</span> GLfloat cube_points<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBegin<span style="color: #008000;">&#40;</span>GL_LINE_LOOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
    glVertex3fv<span style="color: #008000;">&#40;</span>cube_points<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glFlush<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> resize<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> w, <span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, w, h<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_PROJECTION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>w<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span>, <span style="color:#800080;">0.1</span>, <span style="color:#800080;">100.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_MODELVIEW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    glutInit<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>argc, argv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutInitDisplayMode<span style="color: #008000;">&#40;</span>GLUT_RGBA<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutCreateWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cube&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutDisplayFunc<span style="color: #008000;">&#40;</span>display<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutReshapeFunc<span style="color: #008000;">&#40;</span>resize<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
    glutMainLoop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><a href="http://taichino.com/wp-content/uploads/2011/05/gl_sample2.png"><img src="http://taichino.com/wp-content/uploads/2011/05/gl_sample2-278x300.png" alt="" title="gl_sample2" width="278" height="300" class="alignnone size-medium wp-image-2154" /></a></p>
<p>次に立方体にテクスチャを張ってみます。理想を言えばファイル名渡したらテクスチャオブジェクトが返ってくる位のAPIがあると嬉しいですが、実際はそういったAPIは全くなく、画像ファイルからピクセルデータを抜き出して、それをテクスチャとして登録という処理をする必要があります。画像ファイルからピクセルデータ抜き出すなんて処理はただでさえ面倒なのですが、クロスプラットフォームを考えるとさらに厄介で、ちょっとテクスチャ試したいだけで、libpngインストールすんの？みたいな事になります。</p>
<p>何とかならんのかと思って調べていると、<a href="http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040913">コチラのサイト</a>にビンゴな記事がありまして、今まで知らなかったのですがraw形式の画像を使えば単にファイル読むだけでピクセルデータが得られます。またアルファチャンネルにも対応しているので、実際のアプリケーションでは使えないという事もありません。素晴らしいです。生の画像データなのでファイルサイズは大きくなりますが、今時デスクトップでファイルサイズなんて気にする事でもないでしょう。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;glut/glut.h&quot;</span>
<span style="color: #339900;">#include &quot;stdio.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> TEXWIDTH  <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> TEXHEIGHT <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">static</span> GLuint textureID1<span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> GLuint textureID2<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> draw_cube<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">static</span> GLfloat vert<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.7</span>, <span style="color:#800080;">0.7</span>, <span style="color:#800080;">0.7</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , textureID1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_QUADS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#123;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , textureID2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_QUADS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#123;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
&nbsp;
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>	
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>	
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>	
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>	
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> display<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glClear<span style="color: #008000;">&#40;</span>GL_COLOR_BUFFER_BIT <span style="color: #000040;">|</span> GL_DEPTH_BUFFER_BIT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    gluLookAt<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">2.0</span>, <span style="color:#800080;">3.0</span>,
	      <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>,
	      <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    draw_cube<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glFlush<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> reshape<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> w, <span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, w, h<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_PROJECTION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>w<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span>, <span style="color:#800080;">0.1</span>, <span style="color:#800080;">100.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_MODELVIEW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
GLuint loadTexture<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>filename<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    GLuint texID<span style="color: #008080;">;</span>
    GLubyte texture<span style="color: #008000;">&#91;</span>TEXHEIGHT<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>TEXWIDTH<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">FILE</span> <span style="color: #000040;">*</span>fp <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>fp <span style="color: #000080;">=</span> <span style="color: #0000dd;">fopen</span><span style="color: #008000;">&#40;</span>filename, <span style="color: #FF0000;">&quot;rb&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">fread</span><span style="color: #008000;">&#40;</span>texture, <span style="color: #0000dd;">sizeof</span> texture, <span style="color: #0000dd;">1</span>, fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">fclose</span><span style="color: #008000;">&#40;</span>fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">perror</span><span style="color: #008000;">&#40;</span>filename<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    glEnable<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glGenTextures<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> , <span style="color: #000040;">&amp;</span>texID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , texID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glPixelStorei<span style="color: #008000;">&#40;</span>GL_UNPACK_ALIGNMENT, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexImage2D<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, <span style="color: #0000dd;">0</span>, GL_RGBA, TEXWIDTH, TEXHEIGHT, <span style="color: #0000dd;">0</span>,
		 GL_RGBA, GL_UNSIGNED_BYTE, texture<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
&nbsp;
    <span style="color: #0000ff;">return</span> texID<span style="color: #008080;">;</span>    
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_DEPTH_TEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    textureID1 <span style="color: #000080;">=</span> loadTexture<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;1.raw&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
    textureID2 <span style="color: #000080;">=</span> loadTexture<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;2.raw&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glutInit<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>argc, argv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutInitDisplayMode<span style="color: #008000;">&#40;</span>GLUT_RGBA <span style="color: #000040;">|</span> GLUT_DEPTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutCreateWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Texture Test&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutDisplayFunc<span style="color: #008000;">&#40;</span>display<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutReshapeFunc<span style="color: #008000;">&#40;</span>reshape<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutMainLoop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>なお有効なテクスチャを設定するglBindTextureは、glBeginとglEndの間で指定するとうまく動きません。僕はかなり長時間ハマりました。注意しましょう。</p>
<p><a href="http://taichino.com/wp-content/uploads/2011/05/gl_sample3.png"><img src="http://taichino.com/wp-content/uploads/2011/05/gl_sample3-280x300.png" alt="" title="gl_sample3" width="280" height="300" class="alignnone size-medium wp-image-2155" /></a></p>
<p>静止オブジェクトが作れるようになってきたので、次はカメラをいじりたいです。先ほど書いたオブジェクトの周りをグルグル歩く感じのコードが以下になります。実際はカメラオブジェクトみたいなものは存在せず、カメラの位置までモデルビュー座標系を移動させてから、各オブジェクトを描画しているだけです。慣れるまではX,Y,Zの各座標軸を描画しておくと何かと理解が進みやすい気がします。以下のコードでは矢印キーが押されて視点が移動するたびに、glutPostRedisplayで再描画要求を投げています。それによってdisplay関数が繰り返し呼ばれます。何となくそれっぽい感じになってきました。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;stdio.h&quot;</span>
<span style="color: #339900;">#include &quot;math.h&quot;</span>
<span style="color: #339900;">#include &quot;glut/glut.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> TEXWIDTH <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> TEXHEIGHT <span style="color: #000080;">=</span> <span style="color: #0000dd;">64</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">double</span> s_angle <span style="color: #000080;">=</span> <span style="color: #0000dd;">90</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">double</span> s_posX <span style="color: #000080;">=</span> <span style="color:#800080;">0.0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> <span style="color: #0000ff;">double</span> s_posZ <span style="color: #000080;">=</span> <span style="color:#800080;">0.0</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> GLuint textureID1<span style="color: #008080;">;</span>
<span style="color: #0000ff;">static</span> GLuint textureID2<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> specialKeyboard<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> key, <span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">double</span> radian <span style="color: #000080;">=</span> <span style="color: #000040;">-</span>s_angle <span style="color: #000040;">*</span> M_PI <span style="color: #000040;">/</span> <span style="color:#800080;">180.0</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 右手系</span>
    <span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>key<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">101</span><span style="color: #008080;">:</span> <span style="color: #666666;">// up</span>
    <span style="color: #008000;">&#123;</span>
	s_posX <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">sin</span><span style="color: #008000;">&#40;</span>radian<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color:#800080;">0.1</span><span style="color: #008080;">;</span>
	s_posZ <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">cos</span><span style="color: #008000;">&#40;</span>radian<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color:#800080;">0.1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">103</span><span style="color: #008080;">:</span> <span style="color: #666666;">// down</span>
    <span style="color: #008000;">&#123;</span>
    	s_posX <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">sin</span><span style="color: #008000;">&#40;</span>radian<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color:#800080;">0.1</span><span style="color: #008080;">;</span>
    	s_posZ <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">cos</span><span style="color: #008000;">&#40;</span>radian<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color:#800080;">0.1</span><span style="color: #008080;">;</span>
    	<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">100</span><span style="color: #008080;">:</span> <span style="color: #666666;">// left</span>
	s_angle <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #0000dd;">102</span><span style="color: #008080;">:</span> <span style="color: #666666;">// right</span>
	s_angle <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    s_angle <span style="color: #000080;">=</span> <span style="color: #0000ff;">int</span><span style="color: #008000;">&#40;</span>s_angle<span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">360</span><span style="color: #008080;">;</span>
&nbsp;
    glutPostRedisplay<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> draw_cube<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">static</span> GLfloat vert<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span>
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
	<span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#125;</span>,
    <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , textureID1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_QUADS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#123;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #008000;">&#125;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , textureID2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_QUADS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#123;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTexCoord2d<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">7</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">6</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>		
	glVertex3fv<span style="color: #008000;">&#40;</span>vert<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> draw_axes<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// draw axes</span>
    glBegin<span style="color: #008000;">&#40;</span>GL_LINES<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#123;</span>
    	<span style="color: #666666;">// x-axis</span>
    	glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">10.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    	<span style="color: #666666;">// y-axis</span>
    	glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">10.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    	<span style="color: #666666;">// z-axis</span>
    	glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	glVertex3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0</span>, <span style="color:#800080;">0.0</span>, <span style="color:#800080;">10.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    	glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>	
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> draw_field<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">double</span> size <span style="color: #000080;">=</span> <span style="color:#800080;">5.0</span><span style="color: #008080;">;</span>
    glColor3d<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.5</span>, <span style="color:#800080;">0.5</span>, <span style="color:#800080;">0.5</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> panelNum <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">double</span> len <span style="color: #000080;">=</span> size <span style="color: #000040;">/</span> panelNum<span style="color: #008080;">;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> panelNum<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> panelNum<span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    	    <span style="color: #0000ff;">double</span> x <span style="color: #000080;">=</span> len <span style="color: #000040;">*</span> i <span style="color: #000040;">-</span> size <span style="color: #000040;">/</span> <span style="color:#800080;">2.0</span><span style="color: #008080;">;</span>
    	    <span style="color: #0000ff;">double</span> z <span style="color: #000080;">=</span> len <span style="color: #000040;">*</span> j <span style="color: #000040;">-</span> size <span style="color: #000040;">/</span> <span style="color:#800080;">2.0</span><span style="color: #008080;">;</span>
    	    <span style="color: #0000ff;">int</span> mode <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>i <span style="color: #000040;">+</span> j<span style="color: #008000;">&#41;</span> <span style="color: #000040;">%</span> <span style="color: #0000dd;">2</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #008080;">?</span> GL_LINES <span style="color: #008080;">:</span> GL_POLYGON<span style="color: #008080;">;</span>
    	    glBegin<span style="color: #008000;">&#40;</span>mode<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	    glVertex3d<span style="color: #008000;">&#40;</span>x, <span style="color: #0000dd;">0</span>, z<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	    glVertex3d<span style="color: #008000;">&#40;</span>x <span style="color: #000040;">+</span> len, <span style="color: #0000dd;">0</span>, z<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	    glVertex3d<span style="color: #008000;">&#40;</span>x <span style="color: #000040;">+</span> len, <span style="color: #0000dd;">0</span>, z <span style="color: #000040;">+</span> len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	    glVertex3d<span style="color: #008000;">&#40;</span>x, <span style="color: #0000dd;">0</span>, z <span style="color: #000040;">+</span> len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	    glEnd<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    	<span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> display<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glClear<span style="color: #008000;">&#40;</span>GL_COLOR_BUFFER_BIT <span style="color: #000040;">|</span> GL_DEPTH_BUFFER_BIT<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_MODELVIEW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glRotated<span style="color: #008000;">&#40;</span>s_angle, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
    glTranslated<span style="color: #008000;">&#40;</span>s_posX, <span style="color: #000040;">-</span><span style="color:#800080;">0.1</span>, s_posZ<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    draw_axes<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    draw_cube<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    draw_field<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glFlush<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> reshape<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> w, <span style="color: #0000ff;">int</span> h<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, w, h<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glMatrixMode<span style="color: #008000;">&#40;</span>GL_PROJECTION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>w<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>h<span style="color: #008000;">&#41;</span>, <span style="color:#800080;">0.1</span>, <span style="color:#800080;">100.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
GLuint loadTexture<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>filename<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    GLuint texID<span style="color: #008080;">;</span>
    GLubyte texture<span style="color: #008000;">&#91;</span>TEXHEIGHT<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>TEXWIDTH<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">FILE</span> <span style="color: #000040;">*</span>fp <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>fp <span style="color: #000080;">=</span> <span style="color: #0000dd;">fopen</span><span style="color: #008000;">&#40;</span>filename, <span style="color: #FF0000;">&quot;rb&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">fread</span><span style="color: #008000;">&#40;</span>texture, <span style="color: #0000dd;">sizeof</span> texture, <span style="color: #0000dd;">1</span>, fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">fclose</span><span style="color: #008000;">&#40;</span>fp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">perror</span><span style="color: #008000;">&#40;</span>filename<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    glEnable<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glGenTextures<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span> , <span style="color: #000040;">&amp;</span>texID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D , texID<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glPixelStorei<span style="color: #008000;">&#40;</span>GL_UNPACK_ALIGNMENT, <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexImage2D<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, <span style="color: #0000dd;">0</span>, GL_RGBA, TEXWIDTH, TEXHEIGHT, <span style="color: #0000dd;">0</span>,
		 GL_RGBA, GL_UNSIGNED_BYTE, texture<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
&nbsp;
    <span style="color: #0000ff;">return</span> texID<span style="color: #008080;">;</span>    
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span>, <span style="color:#800080;">1.0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_DEPTH_TEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_LIGHTING<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_LIGHT0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_COLOR_MATERIAL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glEnable<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    textureID1 <span style="color: #000080;">=</span> loadTexture<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;1.raw&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
    textureID2 <span style="color: #000080;">=</span> loadTexture<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;2.raw&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span> <span style="color: #000040;">**</span>argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    glutInit<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>argc, argv<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutInitDisplayMode<span style="color: #008000;">&#40;</span>GLUT_RGBA <span style="color: #000040;">|</span> GLUT_DEPTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutCreateWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;walk through test&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutDisplayFunc<span style="color: #008000;">&#40;</span>display<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutReshapeFunc<span style="color: #008000;">&#40;</span>reshape<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    glutSpecialFunc<span style="color: #008000;">&#40;</span>specialKeyboard<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>    
&nbsp;
    init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    glutMainLoop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><a href="http://taichino.com/wp-content/uploads/2011/05/gl_sample4.png"><img src="http://taichino.com/wp-content/uploads/2011/05/gl_sample4-277x300.png" alt="" title="gl_sample4" width="277" height="300" class="alignnone size-medium wp-image-2156" /></a><br />
とりあえずOpenGLのコードが書けないまでも、読めるようにはなったかなという感じです。あとあまりよく調べていませんが、日本語の文字列描画はプラットフォームに依存したコードを書く必要がありそうです。なのでGLUT使っとけば不自由しないという訳ではなさそうです。ちなみにSDLを使うと日本語フォントの周辺は面倒見てくれるので、作るものによって何と組み合わせて使うかを選んでいく必要がありそうです。</p>
<p>参考資料として<a href="http://marina.sys.wakayama-u.ac.jp/~tokoi/?blogcategory=OpenGL">コチラの研究室のページ</a>が大変わかりやすくてオススメです。その他はヘッダとリファレンスが結局は早そうな雰囲気です。
</pre>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2149/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello SDL World</title>
		<link>http://taichino.com/programming/2136</link>
		<comments>http://taichino.com/programming/2136#comments</comments>
		<pubDate>Sun, 27 Feb 2011 23:45:36 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2136</guid>
		<description><![CDATA[ここ数日、「C/C++へのLua組込み実践」を読んでいるんですけど、サンプルでSDLが使われています。解説はLua中心とはいえ全く知らない状態では読む気にならないので、ちょっと触ってみる事にしました。環境はOSXです。 インストールは特に変わった事はなく普通にmake installするだけです。これでlibSDLmain.a libSDL.aがインストールされるのでリンクして使えばいい感じですね。 $ wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz $ tar zxvf SDL-1.2.14.tar.gz $ cd SDL-1.2.14 $ ./configure $ make $ sudo make install そして以下がハローワールド的なサンプルです。四角とビットマップを描画しています。冒頭の画像はこのサンプルを実行した時のものになります。Eventループの書き方がやや特徴的な感じがしますが、それ以外は良くある雰囲気のコードですね。 #include &#34;SDL.h&#34; #include &#34;stdio.h&#34; &#160; int main&#40;int argc,char *argv&#91;&#93;&#41; &#123; if &#40;SDL_Init&#40;SDL_INIT_VIDEO&#41; &#60; 0&#41; &#123; fprintf&#40;stderr,&#34;failed to init SDL.\n&#34;&#41;; exit&#40;1&#41;; &#125; &#160; SDL_Surface *screen = SDL_SetVideoMode&#40;520, 350, 32, SDL_SWSURFACE&#41;; if &#40;!screen&#41; &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>ここ数日、「<a href="http://www.amazon.co.jp/gp/product/4797348550?ie=UTF8&#038;tag=taichino-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4797348550">C/C++へのLua組込み実践</a><img src="http://www.assoc-amazon.jp/e/ir?t=taichino-22&#038;l=as2&#038;o=9&#038;a=4797348550" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」を読んでいるんですけど、サンプルでSDLが使われています。解説はLua中心とはいえ全く知らない状態では読む気にならないので、ちょっと触ってみる事にしました。環境はOSXです。</p>
<p><a href="http://taichino.com/wp-content/uploads/2011/02/sdltest.png"><img src="http://taichino.com/wp-content/uploads/2011/02/sdltest-300x215.png" alt="screenshot of hello sdl sample" title="sdltest" width="300" height="215" class="alignnone size-medium wp-image-2145" /></a><br />
<span id="more-2136"></span></p>
<p>インストールは特に変わった事はなく普通にmake installするだけです。これでlibSDLmain.a libSDL.aがインストールされるのでリンクして使えばいい感じですね。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.libsdl.org<span style="color: #000000; font-weight: bold;">/</span>release<span style="color: #000000; font-weight: bold;">/</span>SDL-1.2.14.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> zxvf SDL-1.2.14.tar.gz
$ <span style="color: #7a0874; font-weight: bold;">cd</span> SDL-1.2.14
$ .<span style="color: #000000; font-weight: bold;">/</span>configure
$ <span style="color: #c20cb9; font-weight: bold;">make</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>そして以下がハローワールド的なサンプルです。四角とビットマップを描画しています。冒頭の画像はこのサンプルを実行した時のものになります。Eventループの書き方がやや特徴的な感じがしますが、それ以外は良くある雰囲気のコードですね。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;SDL.h&quot;</span>
<span style="color: #339900;">#include &quot;stdio.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span>argv<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>SDL_Init<span style="color: #008000;">&#40;</span>SDL_INIT_VIDEO<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">fprintf</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">stderr</span>,<span style="color: #FF0000;">&quot;failed to init SDL.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        <span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    SDL_Surface <span style="color: #000040;">*</span>screen <span style="color: #000080;">=</span> SDL_SetVideoMode<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">520</span>, <span style="color: #0000dd;">350</span>, <span style="color: #0000dd;">32</span>, SDL_SWSURFACE<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>screen<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">fprintf</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">stderr</span>,<span style="color: #FF0000;">&quot;failed to get screen.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SDL_Quit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">exit</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// draw bitmap</span>
    SDL_Surface <span style="color: #000040;">*</span>img <span style="color: #000080;">=</span> SDL_LoadBMP<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;hellosdl.bmp&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>img<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	SDL_Rect dst <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">10</span>, <span style="color: #0000dd;">30</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
	SDL_BlitSurface<span style="color: #008000;">&#40;</span>img, <span style="color: #0000ff;">NULL</span>, screen, <span style="color: #000040;">&amp;</span>dst<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SDL_FreeSurface<span style="color: #008000;">&#40;</span>img<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// draw rect</span>
    SDL_Rect rect <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">10</span>, <span style="color: #0000dd;">10</span>, <span style="color: #0000dd;">100</span>, <span style="color: #0000dd;">100</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
    SDL_FillRect<span style="color: #008000;">&#40;</span>screen, <span style="color: #000040;">&amp;</span>rect, <span style="color: #208080;">0x0000FF00</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// update screen</span>
    SDL_UpdateRect<span style="color: #008000;">&#40;</span>screen, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// event loop</span>
    <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	SDL_Event evt <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>	    
	<span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>SDL_PollEvent<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>evt<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	    <span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>evt.<span style="color: #007788;">type</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	    <span style="color: #0000ff;">case</span> SDL_QUIT<span style="color: #008080;">:</span>
		<span style="color: #0000ff;">goto</span> EXIT<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	    <span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
  EXIT<span style="color: #008080;">:</span>
    SDL_Quit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>ビルドが少し変わっていて、sdl-configコマンドを使って以下のように行うようです。
</pre>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">g++</span> main.cpp <span style="color: #000000; font-weight: bold;">`</span>sdl-config <span style="color: #660033;">--cflags</span> --libs<span style="color: #000000; font-weight: bold;">`</span></pre></div></div>

<p>あんまり把握してないんですけど、WindowとかEventとかプラットフォームに依存した部分をSDLで書いとけばクロスプラットフォームなコードが書けるらしいよっていう認識です。</p>
<p>ざっくりとしたチュートリアルっぽいドキュメントは<a href="http://www.libsdl.org/intro.jp/toc.html">コレ</a>で、リファレンスは<a href="http://www.libsdl.org/docs/html/index.html">コレ</a>。あんまりドキュメントは整備されていないので、ヘッダを読むのが早いかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2136/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>いつの間にかgccが標準ライブラリは自動でリンクするようになってた</title>
		<link>http://taichino.com/programming/2103</link>
		<comments>http://taichino.com/programming/2103#comments</comments>
		<pubDate>Sat, 22 Jan 2011 09:38:37 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[libxml]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2103</guid>
		<description><![CDATA[さっきcmakeの使い方を覚えている最中に、cmakeでサーチパスとかリンクするライブラリの追加をどうするかを調べる為に、サーチパスとライブラリの追加設定が必要な小さなコード書こうということでsqrtとか書いたんですけど、今やmathとかの標準ライブラリは自動でリンクされるっていうので、なんか無いかなんか無いかってことで、そうだlibxmlがあったと思ったけど使い方覚えてなくて、cmakeの為のサンプルを書くのに1hもかかったので、これからC++で上記の条件にあてはまるコードを要求された時に、にやりとしながらこのコードを出そうという事でエントリ。 #include &#60;iostream&#62; #include &#60;libxml /xmlreader.h&#62; &#160; using namespace std; &#160; int main&#40;&#41; &#123; const char* xml = &#34;&#60;doc&#62;&#60;lang&#62;python&#60;/lang&#62;&#60;lang&#62;c++&#60;/lang&#62;&#60;/doc&#62;&#34;; xmlDocPtr doc = xmlParseMemory&#40;xml, strlen&#40;xml&#41;&#41;; if &#40;doc&#41; &#123; xmlNodePtr cur = xmlDocGetRootElement&#40;doc&#41;; do &#123; if &#40;strcmp&#40;&#40;char*&#41;cur-&#62;name, &#34;doc&#34;&#41; == 0&#41; &#123; cur = cur-&#62;children; &#125; else if &#40;strcmp&#40;&#40;char*&#41;cur-&#62;name, &#34;lang&#34;&#41; == 0&#41; &#123; cout &#60; &#60; cur-&#62;name &#60; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://taichino.com/memo/2091">さっきcmakeの使い方を覚えている最中</a>に、cmakeでサーチパスとかリンクするライブラリの追加をどうするかを調べる為に、サーチパスとライブラリの追加設定が必要な小さなコード書こうということでsqrtとか書いたんですけど、今やmathとかの標準ライブラリは自動でリンクされるっていうので、なんか無いかなんか無いかってことで、そうだlibxmlがあったと思ったけど使い方覚えてなくて、cmakeの為のサンプルを書くのに1hもかかったので、これからC++で上記の条件にあてはまるコードを要求された時に、にやりとしながらこのコードを出そうという事でエントリ。</p>
<p><span id="more-2103"></span></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;libxml /xmlreader.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> xml <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;&lt;doc&gt;&lt;lang&gt;python&lt;/lang&gt;&lt;lang&gt;c++&lt;/lang&gt;&lt;/doc&gt;&quot;</span><span style="color: #008080;">;</span>
    xmlDocPtr doc <span style="color: #000080;">=</span> xmlParseMemory<span style="color: #008000;">&#40;</span>xml, <span style="color: #0000dd;">strlen</span><span style="color: #008000;">&#40;</span>xml<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>doc<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	xmlNodePtr cur <span style="color: #000080;">=</span> xmlDocGetRootElement<span style="color: #008000;">&#40;</span>doc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">do</span> <span style="color: #008000;">&#123;</span>
	    <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">strcmp</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>name, <span style="color: #FF0000;">&quot;doc&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		cur <span style="color: #000080;">=</span> cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>children<span style="color: #008080;">;</span>
	    <span style="color: #008000;">&#125;</span>
	    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #0000dd;">strcmp</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>name, <span style="color: #FF0000;">&quot;lang&quot;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;</span> <span style="color: #000080;">&lt;</span> cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>name <span style="color: #000080;">&lt;</span> <span style="color: #000080;">&lt;</span> <span style="color: #FF0000;">&quot;:&quot;</span> <span style="color: #000080;">&lt;&lt;</span> cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>children<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>content <span style="color: #000080;">&lt;</span> <span style="color: #000080;">&lt;</span> endl<span style="color: #008080;">;</span>
		cur <span style="color: #000080;">=</span> cur<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span>
	    <span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span> <span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>cur<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	xmlFreeDoc<span style="color: #008000;">&#40;</span>doc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #000080;">&lt;</span><span style="color: #000040;">/</span>libxml<span style="color: #000080;">&gt;&lt;</span><span style="color: #000040;">/</span>iostream<span style="color: #000080;">&gt;</span></pre></div></div>

<p>ちなみに上記を処理するCMakeFileLists.txtは以下になります。</p>

<div class="wp_syntax"><div class="code"><pre class="cmake" style="font-family:monospace;"><span style="color: #1f3f81; font-style: bold;">CMAKE_MINIMUM_REQUIRED</span><span style="color: #197d8b;">(</span><span style="color: #077807; font-sytle: italic;">VERSION</span> 2.6<span style="color: #197d8b;">)</span>
&nbsp;
<span style="color: #1f3f81; font-style: bold;">PROJECT</span><span style="color: #197d8b;">(</span>project2<span style="color: #197d8b;">)</span>
&nbsp;
<span style="color: #1f3f81; font-style: bold;">INCLUDE_DIRECTORIES</span><span style="color: #197d8b;">(</span>/usr/include/libxml2<span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">ADD_DEFINITIONS</span><span style="color: #197d8b;">(</span>-g -O2 -Wall<span style="color: #197d8b;">)</span>
&nbsp;
<span style="color: #1f3f81; font-style: bold;">ADD_EXECUTABLE</span><span style="color: #197d8b;">(</span>proj2 main.cpp<span style="color: #197d8b;">)</span>
<span style="color: #1f3f81; font-style: bold;">TARGET_LINK_LIBRARIES</span><span style="color: #197d8b;">(</span>proj2 xml2<span style="color: #197d8b;">)</span></pre></div></div>

<p>こんな事に時間取られてる場合じゃないんですけど！</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2103/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++で木構造扱う軽めなクラス書いた</title>
		<link>http://taichino.com/programming/2081</link>
		<comments>http://taichino.com/programming/2081#comments</comments>
		<pubDate>Sun, 16 Jan 2011 18:15:25 +0000</pubDate>
		<dc:creator>taichino</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[microtree]]></category>

		<guid isPermaLink="false">http://taichino.com/?p=2081</guid>
		<description><![CDATA[picojsonを見ていて最近のC++のライブラリはこんなにカッコいいのかと思って、僕もヘッダオンリーのC++コードを何か書きたくなったのですが、ちょうどC++で木構造を扱えるライブラリがなかなか見つからなかったので軽い感じのクラスを書きました。コードはgithubにあります。名前はpicojsonに影響を受けまくってmicrotreeにしました。 使い方は以下のようなノリになります。STLにあわせてテンプレートな感じにしようかとも思ったのですが、Pythonのnetworkxというグラフを扱うライブラリが使いやすいので、それに似せる感じで各ノードがキーとプロパティマップを持つようにしました。 #include &#34;microtree.h&#34; &#160; using namespace std; using namespace microtree; &#160; int main&#40;int argc, char** argv&#41; &#123; tree t; tree::iterator head = t.begin&#40;&#41;; tree::iterator lang, os, lib, trash; tree::iterator cpp, python, as, win, japanese; &#160; // add some nodes lang = t.insert&#40;head, &#34;Language&#34;&#41;; os = t.insert&#40;lang, &#34;OperatingSystem&#34;&#41;; lib = t.insert&#40;os, &#34;Library&#34;&#41;; trash = t.insert&#40;lib, [...]]]></description>
			<content:encoded><![CDATA[<p>picojsonを見ていて最近のC++のライブラリはこんなにカッコいいのかと思って、僕もヘッダオンリーのC++コードを何か書きたくなったのですが、ちょうどC++で木構造を扱えるライブラリがなかなか見つからなかったので軽い感じのクラスを書きました。コードは<a href="https://github.com/taichino/microtree">github</a>にあります。名前はpicojsonに影響を受けまくってmicrotreeにしました。</p>
<p><span id="more-2081"></span></p>
<p>使い方は以下のようなノリになります。STLにあわせてテンプレートな感じにしようかとも思ったのですが、Pythonの<a href="http://networkx.lanl.gov/">networkx</a>というグラフを扱うライブラリが使いやすいので、それに似せる感じで各ノードがキーとプロパティマップを持つようにしました。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &quot;microtree.h&quot;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> microtree<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    tree t<span style="color: #008080;">;</span>
    tree<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> head <span style="color: #000080;">=</span> t.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    tree<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> lang, os, lib, trash<span style="color: #008080;">;</span>
    tree<span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> cpp, python, as, win, japanese<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// add some nodes</span>
    lang  <span style="color: #000080;">=</span> t.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>head, <span style="color: #FF0000;">&quot;Language&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    os    <span style="color: #000080;">=</span> t.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>lang, <span style="color: #FF0000;">&quot;OperatingSystem&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    lib   <span style="color: #000080;">=</span> t.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>os, <span style="color: #FF0000;">&quot;Library&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    trash <span style="color: #000080;">=</span> t.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>lib, <span style="color: #FF0000;">&quot;Trash&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    cpp <span style="color: #000080;">=</span> t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lang, <span style="color: #FF0000;">&quot;C++&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    python <span style="color: #000080;">=</span> t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lang, <span style="color: #FF0000;">&quot;Python&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    as <span style="color: #000080;">=</span> t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lang, <span style="color: #FF0000;">&quot;ActionScript&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    japanese <span style="color: #000080;">=</span> t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lang, <span style="color: #FF0000;">&quot;Japanese&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>os, <span style="color: #FF0000;">&quot;mac&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>os, <span style="color: #FF0000;">&quot;linux&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    win <span style="color: #000080;">=</span> t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>os, <span style="color: #FF0000;">&quot;windows&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lib, <span style="color: #FF0000;">&quot;Django&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">add_child</span><span style="color: #008000;">&#40;</span>lib, <span style="color: #FF0000;">&quot;OpenCV&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// add some props to nodes</span>
    cpp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;author&quot;</span>, string<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Stroustrup&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    cpp<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;birth&quot;</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1980</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    python<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;author&quot;</span>, string<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Guido&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    python<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;birth&quot;</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1992</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    as<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;author&quot;</span>, string<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Adobe&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    as<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>props.<span style="color: #007788;">insert</span><span style="color: #008000;">&#40;</span>make_pair<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;birth&quot;</span>, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1998</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// node walk</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>microtree<span style="color: #008080;">::</span><span style="color: #007788;">tree</span><span style="color: #008080;">::</span><span style="color: #007788;">iterator</span> itr <span style="color: #000080;">=</span> t.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> itr <span style="color: #000040;">!</span><span style="color: #000080;">=</span> t.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>itr<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	<span style="color: #666666;">// do something</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #666666;">// dump tree</span>
    t.<span style="color: #007788;">dump</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// erase some nodes</span>
    t.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>lib<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>cpp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// move node</span>
    t.<span style="color: #007788;">move</span><span style="color: #008000;">&#40;</span>trash, win, tree<span style="color: #008080;">::</span><span style="color: #007788;">TO_FIRSTCHILD</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">move</span><span style="color: #008000;">&#40;</span>trash, japanese, tree<span style="color: #008080;">::</span><span style="color: #007788;">TO_FIRSTCHILD</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">move</span><span style="color: #008000;">&#40;</span>trash, as, tree<span style="color: #008080;">::</span><span style="color: #007788;">TO_LASTCHILD</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    win <span style="color: #000080;">=</span> t.<span style="color: #007788;">find</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;windows&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    t.<span style="color: #007788;">erase</span><span style="color: #008000;">&#40;</span>win<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// dump again</span>
    t.<span style="color: #007788;">dump</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>適当にノード足したり移動したりしてダンプしてます。上記のプログラムを実行すると以下のような出力が得られます。プロパティマップを持っているとわざわざノード用に構造体なりクラスなりを作る必要がないので、JSONやXMLを読んでそのまま木を作りたいなんていう用途に結構使えるんじゃないかと思っています。</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">=== Tree Dump ===
Language  {}
  C++  {&quot;author&quot;:&quot;Stroustrup&quot;,&quot;birth&quot;:1980.000000}
  Python  {&quot;author&quot;:&quot;Guido&quot;,&quot;birth&quot;:1992.000000}
  ActionScript  {&quot;author&quot;:&quot;Adobe&quot;,&quot;birth&quot;:1998.000000}
  Japanese  {}
OperatingSystem  {}
  mac  {}
  linux  {}
  windows  {}
Library  {}
  Django  {}
  OpenCV  {}
Trash  {}
&nbsp;
=== Tree Dump ===
Language  {}
  Python  {&quot;author&quot;:&quot;Guido&quot;,&quot;birth&quot;:1992.000000}
OperatingSystem  {}
  mac  {}
  linux  {}
Trash  {}
  Japanese  {}
  ActionScript  {&quot;author&quot;:&quot;Adobe&quot;,&quot;birth&quot;:1998.000000}</pre></div></div>

<p>なおノードは以下のように定義されていて、プロパティマップの部分にpicojson::valueを使わせてもらっています。なので今のところpicojson.hに依存してます。気が向いたらちゃんとした独立クラスを作るかもです。</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> treenode <span style="color: #008000;">&#123;</span>
  <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    <span style="color: #0000ff;">typedef</span> picojson<span style="color: #008080;">::</span><span style="color: #007788;">object</span> map<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    treenode<span style="color: #000040;">*</span> parent<span style="color: #008080;">;</span>
    treenode<span style="color: #000040;">*</span> first_child<span style="color: #008080;">;</span>
    treenode<span style="color: #000040;">*</span> last_child<span style="color: #008080;">;</span>
    treenode<span style="color: #000040;">*</span> prev_sibling<span style="color: #008080;">;</span>
    treenode<span style="color: #000040;">*</span> next_sibling<span style="color: #008080;">;</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">*</span> key<span style="color: #008080;">;</span>
    map props<span style="color: #008080;">;</span>
  <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
    treenode<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    treenode<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">string</span><span style="color: #000040;">&amp;</span> nodeid<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    ~treenode<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">int</span> depth<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>後は今のところイテレータがdfsしか無いのでbfsなどのバリエーションを足そうかなと言ったところです。あとやっぱテンプレート使ってキーをジェネリックにした方が良いのかどうかで迷っています。</p>
]]></content:encoded>
			<wfw:commentRss>http://taichino.com/programming/2081/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

