でらうま倶楽部

バカってゆうか、ゲームを作る事しか能の無いプログラマの、面白おかしな日々を綴ってみる実験。

OSX

El CaptianのQuick Lookで不具合に遭遇

コード書いとる??

El Capitan(OSX 10.11.4)のQuick Lookで謎の現象に遭遇したのでメモ。

モデルデータ(Collada形式とかWavefront OBJ形式とか)をQuick Lookしてて、他のファイルをプレビューしようとしてファイルを直接クリックすると、Quick Lookがありえないくらい劇重になる!!
photo

ありえへんくらい劇重になって操作も受け付けなるくらいなので良い子は真似しない方がいいと思います。

マジで真似しない方がいいと思います。 真似するなよ!!←

Apple サポートコミュニティで問い合わせようとしたら、なんかエラーが出て投稿できなかったのでとりあえずブログに書いときます。

photo2
見知らぬエラー... GWと何か関係が?! (たぶん違う)


ではまた次回!!

[El Capitan]外付けHDDの接続がスリープ時に切れてしまう問題が解決してる

151001elcapitanthings

コード書いとる??

Appleさんありがとう!!
OSX 10.11.4 にて悩ましい問題がまたひとつ解決しています!!!!

外付けHDD(USB3.0)を繋いだままスリープさせると、復帰時に「接続が切れました」というダイアログがいくつも表示されてるという問題です。

ワシの動作環境は MacBook Air Mid 2012 なのだが、この問題あちこちで起こっていた模様。
Appleサポートコミュニティにも投稿があります。

Time Machineでのバックアップも途中で終わってたりしてて本当に悩ましかった...

でももう外付けHDD繋いだままMacをスリープさせてワシも熟睡できるぜ!! スリープだけに!!!!

すっきり!!

ではまた次回。

スクロールバー表示の問題がOSX10.11.4で解決

コード書いとる??

Appleさんありがとう!!
先日MacBookAirをOSX10.11.4に更新したら、微妙に厄介な問題が解決してたのでメモ

その不具合とは
PCがスリープから復帰するとスクロールバーが常に表示される
です。

Apple サポートコミュニティにも投稿があります。

Finderだけでなく、ほぼすべてのアプリに影響が出ます。
一旦この不具合が発生すると、「システム環境設定→一般」でスクロールバーの表示設定を変更しても元に戻りませんT^T
photo

対症療法として再起動するしかなくて困ってたんですが、今回のOSXの更新で修正されていました。

スッキリ!!

多分もう一個、微妙に厄介な問題が解決されているっぽいので、検証次第メモる。

ではまた次回。

アプリ配信まもなくソースコード一式を公開した話

github-logo
コード書いとる??

メリークリスマス!!

拙作 BRICK&TRIPソースコードを公開しました。
拙作 BRICK&TRIPソースコードを公開しています。

自分がこれまで本当にお世話になっている業界に貢献するにはどうしたらいいのか自分なりに考えた結論です。

今回の作品も、CinderboostFreeTypeを始めとするOpen Source Softwareや、諸先輩がたの経験や知見がなければ、決して生まれませんでした。

そしてこの経験を未来の後輩たちへ繋いでいかなくては...と思い、アプリ配信間もないこのタイミングでの公開に踏み切ったのです。

拙いコードの寄せ集めですが、みなさんが手掛けるソフトウェア開発の一助になれれば光栄です。

55
GitHubのContribution activityは過去に遡ってくれるんやね。
これはいい仕様。

push直後、いい感じに緑色づいたよ。

ではまた次回!!

iMovie「アプリケーションプレビュー」での挙動が最高すぎる

30

コード書いとる??

拙作BRICK&TRIP好評配信中!!

アプリの紹介動画はこうして作りました。
  1. OSXのQuickTimeでiPhoneの画面と音をキャプチャ
  2. iMovieで編集
  3. 書き出し
  4. 完成!!
iMovieでの編集が想像以上に簡単で驚きました。
動作も軽く、チョイチョイチョーイ!!っと編集できてしまいました。
書き出しも数秒だぜ!!
iMovieすげぇよ...!!

さてこの動画、縦長画面です。これ、iMovieに追加された機能なんだけど、制作過程で仕様なのかバグなのかわからないんだけどとにかくアップルの技術者ナイス!!と思ったことがあったので書きます。

縦長の動画を作る場合、「新規アプリケーションプレビュー」というのでプロジェクトを作成します。
この雛形は、動画の解像度を変えることなく書き出しができる超素敵仕様!!
photo2

で、手持ちのiPhone5を使って収録した動画を編集して書き出し。

ここまでは良かったのですが...AppStoreではiPhone5とiPhone6とiPhone6 plusの3つで異なる解像度の動画を用意する必要があります。
 
これは困った。iMovieの書き出しでは解像度の変更ができません。

で、ネットで調べた調べた。

そしたら、動画の前に所定の解像度の静止画を入れると、その解像度で書き出してくれるということが判った。

試しにiPhone6の解像度750×1334の画像を動画の先頭に入れてから書き出し。
09

photo3

おおお...!! iPhone5で収録した動画の解像度が750×1334になってる!!!!

でもこれ、静止画が邪魔...と思って静止画を削除してから書き出しをしても、なんと解像度が元に戻らない!!! うおおおおグッジョブ!!!!!! これ狙って作った仕様だったとしたらすんげぇよ!!!!!!!!!!

10

