|
____________________________________________________________________________________________________________
:: Fungsi "ProcessNextChunk(
)" :
- i. fungsi membaca setiap
seksyen dalam fail .3ds dan dives kedalam menggunakan rekursif. Mulakan
dengan menaip:-
void CLoad3DS::ProcessNextChunk(t3DModel
*pModel, tChunk *pPreviousChunk)
{
ii. kemudian taip aturcara
dibawah :-
- t3DObject newObject
= {0}; // ia diletakkan pada
setiap list objek
tMaterialInfo newTexture = {0}; //
ia diletakkan pada setiap list metarial
tChunk currentChunk = {0};
// memuatturun chunk
tChunk tempChunk = {0}; //
mengingatkan chunks untuk memegang metarial
"Di bawah
ini anda menyemak chunk ID setiap kali anda membaca chunk ID yang
baru. Kemudian, sekiranya
anda inign mengambil maklumat daripada chunk, anda boleh berbuat demikian.
Sekiranya anda tidak memerlukan chunk, anda boleh membaca seleps ini."
- "Terus membaca
sub chunks sehingga kita sampai panjang yang dikehendaki. Selepas anda
membaca SEMUANYA anda tambahkan bytes yang dibaca dari chunk dam kemudian
semak kembali panjangnya"
- iii.untuk menyemak mrnggunakan
Case sila taip aturcara dibawah :-
- while
- (pPreviousChunk->bytesRead
< pPreviousChunk->length)
{
ReadChunk(¤tChunk); //
membaca chunk yang seterusnya
case VERSION:
{ // memegang versi bagi
fail
- "
jika fail ini dibuat didalam 3D Studio Max, maka chunk bernilai
integer dimana ia memegang versi file itu
jika fail itu tidak dibuat dalam 3D Studio Max, anda tidak akan
memiliki 100% versinya "
// membaca
versi fail dan meletakkan bcaan bytes untuk setipa "bytesRead"
yang varibles
-
currentChunk.bytesRead
+= fread(gBuffer, 1, currentChunk.length - currentChunk.bytesRead,
m_FilePointer);
- // jika
versi fail melebihi daripada 3, berikan warning kerana mungkin
terdapat permasalahan yang berlaku
- //menggunakan
Message box seperti dibawah.
- if ((currentChunk.length
- currentChunk.bytesRead == 4) && (gBuffer[0] > 0x03))
{
MessageBox(NULL, "This 3DS file is over version 3 so it
may load incorrectly", "Warning", MB_OK);
}
break;}
- case OBJECTINFO:{
// ia digunakan untuk memegang
versi mesh
- //ia
selalunya menjadi kepala kepada MATERIAL dan OBJECT chunks.
- //Daripadanya
kiata mula membaca didalam material dan objek
ReadChunk(&tempChunk);//
Baca chunk yang seterusnya
- //Dapatkan
versi mesh
tempChunk.bytesRead
+= fread(gBuffer, 1, tempChunk.length - tempChunk.bytesRead,
m_FilePointer);
// Tingkatkan bytesRead dengan bytes yang dibaca dari chunk
sebelumnya
currentChunk.bytesRead
+= tempChunk.bytesRead;
// Pergi ke chunk yang seterusnya, yang mana objek mempunyai
tekstur, ia perlulah MATERIAL, kemudian OBJECT.
ProcessNextChunk(pModel,
¤tChunk);
break;}
}
case
MATERIAL:
// Ini menyimpan maklumat material
// Chunk
berikut adalah header bagi chunk info material
// Tingkatkan bilangan material
pModel->numOfMaterials++;
//
letakkan struktur texture kosong untuk setiap texture list.
pModel->pMaterials.push_back(newTexture);
//
Teruskan ke fungsi muatturun material
ProcessNextMaterialChunk(pModel, ¤tChunk);
break;
case OBJECT:
// ia memegang nama objeck yang
hendak dibaca
- // Chunk
berikut adalah header bagi objek info chunks. Ianya juga menyimpan
nama bagi objek.
- // Tingkatkan
bilangan objek
pModel->numOfObjects++;
// Masukkan nod baru tObject
ke dalam senarai objek (seperti link list)
pModel->pObject.push_back(newObject);
// Beri nilai awalan pada objek
dan semua kumpulan-kumpulan datanya
memset(&(pModel->pObject[pModel->numOfObjects -
1]), 0, sizeof(t3DObject));
//
Dapatkan nama objek dan simpan, kemudian tambahkan byte
yang telah dibaca ke dalam byte counter
currentChunk.bytesRead += GetString(pModel->pObject[pModel->numOfObjects
- 1].strName);
// Sekarang teruskan membaca
maklumat lain pada objek
ProcessNextObjectChunk(pModel, &(pModel->pObject[pModel->numOfObjects
- 1]), ¤tChunk);
-
break;
- case EDITKEYFRAME:
- //Membaca
chunks dan meletakkan bacaan bytes kepada kiraan bytes
currentChunk.bytesRead += fread(gBuffer, 1, currentChunk.length
- currentChunk.bytesRead, m_FilePointer);
break;
default:
//
jika anda tidak kisah mengenai chunks dan anda akan berada di
default. anda masih perlu membaca chunks yang perlu untuk Membaca
chunks dan meletakkan bacaan bytes kepada kiraan bytes
currentChunk.bytesRead += fread(gBuffer, 1, currentChunk.length
- currentChunk.bytesRead, m_FilePointer);
break;
}
//
letakkan bacaan bytes daripada chunks yang terakhir kepada chunks
yang sebelumnya
pPreviousChunk->bytesRead += currentChunk.bytesRead;
}
}
____________________________________________________________________________________________________________ |
|