Files
3d-pinball-space-cadet/geometry/edges.cpp
T

339 lines
13 KiB
C++

//
// Created by neo on 2019-08-15.
//
#include "../pinball.h"
//----- (0100B9C7) --------------------------------------------------------
void __stdcall edges_insert_circle(struct circle_type *a1, struct TEdgeSegment *a2, struct field_effect_type *a3)
{
struct circle_type *v3; // ebx
long double v4; // st7
int v5; // esi
int v6; // edi
float *v7; // esi
int v8; // eax
int v9; // eax
double v10; // st7
double v11; // st7
float v12; // ST0C_4
double v13; // st7
float v14; // ST0C_4
double v15; // st7
float v16; // ST0C_4
double v17; // st7
double v18; // st7
float v19; // [esp+10h] [ebp-70h]
float v20; // [esp+14h] [ebp-6Ch]
int v21; // [esp+18h] [ebp-68h]
float v22; // [esp+1Ch] [ebp-64h]
float v23; // [esp+20h] [ebp-60h]
int v24; // [esp+28h] [ebp-58h]
float v25; // [esp+3Ch] [ebp-44h]
float v26; // [esp+40h] [ebp-40h]
int v27; // [esp+44h] [ebp-3Ch]
float v28; // [esp+48h] [ebp-38h]
float v29; // [esp+4Ch] [ebp-34h]
int v30; // [esp+50h] [ebp-30h]
float v31; // [esp+54h] [ebp-2Ch]
float v32; // [esp+58h] [ebp-28h]
float v33; // [esp+5Ch] [ebp-24h]
float v34; // [esp+60h] [ebp-20h]
float v35; // [esp+64h] [ebp-1Ch]
float v36; // [esp+68h] [ebp-18h]
struct circle_type *v37; // [esp+6Ch] [ebp-14h]
int v38; // [esp+70h] [ebp-10h]
int v39; // [esp+74h] [ebp-Ch]
float v40; // [esp+78h] [ebp-8h]
int v41; // [esp+7Ch] [ebp-4h]
struct circle_type *v42; // [esp+88h] [ebp+8h]
struct circle_type *v43; // [esp+88h] [ebp+8h]
v3 = a1;
v4 = sqrt(*((float *)a1 + 3)) + *(float *)edge_manager * 0.001;
v40 = v4 * v4;
v35 = *(float *)a1 - v4;
v33 = *((float *)a1 + 1) - v4;
v36 = v4 + *(float *)a1;
v34 = v4 + *((float *)a1 + 1);
v5 = TEdgeManager::box_x(edge_manager, v35);
v6 = TEdgeManager::box_y(edge_manager, v33);
v38 = TEdgeManager::box_x(edge_manager, v36);
v39 = TEdgeManager::box_y(edge_manager, v34);
if ( v5 - 1 <= 0 )
v42 = 0;
else
v42 = (struct circle_type *)(v5 - 1);
if ( v6 - 1 <= 0 )
v37 = 0;
else
v37 = (struct circle_type *)(v6 - 1);
v7 = (float *)edge_manager;
v38 = TEdgeManager::increment_box_x(edge_manager, v38);
v39 = TEdgeManager::increment_box_y((TEdgeManager *)v7, v39);
v28 = (double)(signed int)v42 * *v7 + v7[6];
v29 = (double)(signed int)v37 * v7[1] + v7[7];
v31 = v29;
v8 = (int)v42;
v41 = (int)v42;
LABEL_38:
if ( v8 <= v38 )
{
v9 = (int)v37;
v43 = v37;
while ( 1 )
{
if ( v9 > v39 )
{
v18 = v28 + *v7;
++v41;
v29 = v31;
v8 = v41;
v28 = v18;
goto LABEL_38;
}
if ( v36 >= (double)v28 )
{
v32 = v28 + *v7;
if ( v35 <= (double)v32 && v34 >= (double)v29 )
{
v10 = v29 + v7[1];
if ( v33 <= v10 )
{
if ( *(float *)v3 > (double)v32
|| *(float *)v3 < (double)v28
|| v10 < *((float *)v3 + 1)
|| *((float *)v3 + 1) < (double)v29 )
{
v25 = v28;
v26 = v29;
v27 = v30;
v11 = Distance_Squared(v28, v29, v30, *(float *)v3, *((float *)v3 + 1), *((_DWORD *)v3 + 2));
if ( v11 > v40 )
{
v12 = *(float *)v3;
v25 = v25 + *(float *)edge_manager;
v13 = Distance_Squared(v25, v26, v27, v12, *((float *)v3 + 1), *((_DWORD *)v3 + 2));
if ( v13 > v40 )
{
v14 = *(float *)v3;
v26 = v26 + *((float *)edge_manager + 1);
v15 = Distance_Squared(v25, v26, v27, v14, *((float *)v3 + 1), *((_DWORD *)v3 + 2));
if ( v15 > v40 )
{
v16 = *(float *)v3;
v25 = v25 - *(float *)edge_manager;
v17 = Distance_Squared(v25, v26, v27, v16, *((float *)v3 + 1), *((_DWORD *)v3 + 2));
if ( v17 > v40 )
{
v19 = v28;
v20 = v29;
v21 = v30;
v22 = 1.0;
v23 = 0.0;
v24 = *(_DWORD *)edge_manager;
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v22 = -1.0;
v19 = v19 + *(float *)edge_manager;
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v22 = 0.0;
v23 = 1.0;
v24 = *((_DWORD *)edge_manager + 1);
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v23 = -1.0;
v20 = v20 + *((float *)edge_manager + 1);
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v23 = 0.0;
v22 = -1.0;
v24 = *(_DWORD *)edge_manager;
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v22 = 1.0;
v19 = v19 - *(float *)edge_manager;
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v22 = 0.0;
v23 = -1.0;
v24 = *((_DWORD *)edge_manager + 1);
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
{
v23 = 1.0;
v20 = v20 - *((float *)edge_manager + 1);
if ( ray_intersect_circle(&v19, (float *)v3) >= 1000000000.0 )
goto LABEL_34;
}
}
}
}
}
}
}
}
}
}
}
v7 = (float *)edge_manager;
}
if ( a2 )
{
TEdgeManager::add_edge_to_box((TEdgeManager *)v7, v41, (int)v43, a2);
v7 = (float *)edge_manager;
}
if ( a3 )
{
TEdgeManager::add_field_to_box((TEdgeManager *)v7, v41, (int)v43, a3);
LABEL_34:
v7 = (float *)edge_manager;
goto LABEL_35;
}
}
}
}
LABEL_35:
v43 = (struct circle_type *)((char *)v43 + 1);
v9 = (int)v43;
v29 = v29 + v7[1];
}
}
}
//----- (0100BE21) --------------------------------------------------------
void __stdcall edges_insert_square(float a1, float a2, float a3, float a4, struct TEdgeSegment *a5, struct field_effect_type *a6)
{
double v6; // st7
double v7; // st7
int v8; // eax
int v9; // edi
signed int v10; // ST28_4
int v11; // ebx
int v12; // eax
float *v13; // ecx
int v14; // esi
float v15; // [esp+10h] [ebp-18h]
float v16; // [esp+14h] [ebp-14h]
int v17; // [esp+1Ch] [ebp-Ch]
float v18; // [esp+20h] [ebp-8h]
int v19; // [esp+24h] [ebp-4h]
float v20; // [esp+30h] [ebp+8h]
float v21; // [esp+34h] [ebp+Ch]
float v22; // [esp+38h] [ebp+10h]
float v23; // [esp+3Ch] [ebp+14h]
v6 = (double)(signed int)(signed __int64)(*(float *)edge_manager * 0.001);
v21 = a2 - v6;
v23 = v6 + a4;
v7 = (double)(signed int)(signed __int64)(*((float *)edge_manager + 1) * 0.001);
v20 = a1 - v7;
v22 = v7 + a3;
v8 = TEdgeManager::box_x(edge_manager, v21);
v9 = v8;
v10 = v8;
v19 = TEdgeManager::box_y(edge_manager, v20);
v11 = TEdgeManager::box_x(edge_manager, v23);
v12 = TEdgeManager::box_y(edge_manager, v22);
v13 = (float *)edge_manager;
v17 = v12;
v15 = (double)v10 * *(float *)edge_manager + *((float *)edge_manager + 6);
v16 = (double)v19 * *((float *)edge_manager + 1) + *((float *)edge_manager + 7);
v18 = v16;
while ( v9 <= v11 )
{
v14 = v19;
if ( v19 <= v12 )
{
do
{
if ( v23 >= (double)v15 && v15 + *v13 >= v21 && v22 >= (double)v16 && v16 + v13[1] >= v20 )
{
if ( a5 )
{
TEdgeManager::add_edge_to_box((TEdgeManager *)v13, v9, v14, a5);
v13 = (float *)edge_manager;
}
if ( a6 )
{
TEdgeManager::add_field_to_box((TEdgeManager *)v13, v9, v14, a6);
v13 = (float *)edge_manager;
}
}
v12 = v17;
++v14;
v16 = v16 + v13[1];
}
while ( v14 <= v17 );
}
++v9;
v16 = v18;
v15 = v15 + *v13;
}
}
//----- (01016B27) --------------------------------------------------------
void __stdcall find_closest_edge(struct ramp_plane_type *a1, int a2, struct wall_point_type *a3, struct vector_type **a4, struct vector_type **a5)
{
int v5; // ecx
char *v6; // esi
struct vector_type *v7; // ebx
long double v8; // st7
struct vector_type *v9; // edi
long double v10; // st7
long double v11; // st7
int v12; // [esp+0h] [ebp-1Ch]
int v13; // [esp+4h] [ebp-18h]
int v14; // [esp+Ch] [ebp-10h]
int v15; // [esp+10h] [ebp-Ch]
float v16; // [esp+18h] [ebp-4h]
float v17; // [esp+28h] [ebp+Ch]
float v18; // [esp+28h] [ebp+Ch]
float v19; // [esp+28h] [ebp+Ch]
struct wall_point_type *v20; // [esp+2Ch] [ebp+10h]
v14 = *(_DWORD *)a3;
v15 = *((_DWORD *)a3 + 1);
v5 = *((_DWORD *)a3 + 2);
v13 = *((_DWORD *)a3 + 3);
v16 = 1000000000.0;
v12 = v5;
if ( a2 > 0 )
{
v6 = (char *)a1 + 20;
v20 = (struct wall_point_type *)a2;
do
{
v7 = (struct vector_type *)(v6 - 8);
v17 = Distance((struct vector_type *)&v14, (struct vector_type *)(v6 - 8));
v8 = Distance((struct vector_type *)&v12, (struct vector_type *)v6) + v17;
if ( v8 < v16 )
{
v16 = v8;
*a4 = v7;
*a5 = (struct vector_type *)v6;
}
v9 = (struct vector_type *)(v6 + 8);
v18 = Distance((struct vector_type *)&v12, (struct vector_type *)(v6 + 8));
v10 = Distance((struct vector_type *)&v14, (struct vector_type *)v6) + v18;
if ( v10 < v16 )
{
v16 = v10;
*a4 = (struct vector_type *)v6;
*a5 = v9;
}
v19 = Distance((struct vector_type *)&v14, (struct vector_type *)(v6 + 8));
v11 = Distance((struct vector_type *)&v12, (struct vector_type *)(v6 - 8)) + v19;
if ( v11 < v16 )
{
v16 = v11;
*a4 = v9;
*a5 = v7;
}
v6 += 52;
v20 = (struct wall_point_type *)((char *)v20 - 1);
}
while ( v20 );
}
}