2021-08-07 18:57:13 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <string>
|
2021-08-08 13:12:44 -04:00
|
|
|
#include <memory>
|
2021-10-31 13:12:50 -04:00
|
|
|
#include "common/dma/dma_chain_read.h"
|
2021-08-07 18:57:13 -04:00
|
|
|
#include "game/graphics/opengl_renderer/Shader.h"
|
2021-08-08 13:12:44 -04:00
|
|
|
#include "game/graphics/texture/TexturePool.h"
|
2021-10-10 20:07:03 -04:00
|
|
|
#include "game/graphics/opengl_renderer/Profiler.h"
|
2021-12-04 12:33:18 -05:00
|
|
|
#include "game/graphics/opengl_renderer/Loader.h"
|
2021-08-07 18:57:13 -04:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* Matches the bucket-id enum in GOAL
|
|
|
|
*/
|
|
|
|
enum class BucketId {
|
|
|
|
BUCKET0 = 0,
|
|
|
|
BUCKET1 = 1,
|
2021-10-10 20:07:03 -04:00
|
|
|
SKY_DRAW = 3,
|
2021-09-26 11:41:58 -04:00
|
|
|
TFRAG_TEX_LEVEL0 = 5,
|
2021-11-13 20:44:17 -05:00
|
|
|
TFRAG_LEVEL0 = 6,
|
2021-12-26 12:33:51 -05:00
|
|
|
TIE_LEVEL0 = 9,
|
2021-10-23 16:00:49 -04:00
|
|
|
TFRAG_TEX_LEVEL1 = 12,
|
2021-11-13 20:44:17 -05:00
|
|
|
TFRAG_LEVEL1 = 13,
|
2021-12-26 12:33:51 -05:00
|
|
|
TIE_LEVEL1 = 16,
|
2021-09-26 11:41:58 -04:00
|
|
|
SHRUB_TEX_LEVEL0 = 19,
|
2021-10-23 16:00:49 -04:00
|
|
|
SHRUB_TEX_LEVEL1 = 25,
|
2021-09-26 11:41:58 -04:00
|
|
|
ALPHA_TEX_LEVEL0 = 31,
|
2021-11-13 20:44:17 -05:00
|
|
|
TFRAG_TRANS0_AND_SKY_BLEND_LEVEL0 = 32,
|
|
|
|
TFRAG_DIRT_LEVEL0 = 34,
|
2021-10-23 16:00:49 -04:00
|
|
|
ALPHA_TEX_LEVEL1 = 38,
|
2021-11-13 20:44:17 -05:00
|
|
|
TFRAG_TRANS1_AND_SKY_BLEND_LEVEL1 = 39,
|
|
|
|
TFRAG_DIRT_LEVEL1 = 41,
|
2021-09-26 11:41:58 -04:00
|
|
|
PRIS_TEX_LEVEL0 = 48,
|
2021-10-23 16:00:49 -04:00
|
|
|
PRIS_TEX_LEVEL1 = 51,
|
2021-09-26 11:41:58 -04:00
|
|
|
WATER_TEX_LEVEL0 = 57,
|
2021-10-23 16:00:49 -04:00
|
|
|
WATER_TEX_LEVEL1 = 60,
|
2021-08-07 18:57:13 -04:00
|
|
|
// ...
|
2021-09-26 11:41:58 -04:00
|
|
|
PRE_SPRITE_TEX = 65, // maybe it's just common textures?
|
2021-09-08 22:04:30 -04:00
|
|
|
SPRITE = 66,
|
2021-08-07 18:57:13 -04:00
|
|
|
DEBUG_DRAW_0 = 67,
|
|
|
|
DEBUG_DRAW_1 = 68,
|
|
|
|
MAX_BUCKETS = 69
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* The main renderer will contain a single SharedRenderState that's passed to all bucket renderers.
|
|
|
|
* This allows bucket renders to share textures and shaders.
|
|
|
|
*/
|
|
|
|
struct SharedRenderState {
|
2021-08-08 13:12:44 -04:00
|
|
|
explicit SharedRenderState(std::shared_ptr<TexturePool> _texture_pool)
|
|
|
|
: texture_pool(_texture_pool) {}
|
2021-08-07 18:57:13 -04:00
|
|
|
ShaderLibrary shaders;
|
2021-08-08 13:12:44 -04:00
|
|
|
std::shared_ptr<TexturePool> texture_pool;
|
2021-12-04 12:33:18 -05:00
|
|
|
Loader loader;
|
|
|
|
|
2021-08-07 18:57:13 -04:00
|
|
|
u32 buckets_base = 0; // address of buckets array.
|
|
|
|
u32 next_bucket = 0; // address of next bucket that we haven't started rendering in buckets
|
|
|
|
u32 default_regs_buffer = 0; // address of the default regs chain.
|
2021-09-26 11:41:58 -04:00
|
|
|
|
|
|
|
void* ee_main_memory = nullptr;
|
|
|
|
u32 offset_of_s7;
|
|
|
|
bool dump_playback = false;
|
2021-08-07 18:57:13 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Interface for bucket renders. Each bucket will have its own BucketRenderer.
|
|
|
|
*/
|
|
|
|
class BucketRenderer {
|
|
|
|
public:
|
|
|
|
BucketRenderer(const std::string& name, BucketId my_id) : m_name(name), m_my_id(my_id) {}
|
2021-10-10 20:07:03 -04:00
|
|
|
virtual void render(DmaFollower& dma,
|
|
|
|
SharedRenderState* render_state,
|
|
|
|
ScopedProfilerNode& prof) = 0;
|
2021-08-07 18:57:13 -04:00
|
|
|
std::string name_and_id() const;
|
|
|
|
virtual ~BucketRenderer() = default;
|
2021-08-29 14:54:16 -04:00
|
|
|
bool& enabled() { return m_enabled; }
|
|
|
|
virtual bool empty() const { return false; }
|
2021-09-26 11:41:58 -04:00
|
|
|
virtual void draw_debug_window() = 0;
|
|
|
|
virtual void serialize(Serializer&) {}
|
2021-08-07 18:57:13 -04:00
|
|
|
|
|
|
|
protected:
|
|
|
|
std::string m_name;
|
|
|
|
BucketId m_my_id;
|
2021-08-29 14:54:16 -04:00
|
|
|
bool m_enabled = true;
|
2021-08-07 18:57:13 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* Renderer that makes sure the bucket is empty and ignores it.
|
|
|
|
*/
|
|
|
|
class EmptyBucketRenderer : public BucketRenderer {
|
|
|
|
public:
|
|
|
|
EmptyBucketRenderer(const std::string& name, BucketId my_id);
|
2021-10-10 20:07:03 -04:00
|
|
|
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
2021-08-29 14:54:16 -04:00
|
|
|
bool empty() const override { return true; }
|
2021-09-26 11:41:58 -04:00
|
|
|
void draw_debug_window() override {}
|
2021-11-13 20:44:17 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
class SkipRenderer : public BucketRenderer {
|
|
|
|
public:
|
|
|
|
SkipRenderer(const std::string& name, BucketId my_id);
|
|
|
|
void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override;
|
|
|
|
bool empty() const override { return true; }
|
|
|
|
void draw_debug_window() override {}
|
2021-08-07 18:57:13 -04:00
|
|
|
};
|