「ソフトウェアー・エンジニアリング」カテゴリーアーカイブ

ソフトウェアー関係の話題など・・

最近は、github にプッシュしてます~

MuPDF 1.2 ライブラリーの C++ ラッパー

MuPDF とは?

MuPDF は、PDF を描画する為のライブラリーで、C で実装されたオープンソースライブラリーである。
非常に軽量で、高速、色々なプラットフォームに対応している。

Adobe の PDF Reader は、はっきり言って「糞」だ、頻繁にバージョンアップを繰り返して、とにかく「ウザイ」し、重いし、良い所は無い。
MuPDF のエンジンを使ったアプリケーションとして、Sumatra PDF がある。
※自分は、AdobeReader はアンインストールして、コレを使っているが、得に不便を感じない。

以前から、自分のフレームワーク(以前から使っていた「glfw」って名称は、GLFW3 と混同しやすいので使えん、新しい名称を考えないと・・・)では MuPDF ライブラリーのラッパーを実装していたが、それはバージョンが 1.0 になる前で、最新は、1.2 となっている。
バージョンアップしたいと思っていたが、API 変わって、書き直す必要があった、最近ようやく、1.2ライブラリーをコンパイルしなおして、ラッパーを書き直した。

コードがかなり洗練され、とても使いやすくなったようだ、ワイド文字列の処理も UTF8 に統一され、レンダリングも簡単になった。

折角なので、簡単な描画サンプルを作ってみた、描画は GLFW3(OpenGL) で、レンダリングされた PDF はテクスチャーとして扱う。
操作方法:
起動したら、PDF ファイルをドラッグ&ドロップ
マウスボタンの右、左でページ移動(PageUp、PageDownキーでも可能)

自分で作成したアプリケーションに PDF を簡単に表示できるのは、色々と便利な事が多い!
このアプリは、サンプルなので、必要最低限の機能しかないのであしからず~

「img_io/pdf_in.hpp」を観てもらえば、大体の使い方は判ると思う。

ソースコード
実行バイナリー

コンパイルに必要なライブラリーパック
※注意 /usr/local/ 以下に展開
※このライブラリーパックに mupdf のライブラリー libfitz.a が同根されています。
※ MuPDF ライブラリーは、freetype2、JPEG、Z-Lib、jbig2dec、OpenJpeg(JPEG2000)などのライブラリーを必要とします。(それも同根してあります)
※JPEG ライブラリーは、x86 アセンブラで高速化してあるバージョンが入っています。

らぶひな PDF
PDF_test1

RX マイコンのPDF
PDF_test2

GLFW3と自分FWを使って昔懐かしい「Space Invaders」を作る

以前から、チクチクとゲーム開発の補助になる自分用フレームワークを作ってきましたがー
GLFW3 がリリースされたタイミングで、glut から GLFW3 に変更していましたが、とりあえずのベータが出来たので、アーカイブを公開します。

自分用フレームワークの完成度を上げるには、一通りの機能を使って、アプリケーションを作る必要があるものです。
また、C++ の熟練度が少しづつ向上して、ソースコードの品質も少しづつではあるけど洗練されてきつつあります。
そこで、何か良い題材は無い物かと考えてましたが、とりあえず、キーボード入力と、サウンド(効果音)が出る、そして簡潔に出来る。
などの理由で、昔懐かしい「Space Invaders」を作る事にしましたww

「作る」と言っても、「Space Invaders」は、mame32 由来のエミュレーターソースをそのまま使います。
※その為、このソースコードもそれらライセンスに従います。

スペースインベーダーは、8ビットのZ80(2MHz)を使い、256×240のモノクロビットマップグラフィクスを使ったゲームで、
当時は、もの凄く洗練されていました。(今でも洗練されていると思う)
エミュレーターは、8080のエミュレーションと、インベーダーのハードをエミュレーションします。
結果は、モノクロビットマップの出力として出てくるので、OpenGL のテクスチャーに貼って、描画します。
インベーダーはアナログシンセサイザーを持っていて、現在では、はサンプリングされたデータを入手出来るので、それを使いSEとして
発音します。

spain

プログラムの動作には、ROMイメージが必要なので、どこかで見つけて下さい。
※このプログラムでは、sounds.zip、invaders.zip の二つのアーカイブを必要とします。
ここが参考になると思います

ソースコード

コンパイルに必要なライブラリー郡、/usr/local 以下に展開