解像度は、タイムライン上の素材を全部削除すると戻るみたいだね。お願いですからこの仕様はこのままにしておいてください!!!!

おかげさまで、iPhone5で収録した動画からiPhone6、iPhone6 plus、iPad、iPad retiaの4つの動画が無事書き出せましたとさ。


ではまた次回!!

FreeTypeのビルド設定を変更して外部依存を解決する

metrics2
コード書いとる??

師走です。

FreeType2.6.2がリリースされとりますな。
先日のバージョンアップから二ヶ月弱でのリリースです。

いつものようにCMakeでXcodeのプロジェクト作ってiOS向けのターゲットを追加してビルド。
できあがったライブラリファイルをリンクして...あれ?? リンクエラー??

freetype内部から、bzip2とかlibpngとかの関数を呼び出してる。
あれ?? 依存ライブラリ増えた...??

これはもしやと思い、CMakeのビルド設定を確認。
40
んー。どこだどこだ。

Advancedモードに切り替えたら、ありました、ありました。
25

これの設定内容を恐る恐る削除して、Configure→Ganerate ...おっ、無事プロジェクトが生成された!!
59

続いて、ライブラリをビルド... ビルド通った!!
最後に、自分のプロジェクトをビルド... ビルド通った!!

FreeType素晴らしい。必要な外部依存ライブラリが無い場合、当該コードはビルドから外してくれるのね。
これどうにもならかなったら、iOS版とかどうしようかと思ったよw

スッキリ!!


ではまた次回!!

レイトレ合宿3!!! 無事終了!!!!

completion
コード書いとる??


レイトレ合宿3!!! 無事終了!!!!

結果はこちらをどーぞ。

自分の発表資料などはこっち

みなさん本当に素晴らしいレイっぷりに圧倒されつつも、とてもいい経験になりました。
参加された皆さん、主催者のみなさん、本当に有難う。 

参加して初めてわかるレイトレの奥深さよ。次回はさらに上位を狙いたいと心に火がついた。


ではまた次回!!

Cinder0.8.6でのフレームレート問題解決(暫定)

icon

コード書いとる??

Cinder 0.8.6を使っててひとつ気がかりだったのが、「フレームレートが安定しない」だったのですが、一応の解決となりました。


公式フォーラムのこのスレッドを読み込んだら書いてありました...(汗)

こんな感じに、初期化で cinder::app::App::Settings::disableFrameRate を呼べばよい。
 
class DerivedApp : public AppNative {

  void prepareSettings(Settings* settings) override {
    // 1秒あたりの画面更新回数制限を禁止する
    settings->disableFrameRate();
  }

};

1秒あたりの画面更新回数に制限を掛ける処理に問題があるらしい。
  • さっそく試してみたら、確かにフレームレートが安定した。すごい!!
  • iOSは...関係ないのかな?? 違いがわからん...
  • Windowsは...相変わらず、マウスを動かすとフレームレートが不安定になる...
これ、省電力モードとかで画面更新頻度が下げられていたりする状況だと問題かも。
他にもいろいろ問題あるかも。

それは、その状況に遭遇したら対処しよせっと。

ではまた次回!!

生まれて初めてC++で書いたアプリ KONAHEN も Github で公開

screen_shot
コード書いとる??

先日Githubで公開したTieGunnerに続き、生まれて初めてC++で書いたアプリ KONAHEN を公開しました。

久しぶりに眺めたコードは初々しく、瑞々しくて、甘くて酸っぱい... (訳:実に恥ずかしい)

XcodeとVisualStudioの両方でビルドできるので、興味のある人はお試しあれ:D

ではまた次回!!

C++で書かれたMIDIパーサーが有難かった

MIDI
コード書いとる??

C++で書かれたMIDIのパーサーはないもんか...と探していたら...ありました。


実行環境に依存してなくて素敵。

MIDIファイルを読んで、ノートオンの時間を調べるだけならこんな感じに書けばよい。
#include "MidiFile.h"
#include <iostream>


int main() {
  // MIDIファイルをパース
  MidiFile midi_file;
  midi_file.read("sample.mid");

  // マスタートラックのテンポを元に、全MIDIイベントの時間(秒)を計算
  midi_file.doTimeAnalysis();

  // 全トラックのMIDIイベントからノートオンだけ取り出して時間を出力
  for (int track = 0; track < midi_file.getTrackCount(); ++track) {
    
    for (int event = 0; event < midi_file[track].size(); ++event) {
      if (midi_file[track][event].isNoteOn()) {
        std::cout << midi_file[track][event].seconds << std::endl;
      }
    }
    
    std::cout << std::endl;
  }
}

MIDIの仕様書は手元にあって、これまで何度か実装を試みるも挫折していただけに有難い!!

ではまた次回。

OSX 10.10.4 でメールが送信できなくなったら試してほしいこと

photo3
コード書いとる??

先日リリースされた OSX 10.10.4 ついでに「二段階認証」へ移行しようとして大ハマりしたのでメモ。

OSX 10.10.4へアップグレードしたのち、Apple ID の二段階認証への移行の手続きを始めたら「しばらくお待ち下さい」とのこと。そこで「Gmailも二段階認証にしよせっと!!」って移行を始めたのがハマりポイントやった!!

諸々設定を終えたら、OSXのメールアプリからメールの送信ができましぇん... GmailのSMTPサーバーへログインしようとしてエラーになっとる(涙)

