📄 mdx.cpp
字号:
toregistre("");
toregistre("NumGeoChunks : %i",mNumChunks);
for(int i=0;i<mNumChunks;++i)
{
toregistre("GeoChunk %i",i);
mChunks[i].Print();
}
}
void mdxGeoChunk::Render(void)
{
mdxMaterial& mat = singleton->mMaterials.mMaterials[mMaterial];
/* Vec3 mins = *mMins;
Vec3 maxs = *mMaxs;
glColor3f(0.3,0.9,0.3);
glBegin(GL_LINE_LOOP);
glVertex3fv(mins);
glVertex3f(mins[0],maxs[1],mins[2]);
glVertex3f(maxs[0],maxs[1],mins[2]);
glVertex3f(maxs[0],mins[1],mins[2]);
glVertex3f(maxs[0],mins[1],maxs[2]);
glVertex3fv(maxs);
glVertex3f(mins[0],maxs[1],maxs[2]);
glVertex3f(mins[0],mins[1],maxs[2]);
glVertex3fv(mins);
glEnd();
glBegin(GL_LINES);
glVertex3fv(mins);
glVertex3f(maxs[0],mins[1],mins[2]);
glVertex3f(mins[0],mins[1],maxs[2]);
glVertex3f(maxs[0],mins[1],maxs[2]);
glVertex3fv(maxs);
glVertex3f(maxs[0],maxs[1],mins[2]);
glVertex3f(mins[0],maxs[1],maxs[2]);
glVertex3f(mins[0],maxs[1],mins[2]);
glEnd();
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);*/
for(int l=0;l<(mat.mNumLayers>128 ? 128 : mat.mNumLayers);++l)
{
if(gTextured==TRUE)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,singleton->mTextures.mGLBind[(mat.mLayers[l].mTexture > 127 ? 0 : mat.mLayers[l].mTexture)]);
}
else
{
//glBindTexture(GL_TEXTURE_2D,0);
glDisable(GL_TEXTURE_2D);
}
if(l<mat.mNumLayers-1)
glDisable(GL_LIGHTING);
else
glEnable(GL_LIGHTING);
if(mat.mLayers[l].mBlendMode ==1 )
// seems like alpha blending
{
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.75f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
//glDepthMask(false);
}else
if(mat.mLayers[l].mBlendMode ==2 )
// this should be alpha blending
{
glDisable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(false);
}else
// this is additive blending
if(mat.mLayers[l].mBlendMode ==3 )
{
glEnable(GL_DEPTH_TEST);
glDepthMask(false);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE);
/*
if(gAllGeom==false)
glBlendFunc(GL_ZERO,GL_ONE);
else
{
glBlendFunc(GL_ONE,GL_ONE);
}
*/
}else
{
glDisable(GL_BLEND);
}
glBegin(GL_TRIANGLES);
for(int i=0;i<mPolyCount;++i)
{
//glColor3f(mUVs[mTriangles[i].ind[0]][0],mUVs[mTriangles[i].ind[0]][1],0);
glColor3fv(MColor);
glTexCoord2fv(mUVs[mTriangles[i].ind[0]]);
glNormal3fv(mNormals[mTriangles[i].ind[0]]);
glVertex3fv(mVertices[mTriangles[i].ind[0]]);
//glColor3f(mUVs[mTriangles[i].ind[1]][0],mUVs[mTriangles[i].ind[1]][1],0);
glColor3fv(MColor);
glTexCoord2fv(mUVs[mTriangles[i].ind[1]]);
glNormal3fv(mNormals[mTriangles[i].ind[1]]);
glVertex3fv(mVertices[mTriangles[i].ind[1]]);
//glColor3f(mUVs[mTriangles[i].ind[2]][0],mUVs[mTriangles[i].ind[2]][1],0);
glColor3fv(MColor);
glTexCoord2fv(mUVs[mTriangles[i].ind[2]]);
glNormal3fv(mNormals[mTriangles[i].ind[2]]);
glVertex3fv(mVertices[mTriangles[i].ind[2]]);
}
glEnd();
glDepthMask(true);
}
}
void mdxGeoChunk::Print(void)
{
toregistre(" mNumVertices : %i",mNumVertices);
toregistre(" mPolyCount : %i",mPolyCount);
toregistre(" mMaterial : %i",mMaterial);
toregistre(" mUnk2 : %i",mUnk2);
toregistre(" mUnk3 : %i",mUnk3);
toregistre(" mUnk4 : %f",mUnk4);
toregistre(" mMins : %f|%f|%f",(*mMins)[0],(*mMins)[1],(*mMins)[2]);
toregistre(" mMaxs : %f|%f|%f",(*mMaxs)[0],(*mMaxs)[1],(*mMaxs)[2]);
toregistre(" mSomeCount : %i",mSomeCount);
}
void mdxModel::Read(TypePointer1 inP,int inSize)
{
if(mName)
{
toregistre("Duplicate MODL tag... ignoring");
return;
}
if( inSize != 372)
return;
mName = inP.c;
inP.c += 80;
mName2 = inP.c;
inP.c += MAX_PATH;
mUnk1 = *inP.f;
inP.f += 1;
mMins = inP.v3;
inP.v3 += 1;
mMaxs = inP.v3;
inP.v3 += 1;
mUnk2 = *inP.dw;
}
void mdxModel::Print(void)
{
if(!mName)
{
toregistre("Error in MODL tag");
return;
}
toregistre("");
toregistre("Name : \'%s\'",mName);
toregistre("Name2 : \'%s\'",mName2);
toregistre("Unk1 : %f",mUnk1);
toregistre("Mins : %f|%f|%f",(*mMins)[0],(*mMins)[1],(*mMins)[2]);
toregistre("Maxs : %f|%f|%f",(*mMaxs)[0],(*mMaxs)[1],(*mMaxs)[2]);
toregistre("Unk2 : %i",mUnk2);
}
void mdxVersion::Read(TypePointer1 inP,int inSize)
{
if(mVersion)
{
toregistre("Duplicate VERS tag... ignoring");
return;
}
if(inSize != 4)
return;
mVersion = *inP.dw;
}
BOOL mdxVersion::IsValid(void)
{
if(mVersion == 800)
return true;
return false;
}
void mdxVersion::Print(void)
{
toregistre("");
toregistre("Version : %i",mVersion);
}
void mdxTextures::Read(TypePointer1 inP,int inSize)
{
if(mLoaded)
{
toregistre("Duplicate TEXS tag... ignoring");
return;
}
mLoaded = true;
TypePointer1 p(inP);
//
// read the chunks
//
mTextures = p.tex;
mNumTextures = inSize / sizeof(Texture);
for(int i=0; i<128 && i<mNumTextures ; ++i)
{
DWORD width,height,type,subtype;
mGLBind[i] = LoadBLP(mTextures[i].mName,width,height,type,subtype,mTextures[i].mUnk1);
}
}
void mdxTextures::Print(void)
{
toregistre("");
toregistre("NumTextures : %i",mNumTextures);
for(int i=0;i<mNumTextures;++i)
{
toregistre("Texture %i:",i);
toregistre(" Unk1 : %i",mTextures[i].mUnk1);
toregistre(" Name : \'%s\'",mTextures[i].mName);
toregistre(" Unk2 : %i",mTextures[i].mUnk2);
}
}
void mdxSequence::Read(TypePointer1 inP,int inSize)
{
if(mLoaded)
{
toregistre("Duplicate SEQS tag... ignoring");
return;
}
mLoaded = true;
TypePointer1 p(inP);
//
// read the chunks
//
mSequences = p.seq;
mNumSequences = inSize / sizeof(SequenceName);
}
void mdxSequence::Print(void)
{
toregistre("");
toregistre("NumSequences : %i",mNumSequences);
for(int i=0;i<mNumSequences;++i)
{
toregistre("Sequence %i:",i);
toregistre(" Name : \'%s\'",mSequences[i].mName);
toregistre(" Unk1 : %i",mSequences[i].mUnk1);
toregistre(" Unk2 : %i",mSequences[i].mUnk2);
toregistre(" Unk3 : %f",mSequences[i].mUnk3);
toregistre(" Unk4 : %i",mSequences[i].mUnk4);
toregistre(" Unk5 : %f",mSequences[i].mUnk5);
toregistre(" Unk6 : %i",mSequences[i].mUnk6);
toregistre(" Unk7 : %f",mSequences[i].mUnk7);
toregistre(" Mins : %f|%f|%f",mSequences->mMins[0],mSequences->mMins[1],mSequences->mMins[2]);
toregistre(" Maxs : %f|%f|%f",mSequences->mMaxs[0],mSequences->mMaxs[1],mSequences->mMaxs[2]);
}
}
void mdxMaterialMap::Read(TypePointer1 inP,int inSize)
{
if(mLoaded)
{
toregistre("Duplicate MATS tag... ignoring");
return;
}
mLoaded = true;
TypePointer1 p(inP);
mNumMaterials = NULL;
while(p.c < inP.c+inSize)
{
int size = (*p.dw++)-4;
mMaterials[mNumMaterials++].Read(p,size);
p.c+=size;
}
}
void mdxMaterialMap::Print(void)
{
toregistre("");
toregistre("NumMaterials : %i",mNumMaterials);
for(int i=0;i<mNumMaterials;++i)
{
toregistre(" Material %i",i);
mMaterials[i].Print();
}
}
void mdxCameras::Read(TypePointer1 inP, int inSize)
{
long csize = *inP.dw++;
mNumCameras = inSize/csize;
for(int k=0; k<mNumCameras; ++k)
{
mCameras[k] = *inP.cam;
inP.c += csize;
}
mLoaded = TRUE;
}
float Rad2Deg(float a)
{
return (a/PI)*180.0f;
}
void mdxCameras::Render()
{
glPushMatrix();
for(int k=0; k<mNumCameras; ++k)
{
/*
glEnable(GL_COLOR_MATERIAL);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(mCameras[k].posx, mCameras[k].posy, mCameras[k].posz);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(mCameras[k].posx-10.0f, mCameras[k].posy-10.0f, mCameras[k].posz-10.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(mCameras[k].posx+10.0f, mCameras[k].posy-10.0f, mCameras[k].posz+10.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(mCameras[k].targetx, mCameras[k].targety, mCameras[k].targetz);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(mCameras[k].targetx-10.0f, mCameras[k].targety-10.0f, mCameras[k].targetz-10.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(mCameras[k].targetx+10.0f, mCameras[k].targety-10.0f, mCameras[k].targetz+10.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0, 0.0);
glVertex3f(100.0f, 0.0, 0.0);
glVertex3f(0.0f, 1.0, 0.0);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0, 0.0);
glVertex3f(0.0f, 100.0, 0.0);
glVertex3f(1.0f, 0.0, 0.0);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0, 0.0);
glVertex3f(0.0f, 0.0, 100.0);
glVertex3f(0.0f, 1.0, 0.0);
glEnd();
*/
D3DXVECTOR3 DOFv = D3DXVECTOR3(mCameras[k].targetx, mCameras[k].targety, mCameras[k].targetz)-D3DXVECTOR3(mCameras[k].posx, mCameras[k].posy, mCameras[k].posz);
D3DXVECTOR3 newAt;
D3DXVec3Normalize(&newAt, &DOFv);
D3DXVECTOR3 axis, camat(1, 0, 0);
D3DXVec3Cross(&axis, &camat, &newAt);
float angle = Rad2Deg((float)acos(D3DXVec3Dot(&camat, &newAt)));
glTranslatef(mCameras[k].posx, mCameras[k].posy, mCameras[k].posz);
glRotatef(angle, axis[0], axis[1], axis[2]);
glTranslatef(270, 0, 0);
glScalef(0.3f, 0.3f, 0.3f);
glEnable(GL_ALPHA_TEST);
}
glPopMatrix();
}
void mdxMaterial::Read(TypePointer1 inP,int inSize)
{
TypePointer1 p(inP);
mUnk1 = *p.dw++;
mUnk2 = *p.dw++;
if( TAG(*p.dw) != 'LAYS' )
{
toregistre("Warning, \'LAYS\' expected...");
return;
}
p.dw++;
mNumLayers = *p.dw++;
for(int i=0;i<mNumLayers;++i)
{
mLayers[i].mLayerSize = p.dw[0];
mLayers[i].mBlendMode = p.dw[1];
mLayers[i].mUnk3 = p.dw[2];
mLayers[i].mTexture = p.dw[3];
mLayers[i].mUnk5 = p.dw[4];
mLayers[i].mUnk6 = p.dw[5];
mLayers[i].mUnk7 = p.f[6];
//
// ktma stuff here
//
if(TAG(p.dw[7]) == 'KMTA')
{
mLayers[i].mKMTA = true;
} else
{
mLayers[i].mKMTA = false;
}
p.c += mLayers[i].mLayerSize;
}
}
void mdxMaterial::Print(void)
{
toregistre(" mUnk1 : %i",mUnk1);
toregistre(" mUnk2 : %i",mUnk2);
// toregistre(" NumLayers : %i",mNumLayers);
for(int i=0;i<mNumLayers;++i)
{
toregistre(" Layer %i",i);
toregistre(" mBlendMode: %i",mLayers[i].mBlendMode);
toregistre(" mUnk3 : %i",mLayers[i].mUnk3);
toregistre(" mTexture : %i",mLayers[i].mTexture);
toregistre(" mUnk5 : %i",mLayers[i].mUnk5);
toregistre(" mUnk6 : %i",mLayers[i].mUnk6);
toregistre(" mUnk7 : %f",mLayers[i].mUnk7);
if(mLayers[i].mKMTA)
toregistre(" has a KMTA block.");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -