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

📄 game.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		mov		eax,3
Loop2:
// edi = TempP->Px
		fld		dword ptr [edi+t_WandPoly.Env1.X]
		fadd	dword ptr [TexMod.X]
		fstp	dword ptr [ebx+tP3D.X]
		fld		dword ptr [edi+t_WandPoly.Env1.Y]
		fadd	dword ptr [TexMod.Y]
		fstp	dword ptr [ebx+tP3D.Y]

		cmp		[UseTexC],0
		je		NoUseTexC
		fld		dword ptr [edi+t_WandPoly.T1.X]
		fadd	dword ptr [TexMod.X]
		fstp	dword ptr [ebx+tP3D.X]
		fld		dword ptr [edi+t_WandPoly.T1.Y]
		fadd	dword ptr [TexMod.Y]
		fstp	dword ptr [ebx+tP3D.Y]

NoUseTexC:
		push	eax
		mov		eax,[LL]
		mov		[ecx],eax
		pop		eax

		add		edi,8
		add		ebx,8
		add		ecx,4
		inc		[LL]
		dec		eax
		jnz		Loop2


		inc		[L]
		mov		esi,[esi+t_WandPoly.Next]
		jmp		PolyLoop2
JumpOut2:
/**/
	}

/*
	TempP=Mesh->Poly;
	while((TempP!=NULL)&&(L<MaxManualDraw))
	{
		LL=L*3;

//		*(MDPos+(LL))=vAdd5(&TempP->P1->WorldPos,vMulK2(&TempP->P1->Normal,EnvEnt));
//		*(MDNormal+(LL))=TempP->P1->Normal;
		*(MDTex+(LL))=v2Set((TempP->Env1.X+TexMod.X)*TempM->EnvX,(TempP->Env1.Y+TexMod.Y)*TempM->EnvY);
		if(UseTexC)
			*(MDTex+(LL))=v2Set((TempP->T1.X+TexMod.X)*TempM->EnvX,(TempP->T1.Y+TexMod.Y)*TempM->EnvY);
		*(MDIndex+(LL))=LL;

//		*(MDPos+(LL+1))=vAdd5(&TempP->P2->WorldPos,vMulK2(&TempP->P2->Normal,EnvEnt));
//		*(MDNormal+(LL+1))=TempP->P2->Normal;
		*(MDTex+(LL+1))=v2Set((TempP->Env2.X+TexMod.X)*TempM->EnvX,(TempP->Env2.Y+TexMod.Y)*TempM->EnvY);
		if(UseTexC)
			*(MDTex+(LL+1))=v2Set((TempP->T2.X+TexMod.X)*TempM->EnvX,(TempP->T2.Y+TexMod.Y)*TempM->EnvY);
		*(MDIndex+(LL+1))=LL+1;

//		*(MDPos+(LL+2))=vAdd5(&TempP->P3->WorldPos,vMulK2(&TempP->P3->Normal,EnvEnt));
//		*(MDNormal+(LL+2))=TempP->P3->Normal;
		*(MDTex+(LL+2))=v2Set((TempP->Env3.X+TexMod.X)*TempM->EnvX,(TempP->Env3.Y+TexMod.Y)*TempM->EnvY);
		if(UseTexC)
			*(MDTex+(LL+2))=v2Set((TempP->T3.X+TexMod.X)*TempM->EnvX,(TempP->T3.Y+TexMod.Y)*TempM->EnvY);
		*(MDIndex+(LL+2))=LL+2;

		L++;
		TempP=TempP->Next;
	}
/**/
    glVertexPointer(3,GL_FLOAT,0,MDPos);
    glNormalPointer(GL_FLOAT,0,MDNormal);
    glTexCoordPointer(2,GL_FLOAT,0,MDTex);

	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);

	glDrawElements(GL_TRIANGLES,L*3,GL_UNSIGNED_INT,MDIndex);

	glDisableClientState(GL_VERTEX_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);

}

void DrawGrund(tGrund *Grund,long MatNr,float Alpha,long EnvMap,float EnvAlpha,float EnvEnt)
{
	tMaterial *TempM=Mat[MatNr];
	if(TempM->Textured)
	{

		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, textures[TempM->TexNr].texID);	

	} else {
		glEnable(GL_COLOR_MATERIAL);
		glEnable(GL_LIGHT1);	
	
		glEnable(GL_LIGHT0);	
		glEnable(GL_LIGHTING);

	}
