Function CheckFaceCollision(Vertex : Array of TBSPVertex; Amount : Integer; Pos,Collision,Extents : TVector3f) : Boolean;
var
x : integer;
Size,Max,Min,CPos : TVector3f;
begin
Max := SetVector(-999999,-999999,-999999);
Min := SetVector(999999,999999,999999);
For x := 0 to Amount-1 do
if Vertex[x].Position.X > Max.X then
Max.X := Vertex[x].Position.X
else
if Vertex[x].Position.Y > Max.Y then
Max.Y := Vertex[x].Position.Y
else
if Vertex[x].Position.Z > Max.Z then
Max.Z := Vertex[x].Position.Z
else
if Vertex[x].Position.X < Min.X then
Min.X := Vertex[x].Position.X
else
if Vertex[x].Position.Y < Min.Y then
Min.Y := Vertex[x].Position.Y
else
if Vertex[x].Position.Z < Min.Z then
Min.Z := Vertex[x].Position.Z;
Size := SubtractVector(Max,Min);
CPos := SubtractVector(Collision,Pos);
if Min3f(SqrtVector(ScaleVector3f(CPos,CPos)),AddVector(Size,Extents)) then
Result := True
else
Result := False;
end;
Function EO_CheckFaceCollision(EOId : Integer) : Boolean;
var
FaceIndex,FaceCount,x,y : Integer;
EntityObject : TEntityObject;
Vertex : Array of TBSPVertex;
begin
EntityObject := EntityObjects.EntityObject[Eoid];
FaceIndex := Q3Level.Models[EntityObject.ModelId].faceIndex;
FaceCount := Q3Level.Models[EntityObject.ModelId].numOfFaces;
Result := False;
for x := 0 to FaceCount-1 do
with Q3Level.Faces[FaceIndex+x] do
begin
SetLength(Vertex,numOfVerts);
for y := 0 to numOfVerts-1 do
begin
Vertex[y] := Q3Level.Vertices[startVertIndex + y];
//Vertex[y].Position := AddVector(Vertex[y].Position);
end;
if CheckFaceCollision(Vertex,numofverts,AddVector(EntityObject.Position,EntityObject.ParentOffset),Camera.position,Player_Box) then
begin
Result := True;
Exit;
end;
end;
end;