boost_1_53_0 が必要です。

コンパイル済みバイナリー

※操作方法
「1」1プレイヤーボタン
「2」2プレイヤーボタン
「3」コイン
「←」ビーム砲左
「SPACE」ビーム発射
「→」ビーム砲右

GLFW-3.0.1 の機能追加

GLFW ですが、既に 3.0.1 がリリースされてましたーー

Bugfix: The wrong name was used for the CMake variable for the Xxf86vm library
[Cocoa] Bugfix: glfwGetFramebufferSize return the size in screen coordinates
[Cocoa] Bugfix: Messages not supported on Mac OS X 10.6 were used without tests for precence
[Cocoa] Bugfix: Process transformation was not performed if menu bar creation was disabled
[Win32] Bugfix: Context creation was attempted even if no valid pixel formats had been found
[X11] Bugfix: Duplicate window position and window and framebuffer size events were reported

まぁ、基本的にBugFixのようですが・・・

さて、OpenGL のアプリケーションですが、作っていて不便な事があります、アプリケーション・ウィンドウに
ファイルをドラッグ・アンド・ドロップして、ファイル名を受け取る事が出来ない事です。

アプリケーションを作る上で不便なので、GLFW を改造して、この機能を付けましたー

glfw-3.0.1 のパッチ

glfw-3.0.1 のソースを展開して、ルートディレクトリーに異動後、以下のコマンドを入れればパッチが当たると思います。

patch -p0 < glfw_3_0_1-dropfiles.diff で、make すれば OK。 exsamples に dropfiles.c のサンプルがあるので、これを観ればどのようにファイル名を受け取るのか判ると思います。 もっと実用的なサンプルとして、ビューアー・プレイヤーを作りました。
※ソースコードが欲しい方は、連絡下さい、必要なフレームワークの準備に少し時間が必要です。

このアプリケーションは、起動すると、空のウィンドウが開きます、ここに画像ファイル(BMP、PNG、JPEG、JPEG2000)や音楽ファイル(WAV、MP3)を落とせば、それを開きます。
※音楽ファイルは再生します、MP3に画像が含まれている場合は、それを表示します。

※メイン部分だけアップしておきます~

GLFW3.0 を使う

自分のフレームワークとして、「gl_fw」と言うプロジェクトを実装していましたがー

最近(そうでもないかww)、GLFW と言うフレームワークがある事を知りました、現在のところ、OS-X、X11、Windows で使える、マルチプラットホームのフレームワークです。
C、Objective-C(OS-X)で実装されており、シンプルで、良く出来ています。
※「glut」があるのですが、これは、メンテナンスされていないし、色々と痛いところが多いのです。

最近、メジャーバージョンが「3.0」となり、「2.x」から、より洗練された実装になりましたー、まだ機能で欲しい部分は色々あるのですがー、これから追加されていくと思います。

自分のフレームワークも glut から GLFW に変更すべく色々修正中です。
GLFW 3.x で良い部分をいくつか上げると・・・
・マウスホイールのイベントを取得できる。
・クリップボードのやり取りが追加された。
・メインループから綺麗に抜けてくれる。(glutでは、スマートでは無い方法で実装しなければなりません・・)
・ゲームパッドの値を標準的に取得できる。
・キーボードの扱いがゲーム向き。(単純に押したか、押さないを取得できる)
・必要最小限の機能だけ用意してあり、わかり易い。
・ライブラリーをコンパイルするのが簡単。(cygwin の windows クロスコンパイラ i686-w64-mingw32 でコンパイルできるようになった)

現在の「3.0」には、ドロップファイルのイベントを受け取る機能が無いので、これは自分で足そうと思います。
※「2.x」で実装したので、「3.0」風に書き直す感じww

cygwin で glfw-3.0 をコンパイルする手順を書いておきます。

(0) cygwin に i686-w64-mingw32-gcc、cmake などをインストールしておく。
(1) glfw-3.0 のソースアーカイブを取得して展開する。
(2) glfw-3.0 に移動
(3) 「cmake -DCMAKE_TOOLCHAIN_FILE=CMake/i686-w64-mingw32.cmake」
(4) 「make」
※何も指定しないとスタティックリンクライブラリーが作られるようです。(DLL にする意味は無いと思う)

これでおしまい!(ああ、何て簡単なんだろ・・)

