Files
3d-pinball-space-cadet/Classes/TLine/TLine.cpp
T

273 lines
6.2 KiB
C++

#include "TLine.h"
//----- (0101C6FD) --------------------------------------------------------
TLine *__thiscall TLine::TLine(TLine *this, struct TCollisionComponent *a2, char *a3, unsigned int a4, float a5, float a6, float a7, float a8)
{
TLine *v8; // esi
v8 = this;
TEdgeSegment::TEdgeSegment(this, a2, a3, a4);
*(float *)((char *)v8 + 69) = a5;
*(float *)((char *)v8 + 73) = a6;
*(float *)((char *)v8 + 77) = a7;
*(float *)((char *)v8 + 81) = a8;
*(_DWORD *)v8 = &TLine::`vftable';
line_init((int)v8 + 21, a5, a6, a7, a8);
return v8;
}
// 1002864: using guessed type void *TLine::`vftable';
//----- (0101C764) --------------------------------------------------------
double __thiscall TLine::FindCollisionDistance(TLine *this, struct ray_type *a2)
{
return ray_intersect_line((float *)a2, (float *)((char *)this + 21));
}
//----- (0101C77E) --------------------------------------------------------
TLine *__thiscall TLine::TLine(TLine *this, struct TCollisionComponent *a2, char *a3, unsigned int a4, struct vector_type *a5, struct vector_type *a6)
{
TLine *v6; // esi
double v7; // st7
float v8; // ST10_4
v6 = this;
TEdgeSegment::TEdgeSegment(this, a2, a3, a4);
*(_DWORD *)v6 = &TLine::`vftable';
*(_DWORD *)((char *)v6 + 69) = *(_DWORD *)a5;
*(_DWORD *)((char *)v6 + 73) = *((_DWORD *)a5 + 1);
*(_DWORD *)((char *)v6 + 77) = *(_DWORD *)a6;
v7 = *((float *)a6 + 1);
*(float *)((char *)v6 + 81) = *((float *)a6 + 1);
v8 = v7;
line_init((int)v6 + 21, *(float *)((char *)v6 + 69), *(float *)((char *)v6 + 73), *(float *)((char *)v6 + 77), v8);
return v6;
}
// 1002864: using guessed type void *TLine::`vftable';
//----- (0101C7E6) --------------------------------------------------------
void __thiscall TLine::EdgeCollision(TLine *this, struct TBall *a2, float a3)
{
(*(void (__stdcall **)(struct TBall *, char *, char *, _DWORD, TLine *))(**((_DWORD **)this + 1) + 20))(
a2,
(char *)this + 57,
(char *)this + 21,
LODWORD(a3),
this);
}
//----- (0101C813) --------------------------------------------------------
void __thiscall TLine::Offset(TLine *this, float a2)
{
double v2; // st7
double v3; // st6
float v4; // ST14_4
float v5; // ST18_4
double v6; // st6
float v7; // ST10_4
float v8; // [esp+20h] [ebp+8h]
v2 = a2 * *(float *)((char *)this + 21);
v3 = a2 * *(float *)((char *)this + 25);
v4 = v2 + *(float *)((char *)this + 69);
*(float *)((char *)this + 69) = v4;
v5 = v3 + *(float *)((char *)this + 73);
*(float *)((char *)this + 73) = v5;
v8 = v2 + *(float *)((char *)this + 77);
*(float *)((char *)this + 77) = v8;
v6 = v3 + *(float *)((char *)this + 81);
*(float *)((char *)this + 81) = v6;
v7 = v6;
line_init((int)this + 21, v4, v5, v8, v7);
}
//----- (0101C87B) --------------------------------------------------------
void __thiscall TLine::place_in_grid(TLine *this)
{
TLine *v1; // esi
int v2; // edi
int v3; // ebx
int v4; // ecx
double v5; // st7
int v6; // edi
int v7; // edi
double v8; // st7
double v9; // st6
int v10; // edi
double v11; // st7
double v12; // st6
int v13; // edi
double v14; // st7
double v15; // st6
double v16; // st7
double v17; // st6
float v18; // [esp+10h] [ebp-20h]
float v19; // [esp+14h] [ebp-1Ch]
signed int v20; // [esp+18h] [ebp-18h]
int v21; // [esp+18h] [ebp-18h]
signed int v22; // [esp+18h] [ebp-18h]
int v23; // [esp+18h] [ebp-18h]
signed int v24; // [esp+1Ch] [ebp-14h]
signed int v25; // [esp+1Ch] [ebp-14h]
int v26; // [esp+20h] [ebp-10h]
int v27; // [esp+24h] [ebp-Ch]
signed int v28; // [esp+28h] [ebp-8h]
signed int v29; // [esp+2Ch] [ebp-4h]
v1 = this;
v2 = TEdgeManager::box_x(edge_manager, *(float *)((char *)this + 69));
v3 = TEdgeManager::box_y(edge_manager, *(float *)((char *)v1 + 73));
v27 = TEdgeManager::box_x(edge_manager, *(float *)((char *)v1 + 77));
v4 = TEdgeManager::box_y(edge_manager, *(float *)((char *)v1 + 81));
v26 = v4;
if ( *(float *)((char *)v1 + 69) >= (double)*(float *)((char *)v1 + 77) )
v24 = -1;
else
v24 = 1;
if ( *(float *)((char *)v1 + 73) >= (double)*(float *)((char *)v1 + 81) )
v20 = -1;
else
v20 = 1;
if ( v3 == v4 )
{
if ( v24 == 1 )
{
while ( v2 <= v27 )
TEdgeManager::add_edge_to_box(edge_manager, v2++, v3, v1);
}
else
{
while ( v2 >= v27 )
TEdgeManager::add_edge_to_box(edge_manager, v2--, v3, v1);
}
}
else if ( v2 == v27 )
{
if ( v20 == 1 )
{
if ( v3 <= v4 )
{
do
TEdgeManager::add_edge_to_box(edge_manager, v2, v3++, v1);
while ( v3 <= v26 );
}
}
else if ( v3 >= v4 )
{
do
TEdgeManager::add_edge_to_box(edge_manager, v2, v3--, v1);
while ( v3 >= v26 );
}
}
else
{
v28 = v2;
v5 = (*(float *)((char *)v1 + 73) - *(float *)((char *)v1 + 81))
/ (*(float *)((char *)v1 + 69) - *(float *)((char *)v1 + 77));
v29 = v3;
v19 = v5;
v18 = *(float *)((char *)v1 + 73) - v5 * *(float *)((char *)v1 + 69);
TEdgeManager::add_edge_to_box(edge_manager, v2, v3, v1);
if ( v24 == 1 )
{
v6 = v2 + 1;
if ( v20 == 1 )
{
v25 = v6;
v7 = v28;
v21 = v3 + 1;
do
{
v8 = (double)v21 * *((float *)edge_manager + 1) + *((float *)edge_manager + 7);
v9 = ((double)v25 * *(float *)edge_manager + *((float *)edge_manager + 6)) * v19 + v18;
if ( v9 >= v8 )
{
if ( v9 == v8 )
{
++v7;
++v25;
}
++v3;
++v21;
}
else
{
++v7;
++v25;
}
TEdgeManager::add_edge_to_box(edge_manager, v7, v3, v1);
}
while ( v7 != v27 || v3 != v26 );
}
else
{
v22 = v6;
v10 = v28;
do
{
v11 = (double)v29 * *((float *)edge_manager + 1) + *((float *)edge_manager + 7);
v12 = ((double)v22 * *(float *)edge_manager + *((float *)edge_manager + 6)) * v19 + v18;
if ( v12 <= v11 )
{
if ( v12 == v11 )
{
++v10;
++v22;
}
--v29;
}
else
{
++v10;
++v22;
}
TEdgeManager::add_edge_to_box(edge_manager, v10, v29, v1);
}
while ( v10 != v27 || v29 != v26 );
}
}
else if ( v20 == 1 )
{
v13 = v3;
v23 = v3 + 1;
do
{
v14 = (double)v23 * *((float *)edge_manager + 1) + *((float *)edge_manager + 7);
v15 = ((double)v28 * *(float *)edge_manager + *((float *)edge_manager + 6)) * v19 + v18;
if ( v15 >= v14 )
{
if ( v15 == v14 )
--v28;
++v13;
++v23;
}
else
{
--v28;
}
TEdgeManager::add_edge_to_box(edge_manager, v28, v13, v1);
}
while ( v28 != v27 || v13 != v26 );
}
else
{
do
{
v16 = (double)v29 * *((float *)edge_manager + 1) + *((float *)edge_manager + 7);
v17 = ((double)v28 * *(float *)edge_manager + *((float *)edge_manager + 6)) * v19 + v18;
if ( v17 <= v16 )
{
if ( v17 == v16 )
--v28;
--v29;
}
else
{
--v28;
}
TEdgeManager::add_edge_to_box(edge_manager, v28, v29, v1);
}
while ( v28 != v27 || v29 != v26 );
}
}
}