Point light working
This commit is contained in:
@@ -18,9 +18,14 @@ void HydraShadowBufferManager::Initialise()
|
||||
{
|
||||
m_available_spot.push(i);
|
||||
}
|
||||
for(uint32_t i = 0; i < MAX_POINT_SHADOWS; i++)
|
||||
{
|
||||
m_available_point.push(i);
|
||||
}
|
||||
|
||||
m_directional_shadow_buffer.resize(MAX_DIRECTIONAL_SHADOWS);
|
||||
m_spot_shadow_buffer.resize(MAX_SPOT_SHADOWS);
|
||||
|
||||
m_point_shadow_buffer.resize(MAX_POINT_SHADOWS);
|
||||
|
||||
uint32_t buffer_size = (MAX_DIRECTIONAL_SHADOWS * sizeof(HydraDirectionalShadowSourceComponent));
|
||||
|
||||
@@ -35,10 +40,17 @@ void HydraShadowBufferManager::Initialise()
|
||||
HydraCreateGPUBufferTask *spot_task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
|
||||
spot_task->Intialise("SpotShadowBuffer", 1, buffer_size, &m_spot_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
|
||||
|
||||
buffer_size = (MAX_POINT_SHADOWS * sizeof(HydraPointShadowSourceComponent));
|
||||
|
||||
create_gpu_buffer_task_id = task_scheduler->CreateTask<HydraCreateGPUBufferTask>(HydraThreadAffinity::Render);
|
||||
HydraCreateGPUBufferTask *point_task = static_cast<HydraCreateGPUBufferTask *>(task_scheduler->GetTask(create_gpu_buffer_task_id));
|
||||
point_task->Intialise("PointShadowBuffer", 1, buffer_size, &m_point_shadow_buffer_id, HYDRA_BUFFER_TYPE::HYDRA_SSBO_BUFFER);
|
||||
task_scheduler->WaitForTask(create_gpu_buffer_task_id);
|
||||
}
|
||||
void HydraShadowBufferManager::Shutdown()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
HydraID HydraShadowBufferManager::AddDirectionalShadow(HydraDirectionalShadowSourceComponent shadow)
|
||||
{
|
||||
@@ -66,6 +78,19 @@ HydraID HydraShadowBufferManager::AddSpotShadow(HydraSpotShadowSourceComponent s
|
||||
return shadow_id;
|
||||
}
|
||||
|
||||
HydraID HydraShadowBufferManager::AddPointShadow(HydraPointShadowSourceComponent shadow)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if(m_available_point.size() == 0)
|
||||
{
|
||||
return INVALID_HYDRA_ID;
|
||||
}
|
||||
|
||||
HydraID shadow_id = m_available_point.front();
|
||||
m_point_shadow_buffer[shadow_id] = shadow;
|
||||
return shadow_id;
|
||||
}
|
||||
|
||||
void HydraShadowBufferManager::UpdateDirectionalShadow(HydraID shadow_id, HydraDirectionalShadowSourceComponent shadow)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
@@ -84,6 +109,15 @@ void HydraShadowBufferManager::UpdateSpotShadow(HydraID shadow_id, HydraSpotShad
|
||||
}
|
||||
}
|
||||
|
||||
void HydraShadowBufferManager::UpdatePointShadow(HydraID shadow_id, HydraPointShadowSourceComponent shadow)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(m_mutex);
|
||||
if(shadow_id < MAX_SPOT_SHADOWS)
|
||||
{
|
||||
m_point_shadow_buffer[shadow_id] = shadow;
|
||||
}
|
||||
}
|
||||
|
||||
void HydraShadowBufferManager::RemoveDirectionalShadow(HydraID shadow_id)
|
||||
{
|
||||
|
||||
@@ -93,6 +127,10 @@ void HydraShadowBufferManager::RemoveSpotShadow(HydraID shadow_id)
|
||||
|
||||
}
|
||||
|
||||
void HydraShadowBufferManager::RemovePointShadow(HydraID shadow_id)
|
||||
{
|
||||
}
|
||||
|
||||
void HydraShadowBufferManager::UpdateShadowBuffer()
|
||||
{
|
||||
HydraEngine *engine = GetEngine();
|
||||
@@ -112,4 +150,11 @@ void HydraShadowBufferManager::UpdateShadowBuffer()
|
||||
HydraUpdateWholeGPUBufferTask *spot_task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
|
||||
spot_task->Intialise(m_spot_shadow_buffer_id, spot_buffer);
|
||||
task_scheduler->WaitForTask(update_buffer_task_id);
|
||||
|
||||
void *point_buffer = static_cast<void *>(m_point_shadow_buffer.data());
|
||||
|
||||
update_buffer_task_id = task_scheduler->CreateTask<HydraUpdateWholeGPUBufferTask>(HydraThreadAffinity::Render);
|
||||
HydraUpdateWholeGPUBufferTask *point_task = static_cast<HydraUpdateWholeGPUBufferTask *>(task_scheduler->GetTask(update_buffer_task_id));
|
||||
point_task->Intialise(m_point_shadow_buffer_id, point_buffer);
|
||||
task_scheduler->WaitForTask(update_buffer_task_id);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "HydraShadowBuffer.h"
|
||||
#include "../ecs/components/HydraDirectionalShadowSourceComponent.h"
|
||||
#include "../ecs/components/HydraSpotShadowSourceComponent.h"
|
||||
#include "../ecs/components/HydraPointShadowSourceComponent.h"
|
||||
|
||||
#include <queue>
|
||||
#include <mutex>
|
||||
@@ -16,18 +17,27 @@ class HydraShadowBufferManager : public HydraObject
|
||||
void Shutdown();
|
||||
HydraID AddDirectionalShadow(HydraDirectionalShadowSourceComponent shadow);
|
||||
HydraID AddSpotShadow(HydraSpotShadowSourceComponent shadow);
|
||||
HydraID AddPointShadow(HydraPointShadowSourceComponent shadow);
|
||||
|
||||
void UpdateDirectionalShadow(HydraID shadow_id, HydraDirectionalShadowSourceComponent shadow);
|
||||
void UpdateSpotShadow(HydraID shadow_id, HydraSpotShadowSourceComponent shadow);
|
||||
void UpdatePointShadow(HydraID shadow_id, HydraPointShadowSourceComponent shadow);
|
||||
|
||||
void RemoveDirectionalShadow(HydraID shadow_id);
|
||||
void RemoveSpotShadow(HydraID shadow_id);
|
||||
void RemovePointShadow(HydraID shadow_id);
|
||||
|
||||
void UpdateShadowBuffer();
|
||||
private:
|
||||
std::vector<HydraDirectionalShadowSourceComponent> m_directional_shadow_buffer;
|
||||
std::vector<HydraSpotShadowSourceComponent> m_spot_shadow_buffer;
|
||||
std::vector<HydraPointShadowSourceComponent> m_point_shadow_buffer;
|
||||
std::queue<HydraID> m_available_dir;
|
||||
std::queue<HydraID> m_available_spot;
|
||||
std::queue<HydraID> m_available_point;
|
||||
uint32_t m_directional_shadow_buffer_id;
|
||||
uint32_t m_spot_shadow_buffer_id;
|
||||
uint32_t m_point_shadow_buffer_id;
|
||||
std::mutex m_mutex;
|
||||
|
||||
};
|
||||
|
||||
@@ -116,12 +116,10 @@ HydraID HydraTextureBufferManager::CreateTextureArray(std::string texture_name,
|
||||
)
|
||||
{
|
||||
uint32_t gl_tex_id = 0;
|
||||
glCreateTextures(GL_TEXTURE_2D_ARRAY, 1, &gl_tex_id);
|
||||
glCreateTextures(GL_TEXTURE_2D_ARRAY,1, &gl_tex_id);
|
||||
glBindTexture(GL_TEXTURE_2D_ARRAY, gl_tex_id);
|
||||
|
||||
|
||||
glTextureStorage3D(gl_tex_id, 1, internal_format, width, height, levels);
|
||||
|
||||
|
||||
glTextureParameteri(gl_tex_id, GL_TEXTURE_MIN_FILTER, min_filter);
|
||||
glTextureParameteri(gl_tex_id, GL_TEXTURE_MAG_FILTER, mag_filter);
|
||||
@@ -144,6 +142,44 @@ HydraID HydraTextureBufferManager::CreateTextureArray(std::string texture_name,
|
||||
return texture_id;
|
||||
}
|
||||
|
||||
HydraID HydraTextureBufferManager::CreateCubemapTexture(std::string texture_name, uint32_t width, uint32_t height, uint32_t internal_format, uint32_t min_filter, uint32_t mag_filter)
|
||||
{
|
||||
uint32_t gl_tex_id = 0;
|
||||
glGenTextures(1, &gl_tex_id);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, gl_tex_id);
|
||||
|
||||
for(uint32_t i = 0; i < 6; i++)
|
||||
{
|
||||
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internal_format, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
|
||||
}
|
||||
|
||||
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, min_filter);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, mag_filter);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||
|
||||
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
||||
HydraTextureBuffer texture_buffer = {};
|
||||
HydraID texture_id = _GetTextureID();
|
||||
|
||||
texture_buffer.texture_id = texture_id;
|
||||
texture_buffer.format = 0;
|
||||
texture_buffer.internal_format = internal_format;
|
||||
texture_buffer.width = width;
|
||||
texture_buffer.height = height;
|
||||
texture_buffer.gl_tex_id = gl_tex_id;
|
||||
texture_buffer.mag_filter = mag_filter;
|
||||
texture_buffer.min_filter = min_filter;
|
||||
|
||||
m_textures[texture_id] = texture_buffer;
|
||||
m_texture_lookup.insert(std::pair<std::string, HydraID>(texture_name, texture_id));
|
||||
|
||||
return texture_id;
|
||||
}
|
||||
|
||||
HydraID HydraTextureBufferManager::CreateTexture(std::string texture_name,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
@@ -206,10 +242,11 @@ void HydraTextureBufferManager::BindTexture(HydraID texture_id, uint32_t target)
|
||||
}
|
||||
HydraTextureBuffer texture = m_textures[texture_id];
|
||||
glBindTexture(target, texture.gl_tex_id);
|
||||
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, texture.min_filter);
|
||||
glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MAG_FILTER, texture.mag_filter);
|
||||
|
||||
// glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
// glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
// glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MIN_FILTER, texture.min_filter);
|
||||
// glTextureParameteri(texture.gl_tex_id, GL_TEXTURE_MAG_FILTER, texture.mag_filter);
|
||||
|
||||
texture.texture_binding = glGetTextureHandleARB(texture.gl_tex_id);
|
||||
glMakeTextureHandleResidentARB(texture.texture_binding);
|
||||
|
||||
@@ -30,7 +30,14 @@ class HydraTextureBufferManager : public HydraObject
|
||||
uint32_t min_filter,
|
||||
uint32_t mag_filter,
|
||||
uint32_t levels);
|
||||
HydraID CreateCubemapTexture(std::string texture_name,
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t internal_format,
|
||||
uint32_t min_filter,
|
||||
uint32_t mag_filter);
|
||||
void BindTexture(HydraID texture_id, uint32_t target);
|
||||
|
||||
void UnbindTexture(HydraID texture_id);
|
||||
void DeleteTexture(HydraID texture_id);
|
||||
HydraID LoadTexture(std::string texture_filename);
|
||||
|
||||
Reference in New Issue
Block a user