C#Interface 関連ドキュメント: C#Interface に関するドキュメントの厚生は次のとおり。 3.C#Interface.txt(*) -+- 31.sprcs.cpp.txt (*) 本ドキュメント ソースファイル: bin/src/swig/Source/Modules/sprcs.cpp (1) build について (a) VS2013, VS2010 いずれのバージョンでもビルドできる。 (b) Debug 構成でビルドすると SNAP, DUMP などが有効となり、出力されるソース中に 各種情報がコメントとして埋め込まれる。 ・多くの場合にソース行番号が含まれている。 ・"//+" で始まる番号はノード番号であるが、get_node_info() をする度に割り当て られるのでノードの識別には役に立たない。 (c) C++ 側で ::SysAllocStringLen() により割り当てたメモリを解放するコードは #ifdef FREE_UNMANAGED_MEMORY 〜 #endif で囲まれている。現在のままで特にメモリ関連の不都合が起きないのであれば、 適当なタイミングでこれを外した方がよいと思われる。 (2) .exe ファイルについて (a) 現状ではビルドをするとビルド構成に応じて、 $(Solutiondir)/{Win32|x64}/{Debug|Release}{10|12.0}/swig{10|12.0}.exe が生成される。 (b) cp.bat を実行すると、これを Springhead2/bin/swig/ にコピーする。 このとき、ファイル名を swig_sprcs.exe とリネームする。 ・cp.bat の引数については "cp.bat -h" を実行のこと。 ・リネームする名前 (swig_sprcs.exe) は cp.bat にハーコードされている。 (c) sprcs.cpp は、swig の引数に -sprcs を付けて実行したときにのみ有効となる もの(?)なので、上記のようなリネームは必要ないかも知れない(??)。 (3) 特別扱いについて (a) トークンの置き換え "UTString" → "std::string" "GLuint" → "unsigned int" "FWApp::Timers" → "std::vector<(UTRef<(UTTimerIf)>)>" "PHEngines::base::iterator" → "std::vector<(UTRef<(PHEngine)>)>::iterator" "PHEngines::base::const_iterator"  → "std::vector<(UTRef<(PHEngine)>)>::const_iterator" (b) 形名が "TAffine" で始まるメンバをもつクラスは出力しない(template) (c) 識別子名の置き換え "checked" → "checked_" C# のリザーブドワード (d) スコープの置き換え "SprCOLLADA::physics_material" → "physics_material", "SprCOLLADA::physics_materialCommon" → "physics_materialCommon", "gimite::ip_address" → "ip_address", "gimite::socket_address" → "socket_address", "gimite::socket_streambuf" → "socket_streambuf", "gimite::socket_stream" → "socket_stream", "gimite::bound_socket" → "bound_socket", "gimite::server_stream_socket" → "server_stream_socket", "gimite::diagram_socket" → "diagram_socket", (e) 全メンバを引数にもつコンストラクタの自動生成 次のクラスについては、全メンバを引数にもつコンストラクタを自動的に生成する。 "Vec2f", "Vec2d", "Vec3f", "Vec3d", "Vec4f", "Vec4d" "Quaternionf", "Quaterniond" "Posef", "Posed" "Matrix3f", "Matrix3d" "Vec2i", "Vec3i", "Vec6d" "Curve3f" (f) ToString() の自動生成 クラス名が次の名前で始まるクラスについては ToString() を自動的に生成する。 "Vec", "Quaternion", "Pose", "Matrix", "Affine" ただし MatrixExtension は例外。 出力ファイル: (1) cs_object.cs, wrappers.cs wrapper クラス (wrappers.cs) は CsObject クラス (cs_object.cs) を継承する。 (2) CSxxxx.wrapper.cs xxxx (Collision, Graphics, HumanInterface, Physics) の各々について、構造体を メンバとする vector の wrapper クラスを格納。 wrapper クラスの命名規則は、 vectorwrapper_CLASS_MEMBER arraywrapper_CLASS_MEMBER ここで CLASS はこのメンバが属するクラス名、MEMEBER はメンバ名である。 クラス名を含めているのは、異なるクラスで同一のメンバ名があり得るから。 これらの wrapper クラスを一つのソースファイルに纏められないのは、 (a) swig 処理が xxxx (Collision, ..) 毎に別々に実行されるために、 異なる xxxx で同一の .i ファイルを読み込むことがある (b) よって単純に同じファイルに出力すると重複定義となってしまう ためである。 解決策としては、 (a) 重複定義を避けるための情報を異なる swig ジョブ間で渡すために外部ファイル などを用いる。 (b) 各 wrapper 毎にソースを別ファイルに出力する。 などが考えられるが、未着手のままである。 積み残し事項 (1) クラスメンバが配列のときの setter 配列要素数の確認をとるコードが未実装(今は無条件にコピーしている) 以上