(5) 「make install」で、/usr/local/以下にインストールされます。

では動かしてみましょう!


#include <stdlib.h>
#include <GLFW/glfw3.h>

int main(int argc, char** argv);
int main(int argc, char** argv)
{
    GLFWwindow* window;

    /* Initialize the library */
    if (!glfwInit())
        return -1;

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    /* Make the window's context current */
    glfwMakeContextCurrent(window);

    /* Loop until the user closes the window */
    while (!glfwWindowShouldClose(window))
    {
        /* Render here */

        /* Swap front and back buffers */
        glfwSwapBuffers(window);

        /* Poll for and process events */
        glfwPollEvents();
    }

    glfwTerminate();

    return 0;
}

※ cygwin のコンパイルで重要なのは、リンクライブラリーとして、glfw3、opengl32、glu32、gdi32 を加える事です。

さて、ゲームなどで必要なのは、サウンド、スレッド、画像の読み込み等ですが、GLFW のポリシーでは、「これをフレームワークに含め無い方が良い」との考えのようです。

自分もそう思います、自分は、以下のように解決しています。
・サウンド ---> OpenAL を使うのが良いでしょう~
・スレッド ---> POSIX のスレッド pthread を使う。(OS-X、Linux、mingw では標準です、VisualStudio を使う場合は、pthread-win32 ライブラリーを使います)
・画像 ---> libpng、などを使えば良いし、読み込みをサポートするライブラリーやソースは沢山あるので、自分に合った物を選べば良い。

「gl_fw」(紛らわしいけど、GLFW を知る前からなので・・・)の改修が終わったら、またブログを書きます。
※gl_fw は、C++ を使ったフレームワークで、サウンド(単音、ストリーム)を扱うクラス、画像ファイルを単一的に扱うクラス、フォント(漢字)、GUI、などそこそこ高機能な物です。
ソースコードは、テストが済み次第取得できるようにしますが、興味のある人は連絡下さい~
githubから取得出来ます。
※glfw3には、ドロップファイルを受け取る改修をしています(windows版のみ)、Libraries にlibファイルとヘッダーを用意しています。

クアッドコプター3

骨組みが出来たら、現実味が増した感じですけどー、まだまだ先は長いですねー
まず、基板に、ジャイロ。加速度センサーを中心に配置しました、残りのスペースにCPUなどを載せます。
今回は手持ちの関係で、SH7125を使う事にしましたー、現在では、100MHzのRXマイコンが手頃な価格で入手できるので、わざわざ、過去のCPUを使う理由も無いと思いますがー、タンスの肥やしにするのもアレなので、あえてこれを使います、機能的には十分なものと思います。
SH7125とRXマイコンの比較(参考)
・価格
SH7125F(R5F71253) ---> 900円(秋月の価格)
RXマイコン(R5F56218BDFP) ---> 950円(秋月の価格)
・内蔵メモリー
SH7125F ---> フラッシュ128キロバイト、RAM8キロバイト
RXマイコン ---> フラッシュ512キロバイト、RAM96キロバイト
・速度など
SH7125F ---> 50MHz、5V動作、各種タイマー、A/Dなど
RXマイコン ---> 100MHz、単精度浮動小数点演算器、2.7V~3.6V動作、A/D、USBインターフェース、リアルタムクロックなど

どうです、比べるまでも無い感じですね・・
※基板作る時にはRXでやってみようとおもいますねー

まあでも、SH7125のりソースは少しだけあるので、未知のCPUで、荒波に飛び込むより、無難ではあります、でもやっぱりメモリー(RAM)が少ないのは痛いです・・
プログラム変更の度にフラッシュに書き込むのは面倒だし効率が悪いので、簡単なモニターを用意して、実験段階ではRAMで開発をするのが一般的な方法です、自分も、Sフォーマットをロードしたり、メモリーのダンプを行うモニターを作成しましたが、RAMが狭く、色々考えながら進めないと駄目な感じです。

昨日も、インプットキャプチャー機能を試していると、1チャンネルだけなら動作するのに、複数のチャネルを同時に動かすとハングアップしたり、妙な動作をしていましたがー、よくよく調べてみると、スタックの領域と、ワークエリアが接近し過ぎていて、ワークエリアを壊していたようです・・・
※これ気がつくまでに凄く時間がかかりました・・・・・

