SuperMarioOdysseyOnline/include/sead/gfx/seadFrameBuffer.h

83 lines
2.8 KiB
C++

#pragma once
#include "gfx/seadColor.h"
#include "math/seadBoundBox.h"
#include "math/seadVector.h"
#include "prim/seadRuntimeTypeInfo.h"
namespace sead
{
class DrawContext;
class DisplayBuffer;
class LogicalFrameBuffer
{
SEAD_RTTI_BASE(LogicalFrameBuffer)
public:
LogicalFrameBuffer(const Vector2f& virtual_size, const BoundBox2f& physical_area)
: mVirtualSize(virtual_size), mPhysicalArea(physical_area)
{
}
LogicalFrameBuffer(const Vector2f& virtual_size, f32 physical_x, f32 physical_y, f32 physical_w,
f32 physical_h)
: mVirtualSize(virtual_size),
mPhysicalArea(physical_x, physical_y, physical_x + physical_w, physical_y + physical_h)
{
}
LogicalFrameBuffer(const Vector2f& virtual_size, f32 physical_x, f32 physical_y, u32 physical_w,
u32 physical_h)
: mVirtualSize(virtual_size),
mPhysicalArea(physical_x, physical_y, physical_x + physical_w, physical_y + physical_h)
{
}
virtual ~LogicalFrameBuffer();
const Vector2f& getVirtualSize() const { return mVirtualSize; }
const BoundBox2f& getPhysicalArea() const { return mPhysicalArea; }
void setVirtualSize(const Vector2f& virtual_size) { mVirtualSize = virtual_size; }
void setPhysicalArea(const BoundBox2f& ph_size)
{
mPhysicalArea.set(ph_size.getMin(), ph_size.getMax());
}
void setPhysicalArea(f32 x, f32 y, f32 w, f32 h) { mPhysicalArea.set(x, y, x + w, y + h); }
void setPhysicalArea(f32 x, f32 y, u32 w, u32 h) { mPhysicalArea.set(x, y, x + w, y + h); }
private:
Vector2f mVirtualSize;
BoundBox2f mPhysicalArea;
};
class FrameBuffer : public LogicalFrameBuffer
{
SEAD_RTTI_OVERRIDE(FrameBuffer, LogicalFrameBuffer)
public:
FrameBuffer(const Vector2f& virtual_size, const BoundBox2f& physical_area)
: LogicalFrameBuffer(virtual_size, physical_area)
{
}
FrameBuffer(const Vector2f& virtual_size, f32 physical_x, f32 physical_y, f32 physical_w,
f32 physical_h)
: LogicalFrameBuffer(virtual_size, physical_x, physical_y, physical_w, physical_h)
{
}
FrameBuffer(const Vector2f& virtual_size, f32 physical_x, f32 physical_y, u32 physical_w,
u32 physical_h)
: LogicalFrameBuffer(virtual_size, physical_x, physical_y, physical_w, physical_h)
{
}
~FrameBuffer() override;
virtual void copyToDisplayBuffer(DrawContext* draw_context,
const DisplayBuffer* display_buffer) const;
virtual void clear(u32 clr_flag, const Color4f& color, f32 depth, u32 stencil) const = 0;
virtual void clearMRT(DrawContext* draw_context, u32 target, const Color4f& color) const;
virtual void bindImpl_() const = 0;
void bind(DrawContext* draw_context) const;
};
} // namespace sead