プログラム

当たり判定とか -3D編-

当たり判定方法といっても ・球-球 ・矩形-矩形 ・辺の法線の交差判定 ・面の法線(レイ)の交差判定 + α とかいろいろある*1わけですが、 今回は「球-球」で判定してみました。 一応、採用した理由は、 (・(前提条件)気楽に使える判定は「球-球」「矩形-矩形…

ライトを回したいんだけど…

平行光源を使ってるんですが、 そのときに、光の差す方向を変える際の注意点。

メタセコローダ お騒がせ致しました…

Yeah! 頂点色もClearになったんだぜ!! というわけで、頂点色もキレイに読めるようになりました。 すいません、僕の方のミスでした。お騒がせ致しました…(謝) スペース読み飛ばしただけで数字でループしてちゃ意味無いよ…。 で、後はマテリアルとスケール…

メタセコローダ

こんな感じになってますが。(モデル自体はメタセコに標準で付いているもの) 色が付いていないのはテクスチャを貼っていないからです。 (足元に何かあるけど気にしない方向で…(苦笑)) で、以下に少し気になった点を列挙してみる。 ・カリングは左回り(DirectX…

フォーカスって大事だよね - 長めのループをする際の「応答無し」回避方法 -

今回は気をつけていないと意外とやってしまいがちなミスに関して。

WinAPIでキレイに描画する -その3 メッセージ管理-

前回からの続き。 前回まででちらつきのない描画は大体完了したわけだけど、 このままでは、描画の更新のタイミングが上手くいかないんじゃないか? という話。 これを解決するには、 自分でWM_PAINTを送信してやればいい。 ただ、何も考えずにSendMessage()…

WinAPIでキレイに描画する -その2 バックバッファリング-

前回からの続き。 描画タイミングを合わせたとしても、描画途中が表示されては意味がない という話。 ではどうすればいいかというと、 描画が完了するまで表示しなければいい。 正確には、描画が完了するまでは内部のバッファに描画し、 描き終ったら実際に…

CEの仕様 -タイマ関数とか-

何か、「WinCEではtimeSetEvent()は正常に機能しない」とか書いてあるページがあったけど、 とりあえず、僕のよく使う「一定時間ごとにPulseEvent()を送る」機能は正常に動作する模様。

WinAPIでキレイに描画する -その1 更新を合わせる-

WinAPIで何も考えずに描画部分を書いていると*1 「重い」わ「チラつく」わではっきり言って見られてものにはならない…。 で、これを改善するにはどうすればいいだろうか? 答えは簡単。メインループ部ではなく、ウィンドウの描画タイミングに合わせて描画す…

メッセージだけでキー入力を拾ってみる

WinAPIを使っての入力の取得は、基本的には ・if( GetAsyncKeyState( vk ) )*1 で大丈夫なんですが、コレが使えないときはどうするか? という話。 *1:押下の瞬間を拾うのであれば「if( (GetAsyncKeyState( vk ) & 0x8000) == 0x8000 )」の方が意味合いとし…

WinAPIなしで細かい時間を取得してみる (ネタ)

現在の時間を取得しようとするとなると、 unsigned int t = (unsigned int)time( NULL );とするのが一般的かと思いますが、 これだと一秒単位でしか取得できない。 もしも、秒単位より細かい分解能が欲しくなった場合は、 unsigned long clock = 0; _asm { r…

WinAPIで「ftell()」と「feof()」を再現する

なぜか、Windouwsの標準APIには「ftell()」・「feof()」に対応するものが無い…。 ただ、他の関数を幾つか組み合わせればソレっぽい機能は実装できるので、メモっておこうかと。

WinAPIの困った(?)仕様 -サウンドプログラム編?-

前から知っていたけど、どうせなのでまとめてみる。

メモメモ

・ a NAND b = NOT( a AND b )は当然だけど、 NAND( a, b, c )((要するに3入力NAND))は (a NAND b) NAND cではダメで、 NOT( (a AND b) AND c )が正解。 (別に中の()は不要だけど) …というか、演算順序的に当たり前か…。 ・ 何かデバイス解放中に例外が起こ…

文字列を(区切り文字を指定して)分割する

要するに「strtok()を使いやすくまとめてみよう」ということ。

確保した領域の大きさを変える

要するに「realloc()」の使い方に関して。

Cのマクロ定義

・#define TEST i=0; --- 「TEST」→「i=0;」 ・#define TEST() i=0; --- 「TEST()」→「i=0;」 ・#define TEST( ) i=0; --- 「TEST()」→「i=0;」 ・#define TEST () i=0; --- 「TEST」→「() i=0;」 ・#define TEST( i ) i=0; --- 「TEST(i)」→「i=0;」 ・#def…

宣言子(?)の略称を考える

スクリプト(含むMML)を組んでいて悩むもの、その3あたり? 変数を使わないのであれば不要なんですが、スクリプトだとそうもいかないので…。 …で、僕は「DIM」をよく使っています。 これはVBの宣言子*1から拝借したものなんですが、 そもそも「dim」って何よ…

(多分)使えない論理演算メモ

・ (a | b) - (a ^ b) = (a & b)某所のアセンブラの練習問題の答え(苦笑) 左辺の式から3行も減らせるぞ!(謎) これで正解…のはず。 ・ swap( int a, int b ) { a ^= b; b ^= a; a ^= b; }C言語における値の交換(いわゆる「swap」?)。 (本当は引数をポインタ…

先人の知恵ってスゴイなぁ

…あー、なるほど。 「比較」「ジャンプ」があれば 「分岐」も「反復」も上記の組み合わせで出来るのか。 あくまでも内部仕様は単純に。 (「コードの単純化・簡略化」(それに伴う処理効率UP)に繋がる?) …goto(=jmp)無しで、ifとwhileを根性でガリガリ書こう…

マイナー(?)な演算子の仕様を調べてみる

演算部分を実装している過程でふと気になったのですが、 「ビットシフトに負の値が来るとどうなるんだろう?」 というわけで、↓のような式で調べてみる。 int num = 2 結果、numを出力してみると「0」になっていた。 …何か符号付きだと考えづらいな…、 つい…

…リークしてる…んだよね??

…「0byteのメモリリーク」も存在するんだ…。 ……どういう状況だ?(汗)

固定小数の精度とか

固定小数を使う時は精度が気になるとかいうことがあるようだけど、 実際どの位の精度なのかは以外と示されていないような気がしたので、調べてみる。 ……要するに、「2の-n乗」の表を書くだけなんですが…(汗) // 割り当てるbit数 : 表せる精度 1 : 0.5 2 : 0.…

逆ポーランド記法に潜む罠 -単項演算子に気をつけろ!-

スクリプトの計算がいつまでも 自前で用意した中間記法*1を根性で処理する 代物なのも、危険極まりない気がしてきたので、 内部的に逆ポーランド記法(以下「RevP」)に書き換えるようにしようかなと思い立ったわけですが。 (結論は一番下です) *1:一般的な数…

未定義域の検証 -atan2編-

atan2( 0.0f, 0.0f ) = 0.0f; atan2( 0.0f, 0.1f ) = 0.0f; atan2( 0.1f, 0.0f ) = PI / 2; atan2( 0.1f, 0.1f ) = PI / 4; 下x2はオマケで何となく。 別に未定義域でも「例外が返ってくる」とかそういうことはないのね(笑) …float型なのに特に意味はないで…

これはひどい…

「%」*2 で補正するよりも 「for文」*4 range_max ; ){ pos -= range;}みたいなの*2">*1 で補正した方が速い…(汗) …しかも、負の時の挙動*2が制御依存にならないので一石二鳥…(苦笑) *1:for( ; pos { pos += range;}for( ; pos > range_max ; ){ pos -= rang…

(座れない)ベンチ

上で少し話題に出したので晒してみます。 使用ソフトは「CrystalMark 2004R2」というソフトです。

メモ

・ m * n / a / b … (1) と m * n / (a * b) … (2) が一致するっていうのは当たり前なんですが、 コンピュータ上の整数型でも成り立つ…のかな? (どうも、余りも合わせて一致するみたい。 (1)の方だと最初の除算でデータが落ちることがありそうなもんですが……

今日のやっちまったぜ(謎)

以下のコードで「ゼロ除算」が出ました。 data += buffer[address] * pan * fm_env / (v_div * env_max); 「v_div」はvolume調整用の係数のようなもので、 「env_max」の方も同様で、こちらはFMのenvelope用のもの。 …というわけで、両方とも非0(もし0なら無…

果てしなく適当なメモ

・どうも、DirectXにはワイヤーフレームの太さを制御する機能はないらしい…。 (ただし、DirectX9なら、 D3DRS_ANTIALIASEDLINEENABLE あたりを使うと多少いじれる?らしい…(コレに関しては後日調べると言う方向で) 後、D3DRS_LINEEDGEWIDTHというのがあるら…