・プロペラの話・・・
クアッドコプターでは、2組の正転、逆転の組みを作り、回転による反力を相殺します、最初、「あぁ、逆に回すんだから、プロペラを逆に組めばいいんだよねー」と簡単に考えてましたがー、実際に逆転にしたら、風向も逆になるだけで意味ありません、よーーく考えると、「ピッチが逆じゃないと駄目なんでは・・」と思いましたー、ネットを調べると、CW/CCWペアとかでプロペラ売ってました、「あーーあ、なるほどねー」って感じで、急遽、シンガポールで売っていた8インチ、ピッチ4.5のプロペラを購入しましたー(汗)

このクラスだと、飛ぶ事は出来るでしょうが、やはり推力は出ない感じなので、実験機が上手くいったら、RXマイコンで作り直します、その時は10インチのプロペラでやってみたいですねー

続く~

クアッドコプター2

センサーを入手したところで、送信機、受信機をどうするか・・

以前は、2.4GHzの無線モジュールを使って自作しようと思いましたがー、「早く飛ばしてみたい!」とゆー事で、既存の物を買う事としましたー、例によって色々探すと、アメリカで売っている(中国製)やつが安くて高性能な感じですー、しかし、今ひとつ食指が沸かない感じです・・、そんな時、いつもお世話になっている Daytona7 でプロポを観たら、JR(日本遠隔無線)製のプロポセットがそれなりの価格で売られていたので、それを購入してみましたー
高いですがー、安物買いの何とかとゆーのもありますし、丁度良い落とし所と思います。

送信機は7チャネル、受信機は6チャネル?、基本、4チャネルあれば、ヘリコプターの機動には十分そうですがー、何か別のものを制御する事もできるしで、7チャンネルくらい必要だろうと思った次第ですー、又、この機種はテレメトリー機能があり、機体の情報をプロポに返す事が出来ます。
標準では、受信機の電圧しか返せませんが、オプションのセンサーを繋げば、色々な情報を返す事が出来るようです。

-----

さて、肝心の機体ですがー、実験機という事もあり、お手軽に作る事を考えていましたー、そこで、ホームセンターで入手できるアルミの中空材に注目しました、10mm角で、1mmアルミの押し出し材でしょうか?、アルマイト処理もしてあり、軽いです、機体は軽ければ軽いほど良いのですが、ある程度の強度も必要です、このアルミなら強度は十分で、穴を開けて軽量化も可能と思い、これで基本の骨格を制作します、中心をフライスで削り、十字に合わせます。

そして、端にモーターをマウントします。


↑モーター試運転の様子。

プロポのスロットルを中間より少し上目くらいにすると、ほんのり浮き上がります~、モーター4個なら、十分な推力が得られると思えます。

-----
じつは、フライス盤の加工範囲の関係で、最初は30cmくらいで造りました、しかし、モーターを載せてみると、プロペラが当たる事が判明・・・、34cmで作り直しました・・・ルート2倍の計算がちゃんと出来てなかった。

クアッドコプター

以前、Youtube で観てから、自分で作ってみようと考えて、色々部品を集め始めたのが1年以上前になりますー、最近ようやく、必要な部品が揃い初めて、土日に少しづつ制作しています。

最近ではフライバイワイヤーの専用コントローラーも売っているようで気軽に誰でも作れるようですが、やはり、自分で作る事の意味は大きいです。

-----

まず、最初に考える事は、全体でどのくらいの規模にするかという事、基準に考えたのはモーターでした、色々なサイトを巡り、ラジコン飛行機用のブラシレスモーターで手頃な大きさ、値段を見極めながら選んだのがこれです。

Daytona7 ラジコン専門店
※自分は、↑ここでモーター、プロペラ、アンプ、電池、充電器など揃えました~

とりあえず、このモーターで色々実験してみて、推力が足りないとか、全体のバランスとかは後で考える事にしましたー

ブラシレスモーター: EMAX CF2805
モーターアンプ: TURNIGY P10A
バッテリー: ZIPPY 2200mA (20C)

これら動力系部品を揃えたとこで、加速度センサー、ジャイロセンサー購入で、中々進まず、仕事も忙しくなり、かなりの時間スルーしていましたが・・

