<?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>鬼の领地 &#187; C/C++/C#</title>
	<atom:link href="http://blog.upsuper.org/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.upsuper.org</link>
	<description>the place where there are some ghost appearing...</description>
	<lastBuildDate>Wed, 19 Oct 2011 13:21:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>今天写了个小小的 vc-fix</title>
		<link>http://blog.upsuper.org/write-a-little-vc-fix-today/</link>
		<comments>http://blog.upsuper.org/write-a-little-vc-fix-today/#comments</comments>
		<pubDate>Sun, 21 Mar 2010 02:39:51 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[兼容性]]></category>
		<category><![CDATA[微软]]></category>
		<category><![CDATA[标准化]]></category>
		<category><![CDATA[编译器]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1119</guid>
		<description><![CDATA[我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库，并且要求使用运算符重载。因为原来用 C 写过，这次写，思路上没有太大问题，不过全部程序被我 C++ 化了，代码看过去很诡异……呃…… 我自己的机子上，自然使用 g++ 编译，不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下，发现好几个错误和无数警告……其实也是我意料之中的。 其中我觉得最讨厌的莫过于 for 循环的循环变量不被视为 for 循环的局部变量这一点，导致大量变量被其认为是重复定义，这个是 VC6 和标准就语言上相去最远的问题了……不想每个都去改，麻烦死了。 在网上一找，还真找到一个简单的方法： 1 #define for if(0) ; else for 其实我也不知道这个是什么机理，不过真的很管用！ 另外一个就是 VC6 的标准库中没有 max 和 min 函数，这个也很囧，于是也自己写了一个。 以前做网页的时候经常写 ie-fix.css 文件，今天我弄 VC6 遇到这些问题，于是我也写了个 vc-fix.h 文件。M$ 真是一个需要 fix 的公司，什么时候出一个 m$-fix.com 好了…… 最后贴出我的 vc-fix.h，主要解决 VC6 下 [...]]]></description>
			<content:encoded><![CDATA[<p>我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库，并且要求使用运算符重载。因为原来用 C 写过，这次写，思路上没有太大问题，不过全部程序被我 C++ 化了，代码看过去很诡异……呃……</p>
<p>我自己的机子上，自然使用 g++ 编译，不过我猜老师会要求 VC6 能够编译……我就用<a href="http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/">上次安装的 VC6</a> 编译了一下，发现好几个错误和无数警告……其实也是我意料之中的。<br />
<span id="more-1119"></span><br />
其中我觉得最讨厌的莫过于 for 循环的循环变量不被视为 for 循环的局部变量这一点，导致大量变量被其认为是重复定义，这个是 VC6 和标准就语言上相去最远的问题了……不想每个都去改，麻烦死了。</p>
<p>在网上一找，还真找到一个简单的方法：</p>

<div class="wp_codebox"><table><tr id="p11194"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1119code4"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#define for if(0) ; else for</span></pre></td></tr></table></div>

<p>其实我也不知道这个是什么机理，不过真的很管用！</p>
<p>另外一个就是 VC6 的标准库中没有 max 和 min 函数，这个也很囧，于是也自己写了一个。</p>
<p>以前做网页的时候经常写 ie-fix.css 文件，今天我弄 VC6 遇到这些问题，于是我也写了个 vc-fix.h 文件。M$ 真是一个需要 fix 的公司，什么时候出一个 m$-fix.com 好了……</p>
<p>最后贴出我的 vc-fix.h，主要解决 VC6 下 for 循环变量的问题和 max、min 函数未定义的问题：</p>

<div class="wp_codebox"><table><tr id="p11195"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p1119code5"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#ifndef _H_UPSUPER_VC_FIX_</span>
<span style="color: #339900;">#define _H_UPSUPER_VC_FIX_</span>
&nbsp;
<span style="color: #339900;">#ifdef _MSC_VER</span>
<span style="color: #339900;">#   if _MSC_VER &lt;= 1200</span>
<span style="color: #339900;">#       define for if (0); else for</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> max<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> a, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> a <span style="color: #000080;">&gt;</span> b <span style="color: #008080;">?</span> a <span style="color: #008080;">:</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> min<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> a, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> b<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> a <span style="color: #000080;">&lt;</span> b <span style="color: #008080;">?</span> a <span style="color: #008080;">:</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T, <span style="color: #0000ff;">class</span> Compare<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> max<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> a, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> b, Compare comp<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> comp<span style="color: #008000;">&#40;</span>a, b<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> b <span style="color: #008080;">:</span> a<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T, <span style="color: #0000ff;">class</span> Compare<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> min<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> a, <span style="color: #0000ff;">const</span> T<span style="color: #000040;">&amp;</span> b, Compare comp<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">return</span> comp<span style="color: #008000;">&#40;</span>a, b<span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> a <span style="color: #008080;">:</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #339900;">#   endif</span>
<span style="color: #339900;">#endif</span>
&nbsp;
<span style="color: #339900;">#endif // _H_UPSUPER_VC_FIX_</span></pre></td></tr></table></div>

<p>最后要解决的就是警告的问题。其实我很无语的是，所有的警告都是在 VC6 自己的头文件里面的……VC6 自己提示可以添加 /GX 来消除那些警告。于是我不得不再次修改我的编译脚本：</p>

<div class="wp_codebox"><table><tr id="p11196"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code" id="p1119code6"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #007800;">VC6_DIR</span>=<span style="color: #ff0000;">&quot;这里写上VC6的安装地址&quot;</span>
&nbsp;
<span style="color: #007800;">BIN</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Bin&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">INCLUDE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Include&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LIB</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Lib&quot;</span> 
&nbsp;
<span style="color: #007800;">ARGS</span>=
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">getopts</span> <span style="color: #ff0000;">&quot;o:cG:&quot;</span> optname
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$optname</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
    <span style="color: #ff0000;">&quot;o&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /o<span style="color: #007800;">$OPTARG</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /c&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #ff0000;">&quot;G&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
        <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /G<span style="color: #007800;">$OPTARG</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
    <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
wine <span style="color: #ff0000;">&quot;<span style="color: #007800;">$BIN</span>/CL.EXE&quot;</span> <span style="color: #007800;">$ARGS</span> <span style="color: #800000;">${@:$OPTIND}</span></pre></td></tr></table></div>

<p>到了最后，再补充一点点吧。VC6 发现了两个额外的错误，我觉得应该不是不兼容的问题。就是我重载的 operator++ 和 operator&#8211; 不小心忘记写 return *this; 了，g++ 没有给我任何提示的编译通过了，而 VC6 则将这个视为错误。</p>
<p>在这个问题上，我同意 VC6 的看法，虽然我怀疑可能 g++ 自己加上了那句话，不过我觉得这个应该至少给出一个警告而非什么都不说。当然，可能一个 fatal error 太过了点……</p>
<p>参考资料：</p>
<ul>
<li><a href="http://www.rugesy.cn/it/u20091012_22_34fe5127-ddfe-44fe-86f1-13afc360a794.html">VC6中FOR语句的变量声明问题</a> 回复的7楼</li>
<li><a href="http://topic.csdn.net/t/20041101/19/3511737.html">如何在程序调试阶段，判断当前的编译器是vc6的编译器还是intel8.0的编译器？ &#8211; CSDN社区</a></li>
<li><a href="http://www.cplusplus.com/reference/algorithm/max/">max &#8211; C++ Reference</a></li>
<li><a href="http://panpan.blog.51cto.com/489034/103074/">VC6.0不支持标准库函数max和min &#8211; C++技术 &#8211; 51CTO技术博客</a></li>
<li><a href="http://topic.csdn.net/t/20040909/19/3357414.html">warning C4530:C++ exception handler used, but unwind semantics are not enabled. Specify -GX &#8211; CSDN社区</a></li>
<li><a href="http://baike.baidu.com/view/1276757.html">_MSC_VER_百度百科</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/write-a-little-vc-fix-today/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>跨编译器的 C 语言 NaN 支持 (纠正)</title>
		<link>http://blog.upsuper.org/nan-support-for-cross-compiler-of-c/</link>
		<comments>http://blog.upsuper.org/nan-support-for-cross-compiler-of-c/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:19:59 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[兼容性]]></category>
		<category><![CDATA[宏]]></category>
		<category><![CDATA[微软]]></category>
		<category><![CDATA[标准化]]></category>
		<category><![CDATA[编译器]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=933</guid>
		<description><![CDATA[之前的版本犯了一个重大的错误！我错了……没有经过认真的实验就贴出来…… 正文开始前，先看一个式子： 1 x != x 大家觉得，这个东西的返回可能为 true 么？事实上是可能的，只要这个 x 是 NaN，并且这个 C 编译器符合 IEEE 754 的标准。 所谓 NaN，即 Not A Number，不是一个数。这是 IEEE 754 国际浮点数运算标准当中规定的一个特殊值，这个值由于不是一个数，所以有很多奇怪的特性，比如上面这个不等于其本身。 虽然有这么个东西，而且是国际标准，不过我们也知道，这世界上总有那么些公司是不喜欢理会国际标准的，邪恶的 M$ 就是其中之一。而 Visual C++ 6.0 的 C 编译器也就“有幸”成为了少有的不能完全兼容 IEEE 754 的编译器之一。 至此，我们发现一个问题：邪恶的 M$ 的东西中，总是最垃圾的流传的最广，IE6 如此，VC6 也是如此。另外，在此声明一下，这里讲的全部是 C，不是 C++，在 C++ 中另外有一些比较符合标准的方式同时被各个编译器兼容。 OK，回归正题，既然 VC6 的编译器是个渣，可我们有的时候还是不得不让自己的代码与之兼容，于是就有了各种解决办法。 首先明确一下，我们现在需要两样东西，一是一个可以用于赋值的 NaN (在我的程序中作为一个标记值使用)，另一个是一个用于判断一个数是否为 NaN 的函数或宏。基于上面对 NaN [...]]]></description>
			<content:encoded><![CDATA[<p><strong style="color: red;">之前的版本犯了一个重大的错误！我错了……没有经过认真的实验就贴出来……</strong></p>
<p>正文开始前，先看一个式子：</p>

<div class="wp_codebox"><table><tr id="p93314"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p933code14"><pre class="c" style="font-family:monospace;">x <span style="color: #339933;">!=</span> x</pre></td></tr></table></div>

<p>大家觉得，这个东西的返回可能为 true 么？事实上是可能的，只要这个 x 是 NaN，并且这个 C 编译器符合 IEEE 754 的标准。</p>
<p>所谓 NaN，即 Not A Number，不是一个数。这是 IEEE 754 国际浮点数运算标准当中规定的一个特殊值，这个值由于不是一个数，所以有很多奇怪的特性，比如上面这个不等于其本身。</p>
<p>虽然有这么个东西，而且是国际标准，不过我们也知道，这世界上总有那么些公司是不喜欢理会国际标准的，邪恶的 M$ 就是其中之一。而 Visual C++ 6.0 的 C 编译器也就“有幸”成为了少有的不能完全兼容 IEEE 754 的编译器之一。</p>
<p>至此，我们发现一个问题：邪恶的 M$ 的东西中，总是最垃圾的流传的最广，IE6 如此，VC6 也是如此。另外，在此声明一下，这里讲的全部是 C，不是 C++，在 C++ 中另外有一些比较符合标准的方式同时被各个编译器兼容。</p>
<p>OK，回归正题，既然 VC6 的编译器是个渣，可我们有的时候还是不得不让自己的代码与之兼容，于是就有了各种解决办法。<br />
<span id="more-933"></span><br />
首先明确一下，我们现在需要两样东西，一是一个可以用于赋值的 NaN (在我的程序中作为一个标记值使用)，另一个是一个用于判断一个数是否为 NaN 的函数或宏。基于上面对 NaN 的介绍，在一个符合标准的编译器上，我们可以很容易地给出如下宏：</p>

<div class="wp_codebox"><table><tr id="p93315"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p933code15"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define NaN (0.0 / 0.0)</span>
<span style="color: #339933;">#define IsNaN(x) ((x) != (x))</span></pre></td></tr></table></div>

<p>对于上面这样的 NaN 定义，VC6 不同寻常的会发生编译错误：</p>

<div class="wp_codebox"><table><tr id="p93316"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p933code16"><pre class="text" style="font-family:monospace;">error C2124: divide or mod by zero</pre></td></tr></table></div>

<p>可能也有人会问，难道除 0 不应该是错误么？事实上 IEEE 754 里面就是规定 0.0 / 0.0 = NaN。这里我给出一个我个人的理解：学过高等数学的人大约都会知道，一个无穷小除以一个无穷小，他们的极限可能是无穷大或任何实数，而由于浮点数的精度限制，这里的 0 可能不是真的 0，而是一个很小很小极其趋近于 0 的数，类似无穷小，于是有这样的规定吧。再来看看 IsNaN，这个宏就更无敌了，VC6 的编译器会自作聪明的直接把它优化为 false……</p>
<p>那么对于 VC6 我们该怎么办呢？</p>
<p>查阅了许多资料，最后我们在 MSDN 中翻出了一份年代久远的文档：<a href="http://msdn.microsoft.com/en-us/library/aa298428%28VS.60%29.aspx">_isnan</a>。这里的 _isnan 是 VC6 在 float.h 中定义的一个函数，用于校验一个数是否为 NaN。现在的问题就剩下，我们如何生成 NaN，以及如何判断编译器呢？</p>
<p>那么我们来思考一下，除了用零除零，还有什么方法可以生成 NaN 呢？翻看了 <a href="http://www.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF">IEEE754 标准文档</a>，看到了开平方一个负数也应该是 NaN。这一点应该很好理解，开平方一个负数应该得到一个虚数，而虚数不是一个实数，所以也就 Not a Number 了~于是最后形成了下面一段预处理指令：</p>

<div class="wp_codebox"><table><tr id="p93317"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p933code17"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifdef _FPCLASS_SNAN</span>
<span style="color: #339933;">#include &lt;math.h&gt;</span>
<span style="color: #339933;">#define NaN sqrt(-1)</span>
<span style="color: #339933;">#define IsNaN(x) _isnan(x)</span>
<span style="color: #339933;">#else</span>
<span style="color: #339933;">#define NaN (0.0 / 0.0)</span>
<span style="color: #339933;">#define IsNaN(x) ((x) != (x))</span>
<span style="color: #339933;">#endif</span></pre></td></tr></table></div>

<p>虽然调用 sqrt 可能有效率问题，而且额外的需要引用 math 头文件，不过还算几乎完美地解决了 NaN 跨编译器的兼容性问题~事实证明，这段代码可以通过 VC6 的编译器正确地编译并执行。</p>
<p>另外说一点东西，就是如何在 Linux 下用 VC6 的编译器呢？这个问题我想我解决的其实是不完美的，不过也留在这里吧。</p>
<p>首先我下载了一个免安装版的 VC6，然后解压。接着找到了 VC6/VC98/Bin 目录，里面有非常著名的 VC6 编译器的主程序 CL.EXE 以及连接器 LINK.EXE。对于编译器这种纯运算的程序，wine 的兼容性还是比较优美的。不过需要一个额外的 dll 文件支持：mspdb60.dll，这个文件<a href="http://www.dll-files.com/dllindex/dll-files.shtml?mspdb60">很容易载到</a>，解压到 wine 的系统目录 (~/.wine/drive_c/windows/system32) 就可以了。</p>
<p>接下去就是如何编译了……我的方法比较老土，是将待编译的文件复制到编译器目录，然后执行类似下面命令：</p>

<div class="wp_codebox"><table><tr id="p93318"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p933code18"><pre class="bash" style="font-family:monospace;">wine CL.EXE 源文件.c <span style="color: #000000; font-weight: bold;">/</span>I..<span style="color: #000000; font-weight: bold;">/</span>Include <span style="color: #000000; font-weight: bold;">/</span>o可执行文件.exe <span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">link</span> <span style="color: #000000; font-weight: bold;">/</span>LIBPATH:..<span style="color: #000000; font-weight: bold;">/</span>Lib</pre></td></tr></table></div>

<p>其中“源文件.c”和“可执行文件.exe”是很容易理解的，“/I../Include”是使编译器能知道 include 的文件应该去哪里找，而“/link”表示后面的部分是连接器参数，“/LIBPATH:../Lib”就是表示静态链接库的地址了~</p>
<p>最后再说说如何将 GCC 可以编译的程序移植到 VC6 中。GCC 实现了 C99 标准，但 VC6 因为出现在 1998 年 (怎么正好早一年……不过就算是 99 年出也未必会支持 C99 就是了……)，所以不支持 C99，于是所有的变量必须在函数最前面声明，不能混入代码内部。此外，在 VC6 当中，void 指针是不能进行运算的。还有就是不能用“//”开头的行注释，必须使用块注释。这是我移植过程中遇到的主要麻烦。</p>
<p>事实上，在 GCC 当中，可以验证大多数 C89 的限制，只要在编译的时候用如下语句：</p>

<div class="wp_codebox"><table><tr id="p93319"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p933code19"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-ansi</span> <span style="color: #660033;">-pedantic</span> <span style="color: #660033;">-o</span> 可执行文件 源文件.c</pre></td></tr></table></div>

<p>只要把其中所有的 warning 全部消灭掉就可以啦~</p>
<p>当然，最好的方法莫过于在 VC6 的编译器中直接测试了……</p>
<p>最后最后，M$ 实在是……唉……这个世界上不明真相的孩子果然是占大多数的……</p>
<hr />
<p>关于修改的部分：之前的版本错误的使用 _FPCLASS_SNAN 这一校验函数 _fpclass 返回值当作 NaN 来使用。既然查到了这个，这里也顺便说一下这个东西吧。在 VC 的 float.h 库里面有 _fpclass 这个函数，用于检验一个浮点数的类型，可能的返回值都在 float.h 里面，如下：</p>

<div class="wp_codebox"><table><tr id="p93320"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p933code20"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define _FPCLASS_SNAN   0x0001  /* signaling NaN */</span>
<span style="color: #339933;">#define _FPCLASS_QNAN   0x0002  /* quiet NaN */</span>
<span style="color: #339933;">#define _FPCLASS_NINF   0x0004  /* negative infinity */</span>
<span style="color: #339933;">#define _FPCLASS_NN     0x0008  /* negative normal */</span>
<span style="color: #339933;">#define _FPCLASS_ND     0x0010  /* negative denormal */</span>
<span style="color: #339933;">#define _FPCLASS_NZ     0x0020  /* -0 */</span>
<span style="color: #339933;">#define _FPCLASS_PZ     0x0040  /* +0 */</span>
<span style="color: #339933;">#define _FPCLASS_PD     0x0080  /* positive denormal */</span>
<span style="color: #339933;">#define _FPCLASS_PN     0x0100  /* positive normal */</span>
<span style="color: #339933;">#define _FPCLASS_PINF   0x0200  /* positive infinity */</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/nan-support-for-cross-compiler-of-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>方便使用 VC6 编译器的小脚本</title>
		<link>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/</link>
		<comments>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 10:45:56 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[编译器]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=935</guid>
		<description><![CDATA[昨天的那篇日志跨编译器的 C 语言 NaN 支持当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序，不过总觉得还是有那么些麻烦，要把待编译的文件复制到 VC6 的安装目录，还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~ 于是就有了下面这个小脚本： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/bash # - * - coding: UTF-8 - * - &#160; VC6_DIR=&#34;这里写上VC6的安装地址&#34; &#160; BIN=&#34;$VC6_DIR/VC98/Bin&#34; export [...]]]></description>
			<content:encoded><![CDATA[<p>昨天的那篇日志<a href="http://blog.upsuper.org/nan-support-for-cross-compiler-of-c/">跨编译器的 C 语言 NaN 支持</a>当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序，不过总觉得还是有那么些麻烦，要把待编译的文件复制到 VC6 的安装目录，还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~</p>
<p>于是就有了下面这个小脚本：</p>

<div class="wp_codebox"><table><tr id="p93523"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code" id="p935code23"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #007800;">VC6_DIR</span>=<span style="color: #ff0000;">&quot;这里写上VC6的安装地址&quot;</span>
&nbsp;
<span style="color: #007800;">BIN</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Bin&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">INCLUDE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Include&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LIB</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Lib&quot;</span> 
&nbsp;
<span style="color: #007800;">ARGS</span>=
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">getopts</span> <span style="color: #ff0000;">&quot;o:c&quot;</span> optname
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$optname</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
  <span style="color: #ff0000;">&quot;o&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /o<span style="color: #007800;">$OPTARG</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /c&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
wine <span style="color: #ff0000;">&quot;<span style="color: #007800;">$BIN</span>/CL.EXE&quot;</span> <span style="color: #007800;">$ARGS</span> <span style="color: #800000;">${@:$OPTIND}</span></pre></td></tr></table></div>

<p>然后把他放在 PATH 里面的某个目录下 (我放在了用户级的 /home/upsuper/bin 里，这个似乎要自己添加就是了)，然后给这个文件加上可执行属性，最后只要在需要的地方执行：</p>

<div class="wp_codebox"><table><tr id="p93524"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p935code24"><pre class="bash" style="font-family:monospace;">vc6 xxx.cpp</pre></td></tr></table></div>

<p>就解决了~<br />
<span id="more-935"></span><br />
不过从这个脚本中也可以看出，它的功能还不太完善，不对，是很不完善。目前支持设置输出文件名和阻止执行连接。我很想加入很多其他的参数，不过不知道该怎么弄……</p>
<p>参考资料：</p>
<ul>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html">Linux 技巧: Bash 参数和参数扩展</a></li>
<li><a href="http://topic.csdn.net/t/20060903/21/4995578.html">vc6.0的INCLUDE 和LIB路径如何修改?  &#8211; CSDN社区</a></li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>两小段 C 的宏</title>
		<link>http://blog.upsuper.org/two-pieces-of-macro-of-c/</link>
		<comments>http://blog.upsuper.org/two-pieces-of-macro-of-c/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 04:21:36 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[宏]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=930</guid>
		<description><![CDATA[很久没写 blog 了……大学生活可比高中忙碌多了，哪个混蛋骗我说大学轻松来着……学的东西又难，作业又多，还有学生会活动……啊，我多想回到一中…… 最近忙着帮同学写大项目，用 C。话说，对于让没学过编程的人学 C 实在是一件很残酷的事情，即使我现在写仍然觉得很可怕……不过写着写着，觉得 C 实在是一个很神奇的语言，指针和宏是如此的优美~ 下面贴两个我在写那项目的时候用到的宏： 1 2 3 4 5 6 7 #define EXPAND_SPACE(type, p, num, max) { \ if ((num) + 1 &#62;= (max)) { \ if ((max) &#60; 16384) (max) &#60;&#60;= 1; \ else (max) += 512; \ (p) = (type*)realloc((void*)(p), (max)); \ } \ } 这个是我用来动态扩充空间用的宏，可以非常方便的动态增加需要的空间，这样就不需要为应该预分配多少空间烦恼了~ 1 [...]]]></description>
			<content:encoded><![CDATA[<p>很久没写 blog 了……大学生活可比高中忙碌多了，哪个混蛋骗我说大学轻松来着……学的东西又难，作业又多，还有学生会活动……啊，我多想回到一中……</p>
<p>最近忙着帮同学写大项目，用 C。话说，对于让没学过编程的人学 C 实在是一件很残酷的事情，即使我现在写仍然觉得很可怕……不过写着写着，觉得 C 实在是一个很神奇的语言，指针和宏是如此的优美~</p>
<p>下面贴两个我在写那项目的时候用到的宏：<br />
<span id="more-930"></span></p>

<div class="wp_codebox"><table><tr id="p93027"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p930code27"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define EXPAND_SPACE(type, p, num, max) { \
  if ((num) + 1 &gt;= (max)) { \
    if ((max) &lt; 16384) (max) &lt;&lt;= 1; \
    else (max) += 512; \
    (p) = (type*)realloc((void*)(p), (max)); \
  } \
}</span></pre></td></tr></table></div>

<p>这个是我用来动态扩充空间用的宏，可以非常方便的动态增加需要的空间，这样就不需要为应该预分配多少空间烦恼了~</p>

<div class="wp_codebox"><table><tr id="p93028"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p930code28"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define SORT_RESULT(name, type, get, cmp, c1, c2) \
void SortResult_##name(int l, int r, Row **rows, int start) { \
  int i = l, j = r; \
  type m = get(rows[(i+j)/2], start); \
  Row *tmp; \
  \
  do { \
    while ((cmp)(m, get(rows[i], start)) c1 0) ++i; \
    while ((cmp)(m, get(rows[j], start)) c2 0) --j; \
    if (i &lt;= j) { \
      tmp = rows[i], rows[i] = rows[j], rows[j] = tmp; \
      ++i, --j; \
    } \
  } while (i &lt;= j); \
  \
  if (i &lt; r) SortResult_##name(i, r, rows, start); \
  if (l &lt; j) SortResult_##name(l, j, rows, start); \
}</span>
&nbsp;
<span style="color: #339933;">#define SORT_RESULT_CHAR(name, c1, c2) \
  SORT_RESULT(Char##name, char*, GET_CHARS, strcmp, c1, c2)</span>
&nbsp;
<span style="color: #339933;">#define SORT_RESULT_FLOAT(name, c1, c2) \
  SORT_RESULT(Float##name, float, GET_FLOAT, MyNumCmp, c1, c2)</span>
&nbsp;
SORT_RESULT_CHAR <span style="color: #009900;">&#40;</span> Asc<span style="color: #339933;">,</span> <span style="color: #339933;">&gt;,</span> <span style="color: #339933;">&lt;</span><span style="color: #009900;">&#41;</span>
SORT_RESULT_CHAR <span style="color: #009900;">&#40;</span>Desc<span style="color: #339933;">,</span> <span style="color: #339933;">&lt;,</span> <span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span>
SORT_RESULT_FLOAT<span style="color: #009900;">&#40;</span> Asc<span style="color: #339933;">,</span> <span style="color: #339933;">&gt;,</span> <span style="color: #339933;">&lt;</span><span style="color: #009900;">&#41;</span>
SORT_RESULT_FLOAT<span style="color: #009900;">&#40;</span>Desc<span style="color: #339933;">,</span> <span style="color: #339933;">&lt;,</span> <span style="color: #339933;">&gt;</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>这个很明显是快排~出于效率考虑，我不得不写4个排序……可是我觉得这样非常不好，代码重用性太低了，就写了个宏，就像上面那样~很偷懒吧~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/two-pieces-of-macro-of-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>闰年判断的优化及其他</title>
		<link>http://blog.upsuper.org/optimize-leap-year-checking-and-other/</link>
		<comments>http://blog.upsuper.org/optimize-leap-year-checking-and-other/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 13:10:37 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Javran]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=833</guid>
		<description><![CDATA[今天 Javran 发来短信给了一个短小的论年判断代码，并且问我是否认为有更简单的表达。下面是他最初给的代码： 1 return &#40;&#40;y &#38; 3 != 0&#41; ^ &#40;y % 100 == 0&#41; ^ &#40;y % 400 != 0&#41;&#41;; 一切的探究就从这个代码开始了。 当然，这个代码是错的，因为疏忽了运算符的优先级，为达到本来的目的，这段代码大概应该这样改（测试代码3）： 1 return &#40;&#40;&#40;y &#38; 3&#41; != 0&#41; ^ &#40;y % 100 == 0&#41; ^ &#40;y % 400 != 0&#41;&#41;; 接着，我将其中“!=0”和“==0”可以进一步缩短，现在代码现在变成这样（测试代码4）： 1 return !!&#40;y &#38; 3&#41; ^ !&#40;y % 100&#41; ^ !!&#40;y [...]]]></description>
			<content:encoded><![CDATA[<p>今天 Javran 发来短信给了一个短小的论年判断代码，并且问我是否认为有更简单的表达。下面是他最初给的代码：</p>

<div class="wp_codebox"><table><tr id="p83341"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code41"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>一切的探究就从这个代码开始了。<br />
<span id="more-833"></span></p>
<p>当然，这个代码是错的，因为疏忽了运算符的优先级，为达到本来的目的，这段代码大概应该这样改（测试代码3）：</p>

<div class="wp_codebox"><table><tr id="p83342"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code42"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>接着，我将其中“!=0”和“==0”可以进一步缩短，现在代码现在变成这样（测试代码4）：</p>

<div class="wp_codebox"><table><tr id="p83343"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code43"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #339933;">!!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #339933;">!!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>OK，对于抑或得到的思路，精简到这里差不多了。Javran 随后又给我了一个代码：</p>

<div class="wp_codebox"><table><tr id="p83344"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code44"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">25</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #339933;">!!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">25</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>我说这比我的代码长，他解释说这段代码模的规模比较小，应该快一些。我说再快快不过 if 句。话说，经过实验，这条语句似乎是错误的……</p>
<p>不过，这让我突然想起了对于 &#038;&#038; 和 || 这样逻辑运算符的优化，我便想看看这个判断最快能至何~</p>
<p>我们先看看最传统的判断代码（测试代码1）：</p>

<div class="wp_codebox"><table><tr id="p83345"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p833code45"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">4</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>然后我们做点小小的优化（测试代码2）：</p>

<div class="wp_codebox"><table><tr id="p83346"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p833code46"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>接着我就按着这个的判断方式的思路进行一点缩减：</p>

<div class="wp_codebox"><table><tr id="p83347"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code47"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">||</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>然后根据前面的方式缩短行（测试代码5）：</p>

<div class="wp_codebox"><table><tr id="p83348"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p833code48"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>可以看出，这是目前最短的一个判断方式。</p>
<p>下面我做了30轮，每轮每个代码执行2,000,000次，取最短时间，得到如下结果：</p>

<div class="wp_codebox"><table><tr id="p83349"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p833code49"><pre class="text" style="font-family:monospace;">1: 0.043275
2: 0.043562
3: 0.093261
4: 0.093184
5: 0.036421</pre></td></tr></table></div>

<p>首先我们观察到，我最后推出的那个最短的式子是最快的，为什么？这是源于逻辑运算符的运算规则：对于 &#038;&#038;，如果前面项为假则不计算后项；对于 ||，如果前项为真则不计算后项。这就像 if 语句的递推作用：不做无谓的计算。而很显然，3和4的速度很慢，因为使用了异或运算，由于异或运算本身无法预测结果，必须把每一项都计算出来才行，因此慢了很多（比传统算法慢了一倍）。事实上按位运算应该都是这样。</p>
<p>接着我们看到，我对 Javran 最初代码的优化版本效率有一定提高，可能是因为将减法（比较运算实质是做减法）化为了位操作吧。而对传统代码的优化却反而减慢了它，或许是修改规则导致的副作用吧……不过我的最终优化代码还是快了不少，原因不明，或许 if 并不快？</p>
<p>应该有人会觉得奇怪，为什么要取最短时间，而不是平均值呢？事实上，我想在进行效率测试的时候，应该看最短时间。我们考虑测量效率时引入的误差出现在什么地方：CPU 肯定不会因为某个函数突然超频加速。那么有什么问题呢？因为我们用的都是分时系统，系统会不断的调度不同的线程使用 CPU。误差就在这里：时间会因为任务的切换而变长！因此测量结果只可能比实际值长，不可能比实际值短。所以要取最短时间。</p>
<p>OK，对闰年的探索暂告一段落。我们突然想起前面 Javran 所给出的“缩小模的规模带来效率提升”的论断。</p>
<p>因此我的测试程序增加了3个测试代码（测试代码6-8）：</p>

<div class="wp_codebox"><table><tr id="p83350"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p833code50"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">25</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>得到的结果让人吃惊：</p>

<div class="wp_codebox"><table><tr id="p83351"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p833code51"><pre class="text" style="font-family:monospace;">6: 0.106022
7: 0.098434
8: 0.098487</pre></td></tr></table></div>

<p>模25最慢，400次之，而100最快，一样原因不明。看起来难道模的速度和模的数有关系？</p>
<p>嗯，讨论了这么多，其实最初的问题——闰年判断的简化和优化——比较无聊，因为这段代码本身就不长，也几乎不可能被用于热点处。不过从这个过程中，我们看到了一些有趣的优化方式，虽然不能如算法改进那样降低复杂度，但这里有的时候常数也很重要，不是么？此外，还有一些关于效率测试的讨论。最后，我们还看到了一点神奇的结果，有待进一步探究咯~</p>
<p>最后贴出测试代码：</p>

<div class="wp_codebox"><table><tr id="p83352"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
</pre></td><td class="code" id="p833code52"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;sys/time.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define TRUE  1</span>
<span style="color: #339933;">#define FALSE 0</span>
&nbsp;
<span style="color: #339933;">#define CHECK(NUM)  if (check##NUM(i) != a) printf(#NUM)</span>
&nbsp;
<span style="color: #339933;">#define YEAR_AMOUNT 2000000</span>
<span style="color: #339933;">#define TEST(NUM) \
  gettimeofday(&amp;tv_s, &amp;tz); \
  for (j = 1; j &lt;= YEAR_AMOUNT; ++j) \
    check##NUM(j); \
  gettimeofday(&amp;tv_e, &amp;tz); \
  timeval_subtract(&amp;tv_d, &amp;tv_e, &amp;tv_s); \
  if (mtime[NUM].tv_sec == 0 &amp;&amp; \
      mtime[NUM].tv_usec == 0 || \
      tv_d.tv_sec &lt; mtime[NUM].tv_sec || \
      tv_d.tv_sec == mtime[NUM].tv_sec &amp;&amp; \
      tv_d.tv_usec &lt; mtime[NUM].tv_usec) \
    mtime[NUM] = tv_d; \
  printf(#NUM &quot; &quot;)</span>
&nbsp;
<span style="color: #993333;">int</span> y<span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> timeval mtime<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> timezone tz<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> check1<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">4</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check2<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check3<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check4<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #339933;">!!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">^</span> <span style="color: #339933;">!!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check5<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span> <span style="color: #339933;">||</span> <span style="color: #339933;">!</span><span style="color: #009900;">&#40;</span>y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check6<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">25</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check7<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> check8<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> y<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">return</span> y <span style="color: #339933;">%</span> <span style="color: #0000dd;">400</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 时间减法</span>
<span style="color: #993333;">int</span> timeval_subtract<span style="color: #009900;">&#40;</span>result<span style="color: #339933;">,</span> x<span style="color: #339933;">,</span> y<span style="color: #009900;">&#41;</span>
       <span style="color: #993333;">struct</span> timeval <span style="color: #339933;">*</span>result<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>x<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>y<span style="color: #339933;">;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">&lt;</span> y<span style="color: #339933;">-&gt;</span>tv_usec<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> nsec <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>y<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">-</span> x<span style="color: #339933;">-&gt;</span>tv_usec<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">1000000</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    y<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">-=</span> <span style="color: #0000dd;">1000000</span> <span style="color: #339933;">*</span> nsec<span style="color: #339933;">;</span>
    y<span style="color: #339933;">-&gt;</span>tv_sec <span style="color: #339933;">+=</span> nsec<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>x<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">-</span> y<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">1000000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> nsec <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>x<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">-</span> y<span style="color: #339933;">-&gt;</span>tv_usec<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000dd;">1000000</span><span style="color: #339933;">;</span>
    y<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1000000</span> <span style="color: #339933;">*</span> nsec<span style="color: #339933;">;</span>
    y<span style="color: #339933;">-&gt;</span>tv_sec <span style="color: #339933;">-=</span> nsec<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  result<span style="color: #339933;">-&gt;</span>tv_sec <span style="color: #339933;">=</span> x<span style="color: #339933;">-&gt;</span>tv_sec <span style="color: #339933;">-</span> y<span style="color: #339933;">-&gt;</span>tv_sec<span style="color: #339933;">;</span>
  result<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">=</span> x<span style="color: #339933;">-&gt;</span>tv_usec <span style="color: #339933;">-</span> y<span style="color: #339933;">-&gt;</span>tv_usec<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> x<span style="color: #339933;">-&gt;</span>tv_sec <span style="color: #339933;">&lt;</span> y<span style="color: #339933;">-&gt;</span>tv_sec<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// 验证代码正确性</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> YEAR_AMOUNT<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
    a <span style="color: #339933;">=</span> check1<span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    CHECK<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> CHECK<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> CHECK<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> CHECK<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Check complete!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// 开始计时</span>
  <span style="color: #993333;">struct</span> timeval tv_s<span style="color: #339933;">,</span> tv_e<span style="color: #339933;">;</span>
  <span style="color: #993333;">struct</span> timeval tv_d<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d: &quot;</span><span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    TEST<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// 输出结果</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d: %ld.%06ld<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> mtime<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">tv_sec</span><span style="color: #339933;">,</span> mtime<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #202020;">tv_usec</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>很久没写这种东西了……唉……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/optimize-leap-year-checking-and-other/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>OpenGL 的小试验（三）</title>
		<link>http://blog.upsuper.org/opengl-small-test-3/</link>
		<comments>http://blog.upsuper.org/opengl-small-test-3/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 15:53:01 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=695</guid>
		<description><![CDATA[今天回家本想在我的 Ubuntu 上玩玩 OpenGL，结果花了一个下午，终于研究出些东西了…… 在 NeHe 的源代码中似乎有 Linux 的，不过一个是用 glut、一个是用 SDL、一个是用 GLX，原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统，结果发现全屏不能……于是就找到了 GLFW 这个东西，据说比较简单，不过还是研究了一个下午。 下面说一下研究成果吧，首先，想要用 g++ 编译用 GLFW 写的程序，一定要加这些编译参数： -lglfw -lGL -lGLU -lXrandr，特别是最后一个，是其官方参考中没有的！这个是我查了许多资料，然后瞎猜猜到的……再说说头文件，这次不需要引用3个库了，只有一个 #include &#60;GL/glfw.h&#62; 就可以了，似乎把其他的库自动引用了。另外就是，画完要用 glfwSwapBuffers(); 刷新，不然不仅什么都不会显示，而且还会死机……除此之外，还要注意那个键盘的按键，不要想当然的和 Windows 下拿去类比，根据研究发现，键盘事件交出的 key 最大可以达到 318，而且特殊键都会以这些“大值”返回，所以一定要申请好内存…… 这次主要参考了： GLFW Reference OpenGL Tutorials &#8211; Basics 以及 NeHe 的 OpenGL 教程。 这个例子是一个转动的彩色四棱锥，只有 ESC 和 F11 的键盘处理，附加帧数计算。 1 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.upsuper.org/wp-content/uploads/2009/02/screenshot-opengl-300x234.png" alt="screenshot-opengl" title="screenshot-opengl" width="300" height="234" class="alignright size-medium wp-image-696" />今天回家本想在我的 Ubuntu 上玩玩 OpenGL，结果花了一个下午，终于研究出些东西了……</p>
<p>在 NeHe 的源代码中似乎有 Linux 的，不过一个是用 glut、一个是用 SDL、一个是用 GLX，原本看到 glut 是 OpenGL 官方的一个夸平台的简单窗口系统，结果发现全屏不能……于是就找到了 GLFW 这个东西，据说比较简单，不过还是研究了一个下午。</p>
<p>下面说一下研究成果吧，首先，想要用 g++ 编译用 GLFW 写的程序，一定要加这些编译参数： -lglfw -lGL -lGLU -lXrandr，特别是最后一个，是其官方参考中没有的！这个是我查了许多资料，然后瞎猜猜到的……再说说头文件，这次不需要引用3个库了，只有一个 #include &lt;GL/glfw.h&gt; 就可以了，似乎把其他的库自动引用了。另外就是，画完要用 glfwSwapBuffers(); 刷新，不然不仅什么都不会显示，而且还会死机……除此之外，还要注意那个键盘的按键，不要想当然的和 Windows 下拿去类比，根据研究发现，键盘事件交出的 key 最大可以达到 318，而且特殊键都会以这些“大值”返回，所以一定要申请好内存……</p>
<p>这次主要参考了：<br />
<a href="http://glfw.sourceforge.net/GLFWReference26.pdf">GLFW Reference</a><br />
<a href="http://glfw.sourceforge.net/tutorials/basics.html">OpenGL Tutorials &#8211; Basics</a><br />
以及 NeHe 的 OpenGL 教程。<br />
<span id="more-695"></span><br />
这个例子是一个转动的彩色四棱锥，只有 ESC 和 F11 的键盘处理，附加帧数计算。</p>

<div class="wp_codebox"><table><tr id="p69555"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
</pre></td><td class="code" id="p695code55"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #339900;">#include &lt;unistd.h&gt;</span>
<span style="color: #339900;">#include &lt;GL/glfw.h&gt;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> fullscreen<span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> active <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> keys<span style="color: #008000;">&#91;</span>GLFW_KEY_LAST<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// 为键盘按键申请空间</span>
&nbsp;
GLfloat rtri<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGLFW<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span>, <span style="color: #0000ff;">int</span>, <span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// 帧数统计用</span>
<span style="color: #0000ff;">double</span> starttime<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> flames <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// 绘制代码</span>
<span style="color: #0000ff;">void</span> drawGLScene<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;
	glTranslatef<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">5.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>rtri, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glBegin<span style="color: #008000;">&#40;</span>GL_TRIANGLES<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</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;
	<span style="color: #000040;">++</span>flames<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> dt <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">-</span> starttime<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>dt <span style="color: #000080;">&gt;=</span> <span style="color:#800080;">5.0f</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d frames in %.1lf seconds = %.3lf FPSn&quot;</span>, flames, dt, <span style="color: #0000ff;">double</span><span style="color: #008000;">&#40;</span>flames<span style="color: #008000;">&#41;</span> <span style="color: #000040;">/</span> dt<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		flames <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		st <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	rtri <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.15f</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// 键盘处理</span>
<span style="color: #0000ff;">void</span> keyPress<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> key, <span style="color: #0000ff;">int</span> action<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	keys<span style="color: #008000;">&#91;</span>key<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> action<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>GLFW_KEY_ESC<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		active <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>GLFW_KEY_F11<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		keys<span style="color: #008000;">&#91;</span>GLFW_KEY_F11<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> GLFW_RELEASE<span style="color: #008080;">;</span>
		glfwTerminate<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		fullscreen <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> fullscreen<span style="color: #008080;">;</span>
		initGLFW<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Upsuper's OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</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;">inline</span> <span style="color: #0000ff;">void</span> quit<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> status<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glfwTerminate<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>status<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> quit<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
	quit<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">void</span> report_error<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> info<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">puts</span><span style="color: #008000;">&#40;</span>info<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	quit<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: #0000ff;">void</span> resizeGLScene<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>height <span style="color: #000080;">&lt;=</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span> height <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
&nbsp;
	glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, width, height<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>
&nbsp;
	gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0f</span>, GLfloat<span style="color: #008000;">&#40;</span>width<span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>GLfloat<span style="color: #008000;">&#40;</span>height<span style="color: #008000;">&#41;</span>, <span style="color:#800080;">0.1f</span>, <span style="color:#800080;">100.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGL<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glShadeModel<span style="color: #008000;">&#40;</span>GL_SMOOTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearDepth<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</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>
	glDepthFunc<span style="color: #008000;">&#40;</span>GL_LEQUAL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glHint<span style="color: #008000;">&#40;</span>GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> initGLFW<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> title, <span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glfwInit<span style="color: #008000;">&#40;</span><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> glfwOpenWindow<span style="color: #008000;">&#40;</span>width, height, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">8</span>, <span style="color: #0000dd;">24</span>, <span style="color: #0000dd;">0</span>, 
			fullscreen <span style="color: #008080;">?</span> GLFW_FULLSCREEN <span style="color: #008080;">:</span> GLFW_WINDOW<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		report_error<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;ERROR: Cannot open a window.&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetWindowTitle<span style="color: #008000;">&#40;</span>title<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwEnable<span style="color: #008000;">&#40;</span>GLFW_AUTO_POLL_EVENTS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetKeyCallback<span style="color: #008000;">&#40;</span>keyPress<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glfwSetWindowSizeCallback<span style="color: #008000;">&#40;</span>resizeGLScene<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	initGL<span style="color: #008000;">&#40;</span>width, height<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>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Would you like to run in fullscreen mode? [Y/n]&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> c <span style="color: #000080;">=</span> <span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	fullscreen <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>c <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'n'</span> <span style="color: #000040;">&amp;&amp;</span> c <span style="color: #000040;">!</span><span style="color: #000080;">=</span> <span style="color: #FF0000;">'N'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>keys, <span style="color: #0000ff;">false</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	initGLFW<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Upsuper's OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	st <span style="color: #000080;">=</span> glfwGetTime<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">do</span>
	<span style="color: #008000;">&#123;</span>
		drawGLScene<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glfwSwapBuffers<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: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>active<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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></td></tr></table></div>

<p>代码比 VC++ 的那个短好多，再次证明 Linux 是多么适用于编程……</p>
<p>同时根据帧数对比，印证了我的猜想——全屏下比较流畅！我这里全屏下 fps 达到了窗口模式的接近3倍。</p>
<p>附 makefile 文件（这也是我第一次写 makefile）：</p>

<div class="wp_codebox"><table><tr id="p69556"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p695code56"><pre class="make" style="font-family:monospace;">all<span style="color: #004400;">:</span> test1<span style="color: #004400;">.</span>cpp a<span style="color: #004400;">.</span>cpp
	g<span style="color: #004400;">++</span> test1<span style="color: #004400;">.</span>cpp <span style="color: #004400;">-</span>o test1 <span style="color: #004400;">-</span>lglfw <span style="color: #004400;">-</span>lGL <span style="color: #004400;">-</span>lGLU <span style="color: #004400;">-</span>lXrandr</pre></td></tr></table></div>

<p>最后，我还是十分高兴，那个绘制代码是我自己写出来的，不是抄的了！（虽然以前写过……）</p>
<p>写 OpenGL 就是爽……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/opengl-small-test-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL 的小试验（二）</title>
		<link>http://blog.upsuper.org/opengl-small-test-2/</link>
		<comments>http://blog.upsuper.org/opengl-small-test-2/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 11:49:23 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=692</guid>
		<description><![CDATA[今天又玩了玩，感觉到 OpenGL 实在太强大了！我也第一次遭到了买好显卡的重要意义：可以写 OpenGL 的程序！右边是效果图，有半透明、点光源效果。其实动起来会比较炫一点。 参考了下面教程（其实主要是抄）： OpenGL教程之纹理映射 OpenGL教程之纹理滤波方式 OpenGL教程之Alpha混合 除了教程里的功能，我还增加了按空格停止和按回车复位两个无聊功能…… 整个程序也已经由上一篇的将近400行增加到了超过500行。不过和新的的优美效果比起来，这点代码似乎不算什么~ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.upsuper.org/wp-content/uploads/2009/02/test2-300x234.png" alt="test2" title="test2" width="300" height="234" class="alignright size-medium wp-image-693" />今天又玩了玩，感觉到 OpenGL 实在太强大了！我也第一次遭到了买好显卡的重要意义：可以写 OpenGL 的程序！右边是效果图，有半透明、点光源效果。其实动起来会比较炫一点。</p>
<p>参考了下面教程（其实主要是抄）：<br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580560.aspx">OpenGL教程之纹理映射</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580565.aspx">OpenGL教程之纹理滤波方式</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580568.aspx">OpenGL教程之Alpha混合</a></p>
<p>除了教程里的功能，我还增加了按空格停止和按回车复位两个无聊功能……</p>
<p>整个程序也已经由上一篇的将近400行增加到了超过500行。不过和新的的优美效果比起来，这点代码似乎不算什么~<br />
<span id="more-692"></span></p>

<div class="wp_codebox"><table><tr id="p69258"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
</pre></td><td class="code" id="p692code58"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;windows.h&gt;</span>
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
<span style="color: #339900;">#include &lt;gl\gl.h&gt;</span>
<span style="color: #339900;">#include &lt;gl\glu.h&gt;</span>
<span style="color: #339900;">#include &lt;gl\glaux.h&gt;</span>
&nbsp;
HGLRC hRC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HDC hDC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HWND hWnd <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HINSTANCE hInstance<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> keys<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">256</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> active <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> fullscreen <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> light, blend, lp, fp, bp, f11p<span style="color: #008080;">;</span>
&nbsp;
GLfloat xrot, yrot, zrot<span style="color: #008080;">;</span>
GLfloat xspeed, yspeed<span style="color: #008080;">;</span>
GLfloat z <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color:#800080;">5.0f</span><span style="color: #008080;">;</span>
&nbsp;
GLfloat lightAmbient<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.5f</span>, <span style="color:#800080;">0.5f</span>, <span style="color:#800080;">0.5f</span>, <span style="color:#800080;">1.0f</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
GLfloat lightDiffuse<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
GLfloat lightPosition<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">2.0f</span>, <span style="color:#800080;">1.0f</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
GLuint filter<span style="color: #008080;">;</span>
GLuint texture<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
LRESULT CALLBACK WndProc<span style="color: #008000;">&#40;</span>HWND, UINT, WPARAM, LPARAM<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
AUX_RGBImageRec <span style="color: #000040;">*</span>LoadBMP<span style="color: #008000;">&#40;</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>
	<span style="color: #0000ff;">FILE</span> <span style="color: #000040;">*</span>file <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: #000040;">!</span> filename<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	file <span style="color: #000080;">=</span> <span style="color: #0000dd;">fopen</span><span style="color: #008000;">&#40;</span>filename, <span style="color: #FF0000;">&quot;r&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><span style="color: #000040;">!</span> file<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">fclose</span><span style="color: #008000;">&#40;</span>file<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> auxDIBImageLoad<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;
<span style="color: #0000ff;">int</span> LoadGLTextures<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> status <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	AUX_RGBImageRec <span style="color: #000040;">*</span>textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>textureImage, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> LoadBMP<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;test2.bmp&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		status <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</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>texture<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>
		glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, texture<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>
		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>
		glTexImage2D<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">3</span>, 
			textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeX, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeY,
			<span style="color: #0000dd;">0</span>, GL_RGB, GL_UNSIGNED_BYTE, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, texture<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>
		glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR<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_LINEAR<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>, <span style="color: #0000dd;">3</span>, 
			textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeX, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeY,
			<span style="color: #0000dd;">0</span>, GL_RGB, GL_UNSIGNED_BYTE, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, texture<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>
		glTexParameteri<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR<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_LINEAR_MIPMAP_NEAREST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		gluBuild2DMipmaps<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, <span style="color: #0000dd;">3</span>,
			textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeX, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sizeY,
			GL_RGB, GL_UNSIGNED_BYTE, textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>textureImage<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: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span>
			<span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>textureImage<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>data<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">free</span><span style="color: #008000;">&#40;</span>textureImage<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>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> status<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
GLvoid ReSizeGLScene<span style="color: #008000;">&#40;</span>GLsizei width, GLsizei height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>height <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		height <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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>
&nbsp;
	gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0f</span>, <span style="color: #008000;">&#40;</span>GLfloat<span style="color: #008000;">&#41;</span>width<span style="color: #000040;">/</span><span style="color: #008000;">&#40;</span>GLfloat<span style="color: #008000;">&#41;</span>height, <span style="color:#800080;">0.1f</span>, <span style="color:#800080;">100.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> InitGL<span style="color: #008000;">&#40;</span>GLvoid<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> LoadGLTextures<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
	glColor4f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.5f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glBlendFunc<span style="color: #008000;">&#40;</span>GL_SRC_ALPHA, GL_ONE<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glEnable<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glShadeModel<span style="color: #008000;">&#40;</span>GL_SMOOTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearDepth<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</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>
	glDepthFunc<span style="color: #008000;">&#40;</span>GL_LEQUAL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glHint<span style="color: #008000;">&#40;</span>GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	glLightfv<span style="color: #008000;">&#40;</span>GL_LIGHT1, GL_AMBIENT, lightAmbient<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glLightfv<span style="color: #008000;">&#40;</span>GL_LIGHT1, GL_DIFFUSE, lightDiffuse<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glLightfv<span style="color: #008000;">&#40;</span>GL_LIGHT1, GL_POSITION, lightPosition<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glEnable<span style="color: #008000;">&#40;</span>GL_LIGHT1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> DrawGLScene<span style="color: #008000;">&#40;</span>GLvoid<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>
&nbsp;
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTranslatef<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, z<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>xrot, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>yrot, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #666666;">//glRotatef(zrot, 0.0f, 0.0f, 1.0f);</span>
	glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glBindTexture<span style="color: #008000;">&#40;</span>GL_TEXTURE_2D, texture<span style="color: #008000;">&#91;</span>filter<span style="color: #008000;">&#93;</span><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>
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glNormal3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glTexCoord2f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</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;
	<span style="color: #666666;">//xrot += 0.3f, yrot += 0.2f, zrot += 0.4f;</span>
	xrot <span style="color: #000040;">+</span><span style="color: #000080;">=</span> xspeed<span style="color: #008080;">;</span>
	yrot <span style="color: #000040;">+</span><span style="color: #000080;">=</span> yspeed<span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
GLvoid KillGLWindow<span style="color: #008000;">&#40;</span>GLvoid<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		ChangeDisplaySettings<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		ShowCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hRC<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> wglMakeCurrent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Of DC And RC Failed.&quot;</span>,
				<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<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> wglDeleteContext<span style="color: #008000;">&#40;</span>hRC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Rendering Context Failed.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hRC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hDC <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span> ReleaseDC<span style="color: #008000;">&#40;</span>hWnd, hDC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Device Context Failed.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hDC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hWnd <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span> DestroyWindow<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Could Not Release hWnd.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hWnd <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> CreateGLWindow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> title, <span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height, <span style="color: #0000ff;">int</span> bits, <span style="color: #0000ff;">bool</span> fullscreenflag<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	GLuint PixelFormat<span style="color: #008080;">;</span>
	WNDCLASS wc<span style="color: #008080;">;</span>
	DWORD dwExStyle<span style="color: #008080;">;</span>
	DWORD dwStyle<span style="color: #008080;">;</span>
&nbsp;
	RECT windowRect<span style="color: #008080;">;</span>
	windowRect.<span style="color: #007788;">left</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	windowRect.<span style="color: #007788;">right</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span>width<span style="color: #008080;">;</span>
	windowRect.<span style="color: #007788;">top</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	windowRect.<span style="color: #007788;">bottom</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span>height<span style="color: #008080;">;</span>
&nbsp;
	fullscreen <span style="color: #000080;">=</span> fullscreenflag<span style="color: #008080;">;</span>
&nbsp;
	hInstance <span style="color: #000080;">=</span> GetModuleHandle<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">style</span> <span style="color: #000080;">=</span> CS_HREDRAW <span style="color: #000040;">|</span> CS_VREDRAW <span style="color: #000040;">|</span> CS_OWNDC<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpfnWndProc</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>WNDPROC<span style="color: #008000;">&#41;</span> WndProc<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">cbClsExtra</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">cbWndExtra</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hInstance</span> <span style="color: #000080;">=</span> hInstance<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hIcon</span> <span style="color: #000080;">=</span> LoadIcon<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, IDI_WINLOGO<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hCursor</span> <span style="color: #000080;">=</span> LoadCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, IDC_ARROW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hbrBackground</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpszMenuName</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpszClassName</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;OpenGL&quot;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> RegisterClass<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>wc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Failed To Register The Windows Class.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		DEVMODE dmScreenSettings<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>dmScreenSettings, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dmScreenSettings<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmSize</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dmScreenSettings<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmPelsWidth</span> <span style="color: #000080;">=</span> width<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmPelsHeight</span> <span style="color: #000080;">=</span> height<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmBitsPerPel</span> <span style="color: #000080;">=</span> bits<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmFields</span> <span style="color: #000080;">=</span> DM_BITSPERPEL <span style="color: #000040;">|</span> DM_PELSWIDTH <span style="color: #000040;">|</span> DM_PELSHEIGHT<span style="color: #008080;">;</span>
&nbsp;
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ChangeDisplaySettings<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>dmScreenSettings, 
			CDS_FULLSCREEN<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> DISP_CHANGE_SUCCESSFUL<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, 
				<span style="color: #FF0000;">&quot;The Requested Fullscreen Mode Is Not Supported By Your Video Card. Use Windowed Mode Instead?&quot;</span>,
				<span style="color: #FF0000;">&quot;OpenGL&quot;</span>, MB_YESNO <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> IDYES<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				fullscreen <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Program Will Now Close.&quot;</span>,
					<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONSTOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</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;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dwExStyle <span style="color: #000080;">=</span> WS_EX_APPWINDOW<span style="color: #008080;">;</span>
		dwStyle <span style="color: #000080;">=</span> WS_POPUP<span style="color: #008080;">;</span>
		ShowCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><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>
		dwExStyle <span style="color: #000080;">=</span> WS_EX_APPWINDOW <span style="color: #000040;">|</span> WS_EX_WINDOWEDGE<span style="color: #008080;">;</span>
		dwStyle <span style="color: #000080;">=</span> WS_OVERLAPPEDWINDOW<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	AdjustWindowRectEx<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>windowRect, dwStyle, <span style="color: #0000ff;">false</span>, dwExStyle<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hWnd <span style="color: #000080;">=</span> CreateWindowEx<span style="color: #008000;">&#40;</span>dwExStyle, <span style="color: #FF0000;">&quot;OpenGL&quot;</span>, title,
		WS_CLIPSIBLINGS <span style="color: #000040;">|</span> WS_CLIPCHILDREN <span style="color: #000040;">|</span> dwStyle, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>,
		windowRect.<span style="color: #007788;">right</span> <span style="color: #000040;">-</span> windowRect.<span style="color: #007788;">left</span>,
		windowRect.<span style="color: #007788;">bottom</span> <span style="color: #000040;">-</span> windowRect.<span style="color: #007788;">top</span>,
		<span style="color: #0000ff;">NULL</span>, <span style="color: #0000ff;">NULL</span>, hInstance, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Window Creation Error.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">static</span> PIXELFORMATDESCRIPTOR pfd <span style="color: #000080;">=</span> 
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>PIXELFORMATDESCRIPTOR<span style="color: #008000;">&#41;</span>, <span style="color: #0000dd;">1</span>,
		PFD_DRAW_TO_WINDOW <span style="color: #000040;">|</span> PFD_SUPPORT_OPENGL <span style="color: #000040;">|</span> PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA, bits, <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: #0000dd;">0</span>, <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: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>,
		<span style="color: #0000dd;">16</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, PFD_MAIN_PLANE, <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;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hDC <span style="color: #000080;">=</span> GetDC<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Create A GL Device Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>PixelFormat <span style="color: #000080;">=</span> ChoosePixelFormat<span style="color: #008000;">&#40;</span>hDC, <span style="color: #000040;">&amp;</span>pfd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Find A Suitable PixelFormat.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> SetPixelFormat<span style="color: #008000;">&#40;</span>hDC, PixelFormat, <span style="color: #000040;">&amp;</span>pfd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Set The PixelFormat.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hRC <span style="color: #000080;">=</span> wglCreateContext<span style="color: #008000;">&#40;</span>hDC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Create A GL Rendering Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> wglMakeCurrent<span style="color: #008000;">&#40;</span>hDC, hRC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Activate The GL Rendering Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	ShowWindow<span style="color: #008000;">&#40;</span>hWnd, SW_SHOW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SetForegroundWindow<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SetFocus<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	ReSizeGLScene<span style="color: #008000;">&#40;</span>width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> InitGL<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Initialization Failed.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
LRESULT CALLBACK WndProc<span style="color: #008000;">&#40;</span>HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>uMsg<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">case</span> WM_ACTIVATE<span style="color: #008080;">:</span>
		active <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> HIWORD<span style="color: #008000;">&#40;</span>wParam<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: #0000ff;">case</span> WM_SYSCOMMAND<span style="color: #008080;">:</span>
		<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>wParam<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> SC_SCREENSAVE<span style="color: #008080;">:</span> 
		<span style="color: #0000ff;">case</span> SC_MONITORPOWER<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>
		<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> WM_CLOSE<span style="color: #008080;">:</span>
		PostQuitMessage<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</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: #0000ff;">case</span> WM_KEYDOWN<span style="color: #008080;">:</span>
		keys<span style="color: #008000;">&#91;</span>wParam<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</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: #0000ff;">case</span> WM_KEYUP<span style="color: #008080;">:</span>
		keys<span style="color: #008000;">&#91;</span>wParam<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</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: #0000ff;">case</span> WM_SIZE<span style="color: #008080;">:</span>
		ReSizeGLScene<span style="color: #008000;">&#40;</span>LOWORD<span style="color: #008000;">&#40;</span>lParam<span style="color: #008000;">&#41;</span>, HIWORD<span style="color: #008000;">&#40;</span>lParam<span style="color: #008000;">&#41;</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>
	<span style="color: #0000ff;">return</span> DefWindowProc<span style="color: #008000;">&#40;</span>hWnd, uMsg, wParam, lParam<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> WINAPI WinMain<span style="color: #008000;">&#40;</span>HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, <span style="color: #0000ff;">int</span> nCmdShow<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	MSG msg<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> done <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
	fullscreen <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, 
		<span style="color: #FF0000;">&quot;Would You Like To Run In Fullscreen Mode?&quot;</span>,
		<span style="color: #FF0000;">&quot;Start Fullscreen?&quot;</span>, MB_YESNO <span style="color: #000040;">|</span> MB_ICONQUESTION<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> IDYES<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> CreateGLWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span>, <span style="color: #0000dd;">16</span>, fullscreen<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> done<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>PeekMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, PM_REMOVE<span style="color: #008000;">&#41;</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>msg.<span style="color: #007788;">message</span> <span style="color: #000080;">==</span> WM_QUIT<span style="color: #008000;">&#41;</span>
				done <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				TranslateMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				DispatchMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg<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: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>active<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_ESCAPE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
					done <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">else</span>
				<span style="color: #008000;">&#123;</span>
					DrawGLScene<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					SwapBuffers<span style="color: #008000;">&#40;</span>hDC<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'L'</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>lp<span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						lp <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
						light <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> light<span style="color: #008080;">;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> light<span style="color: #008000;">&#41;</span>
							glDisable<span style="color: #008000;">&#40;</span>GL_LIGHTING<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">else</span>
							glEnable<span style="color: #008000;">&#40;</span>GL_LIGHTING<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: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'L'</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
						lp <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'F'</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>fp<span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						fp <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
						filter <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>filter <span style="color: #000080;">&gt;</span> <span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span> filter <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><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: #000040;">!</span> keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'F'</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
						fp <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'B'</span><span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>bp<span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						bp <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
						blend <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> blend<span style="color: #008080;">;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>blend<span style="color: #008000;">&#41;</span>
						<span style="color: #008000;">&#123;</span>
							glEnable<span style="color: #008000;">&#40;</span>GL_BLEND<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
							glDisable<span style="color: #008000;">&#40;</span>GL_DEPTH_TEST<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>
							glDisable<span style="color: #008000;">&#40;</span>GL_BLEND<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>
						<span style="color: #008000;">&#125;</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: #000040;">!</span> keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">'B'</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
						bp <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_F11<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>f11p<span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						f11p <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
						KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
						fullscreen <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> fullscreen<span style="color: #008080;">;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> CreateGLWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span>, <span style="color: #0000dd;">16</span>, fullscreen<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</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: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>keys<span style="color: #008000;">&#91;</span>VK_F11<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
						f11p <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_PRIOR<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> z <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.02f</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_NEXT<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> z <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.02f</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_UP<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> xspeed <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.01f</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_DOWN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> xspeed <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.01f</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_RIGHT<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> yspeed <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.01f</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_LEFT<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> yspeed <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.01f</span><span style="color: #008080;">;</span>
&nbsp;
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">' '</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> xspeed <span style="color: #000080;">=</span> <span style="color:#800080;">0.0f</span>, yspeed <span style="color: #000080;">=</span> <span style="color:#800080;">0.0f</span><span style="color: #008080;">;</span>
					<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> z <span style="color: #000080;">=</span> <span style="color: #000040;">-</span><span style="color:#800080;">5.0f</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	KillGLWindow<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: #008000;">&#40;</span>msg.<span style="color: #007788;">wParam</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/opengl-small-test-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL 的小试验（一）</title>
		<link>http://blog.upsuper.org/opengl-small-test-1/</link>
		<comments>http://blog.upsuper.org/opengl-small-test-1/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 13:17:10 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[探究学习]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[OpenGL]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=686</guid>
		<description><![CDATA[今天突然心血来潮想看看 OpenGL。找了个 OpenGL 的教程，看起来不错。不过这个教程着实吓了我一跳，第一篇的代码就超过了300行！先来一个效果图~ 我参考的教程有： OpenGL教程之新手上路 OpenGL教程之第一个多边形 OpenGL教程之着色 OpenGL教程之旋转 OpenGL教程之向3D进军 然后写了段小程序（不过大部分代码是直接抄的……而且我一点也不觉得小……398行……）： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.upsuper.org/wp-content/uploads/2009/02/test1-300x234.png" alt="test1" title="test1" width="300" height="234" class="alignright size-medium wp-image-688" />今天突然心血来潮想看看 OpenGL。找了个 OpenGL 的教程，看起来不错。不过这个教程着实吓了我一跳，第一篇的代码就超过了300行！先来一个效果图~</p>
<p>我参考的教程有：<br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580530.aspx">OpenGL教程之新手上路</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580532.aspx">OpenGL教程之第一个多边形</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580533.aspx">OpenGL教程之着色</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580536.aspx">OpenGL教程之旋转</a><br />
<a href="http://blog.csdn.net/lovetangtang/archive/2006/01/16/580544.aspx">OpenGL教程之向3D进军</a><br />
<span id="more-686"></span><br />
然后写了段小程序（不过大部分代码是直接抄的……而且我一点也不觉得小……398行……）：</p>

<div class="wp_codebox"><table><tr id="p68660"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
</pre></td><td class="code" id="p686code60"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;windows.h&gt;</span>
<span style="color: #339900;">#include &lt;glgl.h&gt;</span>
<span style="color: #339900;">#include &lt;glglu.h&gt;</span>
<span style="color: #339900;">#include &lt;glglaux.h&gt;</span>
&nbsp;
HGLRC hRC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HDC hDC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HWND hWnd <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
HINSTANCE hInstance<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> keys<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">256</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> active <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> fullscreen <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
&nbsp;
GLfloat rtri<span style="color: #008080;">;</span>
GLfloat rquad<span style="color: #008080;">;</span>
&nbsp;
LRESULT CALLBACK WndProc<span style="color: #008000;">&#40;</span>HWND, UINT, WPARAM, LPARAM<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
GLvoid ReSizeGLScene<span style="color: #008000;">&#40;</span>GLsizei width, GLsizei height<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>height <span style="color: #000080;">==</span> <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		height <span style="color: #000080;">=</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	glViewport<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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>
&nbsp;
	gluPerspective<span style="color: #008000;">&#40;</span><span style="color:#800080;">45.0f</span>, <span style="color: #008000;">&#40;</span>GLfloat<span style="color: #008000;">&#41;</span>width<span style="color: #000040;">/</span><span style="color: #008000;">&#40;</span>GLfloat<span style="color: #008000;">&#41;</span>height, <span style="color:#800080;">0.1f</span>, <span style="color:#800080;">100.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	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>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> InitGL<span style="color: #008000;">&#40;</span>GLvoid<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	glShadeModel<span style="color: #008000;">&#40;</span>GL_SMOOTH<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearColor<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glClearDepth<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</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>
	glDepthFunc<span style="color: #008000;">&#40;</span>GL_LEQUAL<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glHint<span style="color: #008000;">&#40;</span>GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> DrawGLScene<span style="color: #008000;">&#40;</span>GLvoid<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>
&nbsp;
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTranslatef<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.5f</span>, <span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">6.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>rtri, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glBegin<span style="color: #008000;">&#40;</span>GL_TRIANGLES<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">0.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</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_QUADS<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</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;
	glLoadIdentity<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glTranslatef<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.5f</span>, <span style="color:#800080;">0.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">7.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	glRotatef<span style="color: #008000;">&#40;</span>rquad, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><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>
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.5f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">0.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span><span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
		glColor3f<span style="color: #008000;">&#40;</span><span style="color:#800080;">1.0f</span>, <span style="color:#800080;">0.0f</span>, <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>,  <span style="color:#800080;">1.0f</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		glVertex3f<span style="color: #008000;">&#40;</span> <span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</span>, <span style="color: #000040;">-</span><span style="color:#800080;">1.0f</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;
	rtri <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.2f</span><span style="color: #008080;">;</span>
	rquad <span style="color: #000040;">-</span><span style="color: #000080;">=</span> <span style="color:#800080;">0.15f</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
GLvoid KillGLWindow<span style="color: #008000;">&#40;</span>GLvoid<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		ChangeDisplaySettings<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		ShowCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">true</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hRC<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> wglMakeCurrent<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Of DC And RC Failed.&quot;</span>,
				<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<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> wglDeleteContext<span style="color: #008000;">&#40;</span>hRC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Rendering Context Failed.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hRC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hDC <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span> ReleaseDC<span style="color: #008000;">&#40;</span>hWnd, hDC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Release Device Context Failed.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hDC <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>hWnd <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span> DestroyWindow<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Could Not Release hWnd.&quot;</span>,
			<span style="color: #FF0000;">&quot;SHUTDOWN ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONINFORMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		hWnd <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> CreateGLWindow<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> title, <span style="color: #0000ff;">int</span> width, <span style="color: #0000ff;">int</span> height, <span style="color: #0000ff;">int</span> bits, <span style="color: #0000ff;">bool</span> fullscreenflag<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	GLuint PixelFormat<span style="color: #008080;">;</span>
	WNDCLASS wc<span style="color: #008080;">;</span>
	DWORD dwExStyle<span style="color: #008080;">;</span>
	DWORD dwStyle<span style="color: #008080;">;</span>
&nbsp;
	RECT WindowRect<span style="color: #008080;">;</span>
	WindowRect.<span style="color: #007788;">left</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	WindowRect.<span style="color: #007788;">right</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span>width<span style="color: #008080;">;</span>
	WindowRect.<span style="color: #007788;">top</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	WindowRect.<span style="color: #007788;">bottom</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span>height<span style="color: #008080;">;</span>
&nbsp;
	fullscreen <span style="color: #000080;">=</span> fullscreenflag<span style="color: #008080;">;</span>
&nbsp;
	hInstance <span style="color: #000080;">=</span> GetModuleHandle<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">style</span> <span style="color: #000080;">=</span> CS_HREDRAW <span style="color: #000040;">|</span> CS_VREDRAW <span style="color: #000040;">|</span> CS_OWNDC<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpfnWndProc</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>WNDPROC<span style="color: #008000;">&#41;</span> WndProc<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">cbClsExtra</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">cbWndExtra</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hInstance</span> <span style="color: #000080;">=</span> hInstance<span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hIcon</span> <span style="color: #000080;">=</span> LoadIcon<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, IDI_WINLOGO<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hCursor</span> <span style="color: #000080;">=</span> LoadCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, IDC_ARROW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">hbrBackground</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpszMenuName</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
	wc.<span style="color: #007788;">lpszClassName</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;OpenGL&quot;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> RegisterClass<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>wc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Failed To Register The Windows Class.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		DEVMODE dmScreenSettings<span style="color: #008080;">;</span>
		<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>dmScreenSettings, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dmScreenSettings<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmSize</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dmScreenSettings<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmPelsWidth</span> <span style="color: #000080;">=</span> width<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmPelsHeight</span> <span style="color: #000080;">=</span> height<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmBitsPerPel</span> <span style="color: #000080;">=</span> bits<span style="color: #008080;">;</span>
		dmScreenSettings.<span style="color: #007788;">dmFields</span> <span style="color: #000080;">=</span> DM_BITSPERPEL <span style="color: #000040;">|</span> DM_PELSWIDTH <span style="color: #000040;">|</span> DM_PELSHEIGHT<span style="color: #008080;">;</span>
&nbsp;
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ChangeDisplaySettings<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>dmScreenSettings, 
			CDS_FULLSCREEN<span style="color: #008000;">&#41;</span> <span style="color: #000040;">!</span><span style="color: #000080;">=</span> DISP_CHANGE_SUCCESSFUL<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, 
				<span style="color: #FF0000;">&quot;The Requested Fullscreen Mode Is Not Supported By Your Video Card. Use Windowed Mode Instead?&quot;</span>,
				<span style="color: #FF0000;">&quot;OpenGL&quot;</span>, MB_YESNO <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> IDYES<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				fullscreen <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Program Will Now Close.&quot;</span>,
					<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONSTOP<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</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;">if</span> <span style="color: #008000;">&#40;</span>fullscreen<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		dwExStyle <span style="color: #000080;">=</span> WS_EX_APPWINDOW<span style="color: #008080;">;</span>
		dwStyle <span style="color: #000080;">=</span> WS_POPUP<span style="color: #008080;">;</span>
		ShowCursor<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">false</span><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>
		dwExStyle <span style="color: #000080;">=</span> WS_EX_APPWINDOW <span style="color: #000040;">|</span> WS_EX_WINDOWEDGE<span style="color: #008080;">;</span>
		dwStyle <span style="color: #000080;">=</span> WS_OVERLAPPEDWINDOW<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	AdjustWindowRectEx<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>WindowRect, dwStyle, <span style="color: #0000ff;">false</span>, dwExStyle<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hWnd <span style="color: #000080;">=</span> CreateWindowEx<span style="color: #008000;">&#40;</span>dwExStyle, <span style="color: #FF0000;">&quot;OpenGL&quot;</span>, title,
		WS_CLIPSIBLINGS <span style="color: #000040;">|</span> WS_CLIPCHILDREN <span style="color: #000040;">|</span> dwStyle, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>,
		WindowRect.<span style="color: #007788;">right</span> <span style="color: #000040;">-</span> WindowRect.<span style="color: #007788;">left</span>,
		WindowRect.<span style="color: #007788;">bottom</span> <span style="color: #000040;">-</span> WindowRect.<span style="color: #007788;">top</span>,
		<span style="color: #0000ff;">NULL</span>, <span style="color: #0000ff;">NULL</span>, hInstance, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Window Creation Error.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">static</span> PIXELFORMATDESCRIPTOR pfd <span style="color: #000080;">=</span> 
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>PIXELFORMATDESCRIPTOR<span style="color: #008000;">&#41;</span>, <span style="color: #0000dd;">1</span>,
		PFD_DRAW_TO_WINDOW <span style="color: #000040;">|</span> PFD_SUPPORT_OPENGL <span style="color: #000040;">|</span> PFD_DOUBLEBUFFER,
		PFD_TYPE_RGBA, bits, <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: #0000dd;">0</span>, <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: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>,
		<span style="color: #0000dd;">16</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, PFD_MAIN_PLANE, <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;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hDC <span style="color: #000080;">=</span> GetDC<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Create A GL Device Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>PixelFormat <span style="color: #000080;">=</span> ChoosePixelFormat<span style="color: #008000;">&#40;</span>hDC, <span style="color: #000040;">&amp;</span>pfd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Find A Suitable PixelFormat.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> SetPixelFormat<span style="color: #008000;">&#40;</span>hDC, PixelFormat, <span style="color: #000040;">&amp;</span>pfd<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Set The PixelFormat.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> <span style="color: #008000;">&#40;</span>hRC <span style="color: #000080;">=</span> wglCreateContext<span style="color: #008000;">&#40;</span>hDC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Create A GL Rendering Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> wglMakeCurrent<span style="color: #008000;">&#40;</span>hDC, hRC<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Can't Activate The GL Rendering Context.&quot;</span>,
			<span style="color: #FF0000;">&quot;ERROR&quot;</span>, MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	ShowWindow<span style="color: #008000;">&#40;</span>hWnd, SW_SHOW<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SetForegroundWindow<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	SetFocus<span style="color: #008000;">&#40;</span>hWnd<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	ReSizeGLScene<span style="color: #008000;">&#40;</span>width, height<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> InitGL<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		KillGLWindow<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;Initialization Failed.&quot;</span>, <span style="color: #FF0000;">&quot;ERROR&quot;</span>,
			MB_OK <span style="color: #000040;">|</span> MB_ICONEXCLAMATION<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
LRESULT CALLBACK WndProc<span style="color: #008000;">&#40;</span>HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>uMsg<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">case</span> WM_ACTIVATE<span style="color: #008080;">:</span>
		active <span style="color: #000080;">=</span> <span style="color: #000040;">!</span> HIWORD<span style="color: #008000;">&#40;</span>wParam<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: #0000ff;">case</span> WM_SYSCOMMAND<span style="color: #008080;">:</span>
		<span style="color: #0000ff;">switch</span> <span style="color: #008000;">&#40;</span>wParam<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">case</span> SC_SCREENSAVE<span style="color: #008080;">:</span> 
		<span style="color: #0000ff;">case</span> SC_MONITORPOWER<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>
		<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">case</span> WM_CLOSE<span style="color: #008080;">:</span>
		PostQuitMessage<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</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: #0000ff;">case</span> WM_KEYDOWN<span style="color: #008080;">:</span>
		keys<span style="color: #008000;">&#91;</span>wParam<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</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: #0000ff;">case</span> WM_KEYUP<span style="color: #008080;">:</span>
		keys<span style="color: #008000;">&#91;</span>wParam<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</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: #0000ff;">case</span> WM_SIZE<span style="color: #008080;">:</span>
		ReSizeGLScene<span style="color: #008000;">&#40;</span>LOWORD<span style="color: #008000;">&#40;</span>lParam<span style="color: #008000;">&#41;</span>, HIWORD<span style="color: #008000;">&#40;</span>lParam<span style="color: #008000;">&#41;</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>
	<span style="color: #0000ff;">return</span> DefWindowProc<span style="color: #008000;">&#40;</span>hWnd, uMsg, wParam, lParam<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> WINAPI WinMain<span style="color: #008000;">&#40;</span>HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, <span style="color: #0000ff;">int</span> nCmdShow<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	MSG msg<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> done <span style="color: #000080;">=</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
&nbsp;
	fullscreen <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>MessageBox<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, 
		<span style="color: #FF0000;">&quot;Would You Like To Run In Fullscreen Mode?&quot;</span>,
		<span style="color: #FF0000;">&quot;Start Fullscreen?&quot;</span>, MB_YESNO <span style="color: #000040;">|</span> MB_ICONQUESTION<span style="color: #008000;">&#41;</span> <span style="color: #000080;">==</span> IDYES<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> CreateGLWindow<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;OpenGL Test&quot;</span>, <span style="color: #0000dd;">640</span>, <span style="color: #0000dd;">480</span>, <span style="color: #0000dd;">16</span>, fullscreen<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span> done<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>PeekMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg, <span style="color: #0000ff;">NULL</span>, <span style="color: #0000dd;">0</span>, <span style="color: #0000dd;">0</span>, PM_REMOVE<span style="color: #008000;">&#41;</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>msg.<span style="color: #007788;">message</span> <span style="color: #000080;">==</span> WM_QUIT<span style="color: #008000;">&#41;</span>
				done <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
			<span style="color: #008000;">&#123;</span>
				TranslateMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				DispatchMessage<span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>msg<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: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>active<span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>keys<span style="color: #008000;">&#91;</span>VK_ESCAPE<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
					done <span style="color: #000080;">=</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">else</span>
				<span style="color: #008000;">&#123;</span>
					DrawGLScene<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					SwapBuffers<span style="color: #008000;">&#40;</span>hDC<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>
	<span style="color: #008000;">&#125;</span>
&nbsp;
	KillGLWindow<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: #008000;">&#40;</span>msg.<span style="color: #007788;">wParam</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/opengl-small-test-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ujudger-base 0.1 Released</title>
		<link>http://blog.upsuper.org/ujudger-base-0-1-released/</link>
		<comments>http://blog.upsuper.org/ujudger-base-0-1-released/#comments</comments>
		<pubDate>Sun, 29 Jun 2008 14:45:21 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[我的计划]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ujudger]]></category>
		<category><![CDATA[源代码]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=122</guid>
		<description><![CDATA[经过我许多的资料查找和编写，终于完成了ujudger-base的第一个版本！ ujudger 是我准备编写的基于 Linux 的测评程序，采用 GPL 协议。由于一直以来找不到 Linux 下的测评程序，因此准备自己写一个。ujudger 的 u 既是取我网名的第一个字母，也是 ubuntu 的第一个字母，表示这个程序应该会在 ubuntu 下完成编写。而 ujudger-base 是 ujudger 的基础程序，表现 ujudger 的测评核心，即耗时和内存耗用的取得。使用 time 命令和系统监视器监视器的资料对比一下，ujudger-base 获得的信息还是比较体现程序的真实情况的。 ujudger-base 并不复杂，不过也不简单（自少我这么觉得）。在编写的过程中，开始不知道 Linux 下的进程控制，后来知道了 fork() 函数。开始觉得很奇怪，后来也就慢慢明白了。不就是返回两次么，有什么了不起的~然后就是exec族的函数，成功了就不返回了_-b 然后就是等待的办法。网上有些人是直接用 wait4 快速返回来等待，但我觉得这样很影响速度，因此采用了 usleep 等待 100ms（有没有一点像 Cena 的方法？）。 同时，我还查找了有关程序运行数据读取的相关问题，最后采用的是读取 /proc/&#60;pid&#62;/stat 文件的方法。具体采用的一些技术层的资料我准备明天发一篇来讲。 除此之外就是几乎第一次大规模的采用 C++ 的推荐风格编写程序（以前写OI的程序，为了效率不得不放弃许多 C++ 优美的特性），因此有写丑的地方也请多多指教。 里面的注释很多了，由于我的英语水平有限（My English is limited!），如果注释有什么语法错误，也请多多指教！ 点击这里下载源代码：ujudger-base-0.1.cpp (3.6 KB)]]></description>
			<content:encoded><![CDATA[<p>经过我许多的资料查找和编写，终于完成了ujudger-base的第一个版本！</p>
<p>ujudger 是我准备编写的基于 Linux 的测评程序，采用 GPL 协议。由于一直以来找不到 Linux 下的测评程序，因此准备自己写一个。ujudger 的 u 既是取我网名的第一个字母，也是 ubuntu 的第一个字母，表示这个程序应该会在 ubuntu 下完成编写。而 ujudger-base 是 ujudger 的基础程序，表现 ujudger 的测评核心，即耗时和内存耗用的取得。使用 time 命令和系统监视器监视器的资料对比一下，ujudger-base 获得的信息还是比较体现程序的真实情况的。<br />
<span id="more-122"></span><br />
ujudger-base 并不复杂，不过也不简单（自少我这么觉得）。在编写的过程中，开始不知道 Linux 下的进程控制，后来知道了 fork() 函数。开始觉得很奇怪，后来也就慢慢明白了。不就是返回两次么，有什么了不起的~然后就是exec族的函数，成功了就不返回了_-b</p>
<p>然后就是等待的办法。网上有些人是直接用 wait4 快速返回来等待，但我觉得这样很影响速度，因此采用了 usleep 等待 100ms（有没有一点像 Cena 的方法？）。</p>
<p>同时，我还查找了有关程序运行数据读取的相关问题，最后采用的是读取 /proc/&lt;pid&gt;/stat 文件的方法。具体采用的一些技术层的资料我准备明天发一篇来讲。</p>
<p>除此之外就是几乎第一次大规模的采用 C++ 的推荐风格编写程序（以前写OI的程序，为了效率不得不放弃许多 C++ 优美的特性），因此有写丑的地方也请多多指教。</p>
<p>里面的注释很多了，由于我的英语水平有限（My English is limited!），如果注释有什么语法错误，也请多多指教！</p>
<p>点击这里下载源代码：<a href="http://ujudger.upsuper.org/src/ujudger-base-0.1.cpp">ujudger-base-0.1.cpp</a> (3.6 KB)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ujudger-base-0-1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>自己写的QuickSearch</title>
		<link>http://blog.upsuper.org/quicksearch-by-myself/</link>
		<comments>http://blog.upsuper.org/quicksearch-by-myself/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 05:53:13 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[搜索]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=8</guid>
		<description><![CDATA[今天研究Discuz!代码的时候要搜索一个函数在哪里被调用，结果不懂怎么办。 Windows的搜索貌似某个服务被我禁了一直以来都不能用，而Google的Desktop又不收编这些东西…… 花了一点时间写了一个QuickSearch，代码也很短，效率也很高。用法就是“QuickSearch 关键字”。就会遍历当前目录及其子目录下的所有的文件，查找包含关键字的文件。 如果你也喜欢可以在这里下载：QuickSearch.exe (16KB) 由于使用VS2005编译，需要.NET Framework 2.0支持。源代码在下方，可以用VS2003编译。 蛮好用的说，代码也很短： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 using System; using System.IO; &#160; namespace QuickSearch &#123; class Program &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>今天研究Discuz!代码的时候要搜索一个函数在哪里被调用，结果不懂怎么办。</p>
<p>Windows的搜索貌似某个服务被我禁了一直以来都不能用，而Google的Desktop又不收编这些东西……</p>
<p>花了一点时间写了一个QuickSearch，代码也很短，效率也很高。用法就是“QuickSearch 关键字”。就会遍历当前目录及其子目录下的所有的文件，查找包含关键字的文件。</p>
<p>如果你也喜欢可以在这里下载：<a href="http://down.upsuper.org/QuickSearch.exe">QuickSearch.exe</a> (16KB)</p>
<p>由于使用VS2005编译，需要.NET Framework 2.0支持。源代码在下方，可以用VS2003编译。</p>
<p><span id="more-8"></span></p>
<p>蛮好用的说，代码也很短：</p>

<div class="wp_codebox"><table><tr id="p862"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p8code62"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> QuickSearch
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> curdir <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentDirectory</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> lcurdir <span style="color: #008000;">=</span> curdir<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> searchText<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            searchText <span style="color: #008000;">=</span> args<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
            SearchDir<span style="color: #008000;">&#40;</span>curdir<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> filecontent<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> SearchDir<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> path<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> files <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetFiles</span><span style="color: #008000;">&#40;</span>path<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> file <span style="color: #0600FF; font-weight: bold;">in</span> files<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                filecontent <span style="color: #008000;">=</span> File<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadAllText</span><span style="color: #008000;">&#40;</span>file<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>filecontent<span style="color: #008000;">.</span><span style="color: #0000FF;">IndexOf</span><span style="color: #008000;">&#40;</span>searchText<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
                    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>file<span style="color: #008000;">.</span><span style="color: #0000FF;">Substring</span><span style="color: #008000;">&#40;</span>lcurdir<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> dirs <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetDirectories</span><span style="color: #008000;">&#40;</span>path<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> dir <span style="color: #0600FF; font-weight: bold;">in</span> dirs<span style="color: #008000;">&#41;</span>
                SearchDir<span style="color: #008000;">&#40;</span>dir<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/quicksearch-by-myself/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>瑞星导致Cena测评失误</title>
		<link>http://blog.upsuper.org/rising-make-cena-wrong/</link>
		<comments>http://blog.upsuper.org/rising-make-cena-wrong/#comments</comments>
		<pubDate>Sun, 13 Jan 2008 05:49:00 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[雕虫小技]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[杀毒]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=14</guid>
		<description><![CDATA[生日邀请赛，当然要十分慎重。昨天用C++写完了第一题的标程，生成数据后，拿到Cena上一测，竟然几乎全部显示“无输出” _-b 经过反复测试，发现如果我不用freopen修改标准流，而用fopen或fstream就没有问题。可是freopen毕竟是我们平常最常用的方法啊？如果不行，测评结果肯定也会有很大误差。不过，说一句，有一个人的C++程序测了竟然不会“无输出”，是我们信息组另一个用C++的，很早以前的程序，同样用freopen，她不会出错，我会…… 一开始怀疑我的Diskeeper，结果关掉以后依旧会。最后开始怀疑瑞星。把瑞星的全部监控关掉，仍然没有解决问题。突然发现，瑞星的伞还是黄色的，发现原来还有主动防御，把主动防御全部关掉，结果就过了。 最后经过反复排查，发现是瑞星的“恶意行为检测”有问题。 我也不懂是怎么回事呃，但我已经向瑞星客服报告了这一问题。]]></description>
			<content:encoded><![CDATA[<p>生日邀请赛，当然要十分慎重。昨天用C++写完了第一题的标程，生成数据后，拿到Cena上一测，竟然几乎全部显示“无输出” _-b</p>
<p>经过反复测试，发现如果我不用freopen修改标准流，而用fopen或fstream就没有问题。可是freopen毕竟是我们平常最常用的方法啊？如果不行，测评结果肯定也会有很大误差。不过，说一句，有一个人的C++程序测了竟然不会“无输出”，是我们信息组另一个用C++的，很早以前的程序，同样用freopen，她不会出错，我会……</p>
<p>一开始怀疑我的Diskeeper，结果关掉以后依旧会。最后开始怀疑瑞星。把瑞星的全部监控关掉，仍然没有解决问题。突然发现，瑞星的伞还是黄色的，发现原来还有主动防御，把主动防御全部关掉，结果就过了。</p>
<p>最后经过反复排查，发现是瑞星的“恶意行为检测”有问题。</p>
<p>我也不懂是怎么回事呃，但我已经向瑞星客服报告了这一问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/rising-make-cena-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我们的Online Judge</title>
		<link>http://blog.upsuper.org/our-online-judge/</link>
		<comments>http://blog.upsuper.org/our-online-judge/#comments</comments>
		<pubDate>Sat, 13 Oct 2007 11:33:28 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[我的计划]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Online Judge]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=27</guid>
		<description><![CDATA[和 MRain 开始编写我们信息组内部用的Online Judge。 这个Online Judge我准备做成类似Cena的网页版，准备使用PHP+MySQL+Apache+Windows2K3作为运行环境，AJAX做界面，C++程序做后台测评程序。采取类似USACO的提交立即测评，在线等待结果的测评方式。 现在我正在撰写文档，估计正式编写工作从下一周开始。]]></description>
			<content:encoded><![CDATA[<p>和 MRain 开始编写我们信息组内部用的Online Judge。</p>
<p>这个Online Judge我准备做成类似Cena的网页版，准备使用PHP+MySQL+Apache+Windows2K3作为运行环境，AJAX做界面，C++程序做后台测评程序。采取类似USACO的提交立即测评，在线等待结果的测评方式。</p>
<p>现在我正在撰写文档，估计正式编写工作从下一周开始。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/our-online-judge/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

