📄 game.cpp
字号:
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 + -