if(TempM->Textured)
{

		
	SetAlpha(Alpha);

	if(Grund->DisplayListOn)
	{
		glCallList(Grund->DisplayList);
	}
} else {

	glColor4f(TempM->Color.X,TempM->Color.Y,TempM->Color.Z,Alpha);
	
	if(Grund->DisplayListOn)
	{
		glCallList(Grund->DisplayList);
	}
}


	if(EnvMap!=-1)
	{
		glDepthMask(false);

		glEnable(GL_TEXTURE_2D);
		glBindTexture(GL_TEXTURE_2D, textures[EnvMap].texID);	
		glColor4f(1.0f,0.75f,0.5f,Alpha*EnvAlpha);
		ManualDraw(Grund,TempM,EnvEnt,false);
		glDepthMask(true);
	}

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_LIGHT0);	
	glEnable(GL_LIGHT1);	
	glDisable(GL_LIGHTING);

}

#ifdef DebugVersion

void DrawBox(tP3D Pos,float Size)
{
	tWandVertice *Temp;
	tWandPoly *TempP;
	tP3D Normal,DaPos;
	Temp=Cube->Vertice;
	while(Temp!=NULL)
	{
		Temp->WorldPos=vAdd5(&Pos,vMulK2(&Temp->Pos,Size));
		Temp=Temp->Next;
	}

	glBegin(GL_TRIANGLES);
	TempP=Cube->Poly;
//	glColor4f(1,1,1,0.5f);
	SetAlpha(0.5f);
	while(TempP!=NULL)
	{
		Normal=TempP->P1->Normal;
		vAdd3v(&DaPos,&Pos,&TempP->P1->Pos);
		glNormal3f(Normal.X,Normal.Y,Normal.Z);
		glVertex3f(DaPos.X,DaPos.Y,DaPos.Z);

		Normal=TempP->P2->Normal;
		vAdd3v(&DaPos,&Pos,&TempP->P2->Pos);
		glNormal3f(Normal.X,Normal.Y,Normal.Z);
		glVertex3f(DaPos.X,DaPos.Y,DaPos.Z);

		Normal=TempP->P3->Normal;
		vAdd3v(&DaPos,&Pos,&TempP->P3->Pos);
		glNormal3f(Normal.X,Normal.Y,Normal.Z);
		glVertex3f(DaPos.X,DaPos.Y,DaPos.Z);

		TempP=TempP->Next;
	}
	glEnd();
//	DrawGrund(Cube,true,0,Pos,NULL,1,-1,1,1);
}

#endif

/*
tItem *LastItem(tItem *Start)
{
	while(Start->Next!=NULL) Start=Start->Next;
	return(Start);
}
/**/
void AddItem(tMeshList *MeshList,tP3D Pos,tP3D Speed,tP3D Rot,tP3D RotAdd,float Roll,float RotSpeed,long MaxLife,long Type,float SphereSize,long Attr,float Attr2,long Owner)
{
	tItem *Temp;
//	Temp=(tItem*)malloc(sizeof(tItem));
	if(Items==MaxItems) return;
	Temp=(Item+Items);
	Items++;
	Temp->Type=Type;
	Temp->Attr=Attr;
	Temp->Matrix=CalcNewMatrix(Rot,vNull,&Kart_Matrix,Roll);
	Temp->NewMatrix=Temp->Matrix;
	Temp->MeshList=MeshList;
	Temp->SphereSize=SphereSize;
	Temp->Roll=Roll;
	Temp->Pos=Pos;
	Temp->LastPos=Pos;
	Temp->LastSpeed=Speed;
	Temp->Rot=Rot;
	Temp->RotAdd=RotAdd;
	Temp->Speed=Speed;
	Temp->RotSpeed=RotSpeed;
	Temp->MaxLife=MaxLife;
	Temp->Life=MaxLife;
	Temp->Attr2=Attr2;
	Temp->Owner=Owner;
	if(Type==_Item_Part) PartikelMob(Pos,Speed,0,vSet(0.7f,0,0),2,0.5f);
/*
	if(Start==NULL)
	{
		return(Temp);
	} else {
		Temp2=Start;
		while(Temp2->Next!=NULL)
		{
			Temp2=Temp2->Next;
		}
		Temp2->Next=Temp;
		return(Start);
	}
*/
}

