Home > Tags > SWIG

SWIG

開始實作引擎的基本類別

話說之前想做 Collada 滙入,便最基本要有一個內部存放 Collada 滙入後的資料。這個「雙休日」(內地常用語) 就留在家中乖乖寫程式……寫不出的時候也看了十幾集動畫。

架構上參考了之前看過的 Unity,採用 Component 型式。目前實現的幾個類別的關係如下圖:

採用 Component 架構的一個好處是,減少了傳統 Scene Graph 的類別繼承和節點 (node) 數目。一個實體 (entity, 有些引擎稱為 Game Object) 可以有 Mesh 元件,也可以同時加入腳本、碰撞物件等元件。

實作過程中出現許多問題,和大家 (及將來的自己) 分享一下。

Continue reading

新面貌

終於更換了之前的預設 wordpress template。新的 template 維持簡潔風格,字體應該比之前的較容易閱讀。希望大家喜歡。

另外,從上星期日開始做 Linux porting。在 Vmware 上安裝 Ubuntu 來測試。發覺自己完全忘記了 makefile,中途還想放棄去改用 scons。最後還是繼續 GNU make,終於今晚搞定用 makefile 執行 SWIG,不過有點兒 hard code 成份。明天開始做 OpenGL + Cg。

PS. 荷蘭來的舊朋友在我家住了兩天,因他的來到,我們才找附近的好餐廳,吃了兩晚豐富的晚餐。昨晚玩 Wii Sports 和 Wii Fit 玩到一點鐘。
PPS. 問同事借了 PSP 玩 《無限回廊》。這是創意之作,而且我本身又喜愛 M.C. Escher (荷蘭畫家!)。

使用 Custom Build Tool 執行 SWIG

今晚完成了近期的第三個目標,加入 Script Module 的 Binding (其實只是一個叫 Runtime 的類別),利用 C# 去執行之前的 Lua 的程序 (test1.lua)。

今早 Edwin 的回應啟發了一些想法,所以著手更改 SWIG 在 Visual Studio 的編譯方法。

現在採用了Visual Studio 的 Custom Build Rule。由於 Lua 和 C# 需要不同的規則,所以要兩個 file extensions,我設定 Lua 的 Swig Interface 檔案為 .li,C# 則是 .ci。

Lua

swig
 -c++
 -lua
 -o $(OutDir)/$(InputName)Lua.cxx
 "$(InputPath)"

C#

swig
 -c++
 -csharp
 -o $(OutDir)/$(InputName)Cs.cxx
 -outdir $(OutDir)
 -namespace Mil.$(InputName)
 -dllimport $(TargetName)
 "$(InputPath)"

生成的檔案會放置於 Debug 或 Release 的輸出目錄,解決之前兩個 configuration 會互相影響的問題。

兩個規則分別生成 $(OutDir)/$(InputName)Lua.cxx 和 $(OutDir)/$(InputName)Cs.cxx,這些檔案需要加入 Project 裡。但因為一個項目不應該同時加入 Debug 和 Release 版的這些檔案,我想到的方法是寫一個 .cpp 去 #include 這些檔案,例如:

// MathCs.cpp
#include "stdafx.h"
#include "MathCs.cxx"

之後再把 Project 的 Include path 加入 “$(OutDir)”,那麼,就可以正確地編譯現時 Configuration 的 Swig 生成檔案。

後來再試驗檔案的 Additional Dependencies 屬性,設定單一檔案仍然不成功。之後我把 .li 和 .ci 裡 include 的檔案改名為 .lii 和 .cii,希望只要可設置 dependencies 為 *.lii 和 *.cii 就可以了,但都不成功。或許可以用 Pre-Build Event 去檢查這些檔案,如比輸出檔案新就 touch 那個 .li 或 .ci。不過未嘗試。

最後,還有一個問題是 C# 的 Proxy 需要編譯多個由 SWIG 生成 .cs 檔案。我找了一回才發現 C# 沒有 #include、也似乎沒有機制可以編譯 *.cs 等多個檔案。最後暫時用 C++ Project 的 Post-Build Event 把適當 Configuration 的檔案拷貝到 C# 的項目裡,再人手加入這些檔案。

copy $(OutDir)\*.cs ..\MilCs

Lua 的渲染測試

今日順利完成3月6日訂下的第二個目標,把昨天的 C# 測試程式用 C++ 及 Lua 實現。圖像輸出和昨天的測試程式一模一樣,就不上傳了。

C++ 負責創建視窗和呼叫 Device::Open(Hwnd),Lua 做渲染的部份。(其實在遊戲中是不會用 Lua 做這麼低階的工作,這裡只是當作測試 Lua Binding。)

除了編寫 Lua 的 SWIG interface 檔案外,今天主要的工作是考慮如何從 C++ 呼叫 Lua 的類別。發覺對 Lua 的語法還是很不熟識。

有興趣的話可以比較以下的C++/Lua代碼和昨天的C#代碼

Continue reading

混合語言的遊戲開發系統架構

用甚麼程式語言來做軟件是一個大問題,思考了一個周末,現時想做一個混合語言的遊戲開發系統架構。暫時只考慮三種程式語言: C++、C# 及 Lua。以下首先分析這三種語言的特性,之後再提出一個系統架構科案。

Continue reading

試驗SWIG (一) C++ 連接C#和Lua

今晚初次嘗試使用 SWIG (Simple Wrapper Interface Generator)。SWIG 是一個能為 C/C++ 程式生成各種 Script 語言 Wrapper 的工具。簡單地說,就是有了一個 C++ 程式,用 SWIG 來連結這個程式和 Script,使腳本語言可以呼叫 C++ 的函數及類別等等。

SWIG 支持大部份 C++ 的功能,甚至 template 也能支持。同時可以生成十數種腳本語言的 wrapper,包括我正在考慮使用的 Lua、Python 和 C# 等。

跟據我的目標,先做一個 3D Vector 的測試。以下是一部份C++代碼 (Vector3.h):

Continue reading

Home > Tags > SWIG

Search
Feeds
Meta

Return to page top