いろいろ設定を変えて試してみてもダメ。

しょーがないので二段階認証を解除して「システム環境設定→インターネットアカウント」でGmailのアカウントを作り直したら解決しました...

Instant Hotspotの接続エラーは激減しとりますが、なんかモヤモヤ...


ではまた次回!!

[Cinder] iOSの縦横画面に対応させる

28コード書いとる??

便利だよCinder便利だよ

作ったアプリが、ほぼコードそのまんまでOSXとiOSとWindowsで動くのはいいよね。

んで、最近何度も「あれ?? iOSの横画面対応ってCinderだとどうするんだっけ??」
ってなったので、そのメモ書き。

これ、boost::signals2を使ったコールバックが用意されている。
ので、コールバックで適切な値を返してやれば良い感じ。

C++11のラムダ式をつかえばこう書けて楽。
// iOS:縦横画面両対応
// boost::signals2を使った実装なので、他の挙動も
// 同じように実装すれば良い
getSignalSupportedOrientations().connect([](){ return InterfaceOrientation::All; });

コールバックは他にも
  • アプリがバックグラウンドになったよ!!
  • アプリがフォアグラウンドになったよ!!
  • アプリの縦横が切り替わるよ!!
など、いろいろ用意されとります。iOSアプリ開発経験がある人なら「あ〜はいはい。」っていう感じ。

詳しくは、公式リファレンスcinder::app::AppCocoaTouch の項を読むべし!!

その他、立方体を表示する雛形を書いたのをGithubに置いておきます。


ついでに、iOSで実行する時に、ステータスバーを消す方法(これもよく「なんだっけ??」ってなる)

59

iOS6:
Info.plistに
Status bar is initially hidden  YES
を追加

iOS7以降
Info.plistに
View controller-based status bar appearance  NO
を追加


ではまた次回!!

[Cinder] OSXで動いてiOSで動かない時に確かめたこと

コード書いとる??

専門学校で知識欲の旺盛な学生たちに囲まれながら教えつつ、拙者もCinderでアプリ製作!! の日々が続いとります。
質問が多い→興味がある ということなので大変よろしい。


それはさて置き。学生から「これ動かないんだけど…」って持ち込まれたCinderのコード。
確かに、OSXやWindowsでは動けど、iPhoneでは動かない…

#include "cinder/app/AppNative.h"
#include "cinder/TriMesh.h"
#include "cinder/gl/gl.h"

using namespace ci;
using namespace ci::app;

class TriMeshTestApp : public AppNative {
  TriMesh mesh;
  
public:
	void setup();
	void draw();
};


void TriMeshTestApp::setup() {
  // 頂点座標を用意
  Vec3f vertices[] = {
    { -100, -100, 0 }, {  100,  100, 0 }, {  100, -100, 0 },
    { -100, -100, 0 }, { -100,  100, 0 }, {  100,  100, 0 }
  };
  mesh.appendVertices(vertices, sizeof(vertices) / sizeof(vertices[0]));

  // 頂点色を用意
  Color colors[] = {
    { 0, 1, 1 }, { 0, 1, 1 }, { 0, 1, 1 },
    { 0, 1, 1 }, { 0, 1, 1 }, { 0, 1, 1 },
  };
  mesh.appendColorsRgb(colors, sizeof(colors) / sizeof(colors[0]));
  
  // 描画頂点を用意
  uint32_t indices[] = {
    0, 1, 2,
    3, 4, 5,
  };  
  mesh.appendIndices(indices, sizeof(indices) / sizeof(indices[0]));
}

void TriMeshTestApp::draw() {
	gl::clear(Color(0, 0, 0));

  // ポリゴンを描画
  gl::draw(mesh);
}

CINDER_APP_NATIVE( TriMeshTestApp, RendererGl )

ごくフツーな感じなのだが、glDrawElementsで落ちるとか訳わからん。

「なんか制約とかあったっけ…」とOpenGL ESの仕様を調べること小一時間。


ああ… 頂点色はRGBA指定のみ受け付けるのね… やはり答えは公式リファレンスにあった!!
早速修正して試してみる。

#include "cinder/app/AppNative.h"
#include "cinder/TriMesh.h"
#include "cinder/gl/gl.h"

using namespace ci;
using namespace ci::app;

class TriMeshTestApp : public AppNative {
  TriMesh mesh;
  
public:
	void setup();
	void draw();
};


void TriMeshTestApp::setup() {
  // 頂点座標を用意
  Vec3f vertices[] = {
    { -100, -100, 0 }, {  100,  100, 0 }, {  100, -100, 0 },
    { -100, -100, 0 }, { -100,  100, 0 }, {  100,  100, 0 }
  };
  mesh.appendVertices(vertices, sizeof(vertices) / sizeof(vertices[0]));

  // 頂点色を用意
  // OpenGL ESはRGBAしか受け付けない
  ColorA colors[] = {
    { 0, 1, 1, 1 }, { 0, 1, 1, 1 }, { 0, 1, 1, 1 },
    { 0, 1, 1, 1 }, { 0, 1, 1, 1 }, { 0, 1, 1, 1 },
  };
  mesh.appendColorsRgba(colors, sizeof(colors) / sizeof(colors[0]));
  
  // 描画頂点を用意
  uint32_t indices[] = {
    0, 1, 2,
    3, 4, 5,
  };  
  mesh.appendIndices(indices, sizeof(indices) / sizeof(indices[0]));
}