今年の初め、センサーを購入してから、また少しづつ進み始めました~
InvenSense 社のジャイロ、加速度センサーMPU-6150です。
※値段は1000円くらいなんですが、送料が高いので、10個購入してしまいました・・(欲しい人がいたら実費でお分けします)
QFN パッケージで、半田付けが難しいと思ったのですがー、Youtubeの半田付け動画を参考に、コテライザーに、ホットブローのコテ先を付けて、万能基板に付けてみましたー、まだ火を入れていないので、正しく動作するかは不明です・・

続く・・・

Cygwin の OpenGL 開発環境構築

Cygwin で OpenGL の開発環境を構築する場合、unix 系と Windows 系、複数のやり方があるようなのだけど、情報が少ないように感じた、それで、自分で判った事をここにメモ程度に書いておこうと思う。

まず、Cygwin では、コンパイラが複数ある、通常のソースコードと、Windows の API(WIN32-API) をコンパイルできるもの(Mingwin 系)
そして、gcc3 系と、現在最新の gcc4 系

gcc3 系では、「-m」のオプションスイッチで、Windows 環境をコンパイルする事ができるが、gcc4 系では、この機能は無くなり、クロスコンパイラで、対応をするようになった。

基本的な事だが、windows 系の開発では、unix 系で普通に使えるライブラリーの多くは利用できない、windows で利用可能なようにポートされたライブラリーを別途入れる必要があり、ヘッダーのインクルードなども適切に記述する必要がある。
※たとえば、Windows で POSIX のスレッド(pthread)を使いたいなら、POSIX Threads for Win32 をインストールする必要がある。(cygwin では、gcc の windows 系クロスコンパイラに含まれている)

OpenGL のプログラム開発では、unix 系、Windows 系、どちらでも、開発を行う事が出来るけど、unix 系では、コンソールアプリケーション以外では、X-Window のアプリとして動作させなければならず、X サーバーを通して動作させる事になる。
Windows 系では、ネイティブなバイナリーを作成でき、実行コードを配布する場合も便利なので、自分は、Windows 系の開発環境でおこなっている。
※Linux や OS-X などでも少しの改修でリコンパイルでき、動作するように、している。
基本的には glut を使うので、動かすだけなら簡単と思う。

cygwin で利用できるコンパイラ
・gcc3 gcc version 3.xx コンパイラ、これだけインストールすると、単に gcc
・gcc4 gcc version 4.xx コンパイラ、gcc version 3.xx と両方インストールすると、gcc3 と gcc4
・i686-w64-mingw32 windows のソースコードをコンパイルできるクロスコンパイラ32/64 ビット
※32ビット、64ビットのバイナリー作成では、関連ライブラリーをスイッチするようだ。

メディアプレイヤーをコンパイルする場合に必要なライブラリー郡
(1)cygwin のインストーラーでインストール出来るもの
libz 圧縮、解凍ライブラリー(自分でソースコードをコンパイルして組み込む場合は不要)
pthread-win32 POSIX のスレッドライブラリー(PTHREAD-WIN32)
glut OpenGL glut ライブラリー

(2)自分でライブラリーの構築などを行うもの(基本的に全て、オープンソース)
boost         boost ライブラリー(最新のバージョンを利用したい為、別途アーカイブを展開している。)
AL OpenAL ライブラリー
DX DirectX を gcc で使う為のヘッダー、ライブラリー(DirectSound、DirectInput を利用)
freetype2 TrueType を描画(レンダリング)する為のライブラリー
libjpeg_x86 JPEG をデコード・エンコードする為のライブラリー(x86バイナリー専用の高速版)
libpng PNG をデコード・円コードする為のライブラリー
mupdf PDF をレンダリングする為のライブラリー
openjpeg JPEG2000 ライブラリー
jbig2         JBIG2 ライブラリー
id3tag        MP3-TAG ライブラリー
↑これらは、cygwin gcc でコンパイルして、ライブラリーを構築したので、別途アーカイブしてある。

今回は、OpenGL プログラムを走らせるだけなので、↑のライブラリー構築などは割愛する。

(1) 基本的なインストール
・まず、cygwin をインストールしなければならない、インストール方法は、非常に沢山他のサイトなどで詳しく説明されているので割愛する。
・重要なのは「必要なコンポーネント」と思う。(下のリストは、足りない物があったり、余分な物があるかもしれない)
・「Devel-gcc-mingw」関係を全部インストール
・「Devel-gcc4」関係をとりあえず全部インストール(※gcc4-core と gcc4-g++ があればOK)
・「Devel-gccmakedep」をインストール(Makefile で従属規則を自動生成するのに使う)
・「Devel-mingw64-i686」関係を全てインストール
・「Devel-make」(GNU Version)をインストール

