mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-12 18:51:15 +00:00
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
#pragma once
|
|
|
|
#include "miniwin/d3drm.h"
|
|
|
|
#include <math.h>
|
|
|
|
typedef D3DVALUE Matrix3x3[3][3];
|
|
|
|
inline D3DVECTOR TransformNormal(const D3DVECTOR& v, const Matrix3x3& m)
|
|
{
|
|
return {
|
|
v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0],
|
|
v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1],
|
|
v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2]
|
|
};
|
|
}
|
|
|
|
inline D3DVECTOR Normalize(const D3DVECTOR& v)
|
|
{
|
|
float len = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
|
|
if (len > 0.0f) {
|
|
float invLen = 1.0f / len;
|
|
return {v.x * invLen, v.y * invLen, v.z * invLen};
|
|
}
|
|
return {0, 0, 0};
|
|
}
|
|
|
|
inline float DotProduct(const D3DVECTOR& a, const D3DVECTOR& b)
|
|
{
|
|
return a.x * b.x + a.y * b.y + a.z * b.z;
|
|
}
|
|
|
|
inline D3DVECTOR CrossProduct(const D3DVECTOR& a, const D3DVECTOR& b)
|
|
{
|
|
return {a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x};
|
|
}
|
|
|
|
inline D3DVECTOR TransformPoint(const D3DVECTOR& p, const D3DRMMATRIX4D& m)
|
|
{
|
|
return {
|
|
p.x * m[0][0] + p.y * m[1][0] + p.z * m[2][0] + m[3][0],
|
|
p.x * m[0][1] + p.y * m[1][1] + p.z * m[2][1] + m[3][1],
|
|
p.x * m[0][2] + p.y * m[1][2] + p.z * m[2][2] + m[3][2]
|
|
};
|
|
}
|
|
|
|
inline void MultiplyMatrix(D3DRMMATRIX4D& out, const D3DRMMATRIX4D& a, const D3DRMMATRIX4D& b)
|
|
{
|
|
for (int row = 0; row < 4; ++row) {
|
|
for (int col = 0; col < 4; ++col) {
|
|
out[row][col] = 0.0;
|
|
for (int k = 0; k < 4; ++k) {
|
|
out[row][col] += a[row][k] * b[k][col];
|
|
}
|
|
}
|
|
}
|
|
}
|