void TriMeshTestApp::draw() {
	gl::clear(Color(0, 0, 0));

  // ポリゴンを描画
  gl::draw(mesh);
}

CINDER_APP_NATIVE( TriMeshTestApp, RendererGl )

スッキリ!!

この「原因を突き止める」のがプログラマの仕事だと言っても過言ではない!!(受け売り)
これをどう学生に伝えるのかが今後の課題です。

さすがに今回のはハードル高いけどな!!

ではまた次回。

Cinder 入門

icon
コード書いとる??

Cinderと聞いて知人が「シンデレラだ」ってコメントしてハッとしました。そっか「灰かぶり姫」
Cinderは「灰」とか「噴石」とかいう意味なのだ。ふむふむ…(よくわかっていない)

さて今回は、そのCinderを使ったプログラミングの始め方だよ。

まずは、公式サイトから最新版のSDKを取ってきましょう。OSX版、VisualStudio2012版、VisualStudio2013版とあります。iOS版はOSX版に同梱されてます。

ダウンロードしたファイルを解凍して、適当な場所に放り込んでください。

フォルダ構成はこんな感じ。

45


よく使うのはこなへん。
  • docs/html/index.html 
    公式のリファレンスマニュアル
  • samples
    各種サンプル置き場
  • blocks
     拡張ライブラリ置き場
  • tools  
    Cinderプロジェクト生成ツール TinderBox
公式マニュアルのチュートリアルを読み進め、適時サンプルを漁りながら色々試していけば、2、3日でCinderの使い方がわかってくると思います。そんなに難しくない。

つづいて以下、自分が経験した小ネタなど紹介。


TinderBoxを使う時の小ネタ

OSXとiOSの両方でビルドする場合
Environmentは、XCodeとXCode iOSの両方にチェックを入れましょう
30

さすがに1つのXcodeプロジェクトにはしてくれへんw


blocksをコピーしない
Install: Relative だと、blocksはコピーされません。
08
 

Cinderを使う時の小ネタ

using namespace std; は削除:P
using namespaceつらたん


リソースの読み込み
公式に書いてあるやり方をぶっちぎってこうしてます。このやり方で、OSX版、iOS版、Windows版で各種リソースの読み込みが統一できました。
// 対象ファイルのフルパスを取得
fs::path path = getAssetPath("hoge.png");
// 対象ファイルをassetsから読み込む
DataSourceRef data_source = loadAsset("hoge.png");

OSX版はプロジェクトにassetsフォルダの参照を追加しておきます。すると、Cinderはビルドして出来上がったアプリのパッケージ内のデータを参照してくれます。かしこい。
photo1

こんな簡単で便利な方法があるのになぜ公式リファレンスには書いてないのだろうか… 単に見落としとるだけなのかな??


マルチタッチ
OSX(MacBook)のトラックパッドの場合は、指がトラックパッドに触れればApp::touchesBeganとかApp::touchesMovedとかが呼び出される。タップでのクリック操作や、トラックパッドのボタンを押しながら触れた指を動かせば、App::mouseDownとかApp::mouseDragが呼び出される。

Windowsの場合、画面を指で触れればApp::touchesBeganとかApp::touchesMovedとかが呼び出される。App::mouseDownとかApp::mouseDragも一緒に呼び出される。まあそうだよね。

こなへんの挙動の差異を吸収して、OSX版、iOS版、Windows版で「思った通りに」タッチ操作ができるよう試行錯誤中。悩ましい。


Cinder-Assimp
ここから取ってきて、blocksフォルダにコピー
07
 
そして、見よう見まねでcinderblock.xmlを作成