(2)インストールを確認
・今回は、コンパイラとして「i686-w64-mingw32-gcc」を使うので、コンソールから、

i686-w64-mingw32-gcc --version

以下のようなメッセージが出れば、とりあえずコンパイラのインストールは成功。

i686-w64-mingw32-gcc (GCC) 4.5.3
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

(3)gcc3 系 mingw の OpenGL 関係をコピー(この手順が適正か判らないが・・・)
・i686-w64-mingw32 環境にも OpenGL 関係のヘッダーやライブラリーはあるのだが、イマイチ使いにくいので、gcc3 系の OpenGL ライブラリーを手動でコピーして使う、ライブラリーは互換性があるようなので、4系でも使えるようだが、gdb などでデバッグするような場合は問題が起こるかもしれない。
・元のファイルをリネームして一応保存しておき、mingw 関係のヘッダーなどをコピー
cd /usr/i686-w64-mingw32/sys-root/mingw/include/GL
mv gl.h gl_h
mv glu.h glu_h
cp /usr/include/w32api/GL/*.h .
cd /usr/i686-w64-mingw32/sys-root/mingw/lib
mv libopengl32.a libopengl32_a
mv libglu32.a libglu32_a
cp /usr/lib/w32api/libopengl32.a .
cp /usr/lib/w32api/libglu32.a .
cp /usr/lib/w32api/libglut32.a .

(4)OpenGL が動作するか確認
・まず、ソースコード「main.cpp」を入力

#include <cstdio>
#include <GL/glut.h>

static GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
{0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
{4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
static GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */

static GLfloat g_angleX =  60.0f;
static GLfloat g_angleZ = -20.0f;

static void reshape_task(int width, int height)
{
}

static void idle_task()
{
glutPostRedisplay();
}

static void display_task()
{
int w = ::glutGet(GLUT_WINDOW_WIDTH);
int h = ::glutGet(GLUT_WINDOW_HEIGHT);
glViewport(0, 0, w, h);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Setup the view of the cube.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,    // field of view in degree
1.0,        // aspect ratio
1.0,        // Z near
10.0);    // Z far
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0,    // eye is at (0,0,5)
0.0, 0.0, 0.0,    // center is at (0,0,0)
0.0, 1.0, 0.);    // up is in positive Y direction

// Adjust cube position to be asthetic angle.
glTranslatef(0.0, 0.0, -1.0);
glRotatef(g_angleX, 1.0, 0.0, 0.0);
glRotatef(g_angleZ, 0.0, 0.0, 1.0);

g_angleX += 1.0f;
g_angleZ += 0.5f;

for(int i = 0; i < 6; ++i) {
struct rgb {
GLfloat r, g, b;
};
static const rgb col[6] = {
{ 1.0f, 1.0f, 1.0f },
{ 0.2f, 1.0f, 1.0f },
{ 1.0f, 0.2f, 1.0f },
{ 1.0f, 1.0f, 0.2f },
{ 0.2f, 0.2f, 1.0f },
{ 1.0f, 0.2f, 0.2f }
};
glColor3f(col[i].r, col[i].g, col[i].b);
glBegin(GL_QUADS);
glVertex3fv(&v[faces[i][0]][0]);
glVertex3fv(&v[faces[i][1]][0]);
glVertex3fv(&v[faces[i][2]][0]);
glVertex3fv(&v[faces[i][3]][0]);
glEnd();
}

glutSwapBuffers();
}

void init()
{
// Setup cube vertex data.
v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
v[4][0] = v[5][0] = v[6][0] = v[7][0] =  1;
v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
v[2][1] = v[3][1] = v[6][1] = v[7][1] =  1;
v[0][2] = v[3][2] = v[4][2] = v[7][2] =  1;
v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;

// Use depth buffering for hidden surface elimination.
glEnable(GL_DEPTH_TEST);
}

int main(int argc, char** argv);

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(512, 512);
glutCreateWindow("test cube");
glutDisplayFunc(display_task);
glutReshapeFunc(reshape_task);
glutIdleFunc(idle_task);

init();

glutMainLoop();
return 0;
}

・続いて「Makefile」を入力
#-----------------------------------------------#
# GNU-Makefile for "gcc" #
#-----------------------------------------------#
TARGET = OpenGL_Test
PSOURCES = main.cpp
CSOURCES =

