365 lines
11 KiB
C++
365 lines
11 KiB
C++
// ========================================
|
|
// renderer/Shadows/CascadeShadowsDebug.cpp
|
|
// (c) 2011 RockstarNorth
|
|
// ========================================
|
|
|
|
#if __BANK
|
|
|
|
#include "grcore/debugdraw.h"
|
|
#include "grcore/device.h"
|
|
#include "grcore/im.h"
|
|
#include "system/memops.h"
|
|
|
|
#include "fwutil/xmacro.h"
|
|
|
|
#include "renderer/Shadows/CascadeShadowsDebug.h"
|
|
|
|
RENDER_OPTIMISATIONS()
|
|
|
|
// ================================================================================================
|
|
|
|
static __forceinline Vec2V_Out Project2D(Vec3V_In p, Mat44V_In proj, Vec4V_In projWindow)
|
|
{
|
|
const Vec4V temp = Multiply(proj, Vec4V(p, ScalarV(V_ONE)));
|
|
const Vec2V scrp = (temp.GetXY()*Vec2V(0.5f, -0.5f))/temp.GetW() + Vec2V(V_HALF); // [0..1]
|
|
|
|
const Vec2V projOffset = projWindow.GetXY();
|
|
const Vec2V projScale = projWindow.GetZW();
|
|
|
|
return (projOffset + projScale*scrp)*Vec2V(1.0f/(float)GRCDEVICE.GetWidth(), 1.0f/(float)GRCDEVICE.GetHeight()); // [0..1]
|
|
}
|
|
|
|
static __forceinline Vec2V_Out Project2D_grcVertex(Vec3V_In p, Mat44V_In proj, Vec4V_In projWindow)
|
|
{
|
|
return Vec2V(-1.0f, 1.0f) + Vec2V(2.0f, -2.0f)*Project2D(p, proj, projWindow); // [-1..1]
|
|
}
|
|
|
|
// ================================================================================================
|
|
|
|
CCSMDebugLine::CCSMDebugLine(const Color32& colour, float opacity, int flags, Vec3V_In p0, Vec3V_In p1) : CCSMDebugObject(colour, opacity, flags)
|
|
{
|
|
m_points[0] = p0;
|
|
m_points[1] = p1;
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugLine::Draw_grcVertex(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D_grcVertex(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D_grcVertex(m_points[1], proj, projWindow);
|
|
|
|
grcBegin(drawLines, 2);
|
|
grcColor(colour);
|
|
|
|
grcVertex2f(p0);
|
|
grcVertex2f(p1);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugLine::Draw_grcVertex(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcBegin(drawLines, 2);
|
|
grcColor(colour);
|
|
|
|
grcVertex3f(m_points[0]);
|
|
grcVertex3f(m_points[1]);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugLine::Draw_fwDebugDraw(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D(m_points[1], proj, projWindow);
|
|
|
|
grcDebugDraw::Line(p0, p1, colour);
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugLine::Draw_fwDebugDraw(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcDebugDraw::Line(m_points[0], m_points[1], colour);
|
|
}
|
|
|
|
// ================================================================================================
|
|
|
|
CCSMDebugTri::CCSMDebugTri(const Color32& colour, float opacity, int flags, Vec3V_In p0, Vec3V_In p1, Vec3V_In p2) : CCSMDebugObject(colour, opacity, flags)
|
|
{
|
|
m_points[0] = p0;
|
|
m_points[1] = p1;
|
|
m_points[2] = p2;
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugTri::Draw_grcVertex(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D_grcVertex(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D_grcVertex(m_points[1], proj, projWindow);
|
|
const Vec2V p2 = Project2D_grcVertex(m_points[2], proj, projWindow);
|
|
|
|
grcBegin(drawTris, 3);
|
|
grcColor(colour);
|
|
|
|
grcVertex2f(p0);
|
|
grcVertex2f(p1);
|
|
grcVertex2f(p2);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugTri::Draw_grcVertex(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcBegin(drawTris, 3);
|
|
grcColor(colour);
|
|
|
|
grcVertex3f(m_points[0]);
|
|
grcVertex3f(m_points[1]);
|
|
grcVertex3f(m_points[2]);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugTri::Draw_fwDebugDraw(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D(m_points[1], proj, projWindow);
|
|
const Vec2V p2 = Project2D(m_points[2], proj, projWindow);
|
|
|
|
grcDebugDraw::Poly(p0, p1, p2, colour);
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugTri::Draw_fwDebugDraw(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcDebugDraw::Poly(m_points[0], m_points[1], m_points[2], colour);
|
|
}
|
|
|
|
// ================================================================================================
|
|
|
|
CCSMDebugBox::CCSMDebugBox(const Color32& colour, float opacity, int flags, Vec3V_In boxMin, Vec3V_In boxMax) : CCSMDebugObject(colour, opacity, flags)
|
|
{
|
|
const ScalarV x0 = boxMin.GetX();
|
|
const ScalarV y0 = boxMin.GetY();
|
|
const ScalarV z0 = boxMin.GetZ();
|
|
const ScalarV x1 = boxMax.GetX();
|
|
const ScalarV y1 = boxMax.GetY();
|
|
const ScalarV z1 = boxMax.GetZ();
|
|
|
|
m_points[0] = Vec3V(x0, y0, z0);
|
|
m_points[1] = Vec3V(x1, y0, z0);
|
|
m_points[2] = Vec3V(x0, y1, z0);
|
|
m_points[3] = Vec3V(x1, y1, z0);
|
|
m_points[4] = Vec3V(x0, y0, z1);
|
|
m_points[5] = Vec3V(x1, y0, z1);
|
|
m_points[6] = Vec3V(x0, y1, z1);
|
|
m_points[7] = Vec3V(x1, y1, z1);
|
|
}
|
|
|
|
CCSMDebugBox::CCSMDebugBox(const Color32& colour, float opacity, int flags, Mat34V_In viewToWorld, ScalarV_In tanHFOV, ScalarV_In tanVFOV, ScalarV_In z0, ScalarV_In z1) : CCSMDebugObject(colour, opacity, flags)
|
|
{
|
|
m_points[0] = Transform(viewToWorld, Vec3V(-tanHFOV, -tanVFOV, ScalarV(V_NEGONE))*z0);
|
|
m_points[1] = Transform(viewToWorld, Vec3V(+tanHFOV, -tanVFOV, ScalarV(V_NEGONE))*z0);
|
|
m_points[2] = Transform(viewToWorld, Vec3V(-tanHFOV, +tanVFOV, ScalarV(V_NEGONE))*z0);
|
|
m_points[3] = Transform(viewToWorld, Vec3V(+tanHFOV, +tanVFOV, ScalarV(V_NEGONE))*z0);
|
|
m_points[4] = Transform(viewToWorld, Vec3V(-tanHFOV, -tanVFOV, ScalarV(V_NEGONE))*z1);
|
|
m_points[5] = Transform(viewToWorld, Vec3V(+tanHFOV, -tanVFOV, ScalarV(V_NEGONE))*z1);
|
|
m_points[6] = Transform(viewToWorld, Vec3V(-tanHFOV, +tanVFOV, ScalarV(V_NEGONE))*z1);
|
|
m_points[7] = Transform(viewToWorld, Vec3V(+tanHFOV, +tanVFOV, ScalarV(V_NEGONE))*z1);
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugBox::Draw_grcVertex(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D_grcVertex(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D_grcVertex(m_points[1], proj, projWindow);
|
|
const Vec2V p2 = Project2D_grcVertex(m_points[2], proj, projWindow);
|
|
const Vec2V p3 = Project2D_grcVertex(m_points[3], proj, projWindow);
|
|
const Vec2V p4 = Project2D_grcVertex(m_points[4], proj, projWindow);
|
|
const Vec2V p5 = Project2D_grcVertex(m_points[5], proj, projWindow);
|
|
const Vec2V p6 = Project2D_grcVertex(m_points[6], proj, projWindow);
|
|
const Vec2V p7 = Project2D_grcVertex(m_points[7], proj, projWindow);
|
|
|
|
grcBegin(drawLines, 24);
|
|
grcColor(colour);
|
|
|
|
grcVertex2f(p0); grcVertex2f(p2);
|
|
grcVertex2f(p2); grcVertex2f(p3);
|
|
grcVertex2f(p3); grcVertex2f(p1);
|
|
grcVertex2f(p1); grcVertex2f(p0);
|
|
|
|
grcVertex2f(p4); grcVertex2f(p6);
|
|
grcVertex2f(p6); grcVertex2f(p7);
|
|
grcVertex2f(p7); grcVertex2f(p5);
|
|
grcVertex2f(p5); grcVertex2f(p4);
|
|
|
|
grcVertex2f(p0); grcVertex2f(p4);
|
|
grcVertex2f(p1); grcVertex2f(p5);
|
|
grcVertex2f(p2); grcVertex2f(p6);
|
|
grcVertex2f(p3); grcVertex2f(p7);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugBox::Draw_grcVertex(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcBegin(drawLines, 24);
|
|
grcColor(colour);
|
|
|
|
grcVertex3f(m_points[0]); grcVertex3f(m_points[2]);
|
|
grcVertex3f(m_points[2]); grcVertex3f(m_points[3]);
|
|
grcVertex3f(m_points[3]); grcVertex3f(m_points[1]);
|
|
grcVertex3f(m_points[1]); grcVertex3f(m_points[0]);
|
|
|
|
grcVertex3f(m_points[4]); grcVertex3f(m_points[6]);
|
|
grcVertex3f(m_points[6]); grcVertex3f(m_points[7]);
|
|
grcVertex3f(m_points[7]); grcVertex3f(m_points[5]);
|
|
grcVertex3f(m_points[5]); grcVertex3f(m_points[4]);
|
|
|
|
grcVertex3f(m_points[0]); grcVertex3f(m_points[4]);
|
|
grcVertex3f(m_points[1]); grcVertex3f(m_points[5]);
|
|
grcVertex3f(m_points[2]); grcVertex3f(m_points[6]);
|
|
grcVertex3f(m_points[3]); grcVertex3f(m_points[7]);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugBox::Draw_fwDebugDraw(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
const Vec2V p0 = Project2D(m_points[0], proj, projWindow);
|
|
const Vec2V p1 = Project2D(m_points[1], proj, projWindow);
|
|
const Vec2V p2 = Project2D(m_points[2], proj, projWindow);
|
|
const Vec2V p3 = Project2D(m_points[3], proj, projWindow);
|
|
const Vec2V p4 = Project2D(m_points[4], proj, projWindow);
|
|
const Vec2V p5 = Project2D(m_points[5], proj, projWindow);
|
|
const Vec2V p6 = Project2D(m_points[6], proj, projWindow);
|
|
const Vec2V p7 = Project2D(m_points[7], proj, projWindow);
|
|
|
|
grcDebugDraw::Line(p0, p2, colour);
|
|
grcDebugDraw::Line(p2, p3, colour);
|
|
grcDebugDraw::Line(p3, p1, colour);
|
|
grcDebugDraw::Line(p1, p0, colour);
|
|
|
|
grcDebugDraw::Line(p4, p6, colour);
|
|
grcDebugDraw::Line(p6, p7, colour);
|
|
grcDebugDraw::Line(p7, p5, colour);
|
|
grcDebugDraw::Line(p5, p4, colour);
|
|
|
|
grcDebugDraw::Line(p0, p4, colour);
|
|
grcDebugDraw::Line(p1, p5, colour);
|
|
grcDebugDraw::Line(p2, p6, colour);
|
|
grcDebugDraw::Line(p3, p7, colour);
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugBox::Draw_fwDebugDraw(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcDebugDraw::Line(m_points[0], m_points[2], colour);
|
|
grcDebugDraw::Line(m_points[2], m_points[3], colour);
|
|
grcDebugDraw::Line(m_points[3], m_points[1], colour);
|
|
grcDebugDraw::Line(m_points[1], m_points[0], colour);
|
|
|
|
grcDebugDraw::Line(m_points[4], m_points[6], colour);
|
|
grcDebugDraw::Line(m_points[6], m_points[7], colour);
|
|
grcDebugDraw::Line(m_points[7], m_points[5], colour);
|
|
grcDebugDraw::Line(m_points[5], m_points[4], colour);
|
|
|
|
grcDebugDraw::Line(m_points[0], m_points[4], colour);
|
|
grcDebugDraw::Line(m_points[1], m_points[5], colour);
|
|
grcDebugDraw::Line(m_points[2], m_points[6], colour);
|
|
grcDebugDraw::Line(m_points[3], m_points[7], colour);
|
|
}
|
|
|
|
// ================================================================================================
|
|
|
|
CCSMDebugSphere::CCSMDebugSphere(const Color32& colour, float opacity, int flags, Vec4V_In sphere) : CCSMDebugObject(colour, opacity, flags)
|
|
{
|
|
m_sphere = sphere;
|
|
|
|
sysMemSet(m_points, 0, sizeof(m_points));
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugSphere::Draw_grcVertex(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcBegin(drawLineStrip, kNumSegments + 1);
|
|
grcColor(colour);
|
|
|
|
for (int i = 0; i < kNumSegments; i++)
|
|
{
|
|
grcVertex2f(Project2D_grcVertex(m_points[i], proj, projWindow));
|
|
}
|
|
|
|
grcVertex2f(Project2D_grcVertex(m_points[0], proj, projWindow));
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugSphere::Draw_grcVertex(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
grcBegin(drawLineStrip, kNumSegments + 1);
|
|
grcColor(colour);
|
|
|
|
for (int i = 0; i < kNumSegments; i++)
|
|
{
|
|
grcVertex3f(m_points[i]);
|
|
}
|
|
|
|
grcVertex3f(m_points[0]);
|
|
|
|
grcEnd();
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugSphere::Draw_fwDebugDraw(Mat44V_In proj, Vec4V_In projWindow, int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
Vec2V p0 = Project2D(m_points[kNumSegments - 1], proj, projWindow);
|
|
|
|
for (int i = 0; i < kNumSegments; i++)
|
|
{
|
|
const Vec2V p1 = Project2D(m_points[i], proj, projWindow);
|
|
|
|
grcDebugDraw::Line(p0, p1, colour);
|
|
p0 = p1;
|
|
}
|
|
}
|
|
|
|
__COMMENT(virtual) void CCSMDebugSphere::Draw_fwDebugDraw(int opacityShift) const
|
|
{
|
|
const Color32 colour = GetColour(opacityShift);
|
|
|
|
Vec3V p0 = m_points[kNumSegments - 1];
|
|
|
|
for (int i = 0; i < kNumSegments; i++)
|
|
{
|
|
const Vec3V p1 = m_points[i];
|
|
|
|
grcDebugDraw::Line(p0, p1, colour);
|
|
p0 = p1;
|
|
}
|
|
}
|
|
|
|
#endif // __BANK
|