在HL引擎中製作自定義高畫質貼花

2022-08-11 15:15:16 字數 2878 閱讀 6987

你是不是想過要做自定義的子彈孔、噴漆或者一些自定義的痕跡呢?

如果按照hl引擎的基本fa,首先要在decals.wad裡加入我們自定義的紋理,然後利用gengfuncs.pefxapi->r_decalshoot或者服務端傳送te_decal訊息來使用。

這種方法有許多限制,首先你不能往乙個wad檔案加太多紋理,其次,wad只能儲存索引色的紋理(影象質量非常low)。如果我們要更進一步定製,比方說做個會動的噴漆,那麼wad就不行了。

首先我要宣告一下名詞:

decal 即 貼花,指貼在地圖表面的影象。

這篇文章給出一種方法讓你能夠使用自己載入的紋理進行貼花,還可以做到實時更新貼花,做出動態效果。

首先我們認識一下引擎提供的乙個貼花函式 r_decalshoot ,它的原型如下:

void r_decalshoot( int textureindex, int entity, int modelindex, vec3_t position, int flags )
第1個引數 textureindex 通常你必須這樣來獲得: pefxapi->draw_decalindex( pefxapi->draw_decalindexfromname("

texture_t;

看似很複雜,其實只需要指定其中的 width、height、gl_texturenum 這3個即可,其它的全部設為0。

既然我們要呼叫 r_decalshoot_ ,那麼就得知道它的原型:

void r_decalshoot_( texture_t *ptexture, int textureindex, int entity, int modelindex, float *position, int flags, float scale )
可以看出這個函式和 r_decalshoot 非常像,但聰明的你可能已經發現了問題,既然都有乙個 ptexture 來指定紋理了,幹嘛還需要乙個 textureindex 呢,不是多此一舉嗎?

解釋如下:引擎為了節省記憶體占用,時不時會將一些不經常訪問的資源丟棄掉,這時 ptexture 就可能會被丟掉(釋放掉),所以引擎只為貼花儲存乙個 textureindex 當引擎繪製貼花時,

會使用 textureindex 來查詢乙個 texture_t ,如果這個 texture_t 已經被丟棄了,那麼引擎會重新載入它。

可能你還有疑問,既然傳 textureindex 一本萬利,幹嘛要傳 ptexture 呢。那是因為 r_decalshoot_ 需要 texture_t 裡的 width 和 height 。

但是,根據上面的解釋,引擎在繪製貼花時才通過 textureindex 來查詢 texture_t ,所以我們需要hook那個查詢函式,返回我們自己的 texture_t 才行。

那個函式上面已經出現過了,它就是 draw_decaltexture ,它的原型如下:

texture_t * draw_decaltexture( int textureindex )
你可以看到它只有乙個 int

引數,當引擎需要繪製乙個貼花時,會呼叫這個函式來獲取乙個 texture_t ,而引數的 textureindex 正是我們傳入 r_decalshoot 的那個。

現在嘗試一下,首先我們要自己造乙個 r_decalshoot ,例如:

void r_my_decalshoot( texture_t *ptexture, int textureindex, int entity, int modelindex, float *position, int

flags )

然後還要hook draw_decaltexture 函式,例如:

texture_t * draw_decaltexture( int

textureindex )

return

g_callback_draw_decaltexture( textureindex );

}

我這裡判斷 textureindex 如果是999那麼返回我們自己建立的乙個 texture_t

然後呼叫 r_my_decalshoot ,例如:

void decal_test( void

)

這裡我給 textureindex 傳了 999 這個數值,如果貼花建立成功,引擎會把這個值儲存到引擎內部的神秘陣列裡。

等到引擎需要繪製這個貼花時,便會呼叫 draw_decaltexture 來獲取 texture_t 用於繪製。這時我們檢查 textureindex 是不是我們定義的,

如果是我們定義的,那就返回我們自己建立的 texture_t 給引擎繪製。

大功告成!

附加:你可能想立刻刪掉乙個貼花,那麼你可以使用如下方法:

gengfuncs.pefxapi->r_decalremoveall( textureindex )
注意:該方法會刪除所有 textureindex 為指定的值的貼花,所以建議給 textureindex 再包裝一層,使得每個貼花擁有獨立的索引,而不是靠紋理索引來區分。

核能注意: textureindex 是short型的,能儲存的數值範圍有限!

0x01d4b530

//3266

0x01d49750

//7561

0x01d321f0

//3266

0x01d2eb30

//7561

ERP中自定義報表製作流程

新增單錶查詢 查詢語句設定 設定 列資訊 引數設定 關聯設定 著色設定 1 製作按部門統計每個月的 報銷金額並且可以關聯到明細進行比對 2 當部門每月累計報銷金額大於50000元的時候進行紅色標識 3 餅圖 部門對比金額 4 未清查找 財務未報銷 差旅報銷單主表 zzclbxd 憑證電鍵 docen...

在angularJS中自定義指令

mymodule.directive namespacedirectivename function factory injectables 定義與其他指令進行互動的介面函式 require string,指定需要依賴的其他指令 link function postlink scope,ieleme...

在Gradle中自定義BuildConfig

android開發過程,為了除錯我們一般使用log來列印日誌,在發布版本的時候為了不讓除錯的資訊讓其他人可以看到。通常會定義乙個變數作為開關來關閉日誌資訊的列印。像下面這樣的工具類 public class logutil 還有像開發環境和發布環境的伺服器切換等需要區分環境的,但是每次在發布之前都要...