⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdx.cpp

📁 mpq文件查看器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -