Home > 圖像編程 | 腳本編程 > Lua 的渲染測試

Lua 的渲染測試

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

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

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

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

Lua 部份

-- test1.lua
Test1 = {}

function Test1:New(o)
    o = o or {}   -- create object if user does not provide one
    setmetatable(o, self)
    self.__index = self
    return o
end

function Test1:OnInit()
    self.geometry = Graphics.Geometry()
    Graphics.ChamferBox_Create(self.geometry, Math.Vector3(2, 2, 2), 0.99, 5)

    self.material = Graphics.Material("Effect/blinn_bump_reflect.fx")
    self.material:SetTexture(self.material:GetParameterBySemantic("DIFFUSE"), Graphics.Texture("Texture/rockwall.jpg"))
    self.material:SetTexture(self.material:GetParameterBySemantic("ENVIRONMENT"), Graphics.CubeTexture("Texture/Default_reflection.dds"))
    self.material:SetTexture(self.material:GetParameterByName("NormalTexture"), Graphics.Texture("Texture/rockwall.tga"))

    self.start = os.clock()
end

function Test1:OnTick()
    local device = Graphics.Device_Instance()
    
    device:Clear(Math.Color(0, 0, 0, 0))
    device:BeginScene()
    
    device:SetProjection(Math.Matrix44_Perspective(-0.05, 0.05, -0.05, 0.05, 0.1, 1000))
    device:SetView(Math.Matrix44_LookAt(Math.Vector3(0.0, 2.0, 2.0), Math.Vector3(0, 0, 0), Math.Vector3(0, 1, 0)))
    device:SetWorld(Math.Matrix44_Rotate(Math.Vector3(0, -0.1 * (os.clock() - self.start) * 2 * 3.141516, 0)))
    device:SetMaterial(self.material)
    device:DrawGeometry(self.geometry)

    device:EndScene()
    device:Present()
end

C++ 部份

Runtime runtime;
runtime.ExecuteFile("test1.lua");
runtime.Execute("test1 = Test1:New() test1:OnInit()");

// Main message loop:
for (;;) {
    while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0) {
        // ...
    }

    if (msg.message == WM_QUIT)
        break;

    runtime.Execute("test1:OnTick()");
}

Comments:6

Edwin 08-03-18 (二) 3:21

Milo兄,我想知道你的Swig 是如何設定的??
我想你是用Visual Studio,那你是用Custom Build Step 還是什麼呢??

我剛剛也做了少量相關的測試,是用Custom Build Rules ,來把.i 檔案自動生成xxx_wrap.cpp,但…想不到怎能把這個生成了的cpp 自動加入到project 檔中。
(現在我的方法是,先Build 一次,把那個xxx_wrap.cpp 手動加入)

有沒有更好的方法呢???

Edwin 08-03-18 (二) 3:29

另,還是加入class 在 Lua 中比較好… 可參考這個:

http://luaforge.net/projects/class/

Milo 08-03-18 (二) 10:09

我也是手動設置。現時有兩個 modules,每個 module 有兩個語言版本。要SWIG編譯的檔案句括MathCs.i, MathLua.i, GraphicsCs.i, GraphicsLua.i。它們各自再 include每個類別的 interface 檔案。

因為每個檔案的 command-line options 都不一樣,我只是個別為每個檔案設定 custom build step。並和你一樣在編譯後加入 4 個 cpp(我用cxx,不加入SVN)。

這對我來說不是大問題,因為只有4個檔案,但現麻煩的地方是:

1. 沒有 inlcude depdenency checking,修改一個類別的 .i 要人手執行編譯 include 了它的 .i。如修改 Vector2Cs.i 後,要人手執行編譯 MathCs.i。

2. Debug 和 Release 版本都生成同一個 .cxx,可能會有差異。

3. 最大的麻煩: C# 版本中,swig 會按每個類別生成 .cs 檔,全部要人手加入到 Project。(如果也只生成一個檔案不就可以麼? 我可以試試用 copy/a swig\*.cs swig_all.cs,不過好能沒有這麼簡單)

希望可以找到好的方法。

Edwin 08-03-18 (二) 12:17

我建議用Custom Build Rules (這個好像是新功能, 在舊的VS中沒有…我用的是VS20005),
可以對不同的extension設定不同的Custom Build Step. 你的情況是,
對不同Script 的 Swig interface 檔,用不同的extension就行了. (如 MathCs.i 改為 MatchCs.ics, MathLua,i 改為 MathLua.ilu 等)

1. 雖然沒有include dependency checking, 不可以用Custom Build Step 中的 “Additional Dependency” 來完成這個。

2. 這個… 想不到好方法…

3. 其實和 xxx_wrap.cxx 的問題一樣,就是有沒有方法可以自動把某檔案加入在project 中,不過我找了半天,還是沒有簡單方法…

Edwin 08-03-18 (二) 12:18

1. 雖然沒有include dependency checking, 可以用Custom Build Step 中的 “Additional Dependency” 來完成這個。

Milo 08-03-18 (二) 13:06

但是 4 個檔案的 command line options 都不同 (因為 module 不同, 在 C# 要加入 -namespace 的 option), 所以用 extension 分 build rule 好似不行。

1. 我現在用 VS2008,之前嘗試過 “Additional Dependency”,但不成功。可以再試一下。不知道是否和 path 有關。

2. 暫時想到的是, 建一個 _IncludeAll.cxx,入面再 conditional #include 生成的 .cxx。嗯… 這樣的話可以在 build step 用 batch file 把所有用 swig 生成的.cxx 檔案加入到一個檔案裡(copy/a *.cxx IncludeAll.cxx)。這可以解決你一開始提出的問題,但不知道可否解決 C# 的問題。

在Project 加入這個檔

#ifdef NDEBUG
#   include "Debug/IncludeAll.cxx"
#else
#   include "Release/IncludeAll.cxx"
#endif

P.S. 不過這樣做不是等價,把 compilation unit 組合為一個可能會有問題,例如 identifier redefinition。要測試過 SWIG 生成的檔案才能知道行不行。

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://miloyip.seezone.net/wp-trackback.php?p=39
Listed below are links to weblogs that reference
Lua 的渲染測試 from Milo的遊戲開發

Home > 圖像編程 | 腳本編程 > Lua 的渲染測試

Search
Feeds
Meta

Return to page top