Files
Client/Engine/Zalla3D Base Class/matrix.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

333 lines
7.8 KiB
C++

// matrix.cpp: implementation of the matrix class.
//
//////////////////////////////////////////////////////////////////////
#include "matrix.h"
#include <math.h>
#include "GMMemory.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void matrix::XRotation(float theta)
{
float c = (float) cos(theta);
float s = (float) sin(theta);
MakeIdent();
_22 = c;
_23 = s;
_32 = -s;
_33 = c;
}
void matrix::YRotation(float theta)
{
float c = (float) cos(theta);
float s = (float) sin(theta);
MakeIdent();
_11 = c;
_13 = -s;
_31 = s;
_33 = c;
}
void matrix::ZRotation(float theta)
{
float c = (float) cos(theta);
float s = (float) sin(theta);
MakeIdent();
_11 = c;
_12 = s;
_21 = -s;
_22 = c;
}
void matrix::MakeIdent()
{
_11 = 1.f; _22 = 1.f; _33 = 1.f; _44 = 1.f;
_12 = 0.f; _13 = 0.f; _14 = 0.f; _21 = 0.f;
_23 = 0.f; _24 = 0.f; _31 = 0.f; _32 = 0.f;
_34 = 0.f; _41 = 0.f; _42 = 0.f; _43 = 0.f;
}
void matrix::AxisAngle(const vector3& inaxis, float angle)
{
vector3 axis = inaxis.Normalized();
float s=sinf(angle);
float c=cosf(angle);
float x=axis.x,y=axis.y,z=axis.z;
_11 = x*x*(1-c)+c;
_21 = x*y*(1-c)-(z*s);
_31 = x*z*(1-c)+(y*s);
_41 = 0;
_12 = y*x*(1-c)+(z*s);
_22 = y*y*(1-c)+c;
_32 = y*z*(1-c)-(x*s);
_42 = 0;
_13 = z*x*(1-c)-(y*s);
_23 = z*y*(1-c)+(x*s);
_33 = z*z*(1-c)+c;
_43 = 0;
_14 = 0;
_24 = 0;
_34 = 0;
_44 = 1;
}
void matrix::CameraLookAt(const vector3 &loc, const vector3 &lookAt, const vector3 &inUp)
{
vector3 viewVec=lookAt-loc;
float mag=viewVec.Mag();
viewVec/=mag;
//vector3 viewVec=lookAt;
float fDot=inUp*viewVec;
vector3 upVec=inUp-fDot*viewVec;
upVec.Normalize();
vector3 rightVec=upVec^viewVec;
_11 = rightVec.x; _12 = upVec.x; _13 = viewVec.x;
_21 = rightVec.y; _22 = upVec.y; _23 = viewVec.y;
_31 = rightVec.z; _32 = upVec.z; _33 = viewVec.z;
_41 = - (loc * rightVec);
_42 = - (loc * upVec);
_43 = - (loc * viewVec);
_14 = 0;
_24 = 0;
_34 = 0;
_44 = 1;
}
void matrix::Translation(const vector3 &loc)
{
MakeIdent();
_41=loc.x;
_42=loc.y;
_43=loc.z;
}
void matrix::Inverse(const matrix &in)
{
if( fabs(in._44 - 1.0f) > .001f)
return;
if( fabs(in._14) > .001f || fabs(in._24) > .001f || fabs(in._34) > .001f )
return;
float fDetInv = 1.0f / ( in._11 * ( in._22 * in._33 - in._23 * in._32 ) -
in._12 * ( in._21 * in._33 - in._23 * in._31 ) +
in._13 * ( in._21 * in._32 - in._22 * in._31 ) );
_11 = fDetInv * ( in._22 * in._33 - in._23 * in._32 );
_12 = -fDetInv * ( in._12 * in._33 - in._13 * in._32 );
_13 = fDetInv * ( in._12 * in._23 - in._13 * in._22 );
_14 = 0.0f;
_21 = -fDetInv * ( in._21 * in._33 - in._23 * in._31 );
_22 = fDetInv * ( in._11 * in._33 - in._13 * in._31 );
_23 = -fDetInv * ( in._11 * in._23 - in._13 * in._21 );
_24 = 0.0f;
_31 = fDetInv * ( in._21 * in._32 - in._22 * in._31 );
_32 = -fDetInv * ( in._11 * in._32 - in._12 * in._31 );
_33 = fDetInv * ( in._11 * in._22 - in._12 * in._21 );
_34 = 0.0f;
_41 = -( in._41 * _11 + in._42 * _21 + in._43 * _31 );
_42 = -( in._41 * _12 + in._42 * _22 + in._43 * _32 );
_43 = -( in._41 * _13 + in._42 * _23 + in._43 * _33 );
_44 = 1.0f;
/*
_11 = in._11;
_12 = in._21;
_13 = in._31;
_21 = in._12;
_22 = in._22;
_23 = in._32;
_31 = in._13;
_32 = in._23;
_33 = in._33;
_14 = 0;
_24 = 0;
_34 = 0;
_44 = 1;
// now get the new translation vector
vector3 temp=in.GetLoc();
_41 = -(temp.x * in._11 + temp.y * in._12 + temp.z * in._13);
_42 = -(temp.x * in._21 + temp.y * in._22 + temp.z * in._23);
_43 = -(temp.x * in._31 + temp.y * in._32 + temp.z * in._33);
*/
}
const vector3 matrix::GetLoc() const
{
return vector3(_41,_42,_43);
}
void matrix::MakeProjection(float fFov, float fAspect, float fNear, float fFar)
{
if( fabs(fFar-fNear) <0.01f)
return;
if( fabs(sin(fFov/2)) < 0.01f)
return;
float w=fAspect*(cosf(fFov/2)/sinf(fFov/2));
float h=1.0f*(cosf(fFov/2)/sinf(fFov/2));
float Q=fFar/(fFar-fNear);
ZeroMemory( this, sizeof(matrix) );
_11 = w;
_22 = h;
_33 = Q;
_34 = 1.0f;
_43 = -Q*fNear;
}
matrix operator*(matrix const &a, matrix const &b)
{
matrix out; // temporary matrix4 for storing result
for (int j = 0; j < 4; j++) // transform by columns first
for (int i = 0; i < 4; i++) // then by rows
out.m[i][j] = a.m[i][0] * b.m[0][j] + a.m[i][1] * b.m[1][j] +
a.m[i][2] * b.m[2][j] + a.m[i][3] * b.m[3][j];
return out;
};
vector3 operator*(matrix const &a,vector3 const &b)
{
vector3 vecResult;
vecResult.x=a._11*b.x + a._12*b.y + a._13*b.z + a._14*1.0f;
vecResult.y=a._21*b.x + a._22*b.y + a._23*b.z + a._24*1.0f;
vecResult.z=a._31*b.x + a._32*b.y + a._33*b.z + a._34*1.0f;
return vecResult;
}
vector3 operator*(vector3 const &v, matrix const &m)
{
vector3 vecResult;
vecResult.x = v.x*m._11 + v.y*m._21 + v.z*m._31 + m._41;
vecResult.y = v.x*m._12 + v.y*m._22 + v.z*m._32 + m._42;
vecResult.z = v.x*m._13 + v.y*m._23 + v.z*m._33 + m._43;
return vecResult;
}
bool operator==(matrix const &a,matrix const &b)
{
if( a._11 == b._11 && a._12 == b._12 && a._13 == b._13 && a._14 == b._14 &&
a._21 == b._21 && a._22 == b._22 && a._23 == b._13 && a._24 == b._24 &&
a._31 == b._31 && a._32 == b._32 && a._33 == b._13 && a._34 == b._34 &&
a._41 == b._41 && a._42 == b._42 && a._43 == b._13 && a._44 == b._44)
return true;
return false;
}
void matrix::Rotation(vector3 vecDir, float fAngle)
{
float fCos=cosf(fAngle);
float fSin=sinf(fAngle);
vecDir.Normalize();
vector3 v=vecDir;
_11 = ( v.x * v.x ) * ( 1.0f - fCos ) + fCos;
_12 = ( v.x * v.y ) * ( 1.0f - fCos ) - (v.z * fSin);
_13 = ( v.x * v.z ) * ( 1.0f - fCos ) + (v.y * fSin);
_21 = ( v.y * v.x ) * ( 1.0f - fCos ) + (v.z * fSin);
_22 = ( v.y * v.y ) * ( 1.0f - fCos ) + fCos ;
_23 = ( v.y * v.z ) * ( 1.0f - fCos ) - (v.x * fSin);
_31 = ( v.z * v.x ) * ( 1.0f - fCos ) - (v.y * fSin);
_32 = ( v.z * v.y ) * ( 1.0f - fCos ) + (v.x * fSin);
_33 = ( v.z * v.z ) * ( 1.0f - fCos ) + fCos;
_14 = _24 = _34 = 0.0f;
_41 = _42 = _43 = 0.0f;
_44 = 1.0f;
}
void matrix::MakeAdjustedProjectionMatrix(float fFov, float fAspect, float fNear, float fFar, float fPixDx, float fPixDy, float fVPWidth, float fVPHeight)
{
float h = 1.0f * ( cosf(fFov/2)/sinf(fFov/2) );
float fTop = fNear/h;
float fBottom = -fTop;
float fRight = fTop * fAspect;
float fLeft = -fRight;
float fXWSize = fRight - fLeft;
float fYWSize = fTop - fBottom;
float fDx = -( fPixDx*fXWSize/fVPWidth );
float fDy = -( fPixDy*fYWSize/fVPHeight );
SetFrustumMatrix(fLeft+fDx, fRight+fDx, fTop+fDy, fBottom+fDy, fNear,fFar);
}
void matrix::SetFrustumMatrix(float fLeft, float fRight, float fTop, float fBottom, float fNearPlane, float fFarPlane)
{
float Q = fFarPlane / ( fFarPlane - fNearPlane );
ZeroMemory(this,sizeof(matrix));
_11 = ( 2.0f*fNearPlane )/( fRight - fLeft );
_22 = ( 2.0f*fNearPlane )/( fTop - fBottom );
_31 = ( fRight + fLeft )/ (fRight - fLeft );
_32 = ( fTop + fBottom )/ (fTop - fBottom );
_33 = Q;
_34 = 1.0f;
_43 = -Q*fNearPlane;
}
void matrix::MakeNoProjection(float fFov, float fSizeX, float fSizeY, float fFarPlane, float fNearPlane)
{
ZeroMemory(this,sizeof(matrix));
_11=2.0f/fSizeX;
_22=2.0f/fSizeY;
_33=1.0f/(fFarPlane-fNearPlane);
_43=-1.0f*fNearPlane/(fFarPlane-fNearPlane);
_44=1.0f;
}
void matrix::Transpose()
{
float t_12,t_13,t_14,t_23,t_24,t_34;
t_12=_12;
t_13=_13;
t_14=_14;
t_23=_23;
t_24=_24;
t_34=_34;
_12=_21;
_13=_31;
_14=_41;
_23=_32;
_24=_42;
_34=_43;
_21=t_12;
_31=t_13;
_41=t_14;
_32=t_23;
_42=t_24;
_43=t_34;
}