[[開発者向け情報>devel]]

SprBlender2.0(仮)は,SprBlender1.3のの内部構造とUIに大幅な変更を行ったものです.

特徴的な変更を以下に挙げます.


* module名の変更,自動import [#beb1fa2b]

- module名がspr_opからspbに変更になりました(SPrBlender, またはSprPyBlenderの略です).
-- &size(9){これによって,import時の入力文字数が3文字削減されました.アンダースコア入力のためにShiftキーを押す必要もないためキータイプ数にして4キーの節約になります(謎).};

- 一度import spbを行ったあとで,そのファイルを保存すると,次回ロード時からは自動でimport spbが行われます.
-- 初回import spb時に,start_spb.py というテキストが生成され,Registerのチェックが入るようにしてあります.
-- 自動インポートしてほしくない場合は,start_spb.pyテキストの,Registerのチェックを外してください.


* Operator Panelの変更 [#x307fbca]

#ref(spb_oppanel.png,wrap,around,right,zoom,55%)

+ FPS情報は,TextEditからSprBlender Infoパネルへ移動になりました.
-- Springhead Physicsと SprBlender Operatorは非同期で動くため,それぞれのFPS(CPS)が表示されます.
+ Set Scene / Set Objectsを廃止しました.
-- Springhead Sceneの構築は,blender sceneの変更を検知して自動で行われます.そのため,明示的なSet Sceneは不要となりました.
+ シミュレーション開始直前の状態を自動で保存し,Backボタンで元に戻せるようにしました.
-- 状態記録はStartボタンを押した時に行われます.
-- Startボタンは,シミュレーション中はPauseボタンに変化します.Pauseからの再開は「ReStart」として扱われ,状態記録の対象になりません.
-- Stopボタンを押すとReStartでなくStartとなります.
-- Endボタンは,最後にシミュレーションを止めた時点の状態を再現します.シミュレーション停止とは,Pause,Stop,およびOneStepの終了時です.
-- なお,Backや後述するRestoreの情報はBlenderを終了すると消えてしまう(.blendファイルに保存されない)のでご注意ください.
+ Store/Restoreの機能がつきました.
-- Backボタンとほぼ同じですが,シミュレーション開始とは関係なく任意の状態でStoreできる点が異なります.
-- なお,BackとRestoreは異なるバッファを使用するため,Restore Sceneは必ず最後にStoreボタンを押した時の状態に戻ります.
+ Minimal Syncモードがつきました.
-- シーンの変更検知・同期を最小限に抑え,動作を高速化するモードです.主に表示のカクつきをなくし滑らかにする効果があります.
-- SprBlenderの動作を節約するため,Physics Stepの動作速度には影響しません.(ただしRule ScriptのStep間隔に影響するため動作そのものには影響があります)
-- このモードでは新たなオブジェクトの追加や,Blender側からのオブジェクトの編集(移動含む)ができません.デモ用として利用してください.
+ Creature RuleのUpdateボタンをOperator Panelに配置しました.
-- Physics Scriptと同様にしました.これに伴い,ObjectパネルからはApply Ruleボタンがなくなっています.
-- また,スクリプトが外部ファイルに保存されている場合はUpdate時にファイルからの再読み込みも行うようにしました(Physics Scriptも同様).


* Scriptについて [#b84b5a26]

- init, stepの2種類のスクリプトを記述できるようにしました.
-- initは,スクリプトが最初に実行される時,またはUpdateボタンを押した時に実行されます.
-- stepは,PhysicsやCreatureのハンドラがstepされるたびに実行されます(SpringheadのPhysicsやCreatureのStepとは非同期である点に注意).
-- initおよびstepではローカル変数が維持されます.したがって維持したい変数にself.等をつける必要はなくなりました(逆にselfは存在しなくなったため,付けるとエラーになります).
-- スクリプト実行環境は初期状態では空になっています(従来のようにphScene等デフォルトで使える変数が存在しません).スクリプト内でimportが使えますので,import bpyやimport Spr等を行なってください.

- スクリプトのテキスト名は以下のようになります.
-- Physics Scriptの場合
--- spr_script_init
--- spr_script_step
-- Creature Scriptの場合(例)
--- creature_rule_Koguma_init
--- creature_rule_Koguma_step

- スクリプトが外部ファイルに保存されている場合は,Update時にファイルからの自動で再読み込みした上でスクリプトとして反映されます.


* Human Interfaceの接続 [#r919523b]

#ref(spb_pointer.png,wrap,around,right,zoom,55%)

- Object PanelのUse Interface設定で,オブジェクトをインタフェースに接続してハプティックポインタにするかどうか選べるようになりました.
-- なお,1/26時点ではSpaceNavigatorとSPIDARにのみ対応しています.

-- 従来のようにポインタの名前を「@Pointer」にする必要はなくなりました.



* Creature Panel [#f5d14488]

#ref(spb_creature.png,wrap,around,right,zoom,55%)

- クリーチャのパラメータを名前と対応付けて管理できるようになりました.
-- スクリプト内でのパラメータの参照はget_cr_param関数を用います.
--- from utils import get_cr_param
--- get_cr_param(group, "FOV Horiz")

- ビジュアライザの追加・削除がパネルからできるようになりました.
-- 例えば目が複数ある場合にFOVビジュアライザを複数作るといったことが可能です.
-- FOVビジュアライザの場合,ターゲット(頭や目)の名前と,視野角を提供するパラメータ名を指定することが可能です.
-- また,ビジュアライザの可視・不可視をまとめて切り替えることができます.


* APIについて [#yf08fd5b]

- 内部構造の変更にともなって,スクリプトからphSceneやSolidを参照するためのAPIも大きく変わります.

- Sceneへのアクセス
-- 2通りあります.
 import spb
 
 # handlerを経由する方法
 phScene  = spb.handlers.scene_handler.fwScene.GetPHScene()
 
 # spbapiを使う方法
 phScene  = spb.spbapi.GetFWSdk().GetScene(0).GetPHScene()


- SolidやJointへのアクセス
-- 各オブジェクトはハンドラと呼ばれるクラスに保持されています(従来のcontrollerに相当します).
-- spb.handlers.xxxxx_handlers にアクセスするとハンドラを取得できます.
--- xxxxx_handlersはオブジェクト名をキーとするdictになっているため,名前で引きます.
 import spb
 cube = spb.handlers.solid_handlers['Cube']
--- ハンドラはメンバ変数としてbpy objectやSpringhead Objectへのポインタを保持しています.
 # bpy object
 objCube = cube.object
 # spr object
 soCube  = cube.phSolid
--- Scene, Creature, Visualizerのハンドラを除くすべてのハンドラにおいて,bpy objectの格納されたメンバ変数は「.object」です.
--- Springhead Objectは,.fwScene, .cdShape, .phSolid, .phJoint, .phIKEff, .phIKAct, .crCreature, .crBoneなどです.
 


* Scene PanelとPhysics Timerについて [#cd78fd5a]

- 物理シミュレーションがオペレータとは別のタイマーで動くようになりました.
-- Scene PanelのFPSの項目はシミュレーション用タイマーの更新周期の設定に使われます(オペレータのタイマーは変化しません).
-- これに伴って,substepは撤廃する方向です(従来はSpringhead PhysicsのStepがSpr Operatorのタイマーによって呼ばれていたため,シミュレーションのΔtを小さくするためには1タイマーあたり複数回のStepを呼び出すsubstepが必要でした).


* sprファイルの出力 [#xe2d2bb6]

- sprファイル出力が,
 Fileメニュー -> Export -> Springhead(.spr) 
- で行えるようになりました.



* 独自のSpr.pydを使用 [#pf894bd9]
- SprBlender付属の,独自拡張を行ったSpr.pydが必要です.従来使用できたSpringhead標準付属のSpr.pydは使えません.