r5sdk/r5dev/engine/gl_rmain.cpp
2022-10-23 01:20:49 +02:00

68 lines
2.0 KiB
C++

//=====================================================================================//
//
// Purpose:
//
// $NoKeywords: $
//=====================================================================================//
#include "core/stdafx.h"
#ifndef DEDICATED
#include "engine/gl_rmain.h"
#include "materialsystem/cmaterialsystem.h"
//-----------------------------------------------------------------------------
// Purpose: compute the scene coordinates of a point in 3D
// Input : &w2sMatrix -
// &point -
// *pClip -
// Output : is offscreen?
//-----------------------------------------------------------------------------
bool ClipTransform(const VMatrix& w2sMatrix, const Vector3D& point, Vector3D* pClip)
{
pClip->x = w2sMatrix[0][0] * point.x + w2sMatrix[0][1] * point.y + w2sMatrix[0][2] * point.z + w2sMatrix[0][3];
pClip->y = w2sMatrix[1][0] * point.x + w2sMatrix[1][1] * point.y + w2sMatrix[1][2] * point.z + w2sMatrix[1][3];
pClip->z = 0.0f;
float w = w2sMatrix[3][0] * point.x + w2sMatrix[3][1] * point.y + w2sMatrix[3][2] * point.z + w2sMatrix[3][3];
if (w < 0.001f)
{
// Clamp here.
pClip->x *= 100000;
pClip->y *= 100000;
return true;
}
float invw = 1.0f / w;
pClip->x *= invw;
pClip->y *= invw;
return false;
}
//-----------------------------------------------------------------------------
// Purpose: translate point to screen position
// Input : &transformInfo -
// &w2sMatrix -
// &point -
// *pClip -
// Output : is offscreen?
//-----------------------------------------------------------------------------
bool ScreenTransform(const TransformInfo_t& transformInfo, const VMatrix& w2sMatrix, const Vector3D& point, Vector3D* pClip)
{
bool bIsOffscreen = ClipTransform(w2sMatrix, point, pClip);
// is offscreen?
if (!bIsOffscreen)
{
pClip->x = (transformInfo.width * 0.5f) + (pClip->x * transformInfo.width) * 0.5f + transformInfo.posX;
pClip->y = (transformInfo.height * 0.5f) - (pClip->y * transformInfo.height) * 0.5f + transformInfo.posY;
return true;
}
return false;
}
#endif