mirror of
https://github.com/AxioDL/metaforce.git
synced 2025-12-09 05:47:42 +00:00
Refactors to support fog volume rendering
This commit is contained in:
67
Runtime/Graphics/Shaders/CFogVolumePlaneShader.cpp
Normal file
67
Runtime/Graphics/Shaders/CFogVolumePlaneShader.cpp
Normal file
@@ -0,0 +1,67 @@
|
||||
#include "CFogVolumePlaneShader.hpp"
|
||||
|
||||
namespace urde
|
||||
{
|
||||
|
||||
void CFogVolumePlaneShader::CommitResources(size_t capacity)
|
||||
{
|
||||
m_vertCapacity = capacity;
|
||||
m_token = CGraphics::CommitResources([this, capacity](boo::IGraphicsDataFactory::Context& ctx)
|
||||
{
|
||||
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(zeus::CVector4f), capacity);
|
||||
TShader<CFogVolumePlaneShader>::BuildShaderDataBinding(ctx, *this);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
void CFogVolumePlaneShader::addFan(const zeus::CVector3f* verts, int numVerts)
|
||||
{
|
||||
if (numVerts == 3)
|
||||
{
|
||||
zeus::CMatrix4f proj = CGraphics::GetPerspectiveProjectionMatrix(true);
|
||||
zeus::CVector4f vert0 = proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[0]);
|
||||
if (m_verts.size())
|
||||
{
|
||||
m_verts.push_back(m_verts.back());
|
||||
m_verts.push_back(vert0);
|
||||
}
|
||||
m_verts.push_back(vert0);
|
||||
m_verts.push_back(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[1]));
|
||||
m_verts.push_back(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[2]));
|
||||
m_verts.push_back(m_verts.back());
|
||||
}
|
||||
else if (numVerts == 4)
|
||||
{
|
||||
zeus::CMatrix4f proj = CGraphics::GetPerspectiveProjectionMatrix(true);
|
||||
zeus::CVector4f vert0 = proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[0]);
|
||||
if (m_verts.size())
|
||||
{
|
||||
m_verts.push_back(m_verts.back());
|
||||
m_verts.push_back(vert0);
|
||||
}
|
||||
m_verts.push_back(vert0);
|
||||
m_verts.push_back(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[1]));
|
||||
m_verts.push_back(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[3]));
|
||||
m_verts.push_back(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[2]));
|
||||
}
|
||||
}
|
||||
|
||||
void CFogVolumePlaneShader::draw(int pass)
|
||||
{
|
||||
if (m_verts.empty())
|
||||
return;
|
||||
if (pass == 0)
|
||||
{
|
||||
if (m_vertCapacity < m_verts.size())
|
||||
CommitResources(m_verts.size());
|
||||
m_vbo->load(m_verts.data(), m_verts.size() * sizeof(zeus::CVector4f));
|
||||
}
|
||||
CGraphics::SetShaderDataBinding(m_dataBinds[pass]);
|
||||
CGraphics::DrawArray(0, m_verts.size());
|
||||
}
|
||||
|
||||
void CFogVolumePlaneShader::Shutdown() {}
|
||||
|
||||
URDE_SPECIALIZE_SHADER(CFogVolumePlaneShader)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user