3.2. Algoritma Manajemen Scene
3.5.19. Flowchart Operasi Render()
Operasi ini merupakan operasi yang panjang dan rumit yang bertugas untuk merender buffer statis (verteks dan indeks) yang telah dibuat sebelumnya berserta skin yang berhubungan dengan buffer tersebut. Operasi Render() adalah operasi dari kelas TumozD3DVCManager yang juga merupakan operasi turunan dari interface TumozVertexCacheManager.
Pertama-tama operasi ini dimulai dengan memanggil fungsi
GetShadeMode() dari obyek TumozD3D untuk memeriksa jenis render state yang akan digunakan dalam merender buffer statis apakah dalam bentuk solid, berjaring (wired), garis, titik, dan sebagainya. Setelah itu mengaktifkan buffer indeks dengan menggunakan fungsi SetIndices() dari obyek device.
Proses selanjutnya dari operasi ini adalah pengaturan skin yang akan digunakan baik dengan atau tanpa shader. Proses tersebut terdiri dari proses mengatur material dengan memanggil fungsi SetMaterial(), mengatur tekstur
menggunakan fungsi SetTexture(), dan mengatur kondisi alpha untuk efek
transparansi menggunakan fungsi SetRenderState()dari obyek device.
Tahapan berikutnya dilanjutkan dengan mengatur FVF menggunakan fungsi SetFVF() dari obyek device apabila shader tidak digunakan. Setelah itu melakukan pengaturan additive blending dan buffer warna (color buffer) untuk rendering dengan memanggil fungsi SetRenderState() dari obyek device.
Dan terakhir adalah menggambar (render) buffer statis baik yang menggunakan buffer indeks maupun tidak dengan menggunakan fungsi
DrawIndexedPrimitive() dan DrawPrimitive() dari obyek device berdasarkan jenis
STIKOM
99
masing-masing render statenya. Detil dari proses flowchart operasi ini digambarkan pada gambar 3.48., 3.49. dan 3.50.
Mulai
Buat variabel sementara seperti Hresult hr & int iT
Panggil GetShadeMode() dari pointer global TumozD3D dan simpan
dalam TUMOZRENDERSTATE sm Cek ID dari param >= jumlah Static buffer yang ada? error: ID Buffer Statis Tidak Valid Ya Return TUMOZ_INVALID PARAM Set variabel ActiveCache global ke MAX_ID Cek variabel global ActiveSB != ID dari param? Tidak Cek pointer Static Buffer pada indeks
ID dari param menggunakan Index
buffer? Ya
Panggil SetIndices() dari pointer D3D Device dengan
data IB sbg parameter dari pointer Static Buffer global berdasarkan ID param
Ya
Panggil SetStreamSource() dari pointer D3D Device dengan data Vertex Buffer sbg parameter dari pointer Static Buffer berdasarkan
ID param
Set variabel ActiveSB global mengarah pada
ID dari parameter Tidak Cek variabel global ActiveIB != MAX_ID? Tidak Cek pointer Static Buffer pada indeks
ID dari param menggunakan Index buffer?
Panggil SetIndices() dari pointer D3D Device dengan data IB
sbg parameter dari pointer Static Buffer global berdasarkan ID param Ya Ya Set variabel global ActiveIB = MAX_ID Tidak Cek pemanggilan GetActiveSkinID() dari pointer TumozD3D != atribut SkinID dari
pointer Static Buffer bdsrkan
ID param? Tidak
Buat pointer lokal TUMOZSKIN pSkin berisi data Skin dari Skin Manager dengan
indeks dari ID Skin Static Buffer
Ya
sm == RS_SHADE_
SOLID
Buat pointer lokal TUMOZMATERIAL pMat berisi data Material dari Skin Manager dengan indeks dari
pSkin->nMaterial Ya Cek TumozD3D tidak menggunakan Shader?
Buat D3DMATERIAL9 mat yang berisi warna RGBA masing-masing
material Diffuse, Ambient, Specular, Emissive dan Specular
Power dari pMat Ya
Panggil SetMaterial() dari pointer D3D Device
dengan mat sbg parameter
Panggil SetShaderConstant() dari TumozD3D untuk warna material Ambient,
Diffuse, Specular dan Emissive berasal dari pMat Tidak Cek TumozD3D menggunakan Texture? Panggil SetTexture() dari D3D Device dengan indeks 0 dan NULL sbg parameter Tidak
Panggil GetWireColor() dari pointer TumozD3D dan simpan
hasillnya ke TUMOZCOLOR clrWire sbg warna Wireframe Tidak
Buat D3DMATERIAL9 matW yang berisi warna RGBA masing-masing material Diffuse, dan Ambient
dari clrWire
Panggil SetMaterial() dari pointer D3D Device
dengan matW sbg parameter A Tidak B Ya C Selesai
Gambar 3.48. Flowchart Operasi Render()
STIKOM
iT = 0 Ya iT < 8 pSkin-> nTexture[iT] != MAX_ID Ya
Panggil SetTexture() dari D3D Device dgn indeks iT dan data texture dari Skin Manager sbg
parameter Ya
Panggil SetTextureStageState() dari D3D Device dgn indeks iT dan Beberapa Perintah Operasi
Texture sbg parameter break Tidak iT++ Panggil SetTextureStageState() dari D3D Device dgn indeks iT dan
Perintah Disable Operasi Texture sbg parameter Tidak
Panggil SetTextureStageState() dari D3D Device dgn indeks 1 dan Perintah Disable Operasi
Texture sbg parameter
pSkin- >bAlpha
Panggil SetRenderState() dari D3D Device dan beberapa perintah untuk mengaktifkan
Alpha Blending Ya
Panggil SetRenderState() dari D3D Device dan beberapa perintah untuk
menonaktifkan Alpha Blending Tidak
Panggil SetActiveSkinID() dari TumozD3D dengan attribut SkinID dari pointer Static Buffer
indeks ID dari parameter
Cek pemanggilan UsesShaders() dari pointer TumozD3D apakah tidak menggunakan Shader?
Panggil SetFVF() dari D3D Device dengan data FVF dari
Static Buffer indeks ID sbg parameter Ya Tidak Cek attribut bIndis dari pointer Static Buffer true? Tidak sm == RS_SHADE_ POINTS Ya Panggil DrawPrimitive() dari D3D Device dgn D3DPT_POINTLIST dan
Jumlah Verts dari pointer Static buffer sbg
param dan simpan hasilnya ke hr Ya sm == RS_SHADE_ LINES Tidak Panggil DrawIndexedPrimitive() dari D3D Device dgn D3DPT_LINELIST, Jml Verts dan Jml Indis/2 dari pointer Static buffer sbg param dan
simpan hasilnya ke hr Ya sm == RS_SHADE_ HULLWIRE Tidak Panggil DrawIndexedPrimitive() dari D3D Device dgn D3DPT_LINESTRIP dan Jml
Verts dari pointer Static buffer sbg param dan simpan hasilnya ke hr Ya Panggil DrawIndexedPrimitive() dari D3D Device dgn D3DPT_TRIANGLELIST, Jml Verts dan Jml Tris dari
pointer Static buffer sbg param dan simpan
hasilnya ke hr Tidak Tidak A B C Return hr Selesai D
Gambar 3.49. Lanjutan Flowchart Operasi Render()
STIKOM
101 Return hr Selesai sm == RS_SHADE_ POINTS Panggil DrawPrimitive() dari D3D Device dgn D3DPT_POINTLIST dan
Jumlah Verts dari pointer Static buffer sbg
param dan simpan hasilnya ke hr Ya sm == RS_SHADE_ LINES sm == RS_SHADE_ HULLWIRE Tidak Tidak Panggil DrawPrimitive() dari D3D Device dgn D3DPT_LINELIST dan Jumlah Verts/2 dari pointer Static buffer sbg
param dan simpan hasilnya ke hr
Ya
Panggil DrawPrimitive() dari D3D Device dgn D3DPT_LINESTRIP dan
Jumlah Verts dari pointer Static buffer sbg
param dan simpan hasilnya ke hr
Ya
Panggil DrawPrimitive() dari D3D Device dgn D3DPT_TRIANGLELIST dan
Jumlah Tris dari pointer Static buffer sbg param dan
simpan hasilnya ke hr Tidak
Tidak D
Gambar 3.50. Lanjutan Flowchart Operasi Render()