2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-21 13:39:12 +00:00

Very, very incomplete integration of hsh/boo2

This commit is contained in:
Jack Andersen
2020-09-28 10:54:40 -10:00
parent 5b4441ac36
commit 3827f35227
179 changed files with 50303 additions and 4995 deletions

View File

@@ -2,64 +2,83 @@
#include "Runtime/Graphics/CGraphics.hpp"
#include <hecl/Pipeline.hpp>
#include "CFogVolumePlaneShader.cpp.hshhead"
namespace urde {
using namespace hsh::pipeline;
static std::array<boo::ObjToken<boo::IShaderPipeline>, 4> s_Pipelines;
template <size_t I>
struct CFogVolumePlanePipelineConfig : pipeline<color_attachment<>> {};
void CFogVolumePlaneShader::Initialize() {
s_Pipelines[0] = hecl::conv->convert(Shader_CFogVolumePlaneShader0{});
s_Pipelines[1] = hecl::conv->convert(Shader_CFogVolumePlaneShader1{});
s_Pipelines[2] = hecl::conv->convert(Shader_CFogVolumePlaneShader2{});
s_Pipelines[3] = hecl::conv->convert(Shader_CFogVolumePlaneShader3{});
}
using AlphaOnlyAttachment =
color_attachment<hsh::Zero, hsh::Zero, hsh::Add, hsh::One, hsh::Zero, hsh::Add, hsh::CC_Alpha>;
void CFogVolumePlaneShader::Shutdown() {
s_Pipelines[0].reset();
s_Pipelines[1].reset();
s_Pipelines[2].reset();
s_Pipelines[3].reset();
}
template <>
struct CFogVolumePlanePipelineConfig<0>
: pipeline<AlphaOnlyAttachment, depth_compare<hsh::LEqual>, depth_write<true>, cull_mode<hsh::CullFront>> {};
template <>
struct CFogVolumePlanePipelineConfig<1>
: pipeline<AlphaOnlyAttachment, depth_compare<hsh::Always>, depth_write<false>, cull_mode<hsh::CullFront>> {};
template <>
struct CFogVolumePlanePipelineConfig<2>
: pipeline<AlphaOnlyAttachment, depth_compare<hsh::LEqual>, depth_write<true>, cull_mode<hsh::CullBack>> {};
template <>
struct CFogVolumePlanePipelineConfig<3>
: pipeline<AlphaOnlyAttachment, depth_compare<hsh::Greater>, depth_write<false>, cull_mode<hsh::CullBack>> {};
template <size_t I>
struct CFogVolumePlanePipeline : CFogVolumePlanePipelineConfig<I> {
CFogVolumePlanePipeline(hsh::vertex_buffer<CFogVolumePlaneShader::Vert> vbo) {
this->position = vbo->pos;
this->color_out[0] = hsh::float4(1.f);
}
};
template struct CFogVolumePlanePipeline<0>;
template struct CFogVolumePlanePipeline<1>;
template struct CFogVolumePlanePipeline<2>;
template struct CFogVolumePlanePipeline<3>;
void CFogVolumePlaneShader::CommitResources(size_t capacity) {
m_vertCapacity = capacity;
CGraphics::CommitResources([this, capacity](boo::IGraphicsDataFactory::Context& ctx) {
m_vbo = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(zeus::CVector4f), capacity);
for (size_t i = 0; i < m_dataBinds.size(); ++i) {
m_dataBinds[i] = ctx.newShaderDataBinding(s_Pipelines[i], m_vbo.get(), nullptr, nullptr, 0, nullptr, nullptr,
nullptr, nullptr, 0, nullptr, nullptr, nullptr);
}
return true;
} BooTrace);
m_vbo = hsh::create_dynamic_vertex_buffer<Vert>(capacity);
for (size_t i = 0; i < m_dataBinds.size(); ++i) {
m_dataBinds[i].hsh_bind(CFogVolumePlanePipeline<i>(m_vbo.get()));
}
}
void CFogVolumePlaneShader::addFan(const zeus::CVector3f* verts, int numVerts) {
void CFogVolumePlaneShader::addFan(const zeus::CVector3f* verts, size_t numVerts) {
zeus::CMatrix4f proj = CGraphics::GetPerspectiveProjectionMatrix(true);
zeus::CVector4f vert0 = proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[0]);
if (m_verts.size()) {
if (!m_verts.empty()) {
m_verts.push_back(m_verts.back());
m_verts.push_back(vert0);
if (m_verts.size() & 1)
m_verts.push_back(vert0);
m_verts.emplace_back(vert0);
if ((m_verts.size() & size_t(1)) != 0) {
m_verts.emplace_back(vert0);
}
}
TriFanToStrip<Vert> fanToStrip(m_verts);
fanToStrip.EmplaceVert(vert0);
for (size_t i = 1; i < numVerts; ++i) {
fanToStrip.EmplaceVert(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[i]));
}
TriFanToStrip<zeus::CVector4f> fanToStrip(m_verts);
fanToStrip.AddVert(vert0);
for (int i = 1; i < numVerts; ++i)
fanToStrip.AddVert(proj * zeus::CVector4f(CGraphics::g_GXModelView * verts[i]));
}
void CFogVolumePlaneShader::draw(int pass) {
if (m_verts.empty())
void CFogVolumePlaneShader::draw(size_t pass) {
if (m_verts.empty()) {
return;
}
SCOPED_GRAPHICS_DEBUG_GROUP("CFogVolumePlaneShader::draw", zeus::skMagenta);
if (pass == 0) {
if (m_vertCapacity < m_verts.size())
if (m_vertCapacity < m_verts.size()) {
CommitResources(m_verts.size());
m_vbo->load(m_verts.data(), m_verts.size() * sizeof(zeus::CVector4f));
}
m_vbo.load(m_verts);
}
CGraphics::SetShaderDataBinding(m_dataBinds[pass]);
CGraphics::DrawArray(0, m_verts.size());
m_dataBinds[pass].draw(0, m_verts.size());
}
} // namespace urde