- bool CFrustum::BoxInFrustum(float x,float y,float z,float width,float height,float depth)
- {
- static float **p = m_Frustum;
- float minX = (x - width), maxX = (x + width);
- float minY = (y - height), maxY = (y + height);
- float minZ = (z - depth), maxZ = (z + depth);
- bool within = true;
- _asm
- {
- mov eax,-1
- mov ecx,p
- sub ecx,4
- _loop:
- add eax,1
- cmp eax,6
- jge _end
- add ecx,4
- mov ebx,dword ptr [ecx] // ebx = &m_Frustum[eax]
- // eine Ecke der Box prüfen
- fld dword ptr [ebx+0] // m_Frustum[eax][0] laden
- fmul minX // mal minX
- fld dword ptr [ebx+4] // m_Frustum[eax][1] laden
- fmul minY // mal minY
- fadd // beides addieren
- fld dword ptr [ebx+8] // m_Frustum[eax][2] laden
- fmul minZ // mal minZ
- fadd // addieren
- fadd dword ptr [ebx+12] // m_Frustum[eax][3] addieren
- fldz // 0.0 auf den stack laden
- fcompp // die obersten beiden werte auf dem stack vergleichen und löschen
- jg _loop // wenn wert > 0 weiter in der schleife
- // hier folgen die anderen 7 Ecken, bis auf die X/Y/Z-Werte das gleiche, keiner der Blöcke wird überhaupt ausgeführt, der 1. beendet bereits die funktion
- mov within,0 // box ist nicht im frustum
- _end:
- }
- return within;
- }