bool BoxInFrustum(tP3D *P1,tP3D *P2)
{

	__asm
	{
		mov		esi,[P1]
		mov		edi,[P2]
		mov		eax,1
		mov		ebx,offset frustum
		mov		ecx,6
		jmp		Start
GoOn:
		faddp	st(0),st(0)
		faddp	st(0),st(0)
		faddp	st(0),st(0)
		faddp	st(0),st(0)
		add		ebx,16
		dec		ecx
		jz		EndOfClip
Start:

		fld		dword ptr [ebx]
		fld		dword ptr [ebx+4]
		fld		dword ptr [ebx+8]
		fld		dword ptr [ebx+12]

		fld		dword ptr [esi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [esi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [esi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [esi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [esi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [edi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [esi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [edi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [esi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [esi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [edi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [edi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [edi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [esi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [esi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [edi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [esi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [edi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [edi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [edi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [esi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		fld		dword ptr [edi+tP3D.X]		//	Frustum3|F2|F1|F0
		fmul	st(0),st(4)				// E|Frustum3|F2|F1|F0
		fld		dword ptr [edi+tP3D.Y]
		fmul	st(0),st(4)				// Y|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fld		dword ptr [edi+tP3D.Z]		// E|Frustum3|F2|F1|F0
		fmul	st(0),st(3)				// Z|E|Frustum3|F2|F1|F0
		faddp	st(1),st(0)
		fcomip	st(0),st(1)				// E|Frustum3|F2|F1|F0
		jnbe		GoOn	

		xor		eax,eax
		faddp	st(0),st(0)
		faddp	st(0),st(0)
		faddp	st(0),st(0)
		faddp	st(0),st(0)
EndOfClip:
	
	}
/*
   long p;

   for( p = 0; p < 6; p++ )
   {
      if( frustum[p][0] * P1.X + frustum[p][1] * P1.Y + frustum[p][2] * P1.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P1.X + frustum[p][1] * P1.Y + frustum[p][2] * P2.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P1.X + frustum[p][1] * P2.Y + frustum[p][2] * P1.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P1.X + frustum[p][1] * P2.Y + frustum[p][2] * P2.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P2.X + frustum[p][1] * P1.Y + frustum[p][2] * P1.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P2.X + frustum[p][1] * P1.Y + frustum[p][2] * P2.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P2.X + frustum[p][1] * P2.Y + frustum[p][2] * P1.Z > frustum[p][3] ) continue;
      if( frustum[p][0] * P2.X + frustum[p][1] * P2.Y + frustum[p][2] * P2.Z > frustum[p][3] ) continue;
	  return(false);
   }
   return true;
/**/	
}

bool SphereInFrustum( tP3D Pos, float radius )
{
   int p;

   for( p = 0; p < 6; p++ )
      if( frustum[p][0] * Pos.X + frustum[p][1] * Pos.Y + frustum[p][2] * Pos.Z - frustum[p][3] <= -radius )
         return false;
   return true;
}

#ifdef DebugVersion

void DrawDaBox(tP3D P1,tP3D P2)
{

	glDepthMask(false);
	glDisable(GL_TEXTURE_2D);

	glBegin(GL_TRIANGLES);
//	glColor4f(1,1,1,0.3f);
	SetAlpha(0.3f);
	glNormal3f(0,1,0);

	glVertex3f(P1.X,P1.Y,P1.Z);
	glVertex3f(P2.X,P1.Y,P1.Z);
	glVertex3f(P1.X,P2.Y,P1.Z);

	glVertex3f(P1.X,P2.Y,P1.Z);
	glVertex3f(P2.X,P1.Y,P1.Z);
	glVertex3f(P2.X,P2.Y,P1.Z);


	glVertex3f(P2.X,P1.Y,P2.Z);
	glVertex3f(P1.X,P1.Y,P2.Z);
	glVertex3f(P1.X,P2.Y,P2.Z);

	glVertex3f(P2.X,P1.Y,P2.Z);
	glVertex3f(P1.X,P2.Y,P2.Z);
	glVertex3f(P2.X,P2.Y,P2.Z);


	glVertex3f(P1.X,P1.Y,P1.Z);
	glVertex3f(P1.X,P2.Y,P1.Z);
	glVertex3f(P1.X,P1.Y,P2.Z);

	glVertex3f(P1.X,P1.Y,P2.Z);
	glVertex3f(P1.X,P2.Y,P1.Z);
	glVertex3f(P1.X,P2.Y,P2.Z);


	glVertex3f(P2.X,P2.Y,P1.Z);
	glVertex3f(P2.X,P1.Y,P1.Z);
	glVertex3f(P2.X,P1.Y,P2.Z);

	glVertex3f(P2.X,P2.Y,P1.Z);
	glVertex3f(P2.X,P1.Y,P2.Z);
	glVertex3f(P2.X,P2.Y,P2.Z);


	glVertex3f(P1.X,P1.Y,P1.Z);
	glVertex3f(P1.X,P1.Y,P2.Z);
	glVertex3f(P2.X,P1.Y,P1.Z);

	glVertex3f(P2.X,P1.Y,P1.Z);
	glVertex3f(P1.X,P1.Y,P2.Z);
	glVertex3f(P2.X,P1.Y,P2.Z);

	glVertex3f(P1.X,P2.Y,P2.Z);
	glVertex3f(P1.X,P2.Y,P1.Z);
	glVertex3f(P2.X,P2.Y,P1.Z);

	glVertex3f(P1.X,P2.Y,P2.Z);
	glVertex3f(P2.X,P2.Y,P1.Z);
	glVertex3f(P2.X,P2.Y,P2.Z);

	glEnd();
	glDepthMask(true);
//	DrawGrund(Cube,true,0,Pos,NULL,1,-1,1,1);
}

#endif

float GetClosest(float C,float P1,float P2)
{
	if(fabs(P1-C)<fabs(P2-C)) 
	{return(P1);}
	else
	{return(P2);}
}

void DrawSector(tSector *Temp)
{
	tP3D P1,P2,CP;
	float Alpha,RealAbstand,Abstand;
	tMaterial *TempM;

	if(Temp==NULL) return;
	vAdd3v(&P1,&Temp->BoundBox.P1,&Temp->ModPos);
	vAdd3v(&P2,&Temp->BoundBox.P2,&Temp->ModPos);

	if( (Temp->Flags&_SF_SkeletonNode)||
		BoxInFrustum(&P1,&P2)
	  )
	{
//		RealAbstand=Temp->CamAb;
		vAdd3v(&P1,&Temp->BoundBox.P1,&Temp->ModPos);
		vAdd3v(&P2,&Temp->BoundBox.P2,&Temp->ModPos);
		CP.X=GetClosest(CPos.X,(P1.X+P2.X)*0.5f,GetClosest(CPos.X,P1.X,P2.X));
		CP.Y=GetClosest(CPos.Y,(P1.Y+P2.Y)*0.5f,GetClosest(CPos.Y,P1.Y,P2.Y));
		CP.Z=GetClosest(CPos.Z,(P1.Z+P2.Z)*0.5f,GetClosest(CPos.Z,P1.Z,P2.Z));
/*
		if(fabs(P1.X-CPos.X)<fabs(P2.X-CPos.X))
		{ CP.X=P1.X; } else { CP.X=P2.X; }
		if(fabs(P1.Y-CPos.Y)<fabs(P2.Y-CPos.Y))
		{ CP.Y=P1.Y; } else { CP.Y=P2.Y; }
		if(fabs(P1.Z-CPos.Z)<fabs(P2.Z-CPos.Z))
		{ CP.Z=P1.Z; } else { CP.Z=P2.Z; }
*/
		RealAbstand=vLength2(vSub(CP,CPos));
//		RealAbstand=vLength2(vSub(vAdd2(&Temp->BoundBox->Mid,&Temp->ModPos),CPos));
		Abstand=RealAbstand-300;

		if((Abstand<VisBorder)||(Temp->Mesh==NULL))
		{
			if(Temp->Mesh!=NULL) 
			{
				vAdd3v(&P1,&Temp->Mesh->BoundBox.P1,&Temp->ModPos);
				vAdd3v(&P2,&Temp->Mesh->BoundBox.P2,&Temp->ModPos);
				if(BoxInFrustum(&P1,&P2))
				{
					Alpha=RealAbstand-AlphaAnfang;
					Alpha=Alpha/(VisBorder-AlphaAnfang);
					fRange(&Alpha);
/*
					if(Alpha<0) Alpha=0;
					if(Alpha>1) Alpha=1;
*/
					if(!(Temp->Flags&_SF_SkeletonNode))
					{
						if((Abstand<VisBorder))
						{
							Temp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -