February 12, 2007

quartzcomposer+cocoa フルスクリーン.app part4

Written by noriko matsumoto | Cocoa

qtviewをのせたwindowをマウスで移動させる方法です。
今のままフルスクリーンにしてもデュアルモニタにした画面に持っていけないので、操作ができなくなってしまい不便です。
そのため、qtviewをのせたwindwをマウスのドラッグで自由に動かせる様にします。
xcodeのqtwin.mに下記を追加します。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
- (void)mouseDragged:(NSEvent *)theEvent
{
NSPoint current_mouse;
NSPoint neworigin_mouse;

// グローバルマウス座標を得る
current_mouse = [ self convertBaseToScreen:
[ self mouseLocationOutsideOfEventStream ]];
// ウインドウの原点の位置を計算する
neworigin_mouse.x = current_mouse.x - _initialLocation.x;
neworigin_mouse.y = current_mouse.y - _initialLocation.y;

// ウインドウの位置を補正
[ self setFrameOrigin:neworigin_mouse ];

}

- (void)mouseDown:(NSEvent *)theEvent
{
// マウスクリックした場所をローカル座標で記録
_initialLocation = [ theEvent locationInWindow ];
}

ーーーーーーーーーーーーーーーーーーーーーーーー
(@endを忘れずに)
保存してインターフェースビルダーに戻り、qtviewをのせたwindowの上に
CustamViewオブジェクトをドロップアンドドラッグでのせます。

view.jpg view7.jpg

ビルドするとqtvieをのっけたwindowが動かせるようになります。

[quartzcomposerへの操作 ]
コントロールwindow上にpart1で設定しておいたquartzcomposerへの操作を追加します。
インターフェースビルダー上にスライダーを置きxcodeのBindingsという機能を使ってその値
をqtviewに読み込まれているquartzcomposerに渡します。

view2.jpg

1、インターフェースビルダー上のcocoa-Controlからwindowにスライダーをおきます。
2、スライダーの値を設定します。1.0~0.0の間で動くようにします。
デフォルトでは、Continuosuly send 〜というスライダーを動かしている間、
数値を送り続けるという設定がオフになってるのでonにしてあげないとあれ?という事になります。
3.NStextfieldをおき、スライダーと繋ぎます。(コントロールを押しながらスライダーをクリックしtextfield上まで動かし、マウスを離します)
Targetタブをクリックし、takeFloatValuefromを選択して、connectを押します。

views.jpg

view4.jpg

qtviewを選択して、inspecterを出し、Bind toをQCPatchControllerを選び、Controller keyをpatchと入力します。

view5.jpg

スライダーを選択して、inspecterを出しBindingを選び、
1.Bind toをQCPatchControllerを選び、Controller keyをpatchと入力します。
2.Model key path として、quartzcomposerで作ったパラメーターを入力します。
b.valueにしました。
同じようにスライダーを置き、quartzcomposerでbinding設定したパラメーターを設定していきます。

これでひとまず、終了です。
part4のサンプル

February 05, 2007

quartzcomposer+cocoa フルスクリーン.app part3

Written by noriko matsumoto | Cocoa

コントロールwindow上にあるボタンを押すとqtviewのwindowがフルスクリーンになるという機能を作ります。

インターフェースビルダーから
MainManu.nibのClassesタブをクリックして新しい機能を作っていきます。
[classの作り方]
classes→NSobject→でリターンを二回押す。
するとMyObjectというのができます。これで新しいクラスができます。
今回はクラス名をfullsにしました。

0ピクチャ 8.png window2.jpg

fullsのinspecter(fullsを選んでtools→ShowInspecter)を開きます。
1.outletを作る
でAttribuleタブを選択し、まず、OutLetを追加します。addボタンでoutletを追加して、Outletnameをつけます。これはこの機能(Fulls)の出力先になります。
2.Actionを作る。
addボタンで追加しAction名をつけます。(ここでは、fullactionにしました。
これはボタンをクリックしたときに、呼ばれる関数だと思ってください。
0ピクチャ 9.png 0ピクチャ 10.png
[classファイルの生成]
Main.NibのClassesにあるfullsをえらんで以前と同じように、create files for fullsで
fulls.hとfulls.mを生成します。
[fulls.mファイルについて]
ーーーーー
#import "fulls.h"//ヘッダーファイルの読み込み

@implementation fulls

- (IBAction)fullaction:(id)sender
{//インターフェースビルダー(IB)上から、アクションが呼び出された時の
動作内容(関数名fullaction)

[ winFull setFrame: [ [ winFull screen ] frame ] display:YES];
//ディスプレイサイズにwindowをセットする。
[ winFull makeKeyAndOrderFront : self ];
//windowを最前面にする
}

@end
ーーーーーーー
fulls.mをxcodeウィンドウでダブルクリックして開き、上記の内容に書き換えてください。
fulls.hですが開くと下記のようになってますので、そのままでいいです。
----------------
/* fulls */

#import

@interface fulls : NSObject
{
IBOutlet id winFull;
//インターフェースビルダー上にはwinfullというアウトレットが設定されているという事
}
- (IBAction)fullaction:(id)sender;
//インターフェースビルダー上にはfullactionというactionが設定されているという事
@end
-----------
mとhともに保存しておきます。

tech1.pngtech2.png
[インスタンスを作る]
再び、インターフェースビルダー上に戻り、Classesからfullsを選択
そしてメニューバー→classes→Instrantiate fullsを選択します。
すると、MainMenu.nibのInstancesにブルーのBoxができています。

これはfull.classに書いた命令や機能をインターフェースビルダーで使えるようにしてくれているInstanceと呼ばれるものです。
[インターフェースと機能をつなげる]
コントロール用のwindowにボタンをおき、コントロールを押しながらボタンからfullsに向かってマウスを動かします。
tech4.png tech3.png

fullsの上につながったら、自動的にインスペクターが開きます。
Target/actionが選択でき、"fullaction"が反映されており、選択できる状態です。
fullaction選びconnectボタンを押す事と、「このwindow上のボタンを押したとき、”ullaction”が呼び出される」事になります。
つぎに先ほど設定したOutputもインターフェースビルダー上で決めてしまいます。

fullscreenにしたいのはqtviewのwindowなので、今度は先ほどと逆に、fullsのインスタンスをコントロールを押しながらクリックし、そのままqtviewの乗っているwindowのツールバーあたりまで持っていきます。

するとまたinspercterのoutletの選択項目が自動的に開きますので、そのままwinFullを選択しconnectボタンを押します。
これで、xcodeから「ビルドして実行」し、window上のボタンを押すと
fullscreenになります。

qtviewのサイズ設定
フルスクリーンにしたとき、サイズが自動でリサイズするように設定します。
tech.jpg
qtviewを選択→inspercterのサイズタブを選択→4方向をクリックしてバネ上にする。

*といったのですが、quartzcomposerファイルでclearパッチをつけるのを忘れていたのでこのまま、fullscreenにするとノイズが出てしまいます。clearを追加してください。
またG5のデフォルトのビデオカード6600ではclearをつけても、ノイズが出て対応できない
可能性があります。
この場合、フルスクリーン化のクラスを使わない方法を使いました。
例:(1074x768全画面出力希望とした場合)
最終出力の画面サイズ以上に環境設定のモニター解像度(1900x768など)を設定
xcodeのプロジェクトを立ち上げる→
qtviewをのせたwindowのサイズを希望の最終出力(1074x768)に設定
でビルドする。
→モニター解像度を最終出力ものに(1074x768)戻す→作成したappを立ち上げる。
モニター解像度が1074x768にしても、1074x768のwindowをインターフェースビルダーで作れないという所に結構ハマりました。

ここまでのサンプルです。
quartzファイルの中で使用している映像ファイルはいれてませんのでquartzファイルを開いて
適度なムービーを使用してもらえればいいです。

January 31, 2007

quartzcomposer+cocoa フルスクリーン.app part2

Written by noriko matsumoto | Cocoa

windowでの映像の表示ができたので次にコントロール用のwindowを作ります。

インターフェースビルダーから、cocoa controllersのwindowの絵があるところをクリック。
Windowとでっかくかいてあるwindowの絵を適当な場所へドラッグアンドドロッグ。
自動的に、MainMenu.nibにwindow1というのができます。
名称未設定 1.jpg0ピクチャ 7.png

そのままコントロール用のウィンドウのshowinspecterを出していろいろ処理します。
2つ以上windowを使う場合、全てのwindowアトリビュートでoneshotをチェックボックスを外さないと表示してくれません。また、VIsible at launch timeのチェックボックスを入れておきます。
というわけで、quartz表示用のwindowとコントロール用のwindowができました。

でxcodeからビルドして実行を押してみると2つwindowがでててqtzが再生されてます。

で次、
ボタンを押したら、qtzのwindowをフルスクリーンにする機能を作ります。
ーーーーー
MainMenu.nibのClassesタブをクリック。
NSobject→NSResponder→NSwindowを選択。
0ピクチャ 8.png0ピクチャ 9.png

そのもう一個先のところでリターンを2回押す。とMywindowというのができます。
このMywindowでもいいのですが、なんかせっかくなのでわかりやすい名前をつけます。
今回はqtwinにしました。qtwinを選択して、インターフェースビルダーのメニューから
Classes→Create Classfile for qtwinというのを選びます。
ーーーーー
するとXcodeのところにqtwin.hとqtwin.mができてます。
0ピクチャ 10.png
hはヘッダーファイル、qtwin.mは実際は動いてほしい機能を書くファイルです。

で、そのままqtwin.mを開いて、
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#import "qtwin.h"
#import

@implementation qtwin

- (id) initWithContentRect : (NSRect) contentRect
styleMask : (unsigned int) aStyle //windowスタイル
backing : (NSBackingStoreType) bufferingType

defer : (BOOL) flag {

/// INITIALIZE BY SUPER CLASS
NSWindow* winFull = [ super initWithContentRect : contentRect
styleMask :NSBorderlessWindowMask//ぼーだーなし
backing : bufferingType
defer : NO ];
[ winFull setLevel : kCGScreenSaverWindowLevel ];

return winFull;//winFullをかえす
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
と書きます。
ここでは、wifullはwindowを
枠やツールバーのない状態で全てのwindowから一番高いレベルで
表示されるんだ。ということが書かれてます。

main.hにはこれを、
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
/* qtwin */

#import
@interface qtwin: NSWindow

{
NSPoint _initialLocation;
}
@end
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これはまた後日つかう所なので、また、改めて説明。

で保存してください。
でこれらをどうするかというと、またインターフェースビルダーに戻り、
qrtzをおいたwindowのShowInspecterでClassを選択→
qtwinを選んであげます。
ピクチャ 4.png00ピクチャ 4.png
そのままビルドすると、枠なしwindowができました。

(この過程はjitterなら簡単なのになーーーといつも思いますが、、、)

January 30, 2007

quartzcomposer+cocoa フルスクリーン.app part1

Written by noriko matsumoto | Cocoa

どもです。2007年はフランクにいきたいマツモトです。
という訳で「quartzcomposer+cocoa フルスクリーン.app」でっす。
時代はHDVもということでHDVのリアルタイム処理をしたいときに
便利なのがquartzcompser。
マシンにもよりますがそこそこのフレームレート(一応30fpsぐらい)でごりごりできます。
そのごりごりの為の処理なのですが、qtzをそのままフルスクリーンにすると
キーボートやマウスやmidi以外でごりごりするのが難しくなります。

という事で、コントロールパネルを作って、もう一個のwindowにqtzを読み込み
それをデュアルモニタした一方にQTZをフルスクリーンにしてコントロール用windowから操作する方法です。
まずは、qtzを作る。
今回は、720x576しかなかったのでそれで。
ピクチャ 5.pngピクチャ 6.png

こんな感じで組みます。ここで、外から操作できるように、bandingします。
bandingしたいインプットのオブジェクトをコントロールクリック。
するとこんなのがでるので、bandingしたいインプットを選択し、banding名を入力。
ピクチャ 8.png
今回は、コントラスト系3つと高さを変更します。
-----------------------------------------------------------------
使ったpatch
--ImageDimension:ムービーの持つ比率を出すpatch
--ColorControll:明度、彩度、コントラストを変化させるpatch
--Sprite: 3Dの座標指定ができる3D平面
--clear:これがないとxcodeでフルスクリーンにしたときに画面のリフレッシュがうまくいきません
bilbord patchもありますが、なぜか高さの変更ができないので16:9には向きません。
-----------------------------------------------------------------
で、QTZのViewerでparametersでみるとこんな感じ。でこのまま保存。ひとまずqtzはしゅうりょー。
次にXcodeを使います。
developer→application→xcodeを開きます。
ピクチャ 10.pngピクチャ 11.png
新規プロジェクトでcocoa applicationを選択。
どん。次にquartzのフレームワークをプロジェクトに追加します。
ピクチャ 12.pngピクチャ 14.png
その後、main.nibをクリックします。インターフェースビルダーが立ち上がって
こうなるのですがここにquartzをインターフェースビルダーで使えるように
QuartzComposer.paletteを読み込みます。
paletteの読み込み方
インターフェースビルダーの環境設定からpaletteを選択→addボタンで追加
qratz.paletteはdeveloper→Extras→PalettesにQuartzComposer.paletteを選択し読み込む
ピクチャ 17.pngピクチャ 19.png
するとインターフェースビルダーのpaletteにQuartzComposer.paletteが出てくるのでこれを使ってqratzcomposerファイルをつかったアプリが作れるようになった訳です。

標準で一個できているwindowにqtviewをおいてみます。
次に、Mainmau.nibにQtPathControllerをおきます。このpaletteのグリーンのやつです。
この子とさっきのqtviewは対になっていると考えてください。
なので各それぞれに読み込むファイルを選択して挙げますが、
片方を変更したら片方も変更してあげましょう。よくハマります。

windowにおいたqtviewを選択して、メニューバーのtoolからShow Inspecter
を選んで、そこのアトリビュートで読み込むqtzファイルを選んでやります。QtPathControllerも同じ。

続く。