OPTLIBS = opengl32 glu32 glut32

INC_SYS =
# /usr/i686-w64-mingw32/sys-root/mingw/include
# /usr/boost_1_43_0
INC_LIB =

PINC_APP =
CINC_APP =
LIBDIR =

INC_S = $(addprefix -I, $(INC_SYS))
INC_L = $(addprefix -I, $(INC_LIB))
INC_P = $(addprefix -I, $(CINC_APP))
INC_C = $(addprefix -I, $(PINC_APP))
CINCS = $(INC_S) $(INC_L) $(INC_C)
PINCS = $(INC_S) $(INC_L) $(INC_P)
LIBS = $(addprefix -L, $(LIBDIR))
LIBN = $(addprefix -l, $(STDLIBS))
LIBN += $(addprefix -l, $(OPTLIBS))

#
# Compiler, Linker Options, Resource_compiler
#
CP = i686-w64-mingw32-g++
CC = i686-w64-mingw32-gcc
LK = i686-w64-mingw32-g++
RC =

POPT = -O3
COPT = -O3
LOPT =

COF = -o
LOF = -o

PFLAGS = -DWIN32
CFLAGS = -DWIN32
LFLAGS =

# -Wuninitialized -Wunused -Werror -Wshadow
CWARN = -Wimplicit -Wreturn-type -Wswitch -Wformat

OBJECTS = $(PSOURCES:.cpp=.o) $(CSOURCES:.c=.o)

.SUFFIXES :
.SUFFIXES : .res .hpp .h .c .cpp .o

$(TARGET).exe: $(OBJECTS) Makefile
$(LK) $(LOF)$(TARGET).exe $(LFLAGS) $(LIBS) $(OBJECTS) $(LIBN)

.c.o:
$(CC) $(COPT) $(CFLAGS) $(CINCS) $(CWARN) -c $< $(COF)$@

.cpp.o:
$(CP) $(POPT) $(PFLAGS) $(PINCS) $(CWARN) -c $< $(COF)$@

.rc.c:
$(RC) $< $@

all:
make clean
make depend
make $(TARGET)

install:
cp ./$(TARGET).exe /usr/local/bin/.

run:
./$(TARGET).exe

clean:
rm -f $(OBJECTS)
rm -f $(TARGET)

dllname:
objdump -p $(TARGET).exe | grep "DLL Name"

tarball:
chmod -x *.[hc]pp Makefile
rm -f $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz
tar cfvz $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz \
*.[hc]pp Makefile
chmod 444 $(TARGET)_$(shell date +%Y%m%d%H)_src.tgz

zip:
$(LK) $(LOF)$(TARGET).exe $(LFLAGS) $(LIBS) -mwindows $(OBJECTS) $(LIBN)
rm -f $(TARGET)_$(shell date +%Y%m%d%H).zip
zip $(TARGET)_$(shell date +%Y%m%d%H).zip *.exe *.dll

depend:
makedepend -Y -- $(CFLAGS) $(INC_P) -- $(CSOURCES) $(PSOURCES)
# DO NOT DELETE

(5) コンパイルと実行
・まずコンパイル
make
・実行
make run
・画面に、512×512のWindowが作られ、四角い箱が回転すれば成功!

メディアプレイヤー(12月22日版)

Jコミで「らぶひな」が全巻がPDF形式で無償公開された。
PDFにはCMページとリンクが入っており、そのページ(リンク)をクリックする事で、CMのURLへジャンプするようになっている。

自分の「本プレイヤー」(ブックリーダー)は、「自炊」ファイルが対象なので、PDFを直接読む事は出来ない、それで、実験的にPDFからJPEG画像を取り出して、アーカイブしたものの、結構、面倒で時間がかかる作業だと判った、まず、画像の解像度(DPI)を指定しなければならないが、大きすぎても小さすぎても駄目な為、適当なDPI値を探る必要がある点、一番問題なのは、リンクが無くなる事で、CMへのリダイレクトが無くなり、「無償公開」の「意義」が損なわれる点。
これは、問題だ!、そこで、オープンソースのPDFリーダーを探していた、いくつかあるようだが、多少の情報収集から、SumatraPDFが良さそうと思い、早速自分のシステムに取り込んでみた。

