12 #ifndef __ICEPOINT_H__
13 #define __ICEPOINT_H__
21 #define CROSS2D(a, b) (a.x*b.y - b.x*a.y)
52 Point& PositiveUnitRandomVector();
54 Point& UnitRandomVector();
101 x = a.
x + b.
x * scalar;
102 y = a.
y + b.
y * scalar;
103 z = a.
z + b.
z * scalar;
119 x = a.
x - b.
x * scalar;
120 y = a.
y - b.
y * scalar;
121 z = a.
z - b.
z * scalar;
137 x = a.
x + b.
x * scalarb + c.
x * scalarc;
138 y = a.
y + b.
y * scalarb + c.
y * scalarc;
139 z = a.
z + b.
z * scalarb + c.
z * scalarc;
146 x = a.
x - b.
x * scalarb - c.
x * scalarc;
147 y = a.
y - b.
y * scalarb - c.
y * scalarc;
148 z = a.
z - b.
z * scalarb - c.
z * scalarc;
167 x = a.
x + t * (b.
x - a.
x);
168 y = a.
y + t * (b.
y - a.
y);
169 z = a.
z + t * (b.
z - a.
z);
182 float kp0 = (2.0f * t2 - t3 - t) * 0.5
f;
183 float kp1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5
f;
184 float kp2 = (4.0f * t2 - 3.0f * t3 + t) * 0.5
f;
185 float kp3 = (t3 - t2) * 0.5
f;
186 x = p0.
x * kp0 + p1.
x * kp1 + p2.
x * kp2 + p3.
x * kp3;
187 y = p0.
y * kp0 + p1.
y * kp1 + p2.
y * kp2 + p3.
y * kp3;
188 z = p0.
z * kp0 + p1.
z * kp1 + p2.
z * kp2 + p3.
z * kp3;
245 if(coord_mask&1) {
udword Dummy =
IR(
x); Dummy^=tweak_mask;
x =
FR(Dummy); }
246 if(coord_mask&2) {
udword Dummy =
IR(
y); Dummy^=tweak_mask;
y =
FR(Dummy); }
247 if(coord_mask&4) {
udword Dummy =
IR(
z); Dummy^=tweak_mask;
z =
FR(Dummy); }
250 #define TWEAKMASK 0x3fffff
251 #define TWEAKNOTMASK ~TWEAKMASK
295 if(limit_length>=0.0
f)
297 float CurrentSquareLength = SquareMagnitude();
299 if(CurrentSquareLength > limit_length * limit_length)
301 float Coeff = limit_length / sqrtf(CurrentSquareLength);
313 return sqrtf((
x - b.
x)*(
x - b.
x) + (
y - b.
y)*(
y - b.
y) + (
z - b.
z)*(
z - b.
z));
319 return ((
x - b.
x)*(
x - b.
x) + (
y - b.
y)*(
y - b.
y) + (
z - b.
z)*(
z - b.
z));
328 x = a.
y * b.
z - a.
z * b.
y;
329 y = a.
z * b.
x - a.
x * b.
z;
330 z = a.
x * b.
y - a.
y * b.
x;
343 const float* Vals = &
x;
345 if(Vals[
_Y] > Vals[m]) m =
_Y;
346 if(Vals[
_Z] > Vals[m]) m =
_Z;
353 const float* Vals = &
x;
363 const float* Vals = &
x;
365 if(Vals[
_Y] < Vals[m]) m =
_Y;
366 if(Vals[
_Z] < Vals[m]) m =
_Z;
377 void ProjectToScreen(
float halfrenderwidth,
float halfrenderheight,
const Matrix4x4& mat,
HPoint& projected)
const;
386 udword f = (h[0]+h[1]*11-(h[2]*17)) & 0x7fffffff;
387 return (f>>22)^(f>>12)^(f);
393 bool IsNotUsed()
const;
462 class ShadowMatrix3x3{
public:
float m[3][3]; };
463 const ShadowMatrix3x3* Mat = (
const ShadowMatrix3x3*)&mat;
466 x * Mat->m[0][0] +
y * Mat->m[1][0] +
z * Mat->m[2][0],
467 x * Mat->m[0][1] +
y * Mat->m[1][1] +
z * Mat->m[2][1],
468 x * Mat->m[0][2] +
y * Mat->m[1][2] +
z * Mat->m[2][2] );
474 class ShadowMatrix4x4{
public:
float m[4][4]; };
475 const ShadowMatrix4x4* Mat = (
const ShadowMatrix4x4*)&mat;
478 x * Mat->m[0][0] +
y * Mat->m[1][0] +
z * Mat->m[2][0] + Mat->m[3][0],
479 x * Mat->m[0][1] +
y * Mat->m[1][1] +
z * Mat->m[2][1] + Mat->m[3][1],
480 x * Mat->m[0][2] +
y * Mat->m[1][2] +
z * Mat->m[2][2] + Mat->m[3][2]);
486 class ShadowMatrix3x3{
public:
float m[3][3]; };
487 const ShadowMatrix3x3* Mat = (
const ShadowMatrix3x3*)&mat;
489 float xp =
x * Mat->m[0][0] +
y * Mat->m[1][0] +
z * Mat->m[2][0];
490 float yp =
x * Mat->m[0][1] +
y * Mat->m[1][1] +
z * Mat->m[2][1];
491 float zp =
x * Mat->m[0][2] +
y * Mat->m[1][2] +
z * Mat->m[2][2];
493 x = xp;
y = yp;
z = zp;
501 class ShadowMatrix4x4{
public:
float m[4][4]; };
502 const ShadowMatrix4x4* Mat = (
const ShadowMatrix4x4*)&mat;
504 float xp =
x * Mat->m[0][0] +
y * Mat->m[1][0] +
z * Mat->m[2][0] + Mat->m[3][0];
505 float yp =
x * Mat->m[0][1] +
y * Mat->m[1][1] +
z * Mat->m[2][1] + Mat->m[3][1];
506 float zp =
x * Mat->m[0][2] +
y * Mat->m[1][2] +
z * Mat->m[2][2] + Mat->m[3][2];
508 x = xp;
y = yp;
z = zp;
528 #endif //__ICEPOINT_H__