<?xml version="1.0" encoding="UTF-8" ?>
<cinder>
  <block
      name="Assimp"
      id="org.libcinder.assimp"
      author="Cinder Project"
      license="GPL, Commercial"
      summary="Import 3D model with assimp"
      version="1.0"
      >

    <sourcePattern>src/*.cpp</sourcePattern>
    <headerPattern>src/*.h</headerPattern>
    <includePath system="true">src</includePath>

    <platform os="macosx">
      <staticLibrary>lib/macosx/libassimp.a</staticLibrary>
      <buildCopy>lib/macosx/libassimp.a</buildCopy>
    </platform>
    
    <platform os="ios">
      <staticLibrary>lib/ios/libassimp.a</staticLibrary>
      <buildCopy>lib/ios/libassimp.a</buildCopy>
    </platform>
    
    <platform os="msw">
      <platform config="Debug">
	<staticLibrary>lib/msw/x86/assimpd.lib</staticLibrary>
	<dynamicLibrary>lib/msw/x86/assimpd.dll</dynamicLibrary>
      </platform>
      <platform config="Release">
	<staticLibrary>lib/msw/x86/assimp.lib</staticLibrary>
	<dynamicLibrary>lib/msw/x86/assimp.dll</dynamicLibrary>
      </platform>
      <buildCopy>lib/msw/x86/assimpd.dll</buildCopy>
      <buildCopy>lib/msw/x86/assimp.dll</buildCopy>
    </platform>
  </block>
</cinder>

15

これで、TinderBoxのblocks一覧に追加されます。assimpを使えば、FBXとかColladaとかのモデルデータを読み込んでCinderで使えるようになります。やったね!!


ではまた次回!!

openFrameworks と Cinder をご存知??

photo

コード書いとる??

みなさんは openFrameworksCinder をご存知??

どちらもC++でイケてるアプリを創造するために開発されたフレームワークです(ざっくり)

今回は、教えに行ってる専門学校の授業で取り入れてみようと検証してみた感想をブログに書くよ。

前提条件
  • OSXとWindowsで開発可能
  • マルチタッチ対応
  • 3Dモデルの読み込みと表示
  • C++に不慣れなプログラマでもすぐ始められる規模

両方使ってみて感じた事
あくまで拙者の主観です:D

openFrameWorks
  • リファレンスが読みやすく、目的の機能を探しやすい
  • 規模がデカイ(色々なことに対応している)
  • OSXで64bitビルド不可
  • VisualStudio2013で使えない(有志の方が対応版を公開中)
  • OSXやWindowsのマルチタッチには非対応
  • iOSやAndroid版もある
  • iOS版、Android版専用の機能が若干ある
  • 一部、外部ライブラリに独自のパッチを当てている。それが原因で外部ライブラリの差し替えが困難
  • OpenGLを意識しないで画面描画ができる
  • addonと呼ばれるライブラリの追加は容易
  • 3Dモデルを読み込むaddonで使っているassimpのバージョンが古い

Cinder
  • リファレンスが読みづらく、目的の機能を探しにくい
  • 規模が比較的ちいさい(対応する方向性がはっきりしている)
  • VisualStudio2013に対応
  • OSXやWindowsのマルチタッチにも対応
  • iOS版はあるが、Android版はまだ
  • iOS版専用の機能が若干ある
  • 依存する外部ライブラリもすべて1つのプロジェクトでビルドしてライブラリを生成している。ので、差し替えや修正が比較的容易
  • ある程度OpenGLに詳しくないと思った通りに描画できない
  • blocksと呼ばれるライブラリの追加は容易
  • 3Dモデルを読み込むblockで使っているassimpのバージョンが新しい

手始めにCinderに触り「そっかAndroid対応してないんだ」ということでopenFrameworksに切り替え「うーんちょっと違うな…」とCinderに戻って「Cinder最高!!」っていう結論に至りました。

アプリのコードはopenFrameworksとCinderで、だいたい同じような流れで書けます。

class App : public AppBase {

public:
void setup(); // アプリの初期化を書く
void update(); // アプリの更新処理を書く
void draw(); // アプリの描画処理を書く

void mouseDown(MouseEvent event);
// マウスのボタンが押された時の処理を書く
}; 

おおざっぱに書けばこんなん。アプリのクラスが雛形として用意されているので、あとは中身を埋めてくだけ。

始めて一週間くらいだけど、CinderにAssimpライブラリを追加してこんな感じのことまでできるようになってるよ!!
 
18

Cinder-Assimpという外部ライブラリを追加。assimpを最新版に上げて、チョイチョイ手を入れたら思った通りの挙動になった。ここまで出来るようになれば、あとは勝ったも同然だ!!


何事も自分で試してみないとわからないというのが今回得た教訓。

ではまた次回!!

OSXのWi-Fi接続が重いと感じていたら試してほしいこと

photo3

コード書いとる??

先日 OSX 10.10.2 の更新が始まりましたな。拙者の注目はこの2つ。
  • Wi-Fi が接続解除される問題の解決
  • ウェブページの読み込みが遅くなる問題の解決
拙者のOSXでも、いつの頃からかWi-Fi接続でのウェブページ読み込みにえらい時間がかかるようになってたので、こりゃありがてぇ!! と更新。

…あれ?? あんま変わらん…?? Wi-Fi重い(涙)

これ、試しにネットワークの設定を削除したら見違えるように快適になった!!

そういうもんなの?! まいっか。

削除方法はこう。まずネットワーク環境設定を開いて、右下の「詳細...」へ。

photo1

で、Wi-Fi接続の設定を選んで削除。

photo2

削除してから再接続すると、IDやらパスワードやら要求されるので再入力。これでオッケィ。

とりあえず自分の環境ではこれでWi-Fi接続が快適になった。


ではまた次回!!

OpenGLでガリガリアプリを書ける GLFW 3.1 の紹介

01
コード書いとる??

先日GLFW3.1が公開されましたね。

GLFWは、OpenGLを使ったアプリを書くためのシンプルなフレームワークです。OSごとに異なるOpenGLのコンテキスト生成などを、ごく簡単に扱えるように手助けしてくれます。
  • Windows、OSX、Linuxの環境で一貫したOpenGLアプリが書ける
  • キー入力、マウス入力、GamePad入力をサポート
  • マルチモニタ対応
GLFWの機能は、OSごとに異なるデバイスなどの扱いを吸収するに留まっています。そして、専用の描画関数や画像読み込み処理などは一切用意されていません。つまり描画関連は自分でガリガリ書く必要があるのですが、結果としてOpenGLの学習にはとても向いているといえるでしょう。


今回は、3.1で追加された機能のいくつかを簡単なコードを交えながら紹介していきましょう。紹介する内容はざっと以下の通り。長いよ!!
  • ライブラリのビルド
  • Hello, GLFW3 world
  • マウスカーソルの変更
  • FileのDrop操作
  • 外部スレッドからの空イベントを受け取る
  • フレームサイズの取得
  • フローティングウインドウの生成
  • 生成時のフォーカス
  • Oculus Rift対応
  • 修飾キー付きキー入力
  • シングルバッファモード
  • 外部インクルードマクロ

ライブラリのビルド
CMakeを使ってください。GUI版が一番導入が簡単でしょう。


Hello, GLFW3 world
GLFW3での初期化〜終了はこんな感じ。楽!!
#include <GLFW/glfw3.h>


int main() {
  GLFWwindow* window;

  if (!glfwInit()) return -1;

  window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }

  glfwMakeContextCurrent(window);
  while (!glfwWindowShouldClose(window)) {

    // OpenGLでの描画処理をここに書く

    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  
  glfwTerminate();
}

マウスカーソルの変更
手軽に自前のマウスカーソルを設定可能。もちろん、元に戻す機能も用意されています。
#include <GLFW/glfw3.h>
#include <algorithm>


int main() {
  GLFWwindow* window;

  if (!glfwInit()) return -1;

  window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }

  // マウスカーソルの生成
  // RGBA 8bit per pixel
  unsigned char pixels[16 * 16 * 4];
  std::fill(std::begin(pixels), std::end(pixels), 0xff);

  GLFWimage image;
  image.width  = 16;
  image.height = 16;
  image.pixels = pixels;
  
  GLFWcursor* cursor = glfwCreateCursor(&image, 0, 0);
  glfwSetCursor(window, cursor);

  
  glfwMakeContextCurrent(window);
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  
  glfwTerminate();
}

API補足
// システムのデータからマウスカーソルを生成
GLFWcursor* cursor = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);

// 初期状態に戻す
glfwSetCursor(window, nullptr);

// 生成したマウスカーソルを破棄
glfwDestroyCursor(cursor);

前からあったけど気付いてなかったカーソルON/OFF
// マウスカーソルOFF
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);

// マウスカーソルON
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);

 FileのDrop操作
プレビュワーとか作ってる人には朗報ですね。アプリウインドウにFileをDropした時のコールバックを指定できるようになりました。
#include <GLFW/glfw3.h>
#include <iostream>


// FileがDropされた時のコールバック
void dropCallback(GLFWwindow* window, int count, const char** paths) {
  for (int i = 0;  i < count;  i++) {
    // ファイルの並びはOSの仕様に準ずる
    std::cout << paths[i] << std::endl;
  }
}


int main() {
  GLFWwindow* window;

  if (!glfwInit()) return -1;

  window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }

  // FileがDropされた時のコールバックを指定
  glfwSetDropCallback(window, dropCallback);
  
  glfwMakeContextCurrent(window);
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  
  glfwTerminate();
}

外部スレッドからの空イベントを受け取る
glfwWaitEventsを使うと、なんらかの入力イベントを受け取るまで待機します。これを別スレッドからの空イベントでキックできるようになりました。
#include <GLFW/glfw3.h>
#include <iostream>
#include <thread>
#include <chrono>


int main() {
  GLFWwindow* window;

  if (!glfwInit()) return -1;

  window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }
  
  // 3秒待ってから空イベントを投げる
  std::thread thd([]{
      std::this_thread::sleep_for(std::chrono::seconds(3));
      glfwPostEmptyEvent();
    });

  thd.detach();

  glfwMakeContextCurrent(window);
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);

    // 外部イベント待ち
    // キーやマウス入力、glfwPostEmptyEventで待機解除
    glfwWaitEvents();

    std::cout << "WOW!!" << std::endl;
  }
  
  glfwTerminate();
}

フレームサイズの取得
ウインドウを生成した時の上下左右の余白のサイズを取得できるようになりました。
#include <GLFW/glfw3.h>
#include <iostream>


int main() {
  GLFWwindow* window;

  if (!glfwInit()) return -1;

  window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }

  glfwMakeContextCurrent(window);

  int left, top, right, bottom;
  
  glfwGetWindowFrameSize(window,
                         &left, &top, &right, &bottom);

  std::cout << left << "," << top << "," << right << "," << bottom << std::endl;
  
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);

    glfwPollEvents();
  }
  
  glfwTerminate();
}

フローティングウインドウの生成
常にTopに居座るウインドウを生成できるようになりました。複数のウインドウを扱うアプリで活用できそうですね。
#include <GLFW/glfw3.h>


int main() {
  if (!glfwInit()) return -1;
  
  GLFWwindow* window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }


  // ウインドウを生成するときのHintを指定
  glfwWindowHint(GLFW_FLOATING, GL_TRUE);

  GLFWwindow* sub_window = glfwCreateWindow(256, 128, "Floating Test", nullptr, nullptr);
  if (!sub_window) {
    glfwTerminate();
    return -1;
  }

  
  glfwMakeContextCurrent(window);
  
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);

    glfwPollEvents();
  }
  
  glfwTerminate();
}

生成時のフォーカス
複数のウインドウを生成するような状況で、生成時のフォーカスの有無を指定できるようになりました。
#include <GLFW/glfw3.h>


int main() {
  if (!glfwInit()) return -1;
  
  GLFWwindow* window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }


  // ウインドウを生成するときのHintを指定
  glfwWindowHint(GLFW_FLOATING, GL_TRUE);
  // 生成時は非アクティブ
  glfwWindowHint(GLFW_FOCUSED, GL_FALSE);

  GLFWwindow* sub_window = glfwCreateWindow(256, 128, "Floating Test", nullptr, nullptr);
  if (!sub_window) {
    glfwTerminate();
    return -1;
  }

  
  glfwMakeContextCurrent(window);
  
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);

    glfwPollEvents();
  }
  
  glfwTerminate();
}

Oculus Rift対応
とても詳しいドキュメントが追加されました。これまでよりええ感じに扱えるそうな。

修飾キー付きキー入力
キー入力のコールバックに、修飾キー付きが追加されました。助かりますな。
#include <GLFW/glfw3.h>
#include <iostream>


void inputProc(GLFWwindow* window, unsigned int codepoint, int mods) {
  // codepoint 入力文字(Unicode)
  // mods      修飾キー
  //             GLFW_MOD_SHIFT
  //             GLFW_MOD_CONTROL
  //             GLFW_MOD_ALT
  //             GLFW_MOD_SUPER  
  std::cout << codepoint << "," << mods << std::endl;
}


int main() {
  if (!glfwInit()) return -1;

  GLFWwindow* window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }
  
  glfwMakeContextCurrent(window);

  // キー入力のコールバックを指定
  glfwSetCharModsCallback(window, inputProc);
  
  while (!glfwWindowShouldClose(window)) {
    glfwSwapBuffers(window);
    
    glfwPollEvents();
  }
  
  glfwTerminate();
}

シングルバッファモード
フレームバッファを1枚だけ作って描画するモードが追加されとります。なんともマニアックなw
#include <GLFW/glfw3.h>


int main() {
  if (!glfwInit()) return -1;

  // シングルバッファモード
  glfwWindowHint(GLFW_DOUBLEBUFFER, GL_FALSE);
  
  GLFWwindow* window = glfwCreateWindow(640, 480, "Simple example", nullptr, nullptr);
  if (!window) {
    glfwTerminate();
    return -1;
  }
  
  glfwMakeContextCurrent(window);
  
  while (!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);

    // シングルバッファなので、OpenGLの実行を明示的に行う必要がある
    glFlush();

    glfwPollEvents();
  }
  
  glfwTerminate();
}

外部インクルードマクロ
OpenGL関連のヘッダファイル(glu.hとかglext.h)のインクルードの順番に悩むのですが、そのへんちゃんと対応されていました。これは助かる。
// 必要に応じてglext.hとかgl3ext.hとかをインクルード
#define GLFW_INCLUDE_GLEXT

//glu.hをインクルード
#define GLFW_INCLUDE_GLU


ざっと駆け足でGLFW3.1の新機能をいくつか紹介しました。このほかの機能を知りたい場合はリリースノートを読んでみてください。


ではまた次回!!!.!
 



Emacs24.4の文字コード設定を見直す

photo
コード書いとる??

自分にとって手に馴染んだテキストエディタEmacsが24.4になって一週間。色々環境整備を続けとります。

ずっと引き継いでる初期設定ファイルが秘伝のタレみたいになってるのはいくない!!

クリーンな環境だいじ!!!!

というわけで、今回はEmacs24.4の言語設定に関して整理した内容のメモ。

ちなみにEmacs24.4はこちらで解説されているパッチを当ててビルドしたのを使ってます。


まずは言語設定の一覧。

set-language-environment
;; 実行環境(OSX Emacs24.4ではJapanese)

set-default-coding-systems
;; 以下の値を変更
;; buffer-file-coding-system
;; default-file-name-coding-system
;; default-terminal-coding-system
;; default-keyboard-coding-system
;; default-process-coding-system


set-buffer-file-coding-system
;; buffer-file-coding-systemを安全に変更

set-keyboard-coding-system
;; keyboard-coding-systemを安全に変更

set-terminal-coding-system
;; terminal-coding-systemを安全に変更

set-file-name-coding-system
;; file-name-coding-systemを安全に変更

set-buffer-process-coding-system
;; current buffer の process-coding-system を安全に変更

prefer-coding-system
;; ファイル新規作成時のcoding指定


default-file-name-coding-system
;; file name のエンコード設定の初期値
;; set-language-environmentで設定される

default-terminal-coding-system
;; Terminalのエンコード設定の初期値
;; set-language-environmentで設定される

default-keyboard-coding-system
;; キー入力のエンコード設定の初期値
;; set-language-environmentで設定される

default-process-coding-system
;; I/Oのエンコード設定の初期値
;; set-language-environmentで設定される

default-buffer-file-coding-system
;; 23.2以降では非推奨


buffer-file-coding-system
;; baffer local な coding

locale-coding-system
;; ???

多すぎ!!

なので、こんな感じのポリシーを決めて、設定を見直してみた。
  • 普段はutf-8で統一
  • VisualStudioでも扱うソースファイルはutf-8-with-signature
  • OSXで最低限の設定
初期値を調べたり、設定を削ってみたりすること小一時間…

結果、OSX Emacs24.4の言語設定に関しては以下の項目まで絞り込めた。

;; 特定の拡張子だけ、文字コードを指定
(modify-coding-system-alist 'file ".+\\.\\(cpp\\|c\\|hpp\\|h\\|mm\\|h\\)$" 'utf-8-with-signature)

;; ファイル名の文字コード
(require 'ucs-normalize)
(set-file-name-coding-system 'utf-8-hfs)

;; Shellの文字コード
(defun osx-shell-mode-hooks()
	(set-buffer-process-coding-system 'utf-8-hfs 'utf-8-hfs))
(add-hook 'shell-mode-hook 'osx-shell-mode-hooks)

うむ。スッキリ!!


あとなぜだか、set-buffer-file-coding-systemでutf-8-sまで入力して補完しようとすると、以下のエラーが出る。

completion--some: Internal error: utf-8-dos doesn't match \`utf\(.*?\)-\([-_./:| *]\|\([[:alpha:]]\)[[:digit:]]*?\)8\(.*?\)-\([-_./:| *]\|\([[:alpha:]]\)[[:digit:]]*?\)s

これなんだろね…


ではまた次回!!

Yosemite上げてMacPorts上げて

macports-logo-top
コード書いとる??

いつものようにターミナルからMacPortsを更新しようとしたら「バージョン新しくしてね」って言われた。

ので、そのメモ書き。

こちらのサイトが参考になりました。多謝!!

Xcode必須ね。ふむふむ。

Xcode Command Line Toolsも入れにゃ。

xcode-select --install

公式サイトでMacPorts Yotemise対応版のインストーラーをゲット。

ダウンロードして実行。

インストールが終わったらいつものようにコマンドを実行。

sudo port -d selfupdate
sudo port upgrade outdated

楽!!(けっこう時間は掛かった…)


ではまた次回。

YosemiteにEmacs24.4を導入

photo

コード書いとる??

先日Emacs24.4が公開されとったのでYosemiteにサクッと導入。

その動作確認をしながら気づいた事をメモ書き。


・Emacs 24.4をビルド
公式からソースを取ってきて、こちらで紹介されとるパッチを当ててビルド。
毎度すばやい対応ありがとうございます。インライン日本語入力も含めていまんとこ問題なし。

・GNU Emacs NEWSをじっくり読めばだいたいわかる:D
C-hnにバインドされとるview-emacs-newsですな。

・OSX版だとカーソルは10回点滅したら点滅しなくなる
blink-cursor-blinksで振る舞いを変更してね。だそうですw

・electric-indent-modeがONになってる
JSON形式(Javascript)もオートインデントされる!!

・toggle-frame-fullscreenとtoggle-frame-maximizedが追加されとる
ようやく… ようやく…(涙)

・終了時のフレームやバッファの状態を覚えてくれるようになった
標準でサポートされるのはありがたい。
 
(setq desktop-dirname "~/.emacs.d/")
(desktop-save-mode t)

ただし前述のtoggle-frame-fullscreenと喧嘩するので起動時にちょいと細工が必要だ。
追記: desktop-restore-framesをnilにすればframeの設定は保存しなくなる。YES!!

・Shell
文字コードをutf-8-hfsにするのを忘れてたので設定
 
(require 'ucs-normalize)
(defun osx-shell-mode-hooks()
	(set-buffer-process-coding-system 'utf-8-hfs 'utf-8-hfs))
(add-hook 'shell-mode-hook 'osx-shell-mode-hooks)

・view-mode
標準でいい感じにキー操作できるので、これまでの設定を全部破棄して、どこでもview-modeできるようにしたった。これで他人のコードをうっかり編集したりしなーい!!
 
(global-set-key "\C-xp" 'view-mode)

・標準搭載のorg-modeがVer.7→8になった
自分は常に最新版を使っとります!!

るびきち「日刊Emacs」がとても詳しく、たいへん参考になります!!

・前置キーの後の'?'入力
その前置キー(C-xとかC-cとか)で始まるキーバインド一覧を表示してくれるようになった。これまではC-hだったのがより直感的になっとる。


・オマケ
YosemiteのSafariは初期設定でWebGLがONになっとるんだね。
これは、環境設定→セキュリティで変更できた。


ではまた次回!!
記事検索
電子書籍発売中

「チュートリアル形式で始めるOpenAL」
サウンド怖くない。C++による8つのチュートリアルで始めるOpenALプログラミング。さああなたも、自作アプリに魅力的な音効を添えてみませんか??
⇒Kindle版 ⇒iBooks版


「iPhoneアプリ『ういろう』のレシピ」
ゲームってどうやって作ってるの?? 拙アプリ『ういろう』の製作過程を本にまとめました。もちろんソースコードつき
⇒Kindle版 ⇒iBooks版


『チュートリアル形式で始めるOpenGL[2D編]』
OpenGL怖くない。C++による16のチュートリアルで始めるOpenGLプログラミング[2D編]。さああなたも、ゲーム作りを始めてみませんか?
⇒Kindle版 ⇒iBooks版
自作ゲーム配信中

『Puzzle & Monarch』
「君主候補となって国作り!! ただし制限時間は90秒。」森を作って道をつないで...あなただけの国を作ってみませんか??
⇒AppStore


『BRICK & TRIP』
咄嗟の判断に、あなたの指先はついてこれるか?! 爽快フリックアクション!! 様々な難関をくぐり抜けて旅の終着点を目指そう!!
⇒AppStore


『ういろう』
名古屋土産ういろうがiPhoneで大活躍?! 白ういろうを守れるのはあなただけ。ひゅーん、ぼよよーん!!
⇒AppStore ⇒LITE版


『こなへん』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒AppStore ⇒LITE版


『GEOSPOT』
ヒマラヤ山脈、大西洋、世界で一番深い湖… それって地球のどこにあるのか知ってるかな?『全方位直感地理クイズ』という新ジャンルに挑戦!あ、それ。地球をくーるくるw
⇒Windows ⇒Mac


『TieGunner』
マウス片手に大宇宙へ飛び立とう!『しっぽシューティング』というジャンルを作って頂きました^^; WinでもMacでも動きます。ソースもあるでよw
⇒Windows ⇒Mac
QRコード
QRコード
  • ライブドアブログ