「SumatraPDF」はC言語で書かれていて、フォントの描画はFreetype2、それに、JPEG、Jpeg2000、big2dec、PNG、Z-lib などオープンソースのライブラリーを使って構築されている。

それに先立ち、cygwin 上に新しく追加された mingw のクロスコンパイラ環境をインストールした。
以前は、gcc3 では、Windowsのコンパイル用に、「-mno-cygwin」オプションを使っていたが、新しい gcc4 系では仕様が変り「-mno-cygwin」が廃止された為コンパイル出来なかったのだが、クロスコンパイル環境を別途インストールしてWindowsのプログラムをコンパイル出来るようになった為、ようやく最新のコンパイラでWindowsのコンパイルも出来るようになった。

次に、自分のシステムに無いものとして、Jpeg2000、big2decなどがある為、まず、そこからライブラリーの作成組み込みを行った、ソースコードを取得して、mingw クロスコンパイラを使って各ソースをコンパイル、ライブラリーを作成した。

次にSumatraPDF本体を取得して、ライブラリーをコンパイル、mingw用に多少手直ししたが、これもなんとか上手く出来あがった。

次に、「apps」にあるアプリケーションのソースコードを頼りに、C++のラッパーを作成し、ブックリーダーのコア部分「pager」クラスに組み込んでみて、レンダリングさせてみたが、とりあえず動作しているようだ、一般的なPDFも食わせてみたが、フォントの描画がイマイチおかしい部分はあるものの、普通に描画できる(素晴らしい!)

後はリンクなどの処理を加えれば良い感じだけど、これは、まだ考え中で開発中。
※GUIは、基本、今までのようにしておき、そこにリンク部分を追加したい。

で、最新版をアーカイブに入れた。
コンパイル済みライブラリーやヘッダーファイルも「mingw」のアーカイブに入れておく。

メディアプレイヤー

コツコツ作ってる「メディアプレイヤー」、地味にバージョンアップしている、最近のトピックは、プリファレンス(レジストリー)に対応した点、アプリケーションが終了する際に色々な状態を記憶しておくもの、当然、マルチプラットホームなので、独自に実装してある。
テキストファイルで出して、起動時読み込むだけなんだけどね・・
でも、色々と面倒だったー(難しくは無いけど、キーワードを加工したり、細かいテキスト処理を含んでいる為、面倒だったのだけど・・・

それはそれとして、少しづつアップグレードしていますので、もし、使っている人がいれば、最新版を取得して下さい。
※使ってみて、問題があればバグレポートをtwitterのアカウントにでも送って下さい。

それはそれとして、google 先生で、「Open Media Player」を検索したら、ヒットしてました、既に「名前」が使われてます・・・
うーーーん、自分のアプリは、そんな名前にしようと思ってたのに、残念です・・・
何か、ビビットな名前を考えないと駄目ですね・・・

-----
先日、シャープより、ガラパゴスが発表されましたー
※iPadにはSDカードのインターフェースが無く、別売りのSDカードインターフェースを使って、静止画は読み込めるものの、動画や音楽を入れて食わす事が出来ない為、ガッカリ、買う気が起りません・・・
無線経由でWEBからダウンロードして読み込ませる事は出来るようですが(アプリが対応していれば)・・

そんなこんなで、多少、ガラパゴスには期待もしていたのでしたーー
ところがー、「メディアタブレット」と唄っておきながら、AV Watchの記事によると、「なお、microSDカードに収めた音楽や動画を再生する機能は備えていない。」となってます!
えーーーーーーーーーーーー、うそーーーーーーーーーーーーー、ありえないでしょーーーーーー!!!!!!
それ、「メディアタブレット」って言えないから・・

うーーん、XMDFに埋め込まれた動画などは再生出来るので、なんらかの大人の事情が炸裂したのかもしれないけどー、あまりにもひどすぎる、使う人の利便性を完全に無視して、自分たちの利益を守る事を最優先にしたこの態度は絶対に許せません。
X68000の頃からシャープは好きなメーカーだったのに、残念でたまらない。
まぁ、どうせこんな中途半端な端末は使い方が限定されて、多くの人には見向きもされないでしょうから、いいんですけどねー

やっぱ、Androide の端末にしか活路は無いのかもー

クリエイティブから良さそうなのが出ますねぇー、値段もそれなりだし、少なくとも、ガラパゴスよりは100万倍良さそうなので、買ってみたい気もするけどー