65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
-
+
-
-
+
+
-
+
-
+
|
sy += dy;
if (SOLID(S(fast_f2nat(sx),
fast_f2nat(
sy)))) // 90% of time spend in this
// function is on this line
{
rdist[i] = (float)(fabs(sx - vx) +
fabs(sy - vy));
fabs(sy - vy));
break;
};
};
} else {
rdist[i] = 2;
};
};
};
}
}
// test occlusion for a cube... one of the most computationally expensive
// functions in the engine as its done for every cube and entity, but its effect
// is more than worth it!
inline float
ca(float x, float y)
{
return x > y ? y / x : 2 - x / y;
};
}
inline float
ma(float x, float y)
{
return x == 0 ? (y > 0 ? 2 : -2) : y / x;
};
}
int
isoccluded(float vx, float vy, float cx, float cy,
float csize) // v = viewer, c = cube to test
{
if (!ocull)
return 0;
|
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
-
+
-
+
|
}; // E
} else {
h = ca(cx + csize - vx, cy - vy);
l = ca(cx - vx, cy + csize - vy);
}; // H
};
int si = fast_f2nat(h * (NUMRAYS / 8)) +
NUMRAYS; // get indexes into occlusion map from angles
NUMRAYS; // get indexes into occlusion map from angles
int ei = fast_f2nat(l * (NUMRAYS / 8)) + NUMRAYS + 1;
if (ei <= si)
ei += NUMRAYS;
for (int i = si; i <= ei; i++) {
if (dist < rdist[i & (NUMRAYS - 1)])
return 0; // if any value in this segment of the
// occlusion map is further away then cube is
// not occluded
};
return 1; // cube is entirely occluded
};
}
|