Rename some Renderer functions to make their intent clearer
This commit is contained in:
parent
4696ba53a5
commit
2552398aff
2 changed files with 60 additions and 49 deletions
|
@ -46,11 +46,11 @@ class Material;
|
||||||
|
|
||||||
class Renderer {
|
class Renderer {
|
||||||
public:
|
public:
|
||||||
Renderer(GFX* gfx, const bool enable_imgui = true);
|
explicit Renderer(GFX* gfx, bool enable_imgui = true);
|
||||||
~Renderer();
|
~Renderer();
|
||||||
|
|
||||||
RenderTarget* allocate_render_target(const prism::Extent extent);
|
RenderTarget* allocate_render_target(prism::Extent extent);
|
||||||
void resize_render_target(RenderTarget& target, const prism::Extent extent);
|
void resize_render_target(RenderTarget& target, prism::Extent extent);
|
||||||
void recreate_all_render_targets();
|
void recreate_all_render_targets();
|
||||||
|
|
||||||
void set_screen(ui::Screen* screen);
|
void set_screen(ui::Screen* screen);
|
||||||
|
@ -66,7 +66,7 @@ public:
|
||||||
void render_screen(GFXCommandBuffer* commandBuffer, ui::Screen* screen, prism::Extent extent, ControllerContinuity& continuity, RenderScreenOptions options = RenderScreenOptions());
|
void render_screen(GFXCommandBuffer* commandBuffer, ui::Screen* screen, prism::Extent extent, ControllerContinuity& continuity, RenderScreenOptions options = RenderScreenOptions());
|
||||||
void render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Object camera_object, Camera& camera, prism::Extent extent, RenderTarget& target, ControllerContinuity& continuity);
|
void render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Object camera_object, Camera& camera, prism::Extent extent, RenderTarget& target, ControllerContinuity& continuity);
|
||||||
|
|
||||||
void create_mesh_pipeline(Material& material);
|
void create_mesh_pipeline(Material& material) const;
|
||||||
|
|
||||||
// passes
|
// passes
|
||||||
template<class T, typename... Args>
|
template<class T, typename... Args>
|
||||||
|
@ -97,9 +97,9 @@ public:
|
||||||
GFXPipeline* renderToUnormTexturePipeline = nullptr;
|
GFXPipeline* renderToUnormTexturePipeline = nullptr;
|
||||||
GFXRenderPass* viewportRenderPass = nullptr;
|
GFXRenderPass* viewportRenderPass = nullptr;
|
||||||
|
|
||||||
ShaderSource register_shader(const std::string_view shader_file);
|
ShaderSource register_shader(std::string_view shader_file);
|
||||||
void associate_shader_reload(const std::string_view shader_file, const std::function<void()> reload_function);
|
void associate_shader_reload(std::string_view shader_file, const std::function<void()>& reload_function);
|
||||||
void reload_shader(const std::string_view shader_file, const std::string_view shader_source);
|
void reload_shader(std::string_view shader_file, std::string_view shader_source);
|
||||||
|
|
||||||
struct RegisteredShader {
|
struct RegisteredShader {
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
@ -111,18 +111,18 @@ public:
|
||||||
|
|
||||||
bool reloading_shader = false;
|
bool reloading_shader = false;
|
||||||
|
|
||||||
std::vector<RenderTarget*> get_all_render_targets() const {
|
[[nodiscard]] std::vector<RenderTarget*> get_all_render_targets() const {
|
||||||
return render_targets;
|
return render_targets;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void createDummyTexture();
|
void createDummyTexture();
|
||||||
void create_render_target_resources(RenderTarget& target);
|
void create_render_target_resources(RenderTarget& target);
|
||||||
void createPostPipeline();
|
void createPostPipelines();
|
||||||
void createFontPipeline();
|
void createFontTexture();
|
||||||
void createSkyPipeline();
|
void createSkyPipeline();
|
||||||
void createUIPipeline();
|
void createUIPipelines();
|
||||||
void createBRDF();
|
void generateBRDF();
|
||||||
void create_histogram_resources();
|
void create_histogram_resources();
|
||||||
|
|
||||||
GFX* gfx = nullptr;
|
GFX* gfx = nullptr;
|
||||||
|
|
|
@ -102,7 +102,7 @@ Renderer::Renderer(GFX* gfx, const bool enable_imgui) : gfx(gfx) {
|
||||||
if(enable_imgui)
|
if(enable_imgui)
|
||||||
addPass<ImGuiPass>();
|
addPass<ImGuiPass>();
|
||||||
|
|
||||||
createBRDF();
|
generateBRDF();
|
||||||
|
|
||||||
GFXRenderPassCreateInfo renderPassInfo = {};
|
GFXRenderPassCreateInfo renderPassInfo = {};
|
||||||
renderPassInfo.label = "Offscreen";
|
renderPassInfo.label = "Offscreen";
|
||||||
|
@ -112,11 +112,11 @@ Renderer::Renderer(GFX* gfx, const bool enable_imgui) : gfx(gfx) {
|
||||||
|
|
||||||
offscreenRenderPass = gfx->create_render_pass(renderPassInfo);
|
offscreenRenderPass = gfx->create_render_pass(renderPassInfo);
|
||||||
|
|
||||||
createFontPipeline();
|
createFontTexture();
|
||||||
createSkyPipeline();
|
createSkyPipeline();
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::~Renderer() {}
|
Renderer::~Renderer() = default;
|
||||||
|
|
||||||
RenderTarget* Renderer::allocate_render_target(const prism::Extent extent) {
|
RenderTarget* Renderer::allocate_render_target(const prism::Extent extent) {
|
||||||
auto target = new RenderTarget();
|
auto target = new RenderTarget();
|
||||||
|
@ -133,7 +133,7 @@ void Renderer::resize_render_target(RenderTarget& target, const prism::Extent ex
|
||||||
|
|
||||||
create_render_target_resources(target);
|
create_render_target_resources(target);
|
||||||
smaaPass->create_render_target_resources(target);
|
smaaPass->create_render_target_resources(target);
|
||||||
createPostPipeline();
|
createPostPipelines();
|
||||||
|
|
||||||
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
||||||
pipelineInfo.label = "Text";
|
pipelineInfo.label = "Text";
|
||||||
|
@ -169,7 +169,7 @@ void Renderer::resize_render_target(RenderTarget& target, const prism::Extent ex
|
||||||
worldTextPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
worldTextPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
createUIPipeline();
|
createUIPipelines();
|
||||||
|
|
||||||
for(auto& pass : passes)
|
for(auto& pass : passes)
|
||||||
pass->create_render_target_resources(target);
|
pass->create_render_target_resources(target);
|
||||||
|
@ -192,7 +192,7 @@ void Renderer::set_screen(ui::Screen* screen) {
|
||||||
void Renderer::init_screen(ui::Screen* screen) {
|
void Renderer::init_screen(ui::Screen* screen) {
|
||||||
Expects(screen != nullptr);
|
Expects(screen != nullptr);
|
||||||
|
|
||||||
std::array<GylphMetric, numGlyphs> metrics;
|
std::array<GylphMetric, numGlyphs> metrics = {};
|
||||||
for(int i = 0; i < numGlyphs; i++) {
|
for(int i = 0; i < numGlyphs; i++) {
|
||||||
GylphMetric& metric = metrics[i];
|
GylphMetric& metric = metrics[i];
|
||||||
metric.x0_y0 = utility::pack_u32(font.sizes[fontSize][i].x0, font.sizes[fontSize][i].y0);
|
metric.x0_y0 = utility::pack_u32(font.sizes[fontSize][i].x0, font.sizes[fontSize][i].y0);
|
||||||
|
@ -232,8 +232,8 @@ void Renderer::render(GFXCommandBuffer* commandbuffer, Scene* scene, RenderTarge
|
||||||
commandbuffer->set_render_pass(beginInfo);
|
commandbuffer->set_render_pass(beginInfo);
|
||||||
|
|
||||||
Viewport viewport = {};
|
Viewport viewport = {};
|
||||||
viewport.width = render_extent.width;
|
viewport.width = static_cast<float>(render_extent.width);
|
||||||
viewport.height = render_extent.height;
|
viewport.height = static_cast<float>(render_extent.height);
|
||||||
|
|
||||||
commandbuffer->set_viewport(viewport);
|
commandbuffer->set_viewport(viewport);
|
||||||
|
|
||||||
|
@ -271,16 +271,21 @@ void Renderer::render(GFXCommandBuffer* commandbuffer, Scene* scene, RenderTarge
|
||||||
for(auto& [obj, camera] : cameras) {
|
for(auto& [obj, camera] : cameras) {
|
||||||
const bool requires_limited_perspective = render_options.enable_depth_of_field;
|
const bool requires_limited_perspective = render_options.enable_depth_of_field;
|
||||||
if(requires_limited_perspective) {
|
if(requires_limited_perspective) {
|
||||||
camera.perspective = transform::perspective(radians(camera.fov), static_cast<float>(render_extent.width) / static_cast<float>(render_extent.height), camera.near, 100.0f);
|
camera.perspective = transform::perspective(radians(camera.fov),
|
||||||
|
static_cast<float>(render_extent.width) / static_cast<float>(render_extent.height),
|
||||||
|
camera.near,
|
||||||
|
100.0f);
|
||||||
} else {
|
} else {
|
||||||
camera.perspective = transform::infinite_perspective(radians(camera.fov), static_cast<float>(render_extent.width) / static_cast<float>(render_extent.height), camera.near);
|
camera.perspective = transform::infinite_perspective(radians(camera.fov),
|
||||||
|
static_cast<float>(render_extent.width) / static_cast<float>(render_extent.height),
|
||||||
|
camera.near);
|
||||||
}
|
}
|
||||||
|
|
||||||
camera.view = inverse(scene->get<Transform>(obj).model);
|
camera.view = inverse(scene->get<Transform>(obj).model);
|
||||||
|
|
||||||
Viewport viewport = {};
|
Viewport viewport = {};
|
||||||
viewport.width = render_extent.width;
|
viewport.width = static_cast<float>(render_extent.width);
|
||||||
viewport.height = render_extent.height;
|
viewport.height = static_cast<float>(render_extent.height);
|
||||||
|
|
||||||
commandbuffer->set_viewport(viewport);
|
commandbuffer->set_viewport(viewport);
|
||||||
|
|
||||||
|
@ -309,8 +314,8 @@ void Renderer::render(GFXCommandBuffer* commandbuffer, Scene* scene, RenderTarge
|
||||||
commandbuffer->set_render_pass(beginInfo);
|
commandbuffer->set_render_pass(beginInfo);
|
||||||
|
|
||||||
Viewport viewport = {};
|
Viewport viewport = {};
|
||||||
viewport.width = render_extent.width;
|
viewport.width = static_cast<float>(render_extent.width);
|
||||||
viewport.height = render_extent.height;
|
viewport.height = static_cast<float>(render_extent.height);
|
||||||
|
|
||||||
commandbuffer->set_viewport(viewport);
|
commandbuffer->set_viewport(viewport);
|
||||||
|
|
||||||
|
@ -323,16 +328,22 @@ void Renderer::render(GFXCommandBuffer* commandbuffer, Scene* scene, RenderTarge
|
||||||
|
|
||||||
const float lum_range = render_options.max_luminance - render_options.min_luminance;
|
const float lum_range = render_options.max_luminance - render_options.min_luminance;
|
||||||
|
|
||||||
Vector4 params = Vector4(render_options.min_luminance, 1.0f / lum_range, render_extent.width, render_extent.height);
|
Vector4 params = Vector4(render_options.min_luminance,
|
||||||
|
1.0f / lum_range,
|
||||||
|
static_cast<float>(render_extent.width),
|
||||||
|
static_cast<float>(render_extent.height));
|
||||||
|
|
||||||
commandbuffer->set_push_constant(¶ms, sizeof(Vector4));
|
commandbuffer->set_push_constant(¶ms, sizeof(Vector4));
|
||||||
|
|
||||||
commandbuffer->dispatch(static_cast<uint32_t>(std::ceil(render_extent.width / 16.0f)),
|
commandbuffer->dispatch(static_cast<uint32_t>(std::ceil(static_cast<float>(render_extent.width) / 16.0f)),
|
||||||
static_cast<uint32_t>(std::ceil(render_extent.height / 16.0f)), 1);
|
static_cast<uint32_t>(std::ceil(static_cast<float>(render_extent.height) / 16.0f)), 1);
|
||||||
|
|
||||||
commandbuffer->set_compute_pipeline(histogram_average_pipeline);
|
commandbuffer->set_compute_pipeline(histogram_average_pipeline);
|
||||||
|
|
||||||
params = Vector4(render_options.min_luminance, lum_range, std::clamp(1.0f - std::exp(-(1.0f / 60.0f) * 1.1f), 0.0f, 1.0f), render_extent.width * render_extent.height);
|
params = Vector4(render_options.min_luminance,
|
||||||
|
lum_range,
|
||||||
|
std::clamp(1.0f - std::exp(-(1.0f / 60.0f) * 1.1f), 0.0f, 1.0f),
|
||||||
|
static_cast<float>(render_extent.width * render_extent.height));
|
||||||
|
|
||||||
commandbuffer->set_push_constant(¶ms, sizeof(Vector4));
|
commandbuffer->set_push_constant(¶ms, sizeof(Vector4));
|
||||||
|
|
||||||
|
@ -368,11 +379,11 @@ void Renderer::render(GFXCommandBuffer* commandbuffer, Scene* scene, RenderTarge
|
||||||
if(render_options.enable_depth_of_field)
|
if(render_options.enable_depth_of_field)
|
||||||
pc.options.w = 2;
|
pc.options.w = 2;
|
||||||
|
|
||||||
pc.transform_ops.x = (int)render_options.display_color_space;
|
pc.transform_ops.x = static_cast<float>(render_options.display_color_space);
|
||||||
pc.transform_ops.y = (int)render_options.tonemapping;
|
pc.transform_ops.y = static_cast<float>(render_options.tonemapping);
|
||||||
|
|
||||||
const auto [width, height] = render_extent;
|
const auto [width, height] = render_extent;
|
||||||
pc.viewport = Vector4(1.0f / static_cast<float>(width), 1.0f / static_cast<float>(height), width, height);
|
pc.viewport = Vector4(1.0f / static_cast<float>(width), 1.0f / static_cast<float>(height), static_cast<float>(width), static_cast<float>(height));
|
||||||
|
|
||||||
commandbuffer->set_push_constant(&pc, sizeof(PostPushConstants));
|
commandbuffer->set_push_constant(&pc, sizeof(PostPushConstants));
|
||||||
|
|
||||||
|
@ -404,9 +415,9 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
|
||||||
sceneInfo.camPos.w = 2.0f * camera.near * std::tan(camera.fov * 0.5f) * (static_cast<float>(extent.width) / static_cast<float>(extent.height));
|
sceneInfo.camPos.w = 2.0f * camera.near * std::tan(camera.fov * 0.5f) * (static_cast<float>(extent.width) / static_cast<float>(extent.height));
|
||||||
sceneInfo.vp = camera.perspective * camera.view;
|
sceneInfo.vp = camera.perspective * camera.view;
|
||||||
|
|
||||||
for(const auto [obj, light] : scene.get_all<Light>()) {
|
for(const auto& [obj, light] : scene.get_all<Light>()) {
|
||||||
SceneLight sl;
|
SceneLight sl;
|
||||||
sl.positionType = Vector4(scene.get<Transform>(obj).get_world_position(), (int)light.type);
|
sl.positionType = Vector4(scene.get<Transform>(obj).get_world_position(), static_cast<float>(light.type));
|
||||||
|
|
||||||
Vector3 front = Vector3(0.0f, 0.0f, 1.0f) * scene.get<Transform>(obj).rotation;
|
Vector3 front = Vector3(0.0f, 0.0f, 1.0f) * scene.get<Transform>(obj).rotation;
|
||||||
|
|
||||||
|
@ -421,7 +432,7 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
|
||||||
sceneInfo.spotLightSpaces[i] = scene.spotLightSpaces[i];
|
sceneInfo.spotLightSpaces[i] = scene.spotLightSpaces[i];
|
||||||
|
|
||||||
int last_probe = 0;
|
int last_probe = 0;
|
||||||
for(const auto [obj, probe] : scene.get_all<EnvironmentProbe>()) {
|
for(const auto& [obj, probe] : scene.get_all<EnvironmentProbe>()) {
|
||||||
SceneProbe p;
|
SceneProbe p;
|
||||||
p.position = Vector4(scene.get<Transform>(obj).position, probe.is_sized ? 1.0f : 2.0f);
|
p.position = Vector4(scene.get<Transform>(obj).position, probe.is_sized ? 1.0f : 2.0f);
|
||||||
p.size = Vector4(probe.size, probe.intensity);
|
p.size = Vector4(probe.size, probe.intensity);
|
||||||
|
@ -433,7 +444,7 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
|
||||||
std::map<Material*, int> material_indices;
|
std::map<Material*, int> material_indices;
|
||||||
|
|
||||||
const auto& meshes = scene.get_all<Renderable>();
|
const auto& meshes = scene.get_all<Renderable>();
|
||||||
for(const auto [obj, mesh] : meshes) {
|
for(const auto& [obj, mesh] : meshes) {
|
||||||
if(!mesh.mesh)
|
if(!mesh.mesh)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -547,7 +558,7 @@ void Renderer::render_camera(GFXCommandBuffer* command_buffer, Scene& scene, Obj
|
||||||
void Renderer::render_screen(GFXCommandBuffer *commandbuffer, ui::Screen* screen, prism::Extent extent, ControllerContinuity& continuity, RenderScreenOptions options) {
|
void Renderer::render_screen(GFXCommandBuffer *commandbuffer, ui::Screen* screen, prism::Extent extent, ControllerContinuity& continuity, RenderScreenOptions options) {
|
||||||
std::array<GlyphInstance, maxInstances> instances;
|
std::array<GlyphInstance, maxInstances> instances;
|
||||||
std::vector<ElementInstance> elementInstances;
|
std::vector<ElementInstance> elementInstances;
|
||||||
std::array<StringInstance, 50> stringInstances;
|
std::array<StringInstance, 50> stringInstances = {};
|
||||||
|
|
||||||
int stringLen = 0;
|
int stringLen = 0;
|
||||||
int numElements = 0;
|
int numElements = 0;
|
||||||
|
@ -674,7 +685,7 @@ void Renderer::render_screen(GFXCommandBuffer *commandbuffer, ui::Screen* screen
|
||||||
continuity.elementOffset += numElements;
|
continuity.elementOffset += numElements;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::create_mesh_pipeline(Material& material) {
|
void Renderer::create_mesh_pipeline(Material& material) const {
|
||||||
GFXShaderConstant materials_constant = {};
|
GFXShaderConstant materials_constant = {};
|
||||||
materials_constant.type = GFXShaderConstant::Type::Integer;
|
materials_constant.type = GFXShaderConstant::Type::Integer;
|
||||||
materials_constant.value = max_scene_materials;
|
materials_constant.value = max_scene_materials;
|
||||||
|
@ -829,7 +840,7 @@ void Renderer::create_render_target_resources(RenderTarget& target) {
|
||||||
target.sceneBuffer = gfx->create_buffer(nullptr, sizeof(SceneInformation), true, GFXBufferUsage::Storage);
|
target.sceneBuffer = gfx->create_buffer(nullptr, sizeof(SceneInformation), true, GFXBufferUsage::Storage);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::createPostPipeline() {
|
void Renderer::createPostPipelines() {
|
||||||
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
||||||
pipelineInfo.label = "Post";
|
pipelineInfo.label = "Post";
|
||||||
|
|
||||||
|
@ -868,7 +879,7 @@ void Renderer::createPostPipeline() {
|
||||||
renderToViewportPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
renderToViewportPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::createFontPipeline() {
|
void Renderer::createFontTexture() {
|
||||||
auto file = file::open(file::app_domain / "font.fp", true);
|
auto file = file::open(file::app_domain / "font.fp", true);
|
||||||
if(file == std::nullopt) {
|
if(file == std::nullopt) {
|
||||||
console::error(System::Renderer, "Failed to load font file!");
|
console::error(System::Renderer, "Failed to load font file!");
|
||||||
|
@ -923,7 +934,7 @@ void Renderer::createSkyPipeline() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::createUIPipeline() {
|
void Renderer::createUIPipelines() {
|
||||||
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
GFXGraphicsPipelineCreateInfo pipelineInfo = {};
|
||||||
pipelineInfo.label = "UI";
|
pipelineInfo.label = "UI";
|
||||||
|
|
||||||
|
@ -955,7 +966,7 @@ void Renderer::createUIPipeline() {
|
||||||
worldGeneralPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
worldGeneralPipeline = gfx->create_graphics_pipeline(pipelineInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::createBRDF() {
|
void Renderer::generateBRDF() {
|
||||||
GFXRenderPassCreateInfo renderPassInfo = {};
|
GFXRenderPassCreateInfo renderPassInfo = {};
|
||||||
renderPassInfo.label = "BRDF Gen";
|
renderPassInfo.label = "BRDF Gen";
|
||||||
renderPassInfo.attachments.push_back(GFXPixelFormat::R8G8_SFLOAT);
|
renderPassInfo.attachments.push_back(GFXPixelFormat::R8G8_SFLOAT);
|
||||||
|
@ -1081,7 +1092,7 @@ ShaderSource Renderer::register_shader(const std::string_view shader_file) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::associate_shader_reload(const std::string_view shader_file, const std::function<void()> reload_function) {
|
void Renderer::associate_shader_reload(const std::string_view shader_file, const std::function<void()>& reload_function) {
|
||||||
if(reloading_shader)
|
if(reloading_shader)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
Reference in a new issue